mcpField
G
Garmin Workouts MCP

Garmin Workouts MCP

Local
github.comHealth2Updated 33w ago

About Garmin Workouts MCP

Garmin Workouts MCP is a standalone MCP server for Garmin Connect workouts, with a focus on structured strength training and exercise mapping. It runs over stdio and is not a public HTTP MCP endpoint.

Key features

  1. 01Strength steps with repetition-based end conditions
  2. 02Exercise mapping through Garmin enums or aliases
  3. 03Workout payload preview before upload
  4. 04Validation of workout structure and mappings
  5. 05Machine-readable workout input schema
  6. 06Workout listing, retrieval, deletion, and scheduling

Use cases

  1. 01Prepare strength workouts for Garmin Connect
  2. 02Inspect workout payloads before uploading
  3. 03Check Garmin mappings for strength exercises
  4. 04Review workout calendars and activities

MCP support

It runs as a stdio MCP server and exposes tools for workout creation and preview, validation, exercise mapping, and workout lists, calendars, and activities.

Configuration

Local server config is the same for every client. Copy it into your client’s MCP config file.

mcp.json · Universal config
{
"mcpServers": {
"pranciskus-garmin-workouts": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"GARMIN_EMAIL",
"-e",
"GARMIN_PASSWORD",
"ghcr.io/pranciskus/garmin-workouts-mcp:0.1.2"
],
"env": {
"GARMIN_EMAIL": "<GARMIN_EMAIL>",
"GARMIN_PASSWORD": "<GARMIN_PASSWORD>"
}
}
}
}
Run commanddocker run -i --rm -e GARMIN_EMAIL -e GARMIN_PASSWORD ghcr.io/pranciskus/garmin-workouts-mcp:0.1.2
Environment variables to set
GARMIN_EMAILSecretGarmin Connect account email.
GARMIN_PASSWORDSecretGarmin Connect account password.

Local servers need a runtime on your machine (e.g. Node.js 18+). Config file locations differ by client; see your client’s docs.

Packages
ocighcr.io/pranciskus/garmin-workouts-mcp:0.1.2

Tools

No tool list yet

Local servers expose tools only once running on your machine, and the maintainer has not provided a tool list.

Details

From the project README

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.

Garmin Workouts MCP server

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.

Comments

Markdown supported

New to MCP?

From what the protocol is to installing your first server, these answers cover most first questions.

An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.