Garmin Workouts MCP

io.github.pranciskusPublished by GitHub account pranciskusv0.1.2Updated Oct 24, 2026

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

Overview

AI-generated overview

A local MCP server that lets an assistant build, validate, preview, upload and manage Garmin Connect workouts, with a focus on strength training.

What you can do
Build and preview Garmin workout payloads, including strength steps with reps and exercise mappings, before upload. Validate workout schemas and resolve supported strength exercises or inspect the input schema. List, get, delete and schedule workouts, and view calendar and activity data in Garmin Connect. Upload workouts, including walking and other supported sport types.
When to use it
Useful when you want an assistant to draft or adjust structured Garmin workouts, especially strength sessions with mapped exercises, and push them to Garmin Connect after checking the payload. Also handy for reviewing, scheduling or cleaning up existing workouts and calendar entries.
Requirements
Runs as a local stdio process, typically via the published Docker image. Garmin-backed tools need a Garmin Connect account, supplied through the GARMIN_EMAIL and GARMIN_PASSWORD environment variables; the server starts without them, and preview and schema tools work without credentials. Network access to Garmin Connect is required for account tools.
Before you install
Requires your Garmin Connect email and password as environment variables, so store them securely and avoid exposing them in logs or shared configs. Upload, delete and schedule tools change data in your Garmin account; preview and validate first. Credentials are sent to Garmin Connect, a third party.

Installation

In SourceWeft

  1. Open Garmin Workouts MCP in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

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:

json
{  "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:

json
{ "exercise": "t bar row" }

or explicit Garmin enums:

json
{  "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:

bash
docker compose run --rm tests

Build the runtime image:

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

Smoke test the stdio server startup without Garmin credentials:

bash
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:

text
ghcr.io/pranciskus/garmin-workouts-mcp

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

text
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.

Source: README.md at commit 106b5b9

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v0.1.2LatestSep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts