Garmin Workouts MCP Server

1

Add it to Claude Code

Run this in a terminal.

Run in terminal
claude mcp add garmin-workouts -- docker run -i --rm ghcr.io/pranciskus/garmin-workouts-mcp
README.md

A standalone MCP server for Garmin Connect workouts.

Garmin Workouts MCP

garmin-workouts-mcp is a standalone MCP server for Garmin Connect workouts.

It is intended as a focused extension for workflows that need a bit more structure around Garmin workout payloads, especially strength training.

This project is packaged as a stdio MCP server and can be published as an OCI image for MCP registries and Glama deployment. It is not a standalone public HTTP MCP endpoint.

Additions

  • Supports Garmin strength workout steps with reps end conditions.
  • Supports exercise metadata via explicit Garmin enums or friendly aliases.
  • Adds preview_workout_payload so payloads can be inspected before upload.
  • Adds validate_workout for early schema and mapping errors.
  • Adds resolve_supported_strength_exercise for quick mapping checks.
  • Adds get_workout_input_schema for machine-readable client integration.
  • Includes walking as a supported sport type, which is also reflected in the prompt/schema.
  • Keeps the familiar list/get/delete/schedule/calendar/activity tools.

Environment

Garmin-backed tools authenticate lazily when they are called:

  • Authentication path: GARMIN_EMAIL and GARMIN_PASSWORD

The server can start without credentials. Tools that do not talk to Garmin, such as payload preview and schema inspection, still work without secrets.

Workout Input

The upload and preview tools accept a JSON object shaped like this:

{
  "name": "Upper Day",
  "type": "strength",
  "steps": [
    {
      "stepType": "warmup",
      "endConditionType": "lap.button",
      "stepDescription": "General warm-up"
    },
    {
      "stepType": "interval",
      "exercise": "incline db press",
      "endConditionType": "reps",
      "stepReps": 8,
      "stepDescription": "8-10 reps"
    },
    {
      "stepType": "rest",
      "endConditionType": "time",
      "stepDuration": 120
    }
  ]
}

For strength exercises, either pass a friendly alias:

{ "exercise": "t bar row" }

or explicit Garmin enums:

{
  "exercise": {
    "category": "ROW",
    "exerciseName": "T_BAR_ROW"
  }
}

You can also inspect the accepted structure programmatically through get_workout_input_schema, or resolve likely Garmin strength mappings with resolve_supported_strength_exercise.

Development

Run tests in Docker Compose:

docker compose run --rm tests

Build the runtime image:

docker build -t garmin-workouts-mcp:local .

Smoke test the stdio server startup without Garmin credentials:

python - <<'PY'
import subprocess

proc = subprocess.Popen(
    ["bash", "-lc", "tail -f /dev/null | docker run --rm -i garmin-workouts-mcp:local"]
)
try:
    proc.wait(timeout=5)
    print(f"container exited early with code {proc.returncode}")
finally:
    if proc.poll() is None:
        proc.terminate()
        proc.wait()
        print("container stayed up for 5 seconds")
PY

Publishing

The intended OCI image location is:

ghcr.io/pranciskus/garmin-workouts-mcp

Registry metadata lives in `server.json`. The OCI image carries the required label:

io.modelcontextprotocol.server.name=io.github.pranciskus/garmin-workouts-mcp

Glama ownership metadata lives in `glama.json`. It declares the GitHub maintainer account that can claim and manage the Glama listing.

Tools (4)

preview_workout_payloadInspect workout payloads before uploading to Garmin Connect.
validate_workoutPerform early schema and mapping error validation on a workout.
resolve_supported_strength_exerciseCheck mapping for strength exercises.
get_workout_input_schemaRetrieve the machine-readable input schema for workout creation.

Environment Variables

GARMIN_EMAILEmail address for Garmin Connect authentication
GARMIN_PASSWORDPassword for Garmin Connect authentication

Configuration

claude_desktop_config.json
{"mcpServers": {"garmin-workouts": {"command": "docker", "args": ["run", "-i", "--rm", "ghcr.io/pranciskus/garmin-workouts-mcp"], "env": {"GARMIN_EMAIL": "your-email", "GARMIN_PASSWORD": "your-password"}}}}

Try it

Validate my new strength training workout JSON to ensure it follows the correct schema.
Preview the payload for my 'Upper Day' workout before I upload it to Garmin Connect.
Check if 'incline db press' is a supported strength exercise name.
Get the current input schema for creating a new Garmin workout.

Frequently Asked Questions

What are the key features of Garmin Workouts?

Supports Garmin strength workout steps with reps end conditions. Provides exercise metadata via Garmin enums or friendly aliases. Validates workout schemas and mappings before upload. Allows inspection of workout payloads via preview tool. Supports multiple sport types including strength and walking.

What can I use Garmin Workouts for?

Automating the creation of complex strength training routines for Garmin watches. Validating workout JSON structures before syncing with Garmin Connect. Mapping custom exercise names to official Garmin strength exercise enums. Integrating Garmin workout management into custom AI-driven fitness planning workflows.

How do I install Garmin Workouts?

Install Garmin Workouts by running: docker pull ghcr.io/pranciskus/garmin-workouts-mcp

What MCP clients work with Garmin Workouts?

Garmin Workouts works with any MCP-compatible client including Claude Desktop, Claude Code, Cursor, and other editors with MCP support.

Turn this server into reusable context

Keep Garmin Workouts docs, env vars, and workflow notes in Conare so your agent carries them across sessions.

Need the old visual installer? Open Conare IDE.
Open Conare