io.github.hhopke/intervals-icu-mcp
PYPI · INTERVALS-ICU-MCP · SCANNED SEP 20
Read/write Intervals.icu MCP server: activities, wellness, calendar, gear, and workouts.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs hatchling.build at install time, a recognised native-build step with no shell scripting around it. View diagnostics → Pass
- 1 of 23 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency32
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- License check failed: no license is declared. See how to fix → Fail
- Actively maintained (last published 3 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability82
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 13026 tokens (~191/item across 68 items; 64 tools + 4 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management83
- Stability observed for 25 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 65 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
How do I install the io.github.hhopke/intervals-icu-mcp server?
io.github.hhopke/intervals-icu-mcp runs locally as a PyPI package, launched with uvx intervals-icu-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · intervals-icu-mcp
claude mcp add hhopke-intervals-icu-mcp -- uvx intervals-icu-mcp
{
"mcpServers": {
"hhopke-intervals-icu-mcp": {
"command": "uvx",
"args": [
"intervals-icu-mcp"
]
}
}
} {
"servers": {
"hhopke-intervals-icu-mcp": {
"command": "uvx",
"args": [
"intervals-icu-mcp"
]
}
}
} codex mcp add hhopke-intervals-icu-mcp -- uvx intervals-icu-mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"hhopke-intervals-icu-mcp": {
"type": "local",
"command": [
"uvx",
"intervals-icu-mcp"
],
"enabled": true
}
}
} openclaw mcp add hhopke-intervals-icu-mcp --command uvx --arg intervals-icu-mcp
mcp_servers:
hhopke-intervals-icu-mcp:
command: "uvx"
args: ["intervals-icu-mcp"] {
"McpServers": {
"hhopke-intervals-icu-mcp": {
"Transport": "stdio",
"Command": "uvx",
"Arguments": [
"intervals-icu-mcp"
]
}
}
} assistant mcp add hhopke-intervals-icu-mcp -t stdio -c uvx -a intervals-icu-mcp
{
"mcpServers": {
"hhopke-intervals-icu-mcp": {
"command": "uvx",
"args": [
"intervals-icu-mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 20 Sept 26 −2
- Stability: pass → 0.83 functional
- 19 Sept 26 0
- Stability: 0.97 → pass security
- 18 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.
- 16 Sept 26 0
- Stability: 0.87 → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Schema quality: 166 → 191 ▼ functional
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: 100 → unverified ▼ functional
- Package version: 5.0.1 → 5.1.0 functional
- 15 Sept 26 +16
- Malware scan: unverified → pass ▲ security
- 14 Sept 26 −15
- Malware scan: pass → unverified ▼ security
- 13 Sept 26 −2
- Stability: pass → 0.80 functional
- 12 Sept 26 0
- Stability: 0.97 → pass security
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 20 Sept 2026 · Analysed pypi/intervals-icu-mcp@5.1.0
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | pypi |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | hatchling.build |
Background: Why install scripts are a supply-chain risk →
Dependencies 23 packages
| Packages resolved | 23 |
|---|---|
| Stale | 1 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
icu_add_activity_message Icu Add Activity Message ~120
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).
| Name | Type | Req | Description |
|---|---|---|---|
| activity_id | string | yes | The Intervals.icu activity ID |
| content | string | yes | Message content (note or comment text) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_apply_sport_settings Icu Apply Sport Settings ~90
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.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| sport_id | integer | yes | ID of the sport settings to apply |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_apply_training_plan Icu Apply Training Plan ~145
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).
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| extra_workouts_json | – | – | Optional JSON array of additional workouts |
| folder_id | integer | yes | Folder ID of the training plan to apply |
| start_date_local | string | yes | Start date in ISO-8601 format (YYYY-MM-DD) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_bulk_create_events Icu Bulk Create Events ~704
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.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| events | string | yes | JSON array of event objects, each shaped exactly like an icu_create_event call. Required per event: start_date_local, name, category. Optional: description, event_type (activity discipline Ride/Run/S… |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_bulk_create_manual_activities Icu Bulk Create Manual Activities ~89
Batch-create manual activities (no device upload) with UPSERT on `external_id`. Existing activities with a matching external_id (set by the same OAuth app) are updated; activities without an external_id are always created new.
| Name | Type | Req | Description |
|---|---|---|---|
| activities_json | string | yes | JSON string containing array of manual activities |
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_bulk_create_workouts Icu Bulk Create Workouts ~644
Save MANY new reusable workouts into LIBRARY folders or plans in one call — e.g. filling out a training plan. Each item is shaped like an icu_create_workout call. Nothing lands on the calendar: for dated calendar workouts use icu_bulk_create_events, and to schedule a finished plan use icu_apply_training_plan.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| workouts | string | yes | JSON array of workout objects, each shaped like an icu_create_workout call. Required per workout: folder_id, name. Optional: description, workout_type, day, duration_seconds, distance_meters, trainin… |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_bulk_delete_events Icu Bulk Delete Events ~121
Delete MANY calendar events in a single batch call. Destructive — cannot be undone. In `safe` delete mode (default), the call partitions the input list into `deleted` (future) and `skipped` (past or undated) and returns both. INTERVALS_ICU_DELETE_MODE=full disables the partition.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| event_ids | string | yes | JSON array of event IDs to delete (e.g., '[123, 456, 789]') |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_create_custom_item Icu Create Custom Item ~382
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 `item_type` (see that param's description). For the `content` schema per item_type, read intervals-icu://custom-item-schemas.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (only for coaches; uses configured default otherwise) |
| content | – | – | Configuration object whose schema depends on item_type. Read intervals-icu://custom-item-schemas BEFORE constructing — it documents the {code, type, aggregate} shape required for INPUT_FIELD / ACTIVI… |
| description | – | – | Optional description shown to the user |
| item_type | string | yes | What the user wants to add. Pick by intent: INPUT_FIELD (extra input on the wellness page, e.g. RPE, mood), ACTIVITY_FIELD (extra field on each activity, e.g. bike weight), INTERVAL_FIELD (extra fiel… |
| name | string | yes | Display name (e.g., 'RPE', 'Bike Weight', 'Custom Power Zones') |
| visibility | – | – | Who can see it: PRIVATE (default, only you), FOLLOWERS, or PUBLIC. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_create_event Icu Create Event ~958
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 `description` — see intervals-icu://workout-syntax.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| category | string | yes | Event category enum. Common: WORKOUT, NOTE, RACE_A/B/C, TARGET, PLAN, HOLIDAY, SICK, INJURED. Full list with use-case guidance and the training_availability enum: intervals-icu://event-categories res… |
| color | – | – | Custom display color (hex string) |
| description | – | – | Event description (plain text for non-workouts). For WORKOUT events the server parses this into structured, device-syncable steps with zones and a training load. Use Intervals.icu workout syntax: one… |
| distance_meters | – | – | Planned distance in meters |
| duration_seconds | – | – | Planned duration in seconds |
| end_date | – | – | End date in YYYY-MM-DD format. Use for ranged categories (INJURED, SICK, HOLIDAY, SEASON_START) to mark a multi-day block. |
| event_type | – | – | Activity discipline (NOT the category): Ride, Run, Swim, Walk, Hike, WeightTraining, Workout, VirtualRide, VirtualRun, Other (full discipline list: intervals-icu://event-categories resource). Require… |
| name | string | yes | Event name |
| not_on_fitness_chart | – | – | Hide event entirely from the fitness chart |
| show_as_note | – | – | Show event as a note marker on the fitness chart |
| show_on_ctl_line | – | – | Render event on the CTL line |
| start_date | string | yes | Start date in YYYY-MM-DD format |
| training_availability | – | – | Training availability: NORMAL, LIMITED, or UNAVAILABLE. Typical for INJURED/SICK/HOLIDAY blocks. |
| training_load | – | – | Planned training load |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_create_gear Icu Create Gear ~147
Create a new gear item for tracking equipment usage and maintenance (bikes, shoes, trainers, etc.).
| Name | Type | Req | Description |
|---|---|---|---|
| active | boolean | – | Whether this gear is actively used (False = retired) |
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| gear_type | string | yes | Gear type, case-insensitive. Whole items: Bike, Shoes, Wetsuit, Trainer, RowingMachine, Skis, Snowboard, Boat, Board, Equipment, Accessories, Apparel, Computer. Components: Chain, Cassette, Wheel, Ty… |
| name | string | yes | Name of the gear item |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_create_gear_reminder Icu Create Gear Reminder ~120
Create a maintenance reminder for a gear item, triggered by distance, time, or both.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| distance_alert | – | – | Alert every N kilometers (e.g., 500 for every 500km) |
| gear_id | string | yes | ID of the gear item |
| text | string | yes | Reminder text (e.g., 'Replace chain', 'New shoes') |
| time_alert | – | – | Alert every N hours (e.g., 100 for every 100 hours) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_create_sport_settings Icu Create Sport Settings ~169
Create a per-sport threshold record with outdoor/indoor FTP, FTHR, pace, or swim settings.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| fthr | – | – | Functional Threshold Heart Rate in bpm |
| ftp | – | – | Functional Threshold Power in watts (for cycling) |
| indoor_ftp | – | – | Indoor Functional Threshold Power in watts (for cycling) |
| pace_threshold | – | – | Threshold pace in min/km (e.g., 4.5 for 4:30/km) |
| sport_type | string | yes | Type of sport (e.g., 'Ride', 'Run', 'Swim') |
| swim_threshold | – | – | Swim threshold in min/100m (e.g., 1.5 for 1:30/100m) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_create_workout Icu Create Workout ~821
Save ONE new reusable workout into a LIBRARY folder or training plan — it does not go on the calendar. To schedule a workout on a date use icu_create_event. For two or more library workouts use icu_bulk_create_workouts; to change a saved one use icu_update_workout. Make a new folder or plan with icu_create_workout_folder, and put a plan's workouts on the calendar with icu_apply_training_plan.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| color | – | – | Custom display color (hex string) |
| day | – | – | PLAN folders only: day offset from plan start (0 = day 1 of week 1, 7 = day 1 of week 2). Omit for plain folders. |
| description | – | – | Workout steps, parsed the same way as a WORKOUT calendar event. For WORKOUT events the server parses this into structured, device-syncable steps with zones and a training load. Use Intervals.icu work… |
| distance_meters | – | – | Planned distance in meters |
| duration_seconds | – | – | Planned duration in seconds |
| folder_id | integer | yes | Existing library folder or plan ID (from icu_get_workout_library) |
| indoor | – | – | Mark as an indoor workout |
| name | string | yes | Workout name |
| tags | – | – | Tags for organizing the library |
| target | – | – | Device target type: AUTO, POWER, HR, or PACE |
| training_load | – | – | Planned training load |
| workout_type | – | – | Activity discipline: Ride, Run, Swim, Walk, Hike, WeightTraining, Workout, VirtualRide, VirtualRun, Other (full discipline list: intervals-icu://event-categories resource) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_create_workout_folder Icu Create Workout Folder ~136
Create a new LIBRARY folder or training PLAN to hold workouts — not a calendar item. Pass the returned id as folder_id to icu_create_workout or icu_bulk_create_workouts. To browse existing folders use icu_get_workout_library.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| description | – | – | Folder or plan description |
| folder_type | string | – | FOLDER (a plain collection of workouts) or PLAN (a training plan whose workouts sit on plan days, schedulable with icu_apply_training_plan) |
| name | string | yes | Folder or plan name |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_delete_event Icu Delete Event ~103
Permanently delete ONE calendar event by ID. Destructive — cannot be undone. In `safe` delete mode (default), past events are refused and reported in the `skipped` envelope with a hint about INTERVALS_ICU_DELETE_MODE=full. Returns a `deleted` / `skipped` envelope either way.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| event_id | integer | yes | Event ID to delete |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_delete_gear Icu Delete Gear ~60
Permanently delete a gear item and its maintenance reminders. Activities that used this gear are not affected.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| gear_id | string | yes | ID of the gear item to delete |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_delete_workout Icu Delete Workout ~93
Permanently delete ONE workout from the LIBRARY. Destructive — cannot be undone. Removes the library workout only; calendar events are separate records deleted with icu_delete_event. Confirm with the user before calling if unsure.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| workout_id | integer | yes | Library workout ID to delete (from icu_get_workouts_in_folder) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_download_activity_file Icu Download Activity File ~106
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 `output_path` is set the file is saved there; otherwise the response embeds base64 content.
| Name | Type | Req | Description |
|---|---|---|---|
| activity_id | string | yes | Activity ID to download |
| output_path | – | – | Path to save the file (optional) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_download_fit_file Icu Download Fit File ~71
Download activity converted to FIT format (Garmin / most training platforms). Different from download_activity_file (original upload format) and download_gpx_file (GPX format).
| Name | Type | Req | Description |
|---|---|---|---|
| activity_id | string | yes | Activity ID to download |
| output_path | – | – | Path to save the FIT file (optional) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_download_gpx_file Icu Download Gpx File ~71
Download activity converted to GPX format (GPS devices, mapping software). Different from download_activity_file (original upload format) and download_fit_file (FIT format).
| Name | Type | Req | Description |
|---|---|---|---|
| activity_id | string | yes | Activity ID to download |
| output_path | – | – | Path to save the GPX file (optional) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_duplicate_events Icu Duplicate Events ~143
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.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| event_ids | string | yes | JSON array of event IDs to duplicate (e.g., '[123, 456]') |
| num_copies | integer | – | Number of copies to create |
| weeks_between | integer | – | Weeks between each copy |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_activities_around Icu Get Activities Around ~86
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.
| Name | Type | Req | Description |
|---|---|---|---|
| activity_id | string | yes | Reference activity ID |
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| count | integer | – | Number of activities before and after |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_activities_by_date Icu Get Activities By Date ~218
List activities within an EXPLICIT date window (oldest..newest) — LIGHT summary per item. Unlike icu_get_recent_activities (anchored to today and capped at 100), this targets an arbitrary historical window and is bounded only by `limit`. Use for "all my runs from June to November 2025", reconstructing training history, or finding the oldest activity in a period. Dates are YYYY-MM-DD. Results are newest-first; if a window holds more than `limit` items, the oldest are dropped first, so widen `limit` (or narrow the window) to reach the very oldest.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| limit | integer | – | Max activities to return (newest-first within the window) |
| newest | – | – | Newest date to include, YYYY-MM-DD (inclusive). Defaults to today. |
| oldest | string | yes | Oldest date to include, YYYY-MM-DD (inclusive) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_activity_details Icu Get Activity Details ~106
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.
| Name | Type | Req | Description |
|---|---|---|---|
| activity_id | string | yes | Activity ID to fetch |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_activity_intervals Icu Get Activity Intervals ~109
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.
| Name | Type | Req | Description |
|---|---|---|---|
| activity_id | string | yes | Activity ID to fetch intervals for |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_activity_messages Icu Get Activity Messages ~111
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).
| Name | Type | Req | Description |
|---|---|---|---|
| activity_id | string | yes | The Intervals.icu activity ID |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_activity_streams Icu Get Activity Streams ~307
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, raw_heartrate, fixed_heartrate. `heartrate` is CORRECTED data: Intervals.icu replaces readings above the athlete's configured max HR with an interpolated line at import, so it can never exceed that setting. `raw_heartrate` is the uncorrected trace and is the only way to see a genuine new max that was clipped away — the platform never raises the setting on its own. Request it explicitly; it is not in the default set.
| Name | Type | Req | Description |
|---|---|---|---|
| activity_id | string | yes | Activity ID to fetch streams for |
| streams | – | – | List of stream types (e.g., ['watts', 'heartrate', 'cadence']). If not specified, the activity's default streams are fetched — which does NOT include raw_heartrate or fixed_heartrate; ask for those b… |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_annual_training_plan Icu Get Annual Training Plan ~235
Read the Annual Training Plan (ATP) on the calendar — weekly load targets (TSS), Base/Build/Peak phases, and ATP week notes. Use when the user asks: "what's my weekly TSS target?", "what training phase am I in?", "show my periodization plan", "when are my recovery weeks?", "what's the note on this training week?". Defaults to a 365-day forward window so the full ATP is returned; pass a smaller days_ahead/days_back when the user asks about a specific month or week. NOT individual planned workouts (icu_get_upcoming_workouts), NOT all calendar entries (icu_get_calendar_events), NOT workout-library plan folders (icu_get_workout_library / icu_apply_training_plan).
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| days_ahead | integer | – | Days to look ahead (default 365 — full annual plan). Narrow for month/week queries, e.g. 31 for July. |
| days_back | integer | – | Number of days to look back |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_athlete_profile Icu Get Athlete Profile ~80
Get an athlete's profile — sport settings (outdoor/indoor FTP, FTHR, pace) and current CTL/ATL/TSB. Defaults to the authenticated athlete; coaches can pass athlete_id to read one of their managed athletes instead.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_best_efforts Icu Get Best Efforts ~218
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.
| Name | Type | Req | Description |
|---|---|---|---|
| activity_id | string | yes | Activity ID to analyze |
| count | integer | – | Number of efforts to return (default 8) |
| distance | – | – | Distance of each effort in meters (e.g., 5000 for 5k). At least one of 'duration' or 'distance' is required. |
| duration | – | – | Duration of each effort in seconds (e.g., 60 for 1-min, 1200 for 20-min). At least one of 'duration' or 'distance' is required. |
| stream | string | – | Stream to search for best efforts: 'watts', 'heartrate', or 'pace' |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_calendar_events Icu Get Calendar Events ~123
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.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| days_ahead | integer | – | Number of days to look ahead |
| days_back | integer | – | Number of days to look back |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_custom_item Icu Get Custom Item ~96
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 `content` field here is the same as in the list, just focused on one item.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| item_id | integer | yes | Custom item ID |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_custom_items Icu Get Custom Items ~231
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 `type` field so you can filter client-side if the user asked about a specific kind. Do NOT use this for built-in zones, built-in fields, or athlete profile data — those have dedicated tools (icu_get_sport_settings, etc.).
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_event Icu Get Event ~55
Fetch ONE specific calendar event by ID — full details including description, workout structure, and metrics.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| event_id | integer | yes | Event ID to retrieve |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_fitness_chart Icu Get Fitness Chart ~182
Fetch the Performance Management Chart time-series — daily CTL, ATL, and TSB. Returns past history plus future projections from planned calendar workouts. Use for: "show my fitness chart", "CTL trend last 90 days", "projected form at end of my block", "what will my TSB be in 3 weeks". NOT for: today's training recommendations (icu_get_fitness_summary), HRV/sleep/ recovery trends (icu_get_wellness_data), or one day's full wellness record (icu_get_wellness_for_date).
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| days_ahead | integer | yes | Number of days after today to include (inclusive); use 0 for history only |
| days_back | integer | yes | Number of days before today to include (inclusive) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_fitness_summary Icu Get Fitness Summary ~94
Get an 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. Defaults to the authenticated athlete; coaches can pass athlete_id to read one of their managed athletes instead.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_gap_histogram Icu Get Gap Histogram ~78
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.
| Name | Type | Req | Description |
|---|---|---|---|
| activity_id | string | yes | Activity ID to analyze |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_gear_list Icu Get Gear List ~45
List all gear items with usage stats (distance, time, activity count) and maintenance reminders.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_hr_curves Icu Get Hr Curves ~202
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. For the athlete's HR zones and max HR, call icu_get_sport_settings — this tool does not return zone bands, and its peak_hr_bpm is the top of this curve, which Intervals.icu has already clipped to the configured max HR at import. For time-in-zone *distribution* within a single activity, use get_hr_histogram instead.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| days_back | – | – | Number of days to analyze (optional) |
| sport_type | string | – | Sport type (e.g., Ride, Run, Swim, VirtualRide) |
| time_period | – | – | Time period shorthand: 'week', 'month', 'year', 'all' (optional) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_hr_histogram Icu Get Hr Histogram ~73
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.
| Name | Type | Req | Description |
|---|---|---|---|
| activity_id | string | yes | Activity ID to analyze |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_pace_curves Icu Get Pace Curves ~191
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 `use_gap=True` to normalize for hills via Grade-Adjusted Pace. For time-in-zone *distribution* within a single activity, use get_pace_histogram (or get_gap_histogram) instead.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| days_back | – | – | Number of days to analyze (optional) |
| sport_type | string | – | Sport type (e.g., Run, Swim) |
| time_period | – | – | Time period shorthand: 'week', 'month', 'year', 'all' (optional) |
| use_gap | boolean | – | Use Grade Adjusted Pace (GAP) for running |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_pace_histogram Icu Get Pace Histogram ~85
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.
| Name | Type | Req | Description |
|---|---|---|---|
| activity_id | string | yes | Activity ID to analyze |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_power_curves Icu Get Power Curves ~159
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.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| days_back | – | – | Number of days to analyze (optional) |
| sport_type | string | – | Sport type (e.g., Ride, Run, Swim, VirtualRide) |
| time_period | – | – | Time period shorthand: 'week', 'month', 'year', 'all' (optional) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_power_histogram Icu Get Power Histogram ~76
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.
| Name | Type | Req | Description |
|---|---|---|---|
| activity_id | string | yes | Activity ID to analyze |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_recent_activities Icu Get Recent Activities ~125
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.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| days_back | integer | – | Number of days to look back |
| limit | integer | – | Number of activities to fetch |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_sport_settings Icu Get Sport Settings ~175
Get per-sport thresholds and the athlete's configured power/HR/pace zones. Returns outdoor/indoor FTP, FTHR, max HR, running pace and swim threshold, plus the zone sets configured in Intervals.icu (HR zones in bpm, power zones as %FTP, pace zones as % of threshold pace) with their names. This is the ONLY source of the athlete's real zones. Intervals.icu derives them from the threshold and stamps them into every activity at import, so time-in-zone, HRSS and TSS are all computed from these — reasoning about zones from any other number puts the answer at odds with the athlete's own charts. Zones are not derived from curve data.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_upcoming_workouts Icu Get Upcoming Workouts ~159
Fetch the planned WORKOUT entries dated on the upcoming CALENDAR (filters out notes, races, goals) — these are calendar EVENTS, not workout-library templates. Use for "what's my next workout?", "what training is planned". Each `id` is a calendar event ID: pass it to icu_get_event / icu_update_event / icu_delete_event, never to the icu_*_workout library tools. For every calendar entry type use icu_get_calendar_events; for reusable templates stored in the library use icu_get_workouts_in_folder.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| limit | integer | – | Maximum number of planned workout events to return |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_wellness_data Icu Get Wellness Data ~122
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 PMC/fitness chart CTL/ATL/TSB series use icu_get_fitness_chart. For a single specific date use icu_get_wellness_for_date instead — this tool always returns a multi-day list.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| days_back | integer | – | Number of days to look back |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_wellness_for_date Icu Get Wellness For Date ~103
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.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| date | string | yes | Date in YYYY-MM-DD format |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_get_workout_library Icu Get Workout Library ~82
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.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
What is the io.github.hhopke/intervals-icu-mcp server?
io.github.hhopke/intervals-icu-mcp is listed in the public MCP registry as io.github.hhopke/intervals-icu-mcp. Read/write Intervals.icu MCP server: activities, wellness, calendar, gear, and workouts. This page covers its PyPI package (intervals-icu-mcp).
Is the io.github.hhopke/intervals-icu-mcp server safe to use?
io.github.hhopke/intervals-icu-mcp scores 81 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the io.github.hhopke/intervals-icu-mcp server expose?
io.github.hhopke/intervals-icu-mcp exposes 64 tools: icu_get_recent_activities, icu_get_activities_by_date, icu_get_activity_details, icu_search_activities, icu_search_activities_full, and 59 more. Their descriptions and schemas cost roughly 12,674 tokens of context every time the server is loaded.
Is the io.github.hhopke/intervals-icu-mcp server still maintained?
io.github.hhopke/intervals-icu-mcp is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.