Intervals.icu MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| INTERVALS_ICU_API_KEY | Yes | Intervals.icu API key from Settings → Developer Settings | |
| INTERVALS_ICU_TOOLSETS | No | Comma-separated toolsets, 'default' or 'all' | default |
| INTERVALS_ICU_ATHLETE_ID | No | Athlete ID; 0 means the owner of the API key | 0 |
| INTERVALS_ICU_WRITE_MODE | No | 'read-only', 'safe' (create/update) or 'full' (also delete) | safe |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_athlete_profileA | Get the athlete profile: time zone, units, weight, resting HR and per-sport settings (threshold HR/pace/power and training zones). Use it to interpret zones and paces or before planning workouts. |
| get_fitness_summaryA | Get training fitness (CTL, 42-day load), fatigue (ATL, 7-day load) and form (TSB = fitness − fatigue) with the Intervals.icu form zone, a daily series, and weekly totals by sport. Defaults to the last 6 weeks. Use it for questions about training load, freshness or trends. |
| list_activitiesA | List completed activities (runs, rides, etc.) in a date range, newest first, with distance, time, pace/GAP, heart rate and training load, plus totals per activity type. Defaults to the last 30 days. Use get_activity for details of one activity. |
| search_activitiesA | Search all activities by name (case-insensitive substring) or by tag (start the query with #, e.g. "#race"). Use it to find specific sessions regardless of date. |
| get_activityA | Get details of one activity: summary metrics, description, time in heart-rate and pace zones, aerobic decoupling, HR recovery, fitness/fatigue after the session and, optionally, the list of intervals/laps with pace and HR. Activity ids look like "i123456789" (see list_activities). |
| list_activity_commentsA | List comments and notes (e.g. from a coach or the athlete) on one activity. |
| update_activityA | Edit a completed activity: name, description/notes, sport type, perceived exertion (RPE), feel, tags, or race/commute flags. Only the fields you pass are changed. |
| create_manual_activityA | Log an activity that was not recorded by a device (e.g. a treadmill run without a watch). Today or past dates only. It counts towards training load; confirm details with the user first. |
| get_activity_streamsA | Get second-by-second data of one activity (heart rate, pace/speed, cadence, altitude, distance, power), downsampled to a compact table: each row averages a time window. Use it to analyse pacing, HR drift or how effort changed during the session. GPS coordinates are only included when "latlng" is requested explicitly. |
| get_activity_histogramA | Get how much time was spent at each heart rate, pace or power level in one activity (a histogram with ranges, time and % of total). Finer-grained than time in zones. |
| get_activity_best_effortsA | Find the best efforts inside one activity: fastest pace over a distance (e.g. best 1 km), highest average heart rate or power over a duration (e.g. best 5 min). Returns when each effort happened. For all-time or period bests across activities use get_athlete_curves. |
| get_activity_segment_statsA | Get pace, heart rate, cadence and intensity for a chosen part of an activity, e.g. "from 10:00 to 20:00". Use it to compare the first and second half or a climb. |
| search_intervalsA | Find past activities containing intervals of a given duration and intensity, e.g. "4–6 minute reps at 95–105% of threshold". Intensity is % of threshold (FTP, threshold pace or LTHR depending on the metric). |
| get_athlete_curvesA | Get personal bests for a sport over one or more periods: best times and paces at standard distances (pace), or highest average heart rate / power for standard durations. Pace curves include critical speed, a good estimate of threshold pace. Use it for PRs, race predictions and fitness progress (compare periods such as 42d vs 1y). |
| get_wellnessA | Get daily wellness data: resting HR, HRV, sleep (duration, score), weight, steps, readiness and subjective ratings (soreness, fatigue, stress, mood, motivation on the Intervals.icu 1–4 scales), plus period averages. Defaults to the last 14 days. Use it for recovery and readiness questions. |
| update_wellnessA | Log or correct wellness data for one day: weight, resting HR, HRV, sleep, subjective ratings and comments. Only the fields you pass are changed. Measurements (weight, HR, HRV, sleep) cannot be removed once set, only overwritten; ratings are cleared with 0 and comments with "". |
| list_eventsA | List calendar entries: planned workouts (with the workout steps as text), races, notes, holidays, sickness and injuries. Defaults to today and the next 2 weeks. Use it to see what is planned or to compare the plan with completed activities. |
| get_eventA | Get one calendar event (planned workout, race or note) by id, including the full workout description. |
| create_eventsA | Add planned workouts, races, notes or holidays/sickness to the athlete calendar (up to 50 per call). Planned workouts sync to the athlete's watch when their device integration is enabled. Show the plan to the user and get agreement before calling. An entry with the same date, category and name as an existing one is skipped unless allow_duplicates is true. Check workout_check in the result and fix any warnings with update_event. Workout text syntax (Intervals.icu): one step per line starting with "- ", e.g. "- 10m Z2 Pace", "- 1.5km 7:00/km Pace", "- 90s 85% Pace", "- 10m Ramp 60-80% HR", "- 5m Z2 HR". Durations: 30s, 90s, 1m30, 10m, 1h. Distances: 400mtr (meters!), 1.5km, 2mi — "400m" means 400 MINUTES. Repeats: a line ending in "Nx" (e.g. "Main set 4x") followed by its steps, then a blank line. Section lines like "Warmup"/"Cooldown" are labels. Text before the duration labels a step ("- Strides 20s Z5 Pace"). Power (rides): "75%" (of FTP), "200w", "150-180w", "Z2". Bpm ranges like "140-150bpm" are NOT supported; use HR zones or % HR. |
| update_eventA | Change a calendar event: move it to another date, rename it, or rewrite the workout steps. Only the fields you pass are changed. Confirm the change with the user first. Workout text syntax (Intervals.icu): one step per line starting with "- ", e.g. "- 10m Z2 Pace", "- 1.5km 7:00/km Pace", "- 90s 85% Pace", "- 10m Ramp 60-80% HR", "- 5m Z2 HR". Durations: 30s, 90s, 1m30, 10m, 1h. Distances: 400mtr (meters!), 1.5km, 2mi — "400m" means 400 MINUTES. Repeats: a line ending in "Nx" (e.g. "Main set 4x") followed by its steps, then a blank line. Section lines like "Warmup"/"Cooldown" are labels. Text before the duration labels a step ("- Strides 20s Z5 Pace"). Power (rides): "75%" (of FTP), "200w", "150-180w", "Z2". Bpm ranges like "140-150bpm" are NOT supported; use HR zones or % HR. |
| mark_event_doneA | Mark a planned workout as completed without a recorded file: creates a manual activity matching the plan (for sessions done without a watch). Only for today or past dates. |
| duplicate_eventsA | Copy calendar events to later weeks, e.g. repeat this week's workouts for the next 3 weeks. Confirm with the user first. |
| apply_planA | Copy all workouts of a training plan from the library (a PLAN folder, see list_workout_library) onto the calendar, starting on a date. Each workout lands on start date + its plan day. Adds many events: confirm the plan and start date first. |
| list_workout_libraryA | List the athlete's workout library: folders and training plans with their workouts (name, sport, duration, load). Use get_workout for the steps of a workout. |
| get_workoutA | Get one workout from the library, including its steps in Intervals.icu text format. |
| get_training_planA | Get the training plan the athlete is currently following (if any): plan name, start date and its workouts by day. |
| create_folderA | Create a folder (or a training plan) in the workout library to hold reusable workouts. |
| update_folderC | Rename a workout library folder or plan, or change its description. |
| create_workoutsA | Save reusable workouts in a library folder or plan (up to 50 per call). Check workout_check in the result and fix warnings with update_workout. Workout text syntax (Intervals.icu): one step per line starting with "- ", e.g. "- 10m Z2 Pace", "- 1.5km 7:00/km Pace", "- 90s 85% Pace", "- 10m Ramp 60-80% HR", "- 5m Z2 HR". Durations: 30s, 90s, 1m30, 10m, 1h. Distances: 400mtr (meters!), 1.5km, 2mi — "400m" means 400 MINUTES. Repeats: a line ending in "Nx" (e.g. "Main set 4x") followed by its steps, then a blank line. Section lines like "Warmup"/"Cooldown" are labels. Text before the duration labels a step ("- Strides 20s Z5 Pace"). Power (rides): "75%" (of FTP), "200w", "150-180w", "Z2". Bpm ranges like "140-150bpm" are NOT supported; use HR zones or % HR. |
| update_workoutA | Change a library workout (name, steps, sport, folder). Only the fields you pass are changed. Workout text syntax (Intervals.icu): one step per line starting with "- ", e.g. "- 10m Z2 Pace", "- 1.5km 7:00/km Pace", "- 90s 85% Pace", "- 10m Ramp 60-80% HR", "- 5m Z2 HR". Durations: 30s, 90s, 1m30, 10m, 1h. Distances: 400mtr (meters!), 1.5km, 2mi — "400m" means 400 MINUTES. Repeats: a line ending in "Nx" (e.g. "Main set 4x") followed by its steps, then a blank line. Section lines like "Warmup"/"Cooldown" are labels. Text before the duration labels a step ("- Strides 20s Z5 Pace"). Power (rides): "75%" (of FTP), "200w", "150-180w", "Z2". Bpm ranges like "140-150bpm" are NOT supported; use HR zones or % HR. |
| duplicate_workoutsA | Copy workouts inside a training plan to later weeks of the plan, e.g. repeat week 1 for weeks 2–4. |
| list_gearA | List gear such as running shoes and bikes with accumulated distance, time and number of activities, plus maintenance/replacement reminders (e.g. shoes at 600 km). |
| create_gearB | Add gear such as a new pair of running shoes, optionally with distance already covered. Activities are linked to gear by the device sync or manually in Intervals.icu. |
| update_gearA | Rename gear, change its notes, or retire it (e.g. worn-out shoes; then add the new pair with create_gear). Only the fields you pass are changed. |
| add_gear_reminderA | Add a replacement or maintenance reminder to gear, e.g. "replace shoes after 600 km". Set at least one limit. |
| update_gear_reminderA | Reset a gear reminder after doing the maintenance (starts counting again), snooze it, or change its limits. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| weekly-review | Review a week of training: volume, intensity, fitness trend and recovery. |
| analyze-activity | Deep-dive into one activity (defaults to the most recent run). |
| recovery-check | Should I train hard, easy or rest today? |
| plan-next-week | Draft next week of training based on recent load and a goal. |
| race-prep | Assess readiness for a race and suggest pacing and final preparation. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| athlete-profile | Athlete settings: units, time zone, thresholds and training zones per sport. |
| workout-syntax | How to write structured workouts in Intervals.icu text format. |
TDQS
Scored across 36 tools
Each tool targets a distinct resource and action: list/search/get/update on activities, calendar events, and library workouts are clearly separated, and the analytics tools (streams, histogram, best efforts, segment stats) each have unique outputs. Even near-pairs like create_events vs create_workouts and create_manual_activity vs mark_event_done are disambiguated by their descriptions.
Tool names follow a consistent snake_case verb_noun pattern (list_*, get_*, create_*, update_*, duplicate_*), with only minor multi-word variants like mark_event_done and add_gear_reminder that remain predictable. The naming convention makes it easy to anticipate what each tool does.
36 tools is beyond the 25+ threshold for 'too many' in the calibration, making this a heavy tool set even though the server covers a broad training platform. Many tools are narrow and could be consolidated (e.g. activity analytics) or omitted for a more focused MCP surface.
The set covers most core workflows across athlete profile, activities, calendar planning, workout library, wellness, and gear, with read/create/update operations for most resources. However, there are no delete tools for activities, events, workouts, or folders, leaving lifecycle dead ends and making the CRUD coverage incomplete.