by Mason-Levyy
MCP server for Garmin Connect on Garmin's official Personal API: sleep, HRV, body battery, activities, and more from Claude or any MCP client
# Add to your Claude Code skills
git clone https://github.com/Mason-Levyy/garmin-personal-mcpGuides for using ai agents skills like garmin-personal-mcp.
See how garmin-personal-mcp compares with popular alternatives.
garmin-personal-mcp is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by Mason-Levyy. MCP server for Garmin Connect on Garmin's official Personal API: sleep, HRV, body battery, activities, and more from Claude or any MCP client. It has 50 GitHub stars.
garmin-personal-mcp's catalog security scan is still queued. You can run an instant dependency and prompt-injection check now with the "Scan for vulnerabilities" button above.
Clone the repository with "git clone https://github.com/Mason-Levyy/garmin-personal-mcp" and add it to your Claude Code skills directory (see the Installation section above).
garmin-personal-mcp is primarily written in Python. It is open-source under Mason-Levyy on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh garmin-personal-mcp against similar tools.
No comments yet. Be the first to share your thoughts!
Available after the catalog security scan passes.
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
The deep catalog scan for this skill is still queued. Run an instant dependency check now instead.
Ask your AI about your Garmin data, on Garmin's official API.
Quickstart · Tools · Authentication · Changelog
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.
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:
Save your Personal API key (one-time; see Authentication):
uvx garmin-personal-mcp auth
Add the server to your client. The install buttons at the top do this in one click for Cursor and VS Code.
Claude Code
claude mcp add garmin -- uvx garmin-personal-mcp
Or install it as a plugin, which asks for your key in place of step 1:
/plugin install garmin-personal-mcp --marketplace Mason-Levyy/garmin-personal-mcp
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:
{
"mcpServers": {
"garmin": {
"command": "uvx",
"args": ["garmin-personal-mcp"]
}
}
}
VS Code (or use the button above):
code --add-mcp '{"name":"garmin","command":"uvx","args":["garmin-personal-mcp"]}'
Codex CLI:
codex mcp add garmin -- uvx garmin-personal-mcp
Gemini CLI:
gemini mcp add garmin uvx garmin-personal-mcp
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.
garmin-personal-mcp auth and paste it at the hidden prompt. The
server checks it with Garmin before saving it to
~/.config/garmin/connect-personal-api-key with 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.
Run the server as a background HTTP service using the prebuilt image. Save
this as compose.yaml:
services:
garmin:
image: ghcr.io/mason-levyy/garmin-personal-mcp:latest
command: ["--http", "--host", "0.0.0.0"]
environment:
- GARMIN_PERSONAL_API_KEY
ports:
- "127.0.0.1:8491:8491"
volumes:
- garmin-config:/home/garmin/.config/garmin
- ./downloads:/home/garmin/Downloads/garmin
restart: unless-stopped
volumes:
garmin-config:
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:
mkdir -p downloads
docker compose pull
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.
Choose one of these authentication options:
.env fileCreate .env next to compose.yaml and add your Personal API key:
GARMIN_PERSONAL_API_KEY='your-personal-api-key'
Compose loads this file automatically. You do not need to run auth.
auth commandLeave GARMIN_PERSONAL_API_KEY unset in your shell and .env, then run:
docker compose run --rm garmin auth
Paste your Personal API key at the prompt. It is saved for subsequent starts.
docker compose up -d
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:
command: ["--http", "--host", "0.0.0.0", "--allowed-host", "garmin.example.ts.net"]
Without --allowed-host, requests to any other hostname are rejected.
Clone the repository and use compose.yaml in its root, which builds the image from source. From the repository directory, run:
docker compose build
Then follow the authentication and startup steps above. After updating the source, rebuild and restart with:
docker compose up --build -d
All tools take dates as YYYY-MM-DD. Range tools default to the 7