Garmin Training MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| GARMIN_MCP_TIMEZONE | No | Presentation timezone as an IANA identifier. | America/Vancouver |
| GARMIN_MCP_CONFIG_DIR | No | Overrides the credential storage directory; must be an absolute path. Configure identically in all clients when sharing a cache. | |
| GARMIN_PERSONAL_API_KEY | No | Your Garmin Connect Personal API Key, set in the MCP client's local env configuration. It overrides the saved key file; an empty value is an error with no fallback. Alternatively, credentials may be stored with `garmin-mcp setup` as a key file, in which case this variable can be omitted. |
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 |
|---|---|
| list_activitiesA | List one activity page (max 100) within <=366 inclusive Garmin-local dates. sport is a parent activity type key, e.g. running or cycling, not a subtype. Units: meters, seconds, m/s, bpm, watts. Follow pagination.next_offset. |
| get_activityA | Get summary plus one page of feature/group split summaries, not guaranteed laps. activity_id is a positive decimal string. Samples/GPS are unsupported in v1: setting either include flag returns an explicit unsupported error. No location data is returned. Follow pagination.next_offset to retrieve more split summaries. |
| get_sleepA | Sleep duration/stages in seconds, reported score components and window times. Inclusive ISO range <=31 days, end defaults to start. Garmin calendarDate is preserved; wake-date versus sleep-start-date association requires live verification. |
| get_hrvA | Reported overnight/weekly HRV averages and optional Garmin baseline/status. Inclusive ISO range <=31 days, end defaults to start. Values retain Garmin's scale; units and sleep-start/wake-date association need live account verification. |
| get_daily_summaryA | Daily steps, Garmin resting HR field (bpm), stress and Body Battery if present. Inclusive ISO range <=31 days, end defaults to start. Garmin restingValue may fall back to absolute minimum HR. Stress/Body Battery retain Garmin's scale. |
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 5 tools
Each tool maps to a distinct resource: activity listing, single-activity detail, sleep, HRV, and daily summary. The only mild overlap is that get_daily_summary, get_sleep, and get_hrv all return daily wellness data, but the descriptions make the boundaries clear (steps/stress vs. sleep stages vs. HRV averages). list_activities vs. get_activity is a standard, unambiguous list/detail pair.
All five names follow the same snake_case verb_noun pattern (list_activities, get_activity, get_sleep, get_hrv, get_daily_summary). The singular/plural distinction (list_activities vs. get_activity) matches the collection-vs-single semantics rather than breaking the convention.
Five focused read-only tools is a lean but defensible scope for a Garmin data server, and each tool earns its place. It sits at the thin end of the ideal 3-15 range given the breadth of the Garmin domain, but nothing is redundant or filler.
The read surface covers activities, sleep, HRV, and daily wellness, but notable gaps remain: workout/course data, training status/readiness, stress-only detail, body composition, and device info are absent. Activity samples/GPS are explicitly unsupported and lap retrieval is not guaranteed, creating potential dead ends for agents wanting intra-activity detail.