Garmin Workouts MCP

Official registry Other

Manage Garmin Connect workouts, including strength workouts with mapped exercises.

Install

Add this to your client's MCP configuration (Claude Desktop: claude_desktop_config.json; Cursor: .cursor/mcp.json; VS Code and others use the same "mcpServers" shape).

OCI package ghcr.io/pranciskus/garmin-workouts-mcp:0.1.2
Claude Code
claude mcp add garmin-workouts-mcp -e 'GARMIN_EMAIL=<your garmin_email>' -e 'GARMIN_PASSWORD=<your garmin_password>' -- docker run -i --rm ghcr.io/pranciskus/garmin-workouts-mcp:0.1.2
JSON configuration (Claude Desktop, Cursor, VS Code)
{
    "mcpServers": {
        "garmin-workouts-mcp": {
            "command": "docker",
            "args": [
                "run",
                "-i",
                "--rm",
                "ghcr.io/pranciskus/garmin-workouts-mcp:0.1.2"
            ],
            "env": {
                "GARMIN_EMAIL": "<your garmin_email>",
                "GARMIN_PASSWORD": "<your garmin_password>"
            }
        }
    }
}

Environment variables

  • GARMIN_EMAIL required secret Garmin Connect account email.
  • GARMIN_PASSWORD required secret Garmin Connect account password.

Documentation

From the project's README on GitHub, refreshed weekly. Links open on GitHub.

Contents
  1. Garmin Workouts MCP
  2. Additions
  3. Environment
  4. Workout Input
  5. Development
  6. Publishing

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.

Frequently asked questions

What is Garmin Workouts MCP?

Manage Garmin Connect workouts, including strength workouts with mapped exercises.

How do I install Garmin Workouts MCP?

It runs on your machine. In Claude Code: claude mcp add garmin-workouts-mcp -e 'GARMIN_EMAIL=<your garmin_email>' -e 'GARMIN_PASSWORD=<your garmin_password>' -- docker run -i --rm ghcr.io/pranciskus/garmin-workouts-mcp:0.1.2. For other clients, paste the JSON configuration from this page into their MCP settings.

Does Garmin Workouts MCP need an API key?

Yes. It expects GARMIN_EMAIL, GARMIN_PASSWORD, which you set in its configuration.

Is Garmin Workouts MCP open source?

Yes. Its code is on GitHub under the MIT license.

Who maintains Garmin Workouts MCP?

It is published by pranciskus. AI.tn lists it but does not maintain or endorse it.

From the official MCP Registry. Listing is not an endorsement: review a server's code and permissions before giving it access to your data.