Health & fitness
Trainerize
Clients, programs, check-ins and messages for your Trainerize business.
14 endpoints
Your agent reads your activities and wellness, plans workouts on your calendar and checks your thresholds. It runs in the ChatGPT and Claude apps, on a schedule if you like, with no API key and no server to host.
12 tools Read and write
Yes to both (checked 6 Nov 2026). Intervals.icu has a public REST API with a personal key and OAuth, and since 31 Oct 2026 an official Intervals.icu Connector in beta at mcp.intervals.icu, for Supporters at $4 a month. Cotlet runs 12 Intervals.icu tools hosted, over MCP for agents and REST for scripts, with no API key and no plan upgrade for Cotlet to work.
| What you need | REST API | Official connector | Cotlet |
|---|---|---|---|
| Read activities and intervals | Yes, with your own code | Yes | Yes |
| Read and log daily wellness | Yes, with your own code | Yes, after your yes | Yes |
| Add, move and delete planned workouts | Yes, with your own code | Yes, after your yes | Yes |
| Set RPE and feel on a session | Yes, with your own code | Yes | Yes |
| Post a comment on an activity | Yes, with your own code | Reads comments | Yes, after your OK |
| No API key or code to write | Key and code needed | Sign in with Intervals.icu | Sign in once |
| Runs on a schedule, no chat open | Your own script | Inside a chat | Yes, plus n8n, Make, Zapier |
| Extra cost | None | Supporter, $4 a month | Credits per call |
Checked 6 Nov 2026. Sources: Intervals.icu Forum: API access to Intervals.icu · Intervals.icu: Open API · Intervals.icu Forum: Intervals.icu Connector (Official MCP) beta · Intervals.icu: Connector · Intervals.icu: Pricing
Use your own account in its Cotlet Cloud Browser.
Connect your agent or create a Cotlet API key.
Ask your agent or send an HTTP request.
We never keep your Intervals.icu password, and a comment on an activity waits for your OK before coaches and followers can read it. Who can see your session
Three steps. The same address works in Claude, ChatGPT, editors, n8n, Make and Zapier.
Enable Intervals.icu. Sign up, log in to Intervals.icu in its Cloud Browser and turn it on for agents.
Add the Cotlet address. Add https://cotlet.dev/mcp/v1 as an MCP server or connector in your agent.
Sign in or use a key. Chat apps sign you in to Cotlet; editors and scripts take an API key from the console.
One address covers Intervals.icu and every other app you enable. Turned Intervals.icu on after connecting? Refresh the connector so the tools show up.
Settings > Connectors > Add custom connector
URL: https://cotlet.dev/mcp/v1/connect
Claude Code:
claude mcp add --transport http cotlet \
https://cotlet.dev/mcp/v1 \
--header "Authorization: Bearer $COTLET_API_KEY" Settings > Apps & Connectors > Create
MCP server URL: https://cotlet.dev/mcp/v1/connect
Authentication: OAuth // ~/.cursor/mcp.json
{
"mcpServers": {
"cotlet": {
"url": "https://cotlet.dev/mcp/v1",
"headers": { "Authorization": "Bearer ${env:COTLET_API_KEY}" }
}
}
} # ~/.codex/config.toml
[mcp_servers.cotlet]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY" MCP Client Tool (inside an AI Agent)
Transport: HTTP Streamable
URL: https://cotlet.dev/mcp/v1
Auth: Bearer, <your key>
Tool: intervals_icu_read Make: MCP Client > Call a tool
Zapier: MCP Client by Zapier > Run Tool
Server URL: https://cotlet.dev/mcp/v1
Token: <your key>
Tool: intervals_icu_write Activities that came from Strava return a date and an id only. Garmin, Wahoo and direct uploads come in full.
Returns the activities Intervals.icu shows for your account between two dates, newest first. Each row has the id, name, sport type, start time, moving time, distance, training load and average power or heart rate where the activity has them. Strava-sourced activities show date and id only, because Intervals.icu may not pass their data on. Pass an id to get_activity for the full detail.
MCP callintervals_icu_read → list_activities
REST endpointGET https://cotlet.dev/api/v1/intervals-icu/activities
| Name | Type | Description |
|---|---|---|
| oldest date required | date | First day to include. |
| newest date required | date | Last day to include. |
| type string | string | Only this sport, e.g. Ride, Run, Swim, WeightTraining. |
{
"oldest": "2026-10-01",
"newest": "2026-10-01"
} {
"activities": [
{
"id": "i88120456",
"name": "Sunday long ride",
"type": "Ride",
"start_date_local": "2026-11-01T08:42:10",
"moving_time": 12840,
"distance": 82400,
"icu_training_load": 124,
"average_watts": 168
},
{
"id": "i88104311",
"name": "Easy spin",
"type": "Ride",
"start_date_local": "2026-10-30T17:05:00",
"moving_time": 2700,
"distance": 12100,
"icu_training_load": 58,
"average_watts": 132
}
]
} Returns one activity by id: summary figures, the intervals Intervals.icu detected (duration, average power and heart rate), the description, RPE and feel. Intervals come in the order they happen in the activity. An activity that came from Strava returns only its date and id.
MCP callintervals_icu_read → get_activity
REST endpointGET https://cotlet.dev/api/v1/intervals-icu/activity
| Name | Type | Description |
|---|---|---|
| id string required | string | Activity id from list_activities. |
{
"id": "id"
} {
"id": "i88120456",
"name": "Sunday long ride",
"type": "Ride",
"start_date_local": "2026-11-01T08:42:10",
"moving_time": 12840,
"icu_training_load": 124,
"icu_rpe": 6,
"feel": 2,
"description": "Steady tempo, felt good.",
"intervals": [
{
"id": 1,
"label": "Interval 1",
"moving_time": 1200,
"average_watts": 212,
"average_heartrate": 148
},
{
"id": 2,
"label": "Interval 2",
"moving_time": 1200,
"average_watts": 208,
"average_heartrate": 151
}
]
} Changes only the fields you pass on one of your activities. RPE is 1 to 10. The recorded data stays as it is. Returns the activity as saved. It reaches no one and a second call puts the old values back, so it does not ask for confirmation.
MCP callintervals_icu_write → update_activity
REST endpointPATCH https://cotlet.dev/api/v1/intervals-icu/activity
| Name | Type | Description |
|---|---|---|
| id string required | string | Activity id from list_activities. |
| name string | string | New name. |
| description string | string | New description. |
| rpe integer | integer | Rate of perceived exertion, 1 to 10. |
| feel integer | integer | Feel, on the scale the activity page shows. |
{
"id": "id"
} {
"id": "i88120456",
"name": "Sunday long ride",
"icu_rpe": 6,
"description": "Legs heavy in the last interval."
} Adds a comment to one activity. Coaches and athletes who follow the activity can read it. Returns the comment with its time. By default you confirm each call; you can switch that off for this tool.
MCP callintervals_icu_write → add_activity_comment
REST endpointPOST https://cotlet.dev/api/v1/intervals-icu/activities/{activity_id}/comment
| Name | Type | Description |
|---|---|---|
| activity_id string required | string | Activity id from list_activities. |
| comment string required | string | Text of the comment. |
{
"activity_id": "activity_8c41d2",
"comment": "comment"
} {
"activity_id": "i88120456",
"comment": "Felt strong on the climbs today.",
"created": "2026-11-06T09:12:00"
} A workout takes its steps as Intervals.icu workout text, one dash line per step. Connected devices receive it like any planned workout.
Returns the calendar entries between two dates in date order: planned workouts, notes and races, each with id, category, sport type, name, start date and the workout text. Entries added by other apps are included. Use the id with update_event or delete_event.
MCP callintervals_icu_read → list_events
REST endpointGET https://cotlet.dev/api/v1/intervals-icu/events
| Name | Type | Description |
|---|---|---|
| oldest date required | date | First day to include. |
| newest date required | date | Last day to include. |
| category enum | enum | WORKOUT or NOTE. Default: both. |
{
"oldest": "2026-10-01",
"newest": "2026-10-01"
} {
"events": [
{
"id": 55120931,
"category": "WORKOUT",
"type": "Ride",
"start_date_local": "2026-11-09T00:00:00",
"name": "Sweet spot 3x10",
"description": "- 10m 55% Warmup\n\n3x\n- 10m 90%\n- 5m 50%\n\n- 10m 50% Cooldown"
},
{
"id": 55120940,
"category": "NOTE",
"start_date_local": "2026-11-10T00:00:00",
"name": "Rest day",
"description": "No training."
}
]
} Adds one entry on a day of your calendar. A WORKOUT takes its steps as Intervals.icu workout text in description: one dash line per step with a duration and a target, repeats written as 3x on their own line. Returns the new event with its id. It reaches no one and you undo it with delete_event, so it does not ask for confirmation. Devices connected to Intervals.icu receive it as the app does for any planned workout.
MCP callintervals_icu_write → create_event
REST endpointPOST https://cotlet.dev/api/v1/intervals-icu/events
| Name | Type | Description |
|---|---|---|
| category enum required | enum | WORKOUT or NOTE. |
| start_date_local datetime required | datetime | Local day, e.g. 2026-11-09T00:00:00. |
| name string required | string | Title shown on the calendar. |
| type string | string | Sport for a workout, e.g. Ride, Run, WeightTraining. |
| description string | string | Workout text for a WORKOUT, or the text of a NOTE. |
{
"category": "WORKOUT",
"start_date_local": "2026-11-09T00:00:00",
"name": "Sweet spot 3x10",
"type": "Ride",
"description": "- 10m 55% Warmup\n\n3x\n- 10m 90%\n- 5m 50%\n\n- 10m 50% Cooldown"
} {
"id": 55120931,
"category": "WORKOUT",
"type": "Ride",
"start_date_local": "2026-11-09T00:00:00",
"name": "Sweet spot 3x10",
"description": "- 10m 55% Warmup\n\n3x\n- 10m 90%\n- 5m 50%\n\n- 10m 50% Cooldown"
} Changes the fields you pass on one calendar entry and leaves the rest. Moving a workout is a new start_date_local. Returns the updated event. It reaches no one and a second call puts the old values back, so it does not ask for confirmation.
MCP callintervals_icu_write → update_event
REST endpointPATCH https://cotlet.dev/api/v1/intervals-icu/event
| Name | Type | Description |
|---|---|---|
| id integer required | integer | Event id from list_events. |
| start_date_local datetime | datetime | New local day. |
| name string | string | New title. |
| description string | string | New workout text or note text. |
{
"id": 1
} {
"id": 55120931,
"category": "WORKOUT",
"type": "Ride",
"start_date_local": "2026-11-11T00:00:00",
"name": "Sweet spot 3x10"
} Deletes one calendar entry by id. Completed activities are not touched. It reaches no one; if you delete the wrong entry, create it again with create_event. It does not ask for confirmation.
MCP callintervals_icu_write → delete_event
REST endpointDELETE https://cotlet.dev/api/v1/intervals-icu/events
| Name | Type | Description |
|---|---|---|
| id integer required | integer | Event id from list_events. |
{
"id": 1
} {
"deleted": 1,
"id": 55120940
} Sleep is in hours. A device that syncs the same day may write its own values over yours.
Returns one entry per day between two dates, oldest first, with the fields you or your device filled in: weight, resting heart rate, sleep, soreness, fatigue, stress, mood and comments. Days without data are left out. The fitness, fatigue and form values Intervals.icu calculates for each day come with the entry when the app shows them.
MCP callintervals_icu_read → list_wellness
REST endpointGET https://cotlet.dev/api/v1/intervals-icu/wellness
| Name | Type | Description |
|---|---|---|
| oldest date required | date | First day to include. |
| newest date required | date | Last day to include. |
{
"oldest": "2026-10-01",
"newest": "2026-10-01"
} {
"wellness": [
{
"id": "2026-11-04",
"weight": 72.4,
"restingHR": 48,
"sleepSecs": 27000,
"soreness": 2,
"mood": 4
},
{
"id": "2026-11-05",
"weight": 72.3,
"restingHR": 50,
"sleepSecs": 25200,
"soreness": 3,
"mood": 3
}
]
} Writes the values you pass for one day and keeps the others. Sleep is in hours; soreness, fatigue, stress and mood use the scales the Intervals.icu wellness form shows. Returns the day as saved. It reaches no one and a second call corrects it, so it does not ask for confirmation. A device that syncs the same day may write its own values over yours.
MCP callintervals_icu_write → update_wellness
REST endpointPATCH https://cotlet.dev/api/v1/intervals-icu/wellness
| Name | Type | Description |
|---|---|---|
| date date required | date | Day to write. |
| sleep_hours number | number | Hours of sleep. |
| weight number | number | Body weight in kilograms. |
| soreness integer | integer | Soreness, on the form scale. |
| fatigue integer | integer | Fatigue, on the form scale. |
| mood integer | integer | Mood, on the form scale. |
| comments string | string | Free text for the day. |
{
"date": "2026-10-01"
} {
"id": "2026-11-06",
"sleepSecs": 27000,
"soreness": 3,
"mood": 4,
"comments": "Slept well"
} Read the thresholds before you write workouts in percent. Strava activities do not count in the power curve.
Returns the thresholds Intervals.icu uses for one sport: FTP, threshold heart rate, max heart rate, threshold pace and the zones built from them. Read it before writing workouts in percent so the targets match the athlete. It changes nothing.
MCP callintervals_icu_read → get_sport_settings
REST endpointGET https://cotlet.dev/api/v1/intervals-icu/sport-settings
| Name | Type | Description |
|---|---|---|
| type string required | string | Sport, e.g. Ride, Run, Swim. |
{
"type": "type"
} {
"type": "Ride",
"ftp": 248,
"lthr": 168,
"max_hr": 189,
"power_zones": [
55,
75,
90,
105,
120,
150,
999
]
} Returns the best average power for standard durations (5 seconds to 1 hour) across the activities in a date range, with the date of each effort. Use it to check whether a recent best effort sits above your current FTP. Strava-sourced activities do not count because their data is not returned.
MCP callintervals_icu_read → get_power_curve
REST endpointGET https://cotlet.dev/api/v1/intervals-icu/power-curve
| Name | Type | Description |
|---|---|---|
| oldest date required | date | First day to include. |
| newest date required | date | Last day to include. |
| type string | string | Sport. Default: Ride. |
{
"oldest": "2026-10-01",
"newest": "2026-10-01"
} {
"type": "Ride",
"bests": [
{
"seconds": 300,
"watts": 318,
"date": "2026-10-12"
},
{
"seconds": 1200,
"watts": 262,
"date": "2026-10-19"
},
{
"seconds": 3600,
"watts": 238,
"date": "2026-09-28"
}
]
} Your logged-in Intervals.icu profile, AES-256-GCM, in Finland. Not your password.
The 12 Intervals.icu tools, never the login or a cookie.
Your activities, wellness, calendar and thresholds, and the athletes you coach if your account has them.
Your Supporter subscription, billing, password and account deletion.
Your agent gets a link to sign in again. We never do it for you.
Disable for agents, reset the browser or delete the key. The next call stops.
Our site scores A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory (live results). There is no SOC 2 report or third-party pentest yet.
Intervals.icu ships changes often. Its forum lists a connector release on 5 Nov 2026 alone. When it moves a button or renames a field, the fix happens on our side. status.cotlet.dev watches the site, console and API every 3 minutes.
| Action | What happens |
|---|---|
| Create calendar event | A workout or note appears on the day; undo with delete |
| Update calendar event | Only the fields you pass change; a second call puts the old values back |
| Delete calendar event | One entry goes; completed activities stay |
| Log wellness | Values for one day; the other fields stay |
| Update activity | Name, description, RPE or feel; recorded data stays |
| Comment on activity | Coaches and followers of the activity read it |
1 of 12 tools asks first: the comment, because other people read it. The other writes reach no one and you can undo each one with another call. Reads never ask. Switch the wait off per tool for a scheduled run.
Read a comment before you approve it. The tools cannot edit one afterwards.
{
"name": "create_event",
"arguments": {
"category": "WORKOUT",
"start_date_local": "2026-11-09T00:00:00",
"name": "Sweet spot 3x10",
"type": "Ride",
"description": "- 10m 55% Warmup\n\n3x\n- 10m 90%\n- 5m 50%\n\n- 10m 50% Cooldown"
}
} curl -X POST https://cotlet.dev/api/v1/intervals-icu/events \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"category":"WORKOUT","start_date_local":"2026-11-09T00:00:00","name":"Sweet spot 3x10","type":"Ride","description":"- 10m 55% Warmup\n\n3x\n- 10m 90%\n- 5m 50%\n\n- 10m 50% Cooldown"}' {
"id": 55120931,
"category": "WORKOUT",
"type": "Ride",
"start_date_local": "2026-11-09T00:00:00",
"name": "Sweet spot 3x10",
"description": "- 10m 55% Warmup\n\n3x\n- 10m 90%\n- 5m 50%\n\n- 10m 50% Cooldown"
} Scripts and cron jobs reach the same tools over REST at /api/v1/intervals-icu, with the same key and price. A call Intervals.icu refuses fails and costs nothing. The tools table lists the REST path of each tool.
About $18 a monthfor one athlete training five times a week, 3,080 credits. Intervals.icu stays free or $4 as before.
| Job | Calls | Credits |
|---|---|---|
| Log wellness and check fatigue, daily | 2 × 30 | 600 |
| Add RPE and notes after a session | 2 × 20 | 400 |
| Weekly training review | 7 × 4 | 280 |
| Plan next week's workouts, weekly | 7 × 4 | 280 |
| Check the power curve against FTP, monthly | 2 × 1 | 20 |
| Cloud Browser, 30 days | 1,500 | |
| Total | 3,080 |
The month is our example. Intervals.icu publishes no figure for agent use; its home page counts 200,000+ active athletes. The platform is free, and Supporter costs $4 a month (pricing, 6 Nov 2026). Dollars at the $29 pack rate.
| Credits | Price, one time | Calls at 10 credits | Per 1,000 credits |
|---|---|---|---|
| 5,000 | $29 | 500 | $5.80 |
| 15,000 | $79 | 1,500 | $5.27 |
| 32,000 | $149 | 3,200 | $4.66 |
| 60,000 | $249 | 6,000 | $4.15 |
Only successful calls use credits; failed calls and timeouts cost nothing. At a balance of 0 calls pause, never a surprise charge. Authenticate with the Authorization: Bearer header.
| Option | What it does | Where it stops |
|---|---|---|
| mvilanova/intervals-mcp-server | Python MCP server for Claude and ChatGPT, GPL-3.0, 388 stars. | Runs on your computer with your API key. ChatGPT needs a public URL you set up. Last commit 2 Aug 2026. |
| hhopke/intervals-icu-mcp | Read and write server with 73 tools, MIT, 121 stars. | You install it with uvx or Docker and paste your API key. Last commit 5 Nov 2026. |
| futureweb/intervals-mcp-server | Adds sign-in with Intervals.icu and Garmin-enriched metrics, GPL-3.0. | Public beta, 13 stars, you host it. Last commit 1 Nov 2026. |
| IntervalSync | Hosted MCP server with OAuth sign-in for Claude, ChatGPT and Grok. | Pro is $5 a month with up to 600 Intervals.icu calls a day. The free plan reads only. |
| IcuSync | Hosted connector with 32 tools (20 read, 12 write). | $20 a year. Built around your calendar and workouts. |
| Intervals.icu Connector | The official connector for Claude, ChatGPT, Gemini and Grok. | Beta, Supporter plan at $4 a month, works inside a chat. |
Pick a GitHub server if you are happy to run it on your own computer. Pick the official connector if one chat assistant is enough. Pick Cotlet if your agent should also run on a schedule, in n8n, Make or Zapier, next to your other apps, with one account.
Cotlet is run by Take Group sp. z o.o., a software company registered in Poland, EU (VAT PL6342984273), working since 2019. The founders are Bart Krawczyk (Co-founder, CTO) and Jake Slugocki (Co-founder, SEO, sales and marketing). Questions about the Intervals.icu tools go to contact@cotlet.dev.
Sign up at cotlet.dev, log in to Intervals.icu once in its Cloud Browser and add Cotlet to ChatGPT or Claude, following the steps in your console. No API key is needed. ChatGPT and Claude then work in your Intervals.icu account through Cotlet, in their phone apps too.
With Cotlet, ChatGPT, Claude and other AI agents handle jobs like these in Intervals.icu: plan next week of workouts; log daily wellness and flag fatigue; weekly training review. You ask in plain words, and anything that reaches other people waits for your OK first.
Yes. Call Cotlet's REST API from a script or an HTTP step in n8n, Make or Zapier with your Cotlet key. MCP is the way in for AI agents; you do not need one to use REST.
Sign up free at https://cotlet.dev, open Intervals.icu under Integrations in the console and log in to Intervals.icu in its Cloud Browser. Your free trial starts with your first app, no card needed.
Yes to both (checked 6 Nov 2026). The REST API works with a personal key or OAuth. The official Intervals.icu Connector is in beta for Supporters, at $4 a month, and works in Claude, ChatGPT, Gemini and Grok. Cotlet is the hosted route that needs neither a key nor a Supporter plan, and it runs on a schedule and in n8n, Make and Zapier.
Not for Cotlet. You can sign in with any account. Features that Intervals.icu keeps for Supporters stay Supporter-only.
Only as far as Intervals.icu shows them. Strava activities come through with date and id only, and the Intervals.icu API does not return their data (Intervals.icu forum, API access thread, 6 Nov 2026). Garmin, Wahoo and direct uploads come in full.
Yes. A personal API key allows 5,000 requests a day and 2,500 per rolling 15 minutes, and each IP address 10 calls a second (Intervals.icu forum, API access thread). Cotlet tools run in your account, not through your API key.
Yes, for activity uploads, calendar updates and athlete events, set up for an OAuth app (Intervals.icu Open API page, 6 Nov 2026). To react on a schedule without building an app, run your agent on a timer and read the calendar.
Only the way in. Both have the same 12 tools, inputs and answers, one API key and one price. Agents use MCP; scripts, cron jobs and HTTP steps use REST.
No. Cotlet is independent and not affiliated with Intervals.icu.
Free 7-day trial with 2,000 credits, no card needed.
May we use Google Analytics to see which pages help people? It sets cookies only if you accept. No ads, and we never sell data. Cookie policy