
Garmin Personal MCP
io.github.Mason-Levyy由 GitHub 帳號 Mason-Levyy 發布v0.3.0更新於 Nov 3, 2026
Garmin Connect on Garmin's official Personal API: sleep, HRV, body battery, activities.
概覽
Garmin Personal 的本機 MCP 服務;無需登入;STDIO。
暫無 AI 概覽:以下資訊來自註冊中心條目和服務本身。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 Garmin Personal MCP,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
其他 MCP 客戶端
參照 儲存庫 中的啟動說明。
README
Garmin Personal MCP
Ask your AI about your Garmin data, on Garmin's official API.
[Mason-Levyy/garmin-personal-mcp MCP server] [PyPI] [CI] [Python] [GitHub stars] [License: MIT]
[Install in Cursor] [Install in VS Code] [Install in VS Code Insiders]
Garmin Personal MCP is a free, open-source MCP server that connects your Garmin Connect account to Claude, Cursor, VS Code, or any other MCP client. Ask about last night's sleep, HRV trends, Body Battery, stress, training load, weight, or a specific run, all from your real Garmin account. It runs on Garmin's official Personal API with a revocable key, so it never needs your Garmin password, and it's read-only.
Published on PyPI as garmin-personal-mcp
and in the official MCP Registry as io.github.Mason-Levyy/garmin-personal-mcp.
Unofficial project, official API. This isn't made by Garmin, but it only talks to Garmin's documented Personal API through Garmin's own Python client.
How is this different from other Garmin MCP servers?
Most Garmin MCP servers sign in with your Garmin password through the
unofficial garminconnect library, which breaks whenever Garmin changes its
login. In October 2026 Garmin opened a Personal
API for individuals. This server uses it:
- No password, no scraping: a revocable Personal API key you create in Garmin Connect, exchanged for short-lived tokens
- The whole Personal API: every working endpoint in Garmin's reference has a tool, with every documented filter
- Any date range: ranges longer than an endpoint allows (28 days for steps, 31 for sleep, and so on) are split into requests for you
- Model-sized responses: all-day sample arrays are left out unless you ask for them
- Read-only: the Personal API can't change your account, and neither can this server
Quickstart
-
Save your Personal API key (one-time; see Authentication):
-
Add the server to your client. The install buttons at the top do this in one click for Cursor and VS Code.
Claude Code
Or install it as a plugin, which asks for your key in place of step 1:
Claude Desktop (
claude_desktop_config.json), Cursor (~/.cursor/mcp.json), Windsurf (~/.codeium/windsurf/mcp_config.json), and Cline (cline_mcp_settings.json) all take the same entry:VS Code, Codex CLI, Gemini CLI
VS Code (or use the button above):
Codex CLI:
Gemini CLI:
-
Ask it something: "how did I sleep last night?", "is my HRV trending down this month?", "compare my last three long runs".
Requires uv. Any MCP client that speaks stdio or streamable HTTP works, not just Claude.
Finding this useful? A ⭐ on GitHub helps other Garmin users find it.
Authentication
- Sign in to Garmin Connect on the web and open Settings → Personal API.
- Create a key and choose how long it lasts (30 days to a year). Garmin shows it once.
- Run
garmin-personal-mcp authand paste it at the hidden prompt. The server checks it with Garmin before saving it to~/.config/garmin/connect-personal-api-keywith owner-only permissions.
Where there's no terminal to prompt in (a script, or a shell an agent runs),
pipe the key in instead, e.g. pbpaste | garmin-personal-mcp auth.
garmin-personal-mcp auth --check reports whether the saved key still works,
without prompting. Garmin emails you about a week before a key expires: create
a new one and run auth again. No restart is needed; the server reads the key
on every call.
Instead of the key file you can set GARMIN_PERSONAL_API_KEY, which takes
precedence. The key file and bearer-token cache are the same ones Garmin's
gc-personal CLI uses, so a key saved by either works for both.
Docker Compose
Run the server as a background HTTP service using the prebuilt image. Save
this as compose.yaml:
latest is the newest release, the same version PyPI serves. To stay on one
version, use a version tag such as :0.2.0 instead.
From the directory containing compose.yaml, create the downloads folder and
pull the image:
Activity files from garmin_download_activity land in ./downloads. The tool
reports the path inside the container (/home/garmin/Downloads/garmin/...),
which is the same file. The container runs as uid 1000, so on Linux, if your
uid isn't 1000, run sudo chown 1000 downloads.
Don't mount an existing ~/.config/garmin from the host into the container.
The key file there is readable only by its owner, so the container can't read
it unless your uid is 1000. Use one of the options below instead.
The container paths above and uid 1000 stay the same across releases.
Authentication
Choose one of these authentication options:
1. Add your API key to a .env file
Create .env next to compose.yaml and add your Personal API key:
Compose loads this file automatically. You do not need to run auth.
2. Use the interactive auth command
Leave GARMIN_PERSONAL_API_KEY unset in your shell and .env, then run:
Paste your Personal API key at the prompt. It is saved for subsequent starts.
Start the server
In your MCP client, add a Streamable HTTP server with the URL
http://127.0.0.1:8491/mcp.
The server only accepts requests addressed to 127.0.0.1 or localhost, and
it has no authentication. To reach it from another machine, keep the port on
127.0.0.1, put an authenticating proxy or tailnet in front (see
Remote / HTTP mode), and add the hostname clients use to
command:
Without --allowed-host, requests to any other hostname are rejected.
Build from source
Clone the repository and use compose.yaml in its root, which builds the image from source. From the repository directory, run:
Then follow the authentication and startup steps above. After updating the source, rebuild and restart with:
Tools
All tools take dates as YYYY-MM-DD. Range tools default to the 7 days ending
today. Tools that return a list wrap it as {"results": [...]}.
Weights are in grams, distances in meters, and durations in seconds, as Garmin returns them.
Remote / HTTP mode
The default transport is stdio. For network clients:
This serves streamable HTTP at /mcp. There is no built-in authentication.
Never expose it to the internet. Bind to localhost and front it with
something that authenticates for you: a VPN or tailnet (e.g. tailscale serve), an authenticating reverse proxy, or an OAuth-aware MCP gateway. Behind
a proxy, pass --allowed-host <proxy hostname> (repeatable) so the
DNS-rebinding check accepts its Host header.
Configuration
Troubleshooting
- "Garmin rejected the Personal API key": the key expired or was deleted.
Create a new one and run
garmin-personal-mcp auth. - "No usable Garmin Personal API key was found": run
garmin-personal-mcp auth, or setGARMIN_PERSONAL_API_KEYin the client config. {"no_data": ...}: Garmin has nothing for that date yet (today's HRV before you've slept, for example), or your device doesn't record that metric.- HTTP 400 on a long range: an endpoint without a documented limit rejected the range. Ask for a shorter one.
FAQ
Is this the official Garmin API? Yes. It uses Garmin's Personal API, which anyone with a Garmin Connect account can enable without applying, through Garmin's Apache-licensed Python client. The project itself is independent.
Can it change my Garmin data? No. The Personal API is read-only. The one
tool that writes anything, garmin_download_activity, saves a file on your
own machine.
Which MCP clients does it work with? Any client that runs a stdio or streamable HTTP server, including Claude Desktop, Claude Code, Cursor, Windsurf, Cline, and VS Code. AI coding agents can follow llms-install.md.
Where does my data go? The server talks only to Garmin. Your key and
bearer token stay in ~/.config/garmin/. Tool results go to whichever MCP
client and model you connect it to.
Can I use it for other people's accounts? No. Garmin's Personal API is for your own data. Apps serving other users need Garmin's business developer program.
How it works
garmin-personal-mcp authsaves the key; each call exchanges it for a bearer token through Garmin'sPersonalApiAuthenticator, which caches the token until an hour before it expires. A token rejected early gets one retry with a fresh exchange.- Each tool maps to one endpoint on
personal.connectapi.garmin.com(garmin_get_daycombines several). Ranges longer than an endpoint's documented maximum are fetched in consecutive windows and concatenated. - Bulky per-minute sample arrays are dropped by default to keep responses
readable for a model;
include_samplesorchunksbring them back.
Development
Tests run against synthetic fixtures; no account needed. Lint and formatting
are enforced with ruff (uv run ruff check ., uv run ruff format .).
Contributing
Issues and pull requests are welcome, especially when Garmin adds endpoints to the Personal API. See CONTRIBUTING.md for setup, style, and the PR checklist, and SECURITY.md for how to report vulnerabilities privately. Release history is in CHANGELOG.md.
Support the project
If this server saves you time, please star the repo. Stars are how other Garmin users find it in GitHub search and MCP directories. Bug reports and endpoint requests are just as welcome in issues.
License
MIT. Garmin and Garmin Connect are trademarks of Garmin Ltd. or its subsidiaries; this project is not affiliated with or endorsed by Garmin.
來源:README.md,提交 e2becec
工具
0版本歷史
4- v0.3.0最新Nov 3, 2026
- v0.2.0Oct 29, 2026
- v0.1.1Oct 23, 2026
- v0.1.0Oct 22, 2026
評分
已滿足適用檢查項的 50%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通25 分
請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。
- 已宣告認證方式10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分