Intervals.icu MCP Server
Intervals.icu MCP 服务器
用于将 Claude 和 ChatGPT 与 Intervals.icu API 连接的模型上下文协议 (MCP) 服务器。它提供了用于身份验证以及检索活动、事件和健康数据的工具。
如果您觉得此模型上下文协议 (MCP) 服务器有用,请考虑通过捐赠来支持其持续开发。
要求
Python 3.12 或更高版本
httpx
python-dotenv
Related MCP server: intervals.icu MCP Server
设置
1. 安装 uv (推荐)
macOS/Linux:
curl -LsSf https://astral.sh/uv/install.sh | shWindows (PowerShell):
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"安装完成后,找到 uv 的完整路径 — 您稍后在配置 Claude Desktop 时会用到它:
where.exe uv
# Example output: C:\Users\<USERNAME>\.local\bin\uv.exe2. 克隆此仓库
git clone https://github.com/mvilanova/intervals-mcp-server.git
cd intervals-mcp-server3. 创建并激活虚拟环境
# 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. 同步项目依赖
uv sync5. 设置环境变量
通过运行以下命令,将 .env.example 复制并重命名为 .env:
macOS/Linux:
cp .env.example .envWindows (PowerShell):
Copy-Item .env.example .env然后编辑 .env 文件并设置您的 Intervals.icu 运动员 ID 和 API 密钥:
API_KEY=your_intervals_api_key_here
ATHLETE_ID=your_athlete_id_here获取您的 Intervals.icu API 密钥
登录您的 Intervals.icu 账户
前往 Settings > API
生成一个新的 API 密钥
查找您的运动员 ID
当您登录 Intervals.icu 时,您的运动员 ID 通常显示在 URL 中。它看起来像这样:
https://intervals.icu/athlete/i12345/...其中i12345就是您的运动员 ID
更新
本项目处于活跃开发状态,会定期添加新功能和修复程序。要保持最新状态,请按照以下步骤操作:
1. 从 main 分支拉取最新更改
⚠️ 在运行此命令之前,请确保您没有未提交的更改。
macOS/Linux:
git checkout main && git pullWindows (PowerShell):
git checkout main; git pull2. 更新 Python 依赖
激活您的虚拟环境并同步依赖:
macOS/Linux:
source .venv/bin/activate
uv syncWindows (PowerShell):
.venv\Scripts\activate
uv sync故障排除
如果 Claude Desktop 因配置更改而失败,请按照以下步骤操作:
删除
claude_desktop_config.json中现有的Intervals.icu条目。从
intervals-mcp-server目录重新配置 Claude Desktop。
macOS/Linux:
mcp install src/intervals_mcp_server/server.py --name "Intervals.icu" --with-editable . --env-file .envWindows: 按照 Windows 配置部分 中的说明手动重新添加条目。
常见错误
spawn uv ENOENT — Claude Desktop 找不到 uv 可执行文件。在 command 字段中使用 uv 的完整路径。运行 which uv (macOS/Linux) 或 where.exe uv (Windows) 来获取它。
spawn /Users/... ENOENT on Windows — 配置文件包含 macOS/Linux 风格的路径。按照下方的 Windows 配置部分 使用反斜杠将其替换为正确的 Windows 路径。
Windows Store 安装:配置更改未生效 — 您可能编辑了错误的配置文件。从 Microsoft Store 安装的 Claude Desktop 读取的是 AppData\Local\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.json,而不是 AppData\Roaming\Claude\。
与 Claude 一起使用
1. 配置 Claude Desktop
要将此服务器与 Claude Desktop 一起使用,您需要将其添加到您的 Claude Desktop 配置中。
macOS/Linux
从
intervals-mcp-server目录运行以下命令以配置 Claude Desktop:
mcp install src/intervals_mcp_server/server.py --name "Intervals.icu" --with-editable . --env-file .env如果您打开 Claude Desktop 应用的配置文件
claude_desktop_config.json,它应该如下所示:
{
"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"
}
}
}
}其中 /path/to/ 是您系统中 intervals-mcp-server 代码文件夹的路径。
Windows
mcp install 命令可能会因环境或权限问题在 Windows 上失败。请改为手动配置 Claude Desktop:
找到 Claude Desktop 配置文件。如果 Claude Desktop 是从 Microsoft Store 安装的,配置文件位于:
C:\Users\<USERNAME>\AppData\Local\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.json如果是通过标准安装程序安装的,它可能位于:
C:\Users\<USERNAME>\AppData\Roaming\Claude\claude_desktop_config.json如果文件或文件夹不存在,请创建它。
将以下条目添加到
claude_desktop_config.json中,并将占位符替换为您的实际值:
{
"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"
}
}
}
}在 JSON 中,所有 Windows 路径请使用双反斜杠 (
\\)。要查找
uv.exe的完整路径,请在 PowerShell 中运行where.exe uv。要查找克隆仓库的完整路径,请在
intervals-mcp-server文件夹内运行pwd。
Windows Store 安装注意事项: 从 Microsoft Store 安装的 Claude Desktop 将其配置沙盒化在
AppData\Local\Packages\...下。编辑AppData\Roaming\Claude\claude_desktop_config.json不会产生任何效果 — 请确保您编辑的是正确的文件。
重启 Claude Desktop。
2. 在 Claude 中使用 MCP 服务器
一旦服务器运行且 Claude Desktop 配置完成,您就可以使用以下工具来询问有关您过去和未来的活动、事件和健康数据的问题。
get_activities: 检索活动列表get_activity_details: 获取特定活动的详细信息get_activity_intervals: 获取特定活动的详细区间数据get_wellness_data: 获取健康数据get_events: 检索即将发生的事件(锻炼、比赛等)get_event_by_id: 获取特定事件的详细信息
与 ChatGPT 一起使用
ChatGPT 的测试版 MCP 连接器也可以通过 SSE 传输与此服务器通信。
以 SSE 模式启动服务器,使其暴露
/sse和/messages/端点:export FASTMCP_HOST=127.0.0.1 FASTMCP_PORT=8765 MCP_TRANSPORT=sse FASTMCP_LOG_LEVEL=INFO python src/intervals_mcp_server/server.py启动日志会打印完整的 URL(例如
http://127.0.0.1:8765/sse)。ChatGPT 需要该公共 URL,因此如果您没有直接暴露服务器,请使用诸如ngrok http 8765之类的工具转发端口。在 ChatGPT 中,打开 Settings → Features → Custom MCP Connectors 并点击 Add。填写:
Name:
Intervals.icuMCP Server URL:
https://<your-public-host>/sseAuthentication: 除非您保护了隧道,否则请保留为 No authentication。
您可以在此处重复使用相同的
ngrok http 8765隧道 URL;只需确保它转发到您上面导出的主机/端口即可。保存连接器并打开一个新的聊天。ChatGPT 将保持 SSE 连接打开,并向服务器通告的
/messages/端点发送后续请求。如果您重启了 MCP 服务器或隧道,请重新运行 SSE 命令并在 URL 发生变化时更新连接器 URL。
开发与测试
安装开发依赖并运行测试套件:
uv sync --all-extras
pytest -v tests在本地运行服务器
要手动启动服务器(在开发或测试时很有用),请运行:
mcp run src/intervals_mcp_server/server.py启用调试日志
要捕获服务器日志以进行调试,请将命令包装在 shell 中并将 stderr 重定向到文件。
macOS/Linux — 修改您的 claude_desktop_config.json 如下:
{
"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"
}
}
}
}然后 tail 日志文件以实时查看输出:
tail -f /path/to/intervals-mcp-server/mcp-server.logWindows — 修改您的 claude_desktop_config.json 如下:
{
"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"
}
}
}
}然后使用 PowerShell 实时监控日志文件:
Get-Content C:\path\to\intervals-mcp-server\mcp-server.log -Wait许可证
GNU 通用公共许可证 v3.0
精选
Glama.ai
Available Tools
10 toolsadd_or_update_eventB
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": ""}, # Add comments or blank lines for readability ] }
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": "rpm"}} Pace by ftp: {"pace": {"value": "80", "units": "%pace"}} Pace by zone: {"pace": {"value": "Z2", "units": "pace_zone"}} Zone by power: {"power": {"value": "Z2", "units": "power_zone"}} Zone by heart rate: {"hr": {"value": "Z2", "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 free to indicate a segment without ERG control, optionally with a suggested power range: {"free": 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 |
|---|---|---|---|
| workout_type | Yes | ||
| name | Yes | ||
| athlete_id | No | ||
| api_key | No | ||
| event_id | No | ||
| start_date | No | ||
| workout_doc | No | ||
| moving_time | No | ||
| distance | 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 burden of behavioral disclosure. It mentions the conditional create/update behavior based on event_id, which is useful. However, it doesn't describe important behavioral aspects like authentication requirements (though it mentions API key fallback), error handling, rate limits, or what happens on success/failure. The extensive step documentation compensates somewhat but focuses more on parameter usage than tool 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 excessively long and poorly structured for an AI agent. While the parameter and step documentation is valuable, it should be more front-loaded with core purpose and usage, with detailed examples moved to a separate section. The current structure buries the essential information in lengthy examples and step property listings, making it inefficient for quick comprehension.
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 (9 parameters, nested workout_doc structure) and 0% schema coverage, the description provides substantial context. It thoroughly documents parameters and includes a rich example. With an output schema present, it doesn't need to explain return values. The main gap is lack of behavioral context like error conditions or authentication requirements, but the parameter coverage is comprehensive.
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 must fully compensate, which it does excellently. It provides detailed explanations for all 9 parameters, including optionality, default values, and environmental fallbacks. The extensive documentation of workout_doc structure, step properties, and usage examples adds significant semantic value beyond what the bare schema provides, making parameter understanding comprehensive.
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's purpose: 'Post event for an athlete to Intervals.icu' with the conditional update behavior when event_id is provided. It specifies the resource (event/athlete) and the action (post/update). However, it doesn't explicitly differentiate from sibling tools like 'get_event_by_id' or 'delete_event' beyond mentioning the update condition.
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 mentions that if event_id is provided, the event will be updated instead of created, which gives some context for when to use it for updates versus creation. However, it doesn't explain when to use this tool versus alternatives like 'delete_event' or 'get_events', nor does it mention prerequisites or typical use cases beyond the technical mapping to the API.
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 |
|---|---|---|---|
| event_id | Yes | ||
| athlete_id | No | ||
| api_key | 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 |
|---|---|---|---|
| start_date | Yes | ||
| end_date | Yes | ||
| athlete_id | No | ||
| api_key | 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 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 |
|---|---|---|---|
| athlete_id | No | ||
| api_key | No | ||
| start_date | No | ||
| end_date | No | ||
| limit | 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 |
|---|---|---|---|
| activity_id | Yes | ||
| api_key | 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. 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 |
|---|---|---|---|
| activity_id | Yes | ||
| api_key | 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 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_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 |
|---|---|---|---|
| activity_id | Yes | ||
| api_key | No | ||
| 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_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 |
|---|---|---|---|
| event_id | Yes | ||
| athlete_id | No | ||
| api_key | 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 |
|---|---|---|---|
| athlete_id | No | ||
| api_key | No | ||
| start_date | No | ||
| end_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_wellness_dataB
Get wellness data 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)
| Name | Required | Description | Default |
|---|---|---|---|
| athlete_id | No | ||
| api_key | No | ||
| start_date | No | ||
| end_date | 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 full burden for behavioral disclosure. It mentions optional parameters with fallbacks to environment variables and date defaults, which is helpful. However, it doesn't describe authentication requirements, rate limits, error conditions, pagination, or what specific wellness data fields are returned. For a read operation with no annotation coverage, this leaves significant gaps.
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 clear purpose statement followed by organized parameter documentation. Each parameter explanation is efficient and informative. The only minor improvement would be integrating the parameter explanations more seamlessly rather than using a separate 'Args:' section.
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 description doesn't need to explain return values. However, for a tool with 4 parameters, 0% schema description coverage, and no annotations, the description does well on parameters but lacks behavioral context about authentication, rate limits, and error handling. It's adequate but has clear gaps in operational guidance.
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 fully compensate. It provides complete parameter documentation: all 4 parameters are clearly explained with their purposes, optional status, fallback behaviors, and format requirements. The description adds substantial value beyond the bare schema by explaining the .env fallback mechanism and date 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 the tool's purpose: 'Get wellness data for an athlete from Intervals.icu'. It specifies the verb ('Get'), resource ('wellness data'), and source ('Intervals.icu'), but doesn't differentiate from sibling tools like 'get_activities' or 'get_events' that also fetch data from the same platform.
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 alternatives. The description doesn't mention sibling tools like 'get_activities' or explain what makes wellness data distinct from other data types available through the API. Usage context is implied but not explicitly stated.
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.
10 tool updates
v1.0.1- Added
add_or_update_event - Added
delete_event - Added
delete_events_by_date_range - Changed
get_activities1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "title": "Result", + "type": "string" + } + }, + "required": [ + "result" + ], + "title": "get_activitiesOutput", + "type": "object" +}
- Changed
get_activity_details1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "title": "Result", + "type": "string" + } + }, + "required": [ + "result" + ], + "title": "get_activity_detailsOutput", + "type": "object" +}
- Changed
get_activity_intervals1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "title": "Result", + "type": "string" + } + }, + "required": [ + "result" + ], + "title": "get_activity_intervalsOutput", + "type": "object" +}
- Added
get_activity_streams - Changed
get_event_by_id1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "title": "Result", + "type": "string" + } + }, + "required": [ + "result" + ], + "title": "get_event_by_idOutput", + "type": "object" +}
- Changed
get_events1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "title": "Result", + "type": "string" + } + }, + "required": [ + "result" + ], + "title": "get_eventsOutput", + "type": "object" +}
- Changed
get_wellness_data1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "title": "Result", + "type": "string" + } + }, + "required": [ + "result" + ], + "title": "get_wellness_dataOutput", + "type": "object" +}
6 tool updates
v1.0.0- First observed
get_activities - First observed
get_activity_details - First observed
get_activity_intervals - First observed
get_event_by_id - First observed
get_events - First observed
get_wellness_data
TDQS
Scored across 10 tools
Each tool has a clearly distinct purpose with no overlap: add_or_update_event creates/updates events, delete_event and delete_events_by_date_range handle deletion, get_activities and get_events retrieve lists, get_event_by_id and get_activity_details fetch specific items, get_activity_intervals and get_activity_streams provide specialized data, and get_wellness_data covers a separate domain. The descriptions clearly differentiate between events and activities, and between summary and detailed data.
All tools follow a consistent verb_noun pattern with snake_case: add_or_update_event, delete_event, delete_events_by_date_range, get_activities, get_activity_details, get_activity_intervals, get_activity_streams, get_event_by_id, get_events, get_wellness_data. The verbs (add_or_update, delete, get) are used predictably, and nouns (event, activity, wellness_data) are clearly specified, making the naming highly consistent and readable.
With 10 tools, this server is well-scoped for managing athlete data in Intervals.icu, covering events, activities, and wellness data. Each tool serves a specific function (e.g., CRUD for events, detailed queries for activities), and none seem redundant or missing for the domain. This count aligns with typical server sizes (3-15 tools) and supports comprehensive workflows without being overwhelming.
The tool set provides strong coverage for the Intervals.icu domain, including CRUD for events (add/update, delete, get), detailed activity retrieval (list, details, intervals, streams), and wellness data. Minor gaps exist, such as no update or delete tools for activities (only get operations) and no tools for athlete management (e.g., list athletes), but agents can likely work around these with the available event and data tools.
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.
Pace is a remote MCP server that exposes wearable and fitness data to Claude via the Model Context Protocol. It connects to Garmin, Oura, Whoop, Polar, Fitbit and 20+ devices and provides 15 tools for querying sleep, activity, recovery, and training data. Hosted on Google Cloud Run, OAuth 2.1 authentication, Streamable HTTP transport. Instructions: First you need to create an account at: https://pacetraining.co and connect your wearables. After that you can connect the remote Server via Custom Connector in Claude and OAuth 2.1 Flow startet.
- Coach MCPOAuthai.iamcoach
Your endurance training data in your AI assistant: activities, recovery, plan, workout edits.
Related MCP Servers
- AlicenseAqualityBmaintenanceBrings Garmin training data into Claude via Intervals.icu, enabling querying of activities, wellness, and planned workouts, as well as creating structured workouts that sync back to the Garmin watch.91MIT
- AlicenseNot gradedqualityCmaintenanceEnables Claude AI to access and manage intervals.icu training data, including workouts, wellness, and fitness trends, through natural language conversation.MIT
- AlicenseNot gradedqualityBmaintenanceConnects to Intervals.icu to let users query training data, create workouts, manage calendar events, and coach athletes through natural language in Claude Desktop.43 npmMIT
- AlicenseAqualityCmaintenanceEnables Claude and ChatGPT to retrieve and manage activities, intervals, events, wellness data, power curves, and custom items through the Intervals.icu API.21GPL 3.0