Daash
This server lets you read Garmin Connect training and health data, and create/manage structured workouts and training plans that sync to your watch.
Read activities, activity details, splits, pace, HR zones, power, swimming metrics, routes, weather, shoes and historical comparisons.
Read daily health: steps, calories, heart rate, Body Battery, stress, sleep stages, HRV, SpO2 and breathing rate.
Check readiness, fitness markers, race predictions, lactate threshold, FTP, personal records, fitness trends and recovery trends.
Create, update, schedule, unschedule and delete structured running/cycling/swimming/walking/hiking workouts.
Create strength workouts and search Garmin’s exercise catalogue.
Build and manage multi-session training plans, track plan progress and remove future plan sessions.
View shoe mileage and update recorded activity names, notes, shoes or activity type.
Check Garmin connection and login status.
Provides tools for reading Garmin Connect data (activities, splits, heart-rate zones, daily health metrics, sleep) and for creating and scheduling structured workouts so they sync to a Garmin watch.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Daashwhat should I run on Thursday based on my last three runs?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
garmin-mcp
Ask Claude about your Garmin data, then have it write the session onto your watch.
An MCP server for your own Garmin Connect account. It reads your runs, splits, heart-rate zones and daily health metrics — and, unlike the read-only Garmin integrations out there, it can build a structured workout and schedule it, so the answer to "what should I run on Thursday?" ends up on your wrist instead of in a chat log.
Run it yourself and it is a local subprocess on your machine: no hosting, no server holding your credentials, no network exposure. That is the rest of this README, and it takes a Mac and a Terminal window.
Or don't run anything. Daash's hosted Garmin MCP server is the same tools behind OAuth 2.1 — paste one address into Claude or ChatGPT, sign in to Garmin once, and it works on your phone as well as your laptop with nothing installed. The trade is that a server holds your Garmin session, encrypted; the privacy policy sets out exactly what is kept and what is not.
You: My last three runs are all at the same effort. Give me something harder
for Thursday, based on what my recent paces actually support.
Claude: [reads your activities and splits, then proposes]
Thursday Threshold (running, about 52m 55s)
warmup: 15m
5 x
interval: 1.00 km @ 4:00/km-4:10/km
recovery: 1m 30s
cooldown: 10m
Create this and put it on Thursday?Install
macOS 10.15 (Catalina) or newer, with Claude Desktop already installed:
curl -fsSL https://raw.githubusercontent.com/Bartolome69/garmin-mcp/main/scripts/bootstrap.sh | bashThat fetches the code to ~/garmin-mcp, installs a modern Python via
uv, signs you in to Garmin, and registers the
server with Claude Desktop. It's the only command most people need. Read it
first if you'd rather —
scripts/bootstrap.sh is short.
Then quit Claude Desktop completely (⌘Q) and reopen it.
git clone https://github.com/Bartolome69/garmin-mcp.git
cd garmin-mcp
./scripts/setup.sh # venv + dependencies
./scripts/login.sh # sign in to Garmin once, caches the sessionThen register it with your MCP client. For Claude Desktop on macOS,
./scripts/install-claude-desktop.sh does it (with the app quit). For anything
else, copy .mcp.json.example, fill in the absolute paths, and point your client
at python -m garmin_mcp over stdio.
Related MCP server: garmin-mcp
Tools
Tool | What it returns |
| Runs, rides and workouts: distance, duration, pace per km and mile, average and max HR, HR zones, cadence, training effect, plus running dynamics and power when the watch records them |
| One activity in detail: per-split distance, pace, HR, cadence, running dynamics and power, full heart-rate time-in-zone, and what the recording says inside each lap: HR drift from first third to last at the paces run, plus per-km splits when the watch did not lap by kilometre |
| Today's recovery picture in one call: Garmin's readiness score and its factors, training status, acute against chronic load, four-week load focus, overnight HRV against baseline, body battery, stress, resting HR and sleep |
| Fitness markers: VO2 max, predicted race times from 5k to marathon, lactate threshold pace and HR, endurance score, hill score and running tolerance, each classified where Garmin classifies them |
| Steps, distance, calories, resting/min/max HR, body battery, stress, intensity minutes |
| Sleep stages with durations and percentages, sleep score, overnight HRV, resting HR |
| Structured workouts saved in the account |
| Builds a structured workout and adds it to Garmin Connect |
| Changes a workout in place. Same id, so dates it is scheduled on stay scheduled and the watch gets the new version at the next sync |
| Puts a workout on a date, which is what syncs it to the watch |
| Takes a workout off a day. Reversible — the workout itself is kept |
| Deletes a workout. The first call only reads its name back; removing it needs a second call quoting that name |
| Builds and schedules a whole training block in one call. Every session is validated first, so a mistake fails the call without leaving half a plan behind. Each workout is named with a short plan code, "Threshold 5x1k · HM", which is how the plan is found again; nothing about it is stored outside Garmin |
| The plan week by week, each session done, done on another day, missed, today or ahead, with completion so far, the next session, and what slipped in the last week. In Claude, ChatGPT and VS Code it also opens as an interactive plan view in the chat |
| Takes the rest of a plan off the calendar and out of the library. Past sessions stay. The first call only reports what would go |
| Draws the plan as an image for the conversation: each day's sessions beside what was planned |
| Which planned sessions actually got done, week by week. Counts a session if it happened within a day either side of its scheduled day |
| VO2 max and personal records — 5k, 10k, half, marathon and the rest |
| Whether the server is signed in, which account (masked), and the state of the token cache |
Dates accept YYYY-MM-DD, today, yesterday, tomorrow, or a signed offset
like -7 or +3.
Writing workouts
create_workout takes an ordered list of steps. Each has a type (warmup,
interval, recovery, rest, cooldown or repeat), exactly one of
duration_seconds or distance_meters, and an optional target — either pace
(minutes per km, as "4:05" or a range ["4:00","4:10"]) or hr ([150, 165]).
15 minute warmup, 5×1km at 4:05 with 90 second recoveries, 10 minute cooldown:
[{"type": "warmup", "duration_seconds": 900},
{"type": "repeat", "times": 5, "steps": [
{"type": "interval", "distance_meters": 1000, "pace": "4:05"},
{"type": "recovery", "duration_seconds": 90}]},
{"type": "cooldown", "duration_seconds": 600}]A single pace is widened by 5 s/km either side, because Garmin alerts on a range and an exact target beeps constantly. Repeat groups don't nest. Creating a workout only saves it — schedule it on a date for it to reach the watch.
What it can and can't do to your account
Reading is unrestricted. Writing is confined to the workout library: create a workout, schedule it, unschedule it, delete it. Nothing reaches your training history — no tool deletes or edits a recorded activity, so a run you did cannot be lost here however wrong a tool call goes.
delete_workout is gated rather than trusted to a docstring. The first call
never deletes: it reads the workout back and returns its name, and only a second
call passing that name as confirm removes it. A model cannot destroy a workout
it has not first named.
Your password is read from the environment, sent straight to Garmin, and never
written to disk. Only the session token Garmin issues is cached, at
~/.garmin-mcp/tokens.json, written 0600 inside a 0700 directory. No tool
returns the password or the token — get_connection_status reports a masked
address and the cache's age and permissions, nothing more. Logs go to stderr, so
they never corrupt the MCP stream on stdout.
After the first sign-in the server runs off the cached token. Set
GARMIN_EMAIL and GARMIN_PASSWORD in the server's environment if you want it
to re-authenticate unattended when that token eventually expires; leave
GARMIN_PASSWORD out and you'll re-run scripts/login.sh instead.
If it doesn't work
Start here — it walks from the interpreter to a live Garmin call and names the first broken link:
./scripts/doctor.sh"Garmin is rate-limiting logins from this IP address (429)" — the most common failure, and it isn't your password: Garmin blocks by network address before it checks credentials. Office wifi, university networks and VPNs get hit hardest. Sign in once over a phone hotspot; afterwards the cached session is used instead.
"Garmin is asking for a multi-factor code" — the server can't prompt over
stdio, so run ./scripts/login.sh in a terminal once. It handles the code and
caches the session.
Claude can't see the tools — Claude Desktop loads its config at launch and
writes its own copy back when it closes, so a change made while it's running
disappears. Quit it fully, run ./scripts/install-claude-desktop.sh, reopen.
Install fails mentioning Rust, OpenSSL or a compiler — macOS is too old.
The hard floor is 10.15 (Catalina), set by the Python interpreter itself:
uv's Intel build is compiled with minos 10.15 and will not launch below it, so
no amount of package pinning helps. The installers pass --only-binary :all: so
this fails fast rather than becoming a doomed source build, and retry against
constraints-legacy.txt in case a package has simply dropped a wheel.
No sleep data — the watch wasn't worn overnight, or hasn't synced. Sleep, HRV and overnight body battery only exist if you sleep in it.
Training skills
skills/ holds training methodology that builds on the tools — how
to read the data and what to prescribe from it. The first is a half marathon
skill in Pete Pfitzinger's style.
Development
.venv/bin/python tests/smoke_test.pyDrives the server over real stdio like an MCP client would, against a stubbed Garmin account — no network, no credentials. Covers every tool's response shape, workout construction, bad input, and the no-credentials startup path.
.venv/bin/python -m garmin_mcp.checkThe same code path against your real account, printing what comes back. Useful for confirming a setup end to end.
.venv/bin/python tests/http_test.pyThe HTTP transport, as Claude drives it: discovery, client registration, Google sign-in (stubbed), consent, token exchange and rotation, and tool calls with the token.
Other MCP clients, and ChatGPT
Nothing here is Claude-specific: it speaks MCP over stdio, so any client that
launches a local server will run it — Claude Code, Cursor, VS Code, Zed,
Windsurf. Copy .mcp.json.example, fill in absolute paths, point the client at
python -m garmin_mcp.
ChatGPT can't run this. Its connectors take a public HTTPS URL over SSE, because ChatGPT executes on OpenAI's servers and cannot start a process on your machine — there's no local-server option to enable. Serving it to ChatGPT would mean hosting it publicly and holding users' Garmin credentials, which is exactly what this project avoids.
Caveats
Not affiliated with Garmin. It uses the same private API the Garmin Connect
website does, via
garminconnect, because
Garmin publishes no consumer OAuth API. That API can change without notice and
take this with it.
MIT licensed. Built with Claude Code.
Available Tools
26 toolscreate_planA
Create a whole training block at once: every session built and put on its date.
You design the plan, from the user's goal, current fitness (get_fitness), readiness, history and a methodology; this builds each session as a structured workout and schedules it, so the whole block is on the watch in one go. Show the user the plan and get their agreement first: it writes to their real calendar. It answers with the new block drawn as a card, the same as get_plan, so no other call is needed to show it.
Each workout is named with a short plan code after a middle dot, "Threshold 5x1k · HM", which is how get_plan finds the block; nothing is stored outside Garmin. Every session is checked before anything is created, so a mistake in session 40 leaves no half plan behind.
Args: goal: What the block is for, e.g. "Half marathon, 1:40, 15 November". sessions: One per session, any order: "date" (YYYY-MM-DD, today to 30 weeks out), "name" (short, as on the watch: "Long run 18k"), "steps" (as for create_workout), and optional "sport" (running by default), "description", "pool_length_meters" for a swim (25 by default) and "phase": one short word such as "Base", "Build", "Peak" or "Taper", the same for every session in that phase; the card bands the weeks by it. Rest days are days with no session. At most 150. label: 2 or 3 letters or digits for the plan code, short because it ends every workout name: "HM", "10K", "MAR", "B1" for a base block. From the goal when omitted. name: A short name for the block, as the card's title: "Base block", "Marathon build". Two or three words, not the goal. method: The methodology in a few words, shown under the name: "Norwegian singles", "80/20", "Pfitzinger 18/55". milestones: Up to 4 points on the way to the goal, drawn as a timeline: {"label": "Half check", "date": "2026-11-29", "target": "1:22"}, date and target optional. The goal race is usually last.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | Yes | ||
| name | No | ||
| label | No | ||
| method | No | ||
| sessions | Yes | ||
| milestones | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations it discloses the important traits: it writes to the real Garmin calendar, validates every session before creating anything ('a mistake in session 40 leaves no half plan behind'), stores nothing outside Garmin, and encodes a plan code in every workout name that get_plan later relies on. Those are exactly the side effects and invariants an agent needs before a bulk write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and confirmation requirement, then a structured Args block. It is long, but nearly every line carries information; the plan-code paragraph is slightly belabored for the space it takes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter bulk mutation with nested free-form objects and an output schema, nothing essential is missing: validation behavior, naming convention, defaults, limits and the returned card are all covered, so the agent can call it correctly in one pass.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the load and does: each arg is defined with examples, the sessions object's fields and defaults are spelled out (sport running, pool_length_meters 25, date range today to 30 weeks out, max 150), and the milestone object shape is given. This is well beyond what the bare schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource plus scope: 'Create a whole training block at once: every session built and put on its date.' That immediately separates it from create_workout (one workout) and schedule_workout (one session), so the sibling distinction is clear without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit about when to use it and what to do first: design from goal, fitness (naming get_fitness), readiness and history, then 'Show the user the plan and get their agreement first: it writes to their real calendar.' It also removes a follow-up call by stating the response is drawn like get_plan.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_strength_workoutA
Create a strength training workout in Garmin Connect.
Adds a new workout; it never edits or replaces an existing one. Use schedule_workout afterwards to put it on a date so it syncs to the watch.
Exercise names come from Garmin's own catalogue. Common names usually work as typed; if one is ambiguous this says so and lists the candidates rather than guessing, since a wrong guess is the wrong movement on a watch. Call find_exercises to search.
Args: name: Name shown in Garmin Connect and on the watch. exercises: Ordered list of blocks. Each block is an object: - "exercise": catalogue name, e.g. "Barbell Bench Press" - "sets": number of sets (default 3) - "reps": repetitions per set (default 10) - "rest_seconds": rest after each set (default 90) - "weight_kg": optional target weight Example — a push day: [{"exercise": "Barbell Bench Press", "sets": 4, "reps": 8, "rest_seconds": 120, "weight_kg": 70}, {"exercise": "Barbell Overhead Press", "sets": 3, "reps": 10, "rest_seconds": 90}, {"exercise": "Cable Triceps Pushdown", "sets": 3, "reps": 12, "rest_seconds": 60}] description: Optional note stored with the workout.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| exercises | Yes | ||
| description | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds meaningful behavior beyond the annotations: it never edits or replaces an existing workout, and on an ambiguous exercise name it returns the candidate list rather than guessing — an important failure mode to know. This is real context an agent could not derive from `readOnlyHint: false` / `destructiveHint: false` alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the one behavioral caveat, then a compact Args block and a single worked example. Every sentence does work — the example is the most efficient way to specify the nested structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. Between the purpose, the routing to `schedule_workout`/`find_exercises`, the ambiguity behavior, and the full nested-parameter documentation, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden, and it delivers: all three params are documented, plus the nested block fields ('exercise', 'sets', 'reps', 'rest_seconds', 'weight_kg') with their defaults, backed by a concrete push-day example. This compensates completely for the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a strength training workout in Garmin Connect') and rules out editing or replacing existing workouts. It does not, however, distinguish itself from the sibling `create_workout`, so an agent still has to infer which creation tool to use for a generic vs. strength workout.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Use schedule_workout afterwards to put it on a date so it syncs to the watch' and 'Call find_exercises to search.' These are named alternatives with conditions, not just implied usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_workoutA
Create a structured workout in Garmin Connect: always a new one, never an edit.
schedule_workout then puts it on a date so it syncs to the watch.
Args: name: Shown in Garmin Connect and on the watch. steps: Ordered steps, each with "type" (warmup, interval, recovery, rest, cooldown or repeat) and exactly one of "duration_seconds", "distance_meters" or "until_lap": true (ends on the lap button: a walk recovery between strides, a warm-up by feel, a rep to a landmark; still its own lap, so recoveries stay out of the rep splits). A repeat is {"type": "repeat", "times": 5, "steps": [...]} and can't contain another repeat. Optional target: "pace" ("4:05" or ["4:00", "4:10"], min/km), "hr" ([150, 165] bpm, or their Garmin zone: "z2", "z3-z4") or "power" (watts, 250 or [240, 260]; a share of the FTP set in Garmin, "95%" or ["88%", "94%"]; or a power zone, "z3"). By default only the work reps carry a target, pace for a run; warm-ups, cool-downs and recoveries carry none, so the watch stays quiet, and the chat and the workout's description say what easy pace to run them at: marathon pace plus 45-75 s/km, from get_fitness. The watch beeps off target, so a pace target is never narrower than 5 s/km either side ("4:00" becomes 3:55-4:05; tighter is widened around its middle): about 5 either side for reps, 10 for tempo and threshold, 15-20 for steady and long runs, or heart rate for easy running. A ride uses power on the work steps when the rider has a power meter or smart trainer (power shows on rides in get_activities) and an FTP (get_fitness): sweet spot 88-94%, threshold 95-105%, VO2 max 106-120%, endurance 56-75%. One value becomes a range 5% either side. Without a power meter, heart rate. Example, 15 min warm-up, 5 x 1 km at 4:05 with 90 s recoveries, 10 min cool-down: [{"type": "warmup", "duration_seconds": 900}, {"type": "repeat", "times": 5, "steps": [{"type": "interval", "distance_meters": 1000, "pace": "4:05"}, {"type": "recovery", "duration_seconds": 90}]}, {"type": "cooldown", "duration_seconds": 600}] sport: running (default), cycling, swimming, walking or hiking. description: Optional note stored with the workout. pool_length_meters: For a swim, 25 (default) or 50; the watch counts lengths with it.
A swim's steps are whole pool lengths (100, 200...), each with an optional "stroke": freestyle, backstroke, breaststroke, butterfly, im, drill or any. "pace" is per 100 m ("1:45") and shows on the step as a note, not a beeping target. A "rest" with no duration waits for the lap button, as swimmers rest at the wall; "duration_seconds" fixes it. A "note" (e.g. "kick with board") shows on the step. Set paces from recent swims (get_activities, per 100 m) or their CSS. Example, 8 x 100 free at 1:45 with 15 s rest: [{"type": "warmup", "distance_meters": 400, "stroke": "any"}, {"type": "repeat", "times": 8, "steps": [{"type": "interval", "distance_meters": 100, "stroke": "freestyle", "pace": "1:45"}, {"type": "rest", "duration_seconds": 15}]}, {"type": "cooldown", "distance_meters": 200, "stroke": "any"}]
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| sport | No | running | |
| steps | Yes | ||
| description | No | ||
| pool_length_meters | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations by explaining that this always creates a new workout, never edits, and that scheduling is a separate action. It also discloses important behavioral details such as default target assignment, automatic pace-range widening, watch beeping behavior, swim note handling, lap-button semantics, and repeat nesting limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence is front-loaded and the Args section is organized around the actual inputs. It is long, with substantial coaching heuristics and examples, but most of that detail is necessary for correctly constructing nested workout steps.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complex nested steps schema, zero schema description coverage, and the existence of an output schema, the description is complete enough for an agent to construct valid workouts. It fills the schema gaps with detailed step semantics, examples, and sport-specific behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the steps parameter is a free-form array, so the description carries the full burden. It thoroughly documents every parameter and the nested step grammar, including types, duration/distance/until_lap, target formats, repeat structure, sport defaults, and pool length.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: creates a structured workout in Garmin Connect. It also explicitly distinguishes creation from editing with "always a new one, never an edit," making it clearly different from update_workout.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Makes the create-vs-edit boundary clear and explains that schedule_workout is the next step to put the workout on a date. It also references get_fitness and get_activities for target-setting context, though it does not explicitly name update_workout or create_strength_workout as alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_workoutADestructive
Delete a workout from the Garmin account. Permanent.
This asks before it acts, and the check is real rather than advisory: the
first call never deletes. It reads the workout back and returns its name,
and only a second call passing that name as confirm goes through. Show
the person what is about to go and let them answer before confirming.
Recorded activities are untouchable here. This removes a workout from the workout library — a plan for a session, not a session you ran.
Args: workout_id: Id from list_workouts or create_workout. confirm: The workout's exact name, which the first call returns.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | ||
| workout_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true; the description goes well beyond that by disclosing the two-call confirmation gate, that the first call is a non-destructive read returning the workout name, and that deletion is permanent. It also disambiguates the blast radius by excluding recorded activities.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The permanence warning is front-loaded and the Args block is tight. The sentence "This asks before it acts, and the check is real rather than advisory" is somewhat redundant with the explanation that follows, costing a little efficiency without losing clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive two-parameter tool with an output schema, everything needed is present: mutation semantics, the confirmation protocol, the failure mode of an unconfirmed call, and the exact value to pass. Return-value detail is correctly left to the output schema apart from the one fact the workflow depends on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and does it: workout_id is sourced from list_workouts or create_workout, and confirm is defined precisely as "the workout's exact name, which the first call returns" — including that it is empty on the first call. No ambiguity remains about either parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Delete a workout") and immediately scopes it: it removes a workout-library plan, not a recorded activity, which separates it from update_activity and get_activity_details. The two-step confirm behavior also distinguishes it from sibling mutations like update_workout and unschedule_workout.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when the tool acts and when it does not ("the first call never deletes"), plus the required human-in-the-loop protocol ("Show the person what is about to go"). It also gives a negative case ("Recorded activities are untouchable here") and points at list_workouts / create_workout for sourcing the ID.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_exercisesARead-only
Search Garmin's exercise catalogue by name.
Use this before create_strength_workout when unsure what an exercise is called, or when it reports that a name was ambiguous. Matching ignores hyphens and spacing, so "pull up" and "pull-up" both work.
Args: query: Part of an exercise name, e.g. "bench press" or "row". limit: How many matches to return. Defaults to 25.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, non-destructive, closed-world behavior. The description adds useful matching behavior—hyphens and spacing are ignored, so variant spellings work—but does not cover result ordering or pagination behavior beyond the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, followed by usage context and parameter notes. Every sentence adds actionable information with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple two-parameter search nature, existing annotations, and the presence of an output schema, the description provides everything needed to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It does: query is described as part of an exercise name with examples like 'bench press' and 'row', and limit is explained as the number of matches with its default of 25.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Search) and resource (Garmin's exercise catalogue) along with the search dimension (by name). It is clearly distinguishable from sibling workout creation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use this tool: before create_strength_workout when unsure of an exercise name, or when that tool reports ambiguity. This directly ties usage to a sibling tool's workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_activitiesARead-only
List recent runs, rides, swims and workouts with distance, duration, pace and HR zones.
Swims come with pace per 100 m, pool length, SWOLF and stroke rate instead of pace per km.
Args: limit: Maximum activities to return (1-50). Defaults to 10. start_date: Optional first day of a date range, YYYY-MM-DD. end_date: Optional last day of a date range. Defaults to today when start_date is given.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| end_date | No | ||
| start_date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds genuine context beyond that: swims return pace per 100 m, pool length, SWOLF and stroke rate instead of pace per km, plus the 'recent' ordering implication and the end_date-relative-to-today behavior. What it doesn't disclose is whether 50 is a hard ceiling, what happens with a very wide date range, or anything about ordering/tie-breaking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose sentence, then the swim exception, then a compact Args block. Every line carries information the schema lacks; nothing is repeated from annotations or the JSON schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, there is no obligation to describe return fields, and the args are fully covered. The remaining gap is pagination: for a listing tool capped at 50 there is no statement about how to page past the limit or whether ordering is newest-first, which matters for a tool returning 'recent' items.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and does so: limit range (1-50) with default 10, both dates as YYYY-MM-DD, and the non-obvious conditional default that end_date becomes today when start_date is supplied. That conditional behavior is not derivable from the schema's anyOf/default:null at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) plus the resource (recent runs, rides, swims, workouts) and the fields returned (distance, duration, pace, HR zones), and notes the swim-specific variant. It does not explicitly distinguish itself from get_activity_details or list_workouts, so the agent must infer that this is the activity feed rather than planned workouts or a single-activity drill-down.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the word 'recent' plus the limit/date-range args signal this is the default feed query, but there is no explicit 'use this when...' or 'for per-activity detail use get_activity_details' routing. An agent can infer usage from the sibling list but the description does no work to route it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_activity_detailsARead-only
Splits and heart-rate detail for one activity.
Args: activity_id: The activityId from get_activities.
For a run, also returns the weather during it (temperature, dew point, wind, and what that does to pace), the shoes worn, the terrain (climbs, pace on uphill, flat and downhill, the pace the effort was worth on the flat, heart-rate decoupling and where it faded) and earlier runs of the same route with their pace and heart rate. Use these to explain a run rather than guessing why it was slow or hard. For a ride: normalised, average and max power, intensity factor and training stress against FTP, best efforts from 5 seconds to an hour, variability, time in power zones, climbs with speed, VAM and power, the weather during it, and earlier rides of the same route. For a swim: pace per 100 m, pool length, SWOLF, stroke rate and strokes, and the set as swum, each interval with its pace, stroke and the rest after it. Talk about a swim in those terms, never pace per km.
| Name | Required | Description | Default |
|---|---|---|---|
| activity_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered; the description adds the non-obvious trait that the response shape varies substantially by sport (run/ride/swim get different fields). It omits behavior on invalid IDs and payload size, which keeps it off a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the ID source are front-loaded, but the three sport-specific paragraphs are long and largely enumerate return values, which is redundant with the output schema. The content is useful but not efficiently sized for what the structured fields already carry.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a one-parameter, read-only tool with an output schema, an agent has everything needed to call it and know what each sport returns. The missing piece is failure behavior (unknown activity_id) and whether the ID must come from the authenticated user's account.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for the single parameter, and the raw schema is just an anyOf integer/string with no description, so the description must compensate. It does by naming the source (the activityId from get_activities), which is the key thing an agent needs; it doesn't clarify why both an integer and a string are accepted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: "Splits and heart-rate detail for one activity." That cleanly distinguishes it from the sibling get_activities (which lists many), and the body makes clear the payload expands per sport type. An agent can tell exactly what this returns without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit usage instruction — "Use these to explain a run rather than guessing why it was slow or hard" — and states the dependency via "The activityId from get_activities," implicitly routing from the list tool. It does not name when NOT to use it or compare against siblings like get_heart_rate, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_connection_statusARead-only
Check whether the server is logged in to Garmin Connect.
Reports which credentials are present and whether the cached session is usable. Never returns the password or the cached token itself.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds meaningful context beyond that: it discloses the sensitivity handling ('Never returns the password or the cached token itself') and that it inspects credential presence plus cached session usability, which an agent could not infer from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, with the core purpose front-loaded and the security guarantee following as a secondary clause. Nothing is padded or repeated from the annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't enumerate return fields, and the annotations cover safety. It says enough about what is inspected (credentials present, cached session usable) to set expectations, though a hint about what to do when the check fails would complete it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the baseline is 4. The description correctly adds no parameter detail that would be redundant, and the empty schema is self-explanatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Check whether the server is logged in to Garmin Connect.' This is unmistakably an auth/session status check, which sets it apart from every sibling (get_activities, get_profile, etc.), all of which fetch data rather than report login state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what is reported but never states when to call it — e.g. before other tools, or after an authentication error. Usage is only implied by the tool's nature, and no alternatives or prerequisites are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_daily_summaryARead-only
Daily health summary: steps, calories, resting heart rate, body battery and stress.
With what charged or drained Body Battery and the longest stressful spells: "why is my Body Battery low", "when was I stressed".
Args: date: Day to report on. YYYY-MM-DD, 'today', 'yesterday' or an offset like '-3'. Defaults to today.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds value beyond that by disclosing the analytical content of the response – body-battery charge/drain drivers and longest stressful spells – which is behavioral detail annotations cannot express. An output schema exists, so no penalty for not detailing the return shape further.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource and metric list, then use cases, then an Args block – a clean structure with no filler. The mid-sentence fragment "With what charged or drained Body Battery and the longest stressful spells" is slightly clunky but still short.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter read tool with full annotations and an output schema, everything an agent needs is present: what it returns, when to reach for it, and exactly how to format the date argument. No material gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden, and it does: the accepted formats (YYYY-MM-DD, 'today', 'yesterday', offset like '-3') plus the default of today are all stated. This goes well beyond the bare string/null schema and removes any ambiguity about valid input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line names the resource precisely (daily health summary) and enumerates the exact metrics returned: steps, calories, resting heart rate, body battery and stress. That enumeration lets an agent separate it from siblings such as get_heart_rate, get_readiness, get_sleep_data and get_recovery_trends without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The quoted user questions ("why is my Body Battery low", "when was I stressed") give concrete trigger scenarios, which is real usage guidance. It stops short of naming an alternative or an exclusion, so an agent must infer whether to prefer this over get_heart_rate for a heart-rate question.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fitnessARead-only
Garmin's read on the user's current fitness, as markers rather than history.
VO2 max and fitness age, predicted race times for 5k to marathon, lactate threshold heart rate and pace, endurance score, hill score and running tolerance, each with its own classification where Garmin gives one. Use it to set goals and training paces from evidence: "Garmin thinks you are a 1:42 half today" is a better starting point than asking. Also the heart rate and power zones set in Garmin, which workouts can target as "z2".
Also returns the cycling FTP set in Garmin, with watts per kilo when the user's weight is set. For a general "how's my training going", get_plan is the first call; this adds the fitness markers. For whether they are improving over months, get_fitness_trends.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint/destructiveHint/openWorldHint already declared, the description still adds real value: classifications are present only 'where Garmin gives one', watts-per-kilo appears only when the user's weight is set, and the returned zones are the ones workouts can target as 'z2'. It stops short of covering missing-device/no-data behavior, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Mostly front-loaded with the payload inventory first and the sibling routing last, and every clause carries information. Slightly jumbled by the 'Also the heart rate and power zones' insertion after the opening paragraph, which interrupts the flow before the FTP follow-up.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No parameters, read-only annotations, and an output schema that already documents return shape – yet the description still explains the marker set well enough for an agent to decide this is the right call. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema baseline of 4 applies; there is nothing further the description could add on argument semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (Garmin fitness markers) and enumerates exactly what comes back – VO2 max, fitness age, race predictions, lactate threshold, endurance/hill score, running tolerance, HR/power zones, FTP. 'Read on the user's current fitness, as markers rather than history' crisply separates it from the trend-oriented siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('set goals and training paces from evidence') and names two alternatives with the condition that selects each: get_plan for a general 'how's my training going' and get_fitness_trends for improvement over months. No inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fitness_trendsARead-only
Whether the user is getting fitter: Garmin's fitness markers month by month.
VO2 max, predicted 5k, 10k, half and marathon times, lactate threshold pace and heart rate, endurance and hill score, and cycling FTP, each as a value per month with the change from the first month to now and whether that is improving, steady or declining. Alongside them, weight by month from the weigh-ins logged in Garmin Connect, with body fat and muscle where a scale records them. Use it for "am I getting fitter", "how's my fitness trending", "is my VO2 max going up", "has my half prediction come down" or "was I faster when I was lighter", and answer in writing: name the markers that moved and by how much, in plain terms. For weight, line the months up and say how the markers moved as weight changed, as a pattern rather than a cause. With no weigh-ins logged, say so and that weighing in through Garmin Connect or a Garmin scale is what fills it. For where they stand today, get_fitness is enough; for whether recovery is keeping up, get_recovery_trends.
Args: months: Months to look back, including this one (1-12). Defaults to 6.
| Name | Required | Description | Default |
|---|---|---|---|
| months | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/no-destructive/closed-world, and the description adds real behavioural context beyond them: the change is computed from the first month to now, each marker is classified improving/steady/declining, and the missing-data case is specified ('With no weigh-ins logged, say so and that weighing in through Garmin Connect or a Garmin scale is what fills it'). That is the kind of edge-case disclosure agents need to avoid fabricating weight trends.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and the marker list before the usage guidance, and every clause carries information. It runs long however — dense multi-line paragraphs plus a quoted-phrasings list and response-format instructions — which costs some scannability for an agent parsing quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape need not be explained, and the description still covers the main edge case (no weigh-ins) and routing to siblings. The remaining gap is the case of no fitness-marker data at all (e.g. a device that never recorded VO2 max), which the description does not address.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameter, and it does: the 'Args' block states the range 1-12, the default of 6, and the non-obvious nuance that the window is inclusive of the current month. No ambiguity remains about what 'months' means.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific framing ('Whether the user is getting fitter') and then enumerates exactly what is returned: VO2 max, race predictions, lactate threshold, endurance/hill score, cycling FTP, plus weight/body composition, each as a monthly value with change since the first month. It explicitly contrasts itself with siblings ('For where they stand today, get_fitness is enough'), so an agent can distinguish it without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names concrete triggering questions ('am I getting fitter', 'is my VO2 max going up', 'was I faster when I was lighter') and gives explicit alternatives with conditions: get_fitness for today's snapshot, get_recovery_trends for recovery. It also prescribes the analysis pattern (name markers that moved and by how much; correlate weight with markers as pattern not cause).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_heart_rateARead-only
Heart rate through a day or night, from the watch's all-day readings.
For "was there a gap overnight", "when did my heart rate settle", "how low did it go". Answers with gaps (no reading for 10+ min), blocks with low, average and high, and the lowest and highest readings. A run's heart rate is get_activity_details.
Args: date: The day the window starts. Defaults to today; last night is yesterday with an evening start. start: Local start time, HH:MM. Defaults to midnight. end: Local end time, HH:MM. Before start runs into the next day.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| date | No | ||
| start | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/openWorldHint/destructiveHint, so safety is covered. The description adds genuinely non-obvious behavior: gaps are defined as 10+ minutes without a reading, and output is blocks with low/average/high plus extremes. It doesn't mention data-availability or wear-time prerequisites (e.g. what if the watch wasn't worn), which is the remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-line purpose, then answering questions, then output shape, then sibling routing, then a clearly delimited Args block. Every sentence carries information an agent would otherwise have to guess; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Three optional params, no required fields, and an output schema exists — yet the description still covers purpose, routing, time-window edge cases, and gap semantics. An agent could call this correctly from the description alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden and does so: 'date' is the day the window starts with a today default and a noted last-night idiom, 'start'/'end' are local HH:MM defaulting to midnight, and 'end' before 'start' rolls into the next day. This is exactly the semantics missing from a bare anyOf/string schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: heart rate over a day or night window sourced from the watch's all-day readings. Crucially it distinguishes itself from a near-neighbor by noting 'A run's heart rate is get_activity_details', so the agent can separate all-day HR from workout HR without reading either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete user questions it answers ('was there a gap overnight', 'when did my heart rate settle', 'how low did it go') and names the alternative tool for run-level HR. The date/start semantics for 'last night' are also tied to a usage scenario, not just a schema default.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_planTraining plan and progressARead-only
How the user's training is going, drawn as an interactive plan card: their plan week by week, each session done, missed or ahead, and the next one; with nothing scheduled, their recent weeks of running and riding.
Call it first for any general question about training or a plan ("how's my training going", "how am I doing", "this week", "show my plan", "what's next", "today's session", "am I on track"), wherever the plan came from: a coach, an app, Garmin Coach or create_plan. Call it alone: its situation says where the user is (a block under way, about to start or just done; a race ahead with nothing scheduled; regular running; or getting going) and offers one next step. Recovery, readiness or fitness follow only when asked, or when the user takes up that offer. Without a create_plan plan it reads the calendar around this week. Sessions carry workout_id and schedule_id for moving or retuning; the next one carries its steps and target paces. For any other session's steps, paces, recoveries or cool-down, call get_workout with its workout_id: never guess them.
Done means run within a day either side of its date, or any day that week if started from its workout on the watch. A strength session counts if any strength activity is recorded in its own week, early included, never another week's. Off its own day it shows as moved.
When the user says they have just done a session, call this before saying whether Garmin has it: don't guess. A strength activity is the session done even if it was logged in a gym app; the sets and weights aren't needed to count it. If a session isn't in Garmin but the user says they did it, trust them and suggest recording it on the watch next time. If what they did matters for what comes next and they haven't said, ask for a line. After a hard or long session in the last two days, ask once, in one short line, how it felt, and use the answer; not after an easy run.
The card draws the plan, so don't list it: add what it can't say, such as how the week is going. Each call draws it again, so answer follow-ups from that result; call again only when something may have changed (a session done, a workout moved or added, a new day) or the user asks to see it again: runs sync through the day, so after any of those the earlier answer goes stale. Don't call it for a specific question about a run, sleep, readiness, recovery, fitness or shoes.
Args: label: The code of a plan made with create_plan, e.g. "HM". Omit it for the plan running now, or the calendar.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only/non-destructive, and the description layers on substantial operational context: the freshness/staleness model ('runs sync through the day, so the earlier answer goes stale'), the matching semantics for what counts as 'done' (within a day either side, watch-started, strength-in-own-week), and the card-drawing side effect plus the instruction not to re-list the plan.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long but justified by the amount of routing and state-management behavior it has to encode, and it is front-loaded with purpose then usage before edge cases. There is some redundancy ('don't guess' restated, repeated emphasis on what counts as done) that could be tightened without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the description still covers what the schema cannot: cross-tool handoff for session details (get_workout with workout_id), the caching contract, how to reconcile Garmin data with the user's claim of having done a session, and when to probe about how a hard session felt. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the single parameter, and the Args block does: 'the code of a plan made with create_plan, e.g. "HM"' and 'Omit it for the plan running now, or the calendar.' This adds real meaning over a bare nullable string, though 'the calendar' as a fallback is left somewhat underspecified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('How the user's training is going, drawn as an interactive plan card') and enumerates exactly what the card contains: plan week by week, each session done/missed/ahead, next session. It explicitly separates itself from get_workout (session steps/paces) and from the recovery/readiness/fitness siblings, so an agent can pick it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger phrases ('how's my training going', 'this week', 'what's next'), states 'Call it first for any general question about training', and names the exclusions ('Don't call it for a specific question about a run, sleep, readiness, recovery, fitness or shoes'). It also states when to re-call versus answering from the prior result (session done, workout moved, new day, user asks to see it again).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_profileARead-only
Fitness profile: VO2 max and personal records.
Use this instead of asking the user for their PBs. Note that Garmin only knows records it has recorded itself — a race run without the watch, or before they owned it, will be missing.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds real value beyond that by disclosing a data-coverage limitation: records only exist if Garmin itself recorded them, so watchless races or pre-device history will be absent. This is exactly the kind of caveat an agent needs to avoid over-claiming.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences: what it returns, when to use it, and the one caveat that changes interpretation. Front-loaded with the payload and no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, an output schema, and annotations covering the safety profile, the remaining burden is the domain caveat, which the description handles well. The only gap is that it says nothing about behavior when no device or data is present, a plausible case for this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, which sets the baseline at 4. Schema coverage is 100% and an output schema exists, so there is no parameter semantics for the description to carry.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names the resource and its contents concretely: 'Fitness profile: VO2 max and personal records.' That is more specific than the sibling names alone (get_fitness, get_fitness_trends, get_progress), though the description never explicitly contrasts itself with those siblings, so an agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit positive directive — 'Use this instead of asking the user for their PBs' — which tells the agent when to reach for it rather than prompting the user. It does not name a competing sibling tool or state when-not-to-use, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_progressARead-only
Which planned sessions actually got done, week by week.
Answers "am I keeping up" rather than "what did I run". A session counts if it happened within a day either side of its scheduled day and ran at least roughly as long as planned — people move sessions around, and a week where everything got done on shifted days is a good week, not a failed one.
Each completed session carries a plain-English reason. Read those back when something looks wrong: a mismatch is visible there rather than hidden.
Effort is not judged here. This says whether a session happened; whether it was run at the right intensity is yours to assess from get_activity_details.
Args: weeks: How many weeks back to report, including this one (1-12).
Its result is drawn for the user as an interactive plan card, so there is no need to draw the weeks yourself, and calling it again draws the card again: fetch it fresh only when a session may have been done since. For "how is my plan going", get_plan is the better first call, and once it has been shown this is rarely needed too.
| Name | Required | Description | Default |
|---|---|---|---|
| weeks | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the read-only safety profile; the description adds the matching algorithm (within a day either side, roughly the planned duration) and the rationale (shifted sessions still count as a good week), which is the key behavioral surprise. It also discloses the rendering side effect — an interactive plan card is drawn and calling again re-draws it — that no annotation conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core answer, then eligibility rules, then usage routing — structure is good. Slight redundancy in 'Read those back when something looks wrong: a mismatch is visible there rather than hidden' and in restating the card-drawing consequence twice, which costs a bit of tightness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be enumerated, yet the description still flags the per-session plain-English reason field and points to get_activity_details for intensity. Combined with the card-rendering caveat and the sibling routing, an agent has everything needed to call and re-call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% (the single 'weeks' property has no description, minimum, or maximum), so the description carries the full burden and does: 'How many weeks back to report, including this one (1-12)' supplies both the inclusive-count semantics and the valid range that the schema omits.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line states a precise verb+resource: which planned sessions were completed, aggregated week by week. It explicitly separates itself from get_plan (plan overview) and get_activity_details (intensity assessment), so an agent can pick it out of a 25-tool family without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('am I keeping up'), when-not-to ('For "how is my plan going", get_plan is the better first call'), and a re-fetch rule ('fetch it fresh only when a session may have been done since'). Alternatives are named and the condition that selects each is stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_readinessARead-only
Whether the user should train hard today or hold back.
For that question, and for checking today before prescribing a hard session. Not for reviewing a week, a run or how training is going: get_plan and the activity tools answer those. Has Garmin's readiness score and its factors, training status (productive, strained, recovery...), acute against chronic load and the four-week load focus ("too much intensity?"), with last night's sleep, HRV against baseline, body battery, stress and resting heart rate, so get_sleep_data and get_daily_summary aren't needed with it.
Args: date: YYYY-MM-DD, 'today', 'yesterday' or an offset like '-1'. Defaults to today.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds valuable scope context by listing the bundled metrics (readiness score/factors, training status, acute vs chronic load, four-week load focus, sleep, HRV, body battery, stress, resting heart rate) and noting it subsumes sleep and daily-summary tools; however, it does not discuss data freshness, failure modes, or other operational behavior. The output schema carries the return structure, so a 4 reflects useful added context without full behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core decision and then gives alternatives and parameter details. It is slightly dense in the long run-on sentence listing all included metrics, but every sentence contributes useful selection or invocation information; no filler or repetition is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a one-parameter read-only tool with an output schema, the description covers purpose, when to use and avoid, sibling alternatives, data included, and accepted parameter formats. Nothing an agent needs to select or call the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the schema only defines `date` as an unconstrained string/null. The description fully compensates by documenting accepted formats ('YYYY-MM-DD', 'today', 'yesterday', or an offset like '-1') and the default ('Defaults to today'), which is essential for correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description immediately states the decision it supports ('Whether the user should train hard today or hold back') and then enumerates the exact Garmin metrics it returns. It explicitly distinguishes itself from siblings like get_plan, the activity tools, get_sleep_data, and get_daily_summary, so an agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives both the positive trigger ('For that question, and for checking today before prescribing a hard session') and explicit exclusions ('Not for reviewing a week, a run or how training is going: get_plan and the activity tools answer those'). It also states that get_sleep_data and get_daily_summary are unnecessary alongside it, which is precise alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recovery_trendsARead-only
How the user is recovering across weeks, beside the training that caused it.
Week by week: overnight HRV, resting heart rate, sleep hours and score, Body Battery peak and stress, next to training load, run km and sessions, plus the last two weeks day by day and any marker that has moved off its usual range (resting HR up, HRV down, short sleep, a jump in load). Use it for "am I recovering well", "is this block too much" or "why do I feel flat". For whether to train hard today, get_readiness is the one.
Args: weeks: Weeks to look back, including this one (1-12). Defaults to 4.
For a general "how's my training going", get_plan is the first call; this adds how recovery is keeping up with it.
| Name | Required | Description | Default |
|---|---|---|---|
| weeks | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered; the description adds the useful behavioral detail that results include flagging of markers that have drifted outside their usual range (resting HR up, HRV down, short sleep, load jump). It says nothing about caching, latency or data freshness, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The main statement comes first, then the returned-metric list, then routing guidance, then the arg note — a sensible front-loaded order. It is a few lines longer than strictly necessary, with the metric enumeration and the get_plan coda partially overlapping in purpose, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter read tool with an output schema and read-only annotations, an agent has everything needed: what window it covers, what it returns conceptually, which questions it answers, and which siblings to use instead. The return-value enumeration is arguably redundant with the output schema but costs little.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description has to carry the parameter, and it does: 'weeks: Weeks to look back, including this one (1-12). Defaults to 4.' It adds a hard range constraint and clarifies that the current partial week counts, neither of which is in the schema (which only shows type integer and default 4).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line names the resource and the scope precisely ('how the user is recovering across weeks, beside the training that caused it') and then enumerates the concrete metrics returned (HRV, resting HR, sleep, Body Battery, load). It explicitly differentiates itself from two siblings: get_readiness for today's training decision and get_plan for general training status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It supplies three verbatim user questions that should route here ('am I recovering well', 'is this block too much', 'why do I feel flat'), states the condition that selects a sibling instead ('For whether to train hard today, get_readiness is the one'), and positions itself relative to get_plan as a follow-on call rather than a starting point.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_shoesARead-only
The user's running shoes and how far each pair has gone.
For each active pair: km so far, runs, the limit set in Garmin (or a typical 650 km when none is set) and km left, km in the last four weeks, when it was last worn, and whether Garmin adds it to new runs by default. Pairs near the end of their life are flagged. Retired pairs are listed by name and km. Use it for "do I need new shoes" or "which shoes do I run in most".
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=true, destructive=false, openWorld=false, so the safety profile is covered; the description adds genuine behavior, notably the 650 km fallback limit when Garmin has none set and the fact that pairs near end-of-life are flagged. That fallback rule is non-obvious domain logic an agent could not infer from the schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with a one-line purpose, then the per-pair payload, then usage prompts — a sensible order with no filler sentences. It is slightly long because it enumerates return fields that the existing output schema already documents, which is mild redundancy rather than waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero parameters, a present output schema, and rich annotations, the only things the description must supply are the domain rules — the 650 km default, the end-of-life flagging, and how retired pairs appear. It supplies all three, so an agent can call and interpret the result without further guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing to disambiguate and the baseline of 4 applies. The description correctly implies a no-argument call returning the whole shoe roster rather than hinting at hidden filters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific resource (the user's running shoes) and states exactly what is reported per pair: km so far, runs, limit, km left, recent km, last worn date, and default-assignment status. No sibling tool touches shoe/gear data, so the resource alone cleanly separates it from get_activities, get_fitness, and the rest.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two concrete triggering questions — "do I need new shoes" and "which shoes do I run in most" — which map directly to the reported fields and make selection easy. It does not state any when-not condition or name an alternative, but no sibling overlaps this domain, so the omission is minor.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sleep_dataARead-only
Sleep stages and sleep score for a night, with overnight breathing rate and SpO2 against usual.
Args: date: The date you woke up on. YYYY-MM-DD, 'today', 'yesterday' or an offset like '-3'. Defaults to today.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, non-destructive, and closed-world, so the safety profile is covered. The description adds meaningful context beyond that: the data includes a comparison against the user's usual baseline, which tells the agent the output is interpretive rather than raw. It doesn't discuss data availability (e.g., missing nights), keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight parts: a one-sentence summary of returned data, then a focused Args block for the single parameter. Front-loaded, no filler, and the wake-up-date clarification is stated before the accepted formats.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't describe return structure, and the sole parameter is fully specified. The only gap is sibling differentiation against get_daily_summary and other daily metrics; otherwise it is complete for a simple single-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the parameter is a bare optional string, so the description carries the full burden — and it does: it defines the anchor as the wake-up date, lists accepted formats (YYYY-MM-DD, 'today', 'yesterday', offset like '-3'), and states the default. This is exactly the guidance an agent needs to avoid the common mistake of passing the sleep-onset date.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (sleep stages, sleep score, overnight breathing rate and SpO2) scoped to a single night, which is clearly distinct from siblings like get_readiness and get_heart_rate. The verb is implicit but the returned data is named precisely enough that an agent knows exactly what this retrieves.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implied use case is clear — fetch last night's or a specific night's sleep report — but the description never states when to prefer this over get_daily_summary or other daily-metric siblings, nor any exclusions. Adequate but leaves routing decisions to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workoutARead-only
The steps of one workout, saved or scheduled: each step with its distance or time and target.
Use it for any question about what a session involves ("what's the pace for Wednesday's workout", "how long is the cool-down", "what are the recoveries"), with the workout_id from get_plan's sessions or from list_workouts. Never guess a workout's paces, recoveries or warm-up from other sessions: read them here. Repeats keep their structure, e.g. 8 x [1 km at a target, 60 s recovery].
Args: workout_id: The workout's id, from get_plan or list_workouts.
| Name | Required | Description | Default |
|---|---|---|---|
| workout_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this readOnly, non-destructive, closed-world, so the safety bar is met; the description goes further by disclosing the response shape an agent would otherwise have to discover: each step's distance-or-time and target, that repeats keep their nested structure (8 x [1 km at target, 60 s recovery]), and that warm-up/cool-down are part of the answer. That is meaningful behavioral context beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core statement, then usage, then the repeat-structure detail, then Args. Slightly long for one parameter, and the three quoted example queries overlap somewhat, but every sentence still carries routing or output-structure information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no full prose, yet the description still gives the one structural fact worth knowing (repeats nest). Combined with id provenance, the never-guess warning and the clear read-only framing, nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single property has no description, so the description must compensate; it does by stating the id comes from get_plan or list_workouts rather than being guessed, and repeats this in the Args block. It stops short of saying the id is an integer or what happens on an invalid id, so it earns a 4 rather than a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('The steps of one workout, saved or scheduled') and states the scope precisely: each step with distance/time and target. This clearly separates it from get_plan (plan-level sessions) and list_workouts (enumeration), even though the description never has to name them as competitors explicitly, the wording does the differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use it for any question about what a session involves' and gives three paraphrased example queries that map to real user phrasing. It also names exactly where the workout_id comes from ('from get_plan's sessions or from list_workouts') and issues a clear exclusion: never guess paces, recoveries or warm-up from other sessions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workoutsARead-only
List structured workouts saved in the Garmin account.
Args: limit: Maximum workouts to return (1-100). Defaults to 20.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered without description help. The description adds useful scope context ('structured workouts saved in the account') and the limit's range, but says nothing about ordering, pagination beyond limit, or whether full workout detail is returned (an output schema exists, so the latter is forgivable).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence of purpose plus a compact arg note; nothing is wasted and the purpose is front-loaded. The args block is not redundant here because the schema has zero description coverage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with annotations and an output schema, the description is serviceable but thin. It omits result ordering and any indication of how many workouts typically exist or how to page past 100, which is the main thing an agent would need beyond the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden for the single parameter, and it does: 'Maximum workouts to return (1-100). Defaults to 20' supplies both bounds and default that the bare integer schema lacks. It does not say what order results are returned in or whether limit is the only paging control.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('structured workouts saved in the Garmin account'), which is unambiguous against siblings like get_workout, create_workout, and schedule_workout. It does not explicitly name those siblings, but the list-vs-single-item distinction is inferable from the verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: this is the enumeration call in a family that also has get_workout (single item) and get_activities (activities, not workouts). No sentence states when to use this instead of get_workout or what happens when there are no workouts, so the agent must infer routing from tool names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_planADestructive
Take the rest of a plan off the calendar and out of the workout library.
For starting again or abandoning a block. Only sessions from today onward are removed; past ones stay, so the record of what was planned against what was run is kept. The first call only reports what would go. Removing it needs a second call with confirm set to the plan code, after the user has agreed.
Args: label: The plan code, e.g. "HM". confirm: The plan code again, to go ahead.
| Name | Required | Description | Default |
|---|---|---|---|
| label | Yes | ||
| confirm | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, but the description adds the crucial scope detail: only sessions from today onward are removed and past ones are kept, so the audit trail survives. It also discloses the two-phase dry-run/confirm safety flow, which no annotation covers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the outcome, then scope, then the confirmation protocol, then args. Dense and largely waste-free, though the args section restates param names already covered in prose ('The plan code again'), a mild duplication.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema and annotations exist, so the description need not explain return values, and it doesn't. What it must cover for a destructive two-step tool — scope limits, reversibility of past data, and the confirm handshake — is fully addressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and does so: label is defined as the plan code with an example ('HM'), and confirm as the same code repeated to proceed. It also explains that omitting confirm produces a dry run, which the schema's empty-string default does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Uses a specific verb and resource ('take the rest of a plan off the calendar and out of the workout library'), and the phrase 'rest of a plan' plus 'workout library' implicitly separates it from session-level siblings like delete_workout or unschedule_workout. An agent can identify the scope of the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the intent ('for starting again or abandoning a block') and, more importantly, prescribes the exact call sequence: a first report-only call, then a second call with confirm after the user agrees. That routing guidance is what an agent needs to decide when and how to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_workoutA
Put an existing workout on a date in the Garmin calendar.
Scheduling is what makes a workout sync to the watch.
Args: workout_id: Id from create_workout or list_workouts. date: The day to schedule it on. YYYY-MM-DD, 'today', 'tomorrow', or an offset like '+3'.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | ||
| workout_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), so the bar is lower, and the description still adds the non-obvious behavioral fact that scheduling triggers watch sync. It omits whether re-scheduling overwrites, whether duplicates are allowed, and any auth/connection requirement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short front-loaded paragraphs plus an Args block; the watch-sync rationale lands before the parameter detail. No filler sentences, and the format examples are placed exactly where an agent would look.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With two required params, an output schema that covers return values, and annotations covering safety, the description is nearly sufficient for correct invocation. The remaining gap is edge-case behavior on repeated scheduling and whether the workout must already exist on the account.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning and does: it explains workout_id's provenance and constrains date to four concrete formats (YYYY-MM-DD, 'today', 'tomorrow', '+3'). This is information an agent could not infer from the bare string/integer schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Put/schedule') plus specific resource ('existing workout on a date in the Garmin calendar'), and 'existing' implicitly separates it from create_workout while the sibling unschedule_workout covers the inverse. An agent can route between create_workout, schedule_workout, and unschedule_workout from the text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the key usage fact that scheduling is what makes a workout sync to the watch, which explains why you'd call this rather than stopping at create_workout. It also names the two sources of workout_id (create_workout, list_workouts). It does not state what happens if a workout is already scheduled on that date, nor any prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unschedule_workoutADestructive
Take a workout off a day in the Garmin calendar.
This is the reversible one: the workout itself is kept and can be scheduled again. Use it to clear a session the watch should no longer show. Deleting the workout outright is delete_workout.
Args: date: The day to clear. YYYY-MM-DD, 'today', 'tomorrow', or an offset like '+3'. If more than one workout sits on that day, they are listed back rather than guessed between. schedule_id: Remove one specific entry, from a previous listing or from what schedule_workout returned. Takes precedence over date.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| schedule_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description explains the critical behavior: only the scheduled entry is removed, while the workout itself is kept and can be scheduled again. It also discloses what happens when multiple workouts sit on a date, listing them rather than guessing. This does not contradict destructiveHint=true because removing a schedule entry is still a destructive update, even if reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the key reversible distinction and then uses a clear Args section. Every sentence adds useful behavioral or parameter context without repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-optional-parameter mutation tool with an output schema and annotations, the description is nearly complete. It covers the main semantic ambiguities and alternatives, but omits default/no-argument behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It does well by documenting accepted date formats, listing behaviors, schedule_id provenance, and precedence. It does not explain what happens when neither optional parameter is supplied, leaving a small but real gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: taking a workout off a day in the Garmin calendar. It explicitly distinguishes this from delete_workout and implicitly from schedule_workout, so an agent can identify the correct operation without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly says when to use this tool: to clear a session the watch should no longer show. It also names the alternative delete_workout for outright deletion and explains schedule_id precedence over date.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_activityA
Change a recorded run or ride: its name, notes, shoes or type. Pass only what changes; the answer says what each was.
Args: activity_id: From get_activities. name: The new title. notes: Replaces the notes; read them with get_activity_details to add to them. shoes: A pair's name from get_shoes, replacing any on it; "none" takes them off. activity_type: e.g. trail_running, treadmill_running, track_running, indoor_cycling, walking.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| notes | No | ||
| shoes | No | ||
| activity_id | Yes | ||
| activity_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations establish this is a non-read-only, non-destructive mutation; the description adds crucial semantics annotations cannot convey: notes are replaced rather than appended, shoes overwrite the existing pair, and "none" removes shoes entirely. It also states the response reports prior values, which matters for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core behavior and partial-update rule are front-loaded in one sentence, and the Args block gives one tight line per parameter. Slightly list-heavy but every line carries real information, with no repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter mutation tool with an output schema already present, nothing essential is missing: overwrite vs append semantics, the removal sentinel, valid type values, and cross-tool references are all covered. Return-format explanation is rightly not duplicated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and does: it documents all five parameters, gives the source for activity_id and shoes, explains the string sentinel "none" for removal, and provides concrete activity_type values (trail_running, indoor_cycling, walking) that the schema's free-form string otherwise leaves open.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ("Change a recorded run or ride") and enumerates the exact editable fields, so it is instantly distinguishable from read-only siblings like get_activity_details or get_activities. The scope (per-activity metadata edit) is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to pass only changed fields (partial update) and routes the agent to get_activities for activity_id, get_shoes for shoe names, and get_activity_details for reading current notes. It stops short of stating when not to use it (e.g. for workouts, use update_workout), but the context is otherwise clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_workoutADestructive
Change an existing workout in place: its name, its steps, or both.
The workout keeps its id, so any dates it is already scheduled on stay
scheduled and the watch picks up the new version at the next sync. This is
how a plan adapts: retune the paces on next week's sessions rather than
deleting and recreating them. Give steps in the same shape create_workout
takes; leave it out to change only the name or description.
New steps replace the old list entirely, so to change part of a workout (one pace, the recoveries, the cool-down) read it with get_workout first and send back every step, changing only what the user asked for. The answer carries the steps it replaced, so say exactly what changed.
Args: workout_id: The workoutId from get_plan, list_workouts or create_workout. name: New name. Omit to keep the current one. steps: New step list, replacing the old one entirely. Omit to keep it. sport: Only needed with steps, and only to change the sport. description: New note. Omit to keep the current one. pool_length_meters: For a swim, a new pool length. Omit to keep it.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| sport | No | ||
| steps | No | ||
| workout_id | Yes | ||
| description | No | ||
| pool_length_meters | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true; the description supplies the crucial nuance the annotation cannot — the workout keeps its id, scheduled dates survive, the watch picks up changes at next sync, and the steps list is replaced wholesale rather than merged. It even notes the response echoes the replaced steps, which is behavior an agent cannot infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then behavior, then the replacement caveat, then a clean Args block — the ordering is exactly what an agent needs. It is on the long side and the mid-sentence line breaks add noise, but no sentence is redundant given the empty schema descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A destructive mutation tool with six undocumented parameters and no schema descriptions would normally be under-specified, but this description covers id/scheduling side effects, replacement semantics, field-by-field argument meaning, and the prerequisite read step. Return values are left to the output schema, which is appropriate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden and does: every one of the six parameters is explained, including the 'omit to keep current value' convention that the schema's nullable defaults do not convey, plus the conditional rule that sport is only meaningful alongside steps. It also points steps at the create_workout shape, filling a real gap for a free-form object array.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Change an existing workout in place') and immediately scopes what can be changed (name, steps, or both). It is clearly distinguishable from create_workout, delete_workout, and get_workout, all of which appear in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to retune existing workouts rather than delete-and-recreate, and prescribes the read-with-get_workout-then-resend-all-steps procedure for partial edits. It also states when to omit optional fields, so the agent never has to guess between update and delete/create.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
26 tool updates
v0.1.1- Added
create_plan - Added
create_strength_workout - Changed
create_workout7 fields changed- removed
Input schema / properties / description / titleRemoved value: -"Description" - removed
Input schema / properties / name / titleRemoved value: -"Name" - added
Input schema / properties / pool_length_metersAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null +} - removed
Input schema / properties / sport / titleRemoved value: -"Sport" - removed
Input schema / properties / steps / titleRemoved value: -"Steps" - removed
Input schema / titleRemoved value: -"create_workoutArguments" - removed
Output schema / titleRemoved value: -"create_workoutDictOutput"
- Added
delete_workout - Added
find_exercises - Changed
get_activities5 fields changed- removed
Input schema / properties / end_date / titleRemoved value: -"End Date" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / start_date / titleRemoved value: -"Start Date" - removed
Input schema / titleRemoved value: -"get_activitiesArguments" - removed
Output schema / titleRemoved value: -"get_activitiesDictOutput"
- Changed
get_activity_details3 fields changed- removed
Input schema / properties / activity_id / titleRemoved value: -"Activity Id" - removed
Input schema / titleRemoved value: -"get_activity_detailsArguments" - removed
Output schema / titleRemoved value: -"get_activity_detailsDictOutput"
- Changed
get_connection_status2 fields changed- removed
Input schema / titleRemoved value: -"get_connection_statusArguments" - removed
Output schema / titleRemoved value: -"get_connection_statusDictOutput"
- Changed
get_daily_summary3 fields changed- removed
Input schema / properties / date / titleRemoved value: -"Date" - removed
Input schema / titleRemoved value: -"get_daily_summaryArguments" - removed
Output schema / titleRemoved value: -"get_daily_summaryDictOutput"
- Added
get_fitness - Added
get_fitness_trends - Added
get_heart_rate - Added
get_plan - Added
get_profile - Added
get_progress - Added
get_readiness - Added
get_recovery_trends - Added
get_shoes - Changed
get_sleep_data3 fields changed- removed
Input schema / properties / date / titleRemoved value: -"Date" - removed
Input schema / titleRemoved value: -"get_sleep_dataArguments" - removed
Output schema / titleRemoved value: -"get_sleep_dataDictOutput"
- Added
get_workout - Changed
list_workouts3 fields changed- removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / titleRemoved value: -"list_workoutsArguments" - removed
Output schema / titleRemoved value: -"list_workoutsDictOutput"
- Added
remove_plan - Changed
schedule_workout4 fields changed- removed
Input schema / properties / date / titleRemoved value: -"Date" - removed
Input schema / properties / workout_id / titleRemoved value: -"Workout Id" - removed
Input schema / titleRemoved value: -"schedule_workoutArguments" - removed
Output schema / titleRemoved value: -"schedule_workoutDictOutput"
- Added
unschedule_workout - Added
update_activity - Added
update_workout
8 tool updates
v0.1.0- First observed
create_workout - First observed
get_activities - First observed
get_activity_details - First observed
get_connection_status - First observed
get_daily_summary - First observed
get_sleep_data - First observed
list_workouts - First observed
schedule_workout
TDQS
Scored across 26 tools
Most tools target clearly distinct resources and the descriptions explicitly steer between overlapping calls such as get_plan, get_progress, and get_readiness. However, get_profile overlaps with get_fitness on VO2 max and records, and several recovery/health tools surface related signals, creating some risk of misselection.
Names consistently follow a snake_case verb_noun pattern: get_*, list_*, create_*, update_*, delete_*, schedule_*, and unschedule_*. The few noun-like names such as get_heart_rate and get_connection_status still fit the same predictable convention.
At 26 tools, the surface is heavy for a single assistant, though the broad Garmin training, health, workout, and plan domain justifies many of them. Some tools feel padded or duplicative, especially get_profile versus get_fitness, get_progress versus get_plan, and multiple overlapping health-read tools.
Coverage is broad: workouts can be created, read, updated, scheduled, unscheduled, and deleted; plans can be created, read, and removed; activities can be listed, inspected, and updated; and health, recovery, fitness, shoes, and connection status are covered. Minor gaps remain, such as deleting activities, managing shoes or goals directly, and editing a plan other than through individual workouts or full removal.
Maintenance
Related MCP Connectors
Garmin data in Claude & ChatGPT via the Garmin Health API. OAuth sign-in, no password sharing.
Connect Claude to your Intervals.icu watch data for fitness, workout review, and plan writing.
Garmin data in Claude: 135 tools — activities, sleep, HRV, training, workouts. Free, open source.
Log meals, water, and weight to Garmin Connect from Claude or ChatGPT.
Related MCP Servers
- AlicenseBqualityAmaintenanceConnects Claude Desktop to Garmin Connect, enabling natural language queries of fitness activity data, health metrics, sleep analysis, workout management, and device information with 94 available tools.1101MIT
- FlicenseNot gradedqualityDmaintenanceConnects Garmin watch data to Claude Desktop, allowing users to ask natural language questions about their health and activity data from Garmin Connect.-
- AlicenseBqualityBmaintenanceEnables Claude to access and query your Garmin Connect data—sleep, training, heart rate, and more—through a suite of read-only tools, with an optional write path for creating strength workouts.63MIT
- AlicenseBqualityBmaintenanceConnects Claude to a personal Garmin Connect account so users can ask natural-language questions about sleep, HRV, body battery, stress, heart rate, training readiness and activities, and optionally create or schedule workouts and log weigh-ins. Reads are returned as trimmed summaries with optional full JSON, and writes stay disabled unless explicitly enabled.24MIT