Garmin Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Garmin Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A Model Context Protocol (MCP) server that provides AI assistants like Claude with access to your Garmin Connect health and fitness data.
This MCP server enables Claude Desktop (and other MCP-compatible clients) to query your Garmin data on demand, including:
No scheduled jobs, no CSV files, no stale data. Just live access to your Garmin Connect data when you need it.
cd ~/Dev
git clone https://github.com/shawnduggan/garmin-mcp.git
cd garmin-mcppython3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activatepip install -r requirements.txtThere are two ways to provide your Garmin credentials: environment file (recommended for initial setup) or Claude Desktop config (recommended for ongoing use).
cp .env.example .env.env with your Garmin Connect credentials: # Garmin Connect Credentials
[email protected]
GARMIN_PASSWORD=your_garmin_password python -m garmin_mcp.authIf successful, you'll see:
Authenticating as [email protected]...
✓ Authentication successful!
✓ Session saved to /Users/shawn/Dev/garmin-mcp/.garth
✓ Tokens are valid for approximately one year.
✓ Verification: Today's step count = 4521.env file. The session tokens in .garth/ are sufficient for ongoing use.If you prefer to keep credentials in the Claude Desktop config (they're passed as environment variables to the MCP server):
{
"mcpServers": {
"garmin": {
"command": "/Users/shawn/Dev/garmin-mcp/venv/bin/python",
"args": ["-m", "garmin_mcp.server"],
"cwd": "/Users/shawn/Dev/garmin-mcp",
"env": {
"GARMIN_EMAIL": "[email protected]",
"GARMIN_PASSWORD": "your_garmin_password"
}
}
}
}Add the garmin-mcp server to your Claude Desktop configuration:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json
#### Minimal Configuration (After Token Auth)
If you've already authenticated and have tokens saved in .garth/:
{
"mcpServers": {
"garmin": {
"command": "/Users/shawn/Dev/garmin-mcp/venv/bin/python",
"args": ["-m", "garmin_mcp.server"],
"cwd": "/Users/shawn/Dev/garmin-mcp"
}
}
}#### Full Configuration (With Credentials)
If you want credentials available for re-authentication:
{
"mcpServers": {
"garmin": {
"command": "/Users/shawn/Dev/garmin-mcp/venv/bin/python",
"args": ["-m", "garmin_mcp.server"],
"cwd": "/Users/shawn/Dev/garmin-mcp",
"env": {
"GARMIN_EMAIL": "[email protected]",
"GARMIN_PASSWORD": "your_garmin_password"
}
}
}
}#### Adding to Existing Configuration
If you already have other MCP servers configured, add garmin to your existing mcpServers object:
{
"mcpServers": {
"some-other-server": {
"...": "..."
},
"garmin": {
"command": "/Users/shawn/Dev/garmin-mcp/venv/bin/python",
"args": ["-m", "garmin_mcp.server"],
"cwd": "/Users/shawn/Dev/garmin-mcp"
}
}
}After saving your configuration, fully quit and restart Claude Desktop for the MCP server to become available.
get_daily_summaryRetrieve comprehensive health metrics for a specific date.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
date | string | No | Date in YYYY-MM-DD format. Defaults to today. |
Returns:
{
"date": "2026-01-03",
"sleep_score": 73,
"training_readiness": 58,
"body_battery_high": 85,
"body_battery_low": 23,
"hrv_status": "BALANCED",
"hrv_value": 24,
"resting_heart_rate": 52,
"avg_stress": 28,
"steps": 8432
}get_summary_rangeRetrieve health metrics for a date range, useful for trend analysis.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
start_date | string | Yes | Start date in YYYY-MM-DD format |
end_date | string | Yes | End date in YYYY-MM-DD format |
Limits: Maximum 30-day range per request.
Returns:
{
"start_date": "2025-12-28",
"end_date": "2026-01-03",
"days": 7,
"summaries": [
{"date": "2025-12-28", "sleep_score": 80, "...": "..."},
{"date": "2025-12-29", "sleep_score": 64, "...": "..."}
]
}get_activitiesRetrieve fitness activities (runs, walks, cycling, strength training, etc.) for a specific date.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
date | string | No | Date in YYYY-MM-DD format. Defaults to today. |
Returns:
{
"date": "2026-01-02",
"count": 1,
"activities": [
{
"name": "Indoor Walking",
"type": "walking",
"start_time": "2026-01-02T11:30:00",
"duration_minutes": 32.5,
"distance_km": 2.8,
"calories": 185,
"avg_hr": 118,
"max_hr": 135,
"training_effect_aerobic": 2.3,
"training_effect_anaerobic": 0.1
}
]
}get_sleep_detailsRetrieve detailed sleep data including stages, timing, and score breakdown.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
date | string | No | Date in YYYY-MM-DD format. Returns sleep for the night ending on this date. |
Returns:
{
"date": "2026-01-03",
"sleep_start": "23:15",
"sleep_end": "06:42",
"total_sleep_minutes": 387,
"deep_sleep_minutes": 62,
"light_sleep_minutes": 198,
"rem_sleep_minutes": 89,
"awake_minutes": 38,
"sleep_scores": {
"overall": {"value": 73},
"quality": {"value": 68},
"recovery": {"value": 71},
"duration": {"value": 82}
}
}Once configured, you can ask Claude things like:
Daily Check-ins:
Trend Analysis:
Activity Review:
Health Correlations:
If you see authentication failures:
rm -rf /Users/shawn/Dev/garmin-mcp/.garth cd /Users/shawn/Dev/garmin-mcp
source venv/bin/activate
python -m garmin_mcp.authIf you have 2FA enabled on your Garmin account:
Tokens are valid for approximately one year. If requests start failing after extended use:
.garth directoryGarmin may temporarily block requests if you query too frequently. The server includes automatic retry logic, but if you encounter persistent failures:
claude_desktop_config.json syntax is valid JSONgarmin-mcp/
├── README.md
├── LICENSE
├── pyproject.toml
├── requirements.txt
├── .env.example
├── .gitignore
└── src/
└── garmin_mcp/
├── __init__.py
├── server.py # MCP server implementation
└── auth.py # Authentication module.garth directory.This project was inspired by AI_Fitness by johnson4601, which demonstrated the approach for extracting Garmin data using the garminconnect library.
The Garmin Connect API access is powered by the garminconnect Python library and garth for OAuth token management.
MIT License - see LICENSE for details.
Contributions are welcome! Please:
This project is not affiliated with or endorsed by Garmin. It accesses the unofficial Garmin Connect API, which may change without notice. Use responsibly and in accordance with Garmin's terms of service.
If you encounter issues:
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.