Garmin MCP Server (Tyler Irving)
Garmin Connect fitness and health data access for AI analysis.
Data last scanned today · Reviewed today
Overview
This Python-based MCP server allows AI assistants to interact directly with your Garmin Connect metrics. By surfacing data through specific tools, it enables LLMs to process health signals like HRV, Body Battery, and training load without manual data exports. Users can choose between a local stdio implementation for Claude Desktop or a self-hosted HTTP setup for broader connectivity. The server features a robust suite of analytical functions including activity summaries, sleep stage details, and training readiness scores. While most operations are read-only, it provides an opt-in path for creating custom strength workouts.
Our verdict
With a high-risk security score of 33/100, this server should be used with caution as it is community-maintained and has not yet undergone editorial review for security vulnerabilities. The authentication methods and risk levels for individual tools have not been thoroughly vetted, making it suitable only for users who are comfortable managing independent, unverified integrations.
- Zero direct dependencies reduces the supply-chain surface area.
- Provides a unified daily briefing tool for holistic health views.
- Supports both local stdio and cloud-hosted HTTP deployment modes.
- Comprehensive suite of read-only activity and health metrics.
- Community-maintained project with no formal vendor oversight.
- Authentication security remains unreviewed by the community.
- Single-contributor development creates a notable bus-factor risk.
Tools
| Tool | Description | Risk |
|---|---|---|
| get_daily_briefing | One-call morning snapshot — fuses sleep, HRV, Body Battery, readiness, training load, and resting HR (plus RHR vs. your baseline) so Claude can reason across them in a single shot. | low |
| get_sleep | Sleep duration, stages (deep / light / REM / awake), score, overnight HRV. | low |
| get_recent_activities | List of recent activities with type, duration, distance, average heart rate. | low |
| get_activity_details | Full metrics for one activity, including splits, HR zones, and power. | low |
| get_training_load | Daily training load with acute (ATL), chronic (CTL), ACWR, and current status. | low |
| get_training_readiness | Daily readiness score 0-100 with contributing factors (sleep, HRV, recovery). | low |
| get_hrv_status | Current HRV status, baseline range, and the last 7 nights of readings. | low |
| get_body_battery | Body battery values across the day with min, max, charged, drained. | low |
| get_steps_and_calories | Daily step count, distance, calories, floors, and intensity minutes. | low |
| get_resting_heart_rate | Resting heart rate trend and average over the requested window. | low |
Compatibility
| Client | Local | Docker | Remote | Read-only |
|---|---|---|---|---|
| ChatGPT | ||||
| Claude Desktop | ||||
| Cursor | ||||
| VS Code | ||||
| Windsurf |
Frequently asked questions
›What are the system requirements for running the Garmin MCP server locally?
The server requires Python 3.12 or newer and the uv package manager.
›How do I authenticate with my Garmin Connect account?
You can authenticate by running the command 'uvx garmin-mcp login', which prompts for your email, password, and MFA code to store session tokens in your user cache directory.
›Are the tools read-only by default?
Yes, the server is read-only by default. Write tools are disabled unless you specifically set the environment variable GARMIN_WRITE_ENABLED=1.
›How do I create a strength workout using this server?
You must first call 'preview_strength_workout' to receive a confirmation token, then pass that token to 'create_strength_workout' to save the workout to your Garmin Connect library.
›How do I sync a created workout to my physical Garmin device?
After the workout is created in your library, you must open it in the Garmin Connect app, tap 'Send to Device', and perform a manual sync.
›What happens if a specific health metric is not recorded for a given day?
The server returns a null value for any fields that Garmin did not record for that specific request.
Changelog
- Fix
- Newv0.4.0
2026-05-31
- Fixv0.3.1 — automated (OIDC) PyPI release
2026-05-30
- Fix
- New
- Fix
- Fixv0.2.1 — Personal-record labels + units
2026-05-30
- Newv0.2.0 — Six new tools (15 total)
2026-05-30
- Newv0.1.1 — Docs, badges, and LICENSE
2026-05-30
- New
Badge
Maintain this server? Add the live badge to your README.