garmin-mcp
Provides tools to access and query Garmin Connect data, including activities, sleep, heart rate variability, body battery, training load, HR zones, weight/hydration, and gear, with a live dashboard.
Click on "Deploy 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-mcpshow my last 5 runs"
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 β Claude Β· Self-Hosted MCP Server + Live Dashboard
Put your Garmin Connect data inside Claude β and run your own private health & triathlon dashboard β on a small server that's entirely yours.
π£οΈ Ask your body data in plain English in Claude (web, desktop, mobile): "How did I sleep?", "Show my last 5 runs", "Am I recovered for a hard session?"
π A live dashboard at
/dashboardβ body battery, sleep, heart rate, stress, VOβ max, training load, HR zones, weight/hydration, and a Swim / Bike / Run view that fills in as you train.π Private by design β runs on your Railway account, locked with your bearer token. Your Garmin password never leaves your own computer.
Built for the community by Sudhakar Reddy Gade Β· π Full step-by-step guide (no coding needed): https://www.nirvedha.com/garmin-dashboard/
Quick start
The easy way β let Claude Code do it
Install Claude Code, open it in an empty folder, and paste the ready-made prompt from the guide. It clones this repo, mints your Garmin token, deploys to Railway, and hands you your connector + dashboard URLs. You only approve the Railway login and type your Garmin password into your own terminal.
The hands-on way
Fork this repo and follow the guide
(8 clicks-and-copy steps, ~20 minutes) or the concise SETUP.md.
In short: fork β deploy on Railway β add a volume at /root/.garminconnect β
set four variables β generate a domain β add to Claude.
Related MCP server: Garmin Connect MCP Server
What you get
MCP tools | 90+ Garmin tools (activities, sleep, HRV, body battery, training, gear, β¦) usable from Claude |
Transport | Streamable HTTP at |
Auth | Bearer token on every request (header or |
Dashboard | Server-rendered, live-on-refresh single page at |
Persistence | Garmin OAuth tokens on a mounted volume, auto-refreshing |
Cost | ~$5/month on Railway's Hobby plan |
Environment variables
Variable | Required | Purpose |
| Yes | Bearer token guarding |
| Recommended | Pre-minted Garmin OAuth blob β avoids logging in from a cloud IP (Garmin blocks those) |
| Yes |
|
| Yes |
|
| Fallback | Full login if no token blob; may trigger MFA |
| Auto | Injected by Railway; the server binds it |
| Optional | Local-day offset for the dashboard (default |
See SETUP.md for the full list, token rotation, and re-auth.
Security model
Fail-closed: the server refuses to start without a strong
MCP_ACCESS_TOKEN, so the endpoint is never exposed unprotected β not even briefly.The bearer check runs before the MCP app, so unauthorized callers get
401and never reach your data.Your Garmin password is only ever used locally to mint a token blob; the deployed server uses the blob (read-scoped OAuth tokens), never the password.
.gitignorekeeps.env, tokens, and caches out of git.
Architecture
Claude (web / desktop / mobile) ββHTTPS + bearer tokenβββΊ Railway service
β
BearerAuthMiddleware βββΊ /healthz (open) Β· /mcp Β· /dashboard
β
FastMCP (90+ tools) + dashboard API
β
garminconnect + garth βββΊ Garmin API
(OAuth tokens on a persistent volume)Local development
uv sync
# stdio (for Claude Desktop config):
GARMIN_MCP_TRANSPORT=stdio uv run garmin-mcp
# streamable HTTP + dashboard:
MCP_ACCESS_TOKEN=$(python3 -c "import secrets;print(secrets.token_urlsafe(32))") \
GARMIN_MCP_TRANSPORT=streamable-http uv run garmin-mcp-http
# mint a Garmin token blob (interactive):
uv run garmin-mcp-mintCredits
Stands on the shoulders of the open-source
garmin_mcp by Taxuspt and the
Docker + streamable-HTTP fork by k8sautom8. This repo adds a bearer-token
security layer, $PORT/proxy fixes, and the live triathlon dashboard.
License
MIT β free to use, change, and share. See LICENSE.
Shared as a community resource by Nirvedha Executive Coaching Solutions, Hyderabad Β· https://nirvedha.com
This server cannot be deployed
Maintenance
Related MCP Connectors
Garmin data in Claude: 135 tools β activities, sleep, HRV, training, workouts. Free, open source.
Garmin data in Claude & ChatGPT via the Garmin Health API. OAuth sign-in, no password sharing.
Pace is a remote MCP server that exposes wearable and fitness data to Claude via the Model Context Protocol. It connects to Garmin, Oura, Whoop, Polar, Fitbit and 20+ devices and provides 15 tools for querying sleep, activity, recovery, and training data. Hosted on Google Cloud Run, OAuth 2.1 authentication, Streamable HTTP transport. Instructions: First you need to create an account at: https://pacetraining.co and connect your wearables. After that you can connect the remote Server via Custom Connector in Claude and OAuth 2.1 Flow startet.
Log meals, water, and weight to Garmin Connect from Claude or ChatGPT.
121
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceMCP server that connects Garmin Connect data to Claude, enabling training analysis, recovery checks, and personalized plans based on real metrics like HRV, training load, and activities.18MIT
- AlicenseAqualityBmaintenanceA Model Context Protocol (MCP) server for Garmin Connect integration. Access your activities, health data, training metrics, and more through Claude and other LLMs.2262MIT
- AlicenseAqualityBmaintenanceA read-only MCP server that gives Claude Desktop access to your Garmin Connect data β daily health metrics, sleep, activities, training status, and body composition.6MIT
- AlicenseNot gradedqualityBmaintenanceA local, single-user, read-only MCP server that gives Claude Code access to your Garmin health and training data, exposing tools for health snapshots, training status, run details, body metrics, and training analysis.1MIT