Garmin MCP for macOS
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| GARMIN_MCP_TIMEZONE | No | Optional IANA timezone setting, e.g. "Europe/Berlin". Without this setting, the server reads the Mac's configured zone through /etc/localtime, falling back to UTC if unavailable. Garmin's calendar dates are preserved; summary timestamps are displayed in the selected timezone. |
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 |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| garmin_api_activityB | Full activity details, including fields omitted from the summary tool. Raw JSON fields are not normalized. Date ranges default to 7 days and allow at most 31 days (activity search uses pagination). |
| garmin_api_activity_workoutsB | Workouts associated with an activity. Raw JSON fields are not normalized. Date ranges default to 7 days and allow at most 31 days (activity search uses pagination). |
| garmin_api_activity_searchA | Search activities with every documented filter. Distances and elevations are meters, durations are seconds, dive depth is centimeters, and power is watts. Array filters become repeated query parameters. Supply all four coordinates for a bounding box. Follow pagination with start and limit. Raw JSON fields are not normalized. Date ranges default to 7 days and allow at most 31 days (activity search uses pagination). |
| garmin_api_heart_rate_zonesC | Heart-rate zone settings. generate_defaults defaults to false; setting it true may generate account zone settings when none exist. Raw JSON fields are not normalized. Date ranges default to 7 days and allow at most 31 days (activity search uses pagination). |
| garmin_api_download_activityA | Download the original activity ZIP to a private local directory. Returns file metadata; never extracts the archive. This tool writes a new file on this Mac. Raw JSON fields are not normalized. Date ranges default to 7 days and allow at most 31 days (activity search uses pagination). |
| garmin_api_fitness_ageA | Fitness-age data as of a date. full_history_scan controls the look-back search. Raw JSON fields are not normalized. Date ranges default to 7 days and allow at most 31 days (activity search uses pagination). |
| garmin_api_weight_goalsB | Effective weight goals for a date interval. Raw JSON fields are not normalized. Date ranges default to 7 days and allow at most 31 days (activity search uses pagination). |
| garmin_api_hrv_dailyA | Full daily HRV summary and readings. Raw JSON fields are not normalized. Date ranges default to 7 days and allow at most 31 days (activity search uses pagination). |
| garmin_api_hrv_summariesA | HRV summaries across a date interval. Raw JSON fields are not normalized. Date ranges default to 7 days and allow at most 31 days (activity search uses pagination). |
| garmin_api_food_logsA | Food logs with optional goals, nutrition, media and meal filters. Raw JSON fields are not normalized. Date ranges default to 7 days and allow at most 31 days (activity search uses pagination). |
| garmin_api_menstrual_summaryC | Menstrual-cycle summary for a date. Raw JSON fields are not normalized. Date ranges default to 7 days and allow at most 31 days (activity search uses pagination). |
| garmin_api_menstrual_dayC | Menstrual-cycle day view, including optional analysis and prediction reference date. Raw JSON fields are not normalized. Date ranges default to 7 days and allow at most 31 days (activity search uses pagination). |
| garmin_api_sleep_dailyC | Full sleep response for a date, with fields preserved. Raw JSON fields are not normalized. Date ranges default to 7 days and allow at most 31 days (activity search uses pagination). |
| garmin_api_sleep_summariesA | Sleep summaries across a date interval, including empty placeholders from Garmin. Raw JSON fields are not normalized. Date ranges default to 7 days and allow at most 31 days (activity search uses pagination). |
| garmin_api_profileC | Full profile settings. May include account identifiers and personal information. Raw JSON fields are not normalized. Date ranges default to 7 days and allow at most 31 days (activity search uses pagination). |
| garmin_api_hydrationA | Daily hydration statistics. Raw JSON fields are not normalized. Date ranges default to 7 days and allow at most 31 days (activity search uses pagination). |
| garmin_api_stepsA | Daily step statistics. Raw JSON fields are not normalized. Date ranges default to 7 days and allow at most 31 days (activity search uses pagination). |
| garmin_api_stressA | Daily stress statistics. Raw JSON fields are not normalized. Date ranges default to 7 days and allow at most 31 days (activity search uses pagination). |
| garmin_api_daily_summaryA | Full daily user summary, preserving all Garmin fields. Raw JSON fields are not normalized. Date ranges default to 7 days and allow at most 31 days (activity search uses pagination). |
| garmin_api_daily_summariesB | User summary range response, including the original data envelope. Raw JSON fields are not normalized. Date ranges default to 7 days and allow at most 31 days (activity search uses pagination). |
| garmin_api_weight_allA | All weight measurements from the weight/all endpoint. Raw JSON fields are not normalized. Date ranges default to 7 days and allow at most 31 days (activity search uses pagination). |
| garmin_api_weight_rangeB | Weight range response; include_all controls all versus latest daily entries. Raw JSON fields are not normalized. Date ranges default to 7 days and allow at most 31 days (activity search uses pagination). |
| garmin_api_body_batteryA | Body Battery readings and optional interval grouping using chunks. Raw JSON fields are not normalized. Date ranges default to 7 days and allow at most 31 days (activity search uses pagination). |
| garmin_api_spo2B | Daily oxygen saturation and acclimation data. Raw JSON fields are not normalized. Date ranges default to 7 days and allow at most 31 days (activity search uses pagination). |
| garmin_api_heart_rateA | Daily heart-rate readings and summary. Raw JSON fields are not normalized. Date ranges default to 7 days and allow at most 31 days (activity search uses pagination). |
| garmin_api_wellness_activitiesB | Wellness activity summaries across a date interval. Raw JSON fields are not normalized. Date ranges default to 7 days and allow at most 31 days (activity search uses pagination). |
| garmin_statusA | Check whether GARMIN_PERSONAL_API_KEY is configured without revealing its value. verify=True performs a Garmin authentication check, without returning profile data. |
| garmin_daily_summaryB | Daily steps, energy, heart rate, stress, Body Battery and intensity minutes. Date YYYY-MM-DD; default today in the configured timezone. |
| garmin_sleepA | Sleep duration/stages in seconds, score and overnight vitals. Inclusive wake-up dates; defaults to the last 7 days, maximum 90. Missing days are explicit. |
| garmin_hrvA | Nightly HRV and weekly average in milliseconds, Garmin baseline and status. Inclusive wake-up dates, default last 7 days, maximum 90. |
| garmin_body_batteryA | Body Battery charge/drain points and observed sample minimum/maximum. Inclusive dates, default last 7 days, maximum 90. No invented recovery score. |
| garmin_activitiesA | Search workouts by Garmin's local activity dates; optional type e.g. running. Default last 7 days. limit 1–50, offset >=0. Follow next_offset to check for more pages. |
| garmin_activityA | Summary measurements for one activity: meters, seconds, bpm, watts and training effect. Use activity_id from garmin_activities. Does not download FIT files or return GPS tracks. |
| garmin_dayA | Combine daily summary, sleep, HRV, Body Battery and workouts for one date. Check all section statuses and activity pagination; incomplete data is marked partial. |
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 34 tools
There are two overlapping tool families: raw `garmin_api_*` endpoints and normalized `garmin_*` convenience tools. Many pairs are easily confused, such as `garmin_api_daily_summary` vs `garmin_api_daily_summaries` vs `garmin_daily_summary`, or `garmin_api_sleep_summaries` vs `garmin_api_sleep_daily` vs `garmin_sleep`. Descriptions help somewhat, but an agent must carefully distinguish raw-vs-normalized and single-vs-range variants.
All names use snake_case, but the set mixes a `garmin_api_` raw-endpoint family with a shorter `garmin_` normalized family. Singular/plural distinctions like `garmin_activity`/`garmin_activities` and `daily_summary`/`daily_summaries` are meaningful but add surface inconsistency. The pattern is readable but not fully uniform.
34 tools is heavy for a personal health-data server and includes many near-duplicate raw/normalized variants. Several tools earn their place, but the surface feels bloated rather than tightly scoped. This exceeds the typical 3–15 well-scoped range.
The surface broadly covers Garmin health data: activities, sleep, HRV, Body Battery, steps, stress, hydration, weight, profile, menstrual cycle, heart-rate zones, food logs, and activity downloads. It is mostly read-only, which is appropriate, but some Garmin domains such as devices, training status, and badges are absent. These are minor gaps rather than dead ends for core workflows.