Intervals.icu MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Intervals.icu MCP ServerWhat's my training load for this week?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Intervals.icu MCP Server
Model Context Protocol (MCP) server for connecting Claude and ChatGPT with the Intervals.icu API. It provides tools for authentication and data retrieval for activities, events, wellness data, power curves, and custom items.
If you find the Model Context Protocol (MCP) server useful, please consider supporting its continued development with a donation.
Requirements
Python 3.12 or higher
httpx
python-dotenv
Related MCP server: Intervals.icu MCP Server
Setup
1. Install uv (recommended)
macOS/Linux:
curl -LsSf https://astral.sh/uv/install.sh | shWindows (PowerShell):
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"After installation, find the full path to uv — you'll need it later when configuring Claude Desktop:
where.exe uv
# Example output: C:\Users\<USERNAME>\.local\bin\uv.exe2. Clone this repository
git clone https://github.com/mvilanova/intervals-mcp-server.git
cd intervals-mcp-server3. Create and activate a virtual environment
# Create virtual environment with Python 3.12
uv venv --python 3.12
# Activate virtual environment
# On macOS/Linux:
source .venv/bin/activate
# On Windows:
.venv\Scripts\activate4. Sync project dependencies
uv sync5. Set up environment variables
Make a copy of .env.example and name it .env by running the following command:
macOS/Linux:
cp .env.example .envWindows (PowerShell):
Copy-Item .env.example .envThen edit the .env file and set your Intervals.icu athlete id and API key:
API_KEY=your_intervals_api_key_here
ATHLETE_ID=your_athlete_id_hereGetting your Intervals.icu API Key
Log in to your Intervals.icu account
Go to Settings > API
Generate a new API key
Finding your Athlete ID
Your athlete ID is typically visible in the URL when you're logged into Intervals.icu. It looks like:
https://intervals.icu/athlete/i12345/...wherei12345is your athlete ID
Updating
This project is actively developed, with new features and fixes added regularly. To stay up to date, follow these steps:
1. Pull the latest changes from main
⚠️ Make sure you don't have uncommitted changes before running this command.
macOS/Linux:
git checkout main && git pullWindows (PowerShell):
git checkout main; git pull2. Update Python dependencies
Activate your virtual environment and sync dependencies:
macOS/Linux:
source .venv/bin/activate
uv syncWindows (PowerShell):
.venv\Scripts\activate
uv syncTroubleshooting
If Claude Desktop fails due to configuration changes, follow these steps:
Delete the existing
Intervals.icuentry inclaude_desktop_config.json.Reconfigure Claude Desktop from the
intervals-mcp-serverdirectory.
macOS/Linux:
mcp install src/intervals_mcp_server/server.py --name "Intervals.icu" --with-editable . --env-file .envWindows: Re-add the entry manually as described in the Windows configuration section.
Common errors
spawn uv ENOENT — Claude Desktop cannot find the uv executable. Use the full path to uv in the command field. Run which uv (macOS/Linux) or where.exe uv (Windows) to get it.
spawn /Users/... ENOENT on Windows — The config file contains a macOS/Linux-style path. Replace it with the correct Windows path using backslashes as described in the Windows configuration section below.
Windows Store install: config changes not taking effect — You may be editing the wrong config file. Claude Desktop installed from the Microsoft Store reads from AppData\Local\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.json, not AppData\Roaming\Claude\.
Usage with Claude
1. Configure Claude Desktop
To use this server with Claude Desktop, you need to add it to your Claude Desktop configuration.
macOS/Linux
Run the following from the
intervals-mcp-serverdirectory to configure Claude Desktop:
mcp install src/intervals_mcp_server/server.py --name "Intervals.icu" --with-editable . --env-file .envIf you open your Claude Desktop App configuration file
claude_desktop_config.json, it should look like this:
{
"mcpServers": {
"Intervals.icu": {
"command": "/Users/<USERNAME>/.local/bin/uv",
"args": [
"run",
"--with",
"mcp[cli]",
"--with-editable",
"/path/to/intervals-mcp-server",
"mcp",
"run",
"/path/to/intervals-mcp-server/src/intervals_mcp_server/server.py"
],
"env": {
"INTERVALS_API_BASE_URL": "https://intervals.icu/api/v1",
"ATHLETE_ID": "<YOUR_ATHLETE_ID>",
"API_KEY": "<YOUR_API_KEY>",
"LOG_LEVEL": "INFO"
}
}
}
}Where /path/to/ is the path to the intervals-mcp-server code folder in your system.
Windows
The mcp install command may fail on Windows due to environment or permission issues. Instead, configure Claude Desktop manually:
Find the Claude Desktop config file. If Claude Desktop was installed from the Microsoft Store, the config is located at:
C:\Users\<USERNAME>\AppData\Local\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.jsonIf installed via the standard installer, it may be at:
C:\Users\<USERNAME>\AppData\Roaming\Claude\claude_desktop_config.jsonIf the file or folder does not exist, create it.
Add the following entry to
claude_desktop_config.json, replacing the placeholders with your actual values:
{
"mcpServers": {
"Intervals.icu": {
"command": "C:\\Users\\<USERNAME>\\.local\\bin\\uv.exe",
"args": [
"run",
"--with",
"mcp[cli]",
"--with-editable",
"C:\\path\\to\\intervals-mcp-server",
"mcp",
"run",
"C:\\path\\to\\intervals-mcp-server\\src\\intervals_mcp_server\\server.py"
],
"env": {
"INTERVALS_API_BASE_URL": "https://intervals.icu/api/v1",
"ATHLETE_ID": "<YOUR_ATHLETE_ID>",
"API_KEY": "<YOUR_API_KEY>",
"LOG_LEVEL": "INFO"
}
}
}
}Use double backslashes (
\\) for all Windows paths in JSON.To find the full path to
uv.exe, runwhere.exe uvin PowerShell.To find the full path to the cloned repository, run
pwdfrom inside theintervals-mcp-serverfolder.
Note for Windows Store installs: Claude Desktop installed from the Microsoft Store sandboxes its config under
AppData\Local\Packages\.... EditingAppData\Roaming\Claude\claude_desktop_config.jsonwill have no effect — make sure you edit the correct file.
Restart Claude Desktop.
2. Use the MCP server with Claude
Once the server is running and Claude Desktop is configured, you can use the following tools to ask questions about your past and future activities, events, and wellness data.
get_activities: Retrieve a list of activitiesget_activity_details: Get detailed information for a specific activityget_activity_intervals: Get detailed interval data for a specific activityget_activity_streams: Get raw data streams (power, heart rate, etc.) for a specific activityget_athlete_power_curves: Get best power output curves for selected durations and time periodsget_wellness_data: Fetch wellness dataget_events: Retrieve upcoming events (workouts, races, etc.)get_event_by_id: Get detailed information for a specific eventadd_or_update_event: Create or update an event (workout, race, note, etc.)delete_event: Delete a specific eventdelete_events_by_date_range: Delete events within a date rangeget_custom_items: Get custom items (charts, custom fields, zones, etc.) for an athleteget_custom_item_by_id: Get detailed information for a specific custom itemcreate_custom_item: Create a new custom item for an athleteupdate_custom_item: Update an existing custom itemdelete_custom_item: Delete a custom item
Usage with ChatGPT
ChatGPT’s beta MCP connectors can also talk to this server over the SSE transport.
Start the server in SSE mode so it exposes the
/sseand/messages/endpoints:export FASTMCP_HOST=127.0.0.1 FASTMCP_PORT=8765 MCP_TRANSPORT=sse FASTMCP_LOG_LEVEL=INFO python src/intervals_mcp_server/server.pyThe startup log prints the full URLs (for example
http://127.0.0.1:8765/sse). ChatGPT needs that public URL, so forward the port with a tool such asngrok http 8765if you are not exposing the server directly.In ChatGPT, open Settings → Features → Custom MCP Connectors and click Add. Fill in:
Name:
Intervals.icuMCP Server URL:
https://<your-public-host>/sseAuthentication: leave as No authentication unless you have protected your tunnel.
You can reuse the same
ngrok http 8765tunnel URL here; just ensure it forwards to the host/port you exported above.Save the connector and open a new chat. ChatGPT will keep the SSE connection open and POST follow-up requests to the
/messages/endpoint announced by the server. If you restart the MCP server or tunnel, rerun the SSE command and update the connector URL if it changes.
Development and testing
Install development dependencies and run the test suite with:
uv sync --all-extras
pytest -v testsRunning the server locally
To start the server manually (useful when developing or testing), run:
mcp run src/intervals_mcp_server/server.pyEnabling debug logging
To capture server logs for debugging, wrap the command in a shell and redirect stderr to a file.
macOS/Linux — modify your claude_desktop_config.json like this:
{
"mcpServers": {
"Intervals.icu": {
"command": "/bin/bash",
"args": [
"-c",
"/Users/<USERNAME>/.local/bin/uv run --with 'mcp[cli]' --with-editable /path/to/intervals-mcp-server mcp run /path/to/intervals-mcp-server/src/intervals_mcp_server/server.py 2>> /path/to/intervals-mcp-server/mcp-server.log"
],
"env": {
"INTERVALS_API_BASE_URL": "https://intervals.icu/api/v1",
"ATHLETE_ID": "<YOUR_ATHLETE_ID>",
"API_KEY": "<YOUR_API_KEY>",
"LOG_LEVEL": "INFO"
}
}
}
}Then tail the log file to see output in real-time:
tail -f /path/to/intervals-mcp-server/mcp-server.logWindows — modify your claude_desktop_config.json like this:
{
"mcpServers": {
"Intervals.icu": {
"command": "powershell",
"args": [
"-Command",
"C:\\Users\\<USERNAME>\\.local\\bin\\uv.exe run --with 'mcp[cli]' --with-editable C:\\path\\to\\intervals-mcp-server mcp run C:\\path\\to\\intervals-mcp-server\\src\\intervals_mcp_server\\server.py 2>> C:\\path\\to\\intervals-mcp-server\\mcp-server.log"
],
"env": {
"INTERVALS_API_BASE_URL": "https://intervals.icu/api/v1",
"ATHLETE_ID": "<YOUR_ATHLETE_ID>",
"API_KEY": "<YOUR_API_KEY>",
"LOG_LEVEL": "INFO"
}
}
}
}Then monitor the log file in real-time using PowerShell:
Get-Content C:\path\to\intervals-mcp-server\mcp-server.log -WaitLicense
The GNU General Public License v3.0
Featured
Glama.ai
Available Tools
21 toolsadd_activity_messageB
Add a message (note/comment) to an activity on Intervals.icu
Args: activity_id: The Intervals.icu activity ID content: The message text to add api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided)
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | ||
| content | Yes | ||
| activity_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the action and the optional API key behavior, but it does not mention side effects, duplicate behavior, permissions, error handling, or what the mutation returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: a single purpose sentence followed by a focused Args list. Every line adds information, especially the environment fallback for api_key, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple three-parameter tool with an output schema present, the parameter documentation and core action are adequate. However, the lack of when-to-use guidance and side-effect context, combined with zero annotations, keeps it at minimally viable rather than fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the Args block provides meaningful semantics for all three parameters: activity_id is the Intervals.icu activity ID, content is the message text, and api_key is optional with an explicit fallback to API_KEY from .env. This goes well beyond the bare schema titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb+resource combination: 'Add a message (note/comment) to an activity on Intervals.icu'. This makes the tool's purpose unambiguous, though it does not explicitly distinguish itself from siblings like get_activity_messages or add_or_update_note.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for adding notes or comments to an activity but provides no explicit guidance on when to use it versus alternatives. Given the sibling list includes similar tools like get_activity_messages and add_or_update_note, explicit routing guidance is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_or_update_eventA
Post event for an athlete to Intervals.icu this follows the event api from intervals.icu If event_id is provided, the event will be updated instead of created.
Many arguments are required as this MCP tool function maps directly to the Intervals.icu API parameters.
Args: athlete_id: The Intervals.icu athlete ID (optional, will use ATHLETE_ID from .env if not provided) api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided) event_id: The Intervals.icu event ID (optional, will use event_id from .env if not provided) start_date: Start date in YYYY-MM-DD format (optional, defaults to today) name: Name of the activity workout_doc: steps as a list of Step objects (optional, but necessary to define workout steps) workout_type: Workout type (e.g. Ride, Run, Swim, Walk, Row) moving_time: Total expected moving time of the workout in seconds (optional) distance: Total expected distance of the workout in meters (optional)
Example: "workout_doc": { "description": "High-intensity workout for increasing VO2 max", "steps": [ {"power": {"value": 80, "units": "%ftp"}, "duration": 900, "warmup": true}, {"reps": 2, "text": "High-intensity intervals", "steps": [ {"power": {"value": 110, "units": "%ftp"}, "distance": 500, "text": "High-intensity"}, {"power": {"value": 80, "units": "%ftp"}, "duration": 90, "text": "Recovery"} ]}, {"power": {"value": 80, "units": "%ftp"}, "duration": 600, "cooldown": true}, {"text": ""} ] }
Step properties: distance: Distance of step in meters {"distance": 5000} duration: Duration of step in seconds {"duration": 1800} power/hr/pace/cadence: Define step intensity Percentage of FTP: {"power": {"value": 80, "units": "%ftp"}} Absolute power: {"power": {"value": 200, "units": "w"}} Heart rate: {"hr": {"value": 75, "units": "%hr"}} Heart rate (LTHR): {"hr": {"value": 85, "units": "%lthr"}} Cadence: {"cadence": {"value": 90, "units": "cadence"}} Pace by ftp: {"pace": {"value": 80, "units": "%pace"}} Pace by zone: {"pace": {"value": 2, "units": "pace_zone"}} Zone by power: {"power": {"value": 2, "units": "power_zone"}} Zone by heart rate: {"hr": {"value": 2, "units": "hr_zone"}} Ranges: Specify ranges for power, heart rate, or cadence: {"power": {"start": 80, "end": 90, "units": "%ftp"}} Ramps: Instead of a range, indicate a gradual change in intensity (useful for ERG workouts): {"ramp": true, "power": {"start": 80, "end": 90, "units": "%ftp"}} Repeats: include the reps property and add nested steps {"reps": 3, "steps": [ {"power": {"value": 110, "units": "%ftp"}, "distance": 500, "text": "High-intensity"}, {"power": {"value": 80, "units": "%ftp"}, "duration": 90, "text": "Recovery"} ]} Free Ride: Include freeride to indicate a segment without ERG control, optionally with a suggested power range: {"freeride": true, "power": {"value": 80, "units": "%ftp"}} Comments and Labels: Add descriptive text to label steps: {"text": "Warmup"}
How to use steps:
Set distance or duration as appropriate for step
Use "reps" with nested steps to define repeat intervals (as in example above)
Define one of "power", "hr" or "pace" to define step intensity
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| api_key | No | ||
| distance | No | ||
| event_id | No | ||
| athlete_id | No | ||
| start_date | No | ||
| moving_time | No | ||
| workout_doc | No | ||
| workout_type | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, this carries the full burden. It explains that the tool creates or updates an event depending on event_id, that auth falls back to .env values, and covers workout step behavior in detail. However, it does not say whether an update replaces fields partially or fully, what side effects an update has, or what response to expect, so transparency is incomplete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is long, but the tool's nested step structure justifies most of it; the opening is front-loaded and the sections (Args, Example, Step properties, How to use) are clearly organized. Some repetition exists in the Step examples, but it does not obscure the essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For high complexity and an output schema, this is close to complete: it gives a full example, enumerates step construction patterns, and explains defaults. It falls short on the ambiguous event_id/.env update behavior and the misleading 'many arguments are required' statement, and it leaves some WorkoutDoc fields undocumented, so a few edge cases could trip up an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 0% coverage, so the description must compensate, and it does: top-level args get units, defaults, and env fallbacks, and Step properties get examples for power/hr/pace/cadence, ranges, ramps, repeats, and freeride. It is not exhaustive—several WorkoutDoc fields (ftp, lthr, target, locales, options) are absent and 'many arguments are required' conflicts with the schema's two required fields—but it adds substantial meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names the action ('Post event'), the target resource (Intervals.icu), and the audience ('for an athlete'), then clarifies the create-vs-update behavior when event_id is present. This is enough for an agent to distinguish it from sibling event tools like get_events or delete_event.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly gives the create/update branch: if event_id is provided, update instead of create, and notes that many arguments map directly to the API. It does not enumerate when to prefer siblings such as delete_event or get_events, but the main decision point is covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_or_update_noteA
Add or update a plain text note (category NOTE) on the Intervals.icu calendar.
Args: name: Title of the note description: Plain text content of the note start_date: Date in YYYY-MM-DD format (optional, defaults to today) color: Color of the note (e.g. green, orange, red, blue) athlete_id: The Intervals.icu athlete ID (optional) api_key: The Intervals.icu API key (optional) event_id: The Intervals.icu event ID (optional, for updates)
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| color | No | green | |
| api_key | No | ||
| event_id | No | ||
| athlete_id | No | ||
| start_date | No | ||
| description | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral disclosure burden. It says 'Add or update' and notes that event_id is for updates, but does not explain mutation side effects, auth requirements, whether an update without event_id creates a duplicate or errors, or how existing data is affected. This is a material gap for a write-capable tool with no annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description opens with one clear purpose sentence and then uses a compact argument list with no redundant prose. Each line adds information not inferable from the parameter name alone, and the format is scannable for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description plus output schema covers parameter invocation fairly well, but for a mutation tool with no annotations it leaves gaps around update-versus-create behavior, required auth context, and possible failure modes. The event_id update hint is useful, but an agent still lacks enough context to know what happens when adding a note that already exists or updating with a missing/invalid event_id.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, so the description must compensate, and it does. Every parameter gets a meaningful natural-language explanation: name and description semantics, start_date format and default, color examples, athlete_id/api_key optionality, and event_id's role in updates. This gives an agent enough to correctly populate arguments.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Add or update') and the resource ('a plain text note (category NOTE) on the Intervals.icu calendar'), using a specific verb and target. It distinguishes itself from sibling tools like add_or_update_event by noting the note category explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for notes via 'plain text note (category NOTE)' and gives update guidance through 'event_id: optional, for updates', but it never explicitly states when to prefer this tool over add_or_update_event or other note/event tools. Usage context is present but not fully developed, and no exclusions or alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_custom_itemB
Create a new custom item for an athlete on Intervals.icu
Args: name: Name of the custom item item_type: Type of custom item (e.g. FITNESS_CHART, TRACE_CHART, INPUT_FIELD, ACTIVITY_FIELD, INTERVAL_FIELD, ACTIVITY_STREAM, ACTIVITY_CHART, ACTIVITY_HISTOGRAM, ACTIVITY_HEATMAP, ACTIVITY_MAP, ACTIVITY_PANEL, ZONES) athlete_id: The Intervals.icu athlete ID (optional, will use ATHLETE_ID from .env if not provided) api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided) description: Description of the custom item (optional) content: Configuration content for the custom item as a dict (optional). Important enum values: - "type" field for INPUT_FIELD/ACTIVITY_FIELD: must be "numeric", "text", or "select" (NOT "number") - "aggregate" field: must be "MIN", "SUM", "MAX", or "AVERAGE" (NOT "AVG") visibility: Visibility setting: PRIVATE, FOLLOWERS, or PUBLIC (optional)
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| api_key | No | ||
| content | No | ||
| item_type | Yes | ||
| athlete_id | No | ||
| visibility | No | ||
| description | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It states the create side effect and mentions auth fallback via athlete_id/api_key, but it does not disclose constraints, duplicate-name behavior, required permissions, or any failure/validation traits. This is thin for a mutating tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The one-sentence purpose followed by a compact Args list is well structured and front-loaded. But the corrupted content line undermines the clarity, and the list could be tightened without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter create tool with an output schema, the description covers all parameter names and several enums, so basic invocation is possible. It is not complete for more complex item types because the required shape of the content dict is under-specified and no guidance addresses conditional requirements.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates by listing every parameter and adding value: item_type examples, visibility options, env-var fallback for auth, and note that content is a dict. However, the content configuration details are incomplete and the allowed 'type' bullet is garbled/self-contradictory, so it only partially compensates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence uses a specific verb and resource: create a new custom item for an athlete on Intervals.icu. The word 'new' clearly distinguishes it from the update_custom_item, get_custom_items, and delete_custom_item siblings without needing to inspect their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The action is clear but there is no explicit when-to-use guidance or mention of alternatives. An agent can infer that it should be used for creating rather than updating or deleting, but the description relies entirely on that implication.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_custom_itemA
Delete a custom item for an athlete from Intervals.icu
Args: item_id: The custom item ID to delete athlete_id: The Intervals.icu athlete ID (optional, will use ATHLETE_ID from .env if not provided) api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided)
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | ||
| item_id | Yes | ||
| athlete_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It states that the tool deletes a custom item, implying destructive effect, but says nothing about irreversibility, permissions, impact on related data, or error behavior. The .env fallback for athlete_id and api_key is a useful behavioral detail, but the overall transparency is thin for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: one clear purpose sentence followed by a tight Args list. Every sentence earns its place, with no filler or redundant content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description fully covers the parameter semantics and the main operation, and an output schema exists, so return values are not required. However, it lacks usage guidance, a permanence warning, and any clarification of what exactly is deleted or not deleted. Given the zero annotations and destructive nature, a few more sentences would make it complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the Args section must compensate. It does so effectively: item_id is described as the custom item ID to delete, while athlete_id and api_key are explained as optional with .env fallback. This adds meaningful context beyond the bare schema, especially the default behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Delete a custom item for an athlete from Intervals.icu.' This clearly distinguishes it from siblings like delete_event, get_custom_item_by_id, create_custom_item, and update_custom_item. The agent can identify the tool's exact purpose without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives such as delete_event or update_custom_item. There are no prerequisites, no exclusions, and no mention of when deletion is appropriate or not. The description only states what the tool does, not when to select it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_eventB
Delete event for an athlete from Intervals.icu Args: athlete_id: The Intervals.icu athlete ID (optional, will use ATHLETE_ID from .env if not provided) api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided) event_id: The Intervals.icu event ID
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | ||
| event_id | Yes | ||
| athlete_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It only states the deletion action and parameter fallback behavior, but does not disclose irreversibility, side effects, authorization requirements, error behavior, or what the response contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: a one-sentence purpose followed by a terse Args block. Each line earns its place and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple three-parameter delete operation with an output schema present, so the action and parameter list are largely sufficient. However, it lacks explicit differentiation from delete_events_by_date_range and does not provide behavioral caveats such as permanence or failure behavior, making it adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description compensates by documenting all three parameters. It adds useful semantics, especially the .env fallback for athlete_id and api_key and the required nature of event_id, though it does not elaborate on ID formats or constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource: 'Delete event for an athlete from Intervals.icu.' It implies deleting a single event by event_id, which distinguishes it from sibling delete_events_by_date_range, but it does not explicitly name or contrast that alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance is provided. The description does not mention that this tool is for deleting a single event versus using delete_events_by_date_range for bulk deletion, nor does it state any prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_events_by_date_rangeA
Delete events for an athlete from Intervals.icu in the specified date range.
Args: athlete_id: The Intervals.icu athlete ID (optional, will use ATHLETE_ID from .env if not provided) api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided) start_date: Start date in YYYY-MM-DD format end_date: End date in YYYY-MM-DD format
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | ||
| end_date | Yes | ||
| athlete_id | No | ||
| start_date | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It clearly states that this is a delete operation, but it does not mention whether deletion is permanent/irreversible, whether all events in the range are affected, whether any confirmation is required, or what side effects may occur. For a destructive bulk operation, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a clear one-sentence purpose, followed by a compact Args list. Every line provides useful information and there is no fluff, repetition, or irrelevant detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value documentation is not required. However, for a destructive tool with no annotations, the description omits important operational context such as irreversibility, range inclusivity, and potential impact on related data. The parameter documentation is strong, but the behavioral context is incomplete for safe use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description compensates well by documenting all four parameters. It explains that athlete_id and api_key are optional and fall back to .env values, and it specifies the YYYY-MM-DD format for start_date and end_date. It could add date-range boundary semantics (inclusive/exclusive) but otherwise adds substantial meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Delete'), a resource ('events for an athlete from Intervals.icu'), and a clear scope ('in the specified date range'). This also distinguishes it from the sibling delete_event, which addresses a single event rather than a date-range bulk deletion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage context is implied by the name and description: use this tool when deleting multiple events by date range. However, it does not explicitly contrast it with alternatives like delete_event or explain when one should be preferred over the other, so guidance is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_activitiesA
Get a list of activities for an athlete from Intervals.icu
Args: athlete_id: The Intervals.icu athlete ID (optional, will use ATHLETE_ID from .env if not provided) api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided) start_date: Start date in YYYY-MM-DD format (optional, defaults to 30 days ago) end_date: End date in YYYY-MM-DD format (optional, defaults to today) limit: Maximum number of activities to return (optional, defaults to 10) include_unnamed: Whether to include unnamed activities (optional, defaults to False)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| api_key | No | ||
| end_date | No | ||
| athlete_id | No | ||
| start_date | No | ||
| include_unnamed | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses meaningful behavior: date range defaults, default limit, include_unnamed behavior, and fallback to .env credentials. It does not cover error handling, ordering, or pagination, but the key operational defaults and auth fallback are well documented.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is economically structured: a one-sentence purpose summary followed by a clean Args list. Each line adds concrete information about requiredness, defaults, or formatting, with no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter tool with no annotations and 0% schema description coverage, the description covers almost everything an agent needs: defaults, auth fallback, date format, and the include_unnamed flag. It does not mention ordering or constraints like start_date before end_date, but the presence of an output schema mitigates the need to describe return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain all parameters, and it does. Every parameter is listed with type, optionality, default, and additional meaning—including the .env fallback for athlete_id and api_key, and the YYYY-MM-DD format for dates. This fully compensates for the sparse schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Get a list of activities') on a specific resource ('for an athlete from Intervals.icu'), which clearly distinguishes it from sibling tools like get_activity_details or get_activity_raw. The one-line summary plus parameter list makes the tool's purpose immediately understandable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on defaults and optional parameters, showing how the tool is typically invoked. However, it does not explicitly state when to use this tool versus a sibling such as get_activity_details or get_activity_intervals, so usage guidance relies on inference from the tool name and summary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_activity_detailsA
Get detailed information for a specific activity from Intervals.icu
Args: activity_id: The Intervals.icu activity ID api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided)
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | ||
| activity_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It communicates that this is a read-style operation and provides auth context by noting the API key is optional and falls back to API_KEY from .env. However, it does not disclose output shape, error behavior, rate limits, or what 'detailed information' concretely includes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loaded with the core action, and uses a clean Args block for parameter details. Every sentence earns its place without redundant exposition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple fetch-by-ID tool, the description covers the operation, the service source, both parameters, and the auth fallback behavior. The existence of an output schema partially accounts for the lack of return-value documentation. Its main gap is not explaining when this tool should be selected over competing activity-fetching siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides no parameter descriptions, and the context notes 0% schema coverage, so the description must compensate. It does so clearly: activity_id is defined as 'The Intervals.icu activity ID', and api_key is explained as optional with an env fallback. This gives an agent enough semantic grounding to invoke the tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get') and the resource ('detailed information for a specific activity from Intervals.icu'), making the tool's basic purpose understandable. However, it does not differentiate it from sibling tools like get_activity_raw, get_activity_intervals, or get_activity_streams, so an agent may still be unsure which activity-related fetch tool to choose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool versus the many sibling tools that also fetch activity data. The description only defines what the tool does and its parameters; it does not state prerequisites, exclusions, or alternatives. An agent is left to infer usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_activity_intervalsA
Get interval data for a specific activity from Intervals.icu
This endpoint returns detailed metrics for each interval in an activity, including power, heart rate, cadence, speed, and environmental data. It also includes grouped intervals if applicable.
Args: activity_id: The Intervals.icu activity ID api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided)
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | ||
| activity_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It discloses what the endpoint returns (power, heart rate, cadence, speed, environmental data, grouped intervals) and the API-key fallback behavior, which is useful for correct invocation. It does not cover rate limits or error behavior, but these are less critical for a read-only retrieval tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the primary purpose, then gives return details and parameter guidance without repetition. Every sentence contributes meaningful invocation information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter retrieval tool with an output schema, the description covers purpose, parameter meaning, auth behavior, and the shape of returned data. It could be slightly more complete by stating explicit usage boundaries versus sibling activity endpoints, but nothing critical is missing for invoking it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 0% description coverage, but the Args section documents both parameters: activity_id is identified as the Intervals.icu activity ID and api_key is explained as optional with a .env fallback. This fully compensates for the empty schema property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific action ('Get') and a distinct resource ('interval data for a specific activity'), which separates it from sibling tools like get_activity_streams or get_activity_raw. The following sentence reinforces the scope by listing the interval-level metrics returned.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys that the tool is for retrieving interval-level metrics and grouped intervals, so an agent can infer appropriate use. However, it does not explicitly state when to prefer this over alternatives or mention exclusions, leaving selection mostly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_activity_messagesA
Get messages (notes/comments) for a specific activity from Intervals.icu
Args: activity_id: The Intervals.icu activity ID api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided)
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | ||
| activity_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the transparency burden. It conveys a read-only 'Get' operation and explains API key fallback behavior, which is useful. However, it does not disclose error behavior, rate limits, or what happens if the activity_id is invalid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, with a clear first sentence followed by an Args list. Minor redundancy like repeating 'Intervals.icu' in both the summary and arg explanations does not significantly harm readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low parameter count, no nested objects, and the presence of an output schema, the description covers the essential invocation details: required ID and auth handling. It lacks explicit alternative routing and error-condition context, but is otherwise sufficient for a simple read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does. It explains that activity_id is the Intervals.icu activity ID and that api_key is optional, falling back to API_KEY from .env. This adds meaningful semantic context beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'messages (notes/comments) for a specific activity.' It effectively differentiates from siblings like get_activity_details or get_activity_raw by specifying the message resource, though it does not explicitly name alternative tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: when you need messages/comments for a specific activity. However, it provides no explicit guidance on when not to use it or which sibling alternatives (e.g., add_activity_message, get_activity_details) would be more appropriate for related needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_activity_rawA
DIAGNOSTIC TOOL (temporary): return the raw JSON the Intervals.icu API sends back for one activity, unmodified. Used to debug why get_activity_details/get_activities show blank fields for some accounts (field-name mismatch investigation). Safe to remove once the mapping bug is confirmed fixed.
Args: activity_id: The Intervals.icu activity ID api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided)
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | ||
| activity_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the behavioral disclosure burden. It clearly discloses that the tool returns raw, unmodified JSON and is temporary in nature, and it explains the API key fallback to .env. It does not explicitly state that the tool has no write side effects, but the 'get' + raw-return framing makes this a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a diagnostic label, followed by a concise behavior statement and a short usage context. The Args section is compact and every sentence earns its place without unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists, the return value does not need to be described further. The description covers the tool's purpose, when to use it, its temporary lifespan, both parameters, and its relationship to the affected siblings, leaving no essential gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description fully compensates by explaining activity_id as the Intervals.icu activity ID and api_key as optional with a clear fallback to API_KEY from .env. This adds meaning well beyond the bare schema titles and types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'DIAGNOSTIC TOOL (temporary)' and states the exact action: 'return the raw JSON the Intervals.icu API sends back for one activity, unmodified.' It explicitly names get_activity_details/get_activities as the tools whose blank-field behavior it diagnoses, clearly distinguishing it from those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit use case: debug why get_activity_details/get_activities show blank fields due to a field-name mismatch. It also says 'Safe to remove once the mapping bug is confirmed fixed,' which communicates that this is not a general-purpose tool and should only be used for that investigation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_activity_streamsA
Get stream data for a specific activity from Intervals.icu
This endpoint returns time-series data for an activity, including metrics like power, heart rate, cadence, altitude, distance, temperature, and velocity data.
Args: activity_id: The Intervals.icu activity ID api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided) stream_types: Comma-separated list of stream types to retrieve (optional, defaults to all available types) Available types: time, watts, heartrate, cadence, altitude, distance, core_temperature, skin_temperature, velocity_smooth
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | ||
| activity_id | Yes | ||
| stream_types | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral transparency burden and does a solid job: it discloses that api_key is optional and falls back to API_KEY from .env, that stream_types defaults to all available types, and that the endpoint returns time-series data across many metrics. It does not discuss errors or rate limits, but the output schema reduces the need for detailed return-value explanation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well structured with a concise summary followed by an Args list. The first sentence is mildly redundant with the rest of the summary, but the included metric enumeration and parameter explanations earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
All three parameters are documented with defaults and options, and an output schema is present, covering return-value expectations. The main missing context is explicit routing among sibling activity tools and failure/error behavior, but for a read-only stream retrieval tool this is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does thoroughly. It explains activity_id, api_key's optionality and .env fallback, and stream_types' comma-separated format, default behavior, and the full list of available stream types. This is exactly the parameter-level detail the schema omits.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and resource: 'Get stream data for a specific activity from Intervals.icu' and clarifies that it returns time-series metrics. It clearly identifies the tool's purpose, though it does not explicitly differentiate it from siblings like get_activity_raw or get_activity_intervals.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the intended use case: retrieving time-series stream data for an activity. However, it provides no explicit guidance about when to prefer this tool over alternatives such as get_activity_raw or get_activity_details, leaving an agent to infer the distinction from context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_athlete_power_curvesA
Get power curves for an athlete from Intervals.icu.
Returns best power output for selected durations across specified time periods. Uses FFT power computation. Power values are in watts.
Args: activity_type: Activity type (e.g. "Ride", "Run", "VirtualRide"). Default is "Ride". durations: Durations in seconds to include. Default is [5, 15, 30, 60, 120, 300, 600, 1200, 3600] indoor_outdoor: Filter by location — "indoor" or "outdoor". Omit for no filtering. start_date: Start date (YYYY-MM-DD) for custom date range curve. Must be used with end_date. end_date: End date (YYYY-MM-DD) for custom date range curve. Must be used with start_date. this_season: Include this season's curve (default True) last_season: Include last season's curve (default True) include_normalised: Include weight-normalised W/kg values (default True) athlete_id: Intervals.icu athlete ID (optional, uses ATHLETE_ID from .env if not provided) api_key: Optional API key override. Uses API_KEY from .env if not provided.
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | ||
| end_date | No | ||
| durations | No | ||
| athlete_id | No | ||
| start_date | No | ||
| last_season | No | ||
| this_season | No | ||
| activity_type | No | Ride | |
| indoor_outdoor | No | ||
| include_normalised | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It usefully adds that the tool uses FFT power computation, reports values in watts, and returns best power for selected durations. It does not discuss authentication, rate limits, or side effects, but 'Get' and the stated purpose strongly imply a read-only operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well structured: a one-sentence purpose, a concise behavioral note, and an Args block. It is front-loaded with the key facts and every sentence adds useful information without unnecessary fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter tool with no annotations and an output schema, the description is mostly complete: it explains purpose, computation method, units, and most parameters. The main gaps are the undocumented include_normalised parameter and lack of explicit guidance on auth/athlete identification, but overall an agent can call this tool effectively from the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It documents most parameters with helpful details: defaults, example values, allowed location filters, date format, and the mutual requirement between start_date and end_date. However, it omits explicit descriptions of include_normalised, athlete_id, and api_key, though those are largely inferable from their names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and resource ('power curves for an athlete from Intervals.icu'), and clearly states the output: best power output for selected durations across specified time periods. This distinguishes it from sibling tools like get_activities or get_activity_raw without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the tool's context clear: it is for retrieving power-curve data for an athlete, not for activity lists or raw streams. It does not explicitly name alternatives or state when not to use it, but the purpose is concrete enough that an agent can infer appropriate use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_custom_item_by_idA
Get detailed information for a specific custom item from Intervals.icu
Args: item_id: The custom item ID athlete_id: The Intervals.icu athlete ID (optional, will use ATHLETE_ID from .env if not provided) api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided)
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | ||
| item_id | Yes | ||
| athlete_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavior disclosure. 'Get' implies a read-only operation, and the Args section usefully explains that athlete_id and api_key fall back to environment variables. However, it does not explicitly state side-effect safety, error behavior, or any API-specific constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded: a clear one-line purpose is followed by a compact Args list. No filler or redundant content is present, and every sentence contributes useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read operation with an output schema, the description is sufficiently complete. It identifies the source system, required and optional parameters, and the auth fallback strategy. Since an output schema exists, not explaining return values is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description compensates by documenting all three parameters: item_id as the target ID, and athlete_id/api_key as optional credentials with explicit .env fallback behavior. This adds meaning beyond the raw schema by clarifying default resolution and optionality.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get', the resource ('detailed information for a specific custom item'), and the source system ('Intervals.icu'). The singular 'specific' distinguishes it from the sibling get_custom_items, which is best interpreted as a list operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is provided about when to use this tool instead of alternatives such as get_custom_items, get_activity_details, or get_event_by_id. The only selection hint is the phrase 'specific custom item' plus the tool name itself, which leaves usage context implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_custom_itemsA
Get custom items (charts, custom fields, zones, etc.) for an athlete from Intervals.icu
Args: athlete_id: The Intervals.icu athlete ID (optional, will use ATHLETE_ID from .env if not provided) api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided)
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | ||
| athlete_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral transparency burden. It does disclose that both parameters are optional and fall back to environment variables, which is useful. However, it does not mention response shape, whether a list is always returned, pagination, possible auth failures, or other runtime behavior. The read-only 'Get' verb is present but not explicitly framed as a safe operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a single front-loaded purpose sentence followed by an Args block. No fluff or irrelevant detail. Every sentence serves a functional role, and the structure makes parameter behavior easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple read-oriented nature of the tool and the presence of an output schema, the description covers the main invocation contract: what is retrieved, for whom, and how authentication is handled. The main missing piece is explicit routing to/from sibling tools, especially get_custom_item_by_id, and any caveats about empty results or auth errors. Overall it is close to complete for a straightforward list endpoint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It clearly explains both parameters: athlete_id is the Intervals.icu athlete ID and api_key is the API key, and it notes that each falls back to a .env variable if omitted. This adds meaningful semantics beyond the bare schema and gives the agent enough to invoke the tool correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: 'Get custom items' with examples (charts, custom fields, zones) and the athlete scope. It doesn't explicitly distinguish from the sibling get_custom_item_by_id, but the plural 'items' and 'etc.' communicate a broader retrieval intent. This is more than a tautology and gives an agent a concrete sense of what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to prefer this tool over alternatives such as get_custom_item_by_id, create_custom_item, or update_custom_item. The description explains argument fallbacks but does not provide any when-to-use or when-not-to-use context. The agent is left to infer use cases from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_event_by_idB
Get detailed information for a specific event from Intervals.icu
Args: event_id: The Intervals.icu event ID athlete_id: The Intervals.icu athlete ID (optional, will use ATHLETE_ID from .env if not provided) api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided)
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | ||
| event_id | Yes | ||
| athlete_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It usefully discloses that athlete_id and api_key fall back to .env values, and 'Get' implies a read operation, but it does not describe not-found behavior, error cases, or confirm that no modifications occur.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is a clear, front-loaded summary, and the Args block is organized without fluff. It is slightly redundant with the schema but each line adds some value, especially the environment-variable fallback notes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple get-by-id tool with an output schema, the key call parameters are covered. However, the absence of usage differentiation and behavioral caveats (e.g., 404/error handling) leaves the description slightly incomplete for an agent choosing among many sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description compensates for all three parameters: event_id is identified as the Intervals.icu event ID, while athlete_id and api_key receive meaningful optionality and .env fallback semantics not present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence specifies the verb ('Get'), the resource ('event'), and the scope ('specific event') from Intervals.icu. It distinguishes from list-like siblings such as get_events, but it does not explicitly name an alternative or contrast itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to prefer this tool over get_events or other event tools, and no mention that the caller must already have an event_id. The usage context is only implied by the word 'specific'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_eventsA
Get events for an athlete from Intervals.icu
Args: athlete_id: The Intervals.icu athlete ID (optional, will use ATHLETE_ID from .env if not provided) api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided) start_date: Start date in YYYY-MM-DD format (optional, defaults to today) end_date: End date in YYYY-MM-DD format (optional, defaults to 30 days from today)
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | ||
| end_date | No | ||
| athlete_id | No | ||
| start_date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It does reveal useful behavior: optional athlete_id and api_key fall back to .env values, and dates default to today and 30 days out. However, it does not mention read-only semantics, error cases when credentials are missing, pagination, or any external API call behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: a one-sentence purpose line followed by a brief Args block. Every line adds useful information, and there is no redundant fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with an output schema present and all parameters documented, the description is nearly complete. The main missing piece is guidance about how it relates to get_event_by_id and whether it returns all events or only filtered ones beyond the date range. Still, an agent can invoke it correctly using the provided parameter details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully compensates by documenting all four parameters with format, optionality, and defaults: athlete_id, api_key, start_date, end_date. It explains the YYYY-MM-DD format and the .env fallback behavior, adding meaning well beyond the bare schema types and null defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool does: 'Get events for an athlete from Intervals.icu'. It is an explicit verb plus resource and source. However, it does not explicitly distinguish itself from get_event_by_id or other event-related siblings, so it falls just short of the strongest possible clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides parameter-level usage details like date defaults and .env fallbacks, but it gives no guidance on when to choose this tool over get_event_by_id, add_or_update_event, or delete_event. There is no when-to-use or when-not-to-use context beyond the implied purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gear_listA
Get the gear catalog (bikes, shoes, etc.) for an athlete from Intervals.icu.
Returns one line per gear item with id, type, name, and basic stats. The result is cached for the MCP process lifetime; pass refresh=True to re-fetch.
Args: athlete_id: The Intervals.icu athlete ID (optional, will use ATHLETE_ID from .env if not provided) api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided) refresh: If True, bypass the cache and re-fetch from the API (default False)
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | ||
| refresh | No | ||
| athlete_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses that results are cached for the MCP process lifetime, that refresh=True bypasses the cache, and that credentials fall back to environment variables. It also describes the return format. It does not discuss rate limits, errors, or pagination, but for a simple read-only catalog fetch the provided transparency is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and return shape, then gives a compact, well-organized Args section. Every sentence adds actionable information: what is fetched, what the output looks like, how caching works, and how parameters behave. No filler or redundant restatement of the tool name is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with a provided output schema, the description is complete. It explains the data source, return granularity, caching semantics, authentication fallbacks, and refresh override. An agent has enough information to invoke the tool correctly without additional documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain the parameters, and it does so thoroughly. athlete_id, api_key, and refresh each receive a plain-language explanation including optionality, environment-variable fallback, and default behavior. This fully compensates for the schema's lack of descriptive text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Get the gear catalog (bikes, shoes, etc.) for an athlete from Intervals.icu.' It also clarifies the output shape ('one line per gear item with id, type, name, and basic stats'), making the tool's purpose unmistakable. No sibling tool focuses on gear catalog, so it is effectively distinguished from the provided alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: this is the gear-list retrieval endpoint for an athlete, with caching behavior and optional authentication via environment variables. It does not explicitly exclude alternatives or provide when-to-use versus when-not-to-use guidance, but the purpose is specific enough that an agent can infer when to call it. There are no misleading usage signals.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_wellness_dataA
Get wellness data for an athlete from Intervals.icu.
By default returns standard wellness fields (training metrics, vitals, sleep, subjective scores, etc.). Set include_all_fields=True to also include any additional or custom fields configured by the user in Intervals.icu.
Args: athlete_id: The Intervals.icu athlete ID (optional, will use ATHLETE_ID from .env if not provided) api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided) start_date: Start date in YYYY-MM-DD format (optional, defaults to 30 days ago) end_date: End date in YYYY-MM-DD format (optional, defaults to today) include_all_fields: If True, include additional and custom fields beyond the standard set (optional, defaults to False)
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | ||
| end_date | No | ||
| athlete_id | No | ||
| start_date | No | ||
| include_all_fields | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It does so well by revealing that standard fields are returned by default, that include_all_fields=True extends to custom fields, that athlete_id and api_key optionally fall back to .env values, and that dates default to a 30-day window. It does not mention error behavior or rate limits, but it adequately describes what the tool does at invocation time.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately sized and well-structured: a purpose sentence, a sentence about behaviors, and a logical Args block. The Args lines repeat parameter names from the schema but add valuable default and format context, so nothing is wasted. It could be slightly tighter, but it remains readable and front-loaded with the core function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given five all-optional parameters and an existing output schema, the description supplies enough to call the tool correctly: parameter defaults, credential sources, date formats, and the field-scoping flag. There is no need to describe return values because the output schema exists. Minor omissions like invalid-input handling do not impede correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description is the sole source of param meaning. It fully compensates by documenting all five parameters in the Args section, adding format specifics (YYYY-MM-DD), default values (30 days ago, today, False), and the .env fallback for credentials. This is exactly the semantics an agent needs beyond raw JSON schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get wellness data for an athlete from Intervals.icu.' It then enumerates the content domains (training metrics, vitals, sleep, subjective scores), which clearly separates it from sibling tools focused on activities, events, gear, and custom items. There is no ambiguity about what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes a clear use context: whenever an agent needs wellness data for an athlete. It also gives practical guidance on the include_all_fields flag, explaining when to set it to True. It does not explicitly name alternative tools or state when not to use it, but the semantics of 'wellness data' are distinct enough among the siblings to provide clear direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_custom_itemA
Update an existing custom item for an athlete on Intervals.icu
Args: item_id: The custom item ID to update athlete_id: The Intervals.icu athlete ID (optional, will use ATHLETE_ID from .env if not provided) api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided) name: New name for the custom item (optional) item_type: New type for the custom item (optional) description: New description for the custom item (optional) content: New configuration content for the custom item as a dict (optional). Important enum values: - "type" field for INPUT_FIELD/ACTIVITY_FIELD: must be "numeric", "text", or "select" (NOT "number") - "aggregate" field: must be "MIN", "SUM", "MAX", or "AVERAGE" (NOT "AVG") visibility: New visibility setting: PRIVATE, FOLLOWERS, or PUBLIC (optional)
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| api_key | No | ||
| content | No | ||
| item_id | Yes | ||
| item_type | No | ||
| athlete_id | No | ||
| visibility | No | ||
| description | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses optional auth defaults from .env and important enum constraints for content fields, but does not state whether the update is partial or full replacement, what happens to unspecified fields, or what the response indicates. This is partial transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose statement is front-loaded, followed by a structured Args list. The content is detailed but not redundant, though it could trim some obvious parameter names; overall it is well organized and every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 8 parameters, no schema descriptions, and no annotations, the description covers all parameters and key constraints. It omits explicit update semantics but the presence of an output schema reduces the need to document return values, so this is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does. It explains the meaning of all 8 parameters, including the item_id, optional athlete_id/api_key fallback behavior, and the required enum values for content.type and content.aggregate, adding value beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific action and resource: 'Update an existing custom item for an athlete on Intervals.icu.' This clearly distinguishes it from sibling tools like create_custom_item, delete_custom_item, and get_custom_item_by_id.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through the verb 'Update' and lists optional fields, but it does not explicitly state when to prefer this over create_custom_item or delete_custom_item, nor mention any preconditions such as the item needing to exist.
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.
21 tool updates
v0.1.0- First observed
add_activity_message - First observed
add_or_update_event - First observed
add_or_update_note - First observed
create_custom_item - First observed
delete_custom_item - First observed
delete_event - First observed
delete_events_by_date_range - First observed
get_activities - First observed
get_activity_details - First observed
get_activity_intervals - First observed
get_activity_messages - First observed
get_activity_raw - First observed
get_activity_streams - First observed
get_athlete_power_curves - First observed
get_custom_item_by_id - First observed
get_custom_items - First observed
get_event_by_id - First observed
get_events - First observed
get_gear_list - First observed
get_wellness_data - First observed
update_custom_item
TDQS
Scored across 21 tools
Most tools target distinct resources or distinct data views (list vs details vs streams vs intervals), so selection is usually clear. The main potential confusions are get_activity_details vs get_activity_raw and add_or_update_event vs add_or_update_note, but the descriptions distinguish these adequately.
The tool names largely follow a consistent verb_noun pattern: get_, create_, update_, delete_, and add_or_update_. Minor deviations like add_activity_message instead of add_or_update_activity_message and get_gear_list instead of get_gears are acceptable but keep it from being perfectly uniform.
21 tools is on the higher side, but the server covers a broad API surface: activities, events, notes, custom items, gear, wellness, and power curves. The included diagnostic tool get_activity_raw adds some bloat, but overall the count is reasonable for the domain.
The tool set covers the main lifecycle needs for activities, events, and custom items, with good read/write coverage. Minor gaps exist, such as no delete_note, no activity update/delete, and read-only gear access, but agents can complete most typical workflows without dead ends.
Maintenance
Related MCP Connectors
Connect Claude to your Intervals.icu watch data for fitness, workout review, and plan writing.
Garmin data in Claude & ChatGPT via the Garmin Health API. OAuth sign-in, no password sharing.
Garmin data in Claude: 135 tools — activities, sleep, HRV, training, workouts. Free, open source.
- SomviaOAuthapp.somvia
Private Apple Health metrics and workout detail for ChatGPT, Claude, and any MCP client.
Related MCP Servers
- AlicenseAqualityCmaintenanceConnects Claude with the Intervals.icu API to retrieve fitness data including activities, workouts, wellness metrics, and training events.10345GPL 3.0
- FlicenseAqualityDmaintenanceEnables 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-
- FlicenseAqualityDmaintenanceEnables AI assistants to access and analyze intervals.icu training data including activities, fitness metrics (CTL/ATL/TSB), wellness stats, and calendar events. Supports natural language querying of athletic performance for training insights and workout planning.6-
- AlicenseNot gradedqualityBmaintenanceEnables Claude AI to access and manage intervals.icu training data, including workouts, wellness, and fitness trends, through natural language conversation.MIT