intervals-mcp
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-mcpCreate a draft plan for next 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 MCP
Local Python client and MCP server for analyzing an Intervals.icu account, building AI-assisted training plans, and applying only managed drafts to the calendar after explicit confirmation.
Intervals.icu is the operational source of truth. When an account is connected to Garmin Connect, this MCP can also read the Garmin-derived activities and wellness data exposed by Intervals.icu. It does not call the Garmin API directly.
Quick start
Install the project and create your local configuration:
uv sync --dev
cp .env.example .env
cp PERSONAL.example.md PERSONAL.mdSet INTERVALS_API_KEY in .env, then register the local MCP server with Codex:
codex mcp add intervals_icu -- \
uv run --directory /absolute/path/to/intervals-mcp intervals-mcpRestart Codex if it was already open, then use /mcp to confirm that intervals_icu is connected. You can now ask Codex things such as:
Read my private training context and list my managed Intervals.icu draft plans.
Read my recent training context and summarize the last two weeks.
Create a draft plan for next week, but show me the preview before writing anything.The server is local and communicates over stdio. It does not send data to a separate service. Read operations can run immediately; every mutation first returns a preview and requires a second call with confirmed=true after explicit approval. Scheduling can make workouts available for Garmin synchronization, but Garmin delivery must still be verified separately.
For Claude Code, use the equivalent command in Connect to Claude Code. For detailed setup, safety rules, and development commands, continue below.
Codex or Claude Code
│
▼ MCP (stdio)
intervals-mcp ──────── Intervals.icu API
│
▼
Library: [IA] ...
│
athlete review
│
apply plan in Intervals
│
▼
Calendar → GarminRelated MCP server: intervals.icu-mcp
Why a skill plus MCP
The skill teaches the LLM the training workflow, workout syntax, and safety guardrails.
The MCP keeps API access outside the conversation context and exposes typed operations.
PERSONAL.example.mdis the tracked template;PERSONAL.mdstores the active athlete's private context and is ignored by Git.The Python client verifies that writes belong to the managed namespace.
Intervals.icu remains the dashboard, calendar, and analysis system.
The MCP provides a deterministic safety boundary around the API: it avoids exposing credentials in prompts and does not provide unrestricted calendar CRUD.
Current capabilities
The server exposes tools for:
Reading private athlete context with
get_personal_contextandset_personal_fact.Reading filtered body and health profile metrics with
get_athlete_profile.Reading activities, wellness, and calendar data with
get_training_contextfor ranges up to 180 days.Reading power, pace, and heart-rate curves with
get_performance_curves.Listing and reading managed plans with
list_draft_plansandget_draft_plan.Creating, cloning, renaming, and editing private managed library plans.
Adding and updating structured workouts inside managed plans.
Applying a managed plan to the calendar from an exact future date with
schedule_draft_plan.Removing only calendar copies from a managed application with
unschedule_draft_plan.Serving
intervals://safety-policy,intervals://personal-context, andintervals://draft-plansresources.Serving the
draft_training_weekMCP prompt.
Generic event create, edit, and delete operations are not exposed. Every mutation first returns a preview with confirmed=false; it can only proceed with confirmed=true after explicit approval.
Local personal memory
Copy PERSONAL.example.md to PERSONAL.md and fill it with the active athlete's private memory. The local file is ignored by Git, and the skill requires reading it before analyzing or changing a plan. Durable information can be stored through set_personal_fact; reusing the same key replaces the previous value.
Store only goals, events, recurring availability, preferences, performance markers, equipment, integrations, and training constraints. Never store examples, guesses, API keys, passwords, tokens, payment data, or sensitive health information unless explicitly requested.
Requirements
Python 3.13 or newer.
uv.An Intervals.icu account and personal API key.
Codex or Claude Code to consume the MCP.
Setup
uv sync --dev
cp .env.example .envThen set INTERVALS_API_KEY in the local .env file. Never commit .env or paste the key into a conversation. Personal Intervals.icu authentication uses HTTP Basic with the literal username API_KEY; the client configures this automatically.
To check read access:
uv run intervals-mcp-cli doctorThe command only lists library containers and does not write anything.
Run and inspect the MCP
uv run intervals-mcpThe process waits for JSON-RPC messages on stdin; this is expected. For visual inspection, use:
uv run mcp dev src/intervals_mcp/mcp_server.py
npx -y @modelcontextprotocol/inspector uv run intervals-mcpConnect to Codex
codex mcp add intervals_icu -- \
uv run --directory /absolute/path/to/intervals-mcp intervals-mcp
codex mcp listUse /mcp inside Codex to inspect the server and its tools. The equivalent configuration is:
[mcp_servers.intervals_icu]
command = "uv"
args = ["run", "intervals-mcp"]
cwd = "/absolute/path/to/intervals-mcp"
startup_timeout_sec = 20
tool_timeout_sec = 90
default_tools_approval_mode = "writes"The writes setting makes Codex request approval for mutating tools. The server also requires its own confirmed=true.
Enable the skill in Codex
mkdir -p .agents/skills
ln -s ../../skills/manage-intervals-icu .agents/skills/manage-intervals-icuConnect to Claude Code
claude mcp add --transport stdio --scope local intervals_icu -- \
uv run --directory /absolute/path/to/intervals-mcp intervals-mcp
claude mcp listFor a project-shared command, use --scope project, which creates .mcp.json. Do not put the API key in that file; every user must keep a local .env.
Claude Code discovers project skills under .claude/skills:
mkdir -p .claude/skills
ln -s ../../skills/manage-intervals-icu .claude/skills/manage-intervals-icuRecommended first run
Run
doctor.Connect the MCP to Codex or Claude Code.
Ask it to use the Intervals.icu skill and list managed drafts.
Request recent training context and verify that no secrets are returned.
Create an empty plan with
confirmed=falseand inspect the preview.Approve the second call with
confirmed=true.Open Intervals.icu and confirm that a private
[IA] ...plan appears.Add one easy session and verify that Intervals.icu interprets its steps correctly.
Preview
schedule_draft_plan, review dates and conflicts, and approve only when ready.
Safety model
A managed plan must have
type == PLANand a description containing[intervals-mcp:managed].[IA]is only a display prefix; security does not depend on the human-facing name.Every edit requires the latest remote content hash.
Only complete managed-plan applications can be scheduled or removed; generic event CRUD is unavailable.
Scheduling rejects past dates, empty plans, stale hashes, and duplicate applications.
Existing events in the target dates require additional approval through
allow_calendar_conflicts=true.Unscheduling resolves IDs by
plan_folder_idand application range, then deletes only those exact events after confirmation.The server never prints the API key or authentication responses.
Scheduling may make eligible workouts available for Garmin synchronization; Garmin delivery must be reported as pending until verified.
Development
uv run ruff format --check .
uv run ruff check .
uv run mypy
uv run pytest -q
uv run python scripts/smoke_mcp.pyHTTP tests use a mocked Intervals.icu service. They do not need credentials or modify a real account.
Project status
The client and MCP are implemented and tested against the current public Intervals.icu contract. A manual test with a real API key is still needed to verify exactly how the library displays plans and processes workouts in a specific account.
Available Tools
14 toolsadd_workout_to_draftC
Add one structured workout to a managed library plan.
| Name | Required | Description | Default |
|---|---|---|---|
| day | Yes | ||
| name | Yes | ||
| tags | No | ||
| time | No | ||
| indoor | No | ||
| target | No | AUTO | |
| plan_id | Yes | ||
| confirmed | No | ||
| description | Yes | ||
| activity_type | Yes | ||
| expected_hash | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate this is a non-read-only, non-idempotent mutation, but the description does not elaborate on side effects, concurrency control (despite expected_hash parameter), or what constitutes a 'managed library plan'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with good front-loading, but it is too brief for a tool with many parameters. Every word is earned, but it sacrifices utility.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 11 parameters, 0% schema coverage, and an output schema not mentioned, the description is insufficient. Sibling tools indicate a lifecycle for plans, but no context on draft vs. scheduled state is provided.
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%, yet the description provides no explanation for any of the 11 parameters. Critical parameters like expected_hash, day, target, and others are left undocumented.
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), the resource (structured workout), and the target (managed library plan). It distinguishes from sibling tools like update_draft_workout or create_draft_plan.
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 on when to use this tool versus alternatives. No mention of prerequisites (e.g., plan must exist and be in draft state) or scenarios where it should not be used.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clone_draft_planC
Clone a managed draft plan to preserve a version before editing.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | Yes | ||
| confirmed | No | ||
| expected_hash | Yes | ||
| version_label | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false, destructiveHint=false) indicate a mutation that is not destructive, but the description adds little beyond that. It states 'preserve a version' but does not explain the cloning process, such as whether the original plan remains unchanged, what happens to existing versions, or the role of the required expected_hash parameter. The output schema exists but is not described.
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 a single sentence of 10 words, which is concise and front-loaded with the core action. However, this brevity comes at the cost of missing essential parameter and behavioral details, making it somewhat under-specified. It earns its place but is not optimally informative.
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 4 parameters with 0% schema coverage, a complex operation requiring hash confirmation, and an output schema that is not described, the description is far from complete. It does not explain the purpose of each parameter, the cloning semantics, or the return value, leaving an AI agent with significant ambiguity about how to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, but it fails to define any parameter. It does not explain plan_id (the plan to clone), version_label (the label for the clone), expected_hash (likely a concurrency check), or confirmed (perhaps to confirm the action). The tool name implies version_label is the new label, but no details are given.
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 'clone' and the resource 'managed draft plan', with the specific purpose 'to preserve a version before editing'. This distinguishes it from sibling tools like rename_draft_plan or create_draft_plan, as no other tool performs cloning. However, it could be more explicit about what cloning entails (e.g., creating a copy with a new version label).
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 minimal usage guidance: it only implies the tool should be used 'before editing' a draft plan. It does not specify when to use this tool versus alternatives like rename_draft_plan or schedule_draft_plan, nor does it mention prerequisites or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_draft_planC
Create a private managed library PLAN; never apply it to the calendar.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| confirmed | No | ||
| description | Yes | ||
| activity_types | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate the tool is not read-only, not idempotent, and not destructive. The description adds the constraint that it does not apply to the calendar and states it’s a 'private managed library' plan, but no further behavioral details like side effects or permissions.
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 a single sentence, very concise but at the expense of parameter semantics and usage guidance. It is front-loaded with the action but lacks necessary 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?
Despite the presence of an output schema (not shown) and sibling tools, the description does not cover parameter details, usage context, or the meaning of 'private managed library'. For a tool with 4 parameters, this is insufficient.
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 tool description does not explain any of the 4 parameters (name, confirmed, description, activity_types). The agent must infer from names alone, which is insufficient for correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Create') and the resource ('private managed library PLAN'). It differentiates from scheduling siblings by explicitly saying 'never apply it to the calendar'.
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 a clear negative directive ('never apply it to the calendar') but does not give positive guidance on when to use this tool, nor does it mention alternatives like schedule_draft_plan for applying. No prerequisites or context are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_athlete_profileARead-only
Read health and body-composition fields from the athlete profile only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already indicates idempotency. Description adds that the tool reads from the athlete profile specifically, providing additional behavioral context beyond the annotation.
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?
Single, complete sentence with no wasted words. Front-loaded with purpose.
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 zero parameters, a read-only annotation, and an output schema fulfilling return details, the description fully contextualizes the tool's functionality.
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?
No parameters exist, so description needs no parameter details. Schema coverage is 100%, baseline score of 4 is appropriate.
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?
Describes specific verb 'Read' and resource 'health and body-composition fields from the athlete profile'. Distinguishes from sibling tools like get_personal_context by emphasizing 'profile only'.
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?
Context is clear: for reading profile health data. Does not explicitly state when not to use, but the description is sufficient given siblings like get_personal_context for other contexts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_draft_planARead-only
Read a managed plan and its workouts; reject plans outside the draft namespace.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint=true. The description adds that the tool rejects plans outside the draft namespace and returns both plan and workouts, providing context beyond read-only 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 a single sentence that efficiently conveys the main purpose and constraint. It is front-loaded and without unnecessary words, though it could be slightly more structured.
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 tool has an output schema and minimal parameters. The description covers the return content and namespace restriction, which is sufficient for a simple get operation. No missing critical 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?
The description does not mention the single parameter plan_id or provide any additional meaning beyond the input schema. With 0% schema description coverage, the description fails to compensate by explaining the parameter's role or format.
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 tool reads a managed plan and its workouts, specifically for draft plans. The verb 'Read' and resource 'managed plan and its workouts' are precise, and the constraint 'reject plans outside the draft namespace' distinguishes it from other plan retrieval 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 usage for draft plans only but does not explicitly say when to use this tool versus alternatives like list_draft_plans or get_training_context. No when-not or alternative guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_performance_curvesBRead-only
Read power, pace, and heart-rate duration curves without modifying data.
| Name | Required | Description | Default |
|---|---|---|---|
| sport | Yes | ||
| curves | No | 42d |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only behavior (readOnlyHint: true). The description reinforces that and specifies the data types (power, pace, heart-rate). However, no additional behavioral traits (e.g., permissions, rate limits) are disclosed, which is adequate given the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-formed sentence with no extraneous words. It efficiently conveys the core action and constraints (read-only, specific data). Perfectly sized for a simple tool.
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 tool has an output schema (documenting return values) and annotations, the description covers the essential action. However, it lacks explanation of the 'curves' parameter and how the tool integrates with typical workflows. Adequate but incomplete for optimal agent understanding.
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 parameters. It mentions curve types but does not describe the 'sport' (required) or 'curves' (default: '42d') parameters. This leaves the agent without meaningful guidance for parameter values.
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 ('Read') and the resource ('power, pace, and heart-rate duration curves'), with a specific scope ('curves'). It distinguishes from sibling tools which focus on drafting plans and personal context, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for read-only access via 'without modifying data,' but no explicit guidance on when to choose this tool over alternatives like get_athlete_profile or get_training_context. It provides minimal context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_personal_contextARead-only
Read durable athlete preferences and constraints before planning or editing.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already include readOnlyHint=true, indicating a safe read operation. The description adds the purpose but does not describe the output or detailed behavior beyond that, which is acceptable given the 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?
A single, direct sentence that conveys the tool's purpose and usage without unnecessary words. It is perfectly concise.
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 zero-parameter read-only tool with annotations and likely an output schema, this description provides sufficient context for an agent to understand when and why to use it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, and schema coverage is 100%. The description adds no parameter details, but that is expected for a zero-parameter tool, meeting the baseline of 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Read' and identifies the resource as 'durable athlete preferences and constraints', clearly distinguishing it from sibling tools like 'get_training_context' or 'get_athlete_profile'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states 'before planning or editing', providing clear when-to-use guidance. No explicit exclusions or alternatives are given, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_training_contextARead-only
Read activities, wellness and calendar events for an inclusive ISO date range.
| Name | Required | Description | Default |
|---|---|---|---|
| newest | Yes | ||
| oldest | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description's 'Read' aligns with the readOnlyHint annotation, but no additional behavioral details (e.g., error handling, performance) are disclosed beyond the annotation. The inclusive ISO date range is noted, but this is more about parameters than 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 a single, concise sentence that front-loads the verb and key resources. Every word serves a purpose, with no redundancy or 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?
Given the tool's simplicity (two required string params, read-only, output schema exists), the description adequately covers the core functionality. It could mention that it returns combined data, but the existing output schema mitigates this 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?
With 0% schema description coverage, the description compensates by specifying 'inclusive ISO date range', providing format context that the schema (only types and titles) lacks. It clarifies that the parameters are ISO dates and that the range is inclusive, adding meaning beyond the raw 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 'Read' and the resources 'activities, wellness and calendar events', distinguishing it from sibling tools like get_athlete_profile or get_personal_context. The scope 'inclusive ISO date range' adds specificity.
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 use for retrieving a holistic training context over a date range, but does not explicitly state when to use this tool versus alternatives like get_personal_context or set_personal_fact. No exclusions or comparative guidance are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_draft_plansARead-only
List only plans managed by this server, including their current content hashes.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true. Description adds value by specifying the scope and that content hashes are included. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single focused sentence, no redundancy. Front-loaded with key 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 zero-parameter list tool with output schema, description sufficiently covers purpose, scope, and return data.
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?
No parameters. Schema coverage 100%. Description not needed for parameter semantics. Baseline 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb (List), resource (plans managed by this server), and output characteristic (content hashes). Distinguishes from siblings like get_draft_plan.
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?
Implies usage scope ('managed by this server'), but does not explicitly state when not to use or provide alternatives. Clear enough given sibling context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_draft_planC
Rename one managed library plan using the configured short display prefix.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| plan_id | Yes | ||
| confirmed | No | ||
| expected_hash | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate this is not read-only and not destructive, but the description adds no behavioral details beyond the renaming action. The mention of 'short display prefix' is unclear in terms of effect or side effects.
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 (one sentence) but at the expense of completeness. It provides no structure or breakdown of the tool's functionality.
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 tool has 4 parameters (3 required) and no parameter documentation, the description is severely lacking. The presence of an output schema does not excuse missing explanations of inputs like 'expected_hash' and 'confirmed'.
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 fails to explain any of the four parameters (name, plan_id, confirmed, expected_hash). The agent has no clue what 'expected_hash' or 'confirmed' mean in this context.
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 (rename) and the object (one managed library plan). However, the phrase 'using the configured short display prefix' is ambiguous and might confuse agents unfamiliar with the system concept.
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 provided on when to use this tool versus siblings like create_draft_plan or clone_draft_plan. There is no mention of prerequisites or context that would help an agent decide to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_draft_planC
Apply one managed draft plan to the calendar on an exact future ISO date.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | Yes | ||
| confirmed | No | ||
| start_date | Yes | ||
| expected_hash | Yes | ||
| allow_calendar_conflicts | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate a non-read-only, non-idempotent, non-destructive operation, but the description adds no context about side effects, such as what happens if the date already has calendar events or if the plan can be rescheduled.
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 a single concise sentence with no wasted words, but it is too brief to convey necessary details, resulting in under-specification.
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 5 parameters (including an expected_hash and conflict flag) and an output schema (not detailed), the description omits crucial context about parameter semantics, return values, and how this tool differs from siblings like get_draft_plan or clone_draft_plan.
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 does not explain any of the five parameters (plan_id, expected_hash, start_date, confirmed, allow_calendar_conflicts), failing to add meaning 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 tool applies a draft plan to the calendar on a specific future ISO date. This distinguishes it from siblings like unschedule_draft_plan (removes), rename_draft_plan, or add_workout_to_draft.
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 on when to use or avoid this tool versus alternatives. Sibling tools like unschedule_draft_plan or update_draft_workout exist, but no criteria for selection are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_personal_factBIdempotent
Remember one durable, non-secret athlete fact; the same section/key is replaced safely.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| value | Yes | ||
| section | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide idempotentHint=true and destructiveHint=false; description adds 'non-secret' and 'replaced safely', which aligns but doesn't disclose auth needs or rate limits. Adequate for the 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?
Single sentence with 14 words. No redundancy. Front-loaded with key action verb 'Remember'. Optimal conciseness.
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 3 required parameters, enum, output schema existence, and annotations, the description covers the core behavior but omits any mention of return format or potential errors. Adequate but not thorough.
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?
Description provides no explanation of the three parameters (section, key, value). With 0% schema coverage, the burden is on description to add meaning, which it fails to do effectively.
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 tool remembers a durable, non-secret athlete fact with safe replacement under the same section/key. It distinguishes from sibling read tools like get_personal_context.
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?
Implies use for storing non-secret facts and that calling with same section/key replaces. No explicit when-to-use or when-not-to-use compared to siblings like create_draft_plan or rename_draft_plan.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unschedule_draft_planBDestructive
Delete only calendar copies from one managed plan application; keep the library plan.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | Yes | ||
| confirmed | No | ||
| start_date | Yes | ||
| expected_hash | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral context beyond the destructiveHint annotation by specifying what is deleted (calendar copies) and what is preserved (library plan). However, it does not disclose behavior such as what happens if no calendar copy exists, potential cascading effects, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no fluff, which is concise. However, given the lack of parameter descriptions and the complexity of the operation, the description is under-specified and fails to convey necessary 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?
Despite having an output schema, the description does not mention return values or side effects beyond deletion. With 4 parameters and no parameter descriptions, the description is incomplete for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameter descriptions are provided in the schema (0% coverage), and the tool description does not explain the meaning or purpose of any parameter (plan_id, expected_hash, start_date, confirmed). The agent receives no guidance on how to populate these fields.
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 ('Delete') and target ('calendar copies from one managed plan application'), clearly distinguishing this tool from siblings like schedule_draft_plan and create_draft_plan. It explicitly states the library plan is preserved.
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 this tool removes calendar copies while keeping the library plan, but it does not explicitly state when to use it versus alternatives (e.g., full deletion) or provide any prerequisites or conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_draft_workoutB
Replace one workout on a managed plan after checking the plan hash.
| Name | Required | Description | Default |
|---|---|---|---|
| day | Yes | ||
| name | Yes | ||
| tags | No | ||
| time | No | ||
| indoor | No | ||
| target | No | AUTO | |
| plan_id | Yes | ||
| confirmed | No | ||
| workout_id | Yes | ||
| description | Yes | ||
| activity_type | Yes | ||
| expected_hash | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate this is not read-only, idempotent, or destructive. The description adds that it checks a hash before replacing, implying conditional behavior, but does not explain error handling (e.g., if hash mismatch) or what happens to the replaced workout. No output schema is provided to clarify return values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that efficiently communicates the core action and a key requirement. However, it could be slightly more structured by listing the fields being replaced.
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 complexity (12 parameters, 7 required, no schema descriptions) and the existence of an output schema (not shown), the description is too sparse. It omits essential context like the need for the plan to be in a draft state, what the hash represents, and the expected return value.
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 should compensate, but it only mentions plan_id, expected_hash, and workout_id. It does not explain the meaning or usage of required parameters like name, description, activity_type, day, or optional ones like tags, time, indoor, target, confirmed.
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 ('replace'), the resource ('one workout on a managed plan'), and a key precondition ('after checking the plan hash'). This differentiates from siblings like add_workout_to_draft and rename_draft_plan.
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 no guidance on when to use this tool versus alternatives, such as add_workout_to_draft for adding new workouts. It does not mention prerequisites (e.g., the plan must be a draft) or conditions for use.
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.
14 tool updates
v0.1.0- First observed
add_workout_to_draft - First observed
clone_draft_plan - First observed
create_draft_plan - First observed
get_athlete_profile - First observed
get_draft_plan - First observed
get_performance_curves - First observed
get_personal_context - First observed
get_training_context - First observed
list_draft_plans - First observed
rename_draft_plan - First observed
schedule_draft_plan - First observed
set_personal_fact - First observed
unschedule_draft_plan - First observed
update_draft_workout
TDQS
Scored across 14 tools
Each tool addresses a distinct operation: draft plan lifecycle (create, clone, rename, get, list, schedule, unschedule), workout management (add, update), athlete context (profile, personal context, fact), and performance data. No two tools have overlapping purposes.
All tool names follow a consistent verb_noun pattern using snake_case (e.g., rename_draft_plan, get_training_context, set_personal_fact). The convention is uniform across all 14 tools.
14 tools cover the domain of training plan management (library plans, workouts, scheduling, athlete data, performance curves) without being excessive or too sparse. Each tool has a clear role.
Core workflows for draft plans are present (create, read, update via rename/add_workout/update_workout, schedule/unschedule), but missing delete operations (no delete_draft_plan or remove_workout_from_draft). This gap could cause issues if agents need to remove plans or workouts.
Maintenance
Related MCP Connectors
Remote MCP server for training, nutrition, wellness, and performance data with OAuth 2.0.
MCP server for generating rough-draft project plans from natural-language prompts.
MCP server for progressive tool usage at any scale (see https://klavis.ai)
MCP server for Withings health data — sleep, activity, heart, and body metrics.
Related MCP Servers
- AlicenseAqualityFmaintenanceA Model Context Protocol (MCP) server for Intervals.icu integration. Access your training data, wellness metrics, and performance analysis through Claude and other LLMs.4835MIT
- AlicenseAqualityAmaintenanceMCP server for Intervals.icu that enables AI assistants to manage athletic training data, including activities, calendar events, wellness metrics, and workout libraries.19Apache 2.0
- AlicenseBqualityAmaintenanceMCP server for local fitness-data extraction and analysis from Garmin Connect, Intervals.icu, and Strava. Provides read-only analytical tools over DuckDB and targeted Strava enrichment.35425AGPL 3.0
- AlicenseAqualityBmaintenanceMCP server that connects AI agents to Intervals.icu, enabling access to training data such as activities, wellness metrics, calendar events, gear, power curves, and custom items. Includes a running coach AI template for automated post-session analysis.19151MIT