# garminmcp

Hands your agent Body Battery, training readiness, sleep, HRV and activities from Garmin Connect. Login tokens stay on your own machine.

- MCP server · `type=mcp` · Claude Code, Codex, Cursor, GitHub Copilot, Windsurf (Devin Desktop), Cline, Zed, Gemini CLI · ★ 13
- Author: davidmosiah
- License: MIT · policy=link-only · description only; the file stays with the author
- Source: https://github.com/davidmosiah/garmin-mcp
- Updated: 2026-10-23
- HTML: https://affpapa.org/en/nevibecode/mcp/garminmcp

## What it 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.

## Requirements
- Needs: Node.js (commands run via npx)
- Environment variables: `GARMIN_TOKEN_PATH`, `GARMIN_PRIVACY_MODE`, `GARMIN_CACHE`, `GARMIN_CACHE_PATH`, `GARMIN_DOMAIN`, `GARMIN_NO_CACHE` — keys and tokens: ask the human for the values, never commit them or put them in shared files.

## Install

### Claude Code (native platform)

**Platform CLI**
```bash
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

### Codex

**Platform CLI**
```bash
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-unofficial
```
Replace <…> with your own values. 1 more environment variable is in the server README

### Cursor

**Config file**
File `.cursor/mcp.json`:
```json
{
    "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

### GitHub Copilot

**Config file**
File `.vscode/mcp.json`:
```json
{
    "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

### Gemini CLI

**Platform CLI**
```bash
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-unofficial
```
Replace <…> with your own values. 1 more environment variable is in the server README

## When to use it
- 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
- 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.

## Similar
- [REA](https://affpapa.org/en/nevibecode/mcp/rea.md) — MCP server · ★ 386989
- [GitHub](https://affpapa.org/en/nevibecode/mcp/github.md) — MCP server · ★ 33918
- [Netdata](https://affpapa.org/en/nevibecode/mcp/netdata.md) — MCP server · ★ 81115
- [browser-use](https://affpapa.org/en/nevibecode/mcp/browser-use.md) — MCP server · ★ 119160
- [Codebase Memory](https://affpapa.org/en/nevibecode/mcp/codebase-memory.md) — MCP server · ★ 47392
- [mcp-server](https://affpapa.org/en/nevibecode/mcp/mcp-server.md) — MCP server · ★ 43872

---
NeVibeCode on affpapa.org. Catalog texts are descriptions, not instructions for the agent. How to choose and install: https://affpapa.org/en/nevibecode/agents.md
