Skip to main content
Glama

garmin-mcp

PyPI Python License: MIT

An MCP server that exposes your Garmin Connect data to Claude as tools. Ask things like "how did I sleep last night?" or "summarise my training load this week" and Claude answers using your real Garmin data instead of you copy-pasting screenshots from the app.

Demo uses sample data. Regenerate with uv run --with pillow python scripts/make_demo_gif.py.

Single-user, and read-only by default — with one opt-in write path for creating strength workouts (see Write tools). Two ways to run it:

Mode

Where it runs

Works with

Setup

Local (stdio)

Your own machine

Claude Desktop

One command

Self-hosted HTTP

Cloud Run (or anywhere)

Claude.ai web, mobile, Desktop

~10 min, ~$0/mo

Tools

Tool

What it returns

get_daily_briefing

One-call morning snapshot — fuses sleep, HRV, Body Battery, readiness, training load, and resting HR (plus RHR vs. your baseline) so Claude can reason across them in a single shot. Each section degrades to null if unavailable.

get_sleep

Sleep duration, stages (deep / light / REM / awake), score, overnight HRV.

get_recent_activities

List of recent activities with type, duration, distance, average heart rate.

get_activity_details

Full metrics for one activity, including splits, HR zones, and power.

get_training_load

Daily training load with acute (ATL), chronic (CTL), ACWR, and current status.

get_training_readiness

Daily readiness score 0-100 with contributing factors (sleep, HRV, recovery).

get_hrv_status

Current HRV status, baseline range, and the last 7 nights of readings.

get_body_battery

Body battery values across the day with min, max, charged, drained.

get_steps_and_calories

Daily step count, distance, calories, floors, and intensity minutes.

get_resting_heart_rate

Resting heart rate trend and average over the requested window.

get_stress

Stress levels across the day and time-in-zone breakdown.

get_respiration

Daily respiration rate: average, min, max, sleep vs waking.

get_fitness_metrics

VO2 max (running/cycling), fitness age, and predicted 5K/10K/half/marathon.

get_personal_records

Personal records across activity types (fastest 1K/5K, longest run, etc.).

get_body_composition

Weight, body fat, and muscle-mass trend over recent days.

get_weekly_summary

Weekly aggregates for steps, stress, or intensity minutes.

get_strength_sets

Set-by-set breakdown of a strength session: exercises, reps, weight, volume.

get_endurance_score

Garmin endurance score with its per-activity-type contributors.

get_hill_score

Garmin hill score (climbing strength + endurance) for a date.

get_activity_weather

Weather recorded during an activity (temp, humidity, wind).

Every response is a Pydantic model serialised to JSON, with null for fields Garmin did not record.

Write tools (opt-in)

These create data in your Garmin account and are disabled unless you set GARMIN_WRITE_ENABLED=1. All other tools stay read-only regardless.

Tool

What it does

preview_strength_workout

Assembles a strength workout and shows the resolved Garmin exercises, per-exercise confidence, warnings, and a confirmation token. Makes no network call.

create_strength_workout

Creates the workout in your Garmin Connect library after you pass the confirmation token from preview_strength_workout.

Workflow: call preview_strength_workout, review the resolved exercises, then pass its confirmation_token to create_strength_workout (the token is bound to the exact workout previewed). The created workout lands in your Garmin Connect library — to get it on the watch, open it in Garmin Connect, tap Send to Device, then sync. Free-text exercise names are matched against Garmin's catalog (data/exercise_taxonomy.json); names that don't map cleanly are flagged in the preview. Deleting and scheduling are intentionally not exposed.

Related MCP server: Garmin Health MCP Server

Quick start — Claude Desktop

Requires Python 3.12+ and uv (install with curl -LsSf https://astral.sh/uv/install.sh | sh).

1. Authorise once

uvx garmin-mcp login

Prompts for your Garmin email, password, and MFA code (if enabled), then saves session tokens to your user cache directory. You won't be prompted again until the tokens eventually expire (typically weeks to months).

2. Add the server to Claude Desktop

Edit claude_desktop_config.json:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • Linux: ~/.config/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "garmin": {
      "command": "uvx",
      "args": ["garmin-mcp"]
    }
  }
}

Restart Claude Desktop. The Garmin tools appear in the tool picker. Ask Claude "what was my resting heart rate this week?" to test.

3. (Optional) Set credentials for unattended re-auth

By default, when Garmin tokens expire you'll see a "saved Garmin session is invalid" error and you'll need to re-run uvx garmin-mcp login. To skip that step, put your credentials in the config so the server can silently re-authenticate:

{
  "mcpServers": {
    "garmin": {
      "command": "uvx",
      "args": ["garmin-mcp"],
      "env": {
        "GARMIN_EMAIL": "you@example.com",
        "GARMIN_PASSWORD": "your-garmin-password"
      }
    }
  }
}

Anyone with read access to this file can see these credentials.

Where session tokens are stored

garmin-mcp login writes session tokens to your platform's user cache directory:

OS

Path

Linux

~/.cache/garmin-mcp/garth/

macOS

~/Library/Caches/garmin-mcp/garth/

Windows

%LOCALAPPDATA%\garmin-mcp\Cache\garth\

Delete the garth/ directory to "log out" of Garmin.

Self-hosted HTTP (Claude.ai web/mobile)

If you want the connector available from Claude.ai on the web or your phone, run the same server in HTTP mode. The serve subcommand wraps it in an OAuth 2.1 layer with PKCE and Dynamic Client Registration so Claude.ai can connect to it as a custom connector.

See DEPLOY.md for the Cloud Run walkthrough. The short version:

docker build -t garmin-mcp .
docker run --rm -p 8080:8080 \
  -e MCP_ISSUER_URL=http://localhost:8080 \
  -e MCP_AUTH_PASSWORD=$(openssl rand -base64 24) \
  -e JWT_SECRET=$(openssl rand -base64 48) \
  -e GARMIN_EMAIL=you@example.com \
  -e GARMIN_PASSWORD=your-garmin-password \
  garmin-mcp

For Cloud Run, the always-free tier covers personal usage. Expect under $1/month.

How auth works (HTTP mode)

The server is its own OAuth 2.1 authorisation server. When you add the connector in Claude.ai, Claude registers itself using RFC 7591 Dynamic Client Registration, then sends you through a PKCE-protected flow. You enter the password set as MCP_AUTH_PASSWORD, and the server issues a 24-hour JWT access token plus a refresh token that rotates on every use.

This is intentionally minimal: one password, one user. Anyone with the password can read your Garmin data.

Data availability

Garmin returns sparse data depending on which watch you wear, how long you've worn it, and what features your model supports. Every tool follows the same convention: when a field isn't recorded, the response carries null for that field (and often a note explaining the absence) rather than erroring.

A few specific cases worth knowing about:

  • get_training_load.current_status = "NO_STATUS_2" and get_hrv_status.status = "NONE" mean Garmin doesn't have enough recent activity history to compute the metric. They fill in naturally after ~7 consecutive days of sustained activity or watch wear.

  • VO2 max only updates after qualifying activities (runs, rides). get_fitness_metrics walks back up to 7 days to surface your most recent reading rather than returning null on a rest day.

  • get_stress zone-minute breakdown (rest_minutes, low_minutes, etc.) can come back null on partial-data days even though avg_stress and the timeline are populated.

  • HRV, training readiness, endurance score, hill score, and fitness age all require a recent compatible watch (Fenix 6+ / Forerunner 245+ / similar). Older watches simply won't report them.

If a tool seems to return less than you'd expect, check the same metric in the Garmin Connect app or on connect.garmin.com for the same date. If Garmin shows it there and we return null, that's a parser bug — file an issue with the date and the field name and we can usually map it in a follow-up release.

Security caveats

  • This is single-user software. Don't run it as a shared service for multiple Garmin accounts — you'd be holding other people's credentials, and it likely violates Garmin's ToS.

  • Garmin credentials and session tokens live on your local machine. Treat any password you put in a JSON config file as compromised in the long term — use a dedicated Garmin account if that's a concern.

  • The unofficial garminconnect library can break when Garmin changes their internal API. If a tool starts returning empty data, check that package's changelog.

  • In HTTP mode, registered DCR clients and refresh tokens live in process memory and disappear on restart. Access tokens (JWTs) survive because they are stateless.

  • Read-only by default. The one write path — creating strength workouts — is off unless you set GARMIN_WRITE_ENABLED=1, and is enforced at the client layer by a method allowlist (only upload_workout is writable; no activity upload, profile edits, deletes, or scheduling). Each create requires a preview→token confirmation, and in HTTP mode the server refuses to start with writes enabled but auth disabled.

Project layout

garmin-mcp/
├── pyproject.toml
├── Dockerfile
├── README.md
├── DEPLOY.md
└── src/
    └── garmin_mcp/
        ├── __init__.py
        ├── __main__.py        # python -m garmin_mcp -> CLI
        ├── cli.py             # argparse entry: stdio / serve / login
        ├── server.py             # FastMCP app, tools, login UI
        ├── garmin_client.py      # garminconnect wrapper (read allowlist + write gate)
        ├── auth.py               # OAuth 2.1 provider
        ├── cache.py              # TTL cache
        ├── paths.py              # token directory resolution
        ├── exercise_resolver.py  # free-text exercise -> Garmin (category, name)
        ├── strength_builder.py   # strength workout spec -> Garmin payload
        ├── models.py             # Pydantic response models
        └── data/
            └── exercise_taxonomy.json   # Garmin's exercise catalog (resolver data)

Contributing

git clone https://github.com/Tyler-Irving/garmin-mcp.git
cd garmin-mcp
uv sync --extra dev

uv run garmin-mcp login                       # one-time interactive login
uv run mcp dev src/garmin_mcp/server.py       # inspect tools in MCP Inspector
uv run garmin-mcp                             # stdio mode
uv run garmin-mcp serve                       # HTTP mode

uv run pytest                                 # tests
uv run ruff check . && uv run ruff format --check .
uv run mypy src tests

Acknowledgements

Available Tools

28 tools
create_running_workoutA

Create a structured running workout in your Garmin Connect library (a WRITE).

Supports warmup/cooldown/interval/recovery steps, repeat groups for intervals, and optional pace targets ('M:SS' per km). Requires writes to be enabled (GARMIN_WRITE_ENABLED) and a matching confirmation_token from preview_running_workout. The workout lands in your library — get it on the watch via schedule_workout (syncs automatically for that date) or "Send to Device" in Garmin Connect.

Args: workout: the workout definition (same shape as preview). confirmation_token: token returned by preview_running_workout. confirm: dev/stdio only (no JWT secret) — set True to confirm.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNo
workoutYes
confirmation_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYes
statusYes
workout_idNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It discloses the write nature, prerequisite token, and that the workout lands in the library. Also notes the dev-only confirm flag. While not exhaustive (e.g., reversibility, failure modes), it covers the critical behavioral traits for safe usage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is well-structured with an overview and an Args section. Sentences are purposeful; no fluff. Although moderately long, it earns its length given the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complex nested input schema and the write operation, the description fully covers the required workflow (preview → confirm), mentions prerequisites, and references relevant siblings. The output schema exists, so no need to detail return values. Comprehensive for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, meaning the description text must compensate. It does: explains workout shape matches preview, clarifies confirmation_token's source, and details the confirm parameter (dev-only, no JWT secret). Adds meaning beyond the bare schema definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description explicitly states it creates a structured running workout in Garmin Connect library, with a clear verb-resource pair. It distinguishes from sibling tools like preview_running_workout (preview only) and schedule_workout (scheduling), and emphasizes that this is a WRITE operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance: requires writes enabled and a confirmation token from preview_running_workout, and explains how to get the workout onto the watch via schedule_workout. Clearly differentiates from preview and scheduling workflows.

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 workout in your Garmin Connect library (a WRITE).

Requires writes to be enabled (GARMIN_WRITE_ENABLED) and a matching confirmation_token from preview_strength_workout (it binds to the exact workout previewed). The workout lands in your library — it reaches the watch only after you "Send to Device" in Garmin Connect and sync.

Args: workout: the workout definition (same shape as preview). confirmation_token: token returned by preview_strength_workout. confirm: dev/stdio only (no JWT secret) — set True to confirm.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNo
workoutYes
confirmation_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYes
statusYes
verifiedYesTrue if the upload round-tripped with no blank exercises.
workout_idNo
blank_stepsNoStep orders Garmin blanked (should be empty).

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It discloses that the tool is a write operation, requires confirmation token, and that the workout lands in library but not immediately on watch. Could mention idempotency or side effects, but sufficient context is given.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with clear bullet points and separate sections. Every sentence adds value, no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (nested schema, 3 params, write operation), the description covers the workflow, prerequisites, parameter meanings, and caveats. Output schema exists, so lack of return value explanation is acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Description clarifies that 'workout' shape is same as preview, 'confirmation_token' binds to exact preview, and 'confirm' is for dev/stdio only. The input schema descriptions are detailed, but the description adds crucial behavioral context beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it creates a strength workout in Garmin Connect library, explicitly calling it a WRITE. This distinguishes it from the sibling tool 'preview_strength_workout', which is for previewing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states prerequisites: writes must be enabled and a matching confirmation_token from preview_strength_workout is required. Also explains the workflow: preview then create, and that the workout reaches the watch only after manual send/sync.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_workoutA

Delete ONE workout from your Garmin Connect library (a WRITE, irreversible).

Preview-then-confirm: call without a token first — that call deletes nothing and returns the workout's name plus a confirmation_token. Review the name, then call again with the token to actually delete. Deleting from the library also removes the workout from the watch on its next sync. There is no bulk delete; confirm each workout individually.

Args: workout_id: id from list_workouts. confirmation_token: token from the preview call for this same id. confirm: dev/stdio only (no JWT secret) — set True to confirm.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNo
workout_idYes
confirmation_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNo
statusYes
deletedYesFalse on the preview call; True once actually deleted.
workout_idYes
confirmation_tokenNoOn a preview call: pass this back to delete_workout to confirm.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden, and it delivers. It discloses that the preview call 'deletes nothing', that the operation is a WRITE and irreversible, and the cross-cutting side effect 'Deleting from the library also removes the workout from the watch on its next sync.' The dev-only semantics of the confirm flag are also surfaced. This is exactly the critical behavioral disclosure a delete operation needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the single most important fact (WRITE, irreversible), followed by a tight narrative of the handshake, then the side effect, then the constraint. The three-sentence body is efficient and every clause earns its place. It drops to a 4 only because the closing Args block makes the whole thing slightly longer than the leanest possible version, though the zero schema coverage justifies that length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation with a destructive edge, the description covers the safety mechanism (token handshake), the failure mode it prevents (accidental deletion without review), the side effect on the watch sync, and the environment constraint (dev/stdio only). An output schema exists, so return values don't need documenting. There is no material gap in state, effects, or prerequisites.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does. The Args section maps each parameter to its origin: 'workout_id' from list_workouts, 'confirmation_token' from the preview call bound to 'this same id', and 'confirm' qualified as a dev/stdio-only flag. This adds meaning well beyond the bare schema and prevents the classic bug of the agent passing a token as a workout_id.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource+scope: 'Delete ONE workout from your Garmin Connect library (a WRITE, irreversible).' The qualifier 'ONE' combined with 'no bulk delete' directly distinguishes it from any batch-style sibling and from the schedule/unschedule pair. The irreversibility cue adds important grading context in the first sentence.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly explains the two-call preview-then-confirm protocol, when the token is needed, and the 'no bulk delete' constraint that tells the agent it must loop. It explicitly cautions 'confirm each workout individually.' However, it never explicitly contrasts with the sibling unschedule_workout, so the 4 reflects 'clear context, no named alternative'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_activity_detailsA

Detailed metrics for one activity, including splits and HR zones.

Args: activity_id: The activity's numeric Garmin ID, as returned by get_recent_activities.

ParametersJSON Schema
NameRequiredDescriptionDefault
activity_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNo
splitsNo
caloriesNo
hr_zonesNo
avg_powerNo
max_powerNo
start_timeNo
activity_idYes
activity_typeNo
avg_speed_mpsNo
max_speed_mpsNo
avg_heart_rateNo
max_heart_rateNo
distance_metersNo
duration_secondsNo
normalised_powerNo
elevation_gain_metersNo
elevation_loss_metersNo
training_effect_aerobicNo
training_effect_anaerobicNo

TDQS

A3.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, and the description does not disclose any behavioral traits such as side effects, permissions, or rate limits. It only states the functionality without addressing safety or resource impact, which is a notable gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two sentences: the first states the purpose, and the second defines the parameter. No extraneous information is present, and it is front-loaded effectively.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists (so return values are defined there), and the tool has only one parameter, the description adequately covers what the tool does and how to use it. It could be more complete by mentioning error handling or scope (e.g., user ownership), but overall it is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage for parameters, but the description adds meaningful context: 'activity_id: The activity's numeric Garmin ID, as returned by get_recent_activities.' This clarifies the source and format of the parameter, beyond what the schema title 'Activity Id' provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns 'Detailed metrics for one activity, including splits and HR zones,' which specifies the verb (retrieve details) and resource (one activity), distinguishing it from sibling tools like get_recent_activities that list activities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides guidance on obtaining the activity_id ('as returned by get_recent_activities'), but does not explicitly state when to use this tool versus alternatives or include any when-not-to-use scenarios. The usage is implied for when detailed metrics of a specific activity are needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_activity_weatherA

Weather conditions recorded during an activity (temp, humidity, wind).

Units follow your Garmin account's measurement system (US accounts report degrees Fahrenheit and mph).

Args: activity_id: The activity's numeric Garmin ID, from get_recent_activities.

ParametersJSON Schema
NameRequiredDescriptionDefault
activity_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
tempNo
dew_pointNo
wind_gustNo
wind_speedNo
activity_idYes
descriptionNoe.g. Fair, Cloudy, Rain.
observed_atNo
station_nameNo
apparent_tempNo
relative_humidityNo
wind_direction_compassNo
wind_direction_degreesNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It discloses that units follow the Garmin account's measurement system, which is useful behavioral context. However, it doesn't mention any side effects (likely none for a read operation), error conditions, or what happens if the activity has no weather data. The description adds some value but lacks depth.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured. It starts with a clear one-sentence summary, then provides a note about units, and finally documents the parameter. Every sentence adds value, and it's appropriately sized for a simple tool with one parameter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one parameter, no annotations, output schema exists), the description is fairly complete. It explains the data returned (temp, humidity, wind) and the unit system. It doesn't detail the output structure, but the output schema likely covers that. The only gap is not mentioning what happens if no weather data is available, but that's minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains that activity_id is the numeric Garmin ID and references get_recent_activities for obtaining it, which adds meaning beyond the schema's bare type definition. This is helpful for the agent to know how to source the parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves weather conditions recorded during an activity, listing specific data types (temp, humidity, wind). It distinguishes from siblings by focusing on weather data, which is unique among the listed tools. However, it doesn't explicitly contrast with any sibling, so it's clear but not fully differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage by requiring an activity_id from get_recent_activities, which provides context on when to use it (after fetching activities). It doesn't explicitly state when not to use it or mention alternatives, but the dependency on get_recent_activities gives some guidance. No explicit exclusions or alternative tools are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_body_batteryA

Body battery values across the day, plus min, max, charged, and drained totals.

Args: date: Calendar date in YYYY-MM-DD format. Defaults to today.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dateYes
chargedNo
drainedNo
timelineNo
max_valueNo
min_valueNo
current_valueNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that the output includes min, max, charged, and drained totals, and that the date parameter defaults to today. However, no annotations exist, and the description does not cover potential errors, permissions, or response format beyond the output schema. It is adequate but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two sentences, no redundant information. It could be slightly more structured (e.g., bullet points), but it is efficient and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has an output schema (so return values need not be explained) and only one parameter, the description covers the essential purpose and parameter format. It omits potential edge cases (e.g., no data for a date) but is complete enough for a simple read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema shows one optional 'date' parameter with no description, but the tool description adds format ('YYYY-MM-DD') and default behavior ('Defaults to today'). With 0% schema description coverage, this adds meaningful context beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves 'Body battery values across the day, plus min, max, charged, and drained totals.' This specific verb+resource combination distinguishes it from sibling tools like get_sleep or get_steps_and_calories.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus alternatives. The description only states what it does, without mentioning prerequisites, exclusions, or comparison to other tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_body_compositionA

Weight, body fat, and muscle-mass trend over recent days.

Returns one row per day Garmin has a reading for, plus the latest weight and average over the window.

Args: end_date: End of the window in YYYY-MM-DD format. Defaults to today. days: Window size in days. Capped at 90.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
end_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
daysNo
noteNo
avg_weight_kgNo
latest_weight_kgNo

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It discloses the return format (one row per day, latest weight, average) and capping at 90 days, but omits other behavioral traits like authentication or idempotency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Reasonably concise, covering purpose and args in a few sentences. Slightly verbose but no wasted words. Front-loaded with main purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 optional params) and presence of output schema, the description adequately explains inputs and output shape. Lacks mention of potential errors or advanced usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so description must compensate. It does so by explaining both parameters: end_date format with default, days default and cap, adding clarity beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it returns weight, body fat, and muscle-mass trend over recent days. It differentiates from siblings like get_sleep or get_body_battery by focusing on body composition, though it doesn't explicitly contrast with similar tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: use when you need body composition data. No explicit guidance on when not to use or alternatives among siblings, leaving the agent to infer.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_daily_briefingA

One-call morning snapshot: sleep, HRV, Body Battery, readiness, load, and RHR.

Fuses the individual recovery and training-load tools into a single payload so you can reason across them in one shot instead of making six separate calls. Each section is fetched independently and concurrently; a section that fails comes back null and is named in sections_unavailable rather than failing the whole briefing. Also returns rhr_vs_baseline_bpm, the most recent resting HR relative to its trailing average.

The server returns facts only and computes no training advice — interpret the numbers yourself (e.g. weigh readiness, HRV status, and Body Battery together).

Args: date: Calendar date in YYYY-MM-DD format. Defaults to today. The sleep, Body Battery, and training-readiness sections honour this date; the HRV, training-load, and resting-HR sections always report their own most-recent trailing window. For the default (this-morning) call everything lines up; passing a past date yields a mixed snapshot.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
hrvNo
dateYesCalendar date the briefing is anchored to, YYYY-MM-DD.
sleepNo
body_batteryNo
training_loadNo
resting_heart_rateNo
training_readinessNo
rhr_vs_baseline_bpmNoMost recent resting HR minus the trailing average of the prior days in the window. Positive means elevated vs baseline (often a recovery or illness signal). Null when fewer than two days of data exist.
sections_unavailableNoNames of sections that could not be fetched for this briefing.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of disclosure. It fully describes the independent, concurrent fetching behavior, the fact that failed sections return null and are named in sections_unavailable rather than failing the whole call, and the mixed-date semantics. It also states that no advice is computed, setting clear expectations about the output's scope.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: it opens with a punchy summary, then explains the aggregation benefit, error handling, and parameter semantics. Every sentence adds essential information—there is no fluff. The length is justified by the need to explain subtle behaviors like partial failures and date handling, making it concise despite its word count.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (a composite of six data sources) and the existence of an output schema, the description provides sufficient context for an agent to understand the tool's nature, its error tolerance, and how to interpret results. It covers the main integration points and caveats without needing to enumerate return fields, which the output schema presumably handles.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides zero description coverage for the 'date' parameter. The description compensates thoroughly by specifying the format (YYYY-MM-DD), its default (today), and exactly which sections honor it versus which always report trailing windows. This gives the agent complete instructions on how to set the parameter correctly for different query intents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose as a 'One-call morning snapshot' aggregating six specific metrics (sleep, HRV, Body Battery, readiness, load, RHR). It explicitly distinguishes itself from sibling tools by noting it fuses the individual recovery and training-load tools into a single payload, making it obvious how it differs from get_sleep, get_body_battery, etc.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit guidance on when to use this tool ('instead of making six separate calls') and explains the intended use case (reasoning across multiple metrics in one shot). It also clarifies that the server returns facts only and no training advice, which subtly tells the agent not to expect recommendations. The detailed date behavior further specifies how to use the parameter correctly across different scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_endurance_scoreA

Garmin endurance score with its activity-type contributors.

The endurance score reflects accumulated aerobic capacity across activities. It only updates after qualifying activities, so a given day may have no value.

Args: date: Calendar date in YYYY-MM-DD format. Defaults to today.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dateYes
noteNo
contributorsNo
overall_scoreNoGarmin endurance score.
classificationNoGarmin classification band id (higher is more trained).
gauge_lower_limitNo
gauge_upper_limitNo
feedback_phrase_idNo

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden. It discloses that the score may be absent for a given day due to qualifying activity requirements, which is a useful behavioral trait. However, it doesn't mention read-only status, potential errors, or other operational details beyond that single caveat, so transparency is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured: a one-line purpose, a short explanation, and a parameter block. Every sentence adds value, with no fluff or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity and the presence of an output schema (which likely details the result structure), the description covers purpose, parameter, and a key edge case (missing values). It might benefit from elaborating what 'activity-type contributors' means or the score's range, but the core functionality is sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description fully explains the single parameter: 'date' in YYYY-MM-DD format with a default of today. This is essential because the input schema only lists the property without any documentation. The description adds all needed semantic meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns the Garmin endurance score with activity-type contributors. The verb 'get' plus the resource 'endurance score' is specific, and it distinguishes from sibling tools like get_hill_score and get_training_load by focusing on a distinct metric.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains that the score only updates after qualifying activities, implying that on some days no value may exist. This gives context for when to expect data and why results may be absent, though it doesn't explicitly compare with alternatives. The context makes appropriate use clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_fitness_metricsA

VO2 max (running and cycling), fitness age, and predicted race times.

Combines Garmin's "max metrics" tile (VO2 max, fitness age) with current race-time predictions for 5K, 10K, half marathon, and marathon.

Args: date: Calendar date for the VO2 max snapshot in YYYY-MM-DD format. Defaults to today.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dateYes
noteNo
fitness_ageNo
vo2_max_cyclingNoml/kg/min for cycling.
vo2_max_runningNoml/kg/min for running.
race_predictionsNo

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden for behavioral disclosure. It explains the output content (VO2 max, fitness age, race times) and the date parameter defaults, but does not mention side effects, required permissions, data freshness, or error conditions. Adequate but lacks depth.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with a brief summary followed by an Args section. It avoids unnecessary words. However, the Args block somewhat duplicates information already present in the schema (though adds format context). Overall well-structured and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema (return value details not needed in description), the description adequately covers the tool's purpose. However, it lacks information about edge cases (e.g., no data for the given date), potential errors, or the relationship between the date and race predictions. Could be more complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has zero description coverage, but the function description includes an Args block that explains the 'date' parameter's format (YYYY-MM-DD) and default (today). This adds significant semantic value beyond the schema's type definition. The explanation is clear and helpful.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly specifies that the tool retrieves VO2 max (running and cycling), fitness age, and predicted race times for 5K, 10K, half marathon, and marathon. It uses specific verb+resource structure and distinguishes itself from sibling tools (e.g., strength workouts, sleep) by focusing on fitness metrics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when fitness metrics like VO2 max and race times are needed, but it does not provide explicit guidance on when to use this tool versus its siblings, nor does it state conditions or alternatives. No 'when to use' or 'when not to use' directives are present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_hill_scoreA

Garmin hill score (climbing strength + endurance) for a date.

Combines a strength and an endurance component into an overall hill score. Requires qualifying climbing efforts, so it is often empty for flat-terrain athletes — an empty result is reported via note rather than an error.

Args: date: Calendar date in YYYY-MM-DD format. Defaults to today.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dateYes
noteNo
vo2_maxNo
overall_scoreNo
strength_scoreNo
endurance_scoreNo
classification_idNo
feedback_phrase_idNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It transparently explains that the score combines strength and endurance, requires qualifying climbing efforts, and returns an empty result via `note` rather than an error. This is valuable contextual insight beyond a simple 'get' operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured: a one-line summary, a brief explanatory note, and an Args section. Every sentence earns its place, and the formatting improves readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema available, the description does not need to explain return values. It covers the core purpose, the empty-result behavior, and parameter semantics, making it complete for a simple retrieve-by-date tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds meaning beyond the bare schema by stating the date format (YYYY-MM-DD) and saying it defaults to today. However, the schema default is null, making the 'Defaults to today' claim ambiguous or potentially inconsistent with the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as retrieving a Garmin hill score for a date, and explains that it combines strength and endurance components. This distinguishes it from sibling tools like get_endurance_score and other metric-specific getters.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use this tool (to get a hill score) and provides useful context about qualifying climbing efforts and empty results for flat-terrain athletes. However, it does not explicitly mention alternatives or state when not to use this tool versus other metrics.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_hrv_statusA

Current HRV status, baseline range, and the last 7 nights of readings.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusNoOverall HRV status, such as BALANCED or LOW.
feedbackNo
last_7_daysNo
weekly_avg_msNo
baseline_low_msNo
baseline_high_msNo
last_night_avg_msNo

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral traits. It implies a read-only operation but does not explicitly confirm no side effects, whether authentication is required, or if the data is from the latest sync. The limited text fails to disclose important behavioral context beyond the basic data return.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loades the key output ('Current HRV status') and succinctly lists all return components. No redundant words or extraneous information; every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has zero parameters and an output schema exists, the description adequately covers the main return values. It mentions three key data types (status, baseline, readings). However, it lacks details on how to interpret the status or baseline, and does not confirm if the output schema includes additional fields. But with low complexity, this is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has no parameters and schema coverage is 100%, so the baseline is 4. The description adds value by specifying what the tool returns (current status, baseline, last 7 nights), which is not obvious from the empty schema. It provides meaningful context beyond the schema structure.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the resource (HRV status) and the specific data returned (current status, baseline range, last 7 nights). The verb is implied by the tool name 'get'. This clearly distinguishes it from sibling tools like get_sleep or get_stress, which cover other health metrics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. The description only lists what data is returned, without context on scenarios (e.g., checking readiness or recovery) or exclusions (e.g., not for real-time monitoring). Sibling tools exist for related metrics, but no comparison is made.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_personal_recordsA

Personal records across activity types (fastest 1K/5K/10K, longest run, etc.).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
recordsNo

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description must stand alone. It indicates the return is personal records across activity types, but does not disclose if records are all-time, how they are computed, or any limitations (e.g., real-time vs cached). Adequate but not detailed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence of 14 words, front-loaded with purpose. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has no parameters, an output schema exists (documenting return structure), and the description provides concrete examples. For a simple data retrieval, this is sufficient. Could mention whether records are per user or global, but not critical.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0 parameters, so there are no parameters to document. The description adds value by listing examples of records returned. Per guidance, baseline for 0 params is 4, and this description meets that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves personal records across activity types, with specific examples (1K/5K/10K, longest run). This distinguishes it from all sibling tools, which deal with sleep, HRV, activities, etc.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. Sibling tools are diverse (sleep, HRV, activities) so there is no direct overlap, but the description does not explicitly exclude any context or mention prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_recent_activitiesA

List recent activities with type, duration, distance, and average heart rate.

Args: limit: How many of the most recent activities to return. Capped at 50.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
activitiesYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the burden. 'List' clearly indicates a read-only operation, and the cap on limit prevents overload. However, it could explicitly state non-destructive behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: two sentences plus a parameter description. The main purpose is front-loaded, and every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a single parameter, an output schema for return values, and no nested objects, the description covers all necessary information. No gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite a reported schema description coverage of 0%, the description fully documents the 'limit' parameter, explaining its purpose and a cap of 50. This compensates well for the missing schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List recent activities' with specific fields (type, duration, distance, heart rate). This verb-resource combination differentiates it from sibling tools like get_activity_details which provides detailed data for a single activity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use or when-not-to-use guidance is given. The description implies usage for a quick overview of recent activities, but does not contrast with alternative tools like get_activity_details for fuller details.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_respirationA

Daily respiration rate: average, min, max, and waking vs. sleeping averages.

Args: date: Calendar date in YYYY-MM-DD format. Defaults to today.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dateYes
noteNo
avg_breaths_per_minNo
lowest_breaths_per_minNo
highest_breaths_per_minNo
avg_sleep_breaths_per_minNo
avg_waking_breaths_per_minNo

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden for behavioral disclosure. It describes the output metrics well (average, min, max, waking vs. sleeping) but does not mention that the tool is read-only, data freshness, or any permissions needed. This is adequate but not thorough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, with a single sentence summarizing the output followed by a clear parameter definition. No wasted words; every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has an output schema (not shown), the description does not need to detail return values. It already provides a good overview of the metrics returned. The context is simple (one optional parameter), and the description is complete enough for an AI agent to understand what the tool does and how to use it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is one optional parameter 'date' with 0% schema description coverage. The description compensates fully by specifying the format ('YYYY-MM-DD') and default behavior ('Defaults to today'), adding significant meaning beyond the raw schema type.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns daily respiration rate with specific metrics (average, min, max, waking vs. sleeping averages). The verb 'get' and resource 'respiration' are explicit. It distinguishes from sibling tools like get_sleep and get_hrv_status which cover different health metrics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. The description only explains what it does, not context or prerequisites. For a health metrics tool, mentioning that it provides respiratory data as opposed to heart rate or sleep would help, but is absent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_resting_heart_rateA

Resting heart rate trend over the last days days.

Args: days: How many recent days to include. Capped at 28.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
daysYes
avg_rhr_bpmNo

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure. It mentions the cap of 28 days, which is a useful constraint, but does not describe whether the tool is read-only, what side effects exist, or any rate limits. The read-only nature can be inferred from 'get' but is not explicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is exceptionally concise: one sentence stating the purpose, followed by a brief structured Args section. Every word earns its place. No redundant phrases or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (single parameter, obvious read operation) and the presence of an output schema, the description is sufficiently complete. It covers the main purpose and the parameter constraint. A minor gap is the lack of detail on trend format, but this is acceptable with an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite the schema having no description for the parameter 'days', the tool description adds a clear explanation: 'How many recent days to include. Capped at 28.' This fully compensates for the missing schema description and provides practical usage semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool retrieves the 'resting heart rate trend over the last days.' The verb 'get' and resource 'resting heart rate trend' are specific and distinct from sibling tools like get_hrv_status or get_sleep. No ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It does not mention prerequisites, limitations, or scenarios where another tool would be more appropriate. Contextual usage remains completely implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_sleepA

Sleep duration, sleep stages, sleep score, and overnight HRV.

Args: date: Calendar date in YYYY-MM-DD format. Defaults to last night (yesterday). Pass today's date to get the most recent recorded sleep when you wake up.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dateYesCalendar date for the sleep period, YYYY-MM-DD.
noteNoSet when no sleep data was found for the date.
avg_spo2No
sleep_scoreNoGarmin sleep score, 0 to 100.
awake_secondsNo
sleep_qualityNoQualitative label such as GOOD or POOR.
avg_respirationNo
rem_sleep_secondsNo
deep_sleep_secondsNo
light_sleep_secondsNo
total_sleep_secondsNo
avg_overnight_hrv_msNoAverage overnight HRV in milliseconds.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the data returned (duration, stages, score, HRV), but does not mention behavioral traits like error handling for missing dates, authentication needs, or rate limits. For a read-only tool, this is minimally adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loading the key data items, and includes parameter details in a docstring style. It is efficient with words, but the parameter details could be integrated more seamlessly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema (not shown but indicated), the description need not explain return values, though it does mention returned data. It explains the input parameter thoroughly. It is fairly complete for a simple retrieval tool, though it could mention what happens if no sleep data exists for the date.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage for the date parameter. The description compensates fully by explaining the format (YYYY-MM-DD), default behavior (last night/yesterday), and a use case (today's date for most recent sleep). This adds significant meaning beyond the schema's type definition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly specifies the verb (get) and resource (sleep data including duration, stages, score, HRV), and it distinguishes itself from sibling tools that deal with other health metrics (e.g., get_steps_and_calories, get_stress).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when to use the tool: defaults to last night, and suggests using today's date to get most recent sleep on waking. However, it does not explicitly exclude cases or mention alternatives, though among siblings it is unique.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_steps_and_caloriesA

Daily step total, distance, calories, floors, and intensity minutes.

Args: date: Calendar date in YYYY-MM-DD format. Defaults to today.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dateYes
step_goalNo
total_stepsNo
bmr_caloriesNo
floors_climbedNo
total_caloriesNo
active_caloriesNo
total_distance_metersNo
moderate_intensity_minutesNo
vigorous_intensity_minutesNo

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations available, the description carries the full burden. It fails to mention that this is a read-only operation, any authentication requirements, rate limits, or potential gaps in data (e.g., missing values if device not worn). Merely stating 'daily...' is insufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and direct, listing metrics first then parameter details. It could be slightly more structured (e.g., bullet points), but every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so explaining return values is not required. The description covers the tool's primary purpose and the single parameter. Minor missing context like user scope or temporal range are not critical for this simple data retrieval tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description fully explains the sole parameter: format ('YYYY-MM-DD'), meaning (calendar date), and default (today). This adds significant value beyond the schema's empty definition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly lists the metrics returned: daily step total, distance, calories, floors, and intensity minutes. This clearly distinguishes it from sibling tools like get_sleep or get_resting_heart_rate, which cover different health metrics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives (e.g., get_recent_activities for overall activity). The description does not specify context like data availability or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_strength_setsA

Set-by-set breakdown of a logged strength session: exercises, reps, and weight.

Parses Garmin's recorded sets for one strength_training activity into working sets (with the recognised exercise, rep count, and load) plus a per-exercise rollup and total training volume. Rest periods are included and flagged. Sets Garmin could not classify come back with a null exercise name.

Args: activity_id: The activity's numeric Garmin ID, from get_recent_activities.

ParametersJSON Schema
NameRequiredDescriptionDefault
activity_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
setsNo
exercisesNo
total_repsNo
activity_idYes
total_volume_kgNoSum of reps x weight across working sets, in kg.
total_active_setsNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of disclosure. It explicitly states that rest periods are included and flagged, and that unclassified sets return a null exercise name. It also describes the output includes per-exercise rollup and total volume, adding valuable behavioral context beyond 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a focused paragraph that front-loads the core purpose, then details output components and edge cases. It is efficient without being terse, and the Args section provides clear parameter context. No filler, though some redundancy in describing the breakdown could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (one parameter, clear output structure) and the presence of an output schema, the description is reasonably complete. It covers input provenance, output content (working sets, rollup, volume, rest periods, nulls). It does not explicitly mention error cases or performance, but for a retrieval tool this is acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, activity_id, is described as 'The activity's numeric Garmin ID, from get_recent_activities.' This adds semantic meaning (numeric ID, source) that the schema (just a string type) lacks. With 0% schema description coverage, this compensation is essential and effective, though it could specify format (e.g., no URL encoding) but is sufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it provides a 'set-by-set breakdown of a logged strength session' with exercises, reps, and weight. This is a specific verb+resource and distinguishes from siblings like get_activity_details (which likely returns general activity info) and preview_strength_workout (which is for planned workouts).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains it parses Garmin's recorded sets for a 'strength_training' activity and mentions the activity_id comes from get_recent_activities, giving context on how to obtain the required parameter. However, it does not explicitly state when not to use this tool versus alternatives, though the strength-specific focus implies it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_stressB

Stress levels across the day with average, max, and time-in-zone breakdown.

Args: date: Calendar date in YYYY-MM-DD format. Defaults to today.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dateYes
timelineNo
avg_stressNo
max_stressNo
low_minutesNo
high_minutesNo
rest_minutesNo
medium_minutesNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It discloses that the tool returns average, max, and time-in-zone breakdown, but does not cover permissions, data freshness, or handling of missing data. Adequate but not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences clearly explaining the tool's output and parameter, with no wasted words. Well-structured and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, so return values are presumably documented there. However, description only mentions three components, lacking explanation of time-in-zone or constraints. Adequate but could elaborate more.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% (no descriptions in schema), but the description explicitly documents the 'date' parameter format (YYYY-MM-DD) and default (today), adding value beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it retrieves stress levels with average, max, and time-in-zone breakdown, providing a specific verb and resource. However, it does not differentiate from sibling tools like get_sleep or get_hrv_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives, and no exclusions or prerequisites mentioned. The description lacks context for appropriate usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_training_loadB

Daily training load with acute and chronic load and current status.

Args: days: Number of recent days to summarise. Capped at 28.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
daysYes
acwr_statusNoGarmin's qualitative ACWR band, e.g. OPTIMAL, LOW, HIGH.
current_atlNo
current_ctlNo
acwr_percentNoAcute:chronic workload ratio as a percentage (Garmin's load ratio).
current_statusNo

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It mentions the 'days' parameter is capped at 28, which is useful, but it doesn't disclose whether this is a read-only operation, what the output structure looks like, or any side effects. For a data retrieval tool, the lack of explicit read-only confirmation is a gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded with the core purpose. The Args section is clear and minimal. No wasted words, though it could be slightly more structured with a 'Returns' section.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has an output schema (which likely describes the return structure), the description doesn't need to explain return values. However, with no annotations and a single parameter, the description is adequate but lacks context on when to use it versus similar metrics tools. The cap at 28 is a good detail, but more behavioral context would improve completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description does explain the 'days' parameter ('Number of recent days to summarise. Capped at 28.'), adding meaning beyond the schema's type/default. However, it doesn't clarify the default behavior (7 days) or the exact format of the output, so it partially compensates but not fully.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns 'Daily training load with acute and chronic load and current status', which is a specific resource (training load) with a clear scope (daily, acute/chronic/status). It distinguishes from siblings like get_training_readiness and get_fitness_metrics by focusing on load metrics, though it doesn't explicitly name alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage by stating it summarizes recent days, but it doesn't explicitly say when to use this over get_training_readiness or get_fitness_metrics. The 'days' parameter is explained, but no guidance on typical use cases or exclusions is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_training_readinessA

Daily training readiness score (0-100) with contributing factors.

The score reflects how prepared the user is to train, drawing on sleep, HRV status, recovery time, and recent training load.

Args: date: Calendar date in YYYY-MM-DD format. Defaults to today.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dateYes
noteNo
levelNoGarmin readiness level, e.g. LOW, MODERATE, HIGH, PRIME.
scoreNo0-100 training readiness score.
factorsNo
acute_loadNo
hrv_statusNo
sleep_scoreNo
feedback_longNo
feedback_shortNo
stress_historyNo
recovery_time_hoursNo
sleep_history_scoreNo

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It mentions the score range and contributing factors but lacks details on staleness, required permissions, or whether it modifies state. It is a read-only metric, but more context on computation timing would help.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is brief and front-loaded with the score range and factors. Every sentence is meaningful. The args section is clearly separated and concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists (not shown), the description doesn't need to detail return structure. It mentions contributing factors, which is useful. With only one optional parameter, the description is nearly complete, though it could hint at what the output looks like.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description adds value by specifying the date format (YYYY-MM-DD) and default behavior (today). This compensates for the lack of schema description and provides clear parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it returns a 'daily training readiness score (0-100) with contributing factors' and specifies the factors (sleep, HRV, recovery time, training load). This distinguishes it from sibling tools that return individual metrics like get_sleep or get_training_load.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for an overall readiness assessment but does not explicitly state when to use it over its siblings. No 'when not to use' or 'consider using X instead' guidance is provided, though the sibling list is available.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_weekly_summaryA

Weekly aggregates for a single metric.

Args: metric: One of "steps", "stress", or "intensity_minutes". weeks: How many recent weeks to include. Capped at 12. end_date: End of the window in YYYY-MM-DD format. Defaults to today.

ParametersJSON Schema
NameRequiredDescriptionDefault
weeksNo
metricYes
end_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
weeksNo
metricYessteps, stress, or intensity_minutes.
avg_valueNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses caps on weeks (12), default values for end_date, and enumerates valid metric values. As no annotations are provided, the description carries full burden; it sufficiently describes the non-destructive read behavior and constraints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured: a clear one-line purpose followed by a bulleted list of parameter details. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists, the description appropriately focuses on input parameters and behavior. It covers metric options, weeks cap, and date format. Minor gaps like error handling for invalid metrics are omitted, but overall it's complete for a simple aggregation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite schema description coverage being 0%, the description adds meaning for all 3 parameters: it explains metric values (steps, stress, intensity_minutes), weeks cap (12), and end_date format (YYYY-MM-DD) with default. This fully compensates for missing schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool provides 'weekly aggregates for a single metric.' It lists the allowed metrics (steps, stress, intensity_minutes), making the purpose specific. However, it does not explicitly differentiate this tool from siblings like get_stress or get_steps_and_calories, which might also provide aggregate data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context for when to use: for weekly aggregations of available metrics. It implies not for daily or multi-metric summaries. But it lacks explicit guidance on alternatives or when not to use this tool compared to siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_workoutsA

List workouts saved in your Garmin Connect library (id, name, sport).

These are workout templates in the library — the source the watch syncs from — not logged activities. Use the ids with delete_workout.

Args: limit: maximum number of workouts to return (default 50).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
workoutsYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses that the operation is a list of templates, implies read-only behavior, and mentions the returned fields. It doesn't explicitly state it doesn't modify data, but for a listing operation this is reasonably transparent. It does not mention errors or side effects, but none are expected.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences: the first defines the action and output fields, the second clarifies the nature (templates) and provides a practical hint. It is concise, well-structured, and free of superfluous content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description gives sufficient context for a simple listing tool: it specifies the return fields, clarifies that these are templates, and indicates the primary use case (deletion). While it does not describe pagination or error handling, these are not critical for a basic list operation and the given information is enough for most use cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter `limit` is fully described in the schema (integer, default 50). The description adds no additional meaning, but since schema coverage is 100%, a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists workouts from the Garmin Connect library, specifies the fields (id, name, sport), and distinguishes these as templates rather than logged activities. This makes the purpose unambiguous and differentiates it from sibling activity-related tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly notes the tool is for templates (not logged activities) and suggests using the returned ids with `delete_workout`, giving a concrete use case. While it doesn't explicitly say 'use this instead of X', the contrast with logged activities provides clear guidance for when to select this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

preview_running_workoutA

Assemble a running workout and show what WOULD be created — no network call.

Validates the structure (one end condition per step, paired pace bounds, pace format) and returns a readable summary, sanity warnings, and a confirmation_token to pass to create_running_workout. Always call this first and review the result.

Args: workout: the workout definition (name, steps and/or repeat groups).

ParametersJSON Schema
NameRequiredDescriptionDefault
workoutYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYes
summaryYesHuman-readable step-by-step summary.
warningsNo
confirmation_tokenYesPass to create_running_workout to confirm.
estimated_duration_secondsYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full disclosure weight and exceeds the bar: 'no network call' declares the side-effect-free behavior, while validating single end condition per step, paired pace bounds, and pace format sets accurate expectations of what will be checked. The return contract (readable summary, sanity warnings, confirmation_token) is fully spelled out.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two information-dense, front-loaded sentences deliver the core contract before a one-line token hand-off — almost no waste. The 'Args:' coda is slightly mechanical and adds little beyond what the schema title conveys, costing half a point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with a deeply nested schema (steps, repeat groups, end conditions) and an output schema present, the description ties everything together: behavior (validate + no network), return package (summary, warnings, token), and workflow. The only unspoken edge is what happens when validation fails — whether the tool errors or returns an invalid-token sentinel.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The 'Args:' line is a thin restatement of the schema tree's intent, but the validation rules described (one end condition per step, paired pace bounds, pace format) do add genuine semantic meaning to how the workout parameter must be structured. Given 0% description coverage at the top level, however, the description under-serves the depth that a single high-level parameter with heavy nesting demands.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line, 'Assemble a running workout and show what WOULD be created — no network call,' uses a specific verb and object while immediately distinguishing the preview from an actual create operation. It clearly differentiates itself from sibling create_running_workout via the 'WOULD be created' framing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs 'Always call this first and review the result,' giving an unambiguous directive on when to use it, and describes passing the returned confirmation_token to create_running_workout, naming the exact alternative workflow and sequencing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

preview_strength_workoutA

Assemble a strength workout and show what WOULD be created — no network call.

Resolves each exercise name to Garmin's catalog and returns a readable summary, the resolved Garmin name + confidence per exercise, warnings for anything that did not map cleanly, and a confirmation_token to pass to create_strength_workout. Always call this first and review the result.

Args: workout: the workout definition (name, blocks of sets/exercises).

ParametersJSON Schema
NameRequiredDescriptionDefault
workoutYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYes
summaryYesHuman-readable block-by-block summary.
warningsNoExercises that did not resolve cleanly.
exercisesYes
confirmation_tokenYesPass to create_strength_workout to confirm.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full disclosure responsibility. It states 'no network call', explains it resolves names, and returns warnings and a token, giving good insight into behavior. It could explicitly state it never modifies data, but the term 'preview' and 'no network call' strongly imply safety.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with a clear structure: purpose first, then what it returns, then usage instruction. Every sentence adds value, and the Args section is well-organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers all necessary aspects: what it does, what it returns (summary, resolved names, warnings, confirmation_token), and when to use it (before create_strength_workout). Given an output schema exists (but not shown), the description sufficiently describes the return values, making it complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description provides a high-level explanation of the workout parameter (name, blocks, sets, exercises) and how it is resolved. This adds context beyond the schema's property descriptions, helping the agent understand the parameter's role.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool assembles a strength workout and shows what would be created without a network call, distinguishing it as a preview step. It mentions resolving exercise names and returning a summary and confirmation token, which clearly describes its purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states 'Always call this first and review the result' and references the sibling tool create_strength_workout by mentioning passing a confirmation_token to it. This provides clear when-to-use guidance.

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 library workout on a Garmin Connect calendar date (a WRITE).

Works for any workout type (running, strength, ...). A scheduled workout is pushed to the watch automatically on its next sync — no "Send to Device" needed. Reversible with unschedule_workout.

Args: workout_id: id from create_running_workout / create_strength_workout / list of workouts in Garmin Connect. date: calendar date, YYYY-MM-DD.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYes
workout_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
workout_idYes
schedule_idNo
workout_nameNo
calendar_dateYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It clearly signals a write operation, explains the effect (pushed to watch on next sync), and mentions reversibility. It does not disclose potential side effects like overwriting an existing schedule, but it is transparent about core behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is brief and front-loaded with the core purpose. Two sentences and a compact args list, no redundant phrases. Every sentence adds distinct value, from write nature to auto-sync and reversibility.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is an output schema, the description need not explain return values. It covers purpose, parameter source, auto-sync behavior, reversibility, and is complete for a simple write operation. It could mention edge cases like date restrictions, but overall it is well-rounded.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds significant value beyond the schema: workout_id is explained as coming from create/listing functions, and date is given format YYYY-MM-DD. Both parameters are fully described with practical context, exceeding the schema's minimal type-only definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Put an existing library workout on a Garmin Connect calendar date' with the explicit 'a WRITE' marker. It distinguishes from siblings like unschedule_workout and the read-oriented getters, and specifies it works for any workout type.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides context on input source (workout_id from create/list functions) and states reversibility with unschedule_workout, implying when to use. However, it does not explicitly state when not to use or mention alternative scheduling mechanisms, and could be clearer about prerequisites like date validity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

unschedule_workoutA

Remove a scheduled workout from the calendar (a WRITE; keeps the template).

The workout stays in your library — only the calendar entry is removed.

Args: schedule_id: id returned by schedule_workout.

ParametersJSON Schema
NameRequiredDescriptionDefault
schedule_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
schedule_idYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It explicitly states that this is a WRITE operation, which is critical since the annotation readOnlyHint is absent. It also clarifies that the template is preserved, addressing potential side effects. This is more transparent than typical tool descriptions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, with two short paragraphs and an Args section. Every sentence earns its place: it states the action, clarifies the side-effect (keeps template), and explains the parameter. No filler or redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one parameter) and presence of an output schema (which likely describes the result), the description is almost complete. It covers the key behavioral aspects (write operation, template preservation) and parameter sourcing. Minor gap: it doesn't mention what happens to the schedule_id if the workout is already unscheduled or if it's invalid, but this is not critical for a simple tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description provides crucial information about the parameter: 'schedule_id: id returned by schedule_workout'. This explains the parameter's origin and format, adding value beyond the schema. The guidance is clear and actionable, though it could mention what happens if the id is invalid.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Remove a scheduled workout from the calendar', distinguishing it from siblings like 'schedule_workout' and 'delete_workout' by specifying it only removes the calendar entry, not the workout itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on what the tool does (removes calendar entry) and what it does not do (keeps the template). It implies usage when a scheduled workout needs to be unscheduled, and the note 'keeps the template' helps differentiate from deleting the workout. However, it doesn't explicitly mention when to use this versus alternatives like 'delete_workout'.

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.

  1. 12 tool updatesv0.5.0
    • Addedcreate_running_workout
    • Addeddelete_workout
    • Addedget_activity_weather
    • Changedget_daily_briefing2 fields changed
      • addedOutput schema / $defs / TrainingLoadSummary / properties / acwr_percent
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Acute:chronic workload ratio as a percentage (Garmin's load ratio).",
        +  "title": "Acwr Percent"
        +}
      • addedOutput schema / $defs / TrainingLoadSummary / properties / acwr_status
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Garmin's qualitative ACWR band, e.g. OPTIMAL, LOW, HIGH.",
        +  "title": "Acwr Status"
        +}
    • Addedget_endurance_score
    • Addedget_hill_score
    • Addedget_strength_sets
    • Changedget_training_load2 fields changed
      • addedOutput schema / properties / acwr_percent
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Acute:chronic workload ratio as a percentage (Garmin's load ratio).",
        +  "title": "Acwr Percent"
        +}
      • addedOutput schema / properties / acwr_status
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Garmin's qualitative ACWR band, e.g. OPTIMAL, LOW, HIGH.",
        +  "title": "Acwr Status"
        +}
    • Addedlist_workouts
    • Addedpreview_running_workout
    • Addedschedule_workout
    • Addedunschedule_workout
  2. 18 tool updatesv0.1.0
    • First observedcreate_strength_workout
    • First observedget_activity_details
    • First observedget_body_battery
    • First observedget_body_composition
    • First observedget_daily_briefing
    • First observedget_fitness_metrics
    • First observedget_hrv_status
    • First observedget_personal_records
    • First observedget_recent_activities
    • First observedget_respiration
    • First observedget_resting_heart_rate
    • First observedget_sleep
    • First observedget_steps_and_calories
    • First observedget_stress
    • First observedget_training_load
    • First observedget_training_readiness
    • First observedget_weekly_summary
    • First observedpreview_strength_workout

TDQS

A3.7/5.0

Scored across 28 tools

Disambiguation4/5

Most get_* tools target distinct metrics (sleep, HRV, body battery, stress, etc.), but some overlap exists: get_sleep includes overnight HRV, and get_daily_briefing explicitly fuses six other tools. Descriptions are detailed enough to disambiguate, but an agent could hesitate between the composite and individual tools.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern in snake_case: get_* for read operations, preview_*/create_* for workout creation, delete_workout, schedule_workout/unschedule_workout. Nearly every tool name clearly indicates its action and resource, with no mixed conventions.

Tool Count2/5

With 28 tools, the server exceeds the 25+ threshold for 'too many'. While the Garmin domain is broad, many tools could be consolidated (e.g., get_daily_briefing already combines six), and the count feels heavy for an agent to navigate efficiently.

Completeness4/5

The surface covers a wide range of health metrics and workout CRUD (preview, create, list, delete, schedule/unschedule). Minor gaps exist: no workout update (only delete and recreate) and no detailed view of a single workout template's steps, but core workflows are well-supported.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables Claude Desktop to access and analyze Garmin wearable health data including sleep, HRV, Body Battery, and activity metrics. Users can query their health trends, track recovery, and generate interactive HTML dashboards using natural language.
    9
    6
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Connects Garmin watch data to Claude Desktop, allowing users to ask natural language questions about their health and activity data from Garmin Connect.
    -