Skip to main content
Glama
hhopke
by hhopke

Intervals.icu MCP Server

intervals-icu-mcp demo

A Model Context Protocol (MCP) server for Intervals.icu integration. Access your training data, wellness metrics, and performance analysis through Claude, ChatGPT, and other LLMs.

Originally based on eddmann/intervals-icu-mcp (MIT licensed). This project is an independent continuation with significant bug fixes and new features — see CHANGELOG.md for details.

Tests intervals-icu-mcp MCP server License: MIT Docker Sponsor

Overview

67 tools spanning activities, activity analysis, activity messages, athlete profile, wellness, events/calendar, performance curves, workout library, gear, sport settings, and custom items — plus 4 MCP Resources (athlete profile, workout syntax, event categories, custom item schemas) and 7 MCP Prompts (training analysis, recovery check, weekly planning, and more). See Available Tools for the per-category breakdown.

Related MCP server: Intervals.icu MCP Server

Quick Start

Or for Claude Desktop, in 30 seconds:

  1. Get your API key and athlete ID

  2. Add this to your Claude Desktop config:

{
  "mcpServers": {
    "intervals-icu": {
      "command": "uvx",
      "args": ["intervals-icu-mcp"],
      "env": {
        "INTERVALS_ICU_API_KEY": "your-api-key-here",
        "INTERVALS_ICU_ATHLETE_ID": "i123456"
      }
    }
  }
}
  1. Restart Claude and ask "Show me my activities from the last 7 days."

Prefer Claude Code, Cursor, or ChatGPT? See Client Configuration. Want to run from source or with Docker? See Installation & Setup.

Prerequisites

Install uv — it handles Python, dependencies, and execution in one tool. brew install uv on macOS/Linux, or powershell -c "irm https://astral.sh/uv/install.ps1 | iex" on Windows. From there, uvx fetches Python and the package automatically. Docker is also supported as an alternative.

Intervals.icu API Key Setup

Before installation, obtain your Intervals.icu API key:

  1. Go to https://intervals.icu/settingsDeveloperCreate API Key.

  2. Copy the key, and note your Athlete ID from your profile URL (format: i123456).

Installation & Setup

Nothing to install separately if you use the recommended setup. uvx (which ships with uv) automatically downloads and caches the intervals-icu-mcp package the first time your MCP client launches it — just paste the config snippet from Client Configuration into your client and you're done.

git clone https://github.com/hhopke/intervals-icu-mcp.git
cd intervals-icu-mcp
uv sync
uv run intervals-icu-mcp-auth  # interactive credential setup; or create .env manually:
#   INTERVALS_ICU_API_KEY=your_api_key_here
#   INTERVALS_ICU_ATHLETE_ID=i123456

Then point your MCP client at this checkout — see the From source snippet inside each client below.

docker build -t intervals-icu-mcp .

# Interactive credential setup (creates intervals-icu-mcp.env in the current directory):
touch intervals-icu-mcp.env  # pre-create the file so Docker mounts it as a file, not a dir
docker run -it --rm \
  -v "$(pwd)/intervals-icu-mcp.env:/app/.env" \
  --entrypoint= intervals-icu-mcp:latest \
  python -m intervals_icu_mcp.scripts.setup_auth

Or create intervals-icu-mcp.env manually (same format as the .env above).

Then point your MCP client at the Docker image — see the Docker snippet inside each client below.

Client Configuration

The server speaks MCP over stdio and works with any compliant client. Click a client to expand. If you followed Quick Start (uvx), use the first config block; if you used the source or Docker alternative above, use the matching variant inside the same collapsible.

Add to your configuration file:

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

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

{
  "mcpServers": {
    "intervals-icu": {
      "command": "uvx",
      "args": ["intervals-icu-mcp"],
      "env": {
        "INTERVALS_ICU_API_KEY": "your-api-key-here",
        "INTERVALS_ICU_ATHLETE_ID": "i123456"
      }
    }
  }
}

From source (requires git clone + uv sync + uv run intervals-icu-mcp-auth):

{
  "mcpServers": {
    "intervals-icu": {
      "command": "uv",
      "args": ["run", "--directory", "/ABSOLUTE/PATH/TO/intervals-icu-mcp", "intervals-icu-mcp"]
    }
  }
}

Docker:

{
  "mcpServers": {
    "intervals-icu": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "-v", "/ABSOLUTE/PATH/TO/intervals-icu-mcp.env:/app/.env", "intervals-icu-mcp:latest"]
    }
  }
}

Register the server as a user-scoped MCP server:

claude mcp add intervals-icu --scope user \
  --env INTERVALS_ICU_API_KEY=your-key \
  --env INTERVALS_ICU_ATHLETE_ID=i123456 \
  -- uvx intervals-icu-mcp

Then in any Claude Code session, run /mcp to confirm intervals-icu is connected.

Add to ~/.cursor/mcp.json (or the project-local .cursor/mcp.json):

{
  "mcpServers": {
    "intervals-icu": {
      "command": "uvx",
      "args": ["intervals-icu-mcp"],
      "env": {
        "INTERVALS_ICU_API_KEY": "your-api-key-here",
        "INTERVALS_ICU_ATHLETE_ID": "i123456"
      }
    }
  }
}

Restart Cursor and open Settings → MCP to verify the server is listed.

ChatGPT's custom MCP connector flow requires running the server over HTTP and exposing it via a tunnel, then registering the URL in ChatGPT's Developer Mode settings. See docs/chatgpt-connector.md for the full walkthrough, plan-tier requirements, and security notes.

Usage

Ask Claude to interact with your Intervals.icu data in natural language. A few starter prompts:

"Show me my activities from the last 30 days"
"Am I overtraining? Check my CTL, ATL, and TSB"
"How's my recovery this week? Show HRV and sleep trends"
"Create a sweet spot cycling workout for tomorrow"
"What's my 20-minute power and FTP?"

For the full catalogue of example prompts by category, see docs/examples.md.

Available Tools

67 tools, 4 resources, and 7 prompt templates. One-line summary below — full reference in docs/tools.md.

Category

Tools

Summary

Activities

12

Query, search, update, delete, download activities

Activity Analysis

8

Streams, intervals, best efforts, histograms

Activity Messages

2

Read and post notes/comments/coach feedback on activities

Athlete

3

Profile, CTL/ATL/TSB analysis, and fitness chart time-series

Wellness

3

HRV, sleep, recovery metrics

Events / Calendar

11

Planned workouts, races, notes, ATP periodization (bulk ops supported)

Performance / Curves

3

Power, HR, and pace curves with zones

Workout Library

7

Browse and create folders and training plans; create (incl. bulk), update, and delete library workouts

Gear Management

6

Track equipment and maintenance reminders

Sport Settings

5

FTP, FTHR, pace thresholds, and zones

Custom Items

5

User customizations: custom charts, fields, zones, dashboard panels

Delete Safety Mode

Destructive tools are gated by the optional INTERVALS_ICU_DELETE_MODE env var (safe / full / none, default safe) — a server-side gate outside the model's reach, so unregistered tools can't be invoked. See docs/tools.md for the full mode table, response envelope, and TZ-buffer rationale.

Remote Deployment (HTTP / SSE)

The server runs over stdio by default — the right transport for local clients like Claude Desktop, Claude Code, and Cursor. HTTP and SSE transports are available for remote or hosted use.

⚠️ MCP has no built-in authentication — never expose an HTTP-mode server to an untrusted network without a tunnel (Tailscale, Cloudflare Tunnel) or an authenticating reverse proxy.

See docs/remote-deployment.md for transport flags and the full security model.

Documentation

Feedback

How are you using this? Which tools you lean on, what your prompts look like, where it gets in your way — that shapes the roadmap more than my own guesses do.

Show and tell · Q&A · Ideas · General — or open an issue for a reproducible bug.

Contributing

Contributions are very welcome, and none is too small — a typo, a clearer parameter description, an extra test, a whole new tool. No Python or MCP expertise assumed. See CONTRIBUTING.md; in short, run make can-release before opening a PR. Good first issues are a gentle place to start.

Sponsor

Free under the MIT License, maintained in my spare time. If it's useful to you, GitHub Sponsors supports continued development — entirely optional, and feedback or a PR helps just as much.

License

MIT License - see the LICENSE file for details.

Disclaimer

This project is not affiliated with, endorsed by, or sponsored by Intervals.icu. All product names, logos, and brands are property of their respective owners.

Available Tools

64 tools
icu_add_activity_messageA

POST a new note or comment on a specific activity (singular = WRITE).

Use when the user wants to leave a note on one of their activities: "add a note to this ride that I felt strong", "comment on yesterday's run", "leave a training note saying...". Attributed to the authenticated user. To READ existing notes use icu_get_activity_messages (plural).

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYesMessage content (note or comment text)
activity_idYesThe Intervals.icu activity ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

While annotations already signal a non-read-only write operation, the description adds that the message is attributed to the authenticated user. However, it does not elaborate on other behavioral aspects like visibility or modifications beyond attribution. With annotations present, this 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 extremely concise—just a few sentences that immediately state the action, provide usage examples, and differentiate from a sibling. Every sentence adds value, and no extraneous information is present.

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 simple write operation, the description provides essential context: what it does, examples, and alternative. The output schema exists to cover return values. It might miss a note on whether the message is private or visible, but overall it is complete enough.

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 input schema covers both parameters with descriptions, achieving 100% coverage. The description adds minimal value, only restating 'note or comment' similar to the schema. Baseline 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 action (POST a new note or comment) and resource (on a specific activity). It explicitly distinguishes from the sibling tool icu_get_activity_messages for reading, ensuring no confusion.

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 says when to use this tool (when user wants to leave a note/comment) and provides concrete examples. It also tells when not to use it and directs to the alternative for reading.

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

icu_apply_sport_settingsA
Destructive

Recompute training load, zones, and derived metrics on HISTORICAL activities using the current sport settings.

Different from update_sport_settings (which just stores new values). Use after changing FTP/FTHR/pace to backfill chart math.

ParametersJSON Schema
NameRequiredDescriptionDefault
sport_idYesID of the sport settings to apply
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, idempotentHint=false, openWorldHint=true, so the agent knows this mutates state. The description adds useful scope context by stating the recomputation hits HISTORICAL activities broadly, but it does not say what exactly is overwritten, whether the change is reversible, or what permissions/athlete scoping apply.

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?

Three short sentences, front-loaded with the core action, followed by the sibling distinction and the usage trigger. No redundant or filler text; every sentence carries 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?

Because an output schema exists, return values need not be explained, and the description covers the what, when, and the alternative. It is nearly complete for a bulk-mutation tool, with only minor missing detail on authorization/athlete scoping given the destructive and open-world nature.

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 100%, so both sport_id and athlete_id are already documented in the schema. The description adds no additional parameter-level meaning (no format, defaults, or scoping nuance beyond what the schema provides), so a baseline 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 names a specific verb ('Recompute') and concrete resources ('training load, zones, and derived metrics on HISTORICAL activities'), so an agent knows exactly what the tool does. It also explicitly contrasts itself with the sibling update_sport_settings, which 'just stores new values,' making the boundary between the two unambiguous.

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 gives a clear triggering condition ('Use after changing FTP/FTHR/pace to backfill chart math') and names the alternative it is not (update_sport_settings). The only gap is that it does not state when NOT to use it (e.g., for new activities or live data), so it lacks an explicit exclusion.

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

icu_apply_training_planA
Destructive

Schedule an entire training plan (workout-library folder) onto the athlete's calendar starting on a chosen date.

Use after icu_get_workout_library to find a plan's folder_id. Different from icu_create_event / icu_bulk_create_events (which build new events) and from icu_duplicate_events (which copies existing).

ParametersJSON Schema
NameRequiredDescriptionDefault
folder_idYesFolder ID of the training plan to apply
athlete_idNoAthlete ID (for coaches managing multiple athletes)
start_date_localYesStart date in ISO-8601 format (YYYY-MM-DD)
extra_workouts_jsonNoOptional JSON array of additional workouts

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already provide destructiveHint=true and readOnlyHint=false. The description adds no behavioral details beyond scheduling onto calendar; it does not contradict annotations but also lacks extra context like whether it overwrites or merges events. With annotations present, a score of 3 is appropriate.

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?

Three well-structured sentences: first states purpose, second provides prerequisite, third differentiates from alternatives. No unnecessary words, fully front-loaded.

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 has an output schema and moderate complexity, the description covers purpose, prerequisite, and differentiation. Return values are handled by the output schema, so the description is complete.

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?

Input schema has 100% coverage with descriptions for all 4 parameters. The description does not add parameter-level details beyond what the schema already provides, so baseline score of 3 is justified.

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 ('Schedule an entire training plan...onto the athlete's calendar') and the resource ('workout-library folder'), distinguishing it from sibling tools like icu_create_event, icu_bulk_create_events, and icu_duplicate_events.

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 mentions to use after icu_get_workout_library to obtain the folder_id, and directly contrasts with three alternative tools (icu_create_event, icu_bulk_create_events, icu_duplicate_events), providing clear when-to-use and when-not-to-use guidance.

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

icu_bulk_create_eventsA

Create MANY new calendar events in a single batch call (more efficient than looping create_event).

Accepts a JSON array of event objects, each shaped like an icu_create_event payload. For copying existing events forward use icu_duplicate_events instead — that reuses payloads rather than taking new fields. See intervals-icu://event-categories and intervals-icu://workout-syntax for the referenced enums and DSL.

ParametersJSON Schema
NameRequiredDescriptionDefault
eventsYesJSON array of event objects, each shaped exactly like an icu_create_event call. Required per event: start_date_local, name, category. Optional: description, event_type (activity discipline Ride/Run/Swim/…), duration_seconds, distance_meters, training_load, end_date_local, training_availability, color, show_as_note, not_on_fitness_chart, show_on_ctl_line. See intervals-icu://event-categories for the category enum. For WORKOUT events the server parses this into structured, device-syncable steps with zones and a training load. Use Intervals.icu workout syntax: one step per line as '- <duration> <target>' (duration FIRST), grouped under Warmup / Main / Cooldown headers. Targets: bike '- 5m 85%', '- 5m Z4', or absolute '- 5m 210w'; HR '- 10m 70-80% HR' or '- 10m 145bpm'; run/swim pace '- 5m Z2 Pace', absolute only with a trailing 'pace' word: '- 5m 4:45/km pace', '- 200mtr 1:45/100m pace' (bare '5:00/km' or '1:45/100m' silently drops); threshold is relative — run '- 25m 100% pace', swim CSS '- 200mtr 100% pace' — the words 'threshold'/'CSS'/'5K pace' are NOT parsed as targets. Add cadence to any step: '- 3m Z2 90rpm'. No target: '- 20m free'. Repeats: put 'Nx' after a section name with steps flat beneath, and leave a blank line before and after the repeat block (without it the repeat silently runs only once) — e.g. 'Main 5x' then '- 3m 110%' / '- 3m 50%'. Ramps: '- 10m ramp 50-70%'. Rest: append 'Ns rest' to a step ('- 200mtr Z2 20s rest') or use a separate '- 20s intensity=rest' step (only intensity=rest exports as a device rest step) — never a bare '- 20s' step (that becomes work, not rest). Durations: 'm'=minutes, 's'=seconds; distance steps use 'mtr'=meters / 'km' / 'yrd' (e.g. swim '- 400mtr Z2 Pace'). Do NOT write '[repeat 5x ...]', nested bullets, or 'Z5 3m' (target before duration). Runs need a pace or HR target — a bare 'Z2' gives no load. Full reference: intervals-icu://workout-syntax resource.
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnly=false, openWorld=true, idempotent=false and destructive=false, so the safety profile is covered. The description adds batch semantics and points to the relevant resources, but says nothing about partial-failure behavior, validation/rejection of malformed payloads, or whether the whole batch is atomic — a meaningful gap for a non-idempotent bulk write.

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

Conciseness4/5

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

The top-level description is three tight sentences, front-loaded with the batch scope and immediately followed by the alternative. The enormous workout-syntax detail is carried by the schema parameter, not the description, so the description itself stays lean.

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 an output schema exists, return values need no explanation, and the description covers scope, payload shape, the sibling alternative, and resources for enums/DSL. For a tool this complex the only missing piece is failure/atomicity behavior of the batch.

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 100%, so the extensive param documentation already lives in the schema. The description contributes only framing ('each shaped like an icu_create_event payload') and resource pointers, which is the expected baseline when the schema does the heavy lifting.

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?

States a specific verb (create), resource (calendar events) and scope (MANY / single batch call), and explicitly distinguishes itself from both icu_create_event and icu_duplicate_events. An agent can route between the three without opening any schema.

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

Usage Guidelines4/5

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

Names an alternative and the condition that selects it ('For copying existing events forward use icu_duplicate_events instead'), and justifies the tool's existence vs looping create_event. It does not spell out when a single create_event is preferable to the bulk form, but the batch-vs-loop framing covers most of the routing decision.

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

icu_bulk_create_manual_activitiesA
Destructive

Batch-create manual activities (no device upload) with UPSERT on external_id.

Existing activities with a matching external_id (set by the same OAuth app) are updated; activities without an external_id are always created new.

ParametersJSON Schema
NameRequiredDescriptionDefault
athlete_idNoAthlete ID (for coaches managing multiple athletes)
activities_jsonYesJSON string containing array of manual activities

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

The description discloses key behavioral traits beyond annotations: the UPSERT logic (updating existing records), the condition of matching external_id within the same OAuth app, and the exclusion of device uploads. Annotations already mark it as destructive and non-readOnly, but the description explains the specific destructive mechanism and auth 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 two sentences, front-loaded with the core purpose and then elaborating on behavior. Every sentence adds value without redundancy. No filler or unnecessary 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?

Given the presence of output schema and annotations, the description covers the essential behavioral contract: upsert logic, manual-only scope, and OAuth app restriction. It could mention error handling or batch size limits, but is mostly complete for practical use.

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 100%, but the description adds significant meaning: it explains that activities_json contains the external_id field for upsert matching, and clarifies athlete_id is for coaches. This goes beyond the schema descriptions, which only name the parameters.

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 performs batch creation of manual activities with UPSERT behavior, and distinguishes itself by specifying 'no device upload' and the unique upsert-on-external_id mechanism. This differentiates it from siblings like icu_bulk_create_events and individual activity 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?

The description explains the upsert behavior and OAuth app constraint, providing clear context for when to use this tool (for batch manual activity management with external_id matching). However, it does not explicitly state when not to use it or mention alternatives, such as individual create/update tools.

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

icu_bulk_create_workoutsA

Save MANY new reusable workouts into LIBRARY folders or plans in one call — e.g. filling out a training plan.

Each item is shaped like an icu_create_workout call. Nothing lands on the calendar: for dated calendar workouts use icu_bulk_create_events, and to schedule a finished plan use icu_apply_training_plan.

ParametersJSON Schema
NameRequiredDescriptionDefault
workoutsYesJSON array of workout objects, each shaped like an icu_create_workout call. Required per workout: folder_id, name. Optional: description, workout_type, day, duration_seconds, distance_meters, training_load, target, indoor, color, tags. For WORKOUT events the server parses this into structured, device-syncable steps with zones and a training load. Use Intervals.icu workout syntax: one step per line as '- <duration> <target>' (duration FIRST), grouped under Warmup / Main / Cooldown headers. Targets: bike '- 5m 85%', '- 5m Z4', or absolute '- 5m 210w'; HR '- 10m 70-80% HR' or '- 10m 145bpm'; run/swim pace '- 5m Z2 Pace', absolute only with a trailing 'pace' word: '- 5m 4:45/km pace', '- 200mtr 1:45/100m pace' (bare '5:00/km' or '1:45/100m' silently drops); threshold is relative — run '- 25m 100% pace', swim CSS '- 200mtr 100% pace' — the words 'threshold'/'CSS'/'5K pace' are NOT parsed as targets. Add cadence to any step: '- 3m Z2 90rpm'. No target: '- 20m free'. Repeats: put 'Nx' after a section name with steps flat beneath, and leave a blank line before and after the repeat block (without it the repeat silently runs only once) — e.g. 'Main 5x' then '- 3m 110%' / '- 3m 50%'. Ramps: '- 10m ramp 50-70%'. Rest: append 'Ns rest' to a step ('- 200mtr Z2 20s rest') or use a separate '- 20s intensity=rest' step (only intensity=rest exports as a device rest step) — never a bare '- 20s' step (that becomes work, not rest). Durations: 'm'=minutes, 's'=seconds; distance steps use 'mtr'=meters / 'km' / 'yrd' (e.g. swim '- 400mtr Z2 Pace'). Do NOT write '[repeat 5x ...]', nested bullets, or 'Z5 3m' (target before duration). Runs need a pace or HR target — a bare 'Z2' gives no load. Full reference: intervals-icu://workout-syntax resource.
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate a mutating, non-idempotent, open-world operation. The description adds the important behavioral constraint 'Nothing lands on the calendar', clarifying side effects and scope. It does not cover partial-failure behavior or auth requirements, but annotations cover the safety profile, so the added context earns a 4.

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?

Four short sentences with no filler. The core purpose is front-loaded in the first sentence, and the alternative routing is packed into the remainder. Every sentence earns its place.

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 rich schema covering the complex workouts parameter, the presence of an output schema, and annotations, the description is complete enough for an agent to select and invoke the tool correctly. It explains scope, gives examples, and names the alternatives for adjacent 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?

Schema coverage is 100%, and the schema itself contains an extensive description of the workouts string syntax and athlete_id parameter. The tool description only repeats that items are shaped like icu_create_workout calls, which adds little beyond what the schema already states. Baseline 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?

States a specific verb ('Save'), resource ('reusable workouts'), and scope ('LIBRARY folders or plans'), with an example ('filling out a training plan'). Explicitly distinguishes from siblings by naming icu_bulk_create_events and icu_apply_training_plan as alternatives for calendar use.

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 and when-not-to-use guidance: 'for dated calendar workouts use icu_bulk_create_events, and to schedule a finished plan use icu_apply_training_plan.' Also notes each item is shaped like an icu_create_workout call, guiding bulk vs single invocation.

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

icu_bulk_delete_eventsA
DestructiveIdempotent

Delete MANY calendar events in a single batch call. Destructive — cannot be undone.

In safe delete mode (default), the call partitions the input list into deleted (future) and skipped (past or undated) and returns both. INTERVALS_ICU_DELETE_MODE=full disables the partition.

ParametersJSON Schema
NameRequiredDescriptionDefault
event_idsYesJSON array of event IDs to delete (e.g., '[123, 456, 789]')
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already set destructiveHint=true, idempotentHint=true. The description adds behavioral context: the safe mode partition (deleted vs skipped) and the env var override. No contradiction with annotations.

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?

Description is brief (three sentences) but packed with essential info: purpose, destructiveness, safe mode behavior, and env var. No redundant 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?

Given the output schema exists and annotations cover safety, the description adequately explains the core behavior (bulk deletion with safe partitioning). It omits details like rate limits or auth, but those are implicit from annotations and context.

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?

Input schema has 100% coverage with descriptions for both parameters (event_ids as JSON array, athlete_id optional). The description adds no extra parameter-specific meaning beyond what the schema 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 'Delete MANY calendar events in a single batch call', specifying the verb, resource, and scope. It distinguishes from siblings like icu_delete_event and icu_bulk_create_events, as the tool name implies.

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 warns 'Destructive — cannot be undone', and explains the safe vs full delete modes with env var control. While it doesn't explicitly list when not to use, it provides clear context for selecting this tool over alternatives.

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

icu_create_custom_itemA

Create a custom addition to the user's Intervals.icu account.

Use when the user says things like: "add a custom field for RPE", "create a custom power zone set", "add a chart for monthly distance". Match the user's intent to the right item_type (see that param's description). For the content schema per item_type, read intervals-icu://custom-item-schemas.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesDisplay name (e.g., 'RPE', 'Bike Weight', 'Custom Power Zones')
contentNoConfiguration object whose schema depends on item_type. Read intervals-icu://custom-item-schemas BEFORE constructing — it documents the {code, type, aggregate} shape required for INPUT_FIELD / ACTIVITY_FIELD / INTERVAL_FIELD (with constraints and worked examples) and explains that chart/panel/zones/stream types should omit `content`.
item_typeYesWhat the user wants to add. Pick by intent: INPUT_FIELD (extra input on the wellness page, e.g. RPE, mood), ACTIVITY_FIELD (extra field on each activity, e.g. bike weight), INTERVAL_FIELD (extra field on each interval), ZONES (custom power/HR/pace zone set), FITNESS_CHART / TRACE_CHART / FITNESS_TABLE (custom dashboard chart/table), ACTIVITY_CHART / ACTIVITY_HISTOGRAM / ACTIVITY_HEATMAP / ACTIVITY_MAP / ACTIVITY_PANEL (custom visual on the activity page), ACTIVITY_STREAM (computed time-series). Use the literal API value.
athlete_idNoAthlete ID (only for coaches; uses configured default otherwise)
visibilityNoWho can see it: PRIVATE (default, only you), FOLLOWERS, or PUBLIC.
descriptionNoOptional description shown to the user

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already indicate non-read-only and non-destructive behavior. The description adds context about reading external schemas but does not disclose additional traits like permission requirements, rate limits, or side effects beyond creation.

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 three sentences long with no wasted words. It front-loads the purpose, then provides usage examples, and finally directs to additional resources. Perfectly 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 the tool's complexity (multiple item types with varying content schemas), the description covers core usage and points to external resources for details. It does not explain return values, but an output schema exists. A minor gap is the lack of error handling or prerequisites.

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 100%, so baseline is 3. The description adds value by pointing to intervals-icu://custom-item-schemas for the content parameter, which is essential for correct usage.

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 verb 'Create a custom addition' and specifies the resource 'user's Intervals.icu account'. It provides examples of user intents, making it easy to distinguish from sibling tools like icu_update_custom_item.

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 tells when to use the tool by listing example user statements ('add a custom field for RPE', etc.) and advises matching intent to item_type. It also references an external schema for content construction, providing clear context.

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

icu_create_eventA

Create ONE new calendar event from scratch.

For two or more events in a single call, prefer icu_bulk_create_events over a loop. For copying existing events forward in time (repeating a workout for N weeks), use icu_duplicate_events — that tool reuses an existing event's payload instead of taking new fields.

For category guidance and the training_availability enum, read the intervals-icu://event-categories resource. For structured WORKOUT events, put workout-syntax text in description — see intervals-icu://workout-syntax.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesEvent name
colorNoCustom display color (hex string)
categoryYesEvent category enum. Common: WORKOUT, NOTE, RACE_A/B/C, TARGET, PLAN, HOLIDAY, SICK, INJURED. Full list with use-case guidance and the training_availability enum: intervals-icu://event-categories resource. Legacy aliases RACE→RACE_A, GOAL→TARGET accepted.
end_dateNoEnd date in YYYY-MM-DD format. Use for ranged categories (INJURED, SICK, HOLIDAY, SEASON_START) to mark a multi-day block.
athlete_idNoAthlete ID (for coaches managing multiple athletes)
event_typeNoActivity discipline (NOT the category): Ride, Run, Swim, Walk, Hike, WeightTraining, Workout, VirtualRide, VirtualRun, Other (full discipline list: intervals-icu://event-categories resource). Required for RACE_A/B/C events.
start_dateYesStart date in YYYY-MM-DD format
descriptionNoEvent description (plain text for non-workouts). For WORKOUT events the server parses this into structured, device-syncable steps with zones and a training load. Use Intervals.icu workout syntax: one step per line as '- <duration> <target>' (duration FIRST), grouped under Warmup / Main / Cooldown headers. Targets: bike '- 5m 85%', '- 5m Z4', or absolute '- 5m 210w'; HR '- 10m 70-80% HR' or '- 10m 145bpm'; run/swim pace '- 5m Z2 Pace', absolute only with a trailing 'pace' word: '- 5m 4:45/km pace', '- 200mtr 1:45/100m pace' (bare '5:00/km' or '1:45/100m' silently drops); threshold is relative — run '- 25m 100% pace', swim CSS '- 200mtr 100% pace' — the words 'threshold'/'CSS'/'5K pace' are NOT parsed as targets. Add cadence to any step: '- 3m Z2 90rpm'. No target: '- 20m free'. Repeats: put 'Nx' after a section name with steps flat beneath, and leave a blank line before and after the repeat block (without it the repeat silently runs only once) — e.g. 'Main 5x' then '- 3m 110%' / '- 3m 50%'. Ramps: '- 10m ramp 50-70%'. Rest: append 'Ns rest' to a step ('- 200mtr Z2 20s rest') or use a separate '- 20s intensity=rest' step (only intensity=rest exports as a device rest step) — never a bare '- 20s' step (that becomes work, not rest). Durations: 'm'=minutes, 's'=seconds; distance steps use 'mtr'=meters / 'km' / 'yrd' (e.g. swim '- 400mtr Z2 Pace'). Do NOT write '[repeat 5x ...]', nested bullets, or 'Z5 3m' (target before duration). Runs need a pace or HR target — a bare 'Z2' gives no load. Full reference: intervals-icu://workout-syntax resource.
show_as_noteNoShow event as a note marker on the fitness chart
training_loadNoPlanned training load
distance_metersNoPlanned distance in meters
duration_secondsNoPlanned duration in seconds
show_on_ctl_lineNoRender event on the CTL line
not_on_fitness_chartNoHide event entirely from the fitness chart
training_availabilityNoTraining availability: NORMAL, LIMITED, or UNAVAILABLE. Typical for INJURED/SICK/HOLIDAY blocks.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare this is a non-read-only, open-world, non-destructive, non-idempotent mutation. The description adds useful context: it creates exactly one event, workout syntax in the description field is parsed into structured device-syncable steps, and alternative tools should be used for bulk or duplication. It does not warn about duplicate event creation on retry or mention permission prerequisites, but overall it adds meaningful behavioral context beyond the annotations.

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?

Three tightly focused paragraphs. The purpose and scope are front-loaded, alternatives are enumerated clearly, and resource pointers close the description without redundant detail. Every sentence adds routing or reference 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?

For a 15-parameter mutation tool with an output schema, the description covers its purpose, sibling alternatives, and relevant resources, while the schema covers parameter details. A minor gap is the absence of an explicit non-idempotency warning about retries creating duplicates, but annotations and the bulk/duplicate routing largely cover the agent's needs.

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 100%, so the input schema already documents all 15 parameters in detail, including the workout syntax. The description points to the same resources the schema already references and adds no new parameter-level semantics, so the 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?

States a specific verb (create) and resource (calendar event) with scope clarified as 'ONE new calendar event from scratch.' It differentiates from sibling tools by explicitly naming icu_bulk_create_events and icu_duplicate_events and describing when each applies.

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 routes multi-event creation to icu_bulk_create_events and existing-event duplication to icu_duplicate_events. It also specifies which resource to consult for category and training_availability guidance, leaving no ambiguity about when to use this tool.

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

icu_create_gearB

Create a new gear item for tracking equipment usage and maintenance (bikes, shoes, trainers, etc.).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of the gear item
activeNoWhether this gear is actively used (False = retired)
gear_typeYesGear type, case-insensitive. Whole items: Bike, Shoes, Wetsuit, Trainer, RowingMachine, Skis, Snowboard, Boat, Board, Equipment, Accessories, Apparel, Computer. Components: Chain, Cassette, Wheel, Tyre, Frame, Pedals, PowerMeter, and more.
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=true, so the safety profile is covered structurally. The description adds no behavioral context beyond that: it says nothing about duplicate names (relevant given idempotentHint=false), permission requirements, or whether the new gear is auto-assigned to activities.

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?

A single front-loaded sentence with the verb first, resource second, and domain examples last. No filler, no repetition of schema or annotation 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?

An output schema exists, so return values need not be explained, and annotations carry the safety profile; the description covers purpose adequately for a 4-parameter create tool. The only real gap is the absence of any note on duplicate handling or the coach/athlete_id scenario.

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 100%, so name, active, gear_type and athlete_id are all documented in the schema itself, including the gear_type vocabulary list. The description adds no parameter-level meaning beyond that, making the baseline 3 appropriate.

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?

States a specific verb and resource ('Create a new gear item') and clarifies the domain with concrete examples (bikes, shoes, trainers). It is distinguishable from icu_update_gear, icu_delete_gear and icu_get_gear_list by the verb, though it does not explicitly call out the near-neighbor icu_create_gear_reminder.

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 phrase 'for tracking equipment usage and maintenance' implies why an agent would create gear, but there is no explicit when-to-use statement, no prerequisite (e.g. athlete_id for coaches), and no named alternatives. Usage is inferable rather than stated.

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

icu_create_gear_reminderA

Create a maintenance reminder for a gear item, triggered by distance, time, or both.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesReminder text (e.g., 'Replace chain', 'New shoes')
gear_idYesID of the gear item
athlete_idNoAthlete ID (for coaches managing multiple athletes)
time_alertNoAlert every N hours (e.g., 100 for every 100 hours)
distance_alertNoAlert every N kilometers (e.g., 500 for every 500km)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations declare write (readOnlyHint=false), non-idempotent, non-destructive, open-world. The description adds that the reminder can be triggered by distance, time, or both, which is behavioral context beyond the annotations. However, it doesn't mention what happens on duplicate creation, permission needs, or whether the reminder is immediately active.

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?

One sentence that front-loads the action and resource, with zero wasted words. The trigger condition is integrated efficiently.

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, the description needn't explain return values. It covers the core purpose and trigger mechanism. Missing usage guidelines and any edge-case behavior, but for a straightforward creation tool with full schema coverage and annotations, it's largely complete.

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 coverage is 100%, so all five parameters are fully described in the schema. The description adds no new parameter meaning beyond the schema; the only added value is the trigger concept, which aligns with the existing distance_alert/time_alert parameters. Baseline 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?

States a specific verb (Create) and resource (maintenance reminder for a gear item), and the trigger mechanism (distance, time, or both) distinguishes it from siblings like icu_create_gear or icu_update_gear_reminder. No ambiguity about what the tool produces.

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 versus icu_update_gear_reminder, nor any note about prerequisites (e.g., gear must exist). The description only says what it does, not when to choose it.

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

icu_create_sport_settingsB

Create a per-sport threshold record with outdoor/indoor FTP, FTHR, pace, or swim settings.

ParametersJSON Schema
NameRequiredDescriptionDefault
ftpNoFunctional Threshold Power in watts (for cycling)
fthrNoFunctional Threshold Heart Rate in bpm
athlete_idNoAthlete ID (for coaches managing multiple athletes)
indoor_ftpNoIndoor Functional Threshold Power in watts (for cycling)
sport_typeYesType of sport (e.g., 'Ride', 'Run', 'Swim')
pace_thresholdNoThreshold pace in min/km (e.g., 4.5 for 4:30/km)
swim_thresholdNoSwim threshold in min/100m (e.g., 1.5 for 1:30/100m)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare this as a non-read-only, open-world, non-idempotent, non-destructive write. The description adds that the record is per-sport and enumerates the threshold families, but says nothing about duplicate handling, authorisation, or what happens to existing records. With annotations covering the safety profile, this is a modest but real addition.

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?

A single front-loaded sentence with a clear verb and a compact enumeration of the covered metrics. No filler, no redundancy.

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?

An output schema exists, so return values need not be described. However, as a mutation on a resource that also has get/update/apply siblings, the absence of usage routing and mutation semantics leaves the definition only minimally complete.

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 100%, so every one of the 7 parameters is already documented in the schema with useful detail (units, examples, coach context). The description only echoes the metric families and adds no format or constraint information beyond what the schema provides. Baseline 3 applies.

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 states a specific verb (Create) and resource (per-sport threshold record) and enumerates the covered metric families (outdoor/indoor FTP, FTHR, pace, swim). It does not name the sibling tools or explain how it differs from create_sport_settings, get_sport_settings, or update_sport_settings, so it stops short of 5.

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?

There is no when-to-use guidance, no indication of when to choose create vs update_sport_settings or apply_sport_settings, and no prerequisites. The agent is left to infer usage from the name alone.

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

icu_create_workoutA

Save ONE new reusable workout into a LIBRARY folder or training plan — it does not go on the calendar.

To schedule a workout on a date use icu_create_event. For two or more library workouts use icu_bulk_create_workouts; to change a saved one use icu_update_workout. Make a new folder or plan with icu_create_workout_folder, and put a plan's workouts on the calendar with icu_apply_training_plan.

ParametersJSON Schema
NameRequiredDescriptionDefault
dayNoPLAN folders only: day offset from plan start (0 = day 1 of week 1, 7 = day 1 of week 2). Omit for plain folders.
nameYesWorkout name
tagsNoTags for organizing the library
colorNoCustom display color (hex string)
indoorNoMark as an indoor workout
targetNoDevice target type: AUTO, POWER, HR, or PACE
folder_idYesExisting library folder or plan ID (from icu_get_workout_library)
athlete_idNoAthlete ID (for coaches managing multiple athletes)
descriptionNoWorkout steps, parsed the same way as a WORKOUT calendar event. For WORKOUT events the server parses this into structured, device-syncable steps with zones and a training load. Use Intervals.icu workout syntax: one step per line as '- <duration> <target>' (duration FIRST), grouped under Warmup / Main / Cooldown headers. Targets: bike '- 5m 85%', '- 5m Z4', or absolute '- 5m 210w'; HR '- 10m 70-80% HR' or '- 10m 145bpm'; run/swim pace '- 5m Z2 Pace', absolute only with a trailing 'pace' word: '- 5m 4:45/km pace', '- 200mtr 1:45/100m pace' (bare '5:00/km' or '1:45/100m' silently drops); threshold is relative — run '- 25m 100% pace', swim CSS '- 200mtr 100% pace' — the words 'threshold'/'CSS'/'5K pace' are NOT parsed as targets. Add cadence to any step: '- 3m Z2 90rpm'. No target: '- 20m free'. Repeats: put 'Nx' after a section name with steps flat beneath, and leave a blank line before and after the repeat block (without it the repeat silently runs only once) — e.g. 'Main 5x' then '- 3m 110%' / '- 3m 50%'. Ramps: '- 10m ramp 50-70%'. Rest: append 'Ns rest' to a step ('- 200mtr Z2 20s rest') or use a separate '- 20s intensity=rest' step (only intensity=rest exports as a device rest step) — never a bare '- 20s' step (that becomes work, not rest). Durations: 'm'=minutes, 's'=seconds; distance steps use 'mtr'=meters / 'km' / 'yrd' (e.g. swim '- 400mtr Z2 Pace'). Do NOT write '[repeat 5x ...]', nested bullets, or 'Z5 3m' (target before duration). Runs need a pace or HR target — a bare 'Z2' gives no load. Full reference: intervals-icu://workout-syntax resource.
workout_typeNoActivity discipline: Ride, Run, Swim, Walk, Hike, WeightTraining, Workout, VirtualRide, VirtualRun, Other (full discipline list: intervals-icu://event-categories resource)
training_loadNoPlanned training load
distance_metersNoPlanned distance in meters
duration_secondsNoPlanned duration in seconds

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate a non-read-only, non-destructive write operation. The description adds useful behavioral context beyond that: it saves a single reusable workout to a library or plan, does not touch the calendar, and is not bulk. It doesn't detail potential side effects like duplicate creation on repeated calls, but the idempotentHint=false annotation already signals that risk.

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, front-loads the core purpose and key exclusion, and then efficiently routes to all relevant sibling tools in three sentences. Every sentence adds actionable value with no filler.

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 13-parameter write tool with an output schema and 100% schema coverage, the description adequately covers the operation's scope, destination, and sibling alternatives. The detailed parameter semantics and return structure are already handled by the schema, so nothing critical is missing for an agent to invoke it correctly.

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 100%, so the baseline is 3. The outer description does not add parameter-level semantics beyond the schema, though the schema itself contains an extensive workout syntax reference for the description parameter. The description's main contribution is clarifying the destination (library folder or plan), which is already partially reflected by folder_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?

The description states a specific verb ('Save'), a precise resource scope ('ONE new reusable workout into a LIBRARY folder or training plan'), and an explicit exclusion ('it does not go on the calendar'). It also differentiates itself from related siblings by naming create_event, bulk_create_workouts, and update_workout.

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 gives explicit routing guidance for exactly when to use this tool versus alternatives: calendar scheduling goes to icu_create_event, multiple library workouts go to icu_bulk_create_workouts, edits go to icu_update_workout, and folder/plan creation goes to icu_create_workout_folder. This leaves no ambiguity about the intended use case.

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

icu_create_workout_folderA

Create a new LIBRARY folder or training PLAN to hold workouts — not a calendar item.

Pass the returned id as folder_id to icu_create_workout or icu_bulk_create_workouts. To browse existing folders use icu_get_workout_library.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesFolder or plan name
athlete_idNoAthlete ID (for coaches managing multiple athletes)
descriptionNoFolder or plan description
folder_typeNoFOLDER (a plain collection of workouts) or PLAN (a training plan whose workouts sit on plan days, schedulable with icu_apply_training_plan)FOLDER

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate this is a mutating, non-idempotent, non-destructive operation, and the description's 'Create' is consistent with that. Beyond annotations, it adds useful context: the object belongs to the workout library rather than the calendar, and the result is meant to be consumed as a folder_id by other tools.

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?

Three short sentences, no fluff, with the core purpose front-loaded and the downstream usage stated immediately after. Every sentence earns its place.

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 create tool with only one required parameter, full schema coverage, and an output schema, the description provides enough orientation: what is created, what it is not, how to use the result, and where to look for existing folders. Nothing essential is missing.

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 100%, so the schema already documents name, athlete_id, description, and folder_type. The description adds no new parameter-level detail beyond reinforcing the FOLDER/PLAN distinction, which is already present in 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 states a specific verb and resource ('Create a new LIBRARY folder or training PLAN') and immediately distinguishes this from a calendar item, which separates it from event-creation siblings. It also names the downstream workflow, so an agent knows exactly what the tool is for.

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 explicitly says what this tool is not ('not a calendar item'), where the returned id should be passed (icu_create_workout or icu_bulk_create_workouts), and how to browse existing folders (icu_get_workout_library). This gives clear when-to-use and alternative guidance.

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

icu_delete_eventA
DestructiveIdempotent

Permanently delete ONE calendar event by ID. Destructive — cannot be undone.

In safe delete mode (default), past events are refused and reported in the skipped envelope with a hint about INTERVALS_ICU_DELETE_MODE=full. Returns a deleted / skipped envelope either way.

ParametersJSON Schema
NameRequiredDescriptionDefault
event_idYesEvent ID to delete
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Beyond annotations (destructiveHint=true), the description adds that deletion is permanent and cannot be undone, and details the safe mode refusal of past events and the envelope responses.

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, front-loaded with the key action and destructive nature, followed by mode and response details. No wasted words.

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 simple deletion tool with an output schema, the description covers the essential behavior (permanent delete, safe mode, response format) without needing to explain return values.

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 coverage is 100% with clear descriptions for both parameters. The description does not add additional meaning beyond what the schema 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 it permanently deletes ONE calendar event by ID, distinguishing it from sibling tools like icu_bulk_delete_events (bulk) and icu_update_event (update).

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 the destructive nature and safe mode behavior, but does not explicitly mention when to use this tool versus alternatives. However, the name and context imply single-event deletion.

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

icu_delete_gearA
DestructiveIdempotent

Permanently delete a gear item and its maintenance reminders. Activities that used this gear are not affected.

ParametersJSON Schema
NameRequiredDescriptionDefault
gear_idYesID of the gear item to delete
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

The annotations already indicate destructive=true, idempotent=true, and readOnly=false. The description adds crucial context not covered by annotations: the deletion is permanent, it cascades to maintenance reminders, and it does not affect activities. This is valuable behavioral detail, though it doesn't mention authentication, rate limits, or recovery options.

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 concise sentences, front-loaded with the core action and followed by an important clarification. Every sentence earns its place with no redundancy.

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 destructive nature and the presence of an output schema, the description provides all necessary context: it confirms permanence, mentions the cascade to reminders, and clarifies that activities are unaffected. The annotations and output schema cover the rest.

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 100%, so the schema already documents both parameters. The description does not add any parameter-specific information beyond what the schema provides, which is the baseline expectation (3) when schema coverage is high.

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 states a specific verb ('Permanently delete'), a specific resource ('gear item'), and explicitly scopes the effect ('and its maintenance reminders' / 'Activities that used this gear are not affected'). This distinguishes it from sibling tools like icu_update_gear and icu_create_gear_reminder.

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 conveys when to use this tool (to delete a gear item) and the scope of the deletion, including that activities are unaffected. However, it does not mention alternatives (e.g., archiving vs. deleting) or prerequisites, so it falls short of a 5.

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

icu_delete_workoutA
DestructiveIdempotent

Permanently delete ONE workout from the LIBRARY. Destructive — cannot be undone.

Removes the library workout only; calendar events are separate records deleted with icu_delete_event. Confirm with the user before calling if unsure.

ParametersJSON Schema
NameRequiredDescriptionDefault
athlete_idNoAthlete ID (for coaches managing multiple athletes)
workout_idYesLibrary workout ID to delete (from icu_get_workouts_in_folder)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Even though destructiveHint is already set, the description adds important context: the deletion is permanent and cannot be undone, it applies only to library workouts, and it does not delete associated calendar events. This goes beyond the annotation by clarifying exactly what gets destroyed and what does not.

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?

Three short sentences with no filler. The destructive nature is front-loaded, followed by scope and the relevant alternative. Every sentence earns its place.

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 simple two-parameter destructive tool with a full output schema and supportive annotations, the description covers what is deleted, what is not deleted, how to delete related records, and a user-confirmation safeguard. Nothing essential is missing.

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 100%, so the schema already documents workout_id and athlete_id. The description does not add new parameter-level meaning beyond confirming the singular 'ONE workout' target, but it also does not need to compensate for schema gaps.

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 states the exact verb and resource: 'Permanently delete ONE workout from the LIBRARY.' It also clearly distinguishes this from calendar-event deletion, which is handled by a different tool, so there is no ambiguity about what this tool operates on.

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 says when to use this tool versus alternatives: it deletes library workouts only, while calendar events must be deleted with icu_delete_event. It also instructs the agent to confirm with the user before calling if unsure, which is a clear usage safeguard.

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

icu_download_activity_fileA
Read-onlyIdempotent

Download the original activity file.

Downloads the ORIGINAL uploaded file (FIT, TCX, or GPX — whatever the device produced). Different from download_fit_file (forces FIT conversion) and download_gpx_file (forces GPX conversion). If output_path is set the file is saved there; otherwise the response embeds base64 content.

ParametersJSON Schema
NameRequiredDescriptionDefault
activity_idYesActivity ID to download
output_pathNoPath to save the file (optional)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Discloses behavior beyond annotations: if output_path is set, file saved; otherwise base64 content. No contradiction with annotations.

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?

Three sentences, front-loaded purpose, then details. No unnecessary words, well structured.

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?

Complete given output schema and input schema coverage. Covers core functionality, differentiation, and optional behavior.

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 100% so baseline 3. Description adds context: output_path optional with save vs base64 behavior, adding value 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?

Clearly states it downloads the original activity file (FIT, TCX, GPX) and distinguishes from sibling tools (download_fit_file, download_gpx_file). Verb and resource are specific.

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 explains when to use this tool (for original file) vs alternatives (forced conversions), naming the sibling tools and their differences.

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

icu_download_fit_fileA
Read-onlyIdempotent

Download activity converted to FIT format (Garmin / most training platforms). Different from download_activity_file (original upload format) and download_gpx_file (GPX format).

ParametersJSON Schema
NameRequiredDescriptionDefault
activity_idYesActivity ID to download
output_pathNoPath to save the FIT file (optional)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already indicate read-only, non-destructive, idempotent behavior. The description adds valuable context: the tool converts the activity to FIT format and targets Garmin/training platforms. This goes beyond annotations without contradicting them.

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 concise sentences. The first sentence specifies the core action, and the second provides differentiation. No unnecessary words, and the information is effectively front-loaded.

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 presence of an output schema and high schema coverage, the description sufficiently explains the tool's purpose and how it differs from siblings. It does not need to explain return values since the output schema covers that.

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 coverage is 100% and parameter descriptions are adequate. The description does not add new information about the parameters beyond what is in the schema, so it meets the baseline but does not exceed.

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 verb 'Download' and the resource 'activity converted to FIT format', specifying its intended use for Garmin and training platforms. It explicitly differentiates from sibling tools by naming alternative formats, making the purpose unambiguous.

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 names two alternatives (download_activity_file and download_gpx_file) and explains their differences, guiding when to use this tool. However, it lacks explicit when-not-to-use scenarios or prerequisites, which would make it a 5.

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

icu_download_gpx_fileA
Read-onlyIdempotent

Download activity converted to GPX format (GPS devices, mapping software). Different from download_activity_file (original upload format) and download_fit_file (FIT format).

ParametersJSON Schema
NameRequiredDescriptionDefault
activity_idYesActivity ID to download
output_pathNoPath to save the GPX file (optional)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description adds that the tool converts the activity to GPX format, which is a specific behavioral trait beyond the annotations. No contradictions.

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, front-loading the purpose and adding differentiation. Every word serves a purpose with no redundancy or 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 tool's simplicity, strong annotations, and an output schema, the description is complete. It explains the conversion format and how it differs from siblings, leaving no obvious gaps for an agent.

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 input schema already covers 100% of parameter descriptions (activity_id and output_path). The description does not add extra meaning beyond what the schema provides, so the 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 downloads an activity converted to GPX format for GPS devices and mapping software. It explicitly distinguishes itself from sibling tools download_activity_file and download_fit_file by naming the formats, providing clear purpose and differentiation.

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 implies when to use this tool: when you need GPX format. It explicitly contrasts with two sibling tools, giving context for selection. While it doesn't list when not to use, the differentiation is strong enough for an agent to decide.

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

icu_duplicate_eventsA

COPY existing events forward in time by N weeks.

Use when the user says "repeat this workout for the next 4 weeks", "duplicate Monday's run on the next 3 Mondays". Reuses the existing events' payloads — different from icu_create_event / icu_bulk_create_events, which both build NEW events from scratch.

ParametersJSON Schema
NameRequiredDescriptionDefault
event_idsYesJSON array of event IDs to duplicate (e.g., '[123, 456]')
athlete_idNoAthlete ID (for coaches managing multiple athletes)
num_copiesNoNumber of copies to create
weeks_betweenNoWeeks between each copy

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Description notes that the tool reuses existing event payloads, adding context beyond annotations. Annotations indicate mutation (readOnlyHint false) but non-destructive (destructiveHint false). Minor gap: no mention of potential limits or side effects, but sufficient for typical use.

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?

Three sentences, front-loaded with the core action, and no unnecessary words. Every sentence adds value, achieving maximum conciseness.

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 simple duplication tool with good annotations and output schema, the description covers purpose, usage, behavior, and differentiation completely. No missing information for effective use.

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?

Input schema has 100% coverage with clear descriptions for all four parameters. Description does not add new parameter semantics beyond schema explanations. A score of 3 reflects that the schema already handles parameter meaning adequately.

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 the tool copies events forward in time using verb 'COPY' and specifies the resource ('existing events'). It explicitly distinguishes from sibling tools icu_create_event and icu_bulk_create_events, meeting the highest standard.

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?

Description provides explicit usage scenarios with examples ('repeat this workout for the next 4 weeks') and clarifies when NOT to use it (when building new events from scratch), offering clear alternative tools.

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

icu_get_activities_aroundA
Read-onlyIdempotent

Fetch the activities chronologically before and after a reference activity (N each side).

Use for "what did I do around this race?", training-context queries, progression comparisons.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNoNumber of activities before and after
athlete_idNoAthlete ID (for coaches managing multiple athletes)
activity_idYesReference activity ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is fully covered. The description adds no behavioral context beyond that (no note on what happens if the reference activity is missing, ordering guarantees, or result shape). Minimum-viable but consistent with the annotations.

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 tight sentences, front-loaded with the operation and its distinctive symmetric-window semantics, followed by compact usage examples. No 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?

For a read-only tool with a full output schema and 100% schema coverage, the description supplies what is needed to select and call it. It could be slightly stronger with an edge-case note on an unknown activity_id, but nothing essential is missing.

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 100%, so all three parameters are already documented in the schema. The description's '(N each side)' mildly reinforces the semantics of count, but adds no syntax or format detail beyond the schema. Baseline 3 applies.

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?

States a specific verb ('Fetch') and resource ('activities') with a precise anchor: chronologically before and after a reference activity, N each side. This scope is inherently distinguishable from date-range or recent-activity siblings, though no sibling is named to make the contrast explicit.

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?

Gives three concrete when-to-use triggers ('what did I do around this race?', training-context queries, progression comparisons), which is clear usage context. It stops short of stating when NOT to use it or naming an alternative such as a date-range or search tool.

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

icu_get_activities_by_dateA
Read-onlyIdempotent

List activities within an EXPLICIT date window (oldest..newest) — LIGHT summary per item.

Unlike icu_get_recent_activities (anchored to today and capped at 100), this targets an arbitrary historical window and is bounded only by limit. Use for "all my runs from June to November 2025", reconstructing training history, or finding the oldest activity in a period. Dates are YYYY-MM-DD. Results are newest-first; if a window holds more than limit items, the oldest are dropped first, so widen limit (or narrow the window) to reach the very oldest.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax activities to return (newest-first within the window)
newestNoNewest date to include, YYYY-MM-DD (inclusive). Defaults to today.
oldestYesOldest date to include, YYYY-MM-DD (inclusive)
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already indicate read-only, open-world, idempotent, and non-destructive. The description adds that results are newest-first, oldest dropped if limit exceeded, and that it returns a 'light summary.' These add context beyond annotations, but could further clarify what 'light summary' entails.

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, using only a few sentences. It front-loads the core purpose, contrasts with a sibling, and uses bullet-like dashes for clarity. Every sentence serves a purpose with 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 tool's complexity (4 params, output schema exists, rich annotations), the description is complete. It explains date window, ordering, limit behavior, and offers usage guidance. The output schema likely covers the return structure, so no further detail needed.

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 100% with descriptions for all 4 parameters. The description reinforces date format (YYYY-MM-DD), defaults, and the limit's impact on dropping oldest items. It adds value by explaining behavior, but the schema already covers basic parameter meanings.

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 lists activities within an explicit date window with a light summary. It specifies the verb 'list' and resource 'activities,' and immediately contrasts with the sibling icu_get_recent_activities, making its purpose distinct.

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 provides when to use this tool vs. the sibling, including concrete use cases like 'all my runs from June to November 2025' and advice on handling the limit parameter. It also explains ordering and dropping behavior for oldest items.

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

icu_get_activity_detailsA
Read-onlyIdempotent

Fetch the headline SUMMARY of one activity — name, sport, date, distance, duration, training load, weather, plus all top-level metrics in a single JSON blob.

Use for "how was my ride?", "tell me about activity X". For lap-by-lap or per-interval breakdown use icu_get_activity_intervals; for second-by-second time-series use icu_get_activity_streams.

ParametersJSON Schema
NameRequiredDescriptionDefault
activity_idYesActivity ID to fetch

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, destructiveHint, idempotentHint, and openWorldHint. The description adds that it returns a single JSON blob with top-level metrics, which is additional behavioral context but doesn't contradict annotations. It doesn't disclose potential limitations like rate limits or authorization, but the safety profile is already well-covered.

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, consisting of three sentences. The first sentence defines the tool's purpose, the second gives example use cases, and the third points to alternatives. Every sentence adds value and nothing is extraneous.

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 tool has one simple parameter and an output schema exists. The description explains what the output contains (headline summary with top-level metrics). Given the low complexity, this description is fully complete for an agent to select and invoke the tool correctly.

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

Parameters3/5

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

The input schema has one parameter (activity_id) with description 'Activity ID to fetch'. Schema description coverage is 100%, so the baseline is 3. The description does not add further meaning beyond the schema's own description, so it stays at 3.

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 fetches the headline SUMMARY of one activity, listing specific metrics like name, sport, date, distance, duration, training load, weather, and all top-level metrics. It also distinguishes between this tool and its siblings icu_get_activity_intervals and icu_get_activity_streams.

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 provides use cases (e.g., 'how was my ride?', 'tell me about activity X') and tells when not to use it: for lap-by-lap or per-interval breakdown use icu_get_activity_intervals, for second-by-second time-series use icu_get_activity_streams.

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

icu_get_activity_intervalsA
Read-onlyIdempotent

Fetch the per-LAP / per-interval breakdown of one activity — each segment with its target, actual power/HR/pace, and type (warm-up / work / rest / cool-down).

Use for workout-compliance analysis, lap-by-lap review, "did I hit my intervals?". For headline summary metrics use get_activity_details; for raw second-by-second data use get_activity_streams.

ParametersJSON Schema
NameRequiredDescriptionDefault
activity_idYesActivity ID to fetch intervals for

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, so the description does not need to repeat that. It adds value by describing the returned data structure (segments with targets, actuals, types). No contradictions or missing behavioral info.

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 three sentences, front-loaded with core purpose, followed by usage guidance. Every sentence adds value with no redundancy or filler.

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 tool with one parameter and an output schema, the description covers everything needed: what it returns, when to use it, and how it differs from related tools. The output schema handles return format details.

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, activity_id, is fully described in the input schema (100% coverage). The description does not add additional semantics beyond what the schema provides, so 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 verb 'Fetch' and the resource 'per-LAP / per-interval breakdown of one activity', listing specific data elements (target, actual power/HR/pace, segment types). It distinguishes itself from sibling tools like get_activity_details and get_activity_streams, making the purpose unmistakable.

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?

Explicit usage context is provided: 'workout-compliance analysis, lap-by-lap review', along with direct alternatives: 'For headline summary metrics use get_activity_details; for raw second-by-second data use get_activity_streams.' This is exemplary guidance.

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

icu_get_activity_messagesA
Read-onlyIdempotent

Read the notes and comments attached to a specific activity (plural = READ).

Use when the user asks: "what did my coach say about that ride?", "show me the comments on yesterday's run", "any feedback on this workout?". Returns every message in chronological order with author, content, timestamp, and seen-flag. To POST a new message use icu_add_activity_message (singular = WRITE).

ParametersJSON Schema
NameRequiredDescriptionDefault
activity_idYesThe Intervals.icu activity ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint, destructiveHint, idempotentHint), the description details the return format: 'every message in chronological order with author, content, timestamp, and seen-flag'. This adds meaningful behavioral context not present in annotations.

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 (4 sentences), front-loaded with the core purpose, and each sentence serves a clear role: definition, usage examples, return specification, and sibling differentiation. No wasted words.

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 tool is simple (1 param, output schema exists, annotations clear). The description fully covers what the tool does, when to use it, what it returns, and its sibling relationship. No gaps for an agent to act on.

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 coverage is 100% with the single parameter 'activity_id' already described. The description does not add further parameter semantics, but baseline 3 is appropriate given high 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 the verb ('Read') and resource ('notes and comments attached to a specific activity'). It also distinguishes itself from the sibling tool 'icu_add_activity_message' by marking it as READ vs WRITE, leaving no ambiguity about the tool's 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 provides explicit when-to-use examples like 'what did my coach say about that ride?' and 'show me the comments on yesterday's run'. It also tells when NOT to use this tool by directing to icu_add_activity_message for posting new messages, effectively giving usage boundaries.

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

icu_get_activity_streamsA
Read-onlyIdempotent

Fetch RAW per-sample time-series of one activity — second-by-second arrays for power, HR, cadence, speed, altitude, GPS, temperature, grade, etc.

Heavy payload. Use only when you need the underlying signal for visualization or custom analysis. Most "how was my ride?" questions are better answered by get_activity_details (summary metrics) or get_activity_intervals (per-lap breakdown).

Stream-type filter accepts any of: watts, heartrate, cadence, velocity_smooth, altitude, distance, time, latlng, temp, moving, grade_smooth, raw_heartrate, fixed_heartrate.

heartrate is CORRECTED data: Intervals.icu replaces readings above the athlete's configured max HR with an interpolated line at import, so it can never exceed that setting. raw_heartrate is the uncorrected trace and is the only way to see a genuine new max that was clipped away — the platform never raises the setting on its own. Request it explicitly; it is not in the default set.

ParametersJSON Schema
NameRequiredDescriptionDefault
streamsNoList of stream types (e.g., ['watts', 'heartrate', 'cadence']). If not specified, the activity's default streams are fetched — which does NOT include raw_heartrate or fixed_heartrate; ask for those by name.
activity_idYesActivity ID to fetch streams for

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover read-only/idempotent/destructive flags, but the description adds substantial non-obvious behavior: payload heaviness warning, and the crucial heartrate-vs-raw_heartrate semantic — that heartrate is pre-corrected and capped at max HR while raw_heartrate exposes the clipped peak. This corrects a real misinterpretation risk.

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?

Front-loads the core purpose, then usage routing, then filter values, then the important heartrate nuance. Dense but every paragraph earns its place; the multi-paragraph layout could be slightly tighter but nothing is wasted.

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?

Output schema exists so return shape needn't be explained. Given the tool's complexity, the description covers what it returns, when to choose it vs siblings, valid filters, and the subtle raw_heartrate caveat — nothing an agent needs to call it correctly is missing.

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 100% and already documents both params, so baseline is 3. The description goes beyond by enumerating the accepted stream-type values (including ones the schema does not list) and warning that the default set excludes raw_heartrate/fixed_heartrate — real added 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?

Specific verb ('Fetch') plus resource ('RAW per-sample time-series') with an explicit enumeration of what streams are returned. It clearly distinguishes itself from sibling summary tools (get_activity_details, get_activity_intervals) and from the mutation sibling (update_activity_streams).

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?

Explicit when-to-use ('visualization or custom analysis') and when-not ('Most "how was my ride?" questions are better answered by get_activity_details or get_activity_intervals'), naming the specific alternatives. This is exactly the routing guidance an agent needs.

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

icu_get_annual_training_planA
Read-onlyIdempotent

Read the Annual Training Plan (ATP) on the calendar — weekly load targets (TSS), Base/Build/Peak phases, and ATP week notes.

Use when the user asks: "what's my weekly TSS target?", "what training phase am I in?", "show my periodization plan", "when are my recovery weeks?", "what's the note on this training week?". Defaults to a 365-day forward window so the full ATP is returned; pass a smaller days_ahead/days_back when the user asks about a specific month or week. NOT individual planned workouts (icu_get_upcoming_workouts), NOT all calendar entries (icu_get_calendar_events), NOT workout-library plan folders (icu_get_workout_library / icu_apply_training_plan).

ParametersJSON Schema
NameRequiredDescriptionDefault
days_backNoNumber of days to look back
athlete_idNoAthlete ID (for coaches managing multiple athletes)
days_aheadNoDays to look ahead (default 365 — full annual plan). Narrow for month/week queries, e.g. 31 for July.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Adds behavioral details beyond annotations: defaults to 365-day window, suggests narrowing for specific queries. Annotations already indicate read-only, idempotent, non-destructive, and open world, so description complements well.

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 paragraphs: first defines tool, second lists use cases and exclusions. No fluff, 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?

Fully addresses what the tool returns, default behavior, and when to use it. Output schema exists but description doesn't need to detail return values.

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 covers all 3 parameters with descriptions. Description adds usage context (default 365, narrow for month/week) and hints for days_back, but schema already provides basics.

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 'Read the Annual Training Plan (ATP) on the calendar' with specific elements (TSS, phases, notes). Distinguishes from sibling tools like icu_get_upcoming_workouts by explicitly naming what it is NOT.

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 use cases ('what's my weekly TSS target?', 'what training phase am I in?') and lists three sibling tools NOT to use, guiding correct tool selection.

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

icu_get_athlete_profileA
Read-onlyIdempotent

Get an athlete's profile — sport settings (outdoor/indoor FTP, FTHR, pace) and current CTL/ATL/TSB.

Defaults to the authenticated athlete; coaches can pass athlete_id to read one of their managed athletes instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld, and non-destructive behavior, so the safety profile is covered. The description adds meaningful behavioral context beyond that: the default target identity and the coach-scoped athlete_id override.

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 compact sentences, front-loaded with the tool's purpose and followed by the default/override behavior. Every clause adds useful information with no filler.

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 present and rich annotations, the description does not need to explain return values. It covers the tool's purpose, default behavior, and sole parameter sufficiently for correct invocation.

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 100%, so the baseline is 3. The description adds meaning beyond the schema by explaining that athlete_id defaults to the authenticated athlete and is specifically for coaches reading managed athletes.

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 states a specific verb and resource ('Get an athlete's profile') and enumerates the returned data: sport settings and current CTL/ATL/TSB. It does not explicitly differentiate from siblings such as icu_get_sport_settings or icu_get_fitness_summary, though the combined scope implies a broader profile read.

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?

It provides clear context for the optional athlete_id: defaults to the authenticated athlete, while coaches can pass an ID for a managed athlete. However, it gives no guidance on when to choose this tool over related siblings like icu_get_sport_settings or icu_get_fitness_summary.

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

icu_get_best_effortsA
Read-onlyIdempotent

Find the top-N peak efforts WITHIN a single activity for a given stream + target duration or distance.

Different from get_*_curves (which span many activities). Useful for "what was my best 20-min power on this ride?" or "show my top 5k splits in this run." Requires at least one of duration or distance.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNoNumber of efforts to return (default 8)
streamNoStream to search for best efforts: 'watts', 'heartrate', or 'pace'watts
distanceNoDistance of each effort in meters (e.g., 5000 for 5k). At least one of 'duration' or 'distance' is required.
durationNoDuration of each effort in seconds (e.g., 60 for 1-min, 1200 for 20-min). At least one of 'duration' or 'distance' is required.
activity_idYesActivity ID to analyze

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate read-only, non-destructive, idempotent behavior. Description adds context about scope (single activity) and parameter dependencies. No contradictions.

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?

Three sentences with no wasted words. Front-loaded with core purpose, then differentiation, examples, and requirement.

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?

Covers core functionality, differentiation, examples, and requirement. Output schema exists so return values are handled. Minor gap in behavior when both duration and distance are given.

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 has 100% coverage with descriptions. Description echoes schema terms and adds examples but does not provide additional semantic 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?

The description clearly states the tool finds top-N peak efforts within a single activity, with specific verb 'find' and resource 'peak efforts'. It distinguishes from sibling get_*_curves tools that span many activities.

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?

Provides explicit examples ('what was my best 20-min power') and states requirement for at least one of duration or distance. Could be clearer on handling when both duration and distance are provided.

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

icu_get_calendar_eventsA
Read-onlyIdempotent

Fetch ALL calendar entries in a date window — workouts, notes, races, goals, life-event blocks.

Use for "what's on my calendar?", "show this week", broad calendar queries. For just the planned WORKOUT entries (filtered) use icu_get_upcoming_workouts. For one specific event by ID use get_event.

ParametersJSON Schema
NameRequiredDescriptionDefault
days_backNoNumber of days to look back
athlete_idNoAthlete ID (for coaches managing multiple athletes)
days_aheadNoNumber of days to look ahead

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already indicate read-only, non-destructive, idempotent. Description adds that it fetches ALL entries and lists types, but doesn't mention pagination or limits. Good 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.

Conciseness5/5

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

Three sentences, front-loaded with purpose, then usage guidelines and alternatives. Every sentence adds value, 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?

Given output schema exists, return values need not be detailed. Covers purpose, usage, alternatives. Missing minor details like maximum range or ordering, but overall complete.

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?

Input schema has 100% description coverage for all three parameters. Description does not add additional parameter-level details beyond the schema, so baseline 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 it fetches all calendar entries (workouts, notes, races, goals, life-event blocks) and distinguishes from siblings like icu_get_upcoming_workouts and get_event.

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 when to use this tool (broad calendar queries) and when to use alternatives (icu_get_upcoming_workouts for filtered workouts, get_event for specific event).

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

icu_get_custom_itemA
Read-onlyIdempotent

Fetch the full configuration of ONE custom addition by ID.

Use AFTER icu_get_custom_items has returned an ID when the user wants to inspect a specific chart/field/zone/panel — the content field here is the same as in the list, just focused on one item.

ParametersJSON Schema
NameRequiredDescriptionDefault
item_idYesCustom item ID
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, destructiveHint, idempotentHint, and openWorldHint, fully covering the safety profile. The description adds value by explaining that the content field mirrors the list result, providing contextual consistency. No contradiction with annotations.

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 concise sentences with no wasted words. The first sentence states the primary action, the second provides usage guidance and a helpful note about the output. Information is front-loaded.

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 presence of an output schema, the description does not need to detail return values. It covers the tool's purpose, usage sequence, and relationship to sibling tools, making it complete for effective use.

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 100% with descriptions for both parameters. The description adds extra meaning by implying item_id comes from the list tool, and explaining the athlete_id is for coaches managing multiple athletes. This goes beyond the 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?

The description clearly states the tool fetches the full configuration of one custom addition by ID. It distinguishes itself from the sibling tool icu_get_custom_items by explicitly saying it focuses on a single item after the list has been obtained.

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 instructs to use this tool AFTER icu_get_custom_items has returned an ID, providing a clear workflow. It also notes that the content field is the same as in the list, helping the agent understand the relationship between the two tools.

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

icu_get_custom_itemsA
Read-onlyIdempotent

List the user's custom additions to their Intervals.icu account.

Use this when the user asks about THEIR OWN customizations: "show my custom charts", "list my custom fields", "what custom zones do I have", "what's on my dashboard", "do I have any custom activity panels".

Returns every custom item across all types in one call: custom charts (FITNESS_CHART, TRACE_CHART, ACTIVITY_CHART, ACTIVITY_HISTOGRAM, ACTIVITY_HEATMAP, ACTIVITY_MAP, ACTIVITY_PANEL, FITNESS_TABLE), custom data fields (INPUT_FIELD on wellness, ACTIVITY_FIELD on activities, INTERVAL_FIELD on intervals), custom ACTIVITY_STREAM definitions, and custom ZONES configurations. Each item has a type field so you can filter client-side if the user asked about a specific kind.

Do NOT use this for built-in zones, built-in fields, or athlete profile data — those have dedicated tools (icu_get_sport_settings, etc.).

ParametersJSON Schema
NameRequiredDescriptionDefault
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare read-only, non-destructive, idempotent. Description adds behavioral details: returns all types in one call, client-side filtering via type field. No contradictions.

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?

Well-structured with summary, usage guidance, return details, and exclusions. Slightly verbose but each 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 output schema exists, description covers usage, return types, and filtering without needing to detail return values. Complete for the tool's purpose.

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 coverage is 100%, and description does not add new meaning beyond the schema's own description of athlete_id for coaches.

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 custom additions to Intervals.icu account, with specific examples. It distinguishes from sibling tools that handle built-in data.

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 (user asking about their own customizations) and when-not-to-use (built-in zones, fields, etc.) with alternative tool references.

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

icu_get_eventA
Read-onlyIdempotent

Fetch ONE specific calendar event by ID — full details including description, workout structure, and metrics.

ParametersJSON Schema
NameRequiredDescriptionDefault
event_idYesEvent ID to retrieve
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, destructiveHint, idempotentHint, and openWorldHint, indicating a safe read operation. The description adds value by specifying the return includes 'description, workout structure, and metrics', which goes beyond annotations.

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, concise sentence that front-loads the key action and includes important details about what is returned. No extraneous 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 output schema exists (so return format is documented elsewhere), the description sufficiently covers the tool's purpose and what is fetched. For a simple retrieval tool, it is complete enough.

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?

Input schema has 100% coverage describing both parameters (event_id and athlete_id). The description does not add extra semantic detail, so 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 'Fetch ONE specific calendar event by ID', specifying the verb, resource, and scope. It distinguishes itself from sibling tool icu_get_calendar_events which likely fetches multiple events.

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 implies usage when a single event's full details are needed, but does not explicitly state when not to use or suggest alternatives. However, the context of siblings and the tool name provide adequate guidance.

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

icu_get_fitness_chartA
Read-onlyIdempotent

Fetch the Performance Management Chart time-series — daily CTL, ATL, and TSB.

Returns past history plus future projections from planned calendar workouts. Use for: "show my fitness chart", "CTL trend last 90 days", "projected form at end of my block", "what will my TSB be in 3 weeks". NOT for: today's training recommendations (icu_get_fitness_summary), HRV/sleep/ recovery trends (icu_get_wellness_data), or one day's full wellness record (icu_get_wellness_for_date).

ParametersJSON Schema
NameRequiredDescriptionDefault
days_backYesNumber of days before today to include (inclusive)
athlete_idNoAthlete ID (for coaches managing multiple athletes)
days_aheadYesNumber of days after today to include (inclusive); use 0 for history only

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive nature. Description adds that it returns both past history and future projections from planned calendar workouts, which is useful behavioral context beyond annotations.

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?

Description is concise, front-loaded with the main purpose, and uses bullet-like structure for examples. No unnecessary sentences.

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 output schema exists, description adequately covers the return values (daily CTL, ATL, TSB) and scope (history + projections). No gaps for an agent to understand the tool's output.

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?

Input schema has 100% coverage on parameter descriptions; description does not elaborate further on parameters. Baseline 3 is appropriate as schema already handles meaning, and description provides usage context but no additional parameter 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?

Description clearly states the tool fetches a Performance Management Chart time-series with daily CTL, ATL, and TSB. It includes specific verb 'fetch' and resource, and distinguishes from siblings via explicit NOT-for sections.

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?

Explicit use-case examples are given (e.g., 'show my fitness chart', 'CTL trend last 90 days') and clear alternatives are stated (icu_get_fitness_summary, icu_get_wellness_data, icu_get_wellness_for_date), providing both when-to-use and when-not-to-use.

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

icu_get_fitness_summaryA
Read-onlyIdempotent

Get an athlete's current fitness / fatigue / form snapshot — CTL, ATL, TSB, ramp rate, with interpretation and training recommendations.

Use for "how's my form?", "am I overtrained?", training-status checks. Defaults to the authenticated athlete; coaches can pass athlete_id to read one of their managed athletes instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, non-destructive and open-world behavior, so the safety profile is covered. The description adds value beyond that by noting the response includes interpretation and training recommendations (not just raw numbers) and by clarifying the default scoping to the authenticated athlete with a coach override path.

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?

Three short sentences, each earning its place: metrics first, then trigger conditions, then scoping. The most load-bearing information is front-loaded and there is no filler.

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?

An output schema exists, so return values need not be explained, and the description covers purpose, when to use it, and the athlete-scoping rule. Nothing required to invoke the tool correctly is missing.

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 100%, so baseline is 3, but the description adds real meaning the schema's 'default: null' does not: that omitting athlete_id resolves to the authenticated athlete, and that passing it is specifically for coaches reading a managed athlete. This clarifies null-vs-value semantics beyond the schema text.

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 uses a specific verb ('Get') and resource ('athlete's fitness/fatigue/form snapshot') and enumerates the exact metrics returned (CTL, ATL, TSB, ramp rate), so an agent knows precisely what comes back. It does not explicitly differentiate from the closest sibling icu_get_fitness_chart, though the word 'snapshot' versus 'chart' implies a current-state vs time-series distinction.

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 gives concrete triggering questions ('how's my form?', 'am I overtrained?') and a category of use ('training-status checks'), which is clear context. It offers no explicit exclusions or named alternatives (e.g. get_fitness_chart for trends), so routing is left partly to inference.

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

icu_get_gap_histogramA
Read-onlyIdempotent

Time-in-zone DISTRIBUTION of grade-adjusted pace (GAP) within a single activity — elevation-normalized.

Use for trail running where raw pace is misleading. For raw (non- elevation-normalized) pace use icu_get_pace_histogram.

ParametersJSON Schema
NameRequiredDescriptionDefault
activity_idYesActivity ID to analyze

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and other safety hints. The description adds behavioral context by noting elevation normalization, which is beyond the annotations. No contradictions. Could mention rate limits or auth, but not critical given annotations.

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 with no wasted words. First sentence defines the core function; second sentence provides usage guidance. Front-loaded with key information.

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 present, return values are covered. The description is sufficient for a simple read-only tool with one parameter and clear annotations. No missing context.

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 coverage is 100% with a single parameter (activity_id) already described as 'Activity ID to analyze'. The description does not add any further semantics beyond the schema, so 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 it provides a time-in-zone distribution of grade-adjusted pace (GAP) for a single activity, with elevation normalization. It uses specific verbs and resources, and explicitly distinguishes itself from the raw pace histogram sibling tool.

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 recommends using this tool for trail running where raw pace is misleading, and directs users to icu_get_pace_histogram for raw pace. This provides clear when-to-use and when-not-to-use guidance with a named alternative.

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

icu_get_gear_listB
Read-onlyIdempotent

List all gear items with usage stats (distance, time, activity count) and maintenance reminders.

ParametersJSON Schema
NameRequiredDescriptionDefault
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered without description help. The description adds that the result includes derived usage stats and maintenance reminders, which is useful content disclosure, but says nothing about pagination, caching, or how far back the stats aggregate.

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?

One sentence, front-loaded with the verb and resource and with the return contents in a tight parenthetical. Nothing is wasted or buried.

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 return-value detail is not required, and the single optional parameter is documented in the schema. The description is nearly sufficient; the only missing nuance is the coach/multi-athlete scoping behavior of omitting athlete_id.

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 100% for the single optional athlete_id parameter, so the schema carries this dimension. The description contributes nothing about the parameter and its use of 'all gear items' slightly undersells that results are scoped when athlete_id is supplied; baseline 3 applies.

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 names a specific verb ('List') and resource ('all gear items') and enumerates the payload (distance, time, activity count, maintenance reminders), so an agent knows exactly what comes back. It doesn't explicitly differentiate itself from near siblings like icu_create_gear or icu_update_gear, but the read-only list intent is unambiguous.

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?

There is no statement of when to reach for this tool versus alternatives (e.g. icu_get_custom_items, gear-reminder tools), and no mention of the optional athlete_id scoping for coaches. Usage is only implied by the word 'List'.

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

icu_get_hr_curvesA
Read-onlyIdempotent

Fetch the HR-vs-duration curve — best (highest) sustained HR across durations from 5s up to 1h, aggregated over the chosen window.

Use for cardiovascular-fitness trends. For the athlete's HR zones and max HR, call icu_get_sport_settings — this tool does not return zone bands, and its peak_hr_bpm is the top of this curve, which Intervals.icu has already clipped to the configured max HR at import. For time-in-zone distribution within a single activity, use get_hr_histogram instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
days_backNoNumber of days to analyze (optional)
athlete_idNoAthlete ID (for coaches managing multiple athletes)
sport_typeNoSport type (e.g., Ride, Run, Swim, VirtualRide)Ride
time_periodNoTime period shorthand: 'week', 'month', 'year', 'all' (optional)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare the safe read-only, idempotent profile. The description adds genuine behavior beyond them, notably that peak_hr_bpm is the top of the curve and has already been clipped to the configured max HR at import, plus that it does not return zone bands. This is useful nuance, though return structure and aggregation mechanics are left to the output schema.

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

Conciseness5/5

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

Front-loads the core definition, then segments usage and disambiguation into tight sentences with zero filler. Every sentence carries either scope, routing, or behavioral information.

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?

An output schema exists, so return-value explanation is unnecessary. Combined with the routing guidance and the behavioral note about max-HR clipping, the description is complete for correct invocation.

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 100%, so all four parameters (days_back, athlete_id, sport_type, time_period) are already documented in the schema. The description references the 'chosen window' but adds no syntax or format detail beyond the schema, so the baseline of 3 applies.

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?

States a specific verb and resource ('Fetch the HR-vs-duration curve') and defines exactly what the curve contains: best sustained HR across durations from 5s to 1h, aggregated over the window. It also distinguishes itself from icu_get_sport_settings and get_hr_histogram by name.

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?

Gives explicit intended use ('Use for cardiovascular-fitness trends') and names two alternatives with the conditions that select them: sport_settings for HR zones/max HR, hr_histogram for time-in-zone distribution within a single activity.

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

icu_get_hr_histogramA
Read-onlyIdempotent

Time-in-zone DISTRIBUTION of heart rate within a single activity (histogram buckets, time per bucket).

Different from icu_get_hr_curves (best efforts across many activities). Use for cardiovascular load breakdown and HR-zone time-in-zone.

ParametersJSON Schema
NameRequiredDescriptionDefault
activity_idYesActivity ID to analyze

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, destructiveHint, idempotentHint, openWorldHint. Description adds that the output is a histogram with time per bucket, providing useful context beyond annotations.

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?

Three sentences: defines the tool, distinguishes from sibling, and suggests use. No wasted words.

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 presence of an output schema and a single parameter with full schema coverage, the description sufficiently explains the tool's purpose and usage.

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 coverage is 100% with a description for activity_id. Description does not add additional parameter information beyond what the schema already 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?

Description clearly states it returns 'time-in-zone distribution of heart rate within a single activity' with histogram buckets. It differentiates from sibling tool icu_get_hr_curves, which focuses on best efforts across many activities.

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?

Explicitly suggests use for cardiovascular load breakdown and HR-zone time-in-zone. Provides an alternative tool (icu_get_hr_curves) but does not specify when to avoid using this tool.

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

icu_get_pace_curvesA
Read-onlyIdempotent

Fetch the pace-vs-duration curve — best (fastest) sustained pace across durations from 5s up to 1h, aggregated over the chosen window.

Use for run/swim fitness trends and race-time predictions. Pass use_gap=True to normalize for hills via Grade-Adjusted Pace. For time-in-zone distribution within a single activity, use get_pace_histogram (or get_gap_histogram) instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
use_gapNoUse Grade Adjusted Pace (GAP) for running
days_backNoNumber of days to analyze (optional)
athlete_idNoAthlete ID (for coaches managing multiple athletes)
sport_typeNoSport type (e.g., Run, Swim)Run
time_periodNoTime period shorthand: 'week', 'month', 'year', 'all' (optional)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real semantic behavior beyond that: the aggregation window, the 5s-to-1h duration span, and the fact that use_gap=True applies hill normalization via Grade-Adjusted Pace. It stops short of describing coverage limits or empty-data behavior, but the added context is substantive.

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?

Three compact sentences, front-loaded with the core definition, then the usage guidance, then the exclusion and alternative. Every sentence carries distinct information with no repetition of the schema.

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

Completeness5/5

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

With five optional parameters all documented in the schema and an output schema present, the description is not obligated to describe return values. It supplies the metric definition, the when-to-use, the GAP nuance, and the sibling fallback — everything an agent needs to select and call it correctly.

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 100%, so the baseline is 3, but the description explains the *purpose* of use_gap ('normalize for hills via Grade-Adjusted Pace') and clarifies what the curve's duration range means, adding meaning the bare schema text does not carry. It remains silent on the interplay of time_period vs days_back, which keeps it from a 5.

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?

States a specific verb ('Fetch') and resource (pace-vs-duration curve), then defines the metric precisely: 'best (fastest) sustained pace across durations from 5s up to 1h, aggregated over the chosen window.' The alternative tool is named directly, so an agent can separate this from the histogram siblings without opening a schema.

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

Usage Guidelines5/5

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

Gives both positive and negative routing: 'Use for run/swim fitness trends and race-time predictions' and 'For time-in-zone distribution within a single activity, use get_pace_histogram (or get_gap_histogram) instead.' The condition that selects the alternative is explicit, and it even notes the use_gap variant to pass.

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

icu_get_pace_histogramA
Read-onlyIdempotent

Time-in-zone DISTRIBUTION of pace within a single running activity (histogram buckets, time per bucket).

Different from icu_get_pace_curves (best efforts across many activities). Use for pace-distribution / consistency analysis. For elevation- normalized pace use icu_get_gap_histogram.

ParametersJSON Schema
NameRequiredDescriptionDefault
activity_idYesActivity ID to analyze

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate safe read and idempotence; description adds that it operates on a single activity and returns time per bucket, which is beyond the annotations.

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?

Three concise sentences: purpose, differentiation, usage. No wasted words, front-loaded.

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?

Complete for a single-parameter tool with output schema; covers scope, usage, and alternatives.

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 coverage is 100% with clear description of activity_id; description does not add further meaning but parameter is self-explanatory.

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?

Clearly states it returns pace distribution histogram buckets for a single activity, and explicitly differentiates from sibling icu_get_pace_curves.

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 says 'Use for pace-distribution / consistency analysis' and mentions alternative icu_get_gap_histogram for elevation-normalized pace.

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

icu_get_power_curvesA
Read-onlyIdempotent

Fetch the power-vs-duration curve — best (highest) sustained watts across durations from 5s up to 1h, aggregated over the chosen window.

Use for FTP estimation, peak-power tracking, strengths/weaknesses across duration profiles. For time-in-zone distribution within a single activity, use icu_get_power_histogram instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
days_backNoNumber of days to analyze (optional)
athlete_idNoAthlete ID (for coaches managing multiple athletes)
sport_typeNoSport type (e.g., Ride, Run, Swim, VirtualRide)Ride
time_periodNoTime period shorthand: 'week', 'month', 'year', 'all' (optional)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the bar is lower. The description adds genuinely useful behavioral context beyond them: what the curve aggregates (highest sustained watts per duration) and the 5s-to-1h range. It does not discuss auth scope or how the aggregation window interacts with parameters, so not a full 5.

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 compact sentences plus a routing clause; the core definition is front-loaded and every clause carries information. No filler.

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 present, return format needn't be explained, and rich annotations carry the safety profile. The description covers what the tool computes, when to use it, and which sibling to use instead — sufficient for correct selection and invocation.

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 100%, so all four parameters (days_back, athlete_id, sport_type, time_period) are already documented. The description's reference to the 'chosen window' loosely maps to days_back/time_period but adds no syntax, format, or interaction detail beyond the schema. Baseline 3 applies.

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?

States a specific verb (fetch) and resource (power-vs-duration curve), then defines it precisely: best sustained watts across durations from 5s to 1h, aggregated over the chosen window. It explicitly names the sibling icu_get_power_histogram as the different tool, so an agent can distinguish them without opening either schema.

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

Usage Guidelines5/5

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

Gives concrete use cases (FTP estimation, peak-power tracking, strengths/weaknesses across duration profiles) and an explicit when-not/alternative: time-in-zone distribution belongs to icu_get_power_histogram. Nothing is left to inference.

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

icu_get_power_histogramA
Read-onlyIdempotent

Time-in-zone DISTRIBUTION of power within a single activity (histogram buckets, time per bucket).

Different from icu_get_power_curves (best efforts across many activities). Use for "how was my workout intensity distributed?", training-zone breakdown.

ParametersJSON Schema
NameRequiredDescriptionDefault
activity_idYesActivity ID to analyze

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover safety (readOnlyHint true, destructiveHint false, idempotentHint true). The description adds meaningful behavioral context by specifying the output format (histogram buckets with time per bucket) and the single-activity scope, which goes beyond what annotations provide.

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. The first sentence defines the output, the second provides usage context and sibling differentiation. Every word adds value with no redundancy.

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 simple tool with one parameter and an output schema, the description is complete. It explains what the tool returns (histogram buckets), the scope (single activity), and typical use cases, without needing to detail return format since output schema exists.

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?

Input schema has 100% coverage with a clear description of the single required parameter 'activity_id'. The description does not add further semantic details about the parameter beyond what the schema provides, so 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 returns a time-in-zone distribution of power for a single activity as a histogram. It explicitly distinguishes itself from a sibling tool, icu_get_power_curves, by noting the difference in scope (single activity vs. best efforts across many activities).

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 provides explicit guidance on when to use this tool: 'Use for how was my workout intensity distributed?, training-zone breakdown.' It also contrasts with icu_get_power_curves, helping the agent choose between similar tools.

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

icu_get_recent_activitiesA
Read-onlyIdempotent

List the athlete's most recent activities (default last 30 days) — LIGHT summary per item (distance, duration, power, HR, training load).

Use for "what have I done recently?", "show last week's rides". For one specific activity by ID use icu_get_activity_details; to search by name/tag use icu_search_activities.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of activities to fetch
days_backNoNumber of days to look back
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already provide readOnlyHint, destructiveHint, idempotentHint, and openWorldHint. The description adds value by specifying the light summary content and default date range, which goes beyond the annotations.

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 only three sentences, each serving a clear purpose: stating function, suggesting use cases, and providing alternatives. No unnecessary words, and the core information is front-loaded.

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 read-only list tool with an output schema, the description covers what it returns, default behavior, and when to choose alternatives. It is sufficiently complete for an agent to decide to invoke it.

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?

Input schema has 100% description coverage for all 3 parameters. The description mentions the default 30-day range but does not add new semantics beyond what the schema already provides, so baseline 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 'List the athlete's most recent activities' with a specified default timeframe and content summary (distance, duration, etc.). It also distinguishes itself from sibling tools by naming alternatives for specific use cases.

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 provides use cases ('what have I done recently?', 'show last week's rides') and tells when not to use it, directing to icu_get_activity_details for single activities and icu_search_activities for name/tag searches.

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

icu_get_sport_settingsA
Read-onlyIdempotent

Get per-sport thresholds and the athlete's configured power/HR/pace zones.

Returns outdoor/indoor FTP, FTHR, max HR, running pace and swim threshold, plus the zone sets configured in Intervals.icu (HR zones in bpm, power zones as %FTP, pace zones as % of threshold pace) with their names.

This is the ONLY source of the athlete's real zones. Intervals.icu derives them from the threshold and stamps them into every activity at import, so time-in-zone, HRSS and TSS are all computed from these — reasoning about zones from any other number puts the answer at odds with the athlete's own charts. Zones are not derived from curve data.

ParametersJSON Schema
NameRequiredDescriptionDefault
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/openWorld/non-destructive, so the safety profile is covered; the description goes well beyond them by disclosing return contents, units for each zone set (bpm, %FTP, % of threshold pace), the derivation/stamping behavior at import, and the downstream impact on time-in-zone, HRSS and TSS. That is rich behavioral context an agent can act on.

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 purpose is front-loaded in the first sentence, followed by field/units detail and a disambiguation clause. It is slightly verbose in its emphasis on being the only source, but every sentence provides usable information.

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 read-only settings getter with full schema coverage and an output schema, the description supplies everything an agent needs: what is returned, the units, and why these values matter downstream. Nothing material is missing.

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 100% for the single athlete_id parameter, and the description does not add any syntax or semantics for it. Baseline 3 applies since the schema carries the 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 names a specific verb (Get) and resource (per-sport thresholds plus the athlete's power/HR/pace zones), and enumerates the concrete fields returned (FTP, FTHR, max HR, run pace, swim threshold). It further distinguishes itself from the curve siblings by stating zones are not derived from curve data, so an agent can separate it from get_power_curves/get_hr_curves without opening a schema.

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

Usage Guidelines4/5

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

It clearly states the condition for use ('This is the ONLY source of the athlete's real zones') and draws an explicit boundary against reasoning from curve data or other numbers. It stops short of naming a specific sibling alternative to prefer, but the when-to-use context is unambiguous.

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

icu_get_upcoming_workoutsA
Read-onlyIdempotent

Fetch the planned WORKOUT entries dated on the upcoming CALENDAR (filters out notes, races, goals) — these are calendar EVENTS, not workout-library templates.

Use for "what's my next workout?", "what training is planned". Each id is a calendar event ID: pass it to icu_get_event / icu_update_event / icu_delete_event, never to the icu_*_workout library tools. For every calendar entry type use icu_get_calendar_events; for reusable templates stored in the library use icu_get_workouts_in_folder.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of planned workout events to return
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds valuable context beyond annotations: it filters out non-workout calendar entries, returns calendar event IDs (not library template IDs), and clarifies the relationship to event and library tools. It does not contradict any annotations.

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 efficient: two short paragraphs with no fluff. The primary purpose and scoping are front-loaded, followed by usage guidance and routing. Every sentence earns its place and aids decision-making.

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 presence of an output schema (not shown) and the rich annotations, the description covers everything needed: what it returns, how to interpret the IDs, when to use it, and when to use alternatives. It is complete for correct invocation and selection among many siblings.

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 coverage is 100% – both `limit` and `athlete_id` have descriptive text in the schema. The description does not add extra meaning to the parameters; it only implicitly references the use case. Since the schema fully documents the parameters, baseline 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 fetches planned workout entries from the upcoming calendar, explicitly filtering out notes, races, and goals. It distinguishes itself from workout-library templates and names sibling tools, making its purpose unmistakable.

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 use cases ('what's my next workout?', 'what training is planned') and gives clear routing: use icu_get_calendar_events for all calendar entries, icu_get_workouts_in_folder for library templates, and event-specific tools for IDs returned by this tool. This leaves no ambiguity about when to use it.

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

icu_get_wellness_dataA
Read-onlyIdempotent

Fetch wellness records over a RANGE of recent days (default last 7).

Use for trends, weekly summaries, "how has my sleep been this week?", recovery curves. For PMC/fitness chart CTL/ATL/TSB series use icu_get_fitness_chart. For a single specific date use icu_get_wellness_for_date instead — this tool always returns a multi-day list.

ParametersJSON Schema
NameRequiredDescriptionDefault
days_backNoNumber of days to look back
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description still adds two useful behavioral facts beyond that: the default 7-day window and the guarantee that this tool always returns a multi-day list rather than a single record. Output format details are left to the output schema, which is fine.

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 core behavior and default are front-loaded in the first clause, followed by use cases, then the two sibling disambiguations. Every sentence carries information; none is filler or repetition.

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 present, rich annotations, and full parameter documentation, the description only needs to cover scope, routing, and the default range — all of which it does. Nothing an agent needs to invoke this correctly is missing.

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 coverage is 100%, so both parameters (days_back, athlete_id) are already documented. The description only restates the default of 7 days, which the schema's default field already conveys, and adds nothing about the athlete_id scoping beyond what the schema says. Baseline 3 applies when the schema carries parameter 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?

States a specific verb+resource (fetch wellness records) with an explicit scope (range of recent days, default last 7). It names the two most confusable siblings (icu_get_fitness_chart and icu_get_wellness_for_date) and states what distinguishes this tool from each, so an agent can select it without opening any schema.

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

Usage Guidelines5/5

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

Gives concrete use cases (trends, weekly summaries, 'how has my sleep been this week?', recovery curves) plus explicit routing rules: fitness chart series go to icu_get_fitness_chart, a single date goes to icu_get_wellness_for_date. Both the when-to-use and when-not-to-use conditions are stated.

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

icu_get_wellness_for_dateA
Read-onlyIdempotent

Fetch the wellness record for ONE specific date.

Use when the user names a date — "show my HRV for Monday", "wellness on 2026-03-15", "how did I sleep last Thursday?". For ranges, weeks, or trends use icu_get_wellness_data.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesDate in YYYY-MM-DD format
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds only the single-date scoping constraint; it does not say what happens when no record exists for that date (error vs empty) or what the record contains, though an output schema exists.

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?

Front-loads the core scope in the first sentence, then earns its remaining lines with routing examples and the alternative tool. No 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?

Complete enough for a simple read tool: annotations carry safety, the output schema covers return values, and routing to the range-based sibling is explicit. Only the missing-record behavior is unaddressed.

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 100%, so both the date format (YYYY-MM-DD) and athlete_id purpose are already documented in the schema. The description reinforces single-date usage but adds no format or constraint detail 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?

States a specific verb (Fetch) and resource (wellness record) scoped to ONE specific date, and explicitly distinguishes itself from the sibling icu_get_wellness_data for ranges.

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?

Gives concrete triggering examples ("show my HRV for Monday", "wellness on 2026-03-15") and an explicit exclusion with the alternative tool for ranges, weeks, or trends.

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

icu_get_workout_libraryA
Read-onlyIdempotent

List all workout-library folders + training plans the athlete has access to (personal, shared, and followed plans).

Each folder ID can be passed to icu_get_workouts_in_folder to see its contents, or to icu_apply_training_plan to schedule it onto the calendar.

ParametersJSON Schema
NameRequiredDescriptionDefault
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful scope about what is listed (personal, shared, followed plans) but does not describe return format, pagination, or other behavioral details beyond what annotations provide.

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 efficient sentences: the purpose is front-loaded, and the follow-up usage guidance follows naturally. No filler or repetition; 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?

With an output schema present, the description need not explain return values. It communicates what the tool lists and how to use folder IDs downstream. Minor ambiguity exists because it says 'Each folder ID' can be passed to icu_apply_training_plan, potentially conflating folder IDs with training plan IDs, but overall the description is complete enough for correct invocation.

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 100%, and the single athlete_id parameter is fully documented in the schema ('Athlete ID (for coaches managing multiple athletes)'). The description adds no additional meaning about the parameter, so the baseline 3 is appropriate when the schema does the heavy lifting.

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?

States a specific verb ('List') and resources ('workout-library folders + training plans') with clear scope ('personal, shared, and followed plans'). It distinguishes itself from siblings by naming downstream tools (icu_get_workouts_in_folder, icu_apply_training_plan) that are used after this call, so an agent can tell what this tool is for without opening the schema.

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

Usage Guidelines4/5

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

Clearly indicates the follow-up actions: folder IDs can be passed to icu_get_workouts_in_folder to see contents or to icu_apply_training_plan to schedule. It does not explicitly state when not to use this tool or name a competing alternative, but the context is sufficient for an agent to know this is the entry point for the workout library.

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

icu_get_workouts_in_folderB
Read-onlyIdempotent

List the workouts stored in one specific library folder or training plan — name, type, structure, training load, intensity factor.

ParametersJSON Schema
NameRequiredDescriptionDefault
folder_idYesFolder ID to get workouts from
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

The annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds the returned attribute set, but says nothing about pagination, ordering, or whether an empty folder returns an empty list — modest added value on top of structured data.

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?

A single front-loaded sentence: verb, scope, then the attribute list. Nothing is padded or repeated.

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 and annotations carry the safety profile, so the description need not explain return values; it names the key fields anyway. What remains thin is the absence of any guidance on folder-vs-training-plan IDs or result volume, but nothing critical for correct invocation is missing.

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 100%, so both parameters are documented structurally, giving a baseline of 3. The description contributes only the nuance that folder_id may also denote a training plan, which the schema does not convey.

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?

States a specific verb (list) and resource (workouts in a library folder or training plan), plus the fields returned. It scopes to one specific folder, which loosely separates it from icu_get_workout_library, but it never names or contrasts that sibling explicitly.

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?

There is no when-to-use guidance and no alternative named. The phrase 'one specific library folder or training plan' implies you must already know the folder/plan ID, but the agent is left to infer whether this or icu_get_workout_library is the right call.

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

icu_list_athletesA
Read-onlyIdempotent

List the athletes this account can access — the caller plus anyone they follow or coach.

Call this FIRST whenever a request concerns someone other than the default athlete, to resolve a name to the athlete_id that other tools take. Returns each athlete's access level, so you know before calling whether a write will be permitted.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations cover read-only, idempotent, non-destructive, open-world traits, so the safety profile is already declared. The description adds value beyond annotations by noting it returns each athlete's access level and that this lets the caller know before writing whether a write will be permitted. It doesn't mention pagination or scale limits, but the access-level disclosure is meaningful behavioral context for a list tool.

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, front-loaded with the purpose then the critical call-first instruction. Every sentence earns its place: scope, when to use, and why the result matters.

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?

An output schema exists, so return-value details need not be spelled out; the description still highlights the key field (access level) an agent needs for downstream decisions. Combined with clear scope and call-first guidance, an agent has everything needed to invoke it correctly in the right situations.

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?

Zero parameters, so baseline is 4 per the rules. No parameter semantics to add, and the description correctly focuses on call ordering and return-usage rather than parameters.

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?

States a specific verb (list) and resource (athletes) with clear scope: 'the caller plus anyone they follow or coach.' This distinguishes it from siblings like icu_get_athlete_profile, which fetches a single athlete's profile rather than enumerating accessible athletes.

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 says to call this FIRST whenever a request concerns someone other than the default athlete, and explains the precondition for other tools: resolving a name to an athlete_id. It names the concrete trigger and the alternative workflow (default athlete needs no call).

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

icu_search_activitiesA
Read-onlyIdempotent

Search activities by name or tag, returning a LIGHT result list — id, name, type, date, distance, time only.

Use this first for "find my X" queries. Only escalate to search_activities_full when you specifically need power, HR, training load, or intensity-factor data on the matches (heavier payload).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return
queryYesSearch query (activity name or tag)
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, destructiveHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds valuable context that the result list is 'light' and enumerates the fields returned, which is beyond what annotations provide. It does not mention any authorization needs or error cases, but given the read-only nature, this is adequate.

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 concise sentences with no wasted text. The first sentence states the purpose and result, the second provides usage guidance. Well-structured 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 existence of an output schema, the description does not need to detail return values. It adequately explains the limited result set and when to use vs. the sibling tool. It could mention pagination or boundary conditions, but overall it is complete enough for a focused search tool.

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 input schema has 100% description coverage for all parameters. The description hints that 'query' refers to activity name or tag, but does not add significant meaning beyond the schema. For a tool with full schema coverage, a score of 3 is baseline.

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 searches activities by name or tag, and distinguishes itself from the sibling 'icu_search_activities_full' by specifying it returns a 'light' result list with only id, name, type, date, distance, time. This provides a specific verb and resource, and differentiates from 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 Guidelines5/5

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

Explicitly advises using this tool first for 'find my X' queries, and only escalating to 'search_activities_full' for heavier data like power, HR, training load. This provides clear when-to-use guidance and names the alternative.

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

icu_search_activities_fullA
Read-onlyIdempotent

Search activities by name or tag, returning FULL Activity objects with power, HR, training load, intensity factor, normalized power, weather — every metric per result.

Heavy payload. Use only when the lighter search_activities won't tell you what you need (e.g. "find my threshold rides with NP above 250W").

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return
queryYesSearch query (activity name or tag)
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that — 'Heavy payload' warns about cost/size, which the annotations do not capture. It stops short of noting pagination or result-size implications given the limit parameter.

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 short paragraphs, front-loaded with what it returns and the payload caveat, then the routing rule. Every sentence earns its place; the example query is the one piece of elaboration that adds real 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?

An output schema exists, so return-value explanation is unnecessary. The description covers the two things an agent actually needs to decide and invoke: what makes this tool heavier than its sibling, and when that trade-off is warranted.

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 100%, so query, limit, and athlete_id are already documented in the schema. The description's 'by name or tag' corroborates the query parameter but adds no syntax, matching rules, or format detail beyond it. Baseline 3 applies.

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?

States a specific verb and resource ('Search activities by name or tag') and immediately declares the distinguishing behavior: full Activity objects with power, HR, training load, IF, NP, weather. This contrasts cleanly with the sibling icu_search_activities.

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 names the alternative ('the lighter search_activities') and the condition that selects this one: when the lighter search won't tell you what you need. Provides a concrete example query (threshold rides with NP above 250W), leaving nothing to inference.

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

icu_search_intervalsA
Read-onlyIdempotent

Search intervals ACROSS ALL the athlete's activities (cross-activity).

Different from icu_get_activity_intervals (single-activity). Use to track progress on a workout type ("all my threshold intervals over the last year") or find comparable historical sessions. Returns the activities containing matching intervals, each with an interval_summary like "2x 8m 162w" (reps x duration at target).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of matching activities to return
athlete_idNoAthlete ID (for coaches managing multiple athletes)
max_durationNoMaximum interval duration in seconds
min_durationNoMinimum interval duration in seconds
interval_typeNoInterval target type: AUTO, POWER, HR, or PACE (what the interval targeted — not the sport and not a workout-step label)
max_intensityNoMaximum interval intensity in percent of threshold (e.g. 105)
min_intensityNoMinimum interval intensity in percent of threshold (e.g. 80)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/openWorld, so safety is covered. The description adds genuinely new behavioral context by explaining the return shape (activities containing matching intervals) and the interval_summary format '2x 8m 162w'. It stops short of noting pagination or result ordering, keeping it at a 4.

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?

Front-loads the cross-activity scope, then the sibling contrast, then use cases and return format. Four short sentences with essentially no filler, though the return-format sentence could be tighter.

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 annotations, a 100%-covered schema, and an output schema, the description only needs to convey purpose, disambiguation and what comes back — all present, including the interval_summary example that makes the result interpretable.

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 100%, so duration, intensity, interval_type and limit are all documented in the schema itself. The description adds no parameter-level meaning (e.g., how min/max intensity interact or how filters combine), so the baseline 3 applies.

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?

States a specific verb and resource with explicit scope: 'Search intervals ACROSS ALL the athlete's activities (cross-activity)'. It directly names and contrasts with the sibling icu_get_activity_intervals (single-activity), so an agent can pick correctly without opening either schema.

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

Usage Guidelines5/5

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

Gives the alternative and the condition that selects it, plus two concrete use cases ('all my threshold intervals over the last year', 'find comparable historical sessions'). Nothing about when to use this vs. the single-activity tool is left to inference.

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

icu_update_activityA
Idempotent

Update an existing activity's metadata (name, type, trainer flag, RPE, feel, etc.).

Only fields you pass are sent; everything else stays unchanged.

ParametersJSON Schema
NameRequiredDescriptionDefault
feelNoHow you felt (1-5 scale)
nameNoUpdated activity name
commuteNoMark as commute
trainerNoMark as trainer/indoor workout
activity_idYesActivity ID to update
descriptionNoUpdated description
activity_typeNoUpdated activity type (e.g., Ride, Run, Swim)
perceived_exertionNoRPE rating (1-10 scale)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already indicate mutation (readOnlyHint=false) and safety (destructiveHint=false). Description adds valuable detail about partial updates and idempotency (only passed fields change), complementing annotations well.

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 concise sentences conveying essential behavior and partial update semantics. No superfluous 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?

With 8 parameters, high schema coverage, and output schema existing, the description covers the core logic. Lacks error handling or permission context, but annotations and schema fill gaps.

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 coverage is 100%, so description adds no extra meaning beyond what is already in the input schema. Baseline 3 applies.

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?

Clearly states 'Update an existing activity's metadata' with specific examples. Distinguishes from sibling tools like icu_update_event or icu_update_gear by focusing on activity metadata.

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?

Provides partial update behavior ('Only fields you pass are sent') but lacks explicit guidance on when to use this vs alternatives. No mention of prerequisites or exclusions.

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

icu_update_activity_streamsA
Destructive

Upload raw time-series streams (power, HR, cadence, etc.) onto an existing activity. Destructive — overwrites existing stream data.

Accepts JSON array or CSV. Different from get_activity_streams (READ).

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNoFormat of the payload: 'json' or 'csv'json
activity_idYesActivity ID to update
payload_stringYesJSON array of stream dictionaries or raw CSV data

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

The description adds value beyond annotations by stating 'Destructive — overwrites existing stream data' and mentioning accepted input formats (JSON array or CSV). Annotations already indicate destructive behavior, so the description reinforces and adds context without contradiction.

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 concise sentences, front-loading the core purpose and destructive nature. Every sentence serves a purpose without redundancy.

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 output schema exists, the description appropriately focuses on input behavior. It covers what is being uploaded, the destructive effect, and accepted formats, sufficient for a tool with few parameters and good annotations.

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 coverage is 100%, so the description does not need to add parameter meaning. While it mentions JSON or CSV, this is already in the schema description. No new insight is provided for the parameters.

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 tool uploads time-series streams onto an existing activity, giving specific examples (power, HR, cadence). It also differentiates itself from the sibling 'get_activity_streams' (READ), providing clear purpose and distinction.

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 notes that the tool is destructive and overwrites existing data, and contrasts with get_activity_streams. However, it does not provide explicit when-to-use or when-not-to-use scenarios or alternatives beyond that one sibling.

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

icu_update_custom_itemA
Idempotent

Modify an existing custom chart/field/zones/panel.

Use when the user wants to change one of their existing customizations: "rename my custom field", "make this chart public". Usually need icu_get_custom_items first to find the right item_id. Only fields you pass are sent — others are left unchanged. For content schema, see intervals-icu://custom-item-schemas.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoUpdated name
contentNoUpdated configuration content (replaces existing wholesale). Same schema as create_custom_item.content — see intervals-icu://custom-item-schemas for the per-item_type shape.
item_idYesCustom item ID to update
item_typeNoUpdated type (see icu_create_custom_item for values)
athlete_idNoAthlete ID (for coaches managing multiple athletes)
visibilityNoUpdated visibility: PRIVATE, FOLLOWERS, or PUBLIC
descriptionNoUpdated description

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

The description adds behavioral info beyond annotations: 'Only fields you pass are sent — others are left unchanged.' It also references external schemas for content. No contradiction with annotations (idempotentHint=true aligns with partial updates).

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 (few sentences), front-loaded with the main purpose, and every sentence adds value. No 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 7 parameters, nested objects, and an output schema, the description covers core behavior (partial update, prerequisite, content reference). It does not explain return values, but output schema covers that.

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 100%, and the description adds value by explaining partial update semantics and directing to external schemas for content. This compensates well beyond the schema alone.

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 ('Modify an existing custom chart/field/zones/panel') and resource, distinguishing it from siblings like icu_create_custom_item and icu_get_custom_items.

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 explicitly states when to use ('when the user wants to change one of their existing customizations') and suggests a prerequisite (icu_get_custom_items first). It lacks an explicit 'when not to use' clause, but the context is clear.

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

icu_update_eventA
Idempotent

Update an existing calendar event.

Only fields you pass are sent — other fields remain unchanged. For category and training_availability semantics, see intervals-icu://event-categories. For WORKOUT description syntax, see intervals-icu://workout-syntax.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoUpdated event name
colorNoUpdated color (hex string)
end_dateNoUpdated end date (YYYY-MM-DD)
event_idYesEvent ID to update
athlete_idNoAthlete ID (for coaches managing multiple athletes)
event_typeNoUpdated activity type
start_dateNoUpdated start date (YYYY-MM-DD)
descriptionNoUpdated description. For WORKOUT events the server parses this into structured, device-syncable steps with zones and a training load. Use Intervals.icu workout syntax: one step per line as '- <duration> <target>' (duration FIRST), grouped under Warmup / Main / Cooldown headers. Targets: bike '- 5m 85%', '- 5m Z4', or absolute '- 5m 210w'; HR '- 10m 70-80% HR' or '- 10m 145bpm'; run/swim pace '- 5m Z2 Pace', absolute only with a trailing 'pace' word: '- 5m 4:45/km pace', '- 200mtr 1:45/100m pace' (bare '5:00/km' or '1:45/100m' silently drops); threshold is relative — run '- 25m 100% pace', swim CSS '- 200mtr 100% pace' — the words 'threshold'/'CSS'/'5K pace' are NOT parsed as targets. Add cadence to any step: '- 3m Z2 90rpm'. No target: '- 20m free'. Repeats: put 'Nx' after a section name with steps flat beneath, and leave a blank line before and after the repeat block (without it the repeat silently runs only once) — e.g. 'Main 5x' then '- 3m 110%' / '- 3m 50%'. Ramps: '- 10m ramp 50-70%'. Rest: append 'Ns rest' to a step ('- 200mtr Z2 20s rest') or use a separate '- 20s intensity=rest' step (only intensity=rest exports as a device rest step) — never a bare '- 20s' step (that becomes work, not rest). Durations: 'm'=minutes, 's'=seconds; distance steps use 'mtr'=meters / 'km' / 'yrd' (e.g. swim '- 400mtr Z2 Pace'). Do NOT write '[repeat 5x ...]', nested bullets, or 'Z5 3m' (target before duration). Runs need a pace or HR target — a bare 'Z2' gives no load. Full reference: intervals-icu://workout-syntax resource.
show_as_noteNoShow event as a note on the fitness chart
training_loadNoUpdated training load
distance_metersNoUpdated distance in meters
duration_secondsNoUpdated duration in seconds
show_on_ctl_lineNoRender event on the CTL line
not_on_fitness_chartNoHide event from the fitness chart
training_availabilityNoUpdated training availability: NORMAL, LIMITED, or UNAVAILABLE

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations indicate idempotent (idempotentHint=true) and non-destructive (destructiveHint=false). The description adds the key behavior 'Only fields you pass are sent — other fields remain unchanged', which goes beyond annotations.

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 three sentences long, front-loading the main purpose and key behavior. Every sentence adds value, and it is extremely 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 the tool has 15 parameters with complete schema descriptions, an output schema, and clear annotations, the description complements well. For a complex tool, additional guidance on typical use could be beneficial, but it is largely complete.

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 documentation coverage is 100%, so the baseline is 3. The description adds no individual parameter detail beyond what the schema already provides, but the external references (for category and workout syntax) offer additional context.

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 'Update an existing calendar event', which is a specific verb and resource. It differentiates from sibling tools like create_event, delete_event, and get_event by its update focus.

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 for updating existing events but does not explicitly state when to use this tool versus alternatives (e.g., bulk operations or creating events). No exclusions are provided.

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

icu_update_gearA
Idempotent

Update an existing gear item. Only fields you pass are sent.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoUpdated name
activeNoFalse retires the gear (dated today); True un-retires it
gear_idYesID of the gear item to update
gear_typeNoUpdated type, case-insensitive (Bike, Shoes, Trainer, Chain, ...)
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare the safety profile (readOnly=false, idempotent=true, destructive=false). The description adds one genuinely useful behavioral fact beyond them: fields not passed are left untouched, which is what makes the null-defaulted optional parameters safe. It says nothing about permissions, failure modes, or what happens on an unknown gear_id.

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 short sentences, zero padding, with the core action front-loaded and the update-semantics caveat immediately after.

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 mutation tool with annotations covering safety and an output schema covering returns, the description supplies the one thing an agent most needs to call it correctly: the partial-update contract. Only edge-case behavior (invalid gear_id, cross-athlete access for coaches) is unaddressed.

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 100% so the baseline is 3, and the description earns above baseline by clarifying the partial-update contract — omitted/null fields are not sent, so the agent knows it should not pass nulls to clear values. It still does not explain the retire/un-retire semantics of 'active' (that lives in the 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 gives a specific verb+resource ('Update an existing gear item'), making the operation unambiguous and distinguishable by name from icu_create_gear and icu_delete_gear. It does not, however, explicitly contrast itself with those siblings inside the description text.

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?

There is no when-to-use guidance, no prerequisites, and no mention of alternatives such as create_gear or delete_gear. The second sentence is behavioral (partial-update semantics), not usage routing.

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

icu_update_gear_reminderA
Idempotent

Update an existing gear maintenance reminder. Only fields you pass are sent.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNoUpdated reminder text
gear_idYesID of the gear item
athlete_idNoAthlete ID (for coaches managing multiple athletes)
time_alertNoUpdated time alert in hours
reminder_idYesID of the reminder to update
distance_alertNoUpdated distance alert in kilometers

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare idempotentHint=true, destructiveHint=false, and readOnlyHint=false, so the safety profile is covered. The description adds the partial-update behavior ('only fields you pass are sent'), which is genuinely beyond the annotations, but it omits permission needs, error behavior, and whether omitted fields are preserved.

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 tight sentences with the core action front-loaded and the patch-semantics caveat immediately following. Every sentence earns its place with no 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?

With an output schema present and annotations covering the safety profile, the description need not explain return values. Combined with 100% schema coverage, it is nearly complete for a low-complexity mutation tool, missing only auth/permission context.

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 100% and documents all six parameters with types and units (hours, kilometers), so the schema carries the burden. The description adds no further parameter meaning beyond the patch-semantics note, which matches the baseline 3 for fully documented schemas.

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?

States a specific verb ('Update') and resource ('an existing gear maintenance reminder'), making the target unmistakable. It does not explicitly distinguish itself from the sibling icu_create_gear_reminder or icu_update_gear, so it clears the bar for clarity but not sibling differentiation.

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?

"Only fields you pass are sent" conveys partial-update (patch) semantics, which implies how to use the tool, but no when-to-use/when-not guidance or alternatives are given. Usage is implied rather than stated.

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

icu_update_sport_settingsA
Idempotent

Update an existing per-sport threshold record (outdoor/indoor FTP, FTHR, pace, swim).

ParametersJSON Schema
NameRequiredDescriptionDefault
ftpNoFunctional Threshold Power in watts (for cycling)
fthrNoFunctional Threshold Heart Rate in bpm
sport_idYesID of the sport settings to update
athlete_idNoAthlete ID (for coaches managing multiple athletes)
indoor_ftpNoIndoor Functional Threshold Power in watts (for cycling)
pace_thresholdNoThreshold pace in min/km (e.g., 4.5 for 4:30/km)
swim_thresholdNoSwim threshold in min/100m (e.g., 1.5 for 1:30/100m)
recalc_hr_zonesNoRecalculate HR zones from the updated threshold heart rate

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare this is a mutating (readOnlyHint=false) but idempotent and non-destructive operation, so the safety profile is covered. The description adds that it operates on a threshold record and which thresholds are affected, but omits useful behavioral context such as partial-update semantics (only supplied fields change) and the auto-recalculation side effect implied by recalc_hr_zones defaulting to true.

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?

A single front-loaded sentence that names the action, the resource, and the field domain with 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?

An output schema exists so return values need not be described, and annotations cover the safety profile, leaving the description only to frame the operation, which it does. It would be fully complete with a note on partial-update behavior and the HR-zone recalculation default, but the essentials for a correct call are present.

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 coverage is 100% with per-parameter descriptions that already document each threshold type, unit, and the sport_id/athlete_id roles. The description's field list largely restates the schema, adding no unit or format detail beyond it, so the baseline of 3 applies.

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?

States a specific verb ('Update') and resource ('an existing per-sport threshold record'), and enumerates the domain fields (outdoor/indoor FTP, FTHR, pace, swim). 'Existing' implicitly distinguishes it from create_sport_settings, but it never names the sibling explicitly, so the differentiation is inferable rather than stated.

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 word 'existing' implies the record must already be present and that this is a modify-not-create operation, which gives implied usage guidance. However, it does not explicitly say when to use this vs icu_create_sport_settings or icu_apply_sport_settings, nor mention prerequisites such as needing the sport_id first.

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

icu_update_wellnessA
Idempotent

Upsert wellness data for ONE specific date — creates the record if missing, otherwise updates the fields you pass.

Only provided fields are sent. Subjective scales (fatigue, soreness, stress, mood, motivation, injury) are 1-5. Pass locked=True to stop device sync from overwriting manual entries. Writes to the authenticated athlete unless athlete_id names a managed athlete.

ParametersJSON Schema
NameRequiredDescriptionDefault
hrvNoHRV (rMSSD) value
dateYesDate in YYYY-MM-DD format
moodNoMood level (1-5 scale)
spo2NoBlood oxygen saturation percentage (SpO2)
injuryNoInjury severity (1-5 scale: 1=none, 5=severe)
lockedNoLock record to prevent device sync from overwriting manual entries
stressNoStress level (1-5 scale)
vo2maxNoVO2max (ml/kg/min) — lab result or device estimate
weightNoWeight in kg
abdomenNoAbdominal circumference in cm
fatigueNoFatigue level (1-5 scale)
lactateNoBlood lactate in mmol/L — lab result
proteinNoProtein consumed (grams)
body_fatNoBody fat percentage
commentsNoComments or notes
sorenessNoSoreness level (1-5 scale)
systolicNoSystolic blood pressure in mmHg
diastolicNoDiastolic blood pressure in mmHg
fat_totalNoTotal fat consumed (grams)
hydrationNoSubjective hydration rating (1-4: 1=well hydrated, 4=very dehydrated)
readinessNoReadiness score (0-100)
athlete_idNoAthlete ID (for coaches managing multiple athletes)
motivationNoMotivation level (1-5 scale)
resting_hrNoResting heart rate in bpm
sleep_secsNoSleep duration in seconds
respirationNoRespiration rate in breaths per minute
blood_glucoseNoBlood glucose in mmol/L
carbohydratesNoCarbohydrates consumed (grams)
sleep_qualityNoSleep quality (1-5 scale)
menstrual_phaseNoMenstrual phase (e.g. FOLLICULAR, OVULATING, LUTEAL, MENSTRUAL)
hydration_litersNoHydration volume (liters)
calories_consumedNoCalories consumed (kcal)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Adds real behavior beyond annotations: upsert semantics (creates or updates), partial-update behavior (only provided fields sent), the effect of locked on device sync overwriting, and athlete targeting. This complements the idempotentHint/destructiveHint annotations rather than repeating them, though it doesn't cover permission/error 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?

Front-loads the core upsert contract in the first sentence, then layers the field-scales rule, the locked behavior, and athlete targeting with zero filler. Every sentence earns its place.

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 32-param mutation tool with an output schema present, the description covers the crucial unknowns: create-vs-update semantics, partial writes, lock interaction with device sync, and target-athlete resolution. Return values are covered by the output schema, so nothing essential is missing.

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 100%, so baseline is 3, but the description adds useful grouping, calling out which fields are subjective 1-5 scales and explaining the locked flag's purpose in driving sync behavior. It slightly exceeds what the schema alone conveys for the key semantic fields.

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?

States a specific verb (upsert) and resource (wellness data) scoped to ONE specific date, and immediately disambiguates the create-vs-update behavior. This clearly separates it from sibling read tools like icu_get_wellness_data and icu_get_wellness_for_date.

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?

Gives clear context: single-date upsert, only provided fields are sent, and the locked=True condition for protecting manual entries. It does not explicitly name the read alternative (icu_get_wellness_for_date) it should be contrasted with, but the usage context is unambiguous.

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

icu_update_workoutA
Idempotent

Change fields on an EXISTING library workout — only the fields you pass are sent.

To save a new workout use icu_create_workout. This edits the library workout only; calendar events are separate records changed with icu_update_event.

ParametersJSON Schema
NameRequiredDescriptionDefault
dayNoPLAN folders only: updated day offset from plan start
nameNoUpdated workout name
tagsNoReplacement tag list
colorNoUpdated color (hex string)
indoorNoMark as an indoor workout
targetNoUpdated device target type: AUTO, POWER, HR, or PACE
folder_idNoMove the workout to this folder or plan
athlete_idNoAthlete ID (for coaches managing multiple athletes)
workout_idYesLibrary workout ID (from icu_get_workouts_in_folder)
descriptionNoUpdated workout steps. For WORKOUT events the server parses this into structured, device-syncable steps with zones and a training load. Use Intervals.icu workout syntax: one step per line as '- <duration> <target>' (duration FIRST), grouped under Warmup / Main / Cooldown headers. Targets: bike '- 5m 85%', '- 5m Z4', or absolute '- 5m 210w'; HR '- 10m 70-80% HR' or '- 10m 145bpm'; run/swim pace '- 5m Z2 Pace', absolute only with a trailing 'pace' word: '- 5m 4:45/km pace', '- 200mtr 1:45/100m pace' (bare '5:00/km' or '1:45/100m' silently drops); threshold is relative — run '- 25m 100% pace', swim CSS '- 200mtr 100% pace' — the words 'threshold'/'CSS'/'5K pace' are NOT parsed as targets. Add cadence to any step: '- 3m Z2 90rpm'. No target: '- 20m free'. Repeats: put 'Nx' after a section name with steps flat beneath, and leave a blank line before and after the repeat block (without it the repeat silently runs only once) — e.g. 'Main 5x' then '- 3m 110%' / '- 3m 50%'. Ramps: '- 10m ramp 50-70%'. Rest: append 'Ns rest' to a step ('- 200mtr Z2 20s rest') or use a separate '- 20s intensity=rest' step (only intensity=rest exports as a device rest step) — never a bare '- 20s' step (that becomes work, not rest). Durations: 'm'=minutes, 's'=seconds; distance steps use 'mtr'=meters / 'km' / 'yrd' (e.g. swim '- 400mtr Z2 Pace'). Do NOT write '[repeat 5x ...]', nested bullets, or 'Z5 3m' (target before duration). Runs need a pace or HR target — a bare 'Z2' gives no load. Full reference: intervals-icu://workout-syntax resource.
workout_typeNoUpdated activity discipline: Ride, Run, Swim, Walk, Hike, WeightTraining, Workout, VirtualRide, VirtualRun, Other (full discipline list: intervals-icu://event-categories resource)
training_loadNoUpdated training load
distance_metersNoUpdated distance in meters
duration_secondsNoUpdated duration in seconds

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=true, and openWorldHint=true. The description adds the key behavioral detail that only passed fields are sent (partial update semantics), which is not visible in annotations. It also clarifies that this edits library workouts only, not calendar events. It doesn't discuss auth or rate limits, but the annotations cover the safety profile and the description adds meaningful update semantics.

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 with zero waste. The core function is front-loaded, and the routing guidance is concise. Every sentence earns its place, and the description is appropriately sized for a tool with 14 parameters.

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 complexity (14 params, output schema present, annotations present), the description is complete enough for an agent to call it correctly. It covers the essential behavioral distinction (partial update, library vs calendar) and routes to the right sibling. The output schema exists, so return values don't need to be described. It could mention idempotency or auth, but annotations already cover the safety profile, so this is a minor gap.

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 100%, so the schema already documents all 14 parameters. The description adds value by explaining the partial-update behavior ('only the fields you pass are sent'), which is critical for understanding how to use the parameters. The description also reinforces the distinction between library workouts and calendar events, which helps interpret parameters like folder_id and workout_id. However, it doesn't add much beyond the schema's per-parameter descriptions, so a 4 is appropriate rather than 5.

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 function: 'Change fields on an EXISTING library workout — only the fields you pass are sent.' It explicitly distinguishes from icu_create_workout and icu_update_event, making its scope unambiguous. The verb 'change' plus the resource 'library workout' is specific and differentiates it from siblings.

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 says when to use this tool vs alternatives: 'To save a new workout use icu_create_workout. This edits the library workout only; calendar events are separate records changed with icu_update_event.' This is clear routing guidance that prevents an agent from confusing library workouts with calendar events or creation with updates.

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. 6 tool updatesv5.1.0
    • Addedicu_bulk_create_workouts
    • Addedicu_create_workout
    • Addedicu_create_workout_folder
    • Addedicu_delete_workout
    • Changedicu_get_upcoming_workouts1 field changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of workouts to return"New value: +"Maximum number of planned workout events to return"
    • Addedicu_update_workout
  2. 27 tool updatesv5.0.1
    • Changedicu_apply_sport_settings1 field changed
      • addedInput schema / properties / athlete_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Athlete ID (for coaches managing multiple athletes)"
        +}
    • Changedicu_bulk_create_events1 field changed
      • changedInput schema / properties / events / description
        Previous value: -"JSON array of event objects. Required per event: start_date_local, name, category. Optional: description, event_type (activity discipline Ride/Run/Swim/…; raw `type` also accepted), moving_time, distance, icu_training_load, end_date_local, training_availability, color, show_as_note, not_on_fitness_chart, show_on_ctl_line. See intervals-icu://event-categories for the category enum. For WORKOUT events the server parses this into structured, device-syncable steps with zones and a training load. Use Intervals.icu workout syntax: one step per line as '- <duration> <target>' (duration FIRST), grouped under Warmup / Main / Cooldown headers. Targets: bike '- 5m 85%', '- 5m Z4', or absolute '- 5m 210w'; HR '- 10m 70-80% HR' or '- 10m 145bpm'; run/swim pace '- 5m Z2 Pace', absolute only with a trailing 'pace' word: '- 5m 4:45/km pace', '- 200mtr 1:45/100m pace' (bare '5:00/km' or '1:45/100m' silently drops); threshold is relative — run '- 25m 100% pace', swim CSS '- 200mtr 100% pace' — the words 'threshold'/'CSS'/'5K pace' are NOT parsed as targets. Add cadence to any step: '- 3m Z2 90rpm'. No target: '- 20m free'. Repeats: put 'Nx' after a section name with steps flat beneath, and leave a blank line before and after the repeat block (without it the repeat silently runs only once) — e.g. 'Main 5x' then '- 3m 110%' / '- 3m 50%'. Ramps: '- 10m ramp 50-70%'. Rest: append 'Ns rest' to a step ('- 200mtr Z2 20s rest') or use a separate '- 20s intensity=rest' step (only intensity=rest exports as a device rest step) — never a bare '- 20s' step (that becomes work, not rest). Durations: 'm'=minutes, 's'=seconds; distance steps use 'mtr'=meters / 'km' / 'yrd' (e.g. swim '- 400mtr Z2 Pace'). Do NOT write '[repeat 5x ...]', nested bullets, or 'Z5 3m' (target before duration). Runs need a pace or HR target — a bare 'Z2' gives no load. Full reference: intervals-icu://workout-syntax resource."New value: +"JSON array of event objects, each shaped exactly like an icu_create_event call. Required per event: start_date_local, name, category. Optional: description, event_type (activity discipline Ride/Run/Swim/…), duration_seconds, distance_meters, training_load, end_date_local, training_availability, color, show_as_note, not_on_fitness_chart, show_on_ctl_line. See intervals-icu://event-categories for the category enum. For WORKOUT events the server parses this into structured, device-syncable steps with zones and a training load. Use Intervals.icu workout syntax: one step per line as '- <duration> <target>' (duration FIRST), grouped under Warmup / Main / Cooldown headers. Targets: bike '- 5m 85%', '- 5m Z4', or absolute '- 5m 210w'; HR '- 10m 70-80% HR' or '- 10m 145bpm'; run/swim pace '- 5m Z2 Pace', absolute only with a trailing 'pace' word: '- 5m 4:45/km pace', '- 200mtr 1:45/100m pace' (bare '5:00/km' or '1:45/100m' silently drops); threshold is relative — run '- 25m 100% pace', swim CSS '- 200mtr 100% pace' — the words 'threshold'/'CSS'/'5K pace' are NOT parsed as targets. Add cadence to any step: '- 3m Z2 90rpm'. No target: '- 20m free'. Repeats: put 'Nx' after a section name with steps flat beneath, and leave a blank line before and after the repeat block (without it the repeat silently runs only once) — e.g. 'Main 5x' then '- 3m 110%' / '- 3m 50%'. Ramps: '- 10m ramp 50-70%'. Rest: append 'Ns rest' to a step ('- 200mtr Z2 20s rest') or use a separate '- 20s intensity=rest' step (only intensity=rest exports as a device rest step) — never a bare '- 20s' step (that becomes work, not rest). Durations: 'm'=minutes, 's'=seconds; distance steps use 'mtr'=meters / 'km' / 'yrd' (e.g. swim '- 400mtr Z2 Pace'). Do NOT write '[repeat 5x ...]', nested bullets, or 'Z5 3m' (target before duration). Runs need a pace or HR target — a bare 'Z2' gives no load. Full reference: intervals-icu://workout-syntax resource."
    • Changedicu_create_event1 field changed
      • changedInput schema / properties / event_type / description
        Previous value: -"Activity discipline (NOT the category): Ride, Run, Swim, Walk, Hike, VirtualRide, VirtualRun, Other. Required for RACE_A/B/C events."New value: +"Activity discipline (NOT the category): Ride, Run, Swim, Walk, Hike, WeightTraining, Workout, VirtualRide, VirtualRun, Other (full discipline list: intervals-icu://event-categories resource). Required for RACE_A/B/C events."
    • Changedicu_create_gear6 fields changed
      • changedInput schema / properties / active / description
        Previous value: -"Whether this gear is actively used"New value: +"Whether this gear is actively used (False = retired)"
      • addedInput schema / properties / athlete_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Athlete ID (for coaches managing multiple athletes)"
        +}
      • removedInput schema / properties / brand
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Brand name"
        -}
      • changedInput schema / properties / gear_type / description
        Previous value: -"Type of gear (e.g., 'BIKE', 'SHOE', 'TRAINER', 'WETSUIT', 'OTHER')"New value: +"Gear type, case-insensitive. Whole items: Bike, Shoes, Wetsuit, Trainer, RowingMachine, Skis, Snowboard, Boat, Board, Equipment, Accessories, Apparel, Computer. Components: Chain, Cassette, Wheel, Tyre, Frame, Pedals, PowerMeter, and more."
      • removedInput schema / properties / model
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Model name"
        -}
      • removedInput schema / properties / primary
        Removed value: -{
        -  "default": false,
        -  "description": "Whether this is the primary gear of this type",
        -  "type": "boolean"
        -}
    • Changedicu_create_gear_reminder1 field changed
      • addedInput schema / properties / athlete_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Athlete ID (for coaches managing multiple athletes)"
        +}
    • Changedicu_create_sport_settings1 field changed
      • addedInput schema / properties / athlete_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Athlete ID (for coaches managing multiple athletes)"
        +}
    • Changedicu_delete_gear1 field changed
      • addedInput schema / properties / athlete_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Athlete ID (for coaches managing multiple athletes)"
        +}
    • Changedicu_get_activities_around1 field changed
      • addedInput schema / properties / athlete_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Athlete ID (for coaches managing multiple athletes)"
        +}
    • Changedicu_get_activity_streams1 field changed
      • changedInput schema / properties / streams / description
        Previous value: -"List of stream types (e.g., ['watts', 'heartrate', 'cadence']). If not specified, all streams are fetched."New value: +"List of stream types (e.g., ['watts', 'heartrate', 'cadence']). If not specified, the activity's default streams are fetched — which does NOT include raw_heartrate or fixed_heartrate; ask for those by name."
    • Changedicu_get_athlete_profile1 field changed
      • addedInput schema / properties / athlete_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Athlete ID (for coaches managing multiple athletes)"
        +}
    • Changedicu_get_fitness_summary1 field changed
      • addedInput schema / properties / athlete_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Athlete ID (for coaches managing multiple athletes)"
        +}
    • Changedicu_get_gear_list1 field changed
      • addedInput schema / properties / athlete_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Athlete ID (for coaches managing multiple athletes)"
        +}
    • Changedicu_get_hr_curves1 field changed
      • addedInput schema / properties / athlete_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Athlete ID (for coaches managing multiple athletes)"
        +}
    • Changedicu_get_pace_curves1 field changed
      • addedInput schema / properties / athlete_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Athlete ID (for coaches managing multiple athletes)"
        +}
    • Changedicu_get_power_curves1 field changed
      • addedInput schema / properties / athlete_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Athlete ID (for coaches managing multiple athletes)"
        +}
    • Changedicu_get_sport_settings1 field changed
      • addedInput schema / properties / athlete_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Athlete ID (for coaches managing multiple athletes)"
        +}
    • Changedicu_get_wellness_data1 field changed
      • addedInput schema / properties / athlete_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Athlete ID (for coaches managing multiple athletes)"
        +}
    • Changedicu_get_wellness_for_date1 field changed
      • addedInput schema / properties / athlete_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Athlete ID (for coaches managing multiple athletes)"
        +}
    • Changedicu_get_workout_library1 field changed
      • addedInput schema / properties / athlete_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Athlete ID (for coaches managing multiple athletes)"
        +}
    • Changedicu_get_workouts_in_folder1 field changed
      • addedInput schema / properties / athlete_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Athlete ID (for coaches managing multiple athletes)"
        +}
    • Addedicu_list_athletes
    • Changedicu_search_activities_full1 field changed
      • addedInput schema / properties / athlete_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Athlete ID (for coaches managing multiple athletes)"
        +}
    • Changedicu_search_intervals7 fields changed
      • addedInput schema / properties / athlete_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Athlete ID (for coaches managing multiple athletes)"
        +}
      • changedInput schema / properties / interval_type / description
        Previous value: -"Type of interval to search for"New value: +"Interval target type: AUTO, POWER, HR, or PACE (what the interval targeted — not the sport and not a workout-step label)"
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of results to return"New value: +"Maximum number of matching activities to return"
      • changedInput schema / properties / max_duration / description
        Previous value: -"Maximum duration in seconds"New value: +"Maximum interval duration in seconds"
      • addedInput schema / properties / max_intensity
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Maximum interval intensity in percent of threshold (e.g. 105)"
        +}
      • changedInput schema / properties / min_duration / description
        Previous value: -"Minimum duration in seconds"New value: +"Minimum interval duration in seconds"
      • addedInput schema / properties / min_intensity
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Minimum interval intensity in percent of threshold (e.g. 80)"
        +}
    • Changedicu_update_gear6 fields changed
      • changedInput schema / properties / active / description
        Previous value: -"Whether this gear is actively used"New value: +"False retires the gear (dated today); True un-retires it"
      • addedInput schema / properties / athlete_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Athlete ID (for coaches managing multiple athletes)"
        +}
      • removedInput schema / properties / brand
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Updated brand"
        -}
      • changedInput schema / properties / gear_type / description
        Previous value: -"Updated type (BIKE, SHOE, TRAINER, etc.)"New value: +"Updated type, case-insensitive (Bike, Shoes, Trainer, Chain, ...)"
      • removedInput schema / properties / model
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Updated model"
        -}
      • removedInput schema / properties / primary
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "boolean"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Whether this is the primary gear of this type"
        -}
    • Changedicu_update_gear_reminder1 field changed
      • addedInput schema / properties / athlete_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Athlete ID (for coaches managing multiple athletes)"
        +}
    • Changedicu_update_sport_settings1 field changed
      • addedInput schema / properties / athlete_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Athlete ID (for coaches managing multiple athletes)"
        +}
    • Changedicu_update_wellness2 fields changed
      • addedInput schema / properties / athlete_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Athlete ID (for coaches managing multiple athletes)"
        +}
      • addedInput schema / properties / hydration
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Subjective hydration rating (1-4: 1=well hydrated, 4=very dehydrated)"
        +}
  3. 4 tool updatesv4.3.2
    • Changedicu_bulk_create_events1 field changed
      • changedInput schema / properties / events / description
        Previous value: -"JSON array of event objects. Required per event: start_date_local, name, category. Optional: description, type, moving_time, distance, icu_training_load, end_date_local, training_availability, color, show_as_note, not_on_fitness_chart, show_on_ctl_line. See intervals-icu://event-categories for the category enum and intervals-icu://workout-syntax for WORKOUT `description` syntax."New value: +"JSON array of event objects. Required per event: start_date_local, name, category. Optional: description, event_type (activity discipline Ride/Run/Swim/…; raw `type` also accepted), moving_time, distance, icu_training_load, end_date_local, training_availability, color, show_as_note, not_on_fitness_chart, show_on_ctl_line. See intervals-icu://event-categories for the category enum. For WORKOUT events the server parses this into structured, device-syncable steps with zones and a training load. Use Intervals.icu workout syntax: one step per line as '- <duration> <target>' (duration FIRST), grouped under Warmup / Main / Cooldown headers. Targets: bike '- 5m 85%', '- 5m Z4', or absolute '- 5m 210w'; HR '- 10m 70-80% HR' or '- 10m 145bpm'; run/swim pace '- 5m Z2 Pace', absolute only with a trailing 'pace' word: '- 5m 4:45/km pace', '- 200mtr 1:45/100m pace' (bare '5:00/km' or '1:45/100m' silently drops); threshold is relative — run '- 25m 100% pace', swim CSS '- 200mtr 100% pace' — the words 'threshold'/'CSS'/'5K pace' are NOT parsed as targets. Add cadence to any step: '- 3m Z2 90rpm'. No target: '- 20m free'. Repeats: put 'Nx' after a section name with steps flat beneath, and leave a blank line before and after the repeat block (without it the repeat silently runs only once) — e.g. 'Main 5x' then '- 3m 110%' / '- 3m 50%'. Ramps: '- 10m ramp 50-70%'. Rest: append 'Ns rest' to a step ('- 200mtr Z2 20s rest') or use a separate '- 20s intensity=rest' step (only intensity=rest exports as a device rest step) — never a bare '- 20s' step (that becomes work, not rest). Durations: 'm'=minutes, 's'=seconds; distance steps use 'mtr'=meters / 'km' / 'yrd' (e.g. swim '- 400mtr Z2 Pace'). Do NOT write '[repeat 5x ...]', nested bullets, or 'Z5 3m' (target before duration). Runs need a pace or HR target — a bare 'Z2' gives no load. Full reference: intervals-icu://workout-syntax resource."
    • Changedicu_create_event1 field changed
      • changedInput schema / properties / description / description
        Previous value: -"Event description. For WORKOUT events, use Intervals.icu structured workout syntax (see intervals-icu://workout-syntax resource) — the server parses it into a structured workout with training load and zones."New value: +"Event description (plain text for non-workouts). For WORKOUT events the server parses this into structured, device-syncable steps with zones and a training load. Use Intervals.icu workout syntax: one step per line as '- <duration> <target>' (duration FIRST), grouped under Warmup / Main / Cooldown headers. Targets: bike '- 5m 85%', '- 5m Z4', or absolute '- 5m 210w'; HR '- 10m 70-80% HR' or '- 10m 145bpm'; run/swim pace '- 5m Z2 Pace', absolute only with a trailing 'pace' word: '- 5m 4:45/km pace', '- 200mtr 1:45/100m pace' (bare '5:00/km' or '1:45/100m' silently drops); threshold is relative — run '- 25m 100% pace', swim CSS '- 200mtr 100% pace' — the words 'threshold'/'CSS'/'5K pace' are NOT parsed as targets. Add cadence to any step: '- 3m Z2 90rpm'. No target: '- 20m free'. Repeats: put 'Nx' after a section name with steps flat beneath, and leave a blank line before and after the repeat block (without it the repeat silently runs only once) — e.g. 'Main 5x' then '- 3m 110%' / '- 3m 50%'. Ramps: '- 10m ramp 50-70%'. Rest: append 'Ns rest' to a step ('- 200mtr Z2 20s rest') or use a separate '- 20s intensity=rest' step (only intensity=rest exports as a device rest step) — never a bare '- 20s' step (that becomes work, not rest). Durations: 'm'=minutes, 's'=seconds; distance steps use 'mtr'=meters / 'km' / 'yrd' (e.g. swim '- 400mtr Z2 Pace'). Do NOT write '[repeat 5x ...]', nested bullets, or 'Z5 3m' (target before duration). Runs need a pace or HR target — a bare 'Z2' gives no load. Full reference: intervals-icu://workout-syntax resource."
    • Addedicu_get_fitness_chart
    • Changedicu_update_event1 field changed
      • changedInput schema / properties / description / description
        Previous value: -"Updated description"New value: +"Updated description. For WORKOUT events the server parses this into structured, device-syncable steps with zones and a training load. Use Intervals.icu workout syntax: one step per line as '- <duration> <target>' (duration FIRST), grouped under Warmup / Main / Cooldown headers. Targets: bike '- 5m 85%', '- 5m Z4', or absolute '- 5m 210w'; HR '- 10m 70-80% HR' or '- 10m 145bpm'; run/swim pace '- 5m Z2 Pace', absolute only with a trailing 'pace' word: '- 5m 4:45/km pace', '- 200mtr 1:45/100m pace' (bare '5:00/km' or '1:45/100m' silently drops); threshold is relative — run '- 25m 100% pace', swim CSS '- 200mtr 100% pace' — the words 'threshold'/'CSS'/'5K pace' are NOT parsed as targets. Add cadence to any step: '- 3m Z2 90rpm'. No target: '- 20m free'. Repeats: put 'Nx' after a section name with steps flat beneath, and leave a blank line before and after the repeat block (without it the repeat silently runs only once) — e.g. 'Main 5x' then '- 3m 110%' / '- 3m 50%'. Ramps: '- 10m ramp 50-70%'. Rest: append 'Ns rest' to a step ('- 200mtr Z2 20s rest') or use a separate '- 20s intensity=rest' step (only intensity=rest exports as a device rest step) — never a bare '- 20s' step (that becomes work, not rest). Durations: 'm'=minutes, 's'=seconds; distance steps use 'mtr'=meters / 'km' / 'yrd' (e.g. swim '- 400mtr Z2 Pace'). Do NOT write '[repeat 5x ...]', nested bullets, or 'Z5 3m' (target before duration). Runs need a pace or HR target — a bare 'Z2' gives no load. Full reference: intervals-icu://workout-syntax resource."
  4. 3 tool updatesv4.2.0
    • Changedicu_apply_sport_settings1 field changed
      • removedInput schema / properties / oldest_date
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Oldest date to apply settings to (YYYY-MM-DD format)"
        -}
    • Changedicu_create_sport_settings1 field changed
      • addedInput schema / properties / indoor_ftp
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Indoor Functional Threshold Power in watts (for cycling)"
        +}
    • Changedicu_update_sport_settings2 fields changed
      • addedInput schema / properties / indoor_ftp
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Indoor Functional Threshold Power in watts (for cycling)"
        +}
      • addedInput schema / properties / recalc_hr_zones
        Added value: +{
        +  "default": true,
        +  "description": "Recalculate HR zones from the updated threshold heart rate",
        +  "type": "boolean"
        +}
  5. 2 tool updatesv4.1.0
    • Addedicu_get_activities_by_date
    • Addedicu_get_annual_training_plan
  6. 4 tool updatesv3.0.0
    • Changedicu_bulk_create_events1 field changed
      • changedInput schema / properties / events / description
        Previous value: -"JSON array of events. Required per event: start_date_local, name, category. Optional: description, type, moving_time, distance, icu_training_load, end_date_local (ranged categories), training_availability (NORMAL/LIMITED/UNAVAILABLE), color, show_as_note, not_on_fitness_chart, show_on_ctl_line. Categories: WORKOUT, NOTE, RACE_A/B/C, TARGET, PLAN, HOLIDAY, SICK, INJURED, SET_EFTP, FITNESS_DAYS, SEASON_START, SET_FITNESS (legacy RACE→RACE_A and GOAL→TARGET aliases accepted). For WORKOUT events, include structured workout syntax in 'description' (see intervals-icu://workout-syntax resource)."New value: +"JSON array of event objects. Required per event: start_date_local, name, category. Optional: description, type, moving_time, distance, icu_training_load, end_date_local, training_availability, color, show_as_note, not_on_fitness_chart, show_on_ctl_line. See intervals-icu://event-categories for the category enum and intervals-icu://workout-syntax for WORKOUT `description` syntax."
    • Changedicu_create_custom_item1 field changed
      • changedInput schema / properties / content / description
        Previous value: -"Configuration object whose schema depends on item_type. REQUIRED for INPUT_FIELD, ACTIVITY_FIELD, INTERVAL_FIELD; for these the schema is: `code` (machine identifier — must match regex [A-Z][A-Za-z0-9]+, i.e. start with uppercase and contain only alphanumerics, no spaces/underscores), `type` ('numeric', 'text', or 'select' — NOT 'number'), `aggregate` ('MIN', 'SUM', 'MAX', or 'AVERAGE' — NOT 'AVG'). Example: {'code': 'Rpe', 'type': 'numeric', 'aggregate': 'AVERAGE'}. Optional for chart/panel/zones/stream types where the API uses defaults — you can omit and configure in the Intervals.icu UI later."New value: +"Configuration object whose schema depends on item_type. Read intervals-icu://custom-item-schemas BEFORE constructing — it documents the {code, type, aggregate} shape required for INPUT_FIELD / ACTIVITY_FIELD / INTERVAL_FIELD (with constraints and worked examples) and explains that chart/panel/zones/stream types should omit `content`."
    • Changedicu_create_event5 fields changed
      • changedInput schema / properties / category / description
        Previous value: -"Event category. WORKOUT, NOTE, RACE_A/RACE_B/RACE_C (race tier), TARGET (performance goal), PLAN, HOLIDAY (Urlaub), SICK (Krank), INJURED (Verletzt), SET_EFTP, FITNESS_DAYS (Fitnesstage), SEASON_START (Saison), SET_FITNESS. Legacy aliases RACE→RACE_A and GOAL→TARGET are accepted."New value: +"Event category enum. Common: WORKOUT, NOTE, RACE_A/B/C, TARGET, PLAN, HOLIDAY, SICK, INJURED. Full list with use-case guidance and the training_availability enum: intervals-icu://event-categories resource. Legacy aliases RACE→RACE_A, GOAL→TARGET accepted."
      • changedInput schema / properties / description / description
        Previous value: -"Event description. For WORKOUT events, use Intervals.icu structured workout syntax to define intervals, targets, and structure. The server automatically parses this into a structured workout. Read the intervals-icu://workout-syntax resource for the complete syntax reference. Example: 'Warmup\n- 10m ramp 50%-75%\n\nMain Set 3x\n- 5m 95%\n- 3m 55%\n\nCooldown\n- 10m 50%'"New value: +"Event description. For WORKOUT events, use Intervals.icu structured workout syntax (see intervals-icu://workout-syntax resource) — the server parses it into a structured workout with training load and zones."
      • changedInput schema / properties / end_date / description
        Previous value: -"End date in YYYY-MM-DD format. Use for ranged categories like INJURED, SICK, HOLIDAY, SEASON_START to mark a multi-day block."New value: +"End date in YYYY-MM-DD format. Use for ranged categories (INJURED, SICK, HOLIDAY, SEASON_START) to mark a multi-day block."
      • changedInput schema / properties / event_type / description
        Previous value: -"Activity discipline (NOT the category). Must be one of: Ride, Run, Swim, Walk, Hike, VirtualRide, VirtualRun, Other. Required for RACE_A/RACE_B/RACE_C events — the API rejects races without a discipline."New value: +"Activity discipline (NOT the category): Ride, Run, Swim, Walk, Hike, VirtualRide, VirtualRun, Other. Required for RACE_A/B/C events."
      • changedInput schema / properties / training_availability / description
        Previous value: -"Training availability during the event: NORMAL (Verfügbar), LIMITED (Begrenzt), or UNAVAILABLE (Nicht verfügbar). Typical for INJURED/SICK/HOLIDAY blocks so the planner skips or scales workouts."New value: +"Training availability: NORMAL, LIMITED, or UNAVAILABLE. Typical for INJURED/SICK/HOLIDAY blocks."
    • Changedicu_update_custom_item2 fields changed
      • changedInput schema / properties / content / description
        Previous value: -"Updated configuration content (replaces existing content). Same schema rules as create_custom_item.content — for field-type items the inner shape is {`code`, `type`, `aggregate`} with the same validation constraints (code regex [A-Z][A-Za-z0-9]+, type in numeric/text/select, aggregate in MIN/SUM/MAX/AVERAGE)."New value: +"Updated configuration content (replaces existing wholesale). Same schema as create_custom_item.content — see intervals-icu://custom-item-schemas for the per-item_type shape."
      • changedInput schema / properties / item_type / description
        Previous value: -"Updated type (see create_custom_item for values)"New value: +"Updated type (see icu_create_custom_item for values)"
  7. 55 tool updatesv0.1.0
    • First observedicu_add_activity_message
    • First observedicu_apply_sport_settings
    • First observedicu_apply_training_plan
    • First observedicu_bulk_create_events
    • First observedicu_bulk_create_manual_activities
    • First observedicu_bulk_delete_events
    • First observedicu_create_custom_item
    • First observedicu_create_event
    • First observedicu_create_gear
    • First observedicu_create_gear_reminder
    • First observedicu_create_sport_settings
    • First observedicu_delete_event
    • First observedicu_delete_gear
    • First observedicu_download_activity_file
    • First observedicu_download_fit_file
    • First observedicu_download_gpx_file
    • First observedicu_duplicate_events
    • First observedicu_get_activities_around
    • First observedicu_get_activity_details
    • First observedicu_get_activity_intervals
    • First observedicu_get_activity_messages
    • First observedicu_get_activity_streams
    • First observedicu_get_athlete_profile
    • First observedicu_get_best_efforts
    • First observedicu_get_calendar_events
    • First observedicu_get_custom_item
    • First observedicu_get_custom_items
    • First observedicu_get_event
    • First observedicu_get_fitness_summary
    • First observedicu_get_gap_histogram
    • First observedicu_get_gear_list
    • First observedicu_get_hr_curves
    • First observedicu_get_hr_histogram
    • First observedicu_get_pace_curves
    • First observedicu_get_pace_histogram
    • First observedicu_get_power_curves
    • First observedicu_get_power_histogram
    • First observedicu_get_recent_activities
    • First observedicu_get_sport_settings
    • First observedicu_get_upcoming_workouts
    • First observedicu_get_wellness_data
    • First observedicu_get_wellness_for_date
    • First observedicu_get_workout_library
    • First observedicu_get_workouts_in_folder
    • First observedicu_search_activities
    • First observedicu_search_activities_full
    • First observedicu_search_intervals
    • First observedicu_update_activity
    • First observedicu_update_activity_streams
    • First observedicu_update_custom_item
    • First observedicu_update_event
    • First observedicu_update_gear
    • First observedicu_update_gear_reminder
    • First observedicu_update_sport_settings
    • First observedicu_update_wellness

TDQS

A3.9/5.0

Scored across 64 tools

Disambiguation5/5

Each tool's description explicitly contrasts it with adjacent tools (e.g., 'Different from...', 'Use for... NOT for...'), making even near-duplicates like the three download formats precisely distinguishable. The agent can reliably select the correct tool despite the large set.

Naming Consistency5/5

All tools follow a predictable icu_<verb>_<noun> pattern (get/create/update/delete/bulk_create/apply/duplicate), with only minor conventional variance such as add vs. get for messages. The naming is uniform across all subdomains.

Tool Count1/5

64 tools vastly exceeds any reasonable tool-set size, even for a full-platform integration. The sheer count forces an agent to parse an enormous list and would be better served by splitting into multiple focused MCP servers.

Completeness4/5

The tool surface covers activities, workouts, calendar, athlete, wellness, gear, and customizations almost exhaustively, including batch operations and historical backfills. Minor gaps exist (e.g., no delete_activity, no delete_workout_folder), but these are workable.

Maintenance

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to interact with Intervals.icu fitness tracking and wellness data, allowing users to fetch, filter, and group activities or health metrics. It provides structured summaries of workouts and physical well-being through natural language queries.
    4
    -
  • A
    license
    B
    quality
    D
    maintenance
    An MCP server for interacting with the Wahoo Cloud API to manage workouts, routes, training plans, and power zones. It enables users to list, retrieve, and create fitness data through secure OAuth 2.0 authentication.
    9
    7
    GPL 3.0
  • A
    license
    A
    quality
    D
    maintenance
    An MCP server that enables interaction with the Strava API v3 to manage fitness activities, athlete profiles, segments, and routes. It supports retrieving detailed performance metrics, exploring geographic data, and managing club information through natural language.
    43 npm
    ISC