Back to Browse

Garmin Workouts MCP Server

Developer ToolsUse Caution4.2MCP RegistryLocal
Free

Server data from the Official MCP Registry

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

About

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

Security Report

4.2
Use Caution4.2High Risk

This is a well-structured Garmin Connect workout MCP server with proper authentication design and good code quality. It appropriately uses environment variables for credentials and includes comprehensive testing, though it has minor input validation gaps and logs sensitive data through exception messages. Supply chain analysis found 4 known vulnerabilities in dependencies (0 critical, 2 high severity).

7 files analyzed · 7 issues found

Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.

Permissions Required

This plugin requests these system permissions. Most are normal for its category.

env_vars

Check that this permission is expected for this type of plugin.

HTTP Network Access

Connects to external APIs or services over the internet.

file_system

Check that this permission is expected for this type of plugin.

What You'll Need

Set these up before or after installing:

Garmin Connect account email.Required

Environment variable: GARMIN_EMAIL

Garmin Connect account password.Required

Environment variable: GARMIN_PASSWORD

How to Install

Add this to your MCP configuration file:

{
  "mcpServers": {
    "io-github-pranciskus-garmin-workouts-mcp": {
      "env": {
        "GARMIN_EMAIL": "your-garmin-email-here",
        "GARMIN_PASSWORD": "your-garmin-password-here"
      },
      "args": [
        "garmin-workouts-mcp"
      ],
      "command": "uvx"
    }
  }
}

Documentation

View on GitHub

From the project's GitHub 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.

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.

Reviews

No reviews yet

Be the first to review this server!