Overview
The Problem
Architecture
Authentication Flow
- Stored tokens: Checks ~/.garminconnect/ for existing OAuth tokens from a previous session
- Environment variables: Falls back to GARMIN_EMAIL and GARMIN_PASSWORD for non-interactive auth
- Interactive script: garmin_auth.py handles first-time setup with MFA support
- Browser-assisted fallback: garmin_browser_auth.py for when Cloudflare blocks the scripted login
Tool Design
Parallel Data Fetching
Unit Conversion
Running It
Docker (Recommended)
Any MCP Client
Key Design Decisions
Tech Stack
- Python with FastMCP for the MCP server framework
- garminconnect (<0.3, garth-backed) for Garmin Connect API access (OAuth 1.0a)
- garth for browser-assisted OAuth ticket exchange against connectapi.garmin.com
- Streamable HTTP transport for client-agnostic connectivity
- concurrent.futures thread pool for parallel API fetching
- Docker with health checks and compose for deployment
- MIT licensed and open source