Garmin Connect MCP server — exposes health and activity data as tools for Claude
Project description
Fuel
A calorie and activity tracker for cyclists, powered by Claude and Garmin Connect.
Log food in plain English, get a calorie balance against your activity, and ask questions about your fitness data — all from a mobile-friendly web app.
Features
- Food logging — describe what you ate in plain English; Claude estimates the calories
- Activity balance — live calorie in vs. burned, updated from Garmin
- Conversational health advisor — ask "how were my steps today?" or "how did I sleep last night?" and get answers using your real Garmin data
- Push nudges — scheduled notifications with time-aware advice (morning vs. evening)
- Multi-user — each user has their own data, secured with Firebase Auth
Using the app
The hosted app is at https://pike-477416.web.app
- Sign in with Google or create an email/password account
- Log food in the text box ("had porridge and a coffee")
- Connect Garmin to enable activity data and the Ask tab (see below)
- Tap Ask to chat with Claude about your health data
Connecting Garmin
Garmin uses session tokens that must be generated on your own machine (there is no public OAuth API). Setup takes about two minutes:
1. Install the CLI
pip install garmin-mcp-gt
2. Authenticate with Garmin
garmin-setup
Enter your Garmin Connect email and password when prompted. Tokens are saved to ~/.garmin_tokens/.
3. Generate an upload token in the app
In the Fuel app, scroll to the bottom of the Log tab and tap Connect Garmin. This generates a 15-minute upload token.
4. Upload your tokens
garmin-upload-tokens --token "paste-token-here"
That's it. Your Garmin data is now available in the app and the Ask tab will use it.
Tokens expire periodically (weeks to months). Re-run garmin-setup then garmin-upload-tokens when needed.
Using as an MCP server (Claude Code / Claude Desktop)
garmin-mcp-gt is a standalone MCP server — no app account needed. After installing and authenticating, Claude can query your Garmin data directly in any conversation.
Setup
pip install garmin-mcp-gt
garmin-setup # authenticate with your Garmin Connect account once
Then add to ~/.claude/settings.json (Claude Code) or your Claude Desktop config:
{
"mcpServers": {
"garmin": {
"command": "garmin-mcp"
}
}
}
Available tools
| Tool | Description |
|---|---|
get_today_stats |
Steps, distance, calories, active minutes, resting HR, body battery |
get_recent_activities |
Last N cycling/running activities with distance, duration, HR, power |
get_activity_detail |
Detailed metrics for one activity: HR/power zones, cadence, left/right power balance, power phase angles, platform centre offset — useful for bike fit analysis |
get_activity_fit |
Downloads the raw FIT file and returns TSS, Intensity Factor, total work (kJ), device FTP, and a per-lap breakdown — data not available via the Garmin API |
get_sedentary_analysis |
How sedentary a day was — sedentary/light/moderate/active time breakdown |
get_sleep |
Sleep score, stages (deep/REM/light), SpO2, stress |
get_hrv |
Overnight HRV history — key recovery metric |
get_weekly_trends |
Weekly cycling summary: km, hours, average power |
get_cycling_ftp |
Current FTP and W/kg |
get_vo2max |
VO2max and lactate threshold history |
get_weight |
Weigh-in history: weight, body fat %, muscle mass |
get_weight_trend |
Weekly rolling weight averages to track fat loss without hydration noise |
get_weather |
Current conditions and cycling forecast via OpenMeteo (free, no API key) — includes rideable flag per day |
get_activity_weather |
Weather recorded by Garmin during a specific past activity |
get_courses |
Saved courses from Garmin Connect with distance and elevation |
Example questions
- "How did I sleep last night?"
- "Am I sedentary today?"
- "Analyse my bike fit from my last 5 rides"
- "How does my HRV trend compare to my training load this week?"
- "What's my W/kg and how has my weight changed this month?"
Architecture
- Frontend — React PWA, hosted on Firebase Hosting
- Backend — FastAPI on Cloud Run (europe-west1)
- Database — SQLite with Litestream replication to GCS (zero managed DB cost)
- Garmin tokens — encrypted at rest with Cloud KMS, per-user in SQLite
- Auth — Firebase Auth (Google Sign-In + email/password)
- AI — Claude API (food parsing, recommendations, conversational tools)
Self-hosting
The backend is a standard Cloud Run service. To deploy your own instance:
- Fork this repo
- Create a GCP project and enable the required APIs
- Run
backend/setup-wif.ps1to configure GitHub Actions auth - Run
backend/setup-secrets.ps1to store your secrets - Add GitHub Actions secrets (see
backend/setup-wif.ps1output) - Push to main — CI deploys everything automatically
Infrastructure is managed with OpenTofu — see terraform/.
Development
# Python tests
python -m pytest
# Frontend tests
cd ui && npm test
# Run backend locally
DB_PATH=./dev.db uvicorn backend.main:app --reload
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file garmin_mcp_gt-0.1.7.tar.gz.
File metadata
- Download URL: garmin_mcp_gt-0.1.7.tar.gz
- Upload date:
- Size: 185.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ed5371613b25386b10760333bbc6856f28ca39d69635adfa702f93607428eb4d
|
|
| MD5 |
e2d613d97c310f0f912337083add3c2e
|
|
| BLAKE2b-256 |
0917fde2be9898329f49e1e03021b24d5012229412db08e856dd7d73a3c720e3
|
Provenance
The following attestation bundles were made for garmin_mcp_gt-0.1.7.tar.gz:
Publisher:
publish.yml on JamesWoolfenden/garmin-mcp-gt
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
garmin_mcp_gt-0.1.7.tar.gz -
Subject digest:
ed5371613b25386b10760333bbc6856f28ca39d69635adfa702f93607428eb4d - Sigstore transparency entry: 1809676898
- Sigstore integration time:
-
Permalink:
JamesWoolfenden/garmin-mcp-gt@953a2ebf5244dae52dd4e512b01864881f634b17 -
Branch / Tag:
refs/tags/v0.1.7 - Owner: https://github.com/JamesWoolfenden
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@953a2ebf5244dae52dd4e512b01864881f634b17 -
Trigger Event:
push
-
Statement type:
File details
Details for the file garmin_mcp_gt-0.1.7-py3-none-any.whl.
File metadata
- Download URL: garmin_mcp_gt-0.1.7-py3-none-any.whl
- Upload date:
- Size: 20.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2fc5dc60026660ea24ddacdd53202cdae8db47af00a076ca585cd92c0f99761d
|
|
| MD5 |
d25c18469900b3fe2a8c37da918ecaeb
|
|
| BLAKE2b-256 |
46641ace022bb50d6658c2d21565f58f77eb4a217eed9ac7c598c92ef7cc194c
|
Provenance
The following attestation bundles were made for garmin_mcp_gt-0.1.7-py3-none-any.whl:
Publisher:
publish.yml on JamesWoolfenden/garmin-mcp-gt
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
garmin_mcp_gt-0.1.7-py3-none-any.whl -
Subject digest:
2fc5dc60026660ea24ddacdd53202cdae8db47af00a076ca585cd92c0f99761d - Sigstore transparency entry: 1809676929
- Sigstore integration time:
-
Permalink:
JamesWoolfenden/garmin-mcp-gt@953a2ebf5244dae52dd4e512b01864881f634b17 -
Branch / Tag:
refs/tags/v0.1.7 - Owner: https://github.com/JamesWoolfenden
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@953a2ebf5244dae52dd4e512b01864881f634b17 -
Trigger Event:
push
-
Statement type: