Privacy-first unofficial Garmin Connect MCP for AI health, sleep, activity & recovery agents.
⚡ One-command install with Delx Wellness for Hermes:
npx -y delx-wellness-hermes setup— preconfigures this connector and the full Delx Wellness stack in a dedicated Hermes profile.Or wire it standalone into Claude Desktop / Cursor / ChatGPT Desktop — see the install section below. Runnable examples live in the Delx Wellness hub.
Public proof: Garmin MCP is tracked in the Delx Open Source Growth Snapshot alongside downloads, stars and next-action priorities. If it saves you Garmin Connect and MCP setup time, star this repo so other training-focused agent builders can find it faster.
First useful prompt:
Use garmin_connection_status, then garmin_daily_summary, then give me a 5-line operating brief for today.
Give your AI agent your Garmin Body Battery, training readiness, sleep, HRV and activities — local-first, tokens never leave your machine.
Unofficial project. Not affiliated with, endorsed by or supported by Garmin. This is not official Garmin Health API partnership access — it uses the unofficial Garmin Connect personal-token mode.
npx -y garmin-mcp-unofficial setupPart of Delx Wellness, a registry of local-first wellness MCP connectors.
No Garmin developer app is required. setup only writes local MCP configuration; it does not ask for your Garmin password.
npx -y garmin-mcp-unofficial setup # writes local config
npx -y garmin-mcp-unofficial auth # built-in login, prompts for credentials locally (no Python needed)
npx -y garmin-mcp-unofficial doctor # verifies you're ready
Default is stdio. Optional Streamable HTTP — no session id, JSON responses, loopback only:
npx -y garmin-mcp-unofficial --http
# GET http://127.0.0.1:3000/health
# POST http://127.0.0.1:3000/mcp (sessionless)
Env: GARMIN_MCP_HOST, GARMIN_MCP_PORT, GARMIN_MCP_TRANSPORT=http.
Or one shot: npx -y garmin-mcp-unofficial setup --auth
auth runs a self-contained Node login and prompts locally for Garmin email, password and MFA when needed. The MCP does not store your Garmin password — only Garmin Connect tokens, saved at ~/.garmin-mcp/garmin_tokens.json with user-only permissions. See the auth quickstart walkthrough for real terminal output, or docs/quickstart.md for the full flow.
If Garmin returns HTTP 429, a Cloudflare challenge, or an auth message that says Garmin SSO omitted responseStatus.type, stop retrying for a while. Repeated headless login attempts can make the private endpoint throttle harder. Use docs/auth.md for the safe recovery path.
Then add this to your MCP client config:
{
"mcpServers": {
"garmin": {
"command": "npx",
"args": ["-y", "garmin-mcp-unofficial"]
}
}
}
Use garmin_connection_status to check setup, then run garmin_daily_summary.
Give me a 5-line operating brief for today.
Call garmin_weekly_summary with response_format=json. Identify my biggest
recovery/sleep/stress bottleneck and give me a next-week plan.
Use the garmin_intraday_investigation prompt for date=today, focus=stress.
Don't claim Garmin can prove anything it can't.
Start with garmin_connection_status, then garmin_daily_summary (daily readiness, sleep, load) or garmin_weekly_summary (scorecard, bottlenecks, next-week plan). The server also exposes per-day signals (sleep, HRV, stress, Body Battery, training readiness, heart rate, SpO2, respiration, intensity minutes, hydration), activities, profile/devices and weight, plus prompts and resources.
See docs/tools.md for the full tool list, prompts, resources, data-availability matrix, configuration, Hermes setup and development notes.
GARMIN_PRIVACY_MODE defaults to summary (more conservative than other Delx Wellness connectors) because the auth model is unofficial.structured mode, normalized aliases are additive: complete upstream Garmin fields and nested DTOs remain available after secret/GPS redaction.~/.garmin-mcp/garmin_tokens.json with user-only permissions and are never returned by tools. Your Garmin password is never stored — only short-lived tokens persist locally.GARMIN_CACHE=sqlite.See docs/privacy.md for the full privacy model.
Want to see a connector like this drive a real end-to-end decision? The shared, reproducible proof lives in delx-living-body:
npx -y delx-living-body demo
It answers the anchor question — "Should I train hard today?" — by combining recovery, sleep and training-load signals across the Delx Wellness connectors.
The full Delx Wellness connector library:
| Provider | Package | Repo |
|---|---|---|
| WHOOP | whoop-mcp-unofficial | whoop-mcp |
| Oura | oura-mcp-unofficial | ouramcp |
| Garmin | garmin-mcp-unofficial | garmin-mcp |
| Strava | strava-mcp-unofficial | strava-mcp |
| Fitbit | fitbit-mcp-unofficial | fitbitmcp |
| Withings | withings-mcp-unofficial | withingsmcp |
| Apple Health | apple-health-mcp-unofficial | apple-health-mcp |
| Polar | polar-mcp-unofficial | polarmcp |
| Nourish (nutrition) | wellness-nourish | wellness-nourish |
One-command setup for Hermes — preconfigures every connector above plus wellness skills + onboarding: delx-wellness-hermes.
Peer (not a Delx package): mi-fitness-data-bridge by Kindred / @shkyyy18 — Xiaomi Mi Fitness, local-first, shares the agent-safe-series/v1 dense series envelope (duration-anchored coverage, hard max_points, full-res stats, no GPS in series tools). Design log: #19 · parity notes: docs/agent-safe-series-kindred.md.
MIT — see LICENSE. Code of Conduct.
This software is provided as-is. It is not a medical device, does not provide medical advice, and should not be used for diagnosis or treatment. The unofficial Garmin Connect mode can break if Garmin changes private auth or endpoints. Always consult qualified professionals for medical concerns.
Daily brief demo: docs/daily-brief-demo.md
Same package, two doors. MCP registers tools on stdio/HTTP. The skill can drive the same tools through the CLI when the client has no MCP:
npx -y garmin-mcp-unofficial call garmin_connection_status --json '{}'
Copy skill/SKILL.md into your agent skills dir.
Source-derived launch command. Check the maintainer’s required arguments and credentials before running:
npx -y garmin-mcp-unofficialMerge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.
{
"mcpServers": {
"io-github-davidmosiah-garminmcp": {
"command": "npx",
"args": [
"-y",
"garmin-mcp-unofficial"
]
}
}
}Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.
Claude Desktop setup referencegarmin-mcp-unofficialnpmio.github.davidmosiah/garminmcp works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.
~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.~/.cursor/mcp.jsonRestart Cursor for changes to take effect..vscode/mcp.jsonReload VS Code window for changes to take effect.~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect..mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.