Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
GARMIN_API_KEYYesGarmin Personal API key, from Garmin Connect > Settings > Personal API Token.

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 own Garmin Connect data. Dates are the user's local calendar dates (YYYY-MM-DD). Pick the smallest tool that answers the question, usually in one call: 'how am I / recovered / ready to train / how did I sleep last night' -> get_readiness (defaults to today); trends in sleep, resting HR, HRV, stress, steps or Body Battery over weeks or months -> summarize_wellness (set include to just the sources needed); training totals, distances, paces or trends -> summarize_activities; weekday patterns -> group_by 'weekday'; specific workouts, longest or fastest -> search_activities (sort_by), then get_activity for one or compare_activities for 2-5; per-km or per-mile splits, laps or interval reps, fastest 1 km/5 km/10 km within a run, time in HR zones or HR drift for one activity -> get_activity_analysis (get_activity's splitSummaries are only warm-up/active/cool-down totals, not km splits); day-by-day values for a short range -> get_daily_summaries, get_sleep_summaries, get_hrv_summaries. Prefer period (e.g. last_30_days, this_month, last_week) and 'today'/'yesterday' over computing dates: they resolve in the user's time zone. Tools return compact, readable fields by default; only pass detail='full' when a needed field is missing. Long ranges are split automatically, so don't chunk them yourself. SCOPE: these tools are the complete Garmin Personal API. It covers daily summaries, sleep, HRV, Body Battery, stress, heart rate, steps, SpO2, fitness age, weight and weight goals, hydration, nutrition, menstrual cycle, profile/HR zones and recorded activities (summary, detail, and splits/laps/best efforts/HR zones from the activity file). It does NOT include golf scorecards or shot data, Garmin's own training status/readiness score, training plans, race predictions, VO2 max history, Garmin's all-time personal records (best efforts within one activity ARE available via get_activity_analysis), courses, gear, badges, challenges, or social data. If the user asks about any of those, say the Garmin Personal API doesn't provide it, offer what the available tools can show instead, and do not call tools hoping to find it.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}
prompts
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
get_readinessA

Best first call for 'how recovered am I', 'should I train hard today', 'how did I sleep last night'. One compact object: that night's sleep (score, stages, HR, respiration), HRV vs baseline and status, resting HR, Body Battery, each compared with the user's previous 7 days; training load (last 7 days vs 28-day weekly average); and activities from the last 3 days. Sleep is filed under the date the user woke up, so use 'today' for last night.

summarize_wellnessA

Best tool for wellness trends over weeks or months ('has my sleep improved', 'resting HR trend this year', 'stress lately'). Returns per-period averages only: steps, resting HR, stress, Body Battery high/low, intensity minutes (totals), respiration, sleep hours/deep/REM/score, overnight HRV, with min-max ranges for key metrics and day counts where data is missing. group_by='weekday' answers 'which days do I sleep worst / most stressed'. Range up to 366 days; fetches and aggregates in the server.

get_daily_summariesA

One flat row per day: steps, distance, floors, calories, resting/min/max HR, intensity minutes, stress, Body Battery, respiration, SpO2, hydration. For trends over more than a few weeks use summarize_wellness instead.

get_profileA

User profile settings (units, measurement system, birth year, etc.) and heart-rate zones. Useful context before interpreting training data.

get_sleep_summariesA

Night-by-night sleep over a range, one compact row per night filed under the date the user woke up: start/end in local time; hours of sleep, deep, light, REM and awake (and naps); sleep score with its quality and factor ratings; average HR, stress and respiration (avg/low/high); SpO2 average/lowest; sleep need vs baseline in minutes with what drove it (training load, e.g. HIGH_ACWR_AND_CHRONIC, HRV, sleep history, naps) and next night's need; Garmin's insights. For last night alone use get_readiness or get_sleep; for trends over weeks or months use summarize_wellness. Up to 92 days per call: pass a period (e.g. last_7_days, last_30_days, this_month) or start_date/end_date. detail='full' returns Garmin's raw records.

get_sleepA

One night's sleep, same compact shape as get_sleep_summaries. Use detail='full' for Garmin's complete record.

get_hrv_summariesA

Daily heart rate variability over a range: overnight average, 5-minute high, 7-day average, baseline band, status.

get_hrvA

HRV summary plus individual readings for one night. Use get_hrv_summaries unless the readings themselves matter.

get_body_batteryA

Daily Body Battery (Garmin's 0-100 energy estimate) over a range, one compact row per day: charged, drained, highest and lowest; the key readings the Personal API provides, in local time (about 6 a day: midnight, overnight peak, morning, afternoon, last); the events that moved it (sleep, activities, stress); and Garmin's end-of-day feedback. For today's state use get_readiness; for trends over weeks or months use summarize_wellness (Body Battery high/low per period). Up to 92 days per call: pass a period (e.g. last_7_days, last_30_days, this_month) or start_date/end_date. detail='full' returns Garmin's raw report.

get_stressA

Day-by-day all-day stress over a range, one row per day as Garmin returns it: calendarDate, then values with overallStressLevel (Garmin's 0-100 score) and highStressDuration, mediumStressDuration, lowStressDuration and restStressDuration in seconds. For trends over weeks or months, or 'which weekday am I most stressed', use summarize_wellness (stress per period, group_by='weekday'); stress during sleep is avg_stress in get_sleep_summaries. Up to 92 days per call: pass a period (e.g. last_7_days, last_30_days, this_month) or start_date/end_date.

get_heart_rateA

Heart rate for one day: resting, min, max, 7-day resting average, and hourly min/avg/max in local time. Give from/to (local HH:MM) to also get every ~2-minute reading in that window, e.g. overnight or around a workout. detail='full' returns Garmin's raw payload (every reading, large).

get_stepsA

Day-by-day steps over a range, one row per day as Garmin returns it: calendarDate, totalSteps, totalDistance (metres) and stepGoal. get_daily_summaries has the same steps alongside floors, calories, HR and stress; for weekly or monthly averages over longer spans use summarize_wellness. Up to 92 days per call: pass a period (e.g. last_7_days, last_30_days, this_month) or start_date/end_date.

get_wellness_activity_summariesA

Garmin's wellness activity summaries over a range: all-day movement records kept apart from recorded workouts, returned as Garmin sends them. Often empty; for daily movement use get_daily_summaries or get_steps, and for workouts search_activities or summarize_activities. Up to 92 days per call: pass a period (e.g. last_7_days, last_30_days, this_month) or start_date/end_date.

get_spo2A

SpO2 for one day: average, lowest, sleep average, 7-day average and hourly averages. detail='full' adds every reading and altitude data.

get_fitness_ageA

Garmin's fitness age as of a date: chronologicalAge, fitnessAge (a decimal; round it) and previousFitnessAge, plus the components behind it, each with a value and a stale flag: rhr (resting HR), vigorousDaysAvg and vigorousMinutesAvg (weekly averages over numOfWeeksForIm recent weeks), and bmi with its lastMeasurementDate. BMI comes from the last weight entry, so it is often old. It changes slowly, so date='today' is usually all you need. This is not VO2 max, which the Personal API doesn't provide.

get_weightA

Weight and body composition measurements over a range, from a Garmin smart scale or entered manually in Garmin Connect, returned as Garmin sends them: weights are in grams (74000 = 74 kg). Often empty, since it needs a smart scale or manual entries. When nothing was recorded in the range, the result holds only previousDateWeight, the last measurement before it: check its calendarDate before treating it as current. Up to 92 days per call: pass a period (e.g. last_7_days, last_30_days, this_month) or start_date/end_date. For longer histories, make several calls.

get_hydrationA

Water intake the user logged in Garmin Connect, day by day over a range, as Garmin returns it. Usually empty: Garmin only records hydration that is logged, so an empty result means nothing was logged, not that the user drank nothing. get_daily_summaries also carries hydration_ml per day. Up to 92 days per call: pass a period (e.g. last_7_days, last_30_days, this_month) or start_date/end_date.

search_activitiesA

List individual recorded activities (runs, rides, swims, strength, etc.) with the activity_id needed for get_activity and get_activity_analysis. Filter by date, type, race, distance, duration, elevation gain, name text or a lat/long box. For totals, averages or trends over weeks/months, use summarize_activities instead: it is far smaller. Default detail='compact' returns key stats only (distance m, duration/movingDuration s, averageSpeed/maxSpeed m/s, HR, elevation, calories, cadence, power, training effect). Use detail='full' only when a field you need is missing, and with a small limit. Sport-specific extras such as golf scorecards, shot data or dive logs are NOT available.

summarize_activitiesA

Best tool for activity totals and trends (e.g. 'how far did I run each month', 'has my pace improved'). Fetches every matching activity in the range and returns only aggregates per period and type: count, distance (km and mi), moving time, elevation, longest, average speed and pace (distance-weighted), fastest average pace, average HR, training load, and time in HR zones 1-5 (minutes and %, for zone 2 / 80-20 questions). Range up to 366 days.

get_activityA

One activity in detail: distance, times, pace (per km and mile), speed, HR, cadence, running dynamics, power, training effect and load, temperature, RPE/feel, and split summaries (warm-up/active/cool-down totals, not per-km; use get_activity_analysis for km/mile splits and laps). detail='full' returns Garmin's raw record (200+ fields).

compare_activitiesA

Side-by-side compact detail for 2-5 activities (same fields as get_activity), fetched in parallel. Use for 'compare my last two long runs' or 'how did this race compare with last year's'; get the IDs from search_activities.

get_activity_workoutsA

The planned workout linked to one recorded activity, if any: workoutName, sport and steps, each with intensity, durationType/durationValue (metres for DISTANCE) and a target (e.g. targetType SPEED with targetValueLow/High in m/s). An activity started from one of Garmin's daily suggested workouts may carry only a workoutPhrase (e.g. EASY_WEEK_LOAD_BASE); an empty result means no workout was linked. This is the plan; for how each rep actually went use get_activity_analysis (laps). Get the ID from search_activities.

get_activity_analysisA

Per-km or per-mile splits, the watch's laps / workout reps, best efforts, time in HR zones and first-vs-second-half drift for ONE recorded activity, computed from Garmin's original FIT file. Use for 'my km splits', 'did I negative split', 'fastest 5 km in this run', 'how long in zone 2', 'did my HR drift'. splits: one row per km/mile (time, pace, cumulative time, avg/max HR, cadence, power, elevation gain/loss), timer time so pauses don't count, final partial split labelled with its distance. laps: the watch's own laps with intensity (warmup/active/cooldown/rest) and trigger (manual, distance, ...). best_efforts: fastest continuous 1 km, 1 mile, 5 km, 10 km, half and marathon the activity is long enough for, with where each started. hr_zones: time in each of the user's HR zones. drift: first vs second half pace, HR and aerobic decoupling. Get the ID from search_activities. Manual entries and GPX/TCX imports return a short 'unavailable' note.

get_nutritionA

Food log for one day: nutrition goals, calories and nutrients consumed, and per-meal breakdown.

get_weight_goalsA

The weight goal the user set in Garmin Connect that was in effect over a range, with its goal range, returned as Garmin sends it. Empty ({}) when no weight goal is set, which is common. Pair with get_weight to track progress. Up to 92 days per call: pass a period (e.g. last_7_days, last_30_days, this_month) or start_date/end_date.

get_menstrual_cycleA

Menstrual cycle tracking as of one date, in two parts returned as Garmin sends them: summary (Garmin's cycle summary for that date) and dayView (Garmin's day view for that date, with anything logged). Empty unless the user tracks their cycle in Garmin Connect. date accepts YYYY-MM-DD, 'today' or 'yesterday'; call once per date.

Prompts

Interactive templates invoked by user choice

NameDescription
readiness_checkRecovery check from last night's sleep, HRV, resting HR, Body Battery and recent training load.
sleep_reportSleep duration, stages, score and consistency over a period, with weekday patterns.
training_reviewVolume, pace, intensity distribution and load trend for a sport over a period.
weekly_checkinThis week vs last week: training, sleep, stress and recovery.
compare_recentSide-by-side comparison of my most recent sessions of one type.

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A3.9/5.0

Scored across 26 tools

Disambiguation4/5

There is real overlap between get_sleep/get_sleep_summaries, get_hrv/get_hrv_summaries, and get_steps/get_daily_summaries/summarize_wellness, but the descriptions consistently cross-reference each other ('for last night use X, for trends use Y'), which resolves nearly all ambiguity. get_wellness_activity_summaries is the fuzziest tool, but its description steers users elsewhere.

Naming Consistency5/5

Almost all tools follow a clear verb_noun pattern: get_*, summarize_*, search_activities, compare_activities, get_activity_analysis. Suffixes like _summaries are used consistently to denote range-based variants, making the naming highly predictable.

Tool Count3/5

At 26 tools the surface is heavy, sitting just above the 25-tool threshold, but the domain genuinely spans many distinct Garmin data types (sleep, HRV, stress, Body Battery, weight, hydration, nutrition, menstrual cycle, activities). Each tool maps to a distinct endpoint, so the count is defensible though it could be consolidated (e.g. single-day vs summary variants).

Completeness4/5

Coverage is broad for a read-only Garmin wellness/activity server: activities with search/summarize/detail/compare/analysis, sleep, HRV, stress, Body Battery, steps, weight, hydration, nutrition, readiness, profile, and more. Minor gaps exist (e.g. no personal records/badges, no dedicated training-status trend tool, and VO2 max is explicitly unavailable), but these are edge cases rather than blockers.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues