garminmcp — Claude Code MCP server: Garmin Connect data for agents
Hands your agent Body Battery, training readiness, sleep, HRV and activities from Garmin Connect. Login tokens stay on your own machine.
claude mcp add --env GARMIN_TOKEN_PATH=<GARMIN_TOKEN_PATH> --env GARMIN_PRIVACY_MODE=<GARMIN_PRIVACY_MODE> --env GARMIN_CACHE=<GARMIN_CACHE> --env GARMIN_CACHE_PATH=<GARMIN_CACHE_PATH> --env GARMIN_DOMAIN=<GARMIN_DOMAIN> --transport stdio garminmcp -- npx -y garmin-mcp-unofficialWhat garminmcp does
The server runs locally and talks to Garmin Connect through personal tokens. Your Garmin password is never stored; what lands on disk is the token file at ~/.garmin-mcp/garmin_tokens.json, readable by your user only. Requests to Garmin leave from your computer, not from someone else's host.
Three commands get you going. setup writes the local MCP config, auth runs a self-contained Node login and asks for email, password and an MFA code in the terminal, doctor confirms everything is wired. No Python involved. Your agent then picks tools such as garmin_connection_status, garmin_daily_summary and garmin_weekly_summary, plus the garmin_intraday_investigation prompt for a stress-focused day review.
stdio is the default transport. Optional Streamable HTTP listens on loopback only, at http://127.0.0.1:3000, JSON responses, no session id; turn it on with --http. This is an unofficial project with no ties to Garmin: it uses the private personal-token route into Garmin Connect rather than the official Health API. An HTTP 429 or a Cloudflare challenge means you should pause — hammering the login endpoint makes the throttling worse.
What it helps with
- pull a morning brief on sleep, load and Body Battery
- spot the weakest link in a week of recovery
- review a day by stress without overclaiming
- confirm the Garmin connector is actually configured
- serve MCP over local HTTP instead of stdio
Example prompts for the agent
- Run
garmin_connection_status, thengarmin_daily_summary, and give me a short brief for today. - Call
garmin_weekly_summarywithresponse_format=json, pick my worst recovery bottleneck and draft next week's plan. - Use the
garmin_intraday_investigationprompt for today with focus=stress, and don't claim more than Garmin can prove.
How to install garminmcp
Platform CLI
claude mcp add --env GARMIN_TOKEN_PATH=<GARMIN_TOKEN_PATH> --env GARMIN_PRIVACY_MODE=<GARMIN_PRIVACY_MODE> --env GARMIN_CACHE=<GARMIN_CACHE> --env GARMIN_CACHE_PATH=<GARMIN_CACHE_PATH> --env GARMIN_DOMAIN=<GARMIN_DOMAIN> --transport stdio garminmcp -- npx -y garmin-mcp-unofficialReplace <…> with your own values. 1 more environment variable is in the server README
Platform CLI
codex mcp add garminmcp --env GARMIN_TOKEN_PATH=<GARMIN_TOKEN_PATH> --env GARMIN_PRIVACY_MODE=<GARMIN_PRIVACY_MODE> --env GARMIN_CACHE=<GARMIN_CACHE> --env GARMIN_CACHE_PATH=<GARMIN_CACHE_PATH> --env GARMIN_DOMAIN=<GARMIN_DOMAIN> -- npx -y garmin-mcp-unofficialReplace <…> with your own values. 1 more environment variable is in the server README
Config file
{
"mcpServers": {
"garminmcp": {
"command": "npx",
"args": [
"-y",
"garmin-mcp-unofficial"
],
"env": {
"GARMIN_TOKEN_PATH": "<GARMIN_TOKEN_PATH>",
"GARMIN_PRIVACY_MODE": "<GARMIN_PRIVACY_MODE>",
"GARMIN_CACHE": "<GARMIN_CACHE>",
"GARMIN_CACHE_PATH": "<GARMIN_CACHE_PATH>",
"GARMIN_DOMAIN": "<GARMIN_DOMAIN>"
}
}
}
}Replace <…> with your own values. 1 more environment variable is in the server README
Config file
{
"servers": {
"garminmcp": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"garmin-mcp-unofficial"
],
"env": {
"GARMIN_TOKEN_PATH": "<GARMIN_TOKEN_PATH>",
"GARMIN_PRIVACY_MODE": "<GARMIN_PRIVACY_MODE>",
"GARMIN_CACHE": "<GARMIN_CACHE>",
"GARMIN_CACHE_PATH": "<GARMIN_CACHE_PATH>",
"GARMIN_DOMAIN": "<GARMIN_DOMAIN>"
}
}
}
}Replace <…> with your own values. 1 more environment variable is in the server README
Platform CLI
gemini mcp add -e GARMIN_TOKEN_PATH=<GARMIN_TOKEN_PATH> -e GARMIN_PRIVACY_MODE=<GARMIN_PRIVACY_MODE> -e GARMIN_CACHE=<GARMIN_CACHE> -e GARMIN_CACHE_PATH=<GARMIN_CACHE_PATH> -e GARMIN_DOMAIN=<GARMIN_DOMAIN> garminmcp npx -y garmin-mcp-unofficialReplace <…> with your own values. 1 more environment variable is in the server README
Step by step, with commands for each platform: How to add an MCP server to Claude Code, Codex, Cursor, VS Code, Gemini CLI and more
Questions about garminmcp
How do I install garminmcp in Claude Code?
Run claude mcp add garminmcp -- npx -y garmin-mcp-unofficial. If you need environment variables and an explicit transport, use the longer form with --env flags and --transport stdio.
What does garminmcp do?
It is an MCP server that gives your agent your Garmin Connect figures: training readiness, sleep, HRV and activities. Everything runs locally and tokens never leave the machine.
Do I need a Garmin developer app or Python?
Neither is required. The built-in auth command handles the Node-based login and asks for an MFA code when Garmin demands one.