MCP tools & capabilities
On this page
garmlink exposes your synced Garmin data to Claude and ChatGPT as 39 Model Context Protocol tools — 38 read-only, 1 write (a rate-limited sync refresh) — plus 4 coach prompts and 4 resources.
https://api.garmlink.ai/mcpv0.1.0Get started: connect from Claude · connect from ChatGPT
Activities · 4 tools
List the user's Garmin activities, most recent first. Optionally filter by activity type and date range. Returns compact rows (id, type, name, start_time, duration_s, distance_m, calories, avg_hr) plus the total count for pagination.
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| type | string | — | — | Activity type key, e.g. running, cycling, swimming, hiking, strength. |
| from | string | — | — | ISO date/datetime lower bound on start_time (inclusive). |
| to | string | — | — | ISO date/datetime upper bound on start_time (inclusive). |
| limit | integer | 50 | 1–200 | Max rows to return (<=200). |
| offset | integer | 0 | ≥ 0 | Pagination offset. |
Full detail for a single activity by its garmin_activity_id: the complete summary plus splits, typed splits, HR zones and weather. 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. |
Downsampled sample-by-sample series for an activity (heart_rate, pace/speed, altitude, power, cadence, temperature, GPS…). 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). |
| group_by | string | "sport" | sport · month · week | Bucketing dimension. |
Daily health · 14 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, 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 and HRV status (BALANCED/UNBALANCED/LOW/…). 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 time-in-zone (rest/low/medium/high) durations or 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. For the day's high/low Body Battery levels or the intraday series use garmlink_daily_metric_get(family:'body_battery', 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 step totals, newest first: total steps walked that day. Use to track daily movement. Distance and floors for the day are on garmlink_daily_summary_get; for the step goal or intraday 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 and max HR (bpm) for the day. 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) plus min and max breaths per minute. 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 and low blood-oxygen saturation (%). 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 plus the running weekly_total against the week_goal. 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 — one compact object per day combining steps, calories, distance_m, active_min and floors. 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 families without a dedicated tool such as training_readiness, all_day_events, nutrition or menstrual. 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). |
Training & physiology · 10 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 — one compact object per day: score (0–100), level (LOW/MODERATE/HIGH/…), the underlying sleep_score and recovery_min (recovery time). Use to advise whether today is a good day for a hard session or for recovery.
| 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). |
Profile & devices · 3 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.
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', sync_run_id} on success. 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 · 4
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 run: pull its splits and timeseries (HR, speed, power, altitude) to analyse pacing, heart-rate drift and split-by-split execution.
Show workflow
Perform a detailed analysis of one specific run. Call the tools in this order: 1. garmlink_activities_list filtered to running to find the run in question, then confirm its id (ask the user which run if it is ambiguous). 2. garmlink_activity_get with that activity id to pull the summary metrics: distance, duration, average/max HR, average pace, elevation gain, and lap/split breakdown. 3. garmlink_activity_timeseries with that id and metrics=["heart_rate","speed","power","altitude"] to retrieve the second-by-second stream for the run. 4. garmlink_stats_summary to place this run in context against the athlete's recent running averages. Then synthesize: analyse pacing consistency (did the athlete go out too fast, negative-split, or fade), quantify cardiac/HR drift (rising HR at steady pace = fatigue or heat), correlate speed and power against the altitude profile (climbs vs descents), and review the split-by-split execution. Close with 2-3 actionable takeaways to improve the next run of this type.
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.