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 · SCANNED SEP 20

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

Available components

0 this week 81 Trust /100
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 native-build step with no shell scripting around it. View diagnostics → Pass
  • 1 of 23 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency32
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
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
// .cursor/mcp.json
{
  "mcpServers": {
    "hhopke-intervals-icu-mcp": {
      "command": "uvx",
      "args": [
        "intervals-icu-mcp"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "hhopke-intervals-icu-mcp": {
      "command": "uvx",
      "args": [
        "intervals-icu-mcp"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add hhopke-intervals-icu-mcp -- uvx intervals-icu-mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "hhopke-intervals-icu-mcp": {
      "type": "local",
      "command": [
        "uvx",
        "intervals-icu-mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add hhopke-intervals-icu-mcp --command uvx --arg intervals-icu-mcp
# ~/.hermes/config.yaml
mcp_servers:
  hhopke-intervals-icu-mcp:
    command: "uvx"
    args: ["intervals-icu-mcp"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "hhopke-intervals-icu-mcp": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "intervals-icu-mcp"
      ]
    }
  }
}
# add to Vellum
assistant mcp add hhopke-intervals-icu-mcp -t stdio -c uvx -a intervals-icu-mcp
// mcp.json
{
  "mcpServers": {
    "hhopke-intervals-icu-mcp": {
      "command": "uvx",
      "args": [
        "intervals-icu-mcp"
      ]
    }
  }
}
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.

  • 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
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 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 →

MCP tools · 64 exposed · ~12,674 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_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.

NameTypeReqDescription
athlete_idAthlete ID (for coaches managing multiple athletes)
sport_idintegeryesID of the sport settings to apply
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_idAthlete ID (for coaches managing multiple athletes)
extra_workouts_jsonOptional 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 ~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.

NameTypeReqDescription
athlete_idAthlete 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_idAthlete 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_idAthlete 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_idAthlete 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_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_idAthlete ID (only for coaches; uses configured default otherwise)
contentConfiguration 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…
descriptionOptional 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')
visibilityWho can see it: PRIVATE (default, only you), FOLLOWERS, or PUBLIC.
NameTypeReqDescription
resultstringyes

No examples provided.

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.

NameTypeReqDescription
athlete_idAthlete 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…
colorCustom display color (hex string)
descriptionEvent 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_metersPlanned distance in meters
duration_secondsPlanned duration in seconds
end_dateEnd date in YYYY-MM-DD format. Use for ranged categories (INJURED, SICK, HOLIDAY, SEASON_START) to mark a multi-day block.
event_typeActivity discipline (NOT the category): Ride, Run, Swim, Walk, Hike, WeightTraining, Workout, VirtualRide, VirtualRun, Other (full discipline list: intervals-icu://event-categories resource). Require…
namestringyesEvent name
not_on_fitness_chartHide event entirely from the fitness chart
show_as_noteShow event as a note marker on the fitness chart
show_on_ctl_lineRender event on the CTL line
start_datestringyesStart date in YYYY-MM-DD format
training_availabilityTraining availability: NORMAL, LIMITED, or UNAVAILABLE. Typical for INJURED/SICK/HOLIDAY blocks.
training_loadPlanned 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
activebooleanWhether this gear is actively used (False = retired)
athlete_idAthlete 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_idAthlete ID (for coaches managing multiple athletes)
distance_alertAlert every N kilometers (e.g., 500 for every 500km)
gear_idstringyesID of the gear item
textstringyesReminder text (e.g., 'Replace chain', 'New shoes')
time_alertAlert 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_idAthlete ID (for coaches managing multiple athletes)
fthrFunctional Threshold Heart Rate in bpm
ftpFunctional Threshold Power in watts (for cycling)
indoor_ftpIndoor Functional Threshold Power in watts (for cycling)
pace_thresholdThreshold pace in min/km (e.g., 4.5 for 4:30/km)
sport_typestringyesType of sport (e.g., 'Ride', 'Run', 'Swim')
swim_thresholdSwim 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_idAthlete ID (for coaches managing multiple athletes)
colorCustom display color (hex string)
dayPLAN folders only: day offset from plan start (0 = day 1 of week 1, 7 = day 1 of week 2). Omit for plain folders.
descriptionWorkout 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_metersPlanned distance in meters
duration_secondsPlanned duration in seconds
folder_idintegeryesExisting library folder or plan ID (from icu_get_workout_library)
indoorMark as an indoor workout
namestringyesWorkout name
tagsTags for organizing the library
targetDevice target type: AUTO, POWER, HR, or PACE
training_loadPlanned training load
workout_typeActivity 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_idAthlete ID (for coaches managing multiple athletes)
descriptionFolder or plan description
folder_typestringFOLDER (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_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_idAthlete 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_idAthlete 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_idAthlete ID (for coaches managing multiple athletes)
workout_idintegeryesLibrary workout ID to delete (from icu_get_workouts_in_folder)
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_pathPath 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_pathPath 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_pathPath 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_idAthlete ID (for coaches managing multiple athletes)
event_idsstringyesJSON array of event IDs to duplicate (e.g., '[123, 456]')
num_copiesintegerNumber of copies to create
weeks_betweenintegerWeeks 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_idAthlete ID (for coaches managing multiple athletes)
countintegerNumber 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_idAthlete ID (for coaches managing multiple athletes)
limitintegerMax activities to return (newest-first within the window)
newestNewest 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 ~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).

NameTypeReqDescription
activity_idstringyesThe Intervals.icu activity ID
NameTypeReqDescription
resultstringyes

No examples provided.

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.

NameTypeReqDescription
activity_idstringyesActivity ID to fetch streams for
streamsList 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_idAthlete ID (for coaches managing multiple athletes)
days_aheadintegerDays to look ahead (default 365 — full annual plan). Narrow for month/week queries, e.g. 31 for July.
days_backintegerNumber of days to look back
NameTypeReqDescription
resultstringyes

No examples provided.

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.

NameTypeReqDescription
athlete_idAthlete 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
countintegerNumber of efforts to return (default 8)
distanceDistance of each effort in meters (e.g., 5000 for 5k). At least one of 'duration' or 'distance' is required.
durationDuration of each effort in seconds (e.g., 60 for 1-min, 1200 for 20-min). At least one of 'duration' or 'distance' is required.
streamstringStream 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_idAthlete ID (for coaches managing multiple athletes)
days_aheadintegerNumber of days to look ahead
days_backintegerNumber 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_idAthlete 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_idAthlete 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_idAthlete 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_idAthlete 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_idAthlete 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_idAthlete 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_idAthlete ID (for coaches managing multiple athletes)
days_backNumber of days to analyze (optional)
sport_typestringSport type (e.g., Ride, Run, Swim, VirtualRide)
time_periodTime 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_idAthlete ID (for coaches managing multiple athletes)
days_backNumber of days to analyze (optional)
sport_typestringSport type (e.g., Run, Swim)
time_periodTime period shorthand: 'week', 'month', 'year', 'all' (optional)
use_gapbooleanUse 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 ~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.

NameTypeReqDescription
athlete_idAthlete ID (for coaches managing multiple athletes)
days_backNumber of days to analyze (optional)
sport_typestringSport type (e.g., Ride, Run, Swim, VirtualRide)
time_periodTime 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_idAthlete ID (for coaches managing multiple athletes)
days_backintegerNumber of days to look back
limitintegerNumber of activities to fetch
NameTypeReqDescription
resultstringyes

No examples provided.

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.

NameTypeReqDescription
athlete_idAthlete ID (for coaches managing multiple athletes)
NameTypeReqDescription
resultstringyes

No examples provided.

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.

NameTypeReqDescription
athlete_idAthlete ID (for coaches managing multiple athletes)
limitintegerMaximum number of planned workout events to return
NameTypeReqDescription
resultstringyes

No examples provided.

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.

NameTypeReqDescription
athlete_idAthlete ID (for coaches managing multiple athletes)
days_backintegerNumber of days to look back
NameTypeReqDescription
resultstringyes

No examples provided.

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.

NameTypeReqDescription
athlete_idAthlete ID (for coaches managing multiple athletes)
datestringyesDate in YYYY-MM-DD format
NameTypeReqDescription
resultstringyes

No examples provided.

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.

NameTypeReqDescription
athlete_idAthlete ID (for coaches managing multiple athletes)
NameTypeReqDescription
resultstringyes

No examples provided.

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