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.
Adaptive running coach MCP server β training data, plans, and recovery for AI assistants.
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.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceMCP 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.21MIT
- AlicenseAqualityBmaintenanceA Model Context Protocol (MCP) server for Garmin Connect integration. Access your activities, health data, training metrics, and more through Claude and other LLMs.2264MIT
- AlicenseAqualityCmaintenanceA 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