- ✓Open-source license (MIT)
- ✓Actively maintained (<30d)
- ✓Documented (README)
- !No description
- !Install pipes a remote script into a shell (curl | sh)
claude mcp add garmin-mcp -- npx -y garmin-mcp-cli{
"mcpServers": {
"garmin-mcp": {
"command": "npx",
"args": ["-y", "garmin-mcp-cli"],
"env": {
"GARMIN_MCP_HTTP_TOKEN": "<garmin_mcp_http_token>"
}
}
}
}GARMIN_MCP_HTTP_TOKENResumen de MCP Servers
# Garmin MCP
[](https://www.npmjs.com/package/garmin-mcp-server)
[](https://github.com/endurancetools/garmin-mcp/actions/workflows/ci.yml)
[](https://registry.modelcontextprotocol.io/v0.1/servers/io.github.endurancetools%2Fgarmin-mcp/versions)
An MCP server that gives your AI assistant your Garmin Connect data: activities, health, sleep, training status, body composition, gear, devices, the workout library and the calendar. It keeps a local SQLite cache, downloads only what a question needs, and can build, preview and schedule structured workouts that sync to the watch.
Works with Claude Code, Claude Desktop, Codex, Antigravity CLI, opencode and any other MCP client (stdio or streamable HTTP).
**Documentation: [endurancetools.github.io/garmin-mcp](https://endurancetools.github.io/garmin-mcp/)** (getting started per client, what to ask, configuration, troubleshooting). Contributing and development: [DEVELOPMENT.md](DEVELOPMENT.md).
## Getting started
Requirements: Node.js 22 or newer, a Garmin Connect account, and Chrome, Edge, Brave or Chromium for the sign-in window (there is a terminal fallback).
**1. Sign in once.** This opens Garmin's own sign-in page in your browser. Your password never passes through the tool; only the tokens Garmin issues are stored, in `~/.garmin-mcp`.
```bash
npx -y garmin-mcp-cli login
```
**2. Add the server to your client.**
| Client | Configuration |
| --- | --- |
| Claude Code | `claude mcp add garmin -- npx -y garmin-mcp-server` |
| Claude Desktop | install `garmin-mcp-<version>.mcpb` from the [GitHub release](https://github.com/endurancetools/garmin-mcp/releases), or add to `claude_desktop_config.json`: `{"mcpServers":{"garmin":{"command":"npx","args":["-y","garmin-mcp-server"]}}}` |
| Codex | `~/.codex/config.toml`: `[mcp_servers.garmin]` `command = "npx"` `args = ["-y", "garmin-mcp-server"]` |
| Antigravity CLI | `agy mcp add garmin npx -y garmin-mcp-server` |
| opencode | `opencode.json`: `{"mcp":{"garmin":{"type":"local","command":["npx","-y","garmin-mcp-server"],"enabled":true}}}` |
| Any other client | command `npx`, arguments `-y garmin-mcp-server`, transport stdio |
**3. Ask.** Nothing is downloaded until a question needs it. For example:
- "How did I sleep this week?" or "How did my HRV trend over the summer?"
- "Review my training week" or "Summarise my block from 2026-08-04 to 2026-09-28"
- "Am I fatigued? What is my form right now?"
- "When is my next race?" or "What is planned this week?"
- "Build me 6×400 m with 90 s rest for Thursday" (you see the steps first, nothing is saved until you agree)
- "Rename activity 21001 to Parkrun PB"
Optional: pre-load a range so the first questions answer instantly.
```bash
npx -y garmin-mcp-cli sync --scope all --from 2026-07-01 --to 2026-09-30
```
## How it fetches data
Logging in and starting the server download nothing. When a question needs days that are not in the local database, the tool downloads exactly that range, waits up to 20 s and answers; anything left keeps downloading in the background and the answer says so (`meta.source` is `partial`). Everything downloaded stays in the local database: stored days are never downloaded again unless you pass `--force`, so repeating a question costs nothing.
To stay gentle with Garmin, long ranges go in 7-day chunks, newest first, with a random 1-11 s pause after each chunk that actually downloaded something, at most 600 requests per day. A 429 or a Cloudflare challenge pauses all downloads for 6 h. An interrupted sync continues where it left off.
With `GARMIN_AUTO_FETCH=false` nothing is downloaded unless you run `garmin sync` or the `garmin_sync` tool; read tools then return the missing range in `meta.sync_hint` and the model asks you first.
Measured on a real account after a 90-day sync (433 requests in about an hour): answers come from the local database in 1-110 ms.
## Tools
| Tool | Purpose |
| --- | --- |
| `get_activities` | dense activity list with cursor paging; `type` takes a Garmin type key (all keys in `garmin://activity-types`) |
| `get_activity` | one activity: `summary`, `splits`, `hr_zones`, `power_zones`, `weather`, `exercise_sets` (strength sets), or `full` (all sections plus the raw stream, 50 KB pages) |
| `update_activity` | name, type, description, RPE, feel |
| `download_activity_file` | FIT (unzipped), GPX, TCX, KML, CSV to the download directory (`GARMIN_FIT_DOWNLOAD_DIR`) |
| `query_health` | steps (with daily distance), resting HR (with daily min/max HR), HRV (with status and baseline), sleep, stress, body battery, respiration, SpO2, intensity minutes, calories, floors; per day or week, with 7/28-day trends |
| `get_sleep` | one night with stages, or a range with averages |
| `get_training_status` | VO2max, readiness, recovery time, Garmin status, load and load focus, `garmin_load_model` (CTL/ATL/TSB from Garmin's training load, optionally the daily series); race predictions, endurance/hill score, fitness age, personal records, acclimation |
| `get_body_composition` | weigh-ins in kg with trend |
| `get_period_summary` | week, month or any `from`..`to` range up to 366 days: volume per sport, HR zones, rest days, longest/hardest, `garmin_load_model` at the end, health and energy averages |
| `list_workouts`, `get_workout` | workout library, scheduled workouts, races and events from the calendar in any date range (default: next 60 days), readable steps |
| `create_workout`, `schedule_workouts` | workouts from presets (run intervals, walk/run, easy Z2, strength circuit) or a typed definition (nestable repeats, HR/pace/power targets); `create_workout` with `dry_run: true` shows the steps and estimated duration without saving; `schedule_workouts` puts workouts on the calendar and takes them off again |
| `get_gear`, `get_devices` | gear with distance, devices with last sync and settings |
| `garmin_sync` | explicit download of a scope (all/activities/health/training/reference) and date range, with progress notifications |
| `get_load` | own load model (TSS per activity from power, pace, heart rate or RPE, with the thresholds valid on each date): CTL/ATL/TSB, ACWR 7:28, monotony and strain, flags with overridable thresholds, ISO weeks per sport, 3-zone intensity split; optional daily series, per-activity TSS/IF/load source/EF, monthly EF trend |
| `get_readiness` | morning GO / MODIFY / REST from HRV, resting HR, sleep, body battery, training readiness, stress and load; overridable `rules`, every signal with value, reference and rating |
| `get_thresholds`, `set_threshold` | threshold history per date (LTHR per sport, LT1, HRmax, FTP, VO2max...; Garmin profile changes recorded automatically), heart rate and power zones per sport from the Garmin profile, and recording a test result, locally only |
`delete_activity`, `delete_workout`, `delete_weigh_in` and overwriting a saved workout (`create_workout` with `workout_id`) are only available with `GARMIN_ENABLE_DESTRUCTIVE=true`.
Resources: `garmin://profile`, `garmin://gear`, `garmin://devices`, `garmin://activity-types`, `garmin://sync-status`, and the templates `garmin://activity/{id}` and `garmin://workout/{id}` with id completion. Prompts: `weekly_review`, `plan_next_week`.
Every response is `{ data, meta: { source: cache|live|partial|local, fetched_at, coverage?, sync_hint? } }`, as JSON text and as `structuredContent` matching the tool's `outputSchema`; failures are `{ error: { code, message, hint } }`.
Formulas, defaults and limits of the analytics tools: [docs/analytics.md](docs/analytics.md). Which Garmin Connect data is covered, and what is still missing: [docs/coverage.md](docs/coverage.md).
## CLI
`garmin-mcp-cli` shares the core with the server and is handy for setup and checks:
```
garmin login [--strategy auto|browser|curl|fetch] [--email] [--token-path]
garmin import-tokens <file> # garmin_tokens.json from python-garminconnect 0.3.x
garmin status [--json]
garmin sync [--scope ...] [--from --to] [--force] [--pause <s>] # default: last 7 days
garmin activities [--from --to --type --limit --json]
garmin health <metric> [--from --to --week --json]
garmin load [--from --to] [--source auto|hrtss|garmin_load] [--flags <file.json>] [--series] [--activities] [--efficiency] [--by-sport] [--json]
garmin readiness [date] [--rules <file.json>] [--json] # GO / MODIFY / REST for the morning
garmin thresholds [--date --param --history --json] # LTHR, LT1, HRmax ... in effect, per sport
garmin thresholds add <date> <param> <value> [--source test|manual] [--note]
garmin thresholds export [--out <file.csv>] # date,param,value,source,note
garmin thresholds import <file.csv>
garmin import-activities <file.csv...> # Garmin Connect "Activities" CSV exports
garmin doctor # TLS strategy, hosts, permissions, tokens, SQLite driver
garmin serve [--transport stdio|streamable-http] [--port]
garmin logout
```
`load`, `readiness` and `thresholds` print the same results as the `get_load`, `get_readiness` and `get_thresholds` tools: markdown tables by default, the tool's `{ data, meta }` envelope with `--json`. They read the local database only and never download; missing days come back as a note with the `garmin sync` command that fills them. `import-activities` adds activities from Garmin Connect CSV exports (English or Polish headers) for dates the synced activities do not cover, and `thresholds export`/`import` keep a copy of the threshold history in a CSV file.
Run it with `npx -y garmin-mcp-cli <command>` or Lo que la gente pregunta sobre garmin-mcp
¿Qué es endurancetools/garmin-mcp?
+
endurancetools/garmin-mcp es mcp servers para el ecosistema de Claude AI con 0 estrellas en GitHub.
¿Cómo se instala garmin-mcp?
+
Puedes instalar garmin-mcp clonando el repositorio (https://github.com/endurancetools/garmin-mcp) o siguiendo las instrucciones del README en GitHub. ClaudeWave también te ofrece bloques de instalación rápida en esta misma página.
¿Es seguro usar endurancetools/garmin-mcp?
+
Nuestro agente de seguridad ha analizado endurancetools/garmin-mcp y le ha asignado un Trust Score de 69/100 (tier: OK). Revisa el desglose completo de comprobaciones superadas y flags en esta página.
¿Quién mantiene endurancetools/garmin-mcp?
+
endurancetools/garmin-mcp es mantenido por endurancetools. La última actividad registrada en GitHub es del 2026-10-12, con 0 issues abiertos.
¿Hay alternativas a garmin-mcp?
+
Sí. En ClaudeWave puedes explorar mcp servers similares en /categories/mcp, ordenados por popularidad o actividad reciente.
Despliega garmin-mcp en tu cloud
Lleva este repo a producción en minutos. Cada plataforma genera su propio entorno con variables de entorno editables.
¿Mantienes este repo? Añade un badge a tu README
Pega el badge en tu README de GitHub para mostrar que está auditado por ClaudeWave. Cada badge enlaza de vuelta a esta página y muestra el Trust Score actual.
[](https://claudewave.com/repo/endurancetools-garmin-mcp)<a href="https://claudewave.com/repo/endurancetools-garmin-mcp"><img src="https://claudewave.com/api/badge/endurancetools-garmin-mcp" alt="Featured on ClaudeWave: endurancetools/garmin-mcp" width="320" height="64" /></a>Más MCP Servers
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.
Reverse engineer anything with agents, from app behavior down to native binaries.
User-friendly AI Interface (Supports Ollama, OpenAI API, ...)
An open-source AI agent that brings the power of Gemini directly into your terminal.
Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface
🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl! Don't be shy, join here: https://discord.gg/EMgGbDceNQ and follow here for daily tips and tricks: https://x.com/Scrapling_dev