{
  "markdown": "# Garmin Connect Workouts MCP\n\n[![garmin-connect-workouts-mcp MCP server](https://glama.ai/mcp/servers/slaat/garmin-connect-workouts-mcp/badges/score.svg)](https://glama.ai/mcp/servers/slaat/garmin-connect-workouts-mcp)\n\n[![garmin-connect-workouts-mcp MCP server](https://glama.ai/mcp/servers/slaat/garmin-connect-workouts-mcp/badges/card.svg)](https://glama.ai/mcp/servers/slaat/garmin-connect-workouts-mcp)\n\nAn MCP (Model Context Protocol) server that turns natural-language workout\ndescriptions into structured workouts in Garmin Connect. Describe a session\nin plain English and the calling model builds a typed step-by-step workout\nthat this server encodes into Garmin's workout API format and creates\ndirectly in your account.\n\n## Features\n\n- **Pace, heart-rate, power and cadence targets** - pace ranges, HR zones 1-5,\n  explicit bpm ranges, cycling power, and cadence, all encoded against\n  Garmin's real `workoutTargetType` table.\n- **Real repeat blocks** - `5x1km` becomes a single repeat group, not five\n  duplicated steps, so the watch shows an actual rep counter.\n- **Swim workouts** - per-step strokes (freestyle, backstroke, breaststroke,\n  fly, drill, individual medley, or any stroke) and equipment (fins,\n  kickboard, paddles, pull buoy, snorkel), plus a workout-level pool length\n  in meters or yards.\n- **Full workout lifecycle** - create, list, get, update, delete, and\n  schedule workouts onto the Garmin Connect calendar.\n- **Structured input, not text parsing** - the server never parses free text\n  itself; every duration and target is an explicit, unit-tagged field, so\n  there's nothing for a string like \"10 min\" to be silently misread as.\n\n## Quick Start\n\n### Claude Code\n\n```bash\nclaude mcp add garmin-workouts npx garmin-connect-workouts-mcp\n```\n\n### Claude Desktop\n\nAdd to your configuration file:\n\n- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`\n- **Windows**: `%APPDATA%\\Claude\\claude_desktop_config.json`\n\n```json\n{\n  \"mcpServers\": {\n    \"garmin-workouts\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"garmin-connect-workouts-mcp\"]\n    }\n  }\n}\n```\n\nThen restart Claude Desktop.\n\n## Authentication\n\nGarmin Connect's web client authenticates with session cookies plus a CSRF\ntoken, not a password grant this server could hold on to. So the first time\nyou create a workout (or whenever the session has expired):\n\n1. The server checks the stored session with a cheap authenticated request.\n2. If it's missing or rejected, run the `authenticate_garmin` tool. It opens\n   a real browser window at `connect.garmin.com` for you to log in normally.\n3. Once login completes, the session is captured and stored at\n   `~/.config/garmin-connect-workouts-mcp/auth.json` with `600` permissions\n   (owner read/write only).\n\nNo password is ever stored - only the resulting session cookies and CSRF\ntoken. Garmin sessions expire, so you may be prompted to re-authenticate\nbetween sessions; the server detects this automatically and tells you when\nto run `authenticate_garmin` again. The login browser uses a persistent,\nisolated profile under `~/.config/garmin-connect-workouts-mcp/browser-profile/`\nso Garmin can remember the device across logins - it never touches your\npersonal browser profile.\n\n## Tools\n\n| Tool | Description |\n|---|---|\n| `create_garmin_workout` | Create a structured workout with steps, targets, and repeat blocks. |\n| `list_garmin_workouts` | List workouts in the Garmin Connect account. |\n| `get_garmin_workout` | Fetch the full structure of one workout. |\n| `update_garmin_workout` | Replace an existing workout's contents, keeping its id. |\n| `delete_garmin_workout` | Delete a workout. |\n| `schedule_garmin_workout` | Put a workout on the Garmin Connect calendar for a date. |\n| `check_garmin_auth` | Check whether the stored Garmin session still works. |\n| `authenticate_garmin` | Authenticate with Garmin Connect (opens a browser). |\n\n## Usage Examples\n\n- \"Create a 30 minute easy run in zone 2\"\n- \"10 min warmup zone 3, then 5x1km threshold intervals at 4:00/km with 2 min\n  rest between, then 10 min cooldown zone 2\"\n- \"8x400m at 5k pace with 60 second recovery, then check what workouts I\n  already have scheduled this week\"\n- \"Update workout 123456 to add a 5 minute cooldown, then schedule it for\n  next Monday\"\n- \"Create a 25m pool swim: 200m warmup any stroke, 4x100m freestyle with 30s\n  rest using a kickboard, 100m breaststroke cooldown\"\n\n## How targets work\n\nA stated pace is treated as the **fast edge** of a range: Garmin stores pace\nas a range, not a single point, so `4:00/km` on its own becomes a\n`4:00-4:10/km` range, widened by 10 seconds. Give both `fast` and `slow`\nexplicitly for a narrower or different range.\n\n## Development\n\n```bash\npnpm install\npnpm test          # vitest: encoders + golden-file tests against real captured payloads\npnpm run build      # compile TypeScript to dist/\npnpm run dev        # run the server directly with tsx\n```\n\nTests validate the workout encoders (targets, durations, repeat nesting)\nagainst fixtures captured from Garmin's own web client, so payload shape\nregressions get caught before they reach a real account.\n\n## Disclaimer\n\nThis is an unofficial, third-party project. It is not affiliated with,\nendorsed by, or sponsored by Garmin Ltd. or any of its affiliates, and it\ntalks to Garmin Connect's web API by reverse-engineering the same requests\nthe official web client makes. It may stop working if Garmin changes that\nAPI. Use at your own risk, and at your own responsibility for the workouts\nand data you send to your account.\n\n## Acknowledgements\n\nThanks to [garmin-workouts-mcp](https://github.com/charlesfrisbee/garmin-workouts-mcp)\nby Charles Frisbee for the original idea of driving Garmin Connect workouts\nthrough MCP.\n\n## License\n\nMIT\n",
  "bytes": 5787,
  "sha": "9a6f0d9888e1f0c5e401603ae56358575de117d6f3240b7832cac5d95ad693ed",
  "repo_slug": "slaat/garmin-connect-workouts-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_slaat_garmin_connect_workouts__498671e7/readme"
}