Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

io.github.hhopke/intervals-icu-mcp

PYPI · INTERVALS-ICU-MCP

Read/write Intervals.icu MCP server: activities, wellness, calendar, gear, and workouts.

Available components

+21 this week 96 Trust /100

Last scanned (18 hours ago)

Scores higher than 98% of PyPI servers

Category Health and Science

Trust breakdown (7 categories)

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 build step with no custom scripting around it. View diagnostics → Pass
  • 1 of 25 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency97
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to hhopke/intervals-icu-mcp). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • 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 Usability81
  • 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 15057 tokens (~206/item across 73 items; 69 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 Management98
  • Stability check failed: the tool surface changed between 5.5.0 and 5.8.0: 1 tool removals, 0 breaking changes, 4 additions. See how to fix → Fail
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 6 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 70 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
Changelog

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.

  • 1 Nov 26 +15
    • Malware scan: unverified → pass ▲ security
  • 31 Oct 26 +6
    • CVE-2026-69247 no longer affects this package ▲ security
    • CVE-2026-69248 no longer affects this package ▲ security
    • CVE-2026-69249 no longer affects this package ▲ security
    • Malware scan: unverified → pass ▲ security
    • Known CVEs: fail → pass ▲ security
    • Package version: 5.7.1 → 5.8.0 functional
  • 25 Oct 26 −15
    • Malware scan: pass → unverified ▼ security
  • 22 Oct 26 +15
    • Malware scan: unverified → pass ▲ security
  • 18 Oct 26 −21
    • CVE-2026-69248 affects this package: high ▼ security
    • CVE-2026-69247 affects this package: high ▼ security
    • CVE-2026-69249 affects this package: high ▼ security
    • Malware scan: pass → unverified ▼ security
    • Stability: pass → fail ▼ security
    • Known CVEs: pass → fail ▼ security
    • Package version: 5.6.0 → 5.7.1 functional
  • 17 Oct 26 +15
    • Malware scan: unverified → pass ▲ security
  • 16 Oct 26 0
    • Stability: 0.97 → pass security
  • 15 Oct 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.

Diagnostics

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 4 Nov 2026 · Analysed pypi/intervals-icu-mcp@5.8.0

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem pypi
Reason Verified
Discovered via Registry attestation endpoint
Source repo hhopke/intervals-icu-mcp
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/hhopke/intervals-icu-mcp/.github/workflows/publish.yml@refs/tags/v5.8.0
Rekor log index 3614626329
Predicate type PyPI publish attestation https://docs.pypi.org/attestations/publish/v1
Subject digest sha256:9575f1320b92326182cba86c8dde829532ba04c94794806c31072fffa3a32bda

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 25 packages
Packages resolved 25
Stale 1
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 69 exposed · ~14,705 tokens

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 →

Tool Tokens
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).

NameTypeReqDescription
activity_idstringyesThe Intervals.icu activity ID
contentstringyesMessage content (note or comment text)
NameTypeReqDescription
resultstringyes–

No examples provided.

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).

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
extra_workouts_json––Optional JSON array of additional workouts
folder_idintegeryesFolder ID of the training plan to apply
start_date_localstringyesStart date in ISO-8601 format (YYYY-MM-DD)
NameTypeReqDescription
resultstringyes–

No examples provided.

icu_bulk_create_events ~721

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.

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
eventsstringyesJSON 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…
NameTypeReqDescription
resultstringyes–

No examples provided.

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.

NameTypeReqDescription
activities_jsonstringyesJSON string containing array of manual activities
athlete_id––Athlete ID (for coaches managing multiple athletes)
NameTypeReqDescription
resultstringyes–

No examples provided.

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.

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
workoutsstringyesJSON 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…
NameTypeReqDescription
resultstringyes–

No examples provided.

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.

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
event_idsstringyesJSON array of event IDs to delete (e.g., '[123, 456, 789]')
NameTypeReqDescription
resultstringyes–

No examples provided.

icu_bulk_update_event_access ~262

Hide/reveal or lock/unlock MANY planned WORKOUT calendar events at once. Sets the web UI's "Hide from athlete" and "Athlete cannot edit" checkboxes — e.g. build a training block ahead of time, hide it, and reveal it week by week, or lock key sessions. Only the flags you pass are changed. Only WORKOUT events are touched: notes, races and targets are reported under `skipped`. IDs are calendar event IDs (from icu_get_calendar_events / icu_get_upcoming_workouts), not workout-library IDs. For one event use icu_update_event.

NameTypeReqDescription
athlete_cannot_edit––true locks the workouts against athlete edits, false unlocks them
athlete_id––Athlete ID (for coaches managing multiple athletes)
event_ids––JSON array of calendar event IDs (e.g. '[123, 456]'). Use this OR oldest+newest
hide_from_athlete––true hides the workouts from the athlete, false reveals them
newest––Last day of the date range (YYYY-MM-DD), inclusive
oldest––First day of a date range (YYYY-MM-DD), with newest. Use instead of event_ids
NameTypeReqDescription
resultstringyes–

No examples provided.

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.

NameTypeReqDescription
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_typestringyesWhat 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…
namestringyesDisplay name (e.g., 'RPE', 'Bike Weight', 'Custom Power Zones')
visibility––Who can see it: PRIVATE (default, only you), FOLLOWERS, or PUBLIC.
NameTypeReqDescription
resultstringyes–

No examples provided.

icu_create_event ~1,063

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.

NameTypeReqDescription
athlete_cannot_edit––Lock this event so the athlete cannot move or edit it (the web UI's 'Athlete cannot edit' checkbox). For coaches managing an athlete via athlete_id
athlete_id––Athlete ID (for coaches managing multiple athletes)
categorystringyesEvent 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…
hide_from_athlete––Hide this event from the athlete's calendar (the web UI's 'Hide from athlete' checkbox). For coaches managing an athlete via athlete_id
namestringyesEvent 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_datestringyesStart date in YYYY-MM-DD format
tags––Calendar tags for grouping and filtering, without the leading # (e.g. ["sweet-spot", "indoor"])
training_availability––Training availability: NORMAL, LIMITED, or UNAVAILABLE. Typical for INJURED/SICK/HOLIDAY blocks.
training_load––Planned training load
NameTypeReqDescription
resultstringyes–

No examples provided.

icu_create_gear ~147

Create a new gear item for tracking equipment usage and maintenance (bikes, shoes, trainers, etc.).

NameTypeReqDescription
activeboolean–Whether this gear is actively used (False = retired)
athlete_id––Athlete ID (for coaches managing multiple athletes)
gear_typestringyesGear type, case-insensitive. Whole items: Bike, Shoes, Wetsuit, Trainer, RowingMachine, Skis, Snowboard, Boat, Board, Equipment, Accessories, Apparel, Computer. Components: Chain, Cassette, Wheel, Ty…
namestringyesName of the gear item
NameTypeReqDescription
resultstringyes–

No examples provided.

icu_create_gear_reminder ~120

Create a maintenance reminder for a gear item, triggered by distance, time, or both.

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
distance_alert––Alert every N kilometers (e.g., 500 for every 500km)
gear_idstringyesID of the gear item
textstringyesReminder text (e.g., 'Replace chain', 'New shoes')
time_alert––Alert every N hours (e.g., 100 for every 100 hours)
NameTypeReqDescription
resultstringyes–

No examples provided.

icu_create_sport_settings ~169

Create a per-sport threshold record with outdoor/indoor FTP, FTHR, pace, or swim settings.

NameTypeReqDescription
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_typestringyesType of sport (e.g., 'Ride', 'Run', 'Swim')
swim_threshold––Swim threshold in min/100m (e.g., 1.5 for 1:30/100m)
NameTypeReqDescription
resultstringyes–

No examples provided.

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.

NameTypeReqDescription
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_idintegeryesExisting library folder or plan ID (from icu_get_workout_library)
indoor––Mark as an indoor workout
namestringyesWorkout 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)
NameTypeReqDescription
resultstringyes–

No examples provided.

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.

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
description––Folder or plan description
folder_typestring–FOLDER (a plain collection of workouts) or PLAN (a training plan whose workouts sit on plan days, schedulable with icu_apply_training_plan)
namestringyesFolder or plan name
NameTypeReqDescription
resultstringyes–

No examples provided.

icu_delete_activity_message ~132

DELETE one of your own notes from an activity. Use when the user wants a note removed: "delete my comment on that run", "remove the note I left yesterday". Only the author's own notes can be deleted. Intervals.icu keeps a "(deleted)" placeholder in the thread. Returns the deleted text so it can be re-posted with icu_add_activity_message if needed (the original timestamp is lost).

NameTypeReqDescription
activity_idstringyesThe Intervals.icu activity ID
message_idintegeryesID of the note to delete (from icu_get_activity_messages)
NameTypeReqDescription
resultstringyes–

No examples provided.

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.

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
event_idintegeryesEvent ID to delete
NameTypeReqDescription
resultstringyes–

No examples provided.

icu_delete_gear ~60

Permanently delete a gear item and its maintenance reminders. Activities that used this gear are not affected.

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
gear_idstringyesID of the gear item to delete
NameTypeReqDescription
resultstringyes–

No examples provided.

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.

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
workout_idintegeryesLibrary workout ID to delete (from icu_get_workouts_in_folder)
NameTypeReqDescription
resultstringyes–

No examples provided.

icu_delete_workout_folder ~144

Permanently delete ONE library folder or training plan AND every workout in it. Destructive — cannot be undone. Calendar events already applied from a plan stay on the calendar (delete those with icu_delete_event); to remove a single library workout use icu_delete_workout. In `safe` delete mode (default), a folder that still holds workouts is refused and reported in the `skipped` envelope. Confirm with the user before calling if unsure.

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
folder_idintegeryesLibrary folder or plan ID to delete (from icu_get_workout_library)
NameTypeReqDescription
resultstringyes–

No examples provided.

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.

NameTypeReqDescription
activity_idstringyesActivity ID to download
output_path––Path to save the file (optional)
NameTypeReqDescription
resultstringyes–

No examples provided.

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).

NameTypeReqDescription
activity_idstringyesActivity ID to download
output_path––Path to save the FIT file (optional)
NameTypeReqDescription
resultstringyes–

No examples provided.

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).

NameTypeReqDescription
activity_idstringyesActivity ID to download
output_path––Path to save the GPX file (optional)
NameTypeReqDescription
resultstringyes–

No examples provided.

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.

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
event_idsstringyesJSON array of event IDs to duplicate (e.g., '[123, 456]')
num_copiesinteger–Number of copies to create
weeks_betweeninteger–Weeks between each copy
NameTypeReqDescription
resultstringyes–

No examples provided.

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.

NameTypeReqDescription
activity_idstringyesReference activity ID
athlete_id––Athlete ID (for coaches managing multiple athletes)
countinteger–Number of activities before and after
NameTypeReqDescription
resultstringyes–

No examples provided.

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.

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
limitinteger–Max activities to return (newest-first within the window)
newest––Newest date to include, YYYY-MM-DD (inclusive). Defaults to today.
oldeststringyesOldest date to include, YYYY-MM-DD (inclusive)
NameTypeReqDescription
resultstringyes–

No examples provided.

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.

NameTypeReqDescription
activity_idstringyesActivity ID to fetch
NameTypeReqDescription
resultstringyes–

No examples provided.

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.

NameTypeReqDescription
activity_idstringyesActivity ID to fetch intervals for
NameTypeReqDescription
resultstringyes–

No examples provided.

icu_get_activity_messages ~131

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. Deleted notes stay in the thread as a "(deleted)" placeholder with a `deleted` timestamp. To POST a new message use icu_add_activity_message (singular = WRITE).

NameTypeReqDescription
activity_idstringyesThe Intervals.icu activity ID
NameTypeReqDescription
resultstringyes–

No examples provided.

icu_get_activity_streams ~474

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. `latlng` comes back as [lat, lng] pairs (null where the sample has no GPS fix). `left_right_balance` (dual-sided power meters) is the RIGHT pedal's share of power in percent (FIT convention), not the left's: a stream averaging 48 means L 52% / R 48%. The response adds a `stream_notes` entry saying so whenever the stream is returned. `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.

NameTypeReqDescription
activity_idstringyesActivity ID to fetch streams for
max_points––Thin every returned stream to at most this many samples by keeping every Nth one (the same N for all streams, so indices stay aligned). Omit for full resolution. ~500 is plenty to trace a route or se…
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…
NameTypeReqDescription
resultstringyes–

No examples provided.

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).

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
days_aheadinteger–Days to look ahead (default 365 — full annual plan). Narrow for month/week queries, e.g. 31 for July.
days_backinteger–Number of days to look back
NameTypeReqDescription
resultstringyes–

No examples provided.

icu_get_athlete_profile ~105

Get an athlete's profile — sport settings (outdoor/indoor FTP, FTHR, pace) and current CTL/ATL/TSB. Also returns the free-text athlete notes (Markdown) when set; change them with icu_update_athlete_notes. Defaults to the authenticated athlete; coaches can pass athlete_id to read one of their managed athletes instead.

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
NameTypeReqDescription
resultstringyes–

No examples provided.

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.

NameTypeReqDescription
activity_idstringyesActivity ID to analyze
countinteger–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.
streamstring–Stream to search for best efforts: 'watts', 'heartrate', or 'pace'
NameTypeReqDescription
resultstringyes–

No examples provided.

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.

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
days_aheadinteger–Number of days to look ahead
days_backinteger–Number of days to look back
NameTypeReqDescription
resultstringyes–

No examples provided.

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.

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
item_idintegeryesCustom item ID
NameTypeReqDescription
resultstringyes–

No examples provided.

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.).

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
NameTypeReqDescription
resultstringyes–

No examples provided.

icu_get_event ~55

Fetch ONE specific calendar event by ID — full details including description, workout structure, and metrics.

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
event_idintegeryesEvent ID to retrieve
NameTypeReqDescription
resultstringyes–

No examples provided.

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).

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
days_aheadintegeryesNumber of days after today to include (inclusive); use 0 for history only
days_backintegeryesNumber of days before today to include (inclusive)
NameTypeReqDescription
resultstringyes–

No examples provided.

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.

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
NameTypeReqDescription
resultstringyes–

No examples provided.

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.

NameTypeReqDescription
activity_idstringyesActivity ID to analyze
NameTypeReqDescription
resultstringyes–

No examples provided.

icu_get_gear_list ~45

List all gear items with usage stats (distance, time, activity count) and maintenance reminders.

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
NameTypeReqDescription
resultstringyes–

No examples provided.

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.

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
days_back––Number of days to analyze (optional)
sport_typestring–Sport type (e.g., Ride, Run, Swim, VirtualRide)
time_period––Time period shorthand: 'week', 'month', 'year', 'all' (optional)
NameTypeReqDescription
resultstringyes–

No examples provided.

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.

NameTypeReqDescription
activity_idstringyesActivity ID to analyze
NameTypeReqDescription
resultstringyes–

No examples provided.

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.

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
days_back––Number of days to analyze (optional)
sport_typestring–Sport type (e.g., Run, Swim)
time_period––Time period shorthand: 'week', 'month', 'year', 'all' (optional)
use_gapboolean–Use Grade Adjusted Pace (GAP) for running
NameTypeReqDescription
resultstringyes–

No examples provided.

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.

NameTypeReqDescription
activity_idstringyesActivity ID to analyze
NameTypeReqDescription
resultstringyes–

No examples provided.

icu_get_power_curves ~374

Fetch the power-vs-duration curve — best (highest) sustained watts and W/kg across durations from 5s up to 6h, aggregated over the chosen window. Use for FTP estimation, peak-power tracking, durability, strengths/weaknesses across duration profiles. Includes fitted power models (CP, W', Pmax, FTP), the VO2max estimate and MAP when Intervals.icu provides them. Pick ONE window: days_back, time_period, start_date/end_date, season, or periods (to compare several, e.g. ['s0', 's1', 'all']). Default is the last 90 days. For time-in-zone *distribution* within a single activity, use icu_get_power_histogram instead.

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
days_back––Number of days to analyze (optional)
end_date––Range end (YYYY-MM-DD), inclusive
full_curveboolean–Also return all points the API returns (secs + watts), not just key durations
periods––Compare up to 5 periods in one call; each is week/month/year/all, '<N>d', a season ID ('s1'), or 'YYYY-MM-DD..YYYY-MM-DD'. Returns one entry per period.
season––Season curve ID from icu_get_seasons: 's0' = current, 's1' = previous
sport_typestring–Sport type (e.g., Ride, Run, Swim, VirtualRide)
start_date––Range start (YYYY-MM-DD); use with end_date (defaults to today)
time_period––Time period shorthand: 'week', 'month', 'year', 'all' (optional)
NameTypeReqDescription
resultstringyes–

No examples provided.

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.

NameTypeReqDescription
activity_idstringyesActivity ID to analyze
NameTypeReqDescription
resultstringyes–

No examples provided.

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.

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
days_backinteger–Number of days to look back
limitinteger–Number of activities to fetch
NameTypeReqDescription
resultstringyes–

No examples provided.

icu_get_seasons ~113

List the athlete's training SEASONS defined in Intervals.icu (name, start, end, curve ID). Use for "which seasons do I have?", or before comparing seasons: pass a season's curve_id ('s0' = current, 's1' = previous, ...) to icu_get_power_curves. A season runs until the day before the next one starts; the newest season is open-ended.

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
NameTypeReqDescription
resultstringyes–

No examples provided.

icu_get_sport_settings ~179

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 (unless set explicitly) 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.

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
NameTypeReqDescription
resultstringyes–

No examples provided.

icu_get_upcoming_workouts ~185

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. hide_from_athlete / athlete_cannot_edit appear only when set (change them with icu_bulk_update_event_access).

NameTypeReqDescription
athlete_id––Athlete ID (for coaches managing multiple athletes)
limitinteger–Maximum number of planned workout events to return
NameTypeReqDescription
resultstringyes–

No examples provided.

Install

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

# add to Claude Code
claude mcp add hhopke-intervals-icu-mcp -- uvx intervals-icu-mcp
Common questions

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 96 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 4 November 2026. Its build provenance is signed and verified. 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 69 tools: icu_get_recent_activities, icu_get_activities_by_date, icu_get_activity_details, icu_search_activities, icu_search_activities_full, and 64 more. Their descriptions and schemas cost roughly 14,705 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 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the io.github.hhopke/intervals-icu-mcp server under?

io.github.hhopke/intervals-icu-mcp declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.