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

72 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 9 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. curl -LsSf https://astral.sh/uv/install.sh | sh on macOS/Linux (or brew install uv; Homebrew no longer installs on Intel Macs), or powershell -c "irm https://astral.sh/uv/install.ps1 | iex" on Windows. From there, uvx fetches Python and the package automatically. If your MCP client can't find uvx, set command to the full path that which uvx prints. 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/settings → Developer → Create 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

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

Category

Tools

Summary

Activities

13

Query, search, update, delete, download activities

Activity Analysis

8

Streams, intervals, best efforts, histograms

Activity Messages

4

Read, post, edit, and delete notes/comments/coach feedback on activities

Athlete

5

Accessible athletes, profile and athlete notes, CTL/ATL/TSB analysis, fitness chart time-series

Wellness

3

HRV, sleep, recovery metrics

Events / Calendar

13

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

Performance / Curves

3

Power, HR, and pace curves with zones

Workout Library

8

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

Gear Management

6

Track equipment and maintenance reminders

Sport Settings

4

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

69 tools
icu_add_activity_messageIcu 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).

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

Output 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=false, idempotentHint=false, and destructiveHint=false, so the write/non-idempotent/non-destructive profile is covered structurally. The description adds value beyond that by noting attribution to the authenticated user and reinforcing the singular-WRITE semantics that the annotations only imply. It doesn't mention the return payload, but an output schema exists, so that is acceptable.

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-loaded with the operation and its singular/WRITE semantics, then the when-to-use trigger, then the read alternative. Every sentence carries distinct information; 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?

Annotations, 100% schema coverage, and an output schema mean most structured burden is covered, and the description fills the purpose, trigger, and read/write routing gaps. It could go one step further by distinguishing the related update/delete message siblings (icu_update_activity_message, icu_delete_activity_message), which are also singular write operations.

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% with only two parameters (activity_id, content), both documented in the schema. The description implies what goes into content ("note or comment") but adds no format, length, or validation detail beyond the schema. Baseline 3 applies when the schema carries the 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 and resource ("POST a new note or comment on a specific activity") and explicitly labels the singular form as the WRITE operation. It distinguishes itself from the read sibling icu_get_activity_messages (plural) by name, so an agent can separate the two 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?

Provides an explicit "use when" trigger with three concrete user-utterance examples ("add a note to this ride that I felt strong", "comment on yesterday's run", "leave a training note"). It also names the alternative for the opposite case: "To READ existing notes use icu_get_activity_messages (plural)."

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

icu_apply_training_planIcu 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).

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

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 destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the mutation profile is known. The description adds that a whole plan lands on the calendar at once (which contextualizes destructiveness) and the folder_id prerequisite, but says nothing about what happens to pre-existing entries on those dates or whether re-running duplicates the plan.

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

Conciseness5/5

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

Three short sentences, front-loaded with the action and resource, then prerequisite, then sibling disambiguation. 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?

A destructive, non-idempotent bulk-scheduling tool with an output schema and full parameter docs; the description covers purpose, prerequisite, and alternatives. What is missing is the overwrite/conflict behavior when dates already hold events, which matters for a destructive operation.

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 including extra_workouts_json and athlete_id are documented in the schema. The description adds only the notion of a chosen start date; it does not explain the optional extra_workouts_json semantics or coach/athlete_id behavior 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 (schedule), a specific resource (an entire training plan / workout-library folder), and the target surface (athlete's calendar) with the start-date scoping. It explicitly names the sibling tools it is not, so differentiation is immediate.

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 an explicit prerequisite workflow ("Use after icu_get_workout_library to find a plan's folder_id") and contrasts with three siblings: icu_create_event/icu_bulk_create_events build new events, icu_duplicate_events copies existing. When-to-use and when-not-to-use are both covered.

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

icu_bulk_create_eventsIcu 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.

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, tags (no leading #), color, show_as_note, not_on_fitness_chart, show_on_ctl_line, hide_from_athlete, athlete_cannot_edit. 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

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=false, idempotentHint=false, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds useful context about batch efficiency and the duplicate-events alternative, but does not disclose bulk failure behavior, partial success, or batch limits. 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?

The description is four sentences, front-loaded with the primary action and efficiency rationale. The alternative and resource pointers follow without redundant detail, leaving syntax detail to the schema where it belongs.

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 rich schema, annotations, and output schema, the description is largely complete for selecting and invoking the tool. It points to the necessary workout-syntax and event-category resources, but omits batch limits and partial-failure semantics that would matter for a bulk mutation.

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 schema's events parameter already fully documents payload shape, workout syntax, enums, and pitfalls. The description adds the relationship to icu_create_event and resource pointers, but the schema itself repeats those same references, so the top-level description adds little parameter meaning beyond the schema 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?

States a specific verb and resource ('Create MANY new calendar events') plus batch scope, and distinguishes itself from looping icu_create_event. It also names icu_duplicate_events as the alternative for copying existing events, so an agent can identify the tool without opening other schemas.

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 use this for many events in one batch and that it is more efficient than looping icu_create_event. It also gives a clear alternative condition: use icu_duplicate_events instead when copying existing events forward.

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_activitiesIcu 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.

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

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Adds real context beyond the annotations: what the upsert key is, that the matching scope is 'set by the same OAuth app', and that entries lacking external_id always duplicate. Since destructiveHint=true, it could say more about what happens to fields omitted on the update path, but the core mutation behavior is disclosed rather than left to inference.

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 with the operation and its constraint front-loaded; the update-versus-create rule follows immediately. Nothing redundant and nothing buried.

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 and annotations carry the safety profile, so the description does not need return values. For a destructive bulk write, though, it omits batch-size limits, error/partial-failure behavior, and whether unmentioned fields on updated activities are preserved or cleared.

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 a 3 baseline applies, but the description genuinely adds meaning: external_id is revealed as the upsert key inside activities_json, a field the schema only calls 'JSON string containing array of manual activities'. athlete_id is not discussed, so this falls short of being self-contained.

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 (batch-create manual activities) plus the defining constraint (no device upload) and the write semantics (UPSERT on external_id). It is clearly separable from siblings like icu_get_activities_by_date, icu_bulk_create_events, and any FIT-file upload path.

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 'no device upload' qualifier implicitly routes device-file scenarios elsewhere, and the external_id rules tell the agent exactly which condition produces an update versus a create. However, no sibling alternative is named explicitly and no prerequisites (scope, permissions, batch limits) are stated.

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

icu_bulk_create_workoutsIcu 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.

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

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

The key behavioral trait not derivable from annotations is stated plainly: 'Nothing lands on the calendar' — items go into library folders. That is genuinely useful disambiguation for a non-readOnly, non-idempotent write tool. It does not disclose partial-failure/atomicity behavior for a bulk operation, which matters given idempotentHint=false.

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 action and scope, then the behavioral constraint, then the alternatives. No repetition of the verbose syntax text that lives in the schema.

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 annotations, a full schema, and an output schema, the description covers purpose, the library-vs-calendar distinction, and sibling routing. The one missing piece for a bulk write is what happens on partial failure or whether the call is atomic.

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 parameter description already carries the full workout-syntax reference, including the pointer to intervals-icu://workout-syntax. The tool description only restates 'each item is shaped like an icu_create_workout call', which the schema also says, so 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 (bulk create), resource (reusable workouts), and location (library folders or plans) in one call, with emphasis on the MANY/bulk nature. It also distinguishes itself from sibling tools by name (icu_bulk_create_events, icu_apply_training_plan).

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 routes the agent away: dated calendar workouts go to icu_bulk_create_events and scheduling a finished plan goes to icu_apply_training_plan. No guidance on when to use this versus single-item icu_create_workout, and no stated prerequisite that the target folder must already exist.

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

icu_bulk_delete_eventsIcu 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.

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

Output 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 destructiveHint=true and idempotentHint=true, and the description adds meaningful behavioral detail: the operation cannot be undone, and safe mode partitions events into `deleted` and `skipped` based on date. It does not describe failure behavior for invalid IDs, but the partition logic is a substantial disclosure 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 front-loaded with the purpose and destructive warning, then explains the safe-mode partition and the environment override in two compact sentences. Every sentence adds useful information with no repetition or waste.

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 a full input schema, an output schema, and annotations covering safety and idempotency, the description supplies the remaining important context: bulk scope, irreversibility, and safe-mode partitioning. An agent has enough information to call this destructive 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?

Schema description coverage is 100%, so the input schema already explains `event_ids` as a JSON array string and `athlete_id` as an optional coach-managed athlete filter. The description refers only generically to the input list and adds no parameter-level semantics beyond the schema, which is the baseline 3 when schema coverage is complete.

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: delete MANY calendar events in a single batch call. The use of "MANY" and "batch" clearly distinguishes this bulk operation from the single-event sibling icu_delete_event.

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 establishes the context for use: bulk deletion of many events in one call, and it explains the default `safe` mode versus `full` mode. It does not explicitly name icu_delete_event as the alternative for single-event deletion, so it falls short of full when/when-not guidance.

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

icu_bulk_update_event_accessIcu Bulk Update Event AccessA
Idempotent

Hide/reveal or lock/unlock MANY planned WORKOUT calendar events at once.

Sets the web UI's "Hide from athlete" and "Athlete cannot edit" checkboxes — e.g. build a training block ahead of time, hide it, and reveal it week by week, or lock key sessions. Only the flags you pass are changed. Only WORKOUT events are touched: notes, races and targets are reported under skipped. IDs are calendar event IDs (from icu_get_calendar_events / icu_get_upcoming_workouts), not workout-library IDs. For one event use icu_update_event.

NameRequiredDescriptionDefault
newestNoLast day of the date range (YYYY-MM-DD), inclusive
oldestNoFirst day of a date range (YYYY-MM-DD), with newest. Use instead of event_ids
event_idsNoJSON array of calendar event IDs (e.g. '[123, 456]'). Use this OR oldest+newest
athlete_idNoAthlete ID (for coaches managing multiple athletes)
hide_from_athleteNotrue hides the workouts from the athlete, false reveals them
athlete_cannot_editNotrue locks the workouts against athlete edits, false unlocks them

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations cover the safety profile (idempotent=true, destructive=false), and the description adds real context beyond them: partial-update semantics ('Only the flags you pass are changed'), scope restriction to workout events, and how non-matching events surface under `skipped`. That is exactly the behavioral detail an agent needs before a bulk mutation.

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-loaded with the action, then the mechanism, then the scoping constraints and the sibling pointer. Every sentence carries either a usage scenario, a constraint, or an identifier caveat; nothing is redundant.

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?

Covers bulk scope, selection modes, mutation semantics, event-type filtering, ID provenance, and sibling routing; an output schema exists so the `skipped` reporting need not be further expanded. Nothing an agent needs to call this correctly is missing.

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

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 still adds meaning by specifying that IDs are calendar event IDs from icu_get_calendar_events / icu_get_upcoming_workouts, not workout-library IDs — a genuinely error-prone confusion. It does not re-explain the date-range vs. event_ids mutual exclusion, which the schema already handles.

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 pair (hide/reveal, lock/unlock) on a specific resource (MANY planned WORKOUT calendar events) and explains the exact underlying UI flags it toggles. It is unambiguously distinguishable from icu_update_event and icu_bulk_delete_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?

Gives the canonical scenario (build a block ahead, hide it, reveal week by week; lock key sessions) and an explicit routing rule: 'For one event use icu_update_event.' It also states the negative case — only WORKOUT events are touched; notes, races and targets are skipped.

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

icu_create_custom_itemIcu 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.

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

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 the mutation and open-world profile (readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false). The description adds genuinely useful behavior: content shape is item_type-dependent and must be read from a resource BEFORE constructing, and chart/panel/zones/stream types should omit content entirely.

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 tight sentences, front-loaded with purpose then usage then the prerequisite for content. Nothing is padded and the resource hint arrives before the agent would start constructing arguments.

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?

Output schema exists so return values need no explanation, and the content-shape dependency is redirected to a resource. The only gap is that coach-only athlete_id behavior and the non-idempotent nature of creation are left to the schema/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 schema already documents every parameter in depth. The description largely defers ('see that param's description') rather than adding new semantics, and the resource pointer for content is already present in 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?

States a specific verb and resource ('Create a custom addition to the user's Intervals.icu account') and immediately grounds it in concrete user intents ('add a custom field for RPE', 'create a custom power zone set'). The create verb naturally separates it from the get/update custom-item siblings.

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 explicit trigger phrases that show exactly when to reach for this tool, and directs the agent to match intent against item_type. It does not name when to use a sibling instead (e.g., icu_update_custom_item for existing items), so it falls short of full when/when-not coverage.

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

icu_create_eventIcu 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.

NameRequiredDescriptionDefault
nameYesEvent name
tagsNoCalendar tags for grouping and filtering, without the leading # (e.g. ["sweet-spot", "indoor"])
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
hide_from_athleteNoHide this event from the athlete's calendar (the web UI's 'Hide from athlete' checkbox). For coaches managing an athlete via athlete_id
athlete_cannot_editNoLock this event so the athlete cannot move or edit it (the web UI's 'Athlete cannot edit' checkbox). For coaches managing an athlete via athlete_id
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

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare the mutation/safety profile (readOnly=false, destructive=false, idempotent=false). The description adds substantive behavior the annotations cannot: that WORKOUT description text is parsed server-side into device-syncable steps with zones and training load, and it flags silent failure modes (bare pace strings dropped, repeats collapsing to one iteration without blank lines, bare '- 20s' becoming work rather than rest). That is exactly the non-obvious behavior an agent needs to know before calling.

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-loaded correctly: the create statement comes first, then routing rules, then reference pointers. Slightly long across three paragraphs and part of the resource-pointer prose duplicates the schema, but every paragraph carries distinct routing or reference 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?

For an 18-parameter create tool with an output schema and full annotation coverage, the description supplies what structured fields cannot: sibling routing, the required payload location for workout events, and the reference resources. Return values need no explanation because an output schema exists, and no material call-time decision is left 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% and the schema itself is unusually rich, so the baseline is 3. The description's parameter-level content (put workout syntax in `description`, consult the event-categories resource for `category`/`training_availability`) largely restates what the schema already says, adding only a resource pointer rather than new semantics for the 18 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?

Opens with a specific verb and resource ('Create ONE new calendar event from scratch'), with the 'ONE' emphasis immediately bounding scope. It then names the two closest siblings (icu_bulk_create_events, icu_duplicate_events) and the condition that separates them, so an agent can route 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?

Explicit when-to-use-this vs when-to-use-alternative: 2+ events → bulk create instead of a loop; copying existing events forward → duplicate_events because it reuses the payload. It also directs the agent to the two resources needed for enum values and workout syntax, closing the main usage gaps in advance.

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

icu_create_gearIcu Create GearB

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

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

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 the write, non-destructive, non-idempotent, open-world profile, so the safety bar is low. The description adds the domain framing (equipment usage/maintenance) but says nothing about duplicate handling given idempotentHint=false, or what happens when a gear name already 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?

A single front-loaded sentence with the verb first and examples that earn their place by clarifying what 'gear' covers. Nothing redundant.

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 full schema coverage, annotations, and an output schema, the return value and safety semantics are already covered, so the description is nearly sufficient. The only real gap is the absence of usage guidance for a mutation tool in a large sibling set.

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%, including the lengthy gear_type enumeration and the coach-oriented athlete_id note, so the schema carries all parameter meaning. The description adds no parameter-level detail and 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 and resource ('Create a new gear item') and adds the domain purpose ('tracking equipment usage and maintenance') with concrete examples. It is distinguishable from the sibling create/read/update/delete gear tools by the verb alone, though it never names them.

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 when-to-use guidance, no prerequisites (e.g., whether gear must be attached to an athlete, coach vs. self), and no exclusions. Only a generic purpose phrase implies usage; the agent must infer everything else.

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

icu_create_gear_reminderIcu Create Gear ReminderB

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

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

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=false, idempotentHint=false, destructiveHint=false and openWorldHint=true, so the mutation and safety profile is covered. The description contributes the trigger semantics (distance, time, or both), but says nothing about duplicate-reminder behavior, whether a reminder with no alert is valid, or permission/auth needs for coach-scoped writes. Adequate but thin against a lowered bar.

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 sentence with no filler, front-loading the verb and resource followed by the one non-obvious behavioral detail. Nothing is wasted.

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, annotations covering the safety profile, and full schema descriptions for all five parameters including the coach-facing athlete_id, the agent has enough to call this correctly. The remaining gap is the missing relationship to the update sibling, which is a routing concern rather than a completeness failure for the call itself.

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%, including worked examples for text, time_alert, and distance_alert, so the schema already does the heavy lifting. The description's 'distance, time, or both' confirms the two alert parameters are combinable, which is marginal added meaning. 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 and resource — 'Create a maintenance reminder for a gear item' — and adds the trigger model (distance, time, or both), which is the core semantics of the resource. It does not explicitly distinguish itself from the sibling icu_update_gear_reminder, so it falls short of a 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 prerequisites, and no mention of the obvious alternative (icu_update_gear_reminder) or of what happens if a reminder already exists. The only usage signal is implicit in the trigger wording.

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

icu_create_sport_settingsIcu Create Sport SettingsB

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

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

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false and openWorldHint=true, so the write profile is covered. The description adds only the field groupings (outdoor vs indoor FTP), and stays silent on the meaningful behavioral question for a non-idempotent create: whether a duplicate sport_type is rejected or replaces the existing thresholds.

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?

A single front-loaded sentence with no filler; the resource and the key qualifier (per-sport) come first. It is efficient, though the trailing field list largely duplicates the schema property names.

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?

With an output schema present, return values need not be explained. However, for a non-idempotent mutation with an optional coach-scoped athlete_id, the description omits duplicate-handling behavior and any permission/scope prerequisites, leaving an agent to infer them from annotations alone.

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%, with each parameter carrying its own unit-bearing description (watts, bpm, min/km, min/100m). The description merely restates those field names, adding no unit, format, or defaulting semantics beyond 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?

States a specific verb and resource ("Create a per-sport threshold record") and enumerates the metric families covered (FTP, FTHR, pace, swim). The 'create' verb implicitly separates it from the sibling icu_get_sport_settings and icu_update_sport_settings, though neither is named 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 guidance on when to create versus when to use icu_update_sport_settings, nor any note about what happens if a record already exists for the given sport_type. The athlete_id parameter's coaching use case is only explained in the schema, not in the description.

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

icu_create_workoutIcu 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.

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

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 mutation profile (readOnlyHint=false, destructiveHint=false, non-idempotent), so the bar is lower. The description adds meaningful context beyond that: the created object is reusable and lives in a library/plan rather than the calendar, which is a behavioral fact the schema cannot express. No permission, rate-limit, or failure-mode detail, keeping it below a 5.

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

Conciseness5/5

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

Opens with the single most important disambiguator (library, not calendar), then a compact routing paragraph. No filler sentences, no restatement of the name or title.

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 mutation tool, the description covers placement semantics, sibling routing, and preconditions (folder must exist, obtained via icu_get_workout_library, which the schema names). An output schema exists, so return values need no explanation.

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 description text contains no parameter-level guidance beyond the folder/plan distinction already implied by folder_id. With the schema (including the very detailed 'description' syntax block) doing the work, 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 (Save) plus resource (one reusable workout) and its destination scope (library folder or training plan), then explicitly excludes the calendar. That negative scoping distinguishes it from icu_create_event, which the description names directly.

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 when-to-use-this routing for five siblings: icu_create_event for scheduling, icu_bulk_create_workouts for two or more, icu_update_workout for edits, icu_create_workout_folder for new containers, icu_apply_training_plan for calendar placement. Each alternative is paired with the condition that selects it.

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

icu_create_workout_folderIcu 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.

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

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=false, destructiveHint=false, idempotentHint=false and openWorldHint=true, so the mutation/idempotency profile is carried structurally. The description adds genuinely non-schema context: the output id is meant to be reused as folder_id, and the created object is not a calendar entity. It stops short of noting side effects such as duplicate names or athlete scoping consequences for coaches.

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, the object distinction is front-loaded, and the second sentence carries the actionable chaining information. No filler or restatement of the tool name.

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, and the description still flags the one thing an agent must do with the result (reuse the id as folder_id). Combined with full parameter documentation and annotations, nothing needed 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 description coverage is 100% and folder_type already spells out FOLDER vs PLAN in detail, including the icu_apply_training_plan link. The description repeats the folder/plan distinction in passing but adds no syntax or defaulting detail beyond the schema, 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 ('Create a new LIBRARY folder or training PLAN to hold workouts') and explicitly excludes a plausible misread with '— not a calendar item', which separates it from icu_create_event. An agent can distinguish it from icu_create_workout and icu_create_event 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?

Names the exact downstream consumers ('Pass the returned id as folder_id to icu_create_workout or icu_bulk_create_workouts') and the browse alternative ('use icu_get_workout_library'). This covers both when to use it and what to use instead for the adjacent read case.

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

icu_delete_activity_messageIcu Delete Activity MessageA
DestructiveIdempotent

DELETE one of your own notes from an activity.

Use when the user wants a note removed: "delete my comment on that run", "remove the note I left yesterday". Only the author's own notes can be deleted. Intervals.icu keeps a "(deleted)" placeholder in the thread. Returns the deleted text so it can be re-posted with icu_add_activity_message if needed (the original timestamp is lost).

NameRequiredDescriptionDefault
message_idYesID of the note to delete (from icu_get_activity_messages)
activity_idYesThe Intervals.icu activity ID

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true and idempotentHint=true, but the description adds genuinely non-obvious behavior: a '(deleted)' placeholder persists in the thread, the deleted text is returned for possible re-posting, and the original timestamp is unrecoverable. That post-delete state and data-loss caveat are exactly what an agent needs before committing a destructive call.

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 action is front-loaded in the first sentence, followed by when-to-use, the author constraint, the side effect, and the return value. Each sentence carries distinct information with no repetition of annotations or 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?

For a destructive two-parameter tool with an output schema, the description covers selection, precondition, side effect and the recoverability caveat. The output schema relieves it of describing return formatting, and it still explains the meaningful part of the return (text for re-posting, lost timestamp).

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 already states that message_id comes from icu_get_activity_messages and that activity_id is the Intervals.icu activity ID. The description adds only the author-ownership constraint, so the schema is doing the heavy lifting and 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?

Specific verb-plus-resource: deletes one of the user's own notes from an activity. It is immediately distinguishable from the sibling triad icu_get_activity_messages, icu_add_activity_message and icu_update_activity_message because the description names the delete action and its author-only scope.

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 concrete user-intent triggers ('delete my comment on that run', 'remove the note I left yesterday') and a hard precondition (only the author's own notes). It does not explicitly say when to prefer icu_update_activity_message instead of deleting, so it stops short of full alternative routing.

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

icu_delete_eventIcu 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.

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

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already flag destructive/idempotent, but the description adds substantial context beyond them: the safe-mode gate, that past events are silently skipped rather than errored, the shape of the response envelope, and the env var needed to override. That is exactly the behavioral detail an agent needs before committing an irreversible action.

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 destructive warning and the ONE-scope constraint are front-loaded in the first sentence, and the safe-mode caveat follows immediately. Every sentence carries actionable information, with no padding.

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 two-parameter destructive mutation with full schema coverage and an output schema, the description covers the reset risk, the default mode, refusal behavior, and the response envelope. There is nothing an agent needs before calling it that 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 event_id and athlete_id are already documented in the schema. The description mentions deletion by ID but adds no extra semantics about athlete_id scoping or formatting, 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?

The description opens with a precise verb and resource ('Permanently delete ONE calendar event by ID') and capitalizes ONE, which implicitly contrasts with the sibling icu_bulk_delete_events. The agent can tell exactly what is affected and how much.

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 clear operational context: safe mode is the default, past events are refused, and a hint points to INTERVALS_ICU_DELETE_MODE=full. What it lacks is an explicit pointer to the bulk alternative (icu_bulk_delete_events) or preconditions for the athlete_id override, so a 4 rather than 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_gearIcu Delete GearA
DestructiveIdempotent

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

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

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is known. The description adds genuinely new context beyond that: deletion is permanent, it cascades to maintenance reminders, and lingering activities are unaffected -- exactly the side-effect detail an agent needs before a destructive call.

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, front-loaded sentences with zero filler: permanence and cascade come first, the non-effect on activities second. Every clause 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?

An output schema exists, so return values need not be described, and the cascade/permanence behavior is covered. Only minor gaps remain, such as whether deletion requires confirmation or whether athlete_id must match the gear owner.

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 in structured fields and the baseline is 3. The description adds no extra meaning about gear_id or the athlete_id coach-scoping parameter.

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

Purpose4/5

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

The description names a specific verb and resource ('Permanently delete a gear item') and clarifies scope via the cascade note about maintenance reminders. It is distinguishable from siblings like icu_delete_event or icu_delete_workout by the resource noun, though it never explicitly contrasts with them.

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

Usage Guidelines3/5

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

Usage is implied by the destructive wording, and the note that activities survive removal helps an agent judge consequences. However, there is no explicit when-to-use vs alternative (e.g., icu_update_gear for retiring gear) nor preconditions such as confirmation or coach scope.

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

icu_delete_workoutIcu 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.

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

Output 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 destructiveHint=true and readOnlyHint=false, but the description adds important behavioral context: the deletion is permanent, cannot be undone, and affects only the library workout rather than linked calendar events. It does not discuss permissions or rate limits, but the core destructive behavior is well explained.

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 short, front-loaded with the destructive library scope, and has no wasted text. The distinction from calendar events and the confirmation guidance each earn their 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 destructive mutation with full annotations, complete schema coverage, and an output schema, the description covers the essential context: scope, irreversibility, sibling alternative, and user confirmation. 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%, and both parameters are documented in the schema. The description reinforces that only one workout is deleted, but it does not add parameter-specific meaning 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?

The description states a specific verb and resource: permanently delete one workout from the library. It also explicitly distinguishes this from deleting calendar events with icu_delete_event, so an agent can separate it from the many sibling deletion and workout 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?

It gives clear usage context: use this for library workouts, use icu_delete_event for calendar events, and confirm with the user before calling if unsure. The alternative and the condition selecting it are named directly.

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

icu_delete_workout_folderIcu Delete Workout FolderA
DestructiveIdempotent

Permanently delete ONE library folder or training plan AND every workout in it.

Destructive — cannot be undone. Calendar events already applied from a plan stay on the calendar (delete those with icu_delete_event); to remove a single library workout use icu_delete_workout. In safe delete mode (default), a folder that still holds workouts is refused and reported in the skipped envelope. Confirm with the user before calling if unsure.

NameRequiredDescriptionDefault
folder_idYesLibrary folder or plan ID to delete (from icu_get_workout_library)
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare destructive=true, but the description adds context annotations cannot carry: irreversibility, that applied calendar events survive the delete, and that `safe` mode (the default) refuses non-empty folders and reports them in the `skipped` envelope. That is real behavioral disclosure, not restatement, and it does not conflict with the idempotent/openWorld hints.

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-loaded with the verb and cascade scope, then consequences, then sibling routing, then the safe-mode caveat. Every sentence changes agent behavior; nothing is boilerplate or repeated from 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?

An output schema exists so return values need no explanation, yet the description still flags the `skipped` envelope an agent must inspect to interpret a partial refusal. For a destructive cascade delete with only two parameters, nothing needed 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.

Parameters3/5

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

Schema coverage is 100% and both parameters are documented in-schema (folder_id sourced from icu_get_workout_library, athlete_id for coach multi-athlete use). The description reinforces the singular 'ONE' constraint on folder_id but adds no new format, range, or lookup semantics beyond the schema, so 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 ('permanently delete'), the exact resource ('ONE library folder or training plan'), and the cascade scope ('AND every workout in it'). It also names the two sibling operations that handle the narrower cases (icu_delete_workout, icu_delete_event), so an agent can distinguish it from nearby tools 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?

Explicitly routes alternatives: single library workout -> icu_delete_workout, lingering calendar events -> icu_delete_event. It also states a precondition ('Confirm with the user before calling if unsure') and the default-mode behavior that selects a different outcome, which is exactly the when/when-not guidance the dimension asks for.

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

icu_download_activity_fileIcu 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.

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

Output 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 cover read-only, idempotent, non-destructive and open-world, so the safety profile is known. The description adds real behavioral detail beyond that: the file is the unmodified upload in whatever format the device produced, and the response shape changes depending on output_path (saved to disk vs base64 embedded). It could still say more about size/streaming limits, but the output schema carries return structure.

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-loaded with purpose, then differentiation, then the output_path behavior — an efficient order. There is mild repetition between the opening line and 'Downloads the ORIGINAL uploaded file', but nothing that obscures the decision.

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?

Two parameters with full schema coverage, plus an output schema, so the description needs only to cover intent, sibling differentiation and the output_path branch — all of which it does. Nothing an agent needs to invoke it correctly appears to be 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 the baseline is 3, but the description goes beyond the schema by explaining the consequence of output_path: if set, the file is written there; if not, base64 content is embedded in the response. That is meaningful semantics the schema's one-line description does not convey.

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 (download) and resource (the original activity file) and immediately clarifies that the original device-produced format is returned. It explicitly distinguishes itself from download_fit_file and download_gpx_file, so an agent can select between the three without reading schemas.

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?

Names two concrete alternatives and the exact condition that separates them: this tool gives the ORIGINAL file, while the siblings force FIT or GPX conversion. The when-to-use rule is unambiguous.

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

icu_download_fit_fileIcu 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).

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

Output 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 readOnly, idempotent, openWorld and non-destructive behavior, so the safety profile is covered. The description adds that the output is a converted FIT representation rather than the original upload, which is useful context, but says nothing about writing to output_path, overwriting an existing file, or failure modes. With annotations carrying the main burden, a 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?

Two compact sentences with zero filler; the purpose comes first and the sibling differentiation follows immediately. Every clause 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, return-value explanation is not required, and the description covers purpose and sibling selection adequately for a simple two-parameter download tool. It is slightly incomplete in not mentioning that the file can be saved to disk via output_path, which is the only remaining ambiguity.

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 activity_id and output_path are fully documented in the schema including the optional/null default. The description adds no syntax, format, or path-behavior detail for either parameter, 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 (download/convert) and resource (activity) plus the output format (FIT), and explicitly names the two sibling tools it differs from with their formats. An agent can pick this over icu_download_activity_file and icu_download_gpx_file 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?

It gives clear selection context by contrasting the three download variants and noting FIT targets Garmin/most training platforms, which implicitly tells the agent when to pick this one. No explicit 'when not to use' or prerequisite (e.g. activity must exist) is stated, 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_download_gpx_fileIcu 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).

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

Output 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 high behavioral context (readOnly, idempotent, etc.). The description adds valuable domain-specific context by defining the intended use case (GPS devices, mapping software) and the output format itself, enhancing the agent's understanding without duplicating 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?

The description is perfectly concise, using two sentences to deliver maximum value. The primary differentiator is stated in the first sentence, making the information highly accessible to the agent.

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 definition is entirely complete for its role. Given the rich annotations and schema, the description successfully provides the necessary context (format, use case, and sibling differences) required 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?

With 100% schema coverage, the schema already details the parameters (`activity_id` and `output_path`). The description focuses entirely on the file format and its intended use, providing no necessary semantic information about the parameters beyond what is in the schema, thus achieving baseline adequacy.

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: downloading an activity converted to GPX format. It distinguishes this tool by naming its siblings and the specific format of the output, leaving no doubt about its purpose.

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

Usage Guidelines5/5

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

It provides perfect usage guidelines by explicitly contrasting the GPX format with other common formats (upload original, FIT format). This immediately tells the agent when to select this tool versus the `download_activity_file` or `download_fit_file` siblings.

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

icu_duplicate_eventsIcu 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.

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

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=false, idempotentHint=false, and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful context beyond that: copies reuse the source payloads rather than constructing new ones. It stops short of saying what happens if an event already exists on a target date, or how partial failures across a multi-ID input are handled.

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, all front-loaded: the operation first, then when to use it, then the disambiguation. No filler and nothing that repeats structured fields verbatim.

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, return values need no explanation, and the mutation semantics are covered by annotations plus the payload-reuse note. The one residual gap is collision/overwrite behavior when a copy lands on a date that already has an event, which matters for a non-idempotent write 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?

Schema description coverage is 100%, so event_ids, athlete_id, num_copies, and weeks_between are already documented. The "N weeks" and "next 4 weeks / next 3 Mondays" examples loosely illustrate weeks_between and num_copies, but they do not add precision beyond the schema defaults.

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?

"COPY existing events forward in time by N weeks" gives a specific verb (copy/duplicate), the resource (existing events), and the transformation (shift forward by weeks). It explicitly distinguishes itself from icu_create_event and icu_bulk_create_events, both of which appear in the sibling list.

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

Usage Guidelines5/5

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

Provides two concrete user phrasings that should trigger the tool ("repeat this workout for the next 4 weeks", "duplicate Monday's run on the next 3 Mondays") and names the alternative tools with the condition that separates them (reuse existing payloads vs build new events).

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

icu_get_activities_aroundIcu 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.

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

Output 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 readOnly, idempotent, non-destructive, openWorld, so the safety profile is fully covered. The description adds the useful ordering guarantee ('chronologically before and after') and the symmetric N-per-side window, but says nothing about edge behavior when fewer neighbors exist or how missing/boundary activities are handled.

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 blocks: the core behavior first, then usage triggers. Zero filler and nothing the agent must read past to get the essential semantics.

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, rich annotations, and fully documented parameters, the definition covers what an agent needs to select and call it. Only boundary/edge behavior near the start or end of activity history is left implicit.

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 each parameter (count, athlete_id, activity_id) is self-documented. The description's '(N each side)' reinforces that count is per-direction rather than a total, which is a small but genuine clarification beyond the schema's 'Number of activities before and after'.

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 ('Fetch') and a precisely scoped resource: activities chronologically adjacent to a reference activity, N per side. That scope is unmistakably different from icu_get_recent_activities or icu_get_activities_by_date, though no sibling is named explicitly.

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 supplies concrete trigger scenarios ('what did I do around this race?', training-context queries, progression comparisons) that let an agent pattern-match a request to this tool. It stops short of stating when NOT to use it or naming the alternative to pick instead (e.g., date-range or search 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_by_dateIcu 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.

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

NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so safety is covered. The description adds important behavioral context beyond annotations: results are newest-first, a window exceeding limit drops the oldest first, and widening limit or narrowing the window is required to reach the very oldest records.

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 definition is front-loaded with the core purpose and immediately follows with the sibling distinction and truncation caveat. Every sentence contributes operationally useful information; there is no 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?

Given that annotations cover safety and an output schema exists, the description provides the remaining selection-critical context: date-window semantics, ordering, limit behavior, truncation direction, and the alternative tool. Nothing needed 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.

Parameters4/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 are already documented structurally. The description still adds meaningful semantics beyond the schema for the key parameters: the window is oldest..newest, dates are YYYY-MM-DD, limit governs truncation, and truncation drops oldest records first.

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 ("List activities") together with the exact scope ("EXPLICIT date window") and output shape ("LIGHT summary per item"). It explicitly distinguishes itself from the sibling icu_get_recent_activities by contrast in anchoring and cap behavior, so an agent can select it 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?

It names the alternative tool and the condition that selects it: icu_get_recent_activities is for today-anchored recent history capped at 100, while this tool is for arbitrary historical windows. It also gives concrete use cases such as reconstructing training history and finding the oldest activity in a period.

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

icu_get_activity_detailsIcu 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.

NameRequiredDescriptionDefault
activity_idYesActivity ID to fetch

Output 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 readOnly/idempotent/non-destructive, so safety needs no restating. The description adds real behavioral context beyond them: the result is a single JSON blob of top-level metrics rather than granular data, which tells the agent about payload shape and depth. No gaps that matter for a read tool of this kind.

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 verb and the emphasized scope word SUMMARY, then use cases, then disambiguation. Nothing is redundant with the annotations or 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?

An output schema exists, so return-value documentation is not the description's burden. Between the payload summary, the use cases, and the explicit sibling routing, an agent has everything needed to select and call this 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% for the single required activity_id, so the schema already carries parameter meaning. The description adds no format, source, or validation 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 ("Fetch the headline SUMMARY of one activity") and enumerates the payload contents. It explicitly contrasts itself with the intervals and streams tools, so an agent can distinguish it from 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 concrete example utterances ("how was my ride?", "tell me about activity X") and names both alternatives with the exact condition that selects them (lap-by-lap → icu_get_activity_intervals; second-by-second → icu_get_activity_streams). Routing is fully determined.

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

icu_get_activity_intervalsIcu 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.

NameRequiredDescriptionDefault
activity_idYesActivity ID to fetch intervals for

Output 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), so the lower bar applies. The description adds useful behavioral context about the returned structure: per-lap segments with targets, actual values, and interval types. It does not mention authentication or rate limits, but those are less central here.

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 front-loaded and compact. The first sentence states the main operation and return shape; the second gives usage cases; the third routes to alternatives. 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 simple one-parameter schema, existing output schema, and clear annotations, the description is complete enough for an agent to select and call the tool correctly. It explains the tool's distinct role relative to nearby activity-data tools.

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?

There is one required parameter and schema description coverage is 100%, so the schema already explains activity_id. The description reinforces that the tool operates on one activity, but it does not add format, validation, or lookup guidance beyond the schema.

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

Purpose5/5

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

The description uses a specific verb and resource: fetch the per-lap/per-interval breakdown of one activity. It clearly states what each segment contains (target, actual power/HR/pace, segment type) and distinguishes this from summary metrics and raw 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?

It gives explicit use cases such as workout-compliance analysis, lap-by-lap review, and checking whether intervals were hit. It also names alternatives directly: get_activity_details for headline summary metrics and get_activity_streams for raw second-by-second data.

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

icu_get_activity_messagesIcu 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. Deleted notes stay in the thread as a "(deleted)" placeholder with a deleted timestamp. To POST a new message use icu_add_activity_message (singular = WRITE).

NameRequiredDescriptionDefault
activity_idYesThe Intervals.icu activity ID

Output 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, destructiveHint=false, so the safety profile is covered by structured data. The description goes meaningfully beyond that by disclosing return ordering (chronological), message fields (author, content, timestamp, seen-flag), and the non-obvious tombstone behavior where deleted notes persist as "(deleted)" placeholders with a deleted timestamp — that last detail is real behavioral value an agent could not infer.

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-loaded with the core purpose, then the READ/WRITE disambiguation mnemonic, then trigger phrases, then return shape. Every sentence earns its place; the parenthetical mnemonics are compact disambiguators rather than 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 the description doesn't need to detail return values — yet it still summarizes ordering and the deleted-placeholder quirk, which is exactly the edge case that would otherwise surprise an agent. For a one-parameter read tool with full annotation coverage, nothing needed 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?

Single parameter with 100% schema description coverage ("The Intervals.icu activity ID"), so the schema carries the semantics. The description's phrase "a specific activity" reinforces but adds no format, ID-source, or validation 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 and resource ("Read the notes and comments attached to a specific activity") and explicitly contrasts with the write sibling via the "plural = READ" / "singular = WRITE" mnemonic. An agent can distinguish this from icu_add_activity_message, icu_update_activity_message, and the activity-detail 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 three concrete user-phrasing triggers ("what did my coach say about that ride?", "show me the comments on yesterday's run", "any feedback on this workout?") and names the correct alternative tool for the write case. When-to-use and when-not-to-use are both explicit.

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

icu_get_activity_streamsIcu 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.

latlng comes back as [lat, lng] pairs (null where the sample has no GPS fix).

left_right_balance (dual-sided power meters) is the RIGHT pedal's share of power in percent (FIT convention), not the left's: a stream averaging 48 means L 52% / R 48%. The response adds a stream_notes entry saying so whenever the stream is returned.

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.

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.
max_pointsNoThin every returned stream to at most this many samples by keeping every Nth one (the same N for all streams, so indices stay aligned). Omit for full resolution. ~500 is plenty to trace a route or see the shape of a ride. Samples are not always 1 s apart, so include 'time' to know when each kept sample was recorded.
activity_idYesActivity ID to fetch streams for

Output Schema

NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

Beyond the read-only annotations, the description discloses important behavior: heavy payload size, raw versus corrected heart-rate data, latlng null handling, left/right balance FIT convention, and a stream_notes caveat returned with the response. These details materially affect how an agent should interpret and request the 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?

The description is long but appropriately so for a complex raw-data tool. It is front-loaded with the core purpose, then follows with usage guidance, the accepted stream list, and targeted caveats; every paragraph adds actionable 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?

Given the output schema and annotations, the description supplies everything an agent needs to decide whether to call the tool, choose streams, and interpret special cases. The main behavioral risks around payload size, default streams, and corrected heartrate are all covered.

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

Parameters5/5

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

Although schema coverage is already 100%, the description adds substantial semantic value: it lists accepted stream types, explains that default streams exclude raw_heartrate and fixed_heartrate, documents latlng as [lat, lng] pairs with nulls, and clarifies the right-pedal convention for left_right_balance. It also warns about corrected heartrate versus raw_heartrate, which is essential for correct parameter selection.

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 uses a specific verb and resource: fetch raw per-sample time-series for one activity, with second-by-second arrays for power, HR, cadence, and related signals. It explicitly distinguishes this from sibling tools by naming get_activity_details for summary metrics and get_activity_intervals for per-lap breakdown.

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 states when to use the tool (visualization or custom analysis of the underlying signal) and when not to use it (most ride-summary questions should use get_activity_details or get_activity_intervals). It also warns that the payload is heavy and gives practical guidance about default versus explicitly requested streams.

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_planIcu 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).

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

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare this as a safe, read-only, idempotent operation. The description adds the default window behavior ('365-day forward window so the full ATP is returned') and how to narrow it, which is useful but only marginally beyond what the schema's default and description already convey. No additional behavioral details (e.g., what happens when no ATP exists) are provided, but with strong annotation coverage 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?

The description is front-loaded with purpose, then use cases, then default behavior, then exclusions. Every sentence earns its place: the example queries, the window guidance, and the sibling exclusions all directly help an agent decide when to call this tool. 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?

Given the tool has an output schema and full annotation coverage, the description needn't explain return formats or safety. It covers purpose, when to use, when not to use, and default window behavior—everything an agent needs to call it correctly. Athlete_id for coaches is covered in schema, so no gap.

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 schema already documents all three parameters. The description repeats the default window and narrowing advice, which is already in the days_ahead schema description. It adds no new meaning for days_back or athlete_id beyond what the schema provides, 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?

States a specific verb ('Read') and resource ('Annual Training Plan (ATP)'), plus the exact data it returns: weekly TSS targets, Base/Build/Peak phases, and week notes. It explicitly names sibling tools it is NOT, making it unmistakable which tool to select.

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 concrete example user questions that map directly to this tool, specifies the default 365-day window and when to narrow it, and explicitly lists alternatives (icu_get_upcoming_workouts, icu_get_calendar_events, etc.) with their distinct scopes. This is textbook when-to-use / 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_get_athlete_profileIcu Get Athlete ProfileA
Read-onlyIdempotent

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

Also returns the free-text athlete notes (Markdown) when set; change them with icu_update_athlete_notes. Defaults to the authenticated athlete; coaches can pass athlete_id to read one of their managed athletes instead.

NameRequiredDescriptionDefault
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

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

While the annotations handle safety, the description adds valuable context regarding the content returned (notes vs. metrics) and the functional behavior of the default athlete selection.

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 definition is highly concise, front-loading the main purpose and organizing secondary information (like alternatives and default behaviors) efficiently.

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 breadth of data returned, the description is complete, covering what is retrieved, how options are used, and pointing to the correct sibling tools for modification.

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

Parameters5/5

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

Although the schema covers the technical aspect, the description provides the crucial operational semantics of the `athlete_id`: defaulting to the authenticated user while allowing coaches to specify a managed athlete 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 clearly states the tool's primary function is to retrieve an athlete's profile and lists the specific types of data included, such as sport settings and CTL/ATL/TSB.

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 excellent guidance by suggesting an alternative tool (`icu_update_athlete_notes`) for related tasks and explains the conditional use of the `athlete_id` parameter for coaches.

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

icu_get_best_effortsIcu 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.

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

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 read-only, idempotent, non-destructive profile, so the remaining burden is low. The description adds genuine behavioral context the annotations don't: the analysis is confined to one activity and at least one of duration/distance must be supplied. It stops short of describing result ordering/format, but the output schema covers return values.

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 tight sentences: the core operation and constraint come first, the sibling disambiguation second, and usage examples third. No filler, no repetition of schema content.

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 covering safety, an output schema covering return values, and a fully documented 5-parameter schema, the description supplies exactly the missing piece: single-activity scoping and the duration/distance requirement. Nothing an agent needs to call this correctly is absent.

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 five parameters are already documented with defaults and examples. The description's examples ('20-min power', '5k splits') reinforce duration/distance semantics but add no syntax or interaction detail beyond 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?

Uses a specific verb ('Find the top-N peak efforts') bounded by an explicit scope ('WITHIN a single activity') and a parameterized resource ('stream + target duration or distance'). It also names the class of siblings it differs from ('get_*_curves'), so an agent can distinguish it without opening schemas.

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

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 versus the curve tools ('which span many activities') and supplies two concrete use cases ('best 20-min power on this ride', 'top 5k splits in this run'). It also states a hard precondition: at least one of duration or distance is required.

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

icu_get_calendar_eventsIcu 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.

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

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, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds value beyond that by disclosing that results are unfiltered and enumerating the entry types returned, which tells the agent what to expect in the payload. It stops short of noting size/pagination behavior for wide date windows.

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 lines: scope statement first, use cases second, sibling routing last. Every sentence carries information an agent needs; there is no repetition of the title or schema.

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?

Output schema exists so return values needn't be explained, annotations cover safety, and the schema covers all three parameters. The only residual gap is a trivial one: the sibling is referenced as "get_event" rather than its full name icu_get_event, which could momentarily confuse routing.

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 days_back, days_ahead and athlete_id are fully documented in structured form and the baseline applies. The description alludes to a "date window" but adds no syntax, defaults or edge-case guidance 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 (calendar entries) plus the scope (a date window, ALL entry types enumerated: workouts, notes, races, goals, life-event blocks). It explicitly marks itself as the unfiltered/broad variant, which separates it from icu_get_upcoming_workouts and icu_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?

Gives concrete trigger queries ("what's on my calendar?", "show this week", broad calendar queries) and names both alternatives with the condition that selects each — filtered workout-only lookups go to icu_get_upcoming_workouts, single-event lookups go to get_event. 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_custom_itemIcu 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.

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

Output 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, so safety is covered; the description adds real context by noting that `content` here is the same structure as in the list result, which tells the agent what to expect from the focused fetch. It does not cover what happens for an unknown or out-of-scope item_id, and does not mention the athlete_id scoping for coaches, leaving a small gap.

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

Conciseness5/5

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

Two short sentences, front-loaded with the operation and followed by the sequencing constraint, with zero filler. Every clause 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?

An output schema exists, so return-value detail is not needed, and the sequencing plus the content-field equivalence give the agent enough to call it correctly. Only the edge behavior (missing ID, athlete scoping) is unaddressed, which is minor for a read-only lookup.

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% with only two simple parameters, so the schema already carries the parameter meaning; the description adds nothing about item_id format or the athlete_id coach-scoping parameter. 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 ('Fetch the full configuration of ONE custom addition by ID') and the emphasis on 'ONE' plus 'by ID' distinguishes it cleanly from the sibling icu_get_custom_items list tool. An agent can pick between 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?

'Use AFTER icu_get_custom_items has returned an ID' names the sibling and the exact precondition, and adds the user intent ('wants to inspect a specific chart/field/zone/panel') that selects this tool over the list. This mirrors the strongest calibration example for routing guidance.

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

icu_get_custom_itemsIcu 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.).

NameRequiredDescriptionDefault
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output 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, so the description focuses on behavior: one call returns every custom item across all types, with an enumerated list of the type categories and the note that each item carries a `type` field so filtering is client-side. That is real behavioral context (no server-side type filter). It stops short of saying anything about result volume or pagination for large accounts, which is the main remaining unknown.

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-loaded with the purpose, then usage triggers, then the return inventory, then exclusions — a clean information hierarchy. The long parenthetical enumeration of chart/field/stream/zone types is dense, but it earns its space by telling the agent exactly what comes back; the example utterances could be trimmed slightly without loss.

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, yet the description still summarizes the aggregate return shape and the per-item `type` discriminator, which is exactly the context an agent needs to decide between one broad call and a targeted one. Combined with the explicit exclusion routing, nothing needed to invoke it correctly is missing.

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

Parameters3/5

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

There is only one optional parameter and the schema already documents it at 100% coverage ('Athlete ID (for coaches managing multiple athletes)'). The description adds nothing about athlete_id — no default-athlete behavior, no coach-context guidance — so this sits at the baseline for a fully described single parameter.

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 ('List the user's custom additions to their Intervals.icu account') and immediately scopes it as read-only inventory of the user's own customizations. It distinguishes itself from siblings by naming the built-in equivalents (sport settings, profile data) that live in other tools, so an agent can route 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 trigger phrasings ('show my custom charts', 'what custom zones do I have') and an explicit exclusion clause: do NOT use for built-in zones, built-in fields, or athlete profile data, with icu_get_sport_settings named as the alternative. Both the when and the when-not are stated outright.

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

icu_get_eventIcu Get EventA
Read-onlyIdempotent

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

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

Output 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 readOnly, idempotent, openWorld, and non-destructive behavior. The description adds useful context about the returned details (description, workout structure, metrics), but does not disclose anything about errors, permissions, or pagination.

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 no wasted words. The key constraint, fetching exactly one event by ID, is stated first.

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, full parameter descriptions, and annotations covering safety, the description is nearly complete for this simple read tool. It could add a note about using athlete_id for coach access, but that is already in the schema.

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 event_id and athlete_id are already documented in the schema. The description only restates that retrieval is by ID and adds no extra parameter semantics, which is the expected baseline.

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: fetch one calendar event by ID. The emphasis on 'ONE specific' implicitly contrasts with list-oriented siblings like icu_get_calendar_events, but no sibling is named explicitly.

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

Usage Guidelines3/5

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

Usage is implied by 'by ID': call this when you already have an event ID and need that single event. It does not explicitly say when not to use it or name the list tool as the way to discover IDs.

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

icu_get_fitness_chartIcu 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).

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

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 meaningful behavioral context beyond annotations by explaining that the series includes past history plus future projections from planned calendar workouts, which clarifies the data source and scope. It does not cover pagination or auth requirements, but those are minor given the rich annotations and 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?

The description is front-loaded with the core purpose and return values, followed by compact 'Use for' and 'NOT for' routing lines. Every sentence earns its place: there is no filler, and the exclusions are directly tied to sibling alternatives.

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 need not explain return values, and the annotations cover safety and idempotency. The description is complete for this tool: it explains purpose, data source, when to use it, and when to use a sibling instead. Nothing an agent needs in order 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.

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 (days_back, days_ahead, athlete_id) are already fully documented in the schema. The description implies that days_back covers past history and days_ahead covers projections, but it does not add syntax, units, or format details beyond what the schema provides. 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 (Fetch), resource (Performance Management Chart time-series), and the exact metrics returned (daily CTL, ATL, TSB). It explicitly distinguishes itself from sibling tools like icu_get_fitness_summary and icu_get_wellness_data, so an agent can select it without opening the schema.

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

Usage Guidelines5/5

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

Provides explicit positive use cases ('show my fitness chart', 'CTL trend last 90 days', projected TSB) and explicit negative cases with named alternatives for training recommendations, HRV/sleep trends, and single-day wellness records. This is exactly the when/when-not/alternatives guidance that enables correct tool routing.

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

icu_get_fitness_summaryIcu 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.

NameRequiredDescriptionDefault
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare this a safe, idempotent, open-world read, so the description focuses on what the read returns (interpretation and recommendations, not just raw numbers) and on the identity default. That default-to-authenticated-athlete behavior is real context absent from 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 metric list and the core purpose are front-loaded, followed by usage examples and the one parameter caveat. Every sentence carries information and there is no filler or repetition.

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, return structure need not be explained, and the one optional parameter is fully covered. For the intended training-status use case nothing essential is missing; only a contrast with the sibling fitness-chart tool would make it airtight.

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 still adds the key semantic that omitting athlete_id reads the authenticated athlete and that coaches supply the id to read a managed athlete. This goes slightly beyond the schema's 'for coaches managing multiple athletes' note.

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+resource ('Get an athlete's current fitness / fatigue / form snapshot') and enumerates the exact metrics (CTL, ATL, TSB, ramp rate). It does not explicitly distinguish itself from the nearby icu_get_fitness_chart tool, so the agent must infer snapshot-vs-chart.

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 concrete trigger phrases ('how's my form?', 'am I overtrained?', training-status checks) that map user intent to the tool. It also clarifies the coach vs. self-read case, but never states when to prefer a different tool such as the fitness chart.

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

icu_get_gap_histogramIcu 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.

NameRequiredDescriptionDefault
activity_idYesActivity ID to analyze

Output 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 establish this as a read-only, idempotent, non-destructive open-world query, so the safety profile is covered. The description adds real semantic context beyond that: it explains that the output is a time-in-zone distribution and that values are elevation-normalized. It does not discuss cost, pagination, or data availability for activities without elevation data, which keeps it out of the top band.

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, with the core definition and the elevation-normalization qualifier front-loaded before the sibling redirect. Every clause carries information; nothing is padding.

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 annotations cover the safety profile. With a single fully documented parameter and a clear statement of what the histogram represents, nothing an agent needs to call this correctly is missing.

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

Parameters3/5

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

There is only one parameter (activity_id) and schema description coverage is 100%, so the schema fully carries the load. The phrase 'within a single activity' reinforces the scoping but adds no syntax or constraint detail beyond the schema, which matches the baseline for fully documented 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 operation (time-in-zone distribution of grade-adjusted pace), a specific scope (a single activity), and the key qualifier (elevation-normalized). It also names the sibling it is not, so an agent can distinguish it from icu_get_pace_histogram 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 an explicit use case (trail running where raw pace is misleading) and an explicit routing rule to the alternative (raw pace -> icu_get_pace_histogram). Both when-to-use and when-to-use-something-else are stated outright.

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

icu_get_gear_listIcu Get Gear ListA
Read-onlyIdempotent

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

NameRequiredDescriptionDefault
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output 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 readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered without the description. The description adds the useful scope word 'all' and names the stat categories returned, but says nothing about pagination, whether archived/retired gear is included, or how reminders are surfaced — and the output schema already documents return shape.

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 well-formed sentence with the resource first and the returned data enumerated parenthetically. No filler, 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?

For a one-optional-parameter read-only list tool with annotations and an output schema, the description is nearly sufficient — return content is sketched and scope is stated. The remaining gap is the default behavior when athlete_id is null, which is the only decision an agent actually has to make.

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?

Only one optional parameter (athlete_id) exists and schema description coverage is 100%, so the schema already explains the coach/multi-athlete scoping. The description adds no meaning beyond it — it does not say what happens when athlete_id is omitted, which is the one ambiguity the schema leaves open.

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?

Specific verb + resource ('List all gear items') plus an enumeration of the contents (distance, time, activity count, maintenance reminders). It is the only read/list gear tool among siblings dominated by create/update/delete gear operations, so the agent can identify it without ambiguity, though the description never explicitly contrasts itself with those mutators.

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

Usage Guidelines3/5

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

Usage is implied by the verb 'list all' — the agent can infer this is the retrieval endpoint for gear inventory. However there are no explicit when-to-use/when-not statements, no mention of prerequisites (e.g. authentication or athlete scoping), and no reference to the sibling gear-mutation tools.

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

icu_get_hr_curvesIcu 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.

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

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 readOnly/idempotent/non-destructive, so the safety profile is covered. The description still adds genuine value by disclosing that peak_hr_bpm is the curve's top and has been clipped to configured max HR at import, plus that zone bands are NOT returned. It stops short of describing pagination, aggregation mechanics across the window, or how multiple activities are combined.

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 what the tool returns, then intended use, then exclusions. Every clause carries information; the em-dash parenthetical defines the curve precisely rather than padding.

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 shape need not be described, and annotations cover safety. The description is complete regarding misuse risks (zones, max HR, histogram confusion). The remaining gap is the days_back vs time_period precedence, which neither description nor schema resolves.

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 all four parameters; baseline is 3. The description only alludes to 'the chosen window' without clarifying how days_back and time_period interact or which takes precedence — the one ambiguity in an otherwise well-covered 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 and resource — 'Fetch the HR-vs-duration curve — best (highest) sustained HR across durations from 5s up to 1h, aggregated over the chosen window' — with the aggregation scope spelled out. This cleanly separates it from icu_get_power_curves, icu_get_pace_curves and icu_get_hr_histogram 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 an explicit intended use ('Use for cardiovascular-fitness trends') and names two alternatives with their selecting conditions: icu_get_sport_settings for HR zones/max HR, and get_hr_histogram for time-in-zone distribution. 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_hr_histogramIcu 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.

NameRequiredDescriptionDefault
activity_idYesActivity ID to analyze

Output 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, idempotentHint, non-destructive and openWorld, so the safety profile is covered. The description adds a real behavioral distinction beyond that: results are scoped to one activity and expressed as bucket/time-per-bucket rather than cross-activity best efforts. No auth, rate-limit, or cost notes, which keeps it from a 5.

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

Conciseness5/5

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

Three short fragments, front-loaded with the core result shape, then the sibling contrast, then the use case. No repetition of the name and no wasted clauses.

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 explanation is correctly omitted; the description covers purpose, scope, and the main alternative. Only marginal omissions remain (e.g., what happens if the activity lacks HR data), which are low-risk for a read-only single-parameter 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?

Schema coverage is 100% and the single parameter is self-documented as 'Activity ID to analyze', so the description adds nothing about the parameter. Baseline 3 applies when the schema carries the full burden.

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 (time-in-zone distribution of heart rate) plus an explicit scope: a single activity, with histogram buckets and time per bucket. It also names the sibling it is not (icu_get_hr_curves, best efforts across many activities), so an agent can separate it from the multi-activity curve tools 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?

Gives concrete usage context ('cardiovascular load breakdown and HR-zone time-in-zone') and explicitly routes the multi-activity best-efforts case to icu_get_hr_curves. No explicit when-not conditions or mention of the pace/power histogram siblings, so it falls short of the top tier.

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

icu_get_pace_curvesIcu 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.

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

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 readOnly, idempotent and non-destructive, so the description is free to spend its words on substance: the duration range covered, the aggregation window, and that use_gap applies Grade-Adjusted Pace normalization for hills. It does not discuss athlete scoping or whether results are per-activity or cross-activity beyond 'aggregated over the chosen window'.

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 what the tool returns, then the use case, then the sibling redirect. No restatement of the name and 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?

An output schema exists so return values need not be described, and all five parameters are documented in the schema. The only gap is the absence of guidance on athlete_id scoping for coaches and on precedence between days_back and time_period, which matters for a windowed aggregation tool.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: it explains that use_gap normalizes for hills (the schema only names GAP) and that results are aggregated over the chosen window, which ties days_back and time_period together. It does not clarify how days_back and time_period interact when both are supplied.

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 pace-vs-duration curve') and immediately pins down the semantics: best sustained pace across 5s to 1h, aggregated over the chosen window. That is enough to separate it from icu_get_pace_histogram and other curve tools 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 a positive use case ('run/swim fitness trends and race-time predictions') and an explicit exclusion with the named alternative: use get_pace_histogram or get_gap_histogram for time-in-zone distribution within a single activity. Both when-to-use and when-not-to-use are present.

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

icu_get_pace_histogramIcu 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.

NameRequiredDescriptionDefault
activity_idYesActivity ID to analyze

Output 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 cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower; the description still adds scope detail not in annotations — analysis is confined to a single activity and returns bucketed time-in-zone rather than summary values. It does not say anything about bucket resolution, zone boundaries, or behavior for activities lacking pace data, so it falls short of a 5.

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

Conciseness5/5

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

Four short sentences, zero filler, with the core definition front-loaded and differentiation/routing trailing. Each sentence carries distinct information: what it is, how it differs, when to use it, and the GAP alternative.

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 covering the return format and annotations covering safety, the description supplies the remaining essentials: single-activity scope, distribution semantics, and sibling routing. Minor gaps remain around what happens when pace data is absent or how buckets are defined, but nothing critical to 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?

Only one parameter exists and schema coverage is 100%, so the schema already documents activity_id fully. The description reinforces scope ('within a single running activity') but adds no format, ID-source, or constraint details beyond that, so the 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+resource: 'Time-in-zone DISTRIBUTION of pace within a single running activity,' and clarifies the return shape (histogram buckets, time per bucket). It explicitly distinguishes itself from two siblings (icu_get_pace_curves, icu_get_gap_histogram), 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 an explicit when-to-use ('pace-distribution / consistency analysis'), names the scoping difference from icu_get_pace_curves (one activity vs many), and routes elevation-normalized use to icu_get_gap_histogram. Both alternatives and the condition selecting each are spelled out.

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

icu_get_power_curvesIcu Get Power CurvesA
Read-onlyIdempotent

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

Use for FTP estimation, peak-power tracking, durability, strengths/weaknesses across duration profiles. Includes fitted power models (CP, W', Pmax, FTP), the VO2max estimate and MAP when Intervals.icu provides them. Pick ONE window: days_back, time_period, start_date/end_date, season, or periods (to compare several, e.g. ['s0', 's1', 'all']). Default is the last 90 days. For time-in-zone distribution within a single activity, use icu_get_power_histogram instead.

NameRequiredDescriptionDefault
seasonNoSeason curve ID from icu_get_seasons: 's0' = current, 's1' = previous
periodsNoCompare up to 5 periods in one call; each is week/month/year/all, '<N>d', a season ID ('s1'), or 'YYYY-MM-DD..YYYY-MM-DD'. Returns one entry per period.
end_dateNoRange end (YYYY-MM-DD), inclusive
days_backNoNumber of days to analyze (optional)
athlete_idNoAthlete ID (for coaches managing multiple athletes)
full_curveNoAlso return all points the API returns (secs + watts), not just key durations
sport_typeNoSport type (e.g., Ride, Run, Swim, VirtualRide)Ride
start_dateNoRange start (YYYY-MM-DD); use with end_date (defaults to today)
time_periodNoTime period shorthand: 'week', 'month', 'year', 'all' (optional)

Output 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 cover safety (readOnly, idempotent, non-destructive), so the description's job is added context, which it delivers: the mutual-exclusivity rule for window parameters, the 90-day default, and the fact that fitted models (CP, W', Pmax, FTP), VO2max and MAP are included when available. It does not mention result size, rate limits, or what happens if multiple windows are supplied.

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-loaded with what the tool returns, then usage, then window selection, then the sibling exclusion — a sensible order with no filler. The middle sentences run a bit long, but every clause carries meaning.

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 spelled out, and the description still summarizes the payload shape (sustained watts/W/kg plus fitted models and VO2max/MAP). For a nine-parameter, all-optional read tool, nothing an agent needs in order 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%, so the baseline is 3; the description earns above that by explaining the either/or relationship among days_back, time_period, start_date/end_date, season and periods, and by showing a multi-period example (['s0', 's1', 'all']). It does not mention sport_type or full_curve, but those are well documented 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?

States a concrete verb and resource plus scope: 'power-vs-duration curve — best (highest) sustained watts and W/kg across durations from 5s up to 6h, aggregated over the chosen window.' It also distinguishes itself from the nearest lookalike by naming icu_get_power_histogram as the tool for in-activity distribution.

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 use cases (FTP estimation, peak-power tracking, durability, strengths/weaknesses) and an explicit exclusion routing to icu_get_power_histogram. It also states the selection rule among window parameters — 'Pick ONE window' — and that the default is the last 90 days.

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

icu_get_power_histogramIcu 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.

NameRequiredDescriptionDefault
activity_idYesActivity ID to analyze

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/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 genuinely non-obvious context: the result is a distribution of time across power buckets for exactly one activity, which tells the agent what the data represents and that it is scoped per-activity, not aggregate.

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-loaded with the core definition, then a contrast sentence, then example queries. Three short lines with little waste; the closing example phrasing is slightly redundant but earns its place as a routing cue.

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?

Output schema exists and the single parameter is fully documented, so the description needn't explain return values. What remains is the scoping and sibling distinction, both covered. A mention of bucket/zone configuration expectations would round it out, but nothing needed 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.

Parameters3/5

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

Only one parameter, and schema description coverage is 100% ('Activity ID to analyze'), so the schema carries the semantics. The description's 'within a single activity' mildly reinforces the scope 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.

Purpose5/5

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

States a specific verb/resource combination: time-in-zone distribution of power within a single activity, plus the output shape in parentheses (histogram buckets, time per bucket). It explicitly contrasts itself with icu_get_power_curves, so an agent can distinguish it from the most confusable sibling 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?

Names the alternative (icu_get_power_curves) and the condition that selects this tool: 'best efforts across many activities' vs single-activity distribution, reinforced by example phrasings ('how was my workout intensity distributed?'). It gives positive selection criteria but no explicit exclusions (e.g. what to use for non-power histograms, though hr/pace/gap siblings are obvious from names).

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

icu_get_recent_activitiesIcu 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.

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

Output 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, non-destructive and openWorld, so the safety profile is covered. The description adds value beyond that by disclosing the response shape is deliberately lightweight and enumerating the summary fields, which tells the agent this call is cheap and not a full-detail fetch. It does not mention pagination or rate limits, keeping it short of a 5.

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

Conciseness5/5

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

Two short sentences: the capability and its output shape come first, then the disambiguation. Every clause carries information, and the quoted user phrasings are compact and directly usable.

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, annotations cover the safety profile, and the schema fully documents all three optional parameters. The description fills the remaining gap that structured fields cannot express: what the summary contains and which sibling to pick instead.

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% with all three params documented, so the baseline is 3. The description only echoes the default window (last 30 days) that days_back already declares in the schema, adding no new meaning for limit or athlete_id, so no credit above 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?

States a specific verb and resource ('List the athlete's most recent activities') with explicit default scope (last 30 days) and a concrete characterization of the payload ('LIGHT summary per item' naming distance, duration, power, HR, training load). It also names the two sibling tools it is not, so the agent can distinguish 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 explicit trigger phrasing ('what have I done recently?', 'show last week's rides') and routes alternatives by condition: 'For one specific activity by ID use icu_get_activity_details; to search by name/tag use icu_search_activities.' Both the when-to-use and the when-to-use-something-else are present.

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

icu_get_seasonsIcu Get SeasonsA
Read-onlyIdempotent

List the athlete's training SEASONS defined in Intervals.icu (name, start, end, curve ID).

Use for "which seasons do I have?", or before comparing seasons: pass a season's curve_id ('s0' = current, 's1' = previous, ...) to icu_get_power_curves. A season runs until the day before the next one starts; the newest season is open-ended.

NameRequiredDescriptionDefault
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

While annotations cover safety, the description adds critical operational behavioral traits, specifically that 'A season runs until the day before the next one starts' and that 'the newest season is open-ended.' This is crucial business logic not in the schema.

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

Conciseness5/5

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

The description is highly efficient, front-loading the core purpose first, followed by usage context, and finally, specific technical constraints. Every sentence adds significant 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?

The combination of functional explanation, workflow integration with dependent tools, and defining season boundaries makes this definition exceptionally complete 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?

With 100% schema coverage, the description does not need to elaborate on the nature of the parameters. It provides context (for coaches managing multiple athletes) but does not add semantic meaning beyond the schema's definition. Baseline score 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 immediately and clearly states the function ('List the athlete's training SEASONS') and identifies the data returned (name, start, end, curve ID). It is highly distinct from sibling 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?

It provides clear usage scenarios ('which seasons do I have?') and explicitly defines the sequence of use, directing the agent to call `icu_get_power_curves` after retrieving the season's `curve_id`.

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

icu_get_sport_settingsIcu 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 (unless set explicitly) 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.

NameRequiredDescriptionDefault
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the read-only annotations, the description discloses important behavioral context: zones are derived from thresholds unless set explicitly, are stamped into activities at import, and drive time-in-zone, HRSS, and TSS calculations. This gives the agent crucial domain context for interpreting and trusting the returned zones.

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

Conciseness4/5

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

The description is front-loaded with purpose, then details outputs and behavioral significance. It is mostly efficient, though the repeated emphasis on 'real zones' and the final warning add slight verbosity for a simple getter.

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 read-only annotations, the description provides ample context: what is returned, why the zones matter, and how they relate to downstream metrics. An agent has enough information to call and interpret 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 schema has 100% description coverage and the single athlete_id parameter is already documented there, including its purpose for coaches. The description adds no additional parameter meaning, 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 opens with a specific verb and resource: get per-sport thresholds and configured power/HR/pace zones. It further specifies the included fields (FTP, FTHR, max HR, pace, swim threshold) and zone sets, making the tool's scope unambiguous against sibling tools.

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

Usage Guidelines4/5

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

It strongly indicates when this tool is the right source: 'This is the ONLY source of the athlete's real zones,' and warns that reasoning from other numbers conflicts with the athlete's charts. It implicitly distinguishes itself from curve-based siblings by stating zones are not derived from curve data, though it does not explicitly name alternatives or exclusions.

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

icu_get_upcoming_workoutsIcu 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. hide_from_athlete / athlete_cannot_edit appear only when set (change them with icu_bulk_update_event_access).

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

Output 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 real behavioral context beyond that: the result set is silently filtered to workouts only, and hide_from_athlete / athlete_cannot_edit are conditionally present and changed via icu_bulk_update_event_access. It stops short of describing ordering or the default 7-day window semantics, which an agent might want.

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 distinction (calendar events, not library templates) in the first clause, then layers usage, id routing, alternatives, and field caveats in short, scannable sentences. No sentence is redundant with the schema or annotations.

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

Completeness5/5

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

With an output schema available and annotations covering safety, the description's remaining duty is routing and identity of the returned objects — the id provenance warning and the conditional fields are exactly the details an agent would otherwise get wrong. Nothing materially needed 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.

Parameters3/5

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

Schema description coverage is 100%, with both limit and athlete_id documented in the schema, so the baseline is 3. The description adds nothing about either parameter — no clarification of the time window that 'upcoming' implies or how athlete_id behaves for coaches — so it neither compensates nor regresses.

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 planned workout entries on the upcoming calendar) and immediately disambiguates from two classes of confusable siblings: calendar events vs. workout-library templates. An agent can distinguish it from icu_get_calendar_events and icu_get_workouts_in_folder 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 explicit trigger phrases ("what's my next workout?"), explicit exclusions (filters out notes, races, goals), and names the correct alternatives for every other case: icu_get_calendar_events for all entry types, icu_get_workouts_in_folder for library templates. It also states which downstream tools the returned id is valid for and which it is not.

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

icu_get_wellness_dataIcu 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.

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

Output 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 destructiveHint=false, so the safety profile is covered. The description adds behavior beyond that: the default lookback of 7 days and the guarantee that the response is always a multi-day list rather than a single record. It stops short of describing pagination, empty-range behavior, or whether records are sparse for missing days.

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, then use cases, then two explicit alternative routes, in three short sentences with no filler. Every clause either narrows the tool's identity or prevents a sibling misselection.

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?

Two optional params, full schema coverage, rich annotations, and an output schema that carries the return-value detail — so the description only needs to establish scope and routing, which it does. Nothing an agent needs in order to call this correctly is missing.

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

Parameters3/5

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

Schema coverage is 100%, so both parameters are already documented, and the description only restates the 7-day default. It adds no semantics for athlete_id or for how days_back interacts with data availability, so 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 and resource ('Fetch wellness records') plus the defining scope ('over a RANGE of recent days'), which distinguishes it from the single-date and fitness-chart siblings. An agent can identify the tool's output shape (multi-day list) 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 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') and explicitly routes two alternatives: icu_get_fitness_chart for CTL/ATL/TSB series and icu_get_wellness_for_date for a single date. The exclusion ('this tool always returns a multi-day list') closes the main ambiguity.

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_dateIcu 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.

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

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered without the description. The description's only added behavioral signal is the single-date scope, which is useful but thin; it says nothing about what happens when no record exists for that date.

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 blocks: the scope statement is front-loaded, then the routing rule and quoted examples. Every sentence carries a distinct piece of information with no repetition of the name or title.

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 only two fully documented parameters, the description covers everything needed to select and invoke the tool. The remaining gap is minor: no guidance on missing/empty wellness data for the requested date.

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 would be 3, but the description earns above baseline by showing that users may express the date loosely ('Monday', 'last Thursday'), signalling the agent must resolve natural-language dates to the schema's YYYY-MM-DD format. It says nothing about athlete_id, though the schema documents that at 100%.

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 wellness record') plus a hard scope constraint ('for ONE specific date'). The emphasis on 'ONE' immediately separates it from the range-oriented sibling icu_get_wellness_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?

Gives explicit when-to-use triggers with three realistic user phrasings ('show my HRV for Monday', 'wellness on 2026-03-15', 'how did I sleep last Thursday') and names the alternative for ranges/weeks/trends. Nothing is left to inference about routing.

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

icu_get_workout_libraryIcu 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.

NameRequiredDescriptionDefault
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output 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, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds real scope information (personal vs shared vs followed plans qualify what "access" means) and forward references, but says nothing about permissions needed for coach-managed athletes or result size/pagination.

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, both earning their place: the first states what is returned and its scope, the second routes the agent onward. No preamble, no restatement of the tool name.

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 zero-required-parameter read tool with an output schema and full annotation coverage, this is nearly complete — return contents, scope, and downstream usage are all stated. Only minor gaps remain around the default athlete behavior for non-coach callers.

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 single optional athlete_id is fully documented in the schema as the coach multi-athlete selector. The description contributes no additional semantics about the parameter, 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?

Specific verb and resource ("List all workout-library folders + training plans") with explicit scope ("personal, shared, and followed plans"). The follow-up sentence names the sibling tools that consume the returned IDs, so an agent can immediately tell this is the discovery/entry-point tool rather than a content reader.

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 positions itself as the first step in a pipeline by naming icu_get_workouts_in_folder for contents and icu_apply_training_plan for scheduling. It stops short of an explicit when-not rule (e.g., don't call this if you already have a folder ID, or that icu_get_workouts_in_folder is the alternative for browsing), but the 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_workouts_in_folderIcu Get Workouts In FolderA
Read-onlyIdempotent

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

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

Output 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 readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is fully covered by structured data. The description adds the shape of the response (the fields returned), which is mildly useful, but says nothing about pagination, ordering, empty folders, or coach/athlete access 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?

A single front-loaded sentence with the verb and scope first and the returned fields after — no filler, nothing that could be cut without losing 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?

An output schema exists, so return values do not need explaining, and the annotations plus 100% schema coverage carry the safety and parameter burden. The one remaining gap is any hint at how this relates to the library-level sibling tool, which would help an agent disambiguate.

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 folder_id and athlete_id are already documented, including the coaching use case for athlete_id. The description supplies no additional parameter semantics such as whether folder_id can refer to a training plan, so the 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 (workouts) and scopes it to a single library folder or training plan, which distinguishes it from the library-wide sibling icu_get_workout_library. It also enumerates the returned fields (name, type, structure, training load, intensity factor), though it never explicitly names a sibling alternative.

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 'one specific library folder or training plan' implies the preconditions — you need a folder in hand — so the usage context is inferable. However, there is no explicit when-to-use/when-not statement, no guidance on how this differs from icu_get_workout_library or icu_get_upcoming_workouts, and no mention of the coach/athlete scenario.

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

icu_list_athletesIcu 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, plus any tags and a short preview of the athlete notes. Entries with notes_truncated=true have longer notes; icu_get_athlete_profile returns the full text.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, but the description adds context annotations cannot: the response carries each athlete's access level so the agent can predict whether a later write will be permitted, and notes_truncated=true signals a truncated preview. That is exactly the decision-relevant behavior an agent needs before routing to a mutation tool.

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

Conciseness5/5

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

Three sentences, no waste. The scope comes first, then the usage imperative, then the return-value caveat — a strong front-loaded structure with the routing rule in the most scannable position.

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 and rich annotations already cover return shape and safety, so the description only needs the resolution workflow and the truncation escape hatch — both are present. Nothing an agent needs to call this correctly is missing.

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

Parameters4/5

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

There are zero parameters and the schema is fully covered, so per the baseline this scores 4. The description correctly adds no invented parameter detail and instead spends its words on how the returned athlete_id feeds other tools.

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 ("List the athletes") plus the exact scope: "the caller plus anyone they follow or coach." That scope definition clearly separates it from siblings like icu_get_athlete_profile, which returns a single athlete's details.

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 an explicit invocation rule: "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." It also names the alternative for the adjacent need (icu_get_athlete_profile for full note text), so both the condition and the fallback are covered.

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

icu_search_activitiesIcu 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).

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

Output 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, non-destructive. The description adds genuinely useful context beyond that: it labels the response as a LIGHT payload and contrasts it with a heavier alternative, which helps an agent reason about cost. It does not discuss rate limits or authentication, but output shape is covered by 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?

Three short sentences, front-loaded with what is returned, then the routing decision. No filler and every sentence carries distinct 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 annotations covering the safety profile, a 100%-covered schema, and an output schema handling return values, the description supplies everything an agent needs: purpose, result shape, default choice, and escalation path.

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 limit, query, and athlete_id are already documented in the schema. The description restates the query semantics ('name or tag') without adding format, matching behavior, or scope guidance 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.

Purpose5/5

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

The description names a specific verb and resource ('Search activities by name or tag') and immediately states the result shape (id, name, type, date, distance, time). It explicitly distinguishes itself from the sibling icu_search_activities_full, so an agent can route 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 an explicit default ('Use this first for "find my X" queries') and a precise escalation condition naming the alternative tool and the exact data that justifies the heavier call (power, HR, training load, intensity factor). Both when-to-use and when-not-to-use are covered.

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

icu_search_activities_fullIcu 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").

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

Output 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), and the description adds genuinely useful context the annotations cannot convey: the payload is heavy and the response is fully hydrated per-result. It stops short of mentioning pagination or default result-count behavior, which keeps it from a 5.

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

Conciseness5/5

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

Two short blocks with zero filler: the capability plus return payload first, then the cost/alternative guidance. The heavy-payload warning is placed before the usage rule so the agent sees the tradeoff in the right order.

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 needn't be enumerated, yet the description still summarizes the payload's richness and its cost. Combined with the explicit sibling routing, an agent has everything needed to call this correctly and to know when not to.

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 query, limit, and athlete_id are already documented in the input schema. The description's "by name or tag" adds only marginal color about what the query matches, and says nothing about limit or the coach-scoped athlete_id. Baseline 3 applies 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 and resource ("Search activities by name or tag") plus the distinctive return shape: FULL Activity objects with power, HR, training load, NP, weather. It explicitly contrasts with the sibling icu_search_activities, so an agent can choose between 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 an explicit when-not ("Use only when the lighter search_activities won't tell you what you need") and names the alternative, backed by a concrete example query ("find my threshold rides with NP above 250W"). Both the selection rule and its motivating case are present.

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

icu_search_intervalsIcu 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).

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

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, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: results are activities (not raw intervals) and each carries an interval_summary rendered as '2x 8m 162w' (reps x duration at target). It does not mention result ordering or paging beyond the limit param, so not a 5.

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

Conciseness4/5

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

Front-loaded with the cross-activity scope, then the sibling contrast, then usage and return shape — every clause maps to a decision the agent must make. The return-format example is slightly redundant given an output schema exists, keeping it just short of 5.

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 7 all-optional, fully documented params, annotations covering safety, and an output schema, the description supplies exactly the missing pieces: cross-activity scope, the exclusion versus the single-activity sibling, and the shape of the returned interval_summary. Nothing an agent needs to call it correctly is absent.

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 schema itself carries strong semantics, including the note that interval_type means AUTO/POWER/HR/PACE and is neither the sport nor a workout-step label. The description adds no parameter-level detail (e.g. that intensity is relative to threshold, or how athlete_id defaults), 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 (search intervals) plus an explicit scope (across ALL the athlete's activities, cross-activity) and names the sibling it differs from (icu_get_activity_intervals, single-activity). An agent can distinguish the two 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 (tracking progress on a workout type, e.g. 'all my threshold intervals over the last year', finding comparable historical sessions) and an explicit alternative with the condition that selects it. Nothing is left to inference about when to pick this over the single-activity tool.

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

icu_update_activityIcu Update ActivityA
Idempotent

Update an existing activity's metadata (name, type, distance, sub-type, RPE, etc.).

Only fields you pass are sent; everything else stays unchanged. Strava-imported activities cannot be updated. Moving, elapsed and recording time cannot be changed after an activity exists (neither here nor in the web UI); they can only be set when a manual activity is created. Keys passed via fields are sent as-is and are not echoed back in the response.

NameRequiredDescriptionDefault
feelNoHow you felt (1-5 scale)
nameNoUpdated activity name
raceNoMark as race
tagsNoTags; replaces the existing tag list
fieldsNoAny other writable Activity API field, sent as-is (e.g. {'icu_ignore_hr': true}). Named parameters win on conflict.
commuteNoMark as commute
trainerNoMark as trainer/indoor workout
distanceNoDistance in meters (e.g. for indoor rides whose file lacks it)
sub_typeNoActivity sub-type: NONE, COMMUTE, WARMUP, COOLDOWN or RACE
activity_idYesActivity ID to update
descriptionNoUpdated description
activity_typeNoUpdated activity type (e.g., Ride, Run, Swim)
carbs_ingestedNoCarbohydrates ingested during the session (g)
perceived_exertionNoRPE rating (1-10 scale)

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare idempotent, non-destructive, open-world, but the description adds what they cannot: partial-update semantics ('only fields you pass are sent'), the in-place replacement behavior of list fields implied via fields pass-through, the Strava import restriction, and the fact that keys passed via `fields` are not echoed back in the response.

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 what the tool does, then the partial-update rule, then the constraints. Six tight sentences, none redundant, and the caveats are ordered by likelihood of biting the agent.

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 14 parameters, a real output schema, and full annotation coverage, the remaining burden is behavioral, and the description covers it: partial updates, immutable timing fields, import restrictions, and `fields` pass-through. Nothing an agent needs in order to call it safely 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 per-field meaning is already documented and the description needn't repeat it. It still adds genuine value by explaining the `fields` escape hatch interaction ('sent as-is', named parameters win on conflict) and warning that those keys aren't reflected in the response.

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 ('Update an existing activity's metadata') and scopes it with a field list (name, type, distance, sub-type, RPE). The explicit exclusion of moving/elapsed/recording time cleanly separates it from icu_update_activity_streams and the read-only 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?

Gives clear when-not guidance: Strava-imported activities cannot be updated, and timing fields can only be set at manual creation. It doesn't name a sibling alternative for the cases it excludes (e.g., which tool to use for streams), so it stops short of full routing guidance.

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

icu_update_activity_messageIcu Update Activity MessageA
DestructiveIdempotent

REPLACE the text of an existing note on an activity (edit, not add).

Use when the user wants to fix or rewrite a note they already left: "correct my note on that ride", "change the comment to say...". Only the author's own notes can be changed. Returns the old and the new text — the old text is not recoverable otherwise. To post an additional note use icu_add_activity_message.

NameRequiredDescriptionDefault
contentYesNew note text; replaces the old text entirely
message_idYesID of the note to change (from icu_get_activity_messages)
activity_idYesThe Intervals.icu activity ID

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds context annotations cannot: that the old text is not recoverable otherwise, that the tool returns both old and new text as a safety net, and that edits are restricted to the caller's own notes. This is exactly the supplemental disclosure expected alongside 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 destructive, irreplaceable nature is front-loaded in the first line, followed by usage examples and then the sibling exclusion. Every sentence carries distinct information; nothing is padding.

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 destructive 3-parameter mutation, the description covers irreversibility, ownership constraints, the semantic difference from the add-sibling, and the return payload; the output schema handles return-value details. Nothing an agent needs before calling it 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% and the schema already explains that content 'replaces the old text entirely' and that message_id comes from icu_get_activity_messages. The description repeats the replacement semantics but adds no new parameter-level detail, 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?

The opening sentence gives a specific verb (REPLACE) and resource (the text of an existing note on an activity) and immediately disambiguates with '(edit, not add)'. An agent can distinguish it from icu_add_activity_message without inspecting 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?

It names concrete trigger utterances ('correct my note on that ride', 'change the comment to say...'), states the exclusion and the correct alternative ('To post an additional note use icu_add_activity_message'), and adds a precondition (only the author's own notes can be changed).

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

icu_update_activity_streamsIcu 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).

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

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 destructiveHint=true, readOnlyHint=false and idempotentHint=false, so the safety profile is carried by structured data. The description still adds value by specifying what is destroyed ('overwrites existing stream data') and what payload types are accepted, which goes beyond the boolean hint. It does not cover permissions/auth or partial-vs-full replacement 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?

Two short sentences plus a parenthetical; the destructive warning is front-loaded and nothing is wasted. Every sentence earns its place.

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

Completeness4/5

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

An output schema and rich annotations exist, so the description needn't explain returns or safety. It covers purpose, format, and destructiveness, but leaves open whether the upload replaces all streams or merges with existing ones — a meaningful gap for a destructive write.

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, including the 'json'/'csv' format enum in prose. The description's 'Accepts JSON array or CSV' largely duplicates the schema rather than adding format or shape detail, so 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 ('Upload raw time-series streams ... onto an existing activity') with concrete examples of stream types. It also explicitly distinguishes itself from the read counterpart get_activity_streams, so an agent can separate the two 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 Guidelines4/5

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

Names the read sibling as the alternative and makes the write/read split explicit, plus warns the operation overwrites existing data, which is a strong usage cue. It does not address related write siblings such as icu_update_activity (metadata edits) or when a caller should prefer a full file upload (icu_download_fit_file inverse), leaving some routing inference to the agent.

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

icu_update_athlete_notesIcu Update Athlete NotesA
Idempotent

REPLACE the free-text notes kept on an athlete's own record — not an activity comment or a calendar note.

Use for standing context about the athlete: "note on my profile that I'm injured", "update my athlete notes". The whole text is overwritten, so to add to existing notes read them first with icu_get_athlete_profile and send the combined text. For a comment on one activity use icu_add_activity_message; for a dated calendar note use icu_create_event.

NameRequiredDescriptionDefault
notesYesFull new notes text (Markdown). Replaces the existing notes; pass an empty string to clear them.
athlete_idNoAthlete ID (for coaches managing multiple athletes)

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only declare readOnly=false, idempotent=true, destructive=false; the description supplies the critical operational fact the annotations cannot: the whole text is overwritten, so prior content is lost unless re-supplied. It also provides the mitigation workflow (read-first) and the clearing behavior, which is exactly the beyond-annotation context an agent needs.

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-loaded with the mutation type in caps, then usage examples, then the overwrite caveat, then sibling routing. Four short sentences and a fragment, every one carrying distinct decision-relevant 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?

Covers what the tool writes, when to select it, when to select siblings instead, the data-loss risk of the replace semantics, and the read-modify-write pattern. With an output schema present, no return-value explanation is needed, so nothing material 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; the description adds genuine meaning by framing the notes parameter as full-replacement standing context rather than an append, and by tying the clearing case to the overwrite semantics. It says nothing extra about athlete_id (coach use case), which stays entirely 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?

States a specific verb and resource ('REPLACE the free-text notes kept on an athlete's own record') and immediately negates the two nearest lookalikes ('not an activity comment or a calendar note'). An agent can distinguish this from icu_add_activity_message and icu_create_event 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 explicit natural-language triggers ('note on my profile that I'm injured', 'update my athlete notes') and names both alternatives with the condition that routes to them: activity comment vs dated calendar note. It even prescribes the prerequisite workflow (read with icu_get_athlete_profile, then send combined text).

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

icu_update_custom_itemIcu 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.

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

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=false, destructiveHint=false, idempotentHint=true, so the safety profile is covered. The description adds a genuinely non-redundant behavioral fact — "Only fields you pass are sent — others are left unchanged" — clarifying partial-update semantics. It stops short of warning in prose that `content` is replaced wholesale (that lives only in the schema), which keeps it from a 5.

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

Conciseness5/5

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

Three short sentences, purpose front-loaded, examples inline, and the prerequisite and resource pointer placed after the core statement. 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, full annotation coverage, and 100% parameter descriptions, the remaining burden is purpose, timing, prerequisite, and mutation semantics — all present. Nothing an agent needs to call this correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so baseline would be 3. The description goes beyond it by explaining the workflow for obtaining `item_id` and by clarifying that unspecified fields are untouched, which disambiguates the meaning of the nullable/defaulted parameters. The pointer to intervals-icu://custom-item-schemas for `content` adds further value.

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

Purpose5/5

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

Opens with a specific verb and resource set: "Modify an existing custom chart/field/zones/panel." This clearly separates it from icu_create_custom_item (new items) and icu_get_custom_items (reads) among the 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?

States the trigger condition with concrete user phrasings ("rename my custom field", "make this chart public") and adds a prerequisite: "Usually need icu_get_custom_items first to find the right `item_id`." That gives the agent both when-to-use and the ordering relative to a sibling.

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

icu_update_eventIcu 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.

NameRequiredDescriptionDefault
nameNoUpdated event name
tagsNoReplacement tag list, without the leading # — overwrites existing tags, so include any to keep. [] clears
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
hide_from_athleteNoHide this event from the athlete's calendar (the web UI's 'Hide from athlete' checkbox). For coaches managing an athlete via athlete_id
athlete_cannot_editNoLock this event so the athlete cannot move or edit it (the web UI's 'Athlete cannot edit' checkbox). For coaches managing an athlete via athlete_id
not_on_fitness_chartNoHide event from the fitness chart
training_availabilityNoUpdated training availability: NORMAL, LIMITED, or UNAVAILABLE

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnly=false, idempotent=true, destructive=false, openWorld=true, so the safety profile is covered. The description adds the one non-obvious behavioral fact annotations cannot convey: omitted fields are preserved, so the call is a merge rather than a replace. It omits what happens on an invalid event_id or whether athlete_id is required for coach-scoped edits.

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?

Three short sentences, front-loaded with the action and the key partial-update rule, followed by two pointers to resources. Very efficient. Minor deduction for the 'category' pointer, which references something not in the schema and slightly dilutes the otherwise clean structure.

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 18 parameters, an output schema, and full annotation coverage, this description supplies what structured fields cannot: sparse-update semantics and pointers to the domain references needed for the tricky `description` and `training_availability` values. The residual gap is coach/athlete scoping — nothing explains that `athlete_id` must be set to edit another athlete's event.

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 parameter docs are unusually thorough (notably the workout-syntax `description`), so the baseline is 3 and the description adds no parameter-level detail of its own. It also points to a 'category' parameter and 'event-categories' semantics that have no matching property in the schema (the schema exposes `event_type` and `training_availability`), a small dangling reference.

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 ('Update an existing calendar event'), which cleanly distinguishes it from create/delete/get siblings despite the shared icu_*event* namespace. It does not, however, name any sibling or scope boundary (e.g. bulk_update_event_access, update_workout) so the agent must infer the split from the name alone.

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?

'Only fields you pass are sent — other fields remain unchanged' is real usage guidance: it tells the agent this is a sparse PATCH-style update and that omitting a field is safe. It also routes the agent to two reference resources for domain semantics. It stops short of saying when to prefer this over bulk_update_event_access or how it relates to update_workout.

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

icu_update_gearIcu Update GearB
Idempotent

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

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

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 readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds one genuine behavioral fact beyond that — PATCH-style partial update semantics ("Only fields you pass are sent") — but says nothing about error behavior for unknown gear_id, permission requirements, or the retire/un-retire side effect of active=false.

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 filler, with the action stated first and the partial-update caveat immediately after. Nothing could be trimmed without losing information.

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?

With full schema coverage, an output schema, and annotations carrying the safety profile, the definition is callable as written. However, for a mutation tool it omits notable context an agent would want: what happens if gear_id does not exist or belongs to another athlete, and that setting active=false permanently dates a retirement.

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 parameter (including the nuanced active=false retirement behavior and coach-oriented athlete_id) is already documented. The description's partial-update note reinforces optionality but adds no field-level 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?

"Update an existing gear item" gives a specific verb (update) and resource (gear item), which cleanly separates it from icu_create_gear, icu_delete_gear, and icu_update_gear_reminder. It does not explicitly name or differentiate against any sibling, so it stops short of a 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?

The description never states when to use this tool versus alternatives such as icu_create_gear (new item) or icu_update_gear_reminder (reminders). Usage is only implied by the verb "update" and the required gear_id.

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

icu_update_gear_reminderIcu Update Gear ReminderB
Idempotent

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

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

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=false, idempotentHint=true, and destructiveHint=false, so safety is covered. The description adds genuinely useful partial-update semantics ('Only fields you pass are sent'), but does not explain how nulls behave (e.g. whether passing null clears an alert), which matters given every optional field accepts null.

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, zero waste, and the operational constraint (partial update) is front-loaded right after the purpose statement.

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?

Output schema exists and annotations cover the safety profile, so the description needn't explain returns. What it lacks is null/clear semantics for the nullable alert fields, which is the one real gap for a patching 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?

Schema description coverage is 100%, so all six parameters are already documented in the schema. The description adds only the patch-semantics framing rather than per-parameter meaning, so 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 and resource: 'Update an existing gear maintenance reminder'. This distinguishes it implicitly from icu_create_gear_reminder and icu_update_gear, though it doesn't name those siblings 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?

The word 'existing' hints that this is for reminders already created, but there is no explicit when-to-use guidance, no mention of when to prefer icu_create_gear_reminder vs this tool, and no prerequisites such as required permissions or whether the reminder must belong to the given gear/athlete.

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

icu_update_sport_settingsIcu Update Sport SettingsA
Idempotent

Update sport settings: FTP, FTHR, pace/swim thresholds, or explicit HR/power zones.

Explicit zones replace the threshold-derived ones (e.g. to match a lab test). Changes apply from now on; past activities keep the zones they were analysed with. To re-zone past activities, tell the user to use Update zones in the Intervals.icu activity list view (not in the API).

NameRequiredDescriptionDefault
ftpNoFunctional Threshold Power in watts (for cycling)
fthrNoFunctional Threshold Heart Rate in bpm
max_hrNoMax HR in bpm. Optional with hr_zones (taken from the last bound); if sent, it must equal that bound
hr_zonesNoExplicit HR zone upper bounds in bpm, strictly increasing (e.g. lab VT1/VT2). The last bound is the max HR: Intervals.icu sets max_hr to it
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)
hr_zone_namesNoOne name per hr_zones bound
pace_thresholdNoThreshold pace in min/km (e.g., 4.5 for 4:30/km)
sweet_spot_maxNoSweet spot upper bound, % of FTP
sweet_spot_minNoSweet spot lower bound, % of FTP
swim_thresholdNoSwim threshold in min/100m (e.g., 1.5 for 1:30/100m)
recalc_hr_zonesNoRescale HR zones when fthr changes. Explicit lab zones are rescaled too; pass false to keep them. Zones sent in the same call are kept either way
power_zone_namesNoOne name per power_zones_percent_ftp bound
power_zones_percent_ftpNoExplicit power zone upper bounds as % of FTP (not watts), strictly increasing, each <= 200; a final 999 makes the top zone open-ended

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnly=false, destructive=false, idempotent=true, openWorld=true), so the description's value-add is the mutation semantics it discloses: explicit zones replace threshold-derived zones, and changes are forward-only with past activities retaining their original zones. Missing only permission/auth context, which openWorldHint partly signals.

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?

Four short sentences, front-loaded with the resource and field list, then consequences, then the workaround. No filler, though the parenthetical '(e.g. to match a lab test)' is decorative rather than load-bearing.

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 and annotations are present, so the remaining burden is mutation semantics — and one key question is unanswered: whether omitted optional parameters are left untouched or cleared, and whether sending only ftp triggers any zone recalculation. For a 15-parameter mutation tool that gap matters.

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 each of the 15 parameters is documented with units and formats, so the baseline is 3. The description adds one genuine concept the schema does not — that hr_zones/power_zones_percent_ftp override the threshold-derived zones rather than composing with them — but offers no guidance on the threshold-vs-indoor or sweet-spot 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?

Specific verb ('update') plus resource ('sport settings') immediately followed by the exact set of updatable fields (FTP, FTHR, pace/swim thresholds, HR/power zones). The verb distinguishes it cleanly from the siblings icu_get_sport_settings and icu_create_sport_settings without needing to open 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?

Gives a strong 'when-not': changes only apply going forward, and past re-zoning must be done by the user in the Intervals.icu activity list view, not via the API. That prevents a whole class of failed attempts, though it doesn't state prerequisites such as when athlete_id is needed or when to prefer create_sport_settings over update.

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

icu_update_wellnessIcu 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.

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

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 idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered; the description adds real substance on top — upsert branch behavior, partial-send semantics, the lock/sync-overwrite interaction, and the authenticated-vs-managed-athlete write target. The remaining gap is that with every field nullable and defaulting to null, it never says whether passing an explicit null clears a stored value or is simply ignored, which matters for a mutation tool.

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

Conciseness4/5

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

Four tight sentences with the most important fact (upsert on one date) front-loaded and no filler. The scale enumeration partly restates schema descriptions, which is the only real 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?

An output schema exists, so return values need no explanation, and the 32-parameter surface is fully described in the schema itself. The description covers the behaviors an agent can't get from structured fields — upsert branching, partial sends, lock behavior, write target — leaving only the null-vs-omit question and any permission prerequisites 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 description coverage is 100% across 32 parameters, so the per-field semantics are already documented and the baseline is 3. The description adds one genuinely schema-absent rule — that omitted fields are not sent, making this a partial update rather than a full replace — plus a consolidated statement of the 1-5 subjective scales and the athlete_id targeting rule.

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 (upsert wellness data), pins the scope to ONE date, and explains the create-or-update branch in the same sentence. This clearly separates it from the read-side siblings icu_get_wellness_data and icu_get_wellness_for_date without requiring the agent to open 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?

Gives concrete usage conditions: partial updates are allowed ('Only provided fields are sent'), locked=True suppresses device-sync overwrites, and the write target is the authenticated athlete unless athlete_id is supplied. It does not explicitly route to the read tools for retrieval-only cases, so an agent must infer that from the verb.

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

icu_update_workoutIcu 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.

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

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=false, idempotentHint=true, destructiveHint=false, openWorldHint=true, so the safety profile is covered. The description adds genuinely useful behavior beyond them: partial-update semantics ('only the fields you pass are sent', i.e. omitted fields are left untouched) and the library-vs-calendar record boundary. It stops short of noting any side effects on existing derived data (e.g. re-parsing steps and recomputing training load), which the schema hints at but the description does not surface.

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 and its partial-update contract, then the disambiguation. No repetition of schema details and 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 14-parameter mutation the description covers exactly what the structured data does not: partial-update semantics and sibling routing. Per-field semantics and the workout-syntax reference live in a fully-covered schema, an output schema exists for return values, and annotations cover the safety profile, so nothing an agent needs to call this correctly is missing.

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

Parameters4/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 and the schema carries all per-field meaning, including the extensive workout-syntax grammar for `description`. The description adds one cross-cutting semantic that applies to all 13 optional params — that unspecified fields are not sent — which is precisely the guidance an agent needs to use the nullable-with-default pattern correctly.

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 ('Change fields') plus resource ('EXISTING library workout') and immediately scopes it to partial updates ('only the fields you pass are sent'). It explicitly names the two sibling tools it must not be confused with (icu_create_workout, icu_update_event), so an agent can route correctly without opening any schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use (edit an existing library workout), when-not-to-use with the exact alternative for each case ('To save a new workout use icu_create_workout'), and a sharp exclusion ('calendar events are separate records changed with icu_update_event'). Nothing about tool selection 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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updatesv5.8.0
    • Addedicu_delete_activity_message
    • Changedicu_get_power_curves5 fields changed
      • addedInput schema / properties / end_date
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Range end (YYYY-MM-DD), inclusive"
        +}
      • addedInput schema / properties / full_curve
        Added value: +{
        +  "default": false,
        +  "description": "Also return all points the API returns (secs + watts), not just key durations",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / periods
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Compare up to 5 periods in one call; each is week/month/year/all, '<N>d', a season ID ('s1'), or 'YYYY-MM-DD..YYYY-MM-DD'. Returns one entry per period."
        +}
      • addedInput schema / properties / season
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Season curve ID from icu_get_seasons: 's0' = current, 's1' = previous"
        +}
      • addedInput schema / properties / start_date
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Range start (YYYY-MM-DD); use with end_date (defaults to today)"
        +}
    • Addedicu_get_seasons
    • Changedicu_update_activity6 fields changed
      • addedInput schema / properties / carbs_ingested
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Carbohydrates ingested during the session (g)"
        +}
      • addedInput schema / properties / distance
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Distance in meters (e.g. for indoor rides whose file lacks it)"
        +}
      • addedInput schema / properties / fields
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Any other writable Activity API field, sent as-is (e.g. {'icu_ignore_hr': true}). Named parameters win on conflict."
        +}
      • addedInput schema / properties / race
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Mark as race"
        +}
      • addedInput schema / properties / sub_type
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Activity sub-type: NONE, COMMUTE, WARMUP, COOLDOWN or RACE"
        +}
      • addedInput schema / properties / tags
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Tags; replaces the existing tag list"
        +}
    • Addedicu_update_activity_message
  2. 2 tool updatesv5.7.1
    • Removedicu_apply_sport_settings
    • Addedicu_update_athlete_notes
  3. 1 tool updatev5.5.0
    • Addedicu_delete_workout_folder
  4. 6 tool updatesv5.4.0
    • Changedicu_bulk_create_events1 field changed
      • changedInput schema / properties / events / description
        Previous 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, tags (no leading #), 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, tags (no leading #), color, show_as_note, not_on_fitness_chart, show_on_ctl_line, hide_from_athlete, athlete_cannot_edit. 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."
    • Addedicu_bulk_update_event_access
    • Changedicu_create_event2 fields changed
      • addedInput schema / properties / athlete_cannot_edit
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Lock this event so the athlete cannot move or edit it (the web UI's 'Athlete cannot edit' checkbox). For coaches managing an athlete via athlete_id"
        +}
      • addedInput schema / properties / hide_from_athlete
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Hide this event from the athlete's calendar (the web UI's 'Hide from athlete' checkbox). For coaches managing an athlete via athlete_id"
        +}
    • Changedicu_get_activity_streams1 field changed
      • addedInput schema / properties / max_points
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Thin every returned stream to at most this many samples by keeping every Nth one (the same N for all streams, so indices stay aligned). Omit for full resolution. ~500 is plenty to trace a route or see the shape of a ride. Samples are not always 1 s apart, so include 'time' to know when each kept sample was recorded."
        +}
    • Changedicu_update_event2 fields changed
      • addedInput schema / properties / athlete_cannot_edit
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Lock this event so the athlete cannot move or edit it (the web UI's 'Athlete cannot edit' checkbox). For coaches managing an athlete via athlete_id"
        +}
      • addedInput schema / properties / hide_from_athlete
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Hide this event from the athlete's calendar (the web UI's 'Hide from athlete' checkbox). For coaches managing an athlete via athlete_id"
        +}
    • Changedicu_update_sport_settings3 fields changed
      • changedInput schema / properties / hr_zones / description
        Previous value: -"Explicit HR zone upper bounds in bpm, strictly increasing (e.g. lab VT1/VT2). The last bound becomes max_hr"New value: +"Explicit HR zone upper bounds in bpm, strictly increasing (e.g. lab VT1/VT2). The last bound is the max HR: Intervals.icu sets max_hr to it"
      • changedInput schema / properties / max_hr / description
        Previous value: -"Max HR in bpm; must equal the last hr_zones bound"New value: +"Max HR in bpm. Optional with hr_zones (taken from the last bound); if sent, it must equal that bound"
      • changedInput schema / properties / power_zones_percent_ftp / description
        Previous value: -"Explicit power zone upper bounds as % of FTP (not watts), strictly increasing; 999 as the last value makes the top zone open-ended"New value: +"Explicit power zone upper bounds as % of FTP (not watts), strictly increasing, each <= 200; a final 999 makes the top zone open-ended"
  5. 4 tool updatesv5.2.0
    • Changedicu_bulk_create_events1 field changed
      • changedInput schema / properties / events / description
        Previous 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."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, tags (no leading #), 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
      • addedInput schema / properties / tags
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Calendar tags for grouping and filtering, without the leading # (e.g. [\"sweet-spot\", \"indoor\"])"
        +}
    • Changedicu_update_event1 field changed
      • addedInput schema / properties / tags
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Replacement tag list, without the leading # — overwrites existing tags, so include any to keep. [] clears"
        +}
    • Changedicu_update_sport_settings8 fields changed
      • addedInput schema / properties / hr_zone_names
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "One name per hr_zones bound"
        +}
      • addedInput schema / properties / hr_zones
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "integer"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Explicit HR zone upper bounds in bpm, strictly increasing (e.g. lab VT1/VT2). The last bound becomes max_hr"
        +}
      • addedInput schema / properties / max_hr
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Max HR in bpm; must equal the last hr_zones bound"
        +}
      • addedInput schema / properties / power_zone_names
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "One name per power_zones_percent_ftp bound"
        +}
      • addedInput schema / properties / power_zones_percent_ftp
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "integer"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Explicit power zone upper bounds as % of FTP (not watts), strictly increasing; 999 as the last value makes the top zone open-ended"
        +}
      • changedInput schema / properties / recalc_hr_zones / description
        Previous value: -"Recalculate HR zones from the updated threshold heart rate"New value: +"Rescale HR zones when fthr changes. Explicit lab zones are rescaled too; pass false to keep them. Zones sent in the same call are kept either way"
      • addedInput schema / properties / sweet_spot_max
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sweet spot upper bound, % of FTP"
        +}
      • addedInput schema / properties / sweet_spot_min
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sweet spot lower bound, % of FTP"
        +}
  6. 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
  7. 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)"
        +}
  8. 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."
  9. 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"
        +}
  10. 2 tool updatesv4.1.0
    • Addedicu_get_activities_by_date
    • Addedicu_get_annual_training_plan
  11. 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)"
  12. 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 69 tools

Disambiguation4/5

The descriptions go out of their way to delineate adjacent tools: recent vs. explicit-date activity lists, lightweight vs. full search, summary vs. intervals vs. streams, histograms vs. curves, calendar events vs. library workouts, and range vs. single-date wellness. However, the sheer number of near-variants (three histograms, three curves, several activity-read tools) still creates meaningful selection burden even with cross-references.

Naming Consistency5/5

Nearly every tool follows a consistent icu_ + verb_noun snake_case pattern (get_, update_, create_, delete_, search_, download_, bulk_create_, etc.). Minor singular/plural distinctions are intentional and predictable, not chaotic.

Tool Count2/5

With 69 tools, the surface is far above the typical well-scoped range, even for a broad training/wellness/calendar/workout/gear platform. Many tools are legitimate CRUD operations across distinct subdomains, but the overall size creates a heavy choice burden and makes the set unwieldy.

Completeness4/5

The surface covers most lifecycle operations across activities, streams, intervals, messages, wellness, calendar events, workout library, gear, sport settings, and custom items, with bulk operations where useful. Minor gaps remain, such as no delete_activity or delete_sport_settings and no standalone gear-reminder deletion, but core workflows are well covered.

Maintenance

ActivityActive
ResponsivenessResponsive

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
    A
    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.
    33
    58 npm
    ISC