Garmin Connect Personal API MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| GARMIN_API_KEY | Yes | Your Garmin Connect Personal API key, created in Garmin Connect on the web. | |
| OWNER_PASSPHRASE | Yes | The passphrase used to sign in to the MCP server (for example via MCP Inspector). |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
Read-only access to the user's Garmin Connect data (activities, sleep, HRV, daily recovery metrics, Body Battery, stress, heart rate, weight, heart-rate zones). All values are metric; every field name includes its unit. Dates are YYYY-MM-DD in the user's time zone, and omitted dates mean today. Sleep and HRV are keyed by the wake-up date. Start with garmin_get_day for readiness questions, garmin_get_days for trends over a range, and garmin_search_activities to find activities. Range tools default to the last 7 days and make one Garmin request per source; if a range is too long, the error says the maximum: split it into several calls. Range results include plain average / min / max statistics in summary; any further analysis is yours. Use garmin_get_activity_laps for one row per lap or interval rep. Not available from the Garmin Personal API: Training Readiness, Training Status, VO2max history, a personal-records list and gear. Say so instead of guessing, and label any readiness estimate you make from HRV, sleep and load as your own estimate.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| garmin_get_dayA | One day at a glance, for readiness and recovery questions: resting heart rate, Body Battery (with the sleep and activity events behind it), stress and minutes per stress level, intensity minutes, steps, calories (burned, and eaten if food is logged), logged hydration, heart-rate alerts, the previous night's sleep (keyed by this wake-up date) and HRV summary, and a compact list of that day's activities. For "should I train hard today?", call it for today and yesterday. For detail, use garmin_get_sleep, garmin_get_hrv and garmin_get_activity. |
| garmin_search_activitiesA | List Garmin activities in a date range, newest first: ID, type, local start time, distance, duration, pace (or speed), average / max heart rate, elevation gain, training effect, training load and fastest splits (1 km … marathon, when long enough). Defaults to the last 7 days. Use the returned id with garmin_get_activity for heart-rate zones, running dynamics, intervals and RPE. With group_by "week", returns totals per week instead (count, distance, time, elevation, training load, minutes per HR zone, longest activity; |
| garmin_get_activityA | Full summary of one Garmin activity: pace and grade-adjusted pace, heart rate and time in HR zones, running dynamics (cadence, ground contact time, vertical oscillation, stride), power, training effect and load, RPE and feel, Body Battery change, stamina, temperature, estimated sweat loss, and interval totals by type (warm-up / active / recovery / cool-down) plus run / walk totals. Strength activities add sets, reps and weight per exercise category. For per-lap rows, use garmin_get_activity_laps. Find the id with garmin_search_activities or garmin_get_day. |
| garmin_get_sleepA | One night of sleep from Garmin: start and end time, total sleep, stages (deep / light / REM / awake), sleep score with each component's optimal range, sleep need with the reasons Garmin adjusted it (training, sleep history, HRV, naps), the next night's sleep need, naps that day, average heart rate, respiration, SpO2, sleep stress and breathing disruptions. Nights are keyed by the wake-up date: "last night" is today's date. |
| garmin_get_hrvA | One night's heart-rate variability from Garmin: last-night average, 5-minute high, 7-day average, personal baseline range, HRV status (e.g. BALANCED, UNBALANCED, LOW) and overnight readings averaged per 30 minutes. Keyed by the wake-up date, like sleep. HRV is in milliseconds (RMSSD). |
| garmin_get_profileA | The user's Garmin settings and heart-rate zones: time zone used for dates, first day of the week, training and long-run days set in Garmin Connect, and per-sport HR zones with max, resting and lactate-threshold heart rate. Use it to interpret heart-rate data from the other tools. |
| garmin_get_daysA | garmin_get_day over a date range, one compact row per day, for "am I absorbing this training?" and other recovery-vs-load questions: resting heart rate, HRV and its status, sleep duration and score, Body Battery, stress, intensity minutes, steps, and that day's activity count, duration, distance and training load. |
| garmin_get_daily_summariesA | All-day wellness per day over a date range, for trends: resting / min / max heart rate, Body Battery (max, min, charged, drained), average and max stress, intensity minutes, steps, calories burned (total / active) and respiration, plus average / min / max of each field in |
| garmin_get_sleep_summariesA | Sleep per night over a date range, for trends: bedtime and wake time, duration, sleep score, deep / light / REM / awake minutes, nap minutes, average heart rate, respiration, SpO2, sleep stress, breathing disruptions and Garmin's sleep need, plus average / min / max in |
| garmin_get_hrv_summariesA | Overnight heart-rate variability per night over a date range, for trends: last-night average, 5-minute high, 7-day average, personal baseline range and HRV status (BALANCED, UNBALANCED, LOW, POOR), plus average / min / max in |
| garmin_get_weightA | Weigh-ins over a date range, one row per day with a weigh-in: weight and, from smart scales, BMI, body fat, body water, muscle and bone mass (kg / %). |
| garmin_get_body_batteryA | Body Battery per day over a date range: how much it charged and drained, and the events behind it — sleep, each activity, rest and stress periods — with start time, duration, impact on Body Battery and Garmin's feedback. Set include_samples for the level through the day (averaged per 30 min). For daily max / min Body Battery use garmin_get_daily_summaries. Defaults to the last 7 days; at most 31 days per call. |
| garmin_get_stressA | All-day stress per day over a date range: average stress level (0–100) and minutes at rest (0–25), low (26–50), medium (51–75) and high (76–100) stress. Today's row is partial. Defaults to the last 7 days; at most 28 days per call. |
| garmin_get_stepsA | Steps per day over a date range, with the daily step goal and walking / running distance (km). Today's row is partial. Defaults to the last 7 days; at most 28 days per call. |
| garmin_get_heart_rateA | One day's all-day heart rate: resting, min and max, Garmin's 7-day resting average, and high / low heart-rate alerts (with the alert thresholds) if any fired. Set include_samples for heart rate through the day (averaged per 15 min), e.g. to see when it settled after a hard session. For resting HR over a range use garmin_get_daily_summaries. |
| garmin_get_spo2A | One day's blood oxygen (Pulse Ox): average, lowest and latest SpO2 (%), the average during sleep and Garmin's 7-day average. Set include_samples for hourly averages with altitude (m), e.g. for altitude acclimation. SpO2 is only recorded when Pulse Ox is on in the watch settings. |
| garmin_get_fitness_ageA | Garmin's fitness age on a date, compared with chronological age and the achievable fitness age, and the components it is based on: resting heart rate, BMI, and vigorous days and minutes per week. Components marked stale have no recent data. Garmin does not use VO2max here. |
| garmin_get_heart_rate_zonesA | The user's heart-rate zones per sport (bpm ranges for zones 1–5), with the max, resting and lactate-threshold heart rate and the method they are based on. garmin_get_profile returns the same zones together with profile settings. |
| garmin_get_weight_goalsA | Weight goals in effect during a date range: target weight (kg) and start / end date. For weigh-ins use garmin_get_weight. Defaults to the last 7 days; at most 366 days per call. |
| garmin_get_hydrationA | Hydration per day over a date range, as logged in Garmin Connect: intake, goal, estimated sweat loss and intake during activities (ml). Only has data if the user logs hydration. Defaults to the last 7 days; at most 31 days per call. |
| garmin_get_wellness_activitiesA | Wellness activities over a date range — sessions such as breathwork or Health Snapshot recorded on the watch, separate from regular activities (garmin_search_activities) — with start / end time, and average / min / max heart rate, stress, respiration, SpO2 and HRV (RMSSD / SDRR, ms) when recorded, plus time in zones. Defaults to the last 7 days; at most 92 days per call. |
| garmin_get_food_logA | One day's food log from Garmin Connect: calories, carbs, protein and fat eaten against the daily goals (adjusted goals include active calories), then each meal with its logged foods. Food totals are per serving × servings. Only has meals if the user logs food in Garmin Connect. |
| garmin_get_menstrual_cycleA | Menstrual cycle around a date, from cycle tracking in Garmin Connect: day in cycle, phase, period length, fertile window, predicted cycle length and ovulation date, and Garmin's cycle analysis (median length, variability). Useful for relating training, HRV and resting heart rate to the cycle. Only has data if the user tracks their cycle in Garmin Connect. |
| garmin_get_menstrual_dayA | One day of menstrual cycle tracking: what was logged (flow, symptoms, moods, ovulation day, notes) and that day's cycle summary (same fields as garmin_get_menstrual_cycle). During pregnancy tracking it adds the weekly weight-gain range. Only has data if the user tracks their cycle in Garmin Connect. |
| garmin_get_activity_workoutsA | The structured workout an activity was started from, step by step: warm-up / active / rest, how each step ends (time, distance in m, reps, heart rate or lap button), its target (HR zone or bpm / % of max HR range, pace range, power, cadence) and repeat groups ( |
| garmin_get_activity_streamsA | Time series for one activity, downsampled by Garmin to about |
| garmin_get_activity_lapsA | One row per lap of an activity, plus one row per interval rep when it was an interval session: distance, time, pace and grade-adjusted pace, heart rate, power, cadence, running dynamics, elevation, calories, temperature and respiration. For questions like "how did each rep go?" or "which kilometres were slowest?". Location is never returned. Get the activity id from garmin_search_activities. On the Cloudflare free plan a long activity can fail with a connector error (CPU limit): say so rather than retrying. |
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 27 tools
Most tools target a clearly distinct metric or action, and descriptions explicitly route between single-day detail, range summaries, and activity sub-resources. A few overlaps remain, notably garmin_get_day vs garmin_get_days vs garmin_get_daily_summaries, garmin_get_profile vs garmin_get_heart_rate_zones, and garmin_get_menstrual_cycle vs garmin_get_menstrual_day, but they are mostly manageable.
All tools use snake_case with a consistent garmin_ prefix and a predictable get_ or search_ verb pattern. Singular/plural variants such as get_day/get_days and get_sleep/get_sleep_summaries are also used consistently.
At 27 tools, the surface is above the typical well-scoped range and includes many parallel single-day, range, and summary variants. While the broad Garmin health domain justifies many of them, several could be consolidated via parameters, making the set feel heavy.
The surface covers a broad read-only set of Garmin personal health data: sleep, HRV, activities, Body Battery, stress, heart rate, SpO2, weight, hydration, food, menstrual tracking, workouts, streams, and laps. Minor gaps remain, such as write/logging operations, training readiness or VO2max-specific endpoints, devices, and activity export.