garmin-connect-personal-mcp
Ask your AI assistant about your own Garmin data: your sleep, recovery, training and workouts. Your data stays on your computer.
Your Garmin watch records years of useful signals: sleep stages, resting heart rate, HRV, stress, Body Battery, every run and ride. The Garmin Connect app shows them one chart at a time, which makes it hard to answer simple questions like "why do I feel so flat this week?" This project lets Claude, ChatGPT, Gemini or any other assistant that supports MCP read them all together, so you can just ask:
You: I've felt flat this week. Is anything off?
Assistant: Your resting heart rate has been 58–61 bpm since Tuesday, against your usual 51–53, and your overnight HRV dropped from about 60 ms to 46 ms. Your sleep score fell too. That pattern often shows up when you're run down or fighting something off, so an easy few days could help. If it doesn't settle, it's worth checking with a doctor.
(An example with made-up numbers.)
Unofficial. Not affiliated with, endorsed by or supported by Garmin. Garmin and Garmin Connect are trademarks of Garmin Ltd. or its subsidiaries.
Not medical advice. The data comes from a consumer wearable. The tools report numbers and trends; they don't diagnose anything.
Why it's built this way
- Private by design. You run it on your own computer with your own Garmin key. There's no hosted service, no account to create, and nothing passes through this project. Your name, photos and GPS routes are never handed to the assistant.
- Your history, kept. How far back Garmin's API reaches isn't guaranteed. A daily sync builds a local archive of everything it has fetched, so you can still ask about this year next year.
- Honest about gaps. A night you didn't wear the watch shows up as missing, never as zero, so the assistant doesn't draw conclusions from data that isn't there.
- Works with the assistant you already use. It uses the open Model Context Protocol, with one-command setup for the popular apps.
- Built on Garmin's official API. It uses Garmin's own Personal API and Python client: no screen scraping, and it never asks for your password.
How it works
flowchart LR
G[Garmin Connect] -- "sync (daily)" --> A[(Archive on your computer)]
A --> S[MCP server]
S <--> C[Your AI app]
- Sync downloads your data from Garmin's Personal API into a SQLite archive in your user folder, once a day if you like.
- The MCP server gives your AI app a set of read-only tools over that archive.
- Your AI app calls those tools when you ask a question, and answers from what they return.
Only syncing talks to Garmin. Answering a question happens on your computer, apart from the results your AI app sends to its own provider, as with anything you ask it.
Get started
You need a Garmin device that syncs to Garmin Connect, and uv to install it (uv takes care of Python for you). Setup takes about five minutes.
-
Install it:
uv tool install garmin-connect-personal-mcp
-
Save your Garmin key. Create a Personal API key in Garmin Connect's settings, then paste it at the hidden prompt:
garmin-connect-personal-mcp init -
Download your data. This fetches the last 90 days; later runs pick up where they left off:
garmin-connect-personal-mcp sync --days-back 90
-
Keep it up to date (recommended). This adds a daily sync to your computer's scheduler, which is how your history builds up:
garmin-connect-personal-mcp schedule install
-
Connect your AI app. Leave out
--writeto see the change first:App Command Claude Desktop garmin-connect-personal-mcp install-client claude-desktop --writeClaude Code garmin-connect-personal-mcp install-client claude-code --writeCursor garmin-connect-personal-mcp install-client cursor --writeVS Code garmin-connect-personal-mcp install-client vscodeGemini CLI garmin-connect-personal-mcp install-client gemini --writeCodex CLI garmin-connect-personal-mcp install-client codex --writeChatGPT garmin-connect-personal-mcp setup-chatgptEach app has a setup guide. ChatGPT connects through OpenAI's private Secure MCP Tunnel, and its guide walks you through the account setup.
-
Restart the app and ask: "How did I sleep last night?"
To update later, run uv tool upgrade garmin-connect-personal-mcp.
Want to try it first?
You don't need a Garmin account to look around. The demo command writes four months of made-up data into a new folder, with a training block, a few sick days and some nights the watch stayed on the charger, so there's plenty to ask about:
garmin-connect-personal-mcp demo ~/garmin-demo
GARMIN_MCP_DATA_DIR=~/garmin-demo garmin-connect-personal-mcp install-client claude-desktop --write
The demo never touches a real archive, and sync is switched off for it. Run install-client again without GARMIN_MCP_DATA_DIR to switch back.
What you can ask
Daily health
- "How did I sleep last night? Was that normal for me?"
- "Is my resting heart rate lower than three months ago?"
- "Anything unusual in my HRV lately?"
Training and workouts
- "Summarize my training and recovery this week."
- "How has my weekly running distance built up since July?"
- "Did my heart rate drift in the second half of yesterday's run?"
Comparisons and patterns
- "Did I sleep more in October than in September?"
- "Do I sleep better on days I run?"
- "Show me my sleep for the last two weeks." Apps that support MCP Apps (Claude Desktop, claude.ai, ChatGPT, VS Code) show an interactive chart; other apps describe the same numbers in words.
The tools
Your AI app picks these on its own, so you never need to name them. They're here if you're curious.
| Tool | What it answers |
|---|---|
garmin_describe_data |
What's in your archive: dates covered, metrics and units |
garmin_get_day |
Sleep, HRV and daily totals for one day, plus its workouts |
garmin_get_trend |
One metric over time, per day or per week |
garmin_get_baseline |
How a day compares with your own usual range |
garmin_compare_periods |
One metric across two date ranges, side by side |
garmin_list_activities |
Your workouts, newest first, filtered by date and sport |
garmin_get_activity |
One workout in detail: heart-rate zones, power, splits |
garmin_get_activity_stream |
One workout over time: heart rate, pace, cadence, power, altitude |
garmin_query |
Read-only SQL for anything the others can't answer |
garmin_show_chart |
An interactive chart of a metric |
garmin_sync |
Fetch the latest data from Garmin |
docs/tools.md has every argument, and docs/data.md lists every metric with its unit.
Privacy and security
- Everything stays on your computer: your archive, in your user data folder, and your Garmin key.
- The only network requests go to Garmin, to sync.
--read-onlytakes syncing away from the AI app altogether. - Your AI app's provider sees what the tools return when you ask a question, as with anything you type. The tools never include your name, profile photos or GPS coordinates, even though Garmin's records contain them, and the SQL tool reads a cleaned copy without them.
- Nothing is written back to Garmin. Its Personal API is read-only.
If you find a security problem, please report it privately, as described in SECURITY.md.
Stability
From 1.0, updates only add things. Tool names, their arguments and output fields, metric names and units, and the query tables stay put until 2.0, so your prompts, scripts and saved setups keep working. A test checks the tools, metrics and query tables on every change; see Stability in CONTRIBUTING.md. The changelog lists what's new in each release.
Getting help
- Something's wrong? Run
garmin-connect-personal-mcp doctor. It checks your key, Garmin access, the archive and the daily sync, and tells you how to fix anything it finds. Its report leaves out anything personal, so it's safe to paste into an issue. - Troubleshooting goes through common problems by symptom.
- FAQ: which devices work, how far back your history goes, rate limits, units, uninstalling.
- Report a bug or suggest a feature.
Contributing
Bug reports, ideas and pull requests are all welcome. CONTRIBUTING.md covers setup, tests and pull requests, and AGENTS.md has the rules for AI coding agents. One rule above all: this is health data in a public repository, so tests use made-up data only, and real keys or health data never go in issues or commits.
uv sync
uv run pre-commit install
uv run pytest
License
Metadata
Release files for garmin-connect-personal-mcp 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| garmin_connect_personal_mcp-1.0.0.tar.gz | 286.1 kB | With provenance | Details for garmin_connect_personal_mcp-1.0.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| garmin_connect_personal_mcp-1.0.0-py3-none-any.whl | Python 3 | none | any | Details for garmin_connect_personal_mcp-1.0.0-py3-none-any.whl |
Total release size: 388.9 kB
Release files / garmin_connect_personal_mcp-1.0.0.tar.gz
| Download URL | garmin_connect_personal_mcp-1.0.0.tar.gz |
|---|---|
| Size | 286.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1a78f257f1077144d1961329bc371187298672f4f650e3ba05ef3c84f999c55f
|
|
BLAKE2b-256 checksum How to use checksums |
035087727458bf442aaabfc66d4aba0d8b28a4fd2b13833914f363fe40bc225d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.
Transparency logRelease files / garmin_connect_personal_mcp-1.0.0-py3-none-any.whl
| Download URL | garmin_connect_personal_mcp-1.0.0-py3-none-any.whl |
|---|---|
| Size | 102.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f8d06b7088f3b3ff9b031e9aa58b2d18127b10cdd9f928488de5d4e727fe7e0a
|
|
BLAKE2b-256 checksum How to use checksums |
6b0a5d42cd3e1f776b7846173eee01f05b7d2cf8b9b9ba695a32f4511f88e0d6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.
Transparency logSecurity for garmin-connect-personal-mcp 1.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for garmin_connect_personal_mcp-1.0.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.