MCP tools & capabilities
On this page
garmlink exposes your synced Garmin data to Claude and ChatGPT as 48 Model Context Protocol tools — 47 read-only, 1 write (a rate-limited sync refresh) — plus 6 coach prompts and 4 resources.
https://api.garmlink.ai/mcpv0.1.0Get started: connect from Claude · connect from ChatGPT
Activities · 8 tools
List the user's Garmin activities, most recent first, with optional type/date filters. Each row carries the compact basics (id, type, name, start_time, duration_s, distance_m, calories, avg_hr) PLUS a `brief` of sport metrics (avg speed, max HR, elevation gain, SWOLF/strokes for swims, cadence for runs, power for rides) — usually ENOUGH TO COMPARE sessions without fetching details. The response's `synced_at` says how fresh the data is; no separate sync-status call needed. Need splits or HR zones? garmlink_activities_get with all the ids in one call.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| type | string | — | — | Activity type key, e.g. running, cycling, swimming, hiking, strength. Matches loosely, so "running" also returns trail and treadmill runs — and a walk named "Running errands". Use exact_type when you are building a baseline to compare against. |
| exact_type | string | — | — | Exact activity type, matched strictly. THE one to use for a comparison baseline: "running" here excludes trail_running and treadmill_running, which have different paces and would make every delta you compute meaningless. |
| from | string | — | — | ISO date/datetime lower bound on start_time (inclusive). |
| to | string | — | — | ISO date/datetime upper bound on start_time (inclusive). A date-only bound covers the WHOLE day. |
| limit | integer | 50 | 1–200 | Max rows to return (<=200). |
| offset | integer | 0 | ≥ 0 | Pagination offset. |
Full detail for a SINGLE activity: the summary (nulls stripped) plus splits, typed splits and HR zones (weather on request via `include`). For SEVERAL activities — any comparison, any trend — call garmlink_activities_get ONCE with all the ids instead of looping this tool. Use garmlink_activity_timeseries for the sample-by-sample data.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| activity_id* | integer | — | — | The garmin_activity_id from garmlink_activities_list. |
| include | array | — | — | Detail sections to return — the array you pass REPLACES the default ["splits","typed_splits","hr_zones"], so list everything you want. Weather is served only when asked for (e.g. ["splits","typed_splits","hr_zones","weather"], or ["weather"] alone for a conditions-only question). |
Full detail for UP TO 20 activities in ONE call — summaries (nulls stripped) plus splits, typed splits and HR zones per activity (weather via `include`). ALWAYS prefer this over looping garmlink_activity_get when comparing or analysing several sessions: one round trip instead of N. Ids you don't own come back in `not_found`.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| activity_ids* | array | — | — | garmin_activity_ids from garmlink_activities_list, in the order you want them back. |
| include | array | — | — | Detail sections to return — the array you pass REPLACES the default ["splits","typed_splits","hr_zones"], so list everything you want. Weather is served only when asked for (e.g. ["splits","typed_splits","hr_zones","weather"], or ["weather"] alone for a conditions-only question). |
Downsampled sample-by-sample series for an activity. The field names are the FIT ones, and `pace` is not among them — ask for what exists: heart_rate (bpm), enhanced_speed/speed (m/s — derive pace from it), enhanced_altitude/altitude (m), power (W), cadence (rpm, or steps per minute per leg when running), temperature (°C), distance (m, cumulative), position_lat/position_long (DEGREES — the worker converts Garmin's semicircles before storing), plus running dynamics (vertical_oscillation, vertical_ratio, stance_time, stance_time_percent, step_length) and respiration_rate. Buckets to <= `points` samples with per-bucket averages, and always reports the true global min/max/avg per field. Full 1 Hz data lives in the raw FIT; this is LLM-sized.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| activity_id* | integer | — | — | The garmin_activity_id. |
| metrics | array | — | — | Restrict to these fields, e.g. ['heart_rate','power']. Omit for all. |
| points | integer | 200 | 10–1000 | Target number of downsampled points (<=1000). |
Aggregated training volume over a date range, grouped by sport, month or ISO week: activity count, total distance (km), duration (h), calories and average HR per bucket.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| from | string | — | — | ISO date lower bound (inclusive). |
| to | string | — | — | ISO date upper bound (inclusive). A date-only bound covers the WHOLE day. |
| group_by | string | "sport" | sport · month · week | Bucketing dimension. |
The SETS of a strength session: for each one, the movement performed, the repetitions, the load, the duration and which side — the part of a weights session that makes it a training session at all. Without it a squat workout and a walk of the same length are the same three numbers (duration, heart rate, calories), which is why 'am I progressing on squats' could not be answered before. Returns null for an activity that is not set-based, which is most of them — that null means 'not a strength session', never 'the session was empty'. Find the activity id with garmlink_activities_list.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| activity_id* | integer | — | — | Garmin activity id, from garmlink_activities_list. |
The DERIVED facts for one activity, computed server-side: pace in the sport's own unit (per km, per 100 m, per 500 m, km/h), the session's detected structure (continuous vs an interval set, from the watch's own typed splits when it recorded them), rest time hiding between elapsed and moving duration, first-half vs second-half pace and heart-rate drift, time-in-zone shares, running mechanics (cadence, ground contact, stride, vertical ratio) start-to-finish, swim length statistics with misdetected lengths flagged, and a comparison against the athlete's most recent comparable session of the SAME sport at a similar distance. Call this FIRST when asked to analyse a session — it answers in one round what garmlink_activity_get plus your own arithmetic answers in four, and the numbers are computed rather than estimated. Use garmlink_activity_get afterwards only if you need something it did not derive.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| activity_id* | integer | — | — | The Garmin activity id to analyse. |
A downloadable GPX 1.1 track for ONE activity — the file Strava, Komoot, RideWithGPS and every mapping tool import. Returns a signed download link valid one hour (NOT the file itself: a long ride is megabytes of XML), plus the track's point count, distance and bounding box. Give the user the `download_url` as a clickable link. Indoor sessions have no GPS and come back as `no_track` — that is an answer, not a failure.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| activity_id* | integer | — | — | The garmin_activity_id from garmlink_activities_list. |
Daily health · 15 tools
Daily sleep summaries, newest first — one compact object per night: total_min and per-stage minutes (deep_min/light_min/rem_min/awake_min), sleep score, skin_temp_deviation_c (deviation from the wearer's OWN calibrated baseline — the earliest illness/overreaching signal here), restless_moments, body_battery_change (what the night gave back), breathing_disruptions per hour, hrv_status, lowest_spo2/avg_sleep_spo2, plus overnight avg_spo2, avg_respiration, resting_hr and overnight_hrv when measured. THE tool for sleep quality, duration and recovery-trend questions. Hollow (unmeasured) nights are omitted.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| from | string | — | — | ISO date lower bound (YYYY-MM-DD), inclusive. Omit for the most recent days. |
| to | string | — | — | ISO date upper bound (YYYY-MM-DD), inclusive. |
| limit | integer | 60 | 1–400 | Max days returned, newest first (default 60). |
Daily heart-rate-variability summaries, newest first: last_night_avg (overnight rMSSD, ms), weekly_avg, last_night_5min_high, HRV status (BALANCED/UNBALANCED/LOW/…) AND the wearer's personal baseline band (baseline_low/baseline_high) — read the value against that band, never against a population average: 58 ms means nothing until you know this person's balanced range. THE tool for autonomic recovery / readiness trends. For the raw per-reading series use garmlink_daily_metric_get(family:'hrv', full:true).
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| from | string | — | — | ISO date lower bound (YYYY-MM-DD), inclusive. Omit for the most recent days. |
| to | string | — | — | ISO date upper bound (YYYY-MM-DD), inclusive. |
| limit | integer | 60 | 1–400 | Max days returned, newest first (default 60). |
Daily all-day stress summaries, newest first: avg and max stress level (0-100). Use to see how stress load evolves across days. For the time-in-zone breakdown (rest_min/low_stress_min/medium_stress_min/high_stress_min/activity_stress_min) call garmlink_daily_summary_get — those durations live on the day rollup, NOT on this family. For the per-minute series use garmlink_daily_metric_get(family:'stress', full:true).
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| from | string | — | — | ISO date lower bound (YYYY-MM-DD), inclusive. Omit for the most recent days. |
| to | string | — | — | ISO date upper bound (YYYY-MM-DD), inclusive. |
| limit | integer | 60 | 1–400 | Max days returned, newest first (default 60). |
Daily Body Battery summaries, newest first: charged and drained totals (energy points gained resting/sleeping vs spent) for the day. Use to relate energy reserves to sleep, stress and activity. This family is a list of EVENTS, so it carries neither the day's levels nor the curve. For the day's high, low, at-wake and during-sleep values call garmlink_daily_summary_get (bb_highest/bb_lowest/bb_at_wake/bb_during_sleep); for the intraday curve use garmlink_daily_metric_get(family:'stress', full:true) — Garmin ships bodyBatteryValuesArray inside the stress record, not this one.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| from | string | — | — | ISO date lower bound (YYYY-MM-DD), inclusive. Omit for the most recent days. |
| to | string | — | — | ISO date upper bound (YYYY-MM-DD), inclusive. |
| limit | integer | 60 | 1–400 | Max days returned, newest first (default 60). |
Daily step totals, newest first: total steps walked that day. Use to track daily movement. Distance, floors AND the step goal for the day are on garmlink_daily_summary_get (step_goal) — the raw steps payload is 15-minute buckets and carries no goal. For those buckets use garmlink_daily_metric_get(family:'steps', full:true).
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| from | string | — | — | ISO date lower bound (YYYY-MM-DD), inclusive. Omit for the most recent days. |
| to | string | — | — | ISO date upper bound (YYYY-MM-DD), inclusive. |
| limit | integer | 60 | 1–400 | Max days returned, newest first (default 60). |
Daily heart-rate summaries, newest first: resting, min, max HR (bpm) and resting_avg_7d — one night's resting HR is noise, the seven-day average is the trend to read it against. Use to track resting-HR trends and daily cardiac load. For the intraday HR series use garmlink_daily_metric_get(family:'heart_rate', full:true).
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| from | string | — | — | ISO date lower bound (YYYY-MM-DD), inclusive. Omit for the most recent days. |
| to | string | — | — | ISO date upper bound (YYYY-MM-DD), inclusive. |
| limit | integer | 60 | 1–400 | Max days returned, newest first (default 60). |
Daily respiration summaries, newest first: avg_waking and avg_sleep (they are different measurements — the sleeping rate is the recovery signal), plus min and max breaths per minute, and `avg` for continuity. Use to monitor breathing-rate trends and recovery.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| from | string | — | — | ISO date lower bound (YYYY-MM-DD), inclusive. Omit for the most recent days. |
| to | string | — | — | ISO date upper bound (YYYY-MM-DD), inclusive. |
| limit | integer | 60 | 1–400 | Max days returned, newest first (default 60). |
Daily pulse-ox (SpO2) summaries, newest first: avg_sleep (the clinically interesting one — the all-day average is diluted by waking readings), low, latest, avg_7d and avg. Use for altitude acclimation and overnight oxygen trends.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| from | string | — | — | ISO date lower bound (YYYY-MM-DD), inclusive. Omit for the most recent days. |
| to | string | — | — | ISO date upper bound (YYYY-MM-DD), inclusive. |
| limit | integer | 60 | 1–400 | Max days returned, newest first (default 60). |
Daily floors summaries, newest first: floors ascended and descended that day. Use to track vertical movement.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| from | string | — | — | ISO date lower bound (YYYY-MM-DD), inclusive. Omit for the most recent days. |
| to | string | — | — | ISO date upper bound (YYYY-MM-DD), inclusive. |
| limit | integer | 60 | 1–400 | Max days returned, newest first (default 60). |
Daily intensity-minutes summaries, newest first: the day's moderate_min and vigorous_min, the running weekly_total and weekly_moderate/weekly_vigorous against the week_goal, and week_goal_met_on — the day Garmin recorded the weekly target as reached, or absent if it was not. Use to check adherence to activity-intensity guidelines.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| from | string | — | — | ISO date lower bound (YYYY-MM-DD), inclusive. Omit for the most recent days. |
| to | string | — | — | ISO date upper bound (YYYY-MM-DD), inclusive. |
| limit | integer | 60 | 1–400 | Max days returned, newest first (default 60). |
Daily hydration records, newest first: fluid intake versus goal and sweat-loss estimates (ml). Use to track hydration habits.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| from | string | — | — | ISO date lower bound (YYYY-MM-DD), inclusive. Omit for the most recent days. |
| to | string | — | — | ISO date upper bound (YYYY-MM-DD), inclusive. |
| limit | integer | 60 | 1–400 | Max days returned, newest first (default 60). |
Daily blood-pressure records, newest first: systolic/diastolic readings and pulse from Garmin Index BPM or manual entries. Use to track blood-pressure trends.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| from | string | — | — | ISO date lower bound (YYYY-MM-DD), inclusive. Omit for the most recent days. |
| to | string | — | — | ISO date upper bound (YYYY-MM-DD), inclusive. |
| limit | integer | 60 | 1–400 | Max days returned, newest first (default 60). |
The single-glance all-day rollup, newest first — the RICHEST daily object garmlink serves. Steps, calories, distance_m, active_min, floors, PLUS the goals Garmin set for this wearer (step_goal/floors_goal/intensity_minutes_goal — the only way to answer whether a target was hit), where the day's stress went (rest_min/low_stress_min/medium_stress_min/high_stress_min/activity_stress_min, stress_avg/max/qualifier), the body battery as a day rather than a net (bb_charged/bb_drained/bb_highest/bb_lowest/bb_at_wake/bb_during_sleep), the calorie split (bmr_calories/active_calories/consumed_calories), the time budget (sleeping_min, sedentary_min, and highly_active_min which is a SUBSET of active_min, not a sibling of it), resting_hr with resting_hr_avg_7d, abnormal_hr_alerts (the watch flagged an abnormally high resting heart rate), avg_altitude_m, and measured_from/measured_to — the window the watch was actually worn, without which two days with identical averages are not comparable. Use this FIRST for a day-level overview or multi-metric daily trend, then drill into a specific family (garmlink_sleep_get, garmlink_stress_get, …) for its detail.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| from | string | — | — | ISO date lower bound (YYYY-MM-DD), inclusive. Omit for the most recent days. |
| to | string | — | — | ISO date upper bound (YYYY-MM-DD), inclusive. |
| limit | integer | 60 | 1–400 | Max days returned, newest first (default 60). |
Generic escape hatch: fetch any Garmin daily family by name over a date window, newest first. Returns the same COMPACT per-day summary as the dedicated getters by default; pass full:true to get the RAW record (all intraday arrays) — only for a single family over a NARROW window, as raw payloads are large. Prefer the specific getter (garmlink_sleep_get, garmlink_stress_get, …) when one exists; use this for all_day_events, the only family with no dedicated tool, and for the raw record of any family. Returns an error object listing valid families if the name is unknown.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| family* | string | — | — | A daily family, one of: sleep,hrv,stress,body_battery,steps,heart_rate,training_readiness,user_summary,respiration,spo2,floors,intensity_minutes,hydration,blood_pressure,all_day_events,nutrition,menstrual |
| from | string | — | — | ISO lower bound (YYYY-MM-DD), inclusive. |
| to | string | — | — | ISO upper bound (YYYY-MM-DD), inclusive. |
| limit | integer | 60 | 1–400 | Max days, newest first. |
| full | boolean | false | — | false (default) = compact per-day summary; true = raw Garmin record with all intraday arrays (large — use a narrow window). |
A year of WEEK-level totals in one payload — steps (total and daily average, distance, days the watch was worn), stress, and intensity minutes against the weekly goal. Garmin computes these week buckets itself, so they are the right thing to read for 'how has this year gone' or 'which week was my biggest': deriving them by summing daily rows both costs a long range and silently counts partially-worn days as low ones. For a single day or a short span, the daily tools (garmlink_steps_get, garmlink_stress_get, garmlink_intensity_minutes_get) remain the right ones. A series Garmin had nothing for is absent from the payload rather than present and empty.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| limit | integer | 4 | 1–60 | Max weekly-rollup snapshots, newest first (each carries a year of weeks). |
Training & physiology · 13 tools
Garmin Training Status snapshots over time (productive, maintaining, peaking, overreaching, detraining, recovery, unproductive…), with acute/chronic load balance and load focus. Use to judge whether the user is training productively or needs recovery.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| limit | integer | 30 | 1–200 | Max snapshots, newest first |
History of Garmin max-metrics snapshots — chiefly VO2max (running and cycling) and related fitness estimates. Use to track cardiovascular fitness trends over weeks and months.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| limit | integer | 30 | 1–200 | Max snapshots, newest first |
Garmin Fitness Age snapshots and the contributing factors Garmin exposes (VO2max, resting HR, activity intensity, body composition where available). Use to show how the user's estimated fitness age is trending.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| limit | integer | 30 | 1–200 | Max snapshots, newest first |
Garmin's predicted race finish times (5K, 10K, half-marathon, marathon) captured over time. Use to gauge current running performance potential and its trajectory.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| limit | integer | 30 | 1–200 | Max snapshots, newest first |
Garmin Endurance Score snapshots — the composite measure of the user's ability to sustain effort over long durations, with its level/category. Use to track endurance development over time.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| limit | integer | 30 | 1–200 | Max snapshots, newest first |
Garmin Hill Score snapshots — the measure of climbing strength and endurance on uphill efforts, with its category. Use to track how the user's hill/climbing ability is progressing.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| limit | integer | 30 | 1–200 | Max snapshots, newest first |
Garmin personal records snapshots (fastest 1K/5K/10K, longest run/ride, most ascent, best power, etc.). Use to report the user's all-time bests and when they were set.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| limit | integer | 30 | 1–200 | Max snapshots, newest first |
Garmin body-composition snapshots (weight, BMI, body fat %, muscle mass, bone mass, body water, etc.), typically from a connected smart scale. Use to track weight and composition trends over time.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| limit | integer | 30 | 1–200 | Max snapshots, newest first |
The user's currently configured training zones: heart-rate zones, power zones and cycling FTP (each the latest snapshot). Use to interpret zone-based effort in activities or to prescribe target zones.
No arguments.
Daily Garmin Training Readiness, newest first: score (0–100), level, Garmin's own feedback phrase — AND THE SIX FACTORS THAT PRODUCE THE SCORE, each with its percentage contribution and Garmin's plain-language verdict: sleep score, recovery time (plus recovery_trend), HRV, sleep history, stress history, and acute load / ACWR. A readiness of 12 is not actionable on its own; `recovery_pct: 5, acwr_pct: 20` says exactly what pulled it down. Also measured_at and valid_sleep (false = the score was computed without a usable night, which is why a reading can look wrong). Use to advise whether today is a good day for a hard session or for recovery, and to explain WHY.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| from | string | — | — | ISO lower bound (YYYY-MM-DD), inclusive. |
| to | string | — | — | ISO upper bound (YYYY-MM-DD), inclusive. |
| limit | integer | 14 | 1–90 | Max days, newest first (default 14). |
The runner's current lactate threshold: the heart rate and the pace at which lactate starts accumulating faster than the body clears it — i.e. the ceiling above which an effort stops being sustainable. It is the number tempo and threshold sessions are prescribed from, and the one that moves when a training block works. Garmin revises it after a hard effort rather than every day, so this is a standing estimate with its measurement date, not a daily series. Use when the user asks about threshold pace or heart rate, how to pace a tempo run, or whether their threshold has improved.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| limit | integer | 30 | 1–200 | Max snapshots, newest first |
Weekly running tolerance: the running load the body currently absorbs, against the load actually run, over the past year. It answers the question training status cannot — not 'how fit am I' but 'how much running can I add right now without breaking'. A week run far above tolerance is where injuries are booked. Use when the user asks about ramping up mileage, whether a jump in volume is safe, or why they feel beaten up.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| limit | integer | 30 | 1–200 | Max snapshots, newest first |
Individual weigh-ins over the stored window, each with its date, its source device and every metric the scale measured — weight, body fat, body water, muscle mass, bone mass, BMI. This is the reading-by-reading record; garmlink_body_composition_get carries Garmin's summary of the same window. Use when the user asks what they weighed on a given day, how weight has moved, or to distinguish one odd reading from a trend.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| limit | integer | 30 | 1–200 | Max snapshots, newest first |
Profile & devices · 4 tools
List the user's Garmin gear snapshots (shoes, bikes and other tracked equipment) with accumulated mileage/usage. Most recent snapshot first. Use to answer questions about how far a pair of shoes or a bike has been ridden/run, or when gear was retired.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| limit | integer | 5 | 1–50 | Max snapshots |
List the user's registered Garmin devices (e.g. Fenix 8, HRM straps, bike computers) as captured snapshots, most recent first. Use to know which watch/sensors are paired, firmware/model details, and which device recorded the data.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| limit | integer | 5 | 1–50 | Max snapshots |
The user's latest Garmin profile snapshot: display name, personal details, physiological settings and preferences. Returns the single most recent snapshot.
No arguments.
Solar charging for the watches that have a panel: the daily solar input over the stored window, keyed by device and carrying each watch's display name — a household with two Garmins would otherwise read as one. Absent entirely for a watch without a panel, which is not an error but the answer. Use when the user asks about solar charging, battery autonomy, or how much sun a trip actually gave them.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| limit | integer | 4 | 1–60 | Max solar snapshots, newest first (each carries several weeks of days). |
Sync · 2 tools
Garmin connection state plus last successful sync time and the most recent sync runs (status, scope, timing, counts). Call this FIRST whenever data seems missing, empty or stale — it tells you whether the account is connected, when it last synced, and whether a sync is currently running or recently failed.
No arguments.
Triggers an on-demand Garmin sync to pull the freshest watch data. Rate-limited to at most once per 15 minutes; if a sync ran recently it returns status:rate_limited with retry_after_s. Non-destructive — it only fetches and appends new data, never deletes anything. Returns {status:'started'} on success, plus whatever the worker echoed back — sync_run_id is present only when the worker supplies it, so poll garmlink_sync_status rather than depending on that id. Requires a connected account; returns {error:'not_connected'} otherwise.
No arguments.
Peripheral data · 6 tools
List the user's stored golf-round summaries (scores, handicap, course stats), most recent first. Use when the user asks about their golf performance or rounds played.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| limit | integer | 30 | 1–60 | Max entries |
List the Garmin badges the user has earned (challenges, milestones, streaks), most recent first. Use when the user asks about achievements, badges or Garmin challenges.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| limit | integer | 30 | 1–60 | Max entries |
List the user's Garmin goals (step targets, distance/activity goals and their progress), most recent first. Use when the user asks about the goals they set or how close they are to hitting them.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| limit | integer | 30 | 1–60 | Max entries |
Daily nutrition logs (calories in, macros, water/food entries) per day, newest first, optionally bounded by a date range. Use when the user asks about their food intake, calories consumed or macros over time.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| from | string | — | — | ISO lower bound |
| to | string | — | — | ISO upper bound |
| limit | integer | 60 | 1–400 | Max days |
Daily menstrual-cycle tracking (cycle phase, day, logged symptoms) per day, newest first, optionally bounded by a date range. Use when the user asks about their cycle tracking.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| from | string | — | — | ISO lower bound |
| to | string | — | — | ISO upper bound |
| limit | integer | 60 | 1–400 | Max days |
Fetch ANY stored snapshot by its kind so every synced snapshot type is reachable, even those without a dedicated tool. Returns the most recent snapshots for that kind first. Use this as the catch-all when a more specific tool doesn't exist.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| kind* | string | — | — | A snapshot kind, e.g. training_status, max_metrics, race_predictions, gear, devices, badges, goals, golf_summary, endurance_score, hill_score, personal_records, body_composition, hr_zones, power_zones, cycling_ftp, fitness_age, profile |
| limit | integer | 10 | 1–200 | Max snapshots |
Prompts · 6
Ready-made coach workflows — each names the exact tool sequence the AI runs.
Summarize the last 7 days of training: total load per sport, standout sessions, and how sleep, HRV and training status say the body is coping.
Show workflow
Produce a coach-style review of the athlete's last training week. Call the tools in this order and reason over the combined results: 1. garmlink_stats_summary with group_by="sport" over the last 7 days (from = 7 days ago, to = today) to get per-sport volume, distance, duration and load. 2. garmlink_activities_list for the same 7-day window to enumerate every session (type, date, distance, duration, average HR). 3. garmlink_sleep_get for the last 7 days to gauge nightly sleep duration and quality. 4. garmlink_hrv_get for the last 7 days to read the overnight HRV trend (rising, stable, or suppressed). 5. garmlink_training_status_get to capture the current training status, acute load and load balance. Then synthesize: total training load and how it splits across sports, the 1-2 standout/hardest sessions of the week, and whether recovery signals (sleep + HRV + training status) suggest the athlete absorbed the load or is dipping into fatigue. End with one concrete recommendation for the coming days.
Assess how ready the athlete is for a target race by combining race-time predictions, training readiness, training status, VO2max trajectory and recent HRV.
Show workflow
Evaluate the athlete's readiness for an upcoming target race. Ask the user for the race distance/date if it is not already known, then call the tools in this order: 1. garmlink_race_predictions_get to retrieve Garmin's predicted finish times (5K, 10K, half, marathon) and compare them against the athlete's target. 2. garmlink_readiness_get to read today's training readiness score and its contributing factors (sleep, recovery time, HRV status, acute load). 3. garmlink_training_status_get to confirm the athlete is productive/peaking rather than overreaching or detraining. 4. garmlink_vo2max_history to check whether VO2max is trending up, flat or down over recent weeks. 5. garmlink_hrv_get for the last 1-2 weeks to confirm autonomic recovery is stable heading into the race. Then synthesize a readiness verdict versus the target race: is the current fitness (VO2max + predictions) enough to hit the goal, and is the athlete recovered enough (readiness + status + HRV) to express it. Flag any red flags (falling VO2max, suppressed HRV, unproductive status) and give a taper/pacing recommendation.
Build a two-week recovery report from sleep, HRV, Body Battery and stress data to reveal whether the athlete is trending toward recovery or accumulating fatigue.
Show workflow
Produce a recovery report covering the last 2 weeks. Call the tools in this order over a 14-day window (from = 14 days ago, to = today): 1. garmlink_sleep_get to gather nightly sleep duration, sleep stages (deep/light/REM) and sleep scores. 2. garmlink_hrv_get to read the overnight HRV trend and whether it sits inside the athlete's balanced range. 3. garmlink_body_battery_get to track daily Body Battery drain and overnight recharge. 4. garmlink_stress_get to see average and peak daytime stress levels. Then synthesize the recovery trend: are sleep, HRV, Body Battery recharge and stress moving in a healthy direction or degrading? Call out the best and worst nights, any multi-day patterns (e.g. poor sleep + low HRV + high stress clustering), and give concrete recovery guidance (sleep hygiene, load reduction, active recovery) for the week ahead.
Deep-dive a single session of any sport: pull its splits and timeseries (HR, speed, power, altitude) to analyse pacing, cardiac drift and split-by-split execution.
Show workflow
Perform a detailed analysis of one specific session — run, ride, swim, row or anything else the athlete recorded. Call the tools in this order: 1. garmlink_session_analysis with the activity id. It returns the DERIVED facts in one round: pace in the sport's own unit, the detected structure (continuous or a set, from the watch's own typed splits when it recorded them), the rest hiding between elapsed and moving time, half-to-half pace and heart-rate drift, time in zone, running mechanics start-to-finish, swim lengths with misdetections flagged, and the athlete's most recent comparable session of the same sport. Trust its arithmetic over your own — it is computed, not estimated. 1b. If you were not given an id, garmlink_activities_list filtered to the sport to find the session first (ask the user which one if it is ambiguous). 2. garmlink_activity_get with that activity id ONLY when you need something the derived facts did not carry — a lap-by-lap table to print, the weather, a field specific to the sport. Whatever you print, read the sport's OWN units: pace per km for running, time per 100 m for swimming, km/h and power for cycling, time per 500 m for rowing. 3. garmlink_activity_timeseries with that id and the metrics the sport records — heart_rate and altitude for everyone, speed for anything that moves over ground, power for cycling, cadence where it exists. 4. garmlink_zones_get to read the athlete's heart-rate zones, so time-in-zone is judged against THEIR thresholds rather than a textbook's. 5. garmlink_stats_summary to place this session against the athlete's recent averages for the same sport. Then synthesize: pacing consistency (went out too fast, negative-split, or faded), cardiac drift (rising HR at steady output = fatigue or heat), output against the altitude profile (climbs vs descents), the split-by-split execution, and where the effort actually sat in the zones. Close with 2-3 actionable takeaways for the next session of this type.
A month of the everyday health signals — resting heart rate, HRV, SpO2, respiration, stress and steps — read together for the drifts no single day shows.
Show workflow
Read the athlete's everyday health signals over the last 30 days (from = 30 days ago, to = today) and report what is DRIFTING, which no single day can show. Call: 1. garmlink_heart_rate_get for the resting heart-rate series — the single most telling everyday marker. 2. garmlink_hrv_get for overnight HRV and its balanced range. 3. garmlink_spo2_get and garmlink_respiration_get for overnight oxygen saturation and breathing rate. 4. garmlink_stress_get for daytime stress, and garmlink_steps_get with garmlink_daily_summary_get for everyday movement. Then synthesize the DIRECTION of each signal over the month, not its average: what is rising, falling or steady, and which ones moved together (a resting HR climbing while HRV falls is one story, not two). Name the days that stand out and say plainly which are explained by training and which are not. Two rules you must not break. Report gaps as gaps: days with no reading mean the watch was not worn, never that the value was zero, and a trend drawn over a fortnight with five missing nights deserves to be called shaky. And stay descriptive — you are reading consumer wearable data, so describe what changed and suggest what to watch or discuss with a clinician; never diagnose, and never interpret a signal as evidence of a condition.
The long view: VO2max trajectory, race predictions, fitness age, endurance and hill scores and personal records, read over months rather than weeks.
Show workflow
Answer the only question that matters over months: is this athlete getting fitter? Call: 1. garmlink_vo2max_history for the VO2max trajectory — the backbone of the answer. 2. garmlink_race_predictions_get to see whether predicted finish times are improving alongside it. 3. garmlink_fitness_age_get, garmlink_endurance_score_get and garmlink_hill_score_get for Garmin's own composite verdicts. 4. garmlink_personal_records_get for what the athlete has actually achieved, not only what a model predicts. 5. garmlink_stats_summary over the same span to relate any change to the training volume that produced it. Then synthesize a verdict with a TIMESCALE attached: improving, plateaued or declining, over what period, and by how much. Tie it to the volume: a flat VO2max on rising volume says something different from a flat one on falling volume. Say when a change is too small to mean anything — these scores move by a point on noise — and finish with the one lever most likely to move the needle next.
Resources · 4
garmlink://profileThe user's Garmin profile settings snapshot.garmlink://gearThe user's gear (shoes/bikes) with mileage.garmlink://connection-statusGarmin connection + sync status.garmlink://skillCopy-pasteable usage skill for AI assistants: which tool for what, rate limits, interpretation guidance. Read this once per session for best results.