intervals-icu-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| INTERVALS_ICU_API_KEY | Yes | Your Intervals.icu API key | |
| INTERVALS_ICU_ATHLETE_ID | Yes | Your Intervals.icu athlete ID (e.g., i123456) | |
| INTERVALS_ICU_DELETE_MODE | No | Delete safety mode: safe, full, or none | safe |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| icu_get_recent_activities | List the athlete's most recent activities (default last 30 days) — LIGHT summary per item (distance, duration, power, HR, training load). Use for "what have I done recently?", "show last week's rides". For one specific activity by ID use icu_get_activity_details; to search by name/tag use icu_search_activities. |
| icu_get_activity_details | Fetch the headline SUMMARY of one activity — name, sport, date, distance, duration, training load, weather, plus all top-level metrics in a single JSON blob. Use for "how was my ride?", "tell me about activity X". For lap-by-lap or per-interval breakdown use icu_get_activity_intervals; for second-by-second time-series use icu_get_activity_streams. |
| icu_search_activitiesA | Search activities by name or tag, returning a LIGHT result list — id, name, type, date, distance, time only. Use this first for "find my X" queries. Only escalate to search_activities_full when you specifically need power, HR, training load, or intensity-factor data on the matches (heavier payload). |
| icu_search_activities_fullA | Search activities by name or tag, returning FULL Activity objects with power, HR, training load, intensity factor, normalized power, weather — every metric per result. Heavy payload. Use only when the lighter search_activities won't tell you what you need (e.g. "find my threshold rides with NP above 250W"). |
| icu_get_activities_aroundA | Fetch the activities chronologically before and after a reference activity (N each side). Use for "what did I do around this race?", training-context queries, progression comparisons. |
| icu_update_activityA | Update an existing activity's metadata (name, type, trainer flag, RPE, feel, etc.). Only fields you pass are sent; everything else stays unchanged. |
| icu_update_activity_streamsA | Upload raw time-series streams (power, HR, cadence, etc.) onto an existing activity. Destructive — overwrites existing stream data. Accepts JSON array or CSV. Different from get_activity_streams (READ). |
| icu_bulk_create_manual_activitiesA | Batch-create manual activities (no device upload) with UPSERT on Existing activities with a matching external_id (set by the same OAuth app) are updated; activities without an external_id are always created new. |
| icu_download_activity_fileA | Download the original activity file. Downloads the ORIGINAL uploaded file (FIT, TCX, or GPX — whatever the
device produced). Different from download_fit_file (forces FIT conversion)
and download_gpx_file (forces GPX conversion). If |
| icu_download_fit_fileA | Download activity converted to FIT format (Garmin / most training platforms). Different from download_activity_file (original upload format) and download_gpx_file (GPX format). |
| icu_download_gpx_fileA | Download activity converted to GPX format (GPS devices, mapping software). Different from download_activity_file (original upload format) and download_fit_file (FIT format). |
| icu_get_activity_streamsA | Fetch RAW per-sample time-series of one activity — second-by-second arrays for power, HR, cadence, speed, altitude, GPS, temperature, grade, etc. Heavy payload. Use only when you need the underlying signal for visualization or custom analysis. Most "how was my ride?" questions are better answered by get_activity_details (summary metrics) or get_activity_intervals (per-lap breakdown). Stream-type filter accepts any of: watts, heartrate, cadence, velocity_smooth, altitude, distance, time, latlng, temp, moving, grade_smooth. |
| icu_get_activity_intervalsA | Fetch the per-LAP / per-interval breakdown of one activity — each segment with its target, actual power/HR/pace, and type (warm-up / work / rest / cool-down). Use for workout-compliance analysis, lap-by-lap review, "did I hit my intervals?". For headline summary metrics use get_activity_details; for raw second-by-second data use get_activity_streams. |
| icu_get_best_effortsA | Find the top-N peak efforts WITHIN a single activity for a given stream + target duration or distance. Different from get_*_curves (which span many activities). Useful for "what was my best 20-min power on this ride?" or "show my top 5k splits in this run." Requires at least one of duration or distance. |
| icu_search_intervalsA | Search intervals ACROSS ALL the athlete's activities (cross-activity). Different from icu_get_activity_intervals (single-activity). Use to track progress on a workout type ("all my threshold intervals over the last year") or find comparable historical sessions. |
| icu_get_power_histogramA | Time-in-zone DISTRIBUTION of power within a single activity (histogram buckets, time per bucket). Different from icu_get_power_curves (best efforts across many activities). Use for "how was my workout intensity distributed?", training-zone breakdown. |
| icu_get_hr_histogramA | Time-in-zone DISTRIBUTION of heart rate within a single activity (histogram buckets, time per bucket). Different from icu_get_hr_curves (best efforts across many activities). Use for cardiovascular load breakdown and HR-zone time-in-zone. |
| icu_get_pace_histogramA | Time-in-zone DISTRIBUTION of pace within a single running activity (histogram buckets, time per bucket). Different from icu_get_pace_curves (best efforts across many activities). Use for pace-distribution / consistency analysis. For elevation- normalized pace use icu_get_gap_histogram. |
| icu_get_gap_histogramA | Time-in-zone DISTRIBUTION of grade-adjusted pace (GAP) within a single activity — elevation-normalized. Use for trail running where raw pace is misleading. For raw (non- elevation-normalized) pace use icu_get_pace_histogram. |
| icu_get_athlete_profileA | Get the authenticated athlete's profile — personal details, sport settings (FTP/FTHR/pace thresholds per sport), and current CTL/ATL/TSB with form interpretation. |
| icu_get_fitness_summaryA | Get the athlete's current fitness / fatigue / form snapshot — CTL, ATL, TSB, ramp rate, with interpretation and training recommendations. Use for "how's my form?", "am I overtrained?", training-status checks. |
| icu_get_wellness_dataA | Fetch wellness records over a RANGE of recent days (default last 7). Use for trends, weekly summaries, "how has my sleep been this week?", recovery curves. For a single specific date use icu_get_wellness_for_date instead — this tool always returns a multi-day list. |
| icu_get_wellness_for_dateA | Fetch the wellness record for ONE specific date. Use when the user names a date — "show my HRV for Monday", "wellness on 2026-03-15", "how did I sleep last Thursday?". For ranges, weeks, or trends use icu_get_wellness_data. |
| icu_update_wellnessA | Upsert wellness data for ONE specific date — creates the record if missing, otherwise updates the fields you pass. Only provided fields are sent. Subjective scales (fatigue, soreness,
stress, mood, motivation, injury) are 1-5. Pass |
| icu_get_calendar_eventsA | Fetch ALL calendar entries in a date window — workouts, notes, races, goals, life-event blocks. Use for "what's on my calendar?", "show this week", broad calendar queries. For just the planned WORKOUT entries (filtered) use icu_get_upcoming_workouts. For one specific event by ID use get_event. |
| icu_get_upcoming_workoutsA | Fetch only the planned WORKOUT entries from the upcoming calendar (filters out notes, races, goals). Use for "what's my next workout?", "what training is planned". For every calendar entry type use icu_get_calendar_events. |
| icu_get_eventA | Fetch ONE specific calendar event by ID — full details including description, workout structure, and metrics. |
| icu_create_eventA | Create ONE new calendar event from scratch. For two or more events in a single call, prefer icu_bulk_create_events over a loop. For copying existing events forward in time (repeating a workout for N weeks), use icu_duplicate_events — that tool reuses an existing event's payload instead of taking new fields. For category guidance and the training_availability enum, read the
intervals-icu://event-categories resource. For structured WORKOUT events,
put workout-syntax text in |
| icu_update_eventA | Update an existing calendar event. Only fields you pass are sent — other fields remain unchanged. For category
and training_availability semantics, see intervals-icu://event-categories.
For WORKOUT |
| icu_delete_eventA | Permanently delete ONE calendar event by ID. Destructive — cannot be undone. In |
| icu_bulk_create_eventsA | Create MANY new calendar events in a single batch call (more efficient than looping create_event). Accepts a JSON array of event objects, each shaped like an icu_create_event payload. For copying existing events forward use icu_duplicate_events instead — that reuses payloads rather than taking new fields. See intervals-icu://event-categories and intervals-icu://workout-syntax for the referenced enums and DSL. |
| icu_bulk_delete_eventsA | Delete MANY calendar events in a single batch call. Destructive — cannot be undone. In |
| icu_duplicate_eventsA | COPY existing events forward in time by N weeks. Use when the user says "repeat this workout for the next 4 weeks", "duplicate Monday's run on the next 3 Mondays". Reuses the existing events' payloads — different from icu_create_event / icu_bulk_create_events, which both build NEW events from scratch. |
| icu_apply_training_planA | Schedule an entire training plan (workout-library folder) onto the athlete's calendar starting on a chosen date. Use after icu_get_workout_library to find a plan's folder_id. Different from icu_create_event / icu_bulk_create_events (which build new events) and from icu_duplicate_events (which copies existing). |
| icu_get_power_curvesA | Fetch the power-vs-duration curve — best (highest) sustained watts across durations from 5s up to 1h, aggregated over the chosen window. Use for FTP estimation, peak-power tracking, strengths/weaknesses across duration profiles. For time-in-zone distribution within a single activity, use icu_get_power_histogram instead. |
| icu_get_hr_curvesA | Fetch the HR-vs-duration curve — best (highest) sustained HR across durations from 5s up to 1h, aggregated over the chosen window. Use for cardiovascular-fitness trends and HR-zone calibration. For time-in-zone distribution within a single activity, use get_hr_histogram instead. |
| icu_get_pace_curvesA | Fetch the pace-vs-duration curve — best (fastest) sustained pace across durations from 5s up to 1h, aggregated over the chosen window. Use for run/swim fitness trends and race-time predictions. Pass
|
| icu_get_workout_libraryA | List all workout-library folders + training plans the athlete has access to (personal, shared, and followed plans). Each folder ID can be passed to icu_get_workouts_in_folder to see its contents, or to icu_apply_training_plan to schedule it onto the calendar. |
| icu_get_workouts_in_folderA | List the workouts stored in one specific library folder or training plan — name, type, structure, training load, intensity factor. |
| icu_get_gear_listA | List all gear items with usage stats (distance, time, activity count) and maintenance reminders. |
| icu_create_gearA | Create a new gear item for tracking equipment usage and maintenance (bikes, shoes, trainers, etc.). |
| icu_update_gearB | Update an existing gear item. Only fields you pass are sent. |
| icu_delete_gearA | Permanently delete a gear item and its maintenance reminders. Activities that used this gear are not affected. |
| icu_create_gear_reminderA | Create a maintenance reminder for a gear item, triggered by distance, time, or both. |
| icu_update_gear_reminderA | Update an existing gear maintenance reminder. Only fields you pass are sent. |
| icu_get_sport_settingsA | Get all per-sport thresholds — FTP (cycling watts), FTHR (heart rate), pace threshold (running), swim threshold. |
| icu_update_sport_settingsA | Update an existing per-sport threshold record (FTP/FTHR/pace/swim). Only fields you pass are sent. |
| icu_apply_sport_settingsA | Recompute training load, zones, and derived metrics on HISTORICAL activities using the current sport settings. Different from update_sport_settings (which just stores new values). Use after changing FTP/FTHR/pace to backfill chart math. |
| icu_create_sport_settingsA | Create new per-sport threshold record (FTP/FTHR/pace/swim) for a sport that doesn't have one yet. |
| icu_get_activity_messagesA | Read the notes and comments attached to a specific activity (plural = READ). Use when the user asks: "what did my coach say about that ride?", "show me the comments on yesterday's run", "any feedback on this workout?". Returns every message in chronological order with author, content, timestamp, and seen-flag. To POST a new message use icu_add_activity_message (singular = WRITE). |
| icu_add_activity_messageA | POST a new note or comment on a specific activity (singular = WRITE). Use when the user wants to leave a note on one of their activities: "add a note to this ride that I felt strong", "comment on yesterday's run", "leave a training note saying...". Attributed to the authenticated user. To READ existing notes use icu_get_activity_messages (plural). |
| icu_get_custom_itemsA | List the user's custom additions to their Intervals.icu account. Use this when the user asks about THEIR OWN customizations: "show my custom charts", "list my custom fields", "what custom zones do I have", "what's on my dashboard", "do I have any custom activity panels". Returns every custom item across all types in one call: custom charts
(FITNESS_CHART, TRACE_CHART, ACTIVITY_CHART, ACTIVITY_HISTOGRAM,
ACTIVITY_HEATMAP, ACTIVITY_MAP, ACTIVITY_PANEL, FITNESS_TABLE), custom
data fields (INPUT_FIELD on wellness, ACTIVITY_FIELD on activities,
INTERVAL_FIELD on intervals), custom ACTIVITY_STREAM definitions, and
custom ZONES configurations. Each item has a Do NOT use this for built-in zones, built-in fields, or athlete profile data — those have dedicated tools (icu_get_sport_settings, etc.). |
| icu_get_custom_itemA | Fetch the full configuration of ONE custom addition by ID. Use AFTER icu_get_custom_items has returned an ID when the user wants
to inspect a specific chart/field/zone/panel — the |
| icu_create_custom_itemA | Create a custom addition to the user's Intervals.icu account. Use when the user says things like: "add a custom field for RPE", "create
a custom power zone set", "add a chart for monthly distance". Match the
user's intent to the right |
| icu_update_custom_itemA | Modify an existing custom chart/field/zones/panel. Use when the user wants to change one of their existing customizations:
"rename my custom field", "make this chart public". Usually need
icu_get_custom_items first to find the right |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| generate_workout | Generate a structured workout for Intervals.icu. |
| analyze_recent_training | Analyze my Intervals.icu training over a time period. |
| performance_analysis | Analyze my performance across different durations. |
| activity_deep_dive | Get comprehensive analysis of a specific activity. |
| recovery_check | Assess my current recovery and readiness to train. |
| training_plan_review | Review my upcoming training plan. |
| plan_training_week | Help plan my training week based on current form and goals. |
| verify_setup | Verify the MCP server is working by exercising core tools against your account. |
| verify_multi_athlete | Verify multi-athlete support by querying a specific athlete's data. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| athlete_profile_resource | Complete athlete profile with fitness metrics and sport settings for context. |
| workout_syntax_resource | Intervals.icu structured workout syntax reference. Complete specification for writing structured workouts using Intervals.icu plain-text format. Use this when creating WORKOUT events via create_event or bulk_create_events - place the workout text in the 'description' field. Covers: durations, distances, power/HR/pace targets, zones, ramps, repeats, cadence, rest intervals, and text prompts for cycling, running, and swimming. |
| event_categories_resource | Intervals.icu calendar event categories reference. Use this when picking a `category` value for create_event / update_event / bulk_create_events. Documents the full enum (WORKOUT, NOTE, RACE_A/B/C, TARGET, PLAN, HOLIDAY, SICK, INJURED, SET_EFTP, FITNESS_DAYS, SEASON_START, SET_FITNESS), the legacy aliases (RACE→RACE_A, GOAL→TARGET), the training_availability enum for ranged categories, and use-case guidance. |
| custom_item_schemas_resource | Intervals.icu custom item content schemas reference. Use this BEFORE constructing the `content` object for create_custom_item or update_custom_item. The shape of `content` depends on `item_type`. Documents the well-known schema for INPUT_FIELD / ACTIVITY_FIELD / INTERVAL_FIELD (code/type/aggregate constraints plus worked examples) and explains that chart/panel/zones/stream types should omit `content` and be configured in the Intervals.icu UI after creation. |
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/hhopke/intervals-icu-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server