Skip to main content
MCP server CX Codex

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.

Install into Claude Code · Platform CLI All methods and platforms ↓
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-unofficial
Open on GitHub

What 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, then garmin_daily_summary, and give me a short brief for today.
  • Call garmin_weekly_summary with response_format=json, pick my worst recovery bottleneck and draft next week's plan.
  • Use the garmin_intraday_investigation prompt 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-unofficial

Replace <…> 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.

Similar MCP servers

All MCP servers for Agent setup: memory, context, orchestration →

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor