Garmin data with interactive charts: daily briefing, training trends, workout planning. Unofficial.
Connect your Garmin watch to Claude Desktop or ChatGPT. Explore interactive charts.
Unofficial. Not affiliated with or endorsed by Garmin. Garmin is a trademark of Garmin Ltd.
.mcpb file from ReleasesRequires Node.js 20+.
chenhunghan/garmin-mcp-app (leave Git ref and sparse paths empty) → Add marketplaceOr with the Codex CLI: codex plugin marketplace add chenhunghan/garmin-mcp-app then codex plugin add garmin@garmin-mcp.
Coach then appears in the sidebar (daily briefing and performance dashboard) and as a Training Week tab in conversations; or just ask "@Coach how am I today?". It runs on your computer, so it works in the desktop app only.
Requires Node.js 20+. Add the server to your client's MCP config:
{
"mcpServers": {
"garmin": { "command": "npx", "args": ["-y", "garmin-mcp-app"] }
}
}
Or from the command line: claude mcp add garmin -- npx -y garmin-mcp-app (Claude Code), codex mcp add garmin -- npx -y garmin-mcp-app (Codex CLI).
Clients that support MCP Apps (e.g. VS Code) show the interactive charts and the sign-in form. Other clients still get every Garmin tool as data, but can't show the sign-in form: sign in once from an MCP Apps client — the tokens are saved in ~/.garminconnect and shared by every client on your computer.
Ask Claude about your health, training, and fitness — it reads your Garmin data and shows interactive charts right in the conversation.
The app frames your data against your own baselines; Claude reads it and suggests what to do. Every view has Ask Claude questions built from your numbers, and Claude knows what you're looking at.
Daily briefing — "How am I today?"
Performance dashboard — "How has my fitness trended this year?"
Weekly training plan — "Plan my training week" (or the plan-training-week prompt)
Per-km splits — "Show the splits of my last run"
Screenshots use the built-in demo mode (npm run dev:ui:demo): a fictional runner, no real person's data. Light and dark themes follow Claude Desktop.
What you can visualize
Plot your activities
Visualize training readiness
| Category | Data |
|---|---|
| Daily health | Steps, heart rate, sleep stages, stress, body battery (+ events), HRV, respiration, SpO2, floors, hydration |
| Trends | Resting heart rate, weekly steps, weekly stress, weekly intensity minutes, weigh-ins |
| Activities | List / by date, details, splits, typed splits, HR time-in-zones, chart data, weather, exercise sets, gear |
| Training | Training readiness, training status & load, VO2 Max, race predictions, endurance score, hill score |
| Performance | Lactate threshold, cycling FTP, HR zones, fitness age, personal records, running tolerance, progress |
| Devices & gear | Devices, primary training device, last used device, gear, goals, training plans, calendar |
| Workouts | List, create, update, delete, and schedule workouts |
No data is stored or collected by this app. Your data flows directly between your machine and the Garmin Connect API — there is no intermediate server.
visibility: ["app"]), meaning Claude (the LLM) cannot call them and never sees your email, password, or MFA code.~/.garminconnect/ with restrictive file permissions (0600). They are never sent anywhere other than the Garmin Connect API.git clone https://github.com/chenhunghan/garmin-mcp-app.git
cd garmin-mcp-app
npm install
npm install automatically sets up git hooks via prek:
core.hooksPathIf npm install warns about core.hooksPath, prek cannot install git hooks. Fix it by unsetting the local config:
git config --unset-all --local core.hooksPath
npm run prepare
npm run dev # watch-build server + UI
npm run dev:ui # standalone UI dev at localhost:5173
npm run test:lib # run garmin-connect tests
npm run pack # build + package .mcpb bundle
npm run dev:ui opens http://localhost:5173 with the React UI wired to the real MCP server in-process. You can test login, MFA, and logout against the actual Garmin API without deploying to Claude Desktop.
Run npm run build (one-off) or npm run dev (watch mode for live rebuilds), then add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"garmin-mcp": {
"command": "node",
"args": ["/absolute/path/to/garmin-mcp-app/dist/index.js"]
}
}
}
Restart Claude Desktop. Ask Claude to check your Garmin auth — it will render the app UI in an iframe and run the real login/MFA flow.
src/server.ts) — Node.js server over stdio, registers tools + UI resourcesrc/app.tsx) — Rendered in host's sandboxed iframe, communicates via postMessagepackages/garmin-connect/) — TypeScript client library for Garmin Connect OAuth + APICommits must follow the Conventional Commits format:
type(optional-scope): description
Allowed types: feat, fix, chore, docs, ci, refactor, test
Run Coach is an independent, open-source project. It is not affiliated with, endorsed by, or sponsored by Garmin Ltd. or its subsidiaries. Garmin and Garmin Connect are trademarks of Garmin Ltd. or its subsidiaries; they are used here only to describe compatibility. The app uses the unofficial Garmin Connect API with your own account.
Source-derived launch command. Check the maintainer’s required arguments and credentials before running:
npx -y garmin-mcp-appMerge 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-chenhunghan-garmin-mcp-app": {
"command": "npx",
"args": [
"-y",
"garmin-mcp-app"
]
}
}
}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-appnpmRun Coach 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.