Garmin MCP
Provides tools to access Garmin Connect data including steps, sleep, stress, activities, daily summaries, and more. Also offers statistical analysis and visualization of health metrics.
Enables sending email summaries via SMTP, using Gmail as an example provider.
Allows AI-driven chart generation and visualization explanations using an OpenAI-compatible LLM.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Garmin MCP show my steps for the last 7 days"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Garmin MCP
MCP server that exposes Garmin Connect data (steps, sleep, stress, activities, etc.) via garth and fastMCP. Auth: set GARMIN_EMAIL and GARMIN_PASSWORD in env, or use a saved session at ~/.garth (or GARTH_SESSION_PATH).
MCP config
Use full path to uvx (e.g. which uvx). Example for Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json) or Cursor:
{
"mcpServers": {
"garmin": {
"command": "/Users/YOUR_USER/.local/bin/uvx",
"args": ["--refresh", "--from", "git+https://github.com/lokranjanp/garminmcp", "garmin-mcp"],
"env": {
"GARMIN_EMAIL": "your-garmin-email@example.com",
"GARMIN_PASSWORD": "your-password",
"SMTP_HOST": "smtp.gmail.com",
"SMTP_PORT": "587",
"SMTP_USER": "your-email@gmail.com",
"SMTP_PASSWORD": "your-app-password",
"SMTP_TO": "recipient@example.com",
"OUTPUT_DIR": "/Users/user.mac/garmin_data/",
"LLM_API_BASE": "http://localhost:1234/v1",
"LLM_API_KEY": "lm-studio",
"LLM_MODEL": "your-loaded-model-name"
}
}
}
}From PyPI (if published): "args": ["garmin-mcp"].
Related MCP server: health-mcp
Commands
uv sync # install from uv.lock
uv run garmin-mcp # run server locally
uv lock # refresh lock after changing pyproject.tomlTools (17 base + 3 opt-in)
# | Tool | Description |
Utility | ||
1 |
| Current date/time (local & UTC, ISO, weekday) |
Auth | ||
2 |
| Log in and save session to disk |
3 |
| Load saved session |
User | ||
4 |
| Profile (display name, timezone, etc.) |
5 |
| Settings (units, preferences) |
Metrics (daily/weekly series) | ||
6 |
| Fetch daily or weekly stat series. |
Detailed health data | ||
7 |
| Fetch detailed data (single day or list). |
Activities | ||
8 |
| List activities (start, limit) |
9 |
| Full details for one activity by ID |
10 |
| List all activity types (type IDs and keys) |
Biomarkers & summary | ||
11 |
| One-day wellness: RHR, HR, stress, steps, SpO2, respiration, body battery, calories |
12 |
| Resting heart rate for a date range |
13 |
| Comprehensive biomarker + activity report (daily/weekly/biweekly/monthly) |
Delivery | ||
14 |
| Generate summary report and send via SMTP email (HTML + plain-text) |
Statistical analysis | ||
15 |
| Run a stats operation on numeric data. |
Visualization (matplotlib) | ||
16 |
| Render a chart. |
Raw API | ||
17 |
| Call any Connect API path (GET/POST) |
LIDA / AI visualization (opt-in, requires | ||
18 |
| AI-driven chart generation -- auto-picks the best chart type |
19 |
| Suggest N visualization goals for a dataset (EDA) |
20 |
| Explain a visualization's code in natural language |
Dates: use YYYY-MM-DD; omit end date for "today" where supported.
SMTP env vars (for delivery tools)
Variable | Required | Description |
| yes | SMTP server (e.g. |
| no | Port, default |
| yes | Login username / email |
| yes | Password or app-password |
| no | Sender address (defaults to |
| no | Default recipient(s), comma-separated |
| no |
|
LLM env vars (for LIDA visualization tools -- opt-in)
The 3 LIDA tools (garmin_lida_*) are only registered when LLM_API_KEY is set. If omitted, the server loads with 17 tools instead of 20, reducing context overhead for the AI client.
Variable | Default | Description |
|
| LLM provider for LIDA |
| (none) | Custom endpoint -- set to |
| (none) | API key (use |
|
| Model name (for LM Studio: whatever model is loaded) |
Visualization output is saved to output/viz/ (or OUTPUT_DIR env var) and also returned as base64 PNG in the JSON response.
Available Tools
17 toolsgarmin_activitiesA
List activities from Garmin Connect. start: index to start from, limit: max number to return. Returns activity IDs, names, types, start time, duration, distance, etc.
Inputs: limit, start. Returns: result
garmin_activity_detailsA
Get full details for one activity by ID (running, cycling, strength, etc.). Includes summary (distance, duration, HR, calories, cadence, etc.), splits, and metadata. Use garmin_activities first to get activity_id values.
Inputs: activity_id (required). Returns: result
garmin_activity_typesA
List all Garmin activity types (running, cycling, strength_training, etc.) with type IDs and keys.
Inputs: no named parameters. Returns: result
garmin_connect_apiA
Call the Garmin Connect API at an arbitrary path. Use for endpoints not wrapped by other tools. path: e.g. /userprofile-service/socialProfile or /activitylist-service/... method: GET or POST. body: optional JSON string for POST.
Inputs: path (required), body, method. Returns: result
garmin_current_datetimeA
Return current date and time variables (local and UTC). Use for building date ranges or passing today's date to other Garmin tools (e.g. YYYY-MM-DD for day/sleep/weight).
Inputs: no named parameters. Returns: result
garmin_daily_summaryA
Get one-day wellness summary (biomarkers): RHR, min/max HR, stress, steps, distance, calories, SpO2 (avg/low/high), respiration (avg/low/high), body battery (charged/max/min), intensity minutes, floors, sleep summary. day: YYYY-MM-DD.
Inputs: day (required). Returns: result
garmin_dataA
Fetch detailed health data from Garmin Connect.
data_type: "sleep", "hrv", "weight", "body_battery_events", or "body_battery_stress". day: YYYY-MM-DD for single-day data. If omitted, fetches a list. end_date: YYYY-MM-DD end of range for list mode (defaults to today). days: number of days for list mode (default 7; up to 30 for weight).
When day is provided: returns detailed data for that single day. When day is omitted: returns a list of entries over the date range.
Note: body_battery_events and body_battery_stress only support single-day mode (day param).
Examples: garmin_data(data_type="sleep", day="2026-02-01") # single day garmin_data(data_type="sleep", days=14) # last 14 days garmin_data(data_type="weight", end_date="2026-02-01", days=30) garmin_data(data_type="body_battery_events", day="2026-02-01")
Inputs: data_type (required), day, days, end_date. Returns: result
garmin_email_summaryA
Generate a Garmin summary report and email it via SMTP.
period: "daily", "weekly", "biweekly", or "monthly" (default: weekly). end_date: YYYY-MM-DD (defaults to today). to: recipient email(s), comma-separated (defaults to SMTP_TO env var). subject: custom subject line (auto-generated if omitted).
Requires SMTP env vars: SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASSWORD. Optional: SMTP_FROM (defaults to SMTP_USER), SMTP_TO (default recipient), SMTP_USE_SSL ("true" for port-465 implicit SSL; default is STARTTLS).
The email contains a formatted HTML report (with plain-text fallback) covering all biomarkers: HR, HRV, stress, sleep, SpO2, respiration, body battery, steps, hydration, intensity minutes, calories, weight, activities, and strength training sessions.
FOCUS MORE ON STRENGTH AND CARDIO BIO-MARKERS IF POSSIBLE.
Inputs: to, period, subject, end_date. Returns: result
garmin_loginA
Log in to Garmin Connect with email and password. Saves the session to the given path (default: ~/.garth) so you can use resume_session later without logging in again.
Inputs: email (required), password (required), session_path. Returns: result
garmin_metricA
Fetch daily or weekly stat series from Garmin Connect.
metric: "steps", "sleep", "stress", "hydration", "intensity_minutes", or "hrv". period: "daily" (default) or "weekly". end_date: YYYY-MM-DD (defaults to today/this week). count: number of days or weeks to fetch (default 7).
Examples: garmin_metric(metric="steps", period="daily", count=14) garmin_metric(metric="stress", period="weekly", count=4) garmin_metric(metric="hrv", count=28)
Inputs: metric (required), count, period, end_date. Returns: result
garmin_resting_heart_rateA
Get resting heart rate (RHR) for one or more days. end_date: YYYY-MM-DD or omit for today. Returns daily RHR and optional 7-day average. metricId 60 = resting heart rate.
Inputs: days, end_date. Returns: result
garmin_resume_sessionA
Resume a previously saved Garmin session from disk. Use this (or set GARTH_SESSION_PATH) before calling other tools so they are authenticated. Default path: ~/.garth.
Inputs: session_path. Returns: result
garmin_statsA
Perform a statistical analysis operation on numeric data.
operation: one of "describe", "percentiles", "correlation", "trend", "compare", "moving_average", "outliers".
Common params: values: primary list of numeric values (required for all operations). y: second list of values (for "correlation" and "compare"). labels: parallel date/label list (for "trend" and "moving_average").
Operation-specific params: describe: (no extra params needed) percentiles: percentiles (list of ranks 0-100, default [5,10,25,50,75,90,95]) correlation: y (required), method ("pearson" or "spearman") trend: labels (optional date labels) compare: y (required sample B), a_label, b_label moving_average: window (default 7), labels outliers: method ("iqr" or "zscore"), threshold (default 1.5)
Examples: Descriptive stats: operation="describe", values=[65,62,68,70,64] Trend analysis: operation="trend", values=[rhr_vals...], labels=[dates...] Correlation: operation="correlation", values=[steps...], y=[sleep_scores...], method="pearson" Compare weeks: operation="compare", values=[this_week...], y=[last_week...], a_label="this_week", b_label="last_week"
Inputs: values (required), operation (required), y, labels, +6 more. Returns: result
garmin_summary_reportA
Generate a comprehensive summary of all essential biomarkers and activity stats.
period: "daily" (1 day), "weekly" (7 days), "biweekly" (14 days), or "monthly" (30 days). end_date: YYYY-MM-DD (defaults to today).
Includes: RHR, HRV, stress, sleep score, SpO2, respiration, body battery, steps, hydration, intensity minutes, calories, weight, activities breakdown, and strength training sessions.
Inputs: period, end_date. Returns: result
garmin_user_profileB
Get the current user's Garmin Connect profile (display name, timezone, activities, etc.).
Inputs: no named parameters. Returns: result
garmin_user_settingsA
Get the current user's Garmin Connect settings (units, preferences, etc.).
Inputs: no named parameters. Returns: result
garmin_vizA
Render a chart and return the image inline (displayed by Claude Desktop) plus the saved file path.
chart_type: "line", "bar", "scatter", "histogram", "pie", "heatmap", or "multi_line".
Common params (used by most types): x: x-axis values or labels. y: y-axis values (for histogram, pass the data here). title, x_label, y_label: chart labels.
Type-specific params: histogram: bins (default 20). heatmap: matrix (2-D list), x_labels, y_labels. multi_line: y_series (list of y-value lists), series_labels.
Examples: Line: chart_type="line", x=["Mon","Tue",...], y=[8000,9200,...] Bar: chart_type="bar", x=["running","strength"], y=[5,3] Scatter: chart_type="scatter", x=[steps...], y=[sleep_scores...] Histogram: chart_type="histogram", y=[hrv_values...] Pie: chart_type="pie", x=["running","cycling"], y=[120,80] Heatmap: chart_type="heatmap", matrix=[[...],[...]], x_labels=["Mon",...], y_labels=["Wk1",...] Multi-line: chart_type="multi_line", x=[dates...], y_series=[[rhr...],[stress...]], series_labels=["RHR","Stress"]
Inputs: chart_type (required), x, y, bins, +8 more. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 17 tools
Multiple tools overlap heavily: garmin_metric, garmin_data, garmin_daily_summary, garmin_summary_report, and garmin_email_summary all expose sleep, stress, HRV, or biomarker data in slightly different forms. garmin_summary_report and garmin_email_summary are nearly identical except for the email side effect, and garmin_connect_api adds another ambiguous path to the same data.
The garmin_ prefix and snake_case style are consistent, and most names follow a readable resource-style pattern like garmin_activities or garmin_daily_summary. Minor inconsistencies like garmin_stats, garmin_viz, and garmin_email_summary (verb-style) keep it from being perfectly uniform.
17 tools is in the borderline-heavy range for one server, especially since several tools are auxiliary (stats, viz, email, generic API passthrough) rather than core Garmin data retrieval. The overlapping wellness and summary tools could be consolidated to reduce the count without losing capability.
The tool set covers the core Garmin domain well: activities, activity details, biomarkers, user profile/settings, authentication, and an API fallback. Minor gaps exist, such as no explicit write/upload tools or dedicated series for every biomarker, but garmin_connect_api mitigates most missing endpoints.
Maintenance
Related MCP Connectors
MCP server for Withings health data — sleep, activity, heart, and body metrics.
Remote MCP server for training, nutrition, wellness, and performance data with OAuth 2.0.
Multi-tenant hosted MCP server for Oura Ring — 21 read-only tools, OAuth per user.
Unofficial Garmin Connect access: sleep, HRV, training, activities, workouts and weight.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server to interact with Garmin Connect, enabling retrieval of health, activity, and device data through natural language.66MIT
- AlicenseNot gradedqualityDmaintenanceExposes personal Garmin wellness data through MCP tools for accessing summary, sleep, HRV, heart rate, stress, body battery, and historical data.MIT
- AlicenseNot gradedqualityCmaintenancePersonal MCP server for interacting with your Garmin Connect data. Exposes 62 tools across 11 domains including activities, health, training, and workouts.1MIT
- AlicenseAqualityDmaintenanceMCP server for reading and querying Garmin Connect data, including activities, strength history, recovery, trends, and optionally creating workouts.12MIT