Intervals.icu MCP Server
The Intervals.icu MCP Server enables integration with the Intervals.icu API to retrieve and manage athlete fitness data. With this server, you can:
Retrieve activity lists: Fetch activities with optional filters (date range, limit, etc.)
View activity details: Get comprehensive information about specific activities
Access activity intervals: Obtain detailed metrics (power, heart rate, cadence) for each interval
Fetch wellness data: Retrieve health and recovery information
List upcoming events: View scheduled workouts, races, and other events
View event details: Get specific information about individual events
The server integrates seamlessly with Claude Desktop for convenient querying of your athletic data.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Intervals.icu MCP Servershow my activities from last week"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Intervals.icu MCP Server
Model Context Protocol (MCP) server for connecting Claude and ChatGPT with the Intervals.icu API. It provides tools for authentication and data retrieval for activities, events, wellness data, power curves, and custom items.
If you find the Model Context Protocol (MCP) server useful, please consider supporting its continued development with a donation.
Requirements
Python 3.12 or higher
httpx
python-dotenv
Related MCP server: intervals.icu MCP Server
Setup
1. Install uv (recommended)
macOS/Linux:
curl -LsSf https://astral.sh/uv/install.sh | shWindows (PowerShell):
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"After installation, find the full path to uv — you'll need it later when configuring Claude Desktop:
where.exe uv
# Example output: C:\Users\<USERNAME>\.local\bin\uv.exe2. Clone this repository
git clone https://github.com/mvilanova/intervals-mcp-server.git
cd intervals-mcp-server3. Create and activate a virtual environment
# Create virtual environment with Python 3.12
uv venv --python 3.12
# Activate virtual environment
# On macOS/Linux:
source .venv/bin/activate
# On Windows:
.venv\Scripts\activate4. Sync project dependencies
uv sync5. Set up environment variables
Make a copy of .env.example and name it .env by running the following command:
macOS/Linux:
cp .env.example .envWindows (PowerShell):
Copy-Item .env.example .envThen edit the .env file and set your Intervals.icu athlete id and API key:
API_KEY=your_intervals_api_key_here
ATHLETE_ID=your_athlete_id_hereGetting your Intervals.icu API Key
Log in to your Intervals.icu account
Go to Settings > API
Generate a new API key
Finding your Athlete ID
Your athlete ID is typically visible in the URL when you're logged into Intervals.icu. It looks like:
https://intervals.icu/athlete/i12345/...wherei12345is your athlete ID
Updating
This project is actively developed, with new features and fixes added regularly. To stay up to date, follow these steps:
1. Pull the latest changes from main
⚠️ Make sure you don't have uncommitted changes before running this command.
macOS/Linux:
git checkout main && git pullWindows (PowerShell):
git checkout main; git pull2. Update Python dependencies
Activate your virtual environment and sync dependencies:
macOS/Linux:
source .venv/bin/activate
uv syncWindows (PowerShell):
.venv\Scripts\activate
uv syncTroubleshooting
If Claude Desktop fails due to configuration changes, follow these steps:
Delete the existing
Intervals.icuentry inclaude_desktop_config.json.Reconfigure Claude Desktop from the
intervals-mcp-serverdirectory.
macOS/Linux:
mcp install src/intervals_mcp_server/server.py --name "Intervals.icu" --with-editable . --env-file .envWindows: Re-add the entry manually as described in the Windows configuration section.
Common errors
spawn uv ENOENT — Claude Desktop cannot find the uv executable. Use the full path to uv in the command field. Run which uv (macOS/Linux) or where.exe uv (Windows) to get it.
spawn /Users/... ENOENT on Windows — The config file contains a macOS/Linux-style path. Replace it with the correct Windows path using backslashes as described in the Windows configuration section below.
Windows Store install: config changes not taking effect — You may be editing the wrong config file. Claude Desktop installed from the Microsoft Store reads from AppData\Local\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.json, not AppData\Roaming\Claude\.
Usage with Claude
1. Configure Claude Desktop
To use this server with Claude Desktop, you need to add it to your Claude Desktop configuration.
macOS/Linux
Run the following from the
intervals-mcp-serverdirectory to configure Claude Desktop:
mcp install src/intervals_mcp_server/server.py --name "Intervals.icu" --with-editable . --env-file .envIf you open your Claude Desktop App configuration file
claude_desktop_config.json, it should look like this:
{
"mcpServers": {
"Intervals.icu": {
"command": "/Users/<USERNAME>/.local/bin/uv",
"args": [
"run",
"--with",
"mcp[cli]",
"--with-editable",
"/path/to/intervals-mcp-server",
"mcp",
"run",
"/path/to/intervals-mcp-server/src/intervals_mcp_server/server.py"
],
"env": {
"INTERVALS_API_BASE_URL": "https://intervals.icu/api/v1",
"ATHLETE_ID": "<YOUR_ATHLETE_ID>",
"API_KEY": "<YOUR_API_KEY>",
"LOG_LEVEL": "INFO"
}
}
}
}Where /path/to/ is the path to the intervals-mcp-server code folder in your system.
Windows
The mcp install command may fail on Windows due to environment or permission issues. Instead, configure Claude Desktop manually:
Find the Claude Desktop config file. If Claude Desktop was installed from the Microsoft Store, the config is located at:
C:\Users\<USERNAME>\AppData\Local\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.jsonIf installed via the standard installer, it may be at:
C:\Users\<USERNAME>\AppData\Roaming\Claude\claude_desktop_config.jsonIf the file or folder does not exist, create it.
Add the following entry to
claude_desktop_config.json, replacing the placeholders with your actual values:
{
"mcpServers": {
"Intervals.icu": {
"command": "C:\\Users\\<USERNAME>\\.local\\bin\\uv.exe",
"args": [
"run",
"--with",
"mcp[cli]",
"--with-editable",
"C:\\path\\to\\intervals-mcp-server",
"mcp",
"run",
"C:\\path\\to\\intervals-mcp-server\\src\\intervals_mcp_server\\server.py"
],
"env": {
"INTERVALS_API_BASE_URL": "https://intervals.icu/api/v1",
"ATHLETE_ID": "<YOUR_ATHLETE_ID>",
"API_KEY": "<YOUR_API_KEY>",
"LOG_LEVEL": "INFO"
}
}
}
}Use double backslashes (
\\) for all Windows paths in JSON.To find the full path to
uv.exe, runwhere.exe uvin PowerShell.To find the full path to the cloned repository, run
pwdfrom inside theintervals-mcp-serverfolder.
Note for Windows Store installs: Claude Desktop installed from the Microsoft Store sandboxes its config under
AppData\Local\Packages\.... EditingAppData\Roaming\Claude\claude_desktop_config.jsonwill have no effect — make sure you edit the correct file.
Restart Claude Desktop.
2. Use the MCP server with Claude
Once the server is running and Claude Desktop is configured, you can use the following tools to ask questions about your past and future activities, events, and wellness data.
get_activities: Retrieve a list of activitiesget_activity_details: Get detailed information for a specific activityget_activity_intervals: Get detailed interval data for a specific activityget_activity_streams: Get raw data streams (power, heart rate, etc.) for a specific activityget_athlete_power_curves: Get best power output curves for selected durations and time periodsget_wellness_data: Fetch wellness dataget_events: Retrieve upcoming events (workouts, races, etc.)get_event_by_id: Get detailed information for a specific eventadd_or_update_event: Create or update an event (workout, race, note, etc.)delete_event: Delete a specific eventdelete_events_by_date_range: Delete events within a date rangeget_custom_items: Get custom items (charts, custom fields, zones, etc.) for an athleteget_custom_item_by_id: Get detailed information for a specific custom itemcreate_custom_item: Create a new custom item for an athleteupdate_custom_item: Update an existing custom itemdelete_custom_item: Delete a custom item
Usage with ChatGPT
ChatGPT’s beta MCP connectors can also talk to this server over the SSE transport.
Start the server in SSE mode so it exposes the
/sseand/messages/endpoints:export FASTMCP_HOST=127.0.0.1 FASTMCP_PORT=8765 MCP_TRANSPORT=sse FASTMCP_LOG_LEVEL=INFO python src/intervals_mcp_server/server.pyThe startup log prints the full URLs (for example
http://127.0.0.1:8765/sse). ChatGPT needs that public URL, so forward the port with a tool such asngrok http 8765if you are not exposing the server directly.In ChatGPT, open Settings → Features → Custom MCP Connectors and click Add. Fill in:
Name:
Intervals.icuMCP Server URL:
https://<your-public-host>/sseAuthentication: leave as No authentication unless you have protected your tunnel.
You can reuse the same
ngrok http 8765tunnel URL here; just ensure it forwards to the host/port you exported above.Save the connector and open a new chat. ChatGPT will keep the SSE connection open and POST follow-up requests to the
/messages/endpoint announced by the server. If you restart the MCP server or tunnel, rerun the SSE command and update the connector URL if it changes.
Development and testing
Install development dependencies and run the test suite with:
uv sync --all-extras
pytest -v testsRunning the server locally
To start the server manually (useful when developing or testing), run:
mcp run src/intervals_mcp_server/server.pyEnabling debug logging
To capture server logs for debugging, wrap the command in a shell and redirect stderr to a file.
macOS/Linux — modify your claude_desktop_config.json like this:
{
"mcpServers": {
"Intervals.icu": {
"command": "/bin/bash",
"args": [
"-c",
"/Users/<USERNAME>/.local/bin/uv run --with 'mcp[cli]' --with-editable /path/to/intervals-mcp-server mcp run /path/to/intervals-mcp-server/src/intervals_mcp_server/server.py 2>> /path/to/intervals-mcp-server/mcp-server.log"
],
"env": {
"INTERVALS_API_BASE_URL": "https://intervals.icu/api/v1",
"ATHLETE_ID": "<YOUR_ATHLETE_ID>",
"API_KEY": "<YOUR_API_KEY>",
"LOG_LEVEL": "INFO"
}
}
}
}Then tail the log file to see output in real-time:
tail -f /path/to/intervals-mcp-server/mcp-server.logWindows — modify your claude_desktop_config.json like this:
{
"mcpServers": {
"Intervals.icu": {
"command": "powershell",
"args": [
"-Command",
"C:\\Users\\<USERNAME>\\.local\\bin\\uv.exe run --with 'mcp[cli]' --with-editable C:\\path\\to\\intervals-mcp-server mcp run C:\\path\\to\\intervals-mcp-server\\src\\intervals_mcp_server\\server.py 2>> C:\\path\\to\\intervals-mcp-server\\mcp-server.log"
],
"env": {
"INTERVALS_API_BASE_URL": "https://intervals.icu/api/v1",
"ATHLETE_ID": "<YOUR_ATHLETE_ID>",
"API_KEY": "<YOUR_API_KEY>",
"LOG_LEVEL": "INFO"
}
}
}
}Then monitor the log file in real-time using PowerShell:
Get-Content C:\path\to\intervals-mcp-server\mcp-server.log -WaitLicense
The GNU General Public License v3.0
Featured
Glama.ai
Available Tools
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
- AlicenseNot gradedqualityBmaintenanceBrings 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.1MIT
- 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.28 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