garmin-connect-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| TZ | No | Time zone used to define "today". Alternative to GARMIN_MCP_TZ. | |
| GARMIN_MCP_TZ | No | Time zone used to define "today". Defaults to the system time zone. TZ is also accepted. | |
| GARMIN_MCP_HOST | No | HTTP bind host. Default is 127.0.0.1. | |
| GARMIN_MCP_PORT | No | HTTP bind port. Default is 8000. | |
| GARMIN_KEY_EXPIRES | No | API key expiry date in YYYY-MM-DD format; get_profile warns within 14 days. | |
| GARMIN_MCP_TRANSPORT | No | MCP transport to use: stdio or streamable-http. Default is stdio. | |
| GARMIN_MCP_HTTP_TOKEN | No | Bearer token for HTTP transport. Alternative to GARMIN_MCP_HTTP_TOKEN_FILE. | |
| GARMIN_PERSONAL_API_KEY | No | Garmin Personal API key. Alternative to GARMIN_PERSONAL_API_KEY_FILE or the default key file at ~/.config/garmin/connect-personal-api-key. | |
| GARMIN_MCP_ALLOWED_HOSTS | No | Comma-separated Host names for DNS-rebinding protection when running behind a proxy. | |
| GARMIN_MCP_HTTP_TOKEN_FILE | No | Path to a file containing the bearer token for HTTP transport. Alternative to GARMIN_MCP_HTTP_TOKEN. | |
| GARMIN_MCP_REQUEST_TIMEOUT | No | Seconds per Garmin request. Default is 30. | |
| GARMIN_PERSONAL_API_KEY_FILE | No | Path to a file containing the Garmin Personal API key. Alternative to GARMIN_PERSONAL_API_KEY. Default key file is ~/.config/garmin/connect-personal-api-key. | |
| GARMIN_MCP_ALLOW_UNAUTHENTICATED | No | Set to 1 to allow binding HTTP transport to a non-loopback address without a bearer token. Only use behind an authenticating reverse proxy. |
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 |
|---|---|
| get_recoveryA | Day-by-day recovery picture: sleep (duration, score, stages, bedtime), overnight HRV and its 7-day average, resting HR, stress, Body Battery and steps, plus range averages. Defaults to the last 7 days; at most 92 days per call. |
| get_day_detailA | Deeper look at one day: sleep score breakdown and Garmin's sleep insight, overnight HRV readings range, and the Body Battery events (sleep charge, activities, stress) that explain the day's drain. Defaults to today. |
| list_activitiesA | Activities newest first, one compact row each: duration, distance, pace/speed, HR, power, TSS/IF, training load, training effect and time in HR zones. Defaults to the last 30 days. |
| get_activityA | One activity in detail: summary metrics, the planned workout it followed, and (from the FIT file) each leg of a multisport session, every lap, and minutes per HR zone. |
| get_training_summaryA | Training volume per week (or month/day) split by sport: sessions, hours, distance, elevation, training load, TSS and HR-zone minutes. Computed by this server from the activity list. Defaults to the last 8 full ISO weeks including the current one. |
| get_body_compositionA | Weigh-ins per day (weight, body fat, muscle, water, BMI) and the range average. Defaults to the last 90 days. |
| get_nutritionA | Food log for one day from Garmin Connect nutrition (totals, goals, meals) plus hydration intake and estimated sweat loss. Defaults to today. |
| get_profileA | User settings relevant to interpreting data: units, time zone, training days and heart-rate zones per sport. |
| garmin_api_getA | Escape hatch: GET any Personal API path and return the JSON, squeezed (nulls and image/ID noise removed, long lists cut). Use only when no other tool covers the data, e.g. /usersummary-service/stats/stress/daily/{start}/{end}, /wellness-service/wellness/dailyHeartRate?date=…, /wellness-service/wellness/daily/spo2acclimation/{date}, /fitnessage-service/fitnessage/v2/{date}, /goal-service/goal/user/effective/weightgoal/{start}/{end}. |
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 9 tools
Most tools have clearly distinct purposes: list_activities vs get_activity, get_training_summary, get_body_composition, get_nutrition, and get_profile are easy to tell apart. The main overlap is get_recovery vs get_day_detail, since both surface sleep, HRV, and Body Battery data, though the range-vs-single-day distinction helps. garmin_api_get is an intentional escape hatch with explicit usage guidance.
Eight of nine tools follow a consistent snake_case verb_noun pattern using get_ or list_ prefixes. garmin_api_get is a minor deviation, but it still uses snake_case and signals its special escape-hatch role. Overall naming is predictable and readable.
Nine tools is well-scoped for a read-only Garmin Connect data server. Each tool covers a distinct data area—recovery, day detail, activities, training, body composition, nutrition, profile—and the escape hatch adds flexibility without bloating the set. No tool feels redundant or superfluous.
The surface covers the core health/fitness domains: recovery, sleep, HRV, activities, training load, body composition, nutrition, and profile. Minor gaps exist for less common metrics like SpO2, fitness age, and goals, but garmin_api_get provides a documented escape hatch for those cases. This is broadly complete for typical agent workflows.