mcp-server-garmin
Allows interaction with Garmin Connect, providing tools for retrieving daily summaries, heart rates, sleep, HRV, stress, body composition, activities, training readiness, and logging weight.
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., "@mcp-server-garminwhat was my sleep score last night?"
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.
mcp-server-garmin
MCP server for Garmin Connect (personal health/fitness data) with per-user login and encrypted, per-user token storage.
Unofficial API. Garmin has no obtainable official API for individual developers, so this uses
python-garminconnectagainst Garmin's private endpoints. This may violate Garmin's Terms of Service and can break when Garmin changes their auth. Login is rate-limited per account (24–48h blocks) — the server logs in once per user and rides the token.
Isolation
Behind an authenticating gateway that forwards the signed-in user as X-MCP-User, every tool is bound to that user. Tokens are AES-256-GCM encrypted per user; a user only ever reaches their own data, and the server fails closed without a verified identity. Passwords are never stored — only the resulting OAuth tokens. Users enroll via garmin_connect, which returns a single-use browser form where they enter their Garmin credentials (kept out of Claude entirely).
Related MCP server: garth-mcp-server
Security configuration
MCP_HTTP_TOKEN— shared bearer the gateway must send on/mcp(Authorization: Bearer <token>), compared in constant time. It is required whenGARMIN_TRUST_FORWARDED_USER=true: the server refuses to start without it, because otherwise anyone who can reach the port could claim anyX-MCP-User. Keep/mcpreachable only from the gateway.The enrollment page shows which gateway identity the link is bound to and requires an explicit confirmation, bound to the confirming browser (HttpOnly cookie), before it accepts Garmin credentials. Links are single-use and expire after 10 minutes.
Tools
garmin_connect / garmin_status / garmin_disconnect; garmin_daily_summary, garmin_get_heart_rates, garmin_get_sleep, garmin_get_hrv, garmin_get_stress, garmin_get_body_composition, garmin_get_activities, garmin_get_training_readiness; garmin_log_weight (write, GARMIN_ENABLE_WRITES=true).
Run
pip install --require-hashes -r requirements.lock
python -m app.server # /mcp + /garmin/enroll on :3000
PYTHONPATH=. pytest tests/Dependencies are pinned with hashes in requirements.lock. To update them, edit pyproject.toml and regenerate:
uv pip compile pyproject.toml --generate-hashes --universal --python-version 3.12 -o requirements.lockDocker images: ghcr.io/borgels/mcp-server-garmin.
This server cannot be deployed
Maintenance
Related MCP Connectors
MCP server for Withings health data — sleep, activity, heart, and body metrics.
Multi-tenant hosted MCP server for Oura Ring — 21 read-only tools, OAuth per user.
Remote MCP server for training, nutrition, wellness, and performance data with OAuth 2.0.
Unofficial Garmin Connect access: sleep, HRV, training, activities, workouts and weight.
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP server for Garmin Connect that provides read-only access to daily health metrics, activities, workouts, and body composition data.32MIT
- AlicenseNot gradedqualityCmaintenanceMCP server to interact with Garmin Connect, enabling retrieval of health, activity, and device data through natural language.65MIT
- FlicenseAqualityDmaintenanceMCP server that connects AI assistants to Garmin Connect health and fitness data, enabling natural language queries about workouts, sleep, heart rate, and more.29-
- AlicenseAqualityDmaintenanceMCP server that exposes Garmin Connect health and activity data (steps, sleep, stress, activities, etc.) via tools for querying, analysis, and visualization.17Apache 2.0