garmin-coach-mcp
Integrates with Garmin Connect to read activity data (recent activities, per-set strength history, sleep, recovery, trends) and optionally create, schedule, and delete strength workouts on the user's Garmin watch.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@garmin-coach-mcphow was my sleep and recovery today?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
garmin-coach-mcp
An MCP server that lets Claude read and answer questions about your Garmin Connect data — recent activities, per-set strength history, sleep and recovery, and simple trends — and optionally build workouts back onto your watch.
It runs two ways from the same code:
Mode | Transport | Where | Use it for |
Local | stdio | Your PC, launched on demand by Claude Code | Day-to-day work at your desk |
Hosted | streamable HTTP | Azure Container Apps | Asking from your phone, PC switched off |
Local mode is the default. Nothing listens on a socket and no secret is involved —
the server is a subprocess Claude Code owns. Hosted mode is opt-in via
GARMIN_COACH_TRANSPORT=http and refuses to start without a shared secret.
Note: This uses
python-garminconnect, which talks to Garmin's unofficial API. It works well for personal use but isn't sanctioned by Garmin and can break if Garmin changes their backend.
Layout
├── src/garmin_coach_mcp/ the server
│ ├── server.py tool definitions + transport selection
│ ├── config.py environment-driven settings
│ ├── http_app.py hosted transport + shared-secret gate
│ ├── garmin_client.py cached, token-authenticated Garmin client
│ ├── analysis.py strength-history and trend computations
│ ├── strength_workout.py Garmin workout payload builder
│ └── login.py one-time interactive Garmin login
├── infra/ Bicep for the hosted deployment
├── tests/ secret-gate and config tests
├── docs/
│ ├── local-setup.md run it on your PC
│ ├── remote-setup.md deploy it to Azure with Microsoft sign-in
│ └── architecture.md design decisions and what was learned deploying it
├── scripts/check_secrets.py pre-commit credential scanner
└── .env.example every setting, documentedYour own data stays out of the repo.
.gitignoreexcludes.azure/(which holds live secrets), the Garmin token, anddocs/body-composition/+training/if you keep personal records alongside the code. Runpython scripts/check_secrets.pybefore publishing, or enable it as a hook withgit config core.hooksPath .githooks.
Related MCP server: garth-mcp-server
Tools
Read (9)
Tool | What it answers |
| Is the connection working? Whose account? |
| "Show my last N workouts" |
| Detailed metrics for one activity |
| Per-set exercise / reps / weight / est. 1RM |
| "Is my squat going up?" |
| Sleep + daily stats + training readiness |
| Resting HR, steps, stress over time |
| Progressive-overload recommendation |
| Saved workouts (name + id) |
Write (3) — set GARMIN_COACH_READONLY=1 to drop these from the manifest entirely.
Tool | What it does |
| Build a strength workout on Garmin (experimental) |
| Put an existing workout on your calendar |
| Undo / remove a workout |
Strength answers only have data if you log Strength activities with weights on your watch.
create_strength_workoutuses Garmin's unofficial workout schema — check the result in the Garmin Connect app anddelete_workoutif it's wrong.
Quick start (local)
cd C:\Projects\garmin-coach-mcp
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -e .
.\.venv\Scripts\garmin-coach-login.exe # one time, caches a token
claude mcp add garmin-coach -s user -- C:\Projects\garmin-coach-mcp\.venv\Scripts\python.exe -m garmin_coach_mcp.serverFull walkthrough: docs/local-setup.md.
Quick start (hosted)
azd env new garmin-coach --subscription <id> --location westus2
azd env set MCP_SECRET (python -c "import secrets; print(secrets.token_urlsafe(32))")
azd upThen seed the Garmin token onto the file share and add the connector. Full walkthrough: docs/remote-setup.md.
Configuration
Variable | Default | Meaning |
|
|
|
| — | Required for |
|
| HTTP bind address |
|
| HTTP port |
| off | Hide the three write tools |
|
| Where the Garmin OAuth token lives |
| localhost only | Host headers the MCP SDK will accept |
| — | Entra tenant issuing tokens |
| — | Entra app ID; required audience on tokens |
| — | Object IDs permitted to call the server |
| — | This server's public URL, for RFC 9728 metadata |
The last four are all-or-nothing: set together they enable Microsoft sign-in; set partially the server refuses to start rather than advertising an auth flow that can't issue usable tokens.
Tests
.\.venv\Scripts\python.exe tests\test_http_gate.pyThese cover the shared-secret gate — the only thing between the public internet and your Garmin account when hosted — plus the configuration guards that stop the server starting in an unsafe combination.
Troubleshooting
garmin_not_authenticated— rungarmin-coach-login(token missing or expired). Hosted: re-run it locally, then re-upload the token to the file share.Server not connecting locally — confirm the venv path in
claude mcp list; the command must point at.venv\Scripts\python.exe.No strength data — the workout must be logged as a Strength activity with weights on the watch for
get_exercise_sets/get_strength_historyto return anything.Hosted returns 404 for everything — the secret in the URL doesn't match
GARMIN_COACH_SECRET. A wrong secret is deliberately indistinguishable from a wrong path.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP server for Garmin Connect that provides read-only access to daily health metrics, activities, workouts, and body composition data.Last updated32MIT
- Alicense-qualityCmaintenanceMCP server to interact with Garmin Connect, enabling retrieval of health, activity, and device data through natural language.Last updated63MIT
- Alicense-qualityCmaintenancePersonal MCP server for interacting with your Garmin Connect data. Exposes 62 tools across 11 domains including activities, health, training, and workouts.Last updated1MIT
- Flicense-qualityDmaintenanceMCP server that connects AI assistants to Garmin Connect health and fitness data, enabling natural language queries about workouts, sleep, heart rate, and more.Last updated
Related MCP Connectors
MCP server for Withings health data — sleep, activity, heart, and body metrics.
MCP server wrapping the Tesla Fleet API and TeslaMate API
List, fetch, create, edit (replace), delete and schedule structured workouts on Garmin Connect (runn
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/jhoy1020/garmin-coach-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server