Intervals.icu MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Intervals.icu MCP Server What's my training load for this week?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Intervals.icu MCP Server
Model Context Protocol (MCP) server for connecting Claude and ChatGPT with the Intervals.icu API. It provides tools for authentication and data retrieval for activities, events, wellness data, power curves, and custom items.
If you find the Model Context Protocol (MCP) server useful, please consider supporting its continued development with a donation.
Requirements
Python 3.12 or higher
httpx
python-dotenv
Related MCP server: Intervals.icu MCP Server
Setup
1. Install uv (recommended)
macOS/Linux:
curl -LsSf https://astral.sh/uv/install.sh | shWindows (PowerShell):
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"After installation, find the full path to uv — you'll need it later when configuring Claude Desktop:
where.exe uv
# Example output: C:\Users\<USERNAME>\.local\bin\uv.exe2. Clone this repository
git clone https://github.com/mvilanova/intervals-mcp-server.git
cd intervals-mcp-server3. Create and activate a virtual environment
# Create virtual environment with Python 3.12
uv venv --python 3.12
# Activate virtual environment
# On macOS/Linux:
source .venv/bin/activate
# On Windows:
.venv\Scripts\activate4. Sync project dependencies
uv sync5. Set up environment variables
Make a copy of .env.example and name it .env by running the following command:
macOS/Linux:
cp .env.example .envWindows (PowerShell):
Copy-Item .env.example .envThen edit the .env file and set your Intervals.icu athlete id and API key:
API_KEY=your_intervals_api_key_here
ATHLETE_ID=your_athlete_id_hereGetting your Intervals.icu API Key
Log in to your Intervals.icu account
Go to Settings > API
Generate a new API key
Finding your Athlete ID
Your athlete ID is typically visible in the URL when you're logged into Intervals.icu. It looks like:
https://intervals.icu/athlete/i12345/...wherei12345is your athlete ID
Updating
This project is actively developed, with new features and fixes added regularly. To stay up to date, follow these steps:
1. Pull the latest changes from main
⚠️ Make sure you don't have uncommitted changes before running this command.
macOS/Linux:
git checkout main && git pullWindows (PowerShell):
git checkout main; git pull2. Update Python dependencies
Activate your virtual environment and sync dependencies:
macOS/Linux:
source .venv/bin/activate
uv syncWindows (PowerShell):
.venv\Scripts\activate
uv syncTroubleshooting
If Claude Desktop fails due to configuration changes, follow these steps:
Delete the existing
Intervals.icuentry inclaude_desktop_config.json.Reconfigure Claude Desktop from the
intervals-mcp-serverdirectory.
macOS/Linux:
mcp install src/intervals_mcp_server/server.py --name "Intervals.icu" --with-editable . --env-file .envWindows: Re-add the entry manually as described in the Windows configuration section.
Common errors
spawn uv ENOENT — Claude Desktop cannot find the uv executable. Use the full path to uv in the command field. Run which uv (macOS/Linux) or where.exe uv (Windows) to get it.
spawn /Users/... ENOENT on Windows — The config file contains a macOS/Linux-style path. Replace it with the correct Windows path using backslashes as described in the Windows configuration section below.
Windows Store install: config changes not taking effect — You may be editing the wrong config file. Claude Desktop installed from the Microsoft Store reads from AppData\Local\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.json, not AppData\Roaming\Claude\.
Usage with Claude
1. Configure Claude Desktop
To use this server with Claude Desktop, you need to add it to your Claude Desktop configuration.
macOS/Linux
Run the following from the
intervals-mcp-serverdirectory to configure Claude Desktop:
mcp install src/intervals_mcp_server/server.py --name "Intervals.icu" --with-editable . --env-file .envIf you open your Claude Desktop App configuration file
claude_desktop_config.json, it should look like this:
{
"mcpServers": {
"Intervals.icu": {
"command": "/Users/<USERNAME>/.local/bin/uv",
"args": [
"run",
"--with",
"mcp[cli]",
"--with-editable",
"/path/to/intervals-mcp-server",
"mcp",
"run",
"/path/to/intervals-mcp-server/src/intervals_mcp_server/server.py"
],
"env": {
"INTERVALS_API_BASE_URL": "https://intervals.icu/api/v1",
"ATHLETE_ID": "<YOUR_ATHLETE_ID>",
"API_KEY": "<YOUR_API_KEY>",
"LOG_LEVEL": "INFO"
}
}
}
}Where /path/to/ is the path to the intervals-mcp-server code folder in your system.
Windows
The mcp install command may fail on Windows due to environment or permission issues. Instead, configure Claude Desktop manually:
Find the Claude Desktop config file. If Claude Desktop was installed from the Microsoft Store, the config is located at:
C:\Users\<USERNAME>\AppData\Local\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.jsonIf installed via the standard installer, it may be at:
C:\Users\<USERNAME>\AppData\Roaming\Claude\claude_desktop_config.jsonIf the file or folder does not exist, create it.
Add the following entry to
claude_desktop_config.json, replacing the placeholders with your actual values:
{
"mcpServers": {
"Intervals.icu": {
"command": "C:\\Users\\<USERNAME>\\.local\\bin\\uv.exe",
"args": [
"run",
"--with",
"mcp[cli]",
"--with-editable",
"C:\\path\\to\\intervals-mcp-server",
"mcp",
"run",
"C:\\path\\to\\intervals-mcp-server\\src\\intervals_mcp_server\\server.py"
],
"env": {
"INTERVALS_API_BASE_URL": "https://intervals.icu/api/v1",
"ATHLETE_ID": "<YOUR_ATHLETE_ID>",
"API_KEY": "<YOUR_API_KEY>",
"LOG_LEVEL": "INFO"
}
}
}
}Use double backslashes (
\\) for all Windows paths in JSON.To find the full path to
uv.exe, runwhere.exe uvin PowerShell.To find the full path to the cloned repository, run
pwdfrom inside theintervals-mcp-serverfolder.
Note for Windows Store installs: Claude Desktop installed from the Microsoft Store sandboxes its config under
AppData\Local\Packages\.... EditingAppData\Roaming\Claude\claude_desktop_config.jsonwill have no effect — make sure you edit the correct file.
Restart Claude Desktop.
2. Use the MCP server with Claude
Once the server is running and Claude Desktop is configured, you can use the following tools to ask questions about your past and future activities, events, and wellness data.
get_activities: Retrieve a list of activitiesget_activity_details: Get detailed information for a specific activityget_activity_intervals: Get detailed interval data for a specific activityget_activity_streams: Get raw data streams (power, heart rate, etc.) for a specific activityget_athlete_power_curves: Get best power output curves for selected durations and time periodsget_wellness_data: Fetch wellness dataget_events: Retrieve upcoming events (workouts, races, etc.)get_event_by_id: Get detailed information for a specific eventadd_or_update_event: Create or update an event (workout, race, note, etc.)delete_event: Delete a specific eventdelete_events_by_date_range: Delete events within a date rangeget_custom_items: Get custom items (charts, custom fields, zones, etc.) for an athleteget_custom_item_by_id: Get detailed information for a specific custom itemcreate_custom_item: Create a new custom item for an athleteupdate_custom_item: Update an existing custom itemdelete_custom_item: Delete a custom item
Usage with ChatGPT
ChatGPT’s beta MCP connectors can also talk to this server over the SSE transport.
Start the server in SSE mode so it exposes the
/sseand/messages/endpoints:export FASTMCP_HOST=127.0.0.1 FASTMCP_PORT=8765 MCP_TRANSPORT=sse FASTMCP_LOG_LEVEL=INFO python src/intervals_mcp_server/server.pyThe startup log prints the full URLs (for example
http://127.0.0.1:8765/sse). ChatGPT needs that public URL, so forward the port with a tool such asngrok http 8765if you are not exposing the server directly.In ChatGPT, open Settings → Features → Custom MCP Connectors and click Add. Fill in:
Name:
Intervals.icuMCP Server URL:
https://<your-public-host>/sseAuthentication: leave as No authentication unless you have protected your tunnel.
You can reuse the same
ngrok http 8765tunnel URL here; just ensure it forwards to the host/port you exported above.Save the connector and open a new chat. ChatGPT will keep the SSE connection open and POST follow-up requests to the
/messages/endpoint announced by the server. If you restart the MCP server or tunnel, rerun the SSE command and update the connector URL if it changes.
Development and testing
Install development dependencies and run the test suite with:
uv sync --all-extras
pytest -v testsRunning the server locally
To start the server manually (useful when developing or testing), run:
mcp run src/intervals_mcp_server/server.pyEnabling debug logging
To capture server logs for debugging, wrap the command in a shell and redirect stderr to a file.
macOS/Linux — modify your claude_desktop_config.json like this:
{
"mcpServers": {
"Intervals.icu": {
"command": "/bin/bash",
"args": [
"-c",
"/Users/<USERNAME>/.local/bin/uv run --with 'mcp[cli]' --with-editable /path/to/intervals-mcp-server mcp run /path/to/intervals-mcp-server/src/intervals_mcp_server/server.py 2>> /path/to/intervals-mcp-server/mcp-server.log"
],
"env": {
"INTERVALS_API_BASE_URL": "https://intervals.icu/api/v1",
"ATHLETE_ID": "<YOUR_ATHLETE_ID>",
"API_KEY": "<YOUR_API_KEY>",
"LOG_LEVEL": "INFO"
}
}
}
}Then tail the log file to see output in real-time:
tail -f /path/to/intervals-mcp-server/mcp-server.logWindows — modify your claude_desktop_config.json like this:
{
"mcpServers": {
"Intervals.icu": {
"command": "powershell",
"args": [
"-Command",
"C:\\Users\\<USERNAME>\\.local\\bin\\uv.exe run --with 'mcp[cli]' --with-editable C:\\path\\to\\intervals-mcp-server mcp run C:\\path\\to\\intervals-mcp-server\\src\\intervals_mcp_server\\server.py 2>> C:\\path\\to\\intervals-mcp-server\\mcp-server.log"
],
"env": {
"INTERVALS_API_BASE_URL": "https://intervals.icu/api/v1",
"ATHLETE_ID": "<YOUR_ATHLETE_ID>",
"API_KEY": "<YOUR_API_KEY>",
"LOG_LEVEL": "INFO"
}
}
}
}Then monitor the log file in real-time using PowerShell:
Get-Content C:\path\to\intervals-mcp-server\mcp-server.log -WaitLicense
The GNU General Public License v3.0
Featured
Glama.ai
Available Tools
21 toolsadd_activity_messageB
Add a message (note/comment) to an activity on Intervals.icu
Args: activity_id: The Intervals.icu activity ID content: The message text to add api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided)
Inputs: content (required), activity_id (required), api_key. Returns: result
add_or_update_eventA
Post event for an athlete to Intervals.icu this follows the event api from intervals.icu If event_id is provided, the event will be updated instead of created.
Many arguments are required as this MCP tool function maps directly to the Intervals.icu API parameters.
Args: athlete_id: The Intervals.icu athlete ID (optional, will use ATHLETE_ID from .env if not provided) api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided) event_id: The Intervals.icu event ID (optional, will use event_id from .env if not provided) start_date: Start date in YYYY-MM-DD format (optional, defaults to today) name: Name of the activity workout_doc: steps as a list of Step objects (optional, but necessary to define workout steps) workout_type: Workout type (e.g. Ride, Run, Swim, Walk, Row) moving_time: Total expected moving time of the workout in seconds (optional) distance: Total expected distance of the workout in meters (optional)
Example: "workout_doc": { "description": "High-intensity workout for increasing VO2 max", "steps": [ {"power": {"value": 80, "units": "%ftp"}, "duration": 900, "warmup": true}, {"reps": 2, "text": "High-intensity intervals", "steps": [ {"power": {"value": 110, "units": "%ftp"}, "distance": 500, "text": "High-intensity"}, {"power": {"value": 80, "units": "%ftp"}, "duration": 90, "text": "Recovery"} ]}, {"power": {"value": 80, "units": "%ftp"}, "duration": 600, "cooldown": true}, {"text": ""} ] }
Step properties: distance: Distance of step in meters {"distance": 5000} duration: Duration of step in seconds {"duration": 1800} power/hr/pace/cadence: Define step intensity Percentage of FTP: {"power": {"value": 80, "units": "%ftp"}} Absolute power: {"power": {"value": 200, "units": "w"}} Heart rate: {"hr": {"value": 75, "units": "%hr"}} Heart rate (LTHR): {"hr": {"value": 85, "units": "%lthr"}} Cadence: {"cadence": {"value": 90, "units": "cadence"}} Pace by ftp: {"pace": {"value": 80, "units": "%pace"}} Pace by zone: {"pace": {"value": 2, "units": "pace_zone"}} Zone by power: {"power": {"value": 2, "units": "power_zone"}} Zone by heart rate: {"hr": {"value": 2, "units": "hr_zone"}} Ranges: Specify ranges for power, heart rate, or cadence: {"power": {"start": 80, "end": 90, "units": "%ftp"}} Ramps: Instead of a range, indicate a gradual change in intensity (useful for ERG workouts): {"ramp": true, "power": {"start": 80, "end": 90, "units": "%ftp"}} Repeats: include the reps property and add nested steps {"reps": 3, "steps": [ {"power": {"value": 110, "units": "%ftp"}, "distance": 500, "text": "High-intensity"}, {"power": {"value": 80, "units": "%ftp"}, "duration": 90, "text": "Recovery"} ]} Free Ride: Include freeride to indicate a segment without ERG control, optionally with a suggested power range: {"freeride": true, "power": {"value": 80, "units": "%ftp"}} Comments and Labels: Add descriptive text to label steps: {"text": "Warmup"}
How to use steps:
Set distance or duration as appropriate for step
Use "reps" with nested steps to define repeat intervals (as in example above)
Define one of "power", "hr" or "pace" to define step intensity
Inputs: name (required), workout_type (required), api_key, distance, +5 more. Returns: result
add_or_update_noteA
Add or update a plain text note (category NOTE) on the Intervals.icu calendar.
Args: name: Title of the note description: Plain text content of the note start_date: Date in YYYY-MM-DD format (optional, defaults to today) color: Color of the note (e.g. green, orange, red, blue) athlete_id: The Intervals.icu athlete ID (optional) api_key: The Intervals.icu API key (optional) event_id: The Intervals.icu event ID (optional, for updates)
Inputs: name (required), description (required), color, api_key, +3 more. Returns: result
create_custom_itemB
Create a new custom item for an athlete on Intervals.icu
Args: name: Name of the custom item item_type: Type of custom item (e.g. FITNESS_CHART, TRACE_CHART, INPUT_FIELD, ACTIVITY_FIELD, INTERVAL_FIELD, ACTIVITY_STREAM, ACTIVITY_CHART, ACTIVITY_HISTOGRAM, ACTIVITY_HEATMAP, ACTIVITY_MAP, ACTIVITY_PANEL, ZONES) athlete_id: The Intervals.icu athlete ID (optional, will use ATHLETE_ID from .env if not provided) api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided) description: Description of the custom item (optional) content: Configuration content for the custom item as a dict (optional). Important enum values: - "type" field for INPUT_FIELD/ACTIVITY_FIELD: must be "numeric", "text", or "select" (NOT "number") - "aggregate" field: must be "MIN", "SUM", "MAX", or "AVERAGE" (NOT "AVG") visibility: Visibility setting: PRIVATE, FOLLOWERS, or PUBLIC (optional)
Inputs: name (required), item_type (required), api_key, content, +3 more. Returns: result
delete_custom_itemA
Delete a custom item for an athlete from Intervals.icu
Args: item_id: The custom item ID to delete athlete_id: The Intervals.icu athlete ID (optional, will use ATHLETE_ID from .env if not provided) api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided)
Inputs: item_id (required), api_key, athlete_id. Returns: result
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
Inputs: event_id (required), api_key, athlete_id. Returns: result
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
Inputs: end_date (required), start_date (required), api_key, athlete_id. Returns: result
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)
Inputs: limit, api_key, end_date, athlete_id, +2 more. Returns: result
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)
Inputs: activity_id (required), api_key. Returns: result
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)
Inputs: activity_id (required), api_key. Returns: result
get_activity_messagesA
Get messages (notes/comments) for a specific activity from Intervals.icu
Args: activity_id: The Intervals.icu activity ID api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided)
Inputs: activity_id (required), api_key. Returns: result
get_activity_rawA
DIAGNOSTIC TOOL (temporary): return the raw JSON the Intervals.icu API sends back for one activity, unmodified. Used to debug why get_activity_details/get_activities show blank fields for some accounts (field-name mismatch investigation). Safe to remove once the mapping bug is confirmed fixed.
Args: activity_id: The Intervals.icu activity ID api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided)
Inputs: activity_id (required), api_key. Returns: result
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
Inputs: activity_id (required), api_key, stream_types. Returns: result
get_athlete_power_curvesA
Get power curves for an athlete from Intervals.icu.
Returns best power output for selected durations across specified time periods. Uses FFT power computation. Power values are in watts.
Args: activity_type: Activity type (e.g. "Ride", "Run", "VirtualRide"). Default is "Ride". durations: Durations in seconds to include. Default is [5, 15, 30, 60, 120, 300, 600, 1200, 3600] indoor_outdoor: Filter by location — "indoor" or "outdoor". Omit for no filtering. start_date: Start date (YYYY-MM-DD) for custom date range curve. Must be used with end_date. end_date: End date (YYYY-MM-DD) for custom date range curve. Must be used with start_date. this_season: Include this season's curve (default True) last_season: Include last season's curve (default True) include_normalised: Include weight-normalised W/kg values (default True) athlete_id: Intervals.icu athlete ID (optional, uses ATHLETE_ID from .env if not provided) api_key: Optional API key override. Uses API_KEY from .env if not provided.
Inputs: api_key, end_date, durations, athlete_id, +6 more. Returns: result
get_custom_item_by_idA
Get detailed information for a specific custom item from Intervals.icu
Args: item_id: The custom item ID athlete_id: The Intervals.icu athlete ID (optional, will use ATHLETE_ID from .env if not provided) api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided)
Inputs: item_id (required), api_key, athlete_id. Returns: result
get_custom_itemsA
Get custom items (charts, custom fields, zones, etc.) for an athlete from Intervals.icu
Args: athlete_id: The Intervals.icu athlete ID (optional, will use ATHLETE_ID from .env if not provided) api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided)
Inputs: api_key, athlete_id. Returns: result
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)
Inputs: event_id (required), api_key, athlete_id. Returns: result
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)
Inputs: api_key, end_date, athlete_id, start_date. Returns: result
get_gear_listA
Get the gear catalog (bikes, shoes, etc.) for an athlete from Intervals.icu.
Returns one line per gear item with id, type, name, and basic stats. The result is cached for the MCP process lifetime; pass refresh=True to re-fetch.
Args: athlete_id: The Intervals.icu athlete ID (optional, will use ATHLETE_ID from .env if not provided) api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided) refresh: If True, bypass the cache and re-fetch from the API (default False)
Inputs: api_key, refresh, athlete_id. Returns: result
get_wellness_dataA
Get wellness data for an athlete from Intervals.icu.
By default returns standard wellness fields (training metrics, vitals, sleep, subjective scores, etc.). Set include_all_fields=True to also include any additional or custom fields configured by the user in Intervals.icu.
Args: athlete_id: The Intervals.icu athlete ID (optional, will use ATHLETE_ID from .env if not provided) api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided) start_date: Start date in YYYY-MM-DD format (optional, defaults to 30 days ago) end_date: End date in YYYY-MM-DD format (optional, defaults to today) include_all_fields: If True, include additional and custom fields beyond the standard set (optional, defaults to False)
Inputs: api_key, end_date, athlete_id, start_date, +1 more. Returns: result
update_custom_itemA
Update an existing custom item for an athlete on Intervals.icu
Args: item_id: The custom item ID to update athlete_id: The Intervals.icu athlete ID (optional, will use ATHLETE_ID from .env if not provided) api_key: The Intervals.icu API key (optional, will use API_KEY from .env if not provided) name: New name for the custom item (optional) item_type: New type for the custom item (optional) description: New description for the custom item (optional) content: New configuration content for the custom item as a dict (optional). Important enum values: - "type" field for INPUT_FIELD/ACTIVITY_FIELD: must be "numeric", "text", or "select" (NOT "number") - "aggregate" field: must be "MIN", "SUM", "MAX", or "AVERAGE" (NOT "AVG") visibility: New visibility setting: PRIVATE, FOLLOWERS, or PUBLIC (optional)
Inputs: item_id (required), name, api_key, content, +4 more. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 21 tools
Most tools target distinct resources or distinct data views (list vs details vs streams vs intervals), so selection is usually clear. The main potential confusions are get_activity_details vs get_activity_raw and add_or_update_event vs add_or_update_note, but the descriptions distinguish these adequately.
The tool names largely follow a consistent verb_noun pattern: get_, create_, update_, delete_, and add_or_update_. Minor deviations like add_activity_message instead of add_or_update_activity_message and get_gear_list instead of get_gears are acceptable but keep it from being perfectly uniform.
21 tools is on the higher side, but the server covers a broad API surface: activities, events, notes, custom items, gear, wellness, and power curves. The included diagnostic tool get_activity_raw adds some bloat, but overall the count is reasonable for the domain.
The tool set covers the main lifecycle needs for activities, events, and custom items, with good read/write coverage. Minor gaps exist, such as no delete_note, no activity update/delete, and read-only gear access, but agents can complete most typical workflows without dead ends.
Maintenance
Related MCP Connectors
Connect Intervals.icu to Claude and ChatGPT: read training, plan workouts. Training never stored.
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.
tri-train is a training platform for triathletes that syncs activities from Strava and Garmin and exposes them to Claude through a remote MCP server. Ask Claude how your last block went, why your run pace dropped, or whether you are fresh enough for Sunday's race, and it answers from your real data: activities with laps and grade-adjusted pace, weekly load and the performance management chart (CTL/ATL/TSB), sleep, HRV and resting heart rate, and your race calendar with predictions. Claude can also act: create and adjust planned workouts with structured intervals, push them to your Garmin watch, add races and write notes. Every change is journaled and can be undone. Read and write access are separate OAuth scopes, and the server enforces them on every call. Built and hosted in Switzerland by a triathlete; data stays on our own servers (Swiss revDSG / GDPR).
Related MCP Servers
- AlicenseAqualityDmaintenanceConnects Claude with the Intervals.icu API to retrieve fitness data including activities, workouts, wellness metrics, and training events.610389GPL 3.0
- AlicenseNot gradedqualityCmaintenanceConnects to Intervals.icu to let users query training data, create workouts, manage calendar events, and coach athletes through natural language in Claude Desktop.139 npmMIT
- AlicenseAqualityBmaintenanceEnables Claude and ChatGPT to access and manage Intervals.icu data, including activities, events, wellness metrics, power curves, and custom items through natural language.26GPL 3.0
- AlicenseNot gradedqualityNot gradedmaintenanceEnables Claude to read recent Garmin training and wellness data via intervals.icu and to create, update, or delete structured workouts that sync to Garmin Connect and a Garmin watch.MIT