Garmin MCP — the localhost-only bridge to Garmin Connect¶
Container garmin-mcp-server from ~/garmin-mcp/docker-compose.yml (services garmin-mcp, garmin-tokens). Serves http://127.0.0.1:8000/mcp with /healthz. Localhost only — nothing off-box can reach it, which is why the training scheduler runs as local cron and not as a claude.ai cloud routine.
Why this shape¶
Garmin credentials and tokens stay on the box. Consumers are all local: Claude Code's garmin MCP server, training-sync, and claude-hub.
Shape¶
- Health:
curl -fsS http://127.0.0.1:8000/healthz(training-sync waits up to 5 min for it,~/.local/bin/training-sync:39-45). - Consumers: Claude Code MCP
garmin(150+ tools) ·training-sync(three cron passes) ·claude-hub/app.py(GARMIN_URL). garmin-tunnel.service(user unit) is an OpenAI/ChatGPT tunnel via~/.local/bin/tunnel-client; it is not reusable for Claude cloud routines.- Adaptive-plan
workout_uuids change overnight for the same workout — match by name + sport + duration, never by uuid alone.
Connected to¶
- owned-by: host/claude-tooling
- joins: processes/training-sync
If you change this¶
- Hits: training-sync (hard dependency; aborts
garmin-down) · claude-hub summaries · the Claude CodegarminMCP config. - Does not hit: anything in the torrentvpn stack; the array.
Surfaces¶
| Surface | Role |
|---|---|
docker ps → garmin-mcp-server (healthy) |
liveness |
hub.lan/api/summary |
claude-hub's view of it |
See¶
- Source:
~/garmin-mcp/docker-compose.yml·~/garmin-mcp/README.md