Skip to content

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

If you change this

  • Hits: training-sync (hard dependency; aborts garmin-down) · claude-hub summaries · the Claude Code garmin MCP config.
  • Does not hit: anything in the torrentvpn stack; the array.

Surfaces

Surface Role
docker psgarmin-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