Skip to main content
Glama
Garmin Connect Personal API MCP

Garmin Connect Personal API MCP

by hannta

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
GARMIN_API_KEYYesYour Garmin Connect Personal API key, created in Garmin Connect on the web.
OWNER_PASSPHRASEYesThe 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

CapabilityDetails
tools
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
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; summary covers full weeks only), for volume over a training block. Weekly totals cover up to 100 activities per call.

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. summary has average / min / max per field. Defaults to the last 7 days; at most 31 days per call. For one field in more detail use garmin_get_daily_summaries, garmin_get_sleep_summaries, garmin_get_hrv_summaries or garmin_search_activities.

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 summary. Defaults to the last 7 days; at most 92 days per call. Today's row is partial. For sleep and HRV over a range use garmin_get_sleep_summaries and garmin_get_hrv_summaries, or garmin_get_days for everything per day.

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 summary. Nights are keyed by the wake-up date. Defaults to the last 7 nights; at most 31 nights per call (Garmin's limit). For one night in full detail use garmin_get_sleep.

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 summary. Keyed by the wake-up date; HRV in milliseconds (RMSSD). Defaults to the last 7 nights; at most 92 nights per call. For one night with overnight readings use garmin_get_hrv.

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 / %). summary has average / min / max weight and the change from the first to the last weigh-in; previous_weigh_in is the last one before the range. Defaults to the last 7 days; at most 366 days per call.

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 (back_to_step, times). Compare with garmin_get_activity for planned vs. actual. Empty for activities not started from a workout created in Garmin Connect. Get the activity id from garmin_search_activities.

garmin_get_activity_streamsA

Time series for one activity, downsampled by Garmin to about points rows, for questions like "did my HR drift in the last 10 km?" or "where did my pace fade?". Returns columns and rows; each row starts with distance (km) and elapsed time (s). Default channels: hr, pace, grade_adjusted_pace, cadence, power, elevation; channels the activity didn't record are left out. Use speed instead of pace for cycling. Location is never returned. Get the activity id from garmin_search_activities.

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

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A3.9/5.0

Scored across 27 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count2/5

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.

Completeness4/5

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.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues