garmin-mcp
Integrates with Garmin Connect to fetch and manage user activities, workouts, training history, and goals. Supports multi-user authentication, background sync, and proactive flagging based on thresholds.
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-mcpanalyze my last week of training"
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 MCP Server
Self-hosted Model Context Protocol server for Garmin Connect: multi-user, SQLite-backed history, HTTP/SSE for Claude custom connectors, optional Cloudflare Tunnel, and an agentic “sports companion” layer (bootstrap context, workout prompt, goals, flags).
Architecture
flowchart TD
Claude[ClaudeConnector] --> Tunnel[CloudflareTunnel]
Tunnel --> App[garmin-mcp]
App --> MW[ApiKeyAndRateLimit]
MW --> MCP[FastMCP_SSE]
MCP --> Tools[Tools]
Tools --> DB[(SQLite_WAL)]
Sync[SyncService] --> Garmin[Garmin_API]
Garmin --> Sync
Sync --> DBRelated MCP server: Garmin Connect MCP Server
Prerequisites
Docker and Docker Compose
Garmin account (see Garmin MFA below)
Cloudflare account if using Tunnel
Quick start
Clone this repository.
Copy
config.example.yamltoconfig.yamland fill in credentials, API keys, encryption secrets, and paths.Set
TUNNEL_TOKENin the environment (e.g..envnext todocker-compose.yml) if using Cloudflare Tunnel.Run
docker compose up -d(ormake up).Open Claude → Settings → Connectors → Add custom connector: base URL
https://<your-tunnel-host>/mcp(or your public URL), headerX-API-Key: <user api_key>.
Configuration reference
Field | Type | Default | Description |
| int |
| HTTP port |
| string |
| Logging level |
| int |
| Background sync interval |
| int |
| Max date span for tools |
| string | — | Username (must match |
| string | — | Secret for |
| path | — | SQLite file |
| path | — | Backup directory (default example uses |
| string | — | IANA timezone for display |
| int |
| Requests per minute per user |
| int |
| First full history pull |
| object | — | Thresholds for proactive flags |
Multi-user setup
Each users[] entry is isolated: its own Garmin credentials, API key, encrypted token file, SQLite DB, and backups.
Garmin MFA / Two-Factor Authentication
Garmin must have MFA disabled for automated login. Configure your account at:
https://account.garmin.com/account/security/
Rotating an API Key
Edit
config.yamland update theapi_keyvalue for the relevant user.Run
make down && make upto restart the container.Update the
X-API-Keyheader value in the Claude custom connector settings for that user.Verify with
make logsthat the server restarted cleanly.
Sports companion: custom instructions
Add this to Claude’s custom instructions so every session bootstraps fresh data:
You are my personal sports coach with access to my Garmin data.
At the start of every conversation, call get_my_context to load
my current goals, recent training history, and latest data before
responding to anything.MCP prompt: analyze_new_workout
Registered as a named prompt. Use when the user asks to analyze the latest workout or last run; it follows the structured steps documented in the server (context → activities → detail → reasoning → suggest → feeling).
Makefile
Target | Purpose |
|
|
|
|
| Follow logs |
| Pytest suite |
| Ruff check + format check |
| Apply Ruff formatter |
|
|
| POST |
| Shell in |
| Compose config + config schema load |
Running tests
python -m venv .venv && .venv/bin/pip install -r requirements.txt
pytest tests/ -vTroubleshooting
Token expiry / auth errors: Check Garmin credentials; delete encrypted token file and restart; see logs.
Port conflicts: Change
portinconfig.yamland compose port mapping.Tunnel not connecting: Verify
TUNNEL_TOKENand Cloudflare route tohttp://garmin-mcp:8765.make syncfails: The server must be reachable athttp://127.0.0.1:8765(or setGARMIN_MCP_URL). Start withmake upfirst.Backups in repo: Prefer
backup_pathunder/data/...(Docker volume). If you store backups inside the repo, extend.gitignoreaccordingly.
License
See LICENSE.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
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/aural-psynapse/garmin-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server