Garmin MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SMTP_TO | No | Default recipient(s), comma-separated | |
| LLM_MODEL | No | LLM model name (default: gpt-4o-mini) | gpt-4o-mini |
| SMTP_FROM | No | Sender email address (defaults to SMTP_USER) | |
| SMTP_HOST | No | SMTP server host (e.g., smtp.gmail.com) | |
| SMTP_PORT | No | SMTP port (default: 587) | 587 |
| SMTP_USER | No | SMTP username/email | |
| OUTPUT_DIR | No | Output directory for saved files (default: output/) | |
| LLM_API_KEY | No | LLM API key (setting this enables LIDA tools) | |
| GARMIN_EMAIL | No | Garmin account email | |
| LLM_API_BASE | No | Custom LLM API base URL (e.g., http://localhost:1234/v1) | |
| LLM_PROVIDER | No | LLM provider for LIDA tools (default: openai) | openai |
| SMTP_USE_SSL | No | Set to 'true' for implicit SSL (port 465) | |
| SMTP_PASSWORD | No | SMTP password or app-password | |
| GARMIN_PASSWORD | No | Garmin account password | |
| GARTH_SESSION_PATH | No | Path to saved Garmin session file (default: ~/.garth) |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tasks | {
"list": {},
"cancel": {},
"requests": {
"tools": {
"call": {}
},
"prompts": {
"get": {}
},
"resources": {
"read": {}
}
}
} |
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| 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). |
| 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. |
| 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. |
| garmin_user_profileB | Get the current user's Garmin Connect profile (display name, timezone, activities, etc.). |
| garmin_user_settingsA | Get the current user's Garmin Connect settings (units, preferences, etc.). |
| 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) |
| 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") |
| garmin_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. |
| 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. |
| garmin_activity_typesA | List all Garmin activity types (running, cycling, strength_training, etc.) with type IDs and keys. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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" |
| 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"] |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
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.