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_get_workouts_in_folder Icu Get Workouts In Folder ~66
List the workouts stored in one specific library folder or training plan — name, type, structure, training load, intensity factor.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| folder_id | integer | yes | Folder ID to get workouts from |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_list_athletes Icu List Athletes ~79
List the athletes this account can access — the caller plus anyone they follow or coach. Call this FIRST whenever a request concerns someone other than the default athlete, to resolve a name to the athlete_id that other tools take. Returns each athlete's access level, so you know before calling whether a write will be permitted.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_search_activities Icu Search Activities ~121
Search activities by name or tag, returning a LIGHT result list — id, name, type, date, distance, time only. Use this first for "find my X" queries. Only escalate to search_activities_full when you specifically need power, HR, training load, or intensity-factor data on the matches (heavier payload).
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| limit | integer | – | Maximum number of results to return |
| query | string | yes | Search query (activity name or tag) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_search_activities_full Icu Search Activities Full ~119
Search activities by name or tag, returning FULL Activity objects with power, HR, training load, intensity factor, normalized power, weather — every metric per result. Heavy payload. Use only when the lighter search_activities won't tell you what you need (e.g. "find my threshold rides with NP above 250W").
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| limit | integer | – | Maximum number of results to return |
| query | string | yes | Search query (activity name or tag) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_search_intervals Icu Search Intervals ~224
Search intervals ACROSS ALL the athlete's activities (cross-activity). Different from icu_get_activity_intervals (single-activity). Use to track progress on a workout type ("all my threshold intervals over the last year") or find comparable historical sessions. Returns the activities containing matching intervals, each with an `interval_summary` like "2x 8m 162w" (reps x duration at target).
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| interval_type | – | – | Interval target type: AUTO, POWER, HR, or PACE (what the interval targeted — not the sport and not a workout-step label) |
| limit | integer | – | Maximum number of matching activities to return |
| max_duration | – | – | Maximum interval duration in seconds |
| max_intensity | – | – | Maximum interval intensity in percent of threshold (e.g. 105) |
| min_duration | – | – | Minimum interval duration in seconds |
| min_intensity | – | – | Minimum interval intensity in percent of threshold (e.g. 80) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_update_activity Icu Update Activity ~137
Update an existing activity's metadata (name, type, trainer flag, RPE, feel, etc.). Only fields you pass are sent; everything else stays unchanged.
| Name | Type | Req | Description |
|---|---|---|---|
| activity_id | string | yes | Activity ID to update |
| activity_type | – | – | Updated activity type (e.g., Ride, Run, Swim) |
| commute | – | – | Mark as commute |
| description | – | – | Updated description |
| feel | – | – | How you felt (1-5 scale) |
| name | – | – | Updated activity name |
| perceived_exertion | – | – | RPE rating (1-10 scale) |
| trainer | – | – | Mark as trainer/indoor workout |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_update_activity_streams Icu Update Activity Streams ~103
Upload raw time-series streams (power, HR, cadence, etc.) onto an existing activity. Destructive — overwrites existing stream data. Accepts JSON array or CSV. Different from get_activity_streams (READ).
| Name | Type | Req | Description |
|---|---|---|---|
| activity_id | string | yes | Activity ID to update |
| format | string | – | Format of the payload: 'json' or 'csv' |
| payload_string | string | yes | JSON array of stream dictionaries or raw CSV data |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_update_custom_item Icu Update Custom Item ~206
Modify an existing custom chart/field/zones/panel. Use when the user wants to change one of their existing customizations: "rename my custom field", "make this chart public". Usually need icu_get_custom_items first to find the right `item_id`. Only fields you pass are sent — others are left unchanged. For `content` schema, see intervals-icu://custom-item-schemas.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| content | – | – | Updated configuration content (replaces existing wholesale). Same schema as create_custom_item.content — see intervals-icu://custom-item-schemas for the per-item_type shape. |
| description | – | – | Updated description |
| item_id | integer | yes | Custom item ID to update |
| item_type | – | – | Updated type (see icu_create_custom_item for values) |
| name | – | – | Updated name |
| visibility | – | – | Updated visibility: PRIVATE, FOLLOWERS, or PUBLIC |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_update_event Icu Update Event ~734
Update an existing calendar event. Only fields you pass are sent — other fields remain unchanged. For category and training_availability semantics, see intervals-icu://event-categories. For WORKOUT `description` syntax, see intervals-icu://workout-syntax.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| color | – | – | Updated color (hex string) |
| description | – | – | Updated description. For WORKOUT events the server parses this into structured, device-syncable steps with zones and a training load. Use Intervals.icu workout syntax: one step per line as '- <durati… |
| distance_meters | – | – | Updated distance in meters |
| duration_seconds | – | – | Updated duration in seconds |
| end_date | – | – | Updated end date (YYYY-MM-DD) |
| event_id | integer | yes | Event ID to update |
| event_type | – | – | Updated activity type |
| name | – | – | Updated event name |
| not_on_fitness_chart | – | – | Hide event from the fitness chart |
| show_as_note | – | – | Show event as a note on the fitness chart |
| show_on_ctl_line | – | – | Render event on the CTL line |
| start_date | – | – | Updated start date (YYYY-MM-DD) |
| training_availability | – | – | Updated training availability: NORMAL, LIMITED, or UNAVAILABLE |
| training_load | – | – | Updated training load |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_update_gear Icu Update Gear ~101
Update an existing gear item. Only fields you pass are sent.
| Name | Type | Req | Description |
|---|---|---|---|
| active | – | – | False retires the gear (dated today); True un-retires it |
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| gear_id | string | yes | ID of the gear item to update |
| gear_type | – | – | Updated type, case-insensitive (Bike, Shoes, Trainer, Chain, ...) |
| name | – | – | Updated name |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_update_gear_reminder Icu Update Gear Reminder ~98
Update an existing gear maintenance reminder. Only fields you pass are sent.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| distance_alert | – | – | Updated distance alert in kilometers |
| gear_id | string | yes | ID of the gear item |
| reminder_id | integer | yes | ID of the reminder to update |
| text | – | – | Updated reminder text |
| time_alert | – | – | Updated time alert in hours |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_update_sport_settings Icu Update Sport Settings ~181
Update an existing per-sport threshold record (outdoor/indoor FTP, FTHR, pace, swim).
| 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) |
| recalc_hr_zones | boolean | – | Recalculate HR zones from the updated threshold heart rate |
| sport_id | integer | yes | ID of the sport settings to update |
| 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_update_wellness Icu Update Wellness ~534
Upsert wellness data for ONE specific date — creates the record if missing, otherwise updates the fields you pass. Only provided fields are sent. Subjective scales (fatigue, soreness, stress, mood, motivation, injury) are 1-5. Pass `locked=True` to stop device sync from overwriting manual entries. Writes to the authenticated athlete unless athlete_id names a managed athlete.
| Name | Type | Req | Description |
|---|---|---|---|
| abdomen | – | – | Abdominal circumference in cm |
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| blood_glucose | – | – | Blood glucose in mmol/L |
| body_fat | – | – | Body fat percentage |
| calories_consumed | – | – | Calories consumed (kcal) |
| carbohydrates | – | – | Carbohydrates consumed (grams) |
| comments | – | – | Comments or notes |
| date | string | yes | Date in YYYY-MM-DD format |
| diastolic | – | – | Diastolic blood pressure in mmHg |
| fat_total | – | – | Total fat consumed (grams) |
| fatigue | – | – | Fatigue level (1-5 scale) |
| hrv | – | – | HRV (rMSSD) value |
| hydration | – | – | Subjective hydration rating (1-4: 1=well hydrated, 4=very dehydrated) |
| hydration_liters | – | – | Hydration volume (liters) |
| injury | – | – | Injury severity (1-5 scale: 1=none, 5=severe) |
| lactate | – | – | Blood lactate in mmol/L — lab result |
| locked | – | – | Lock record to prevent device sync from overwriting manual entries |
| menstrual_phase | – | – | Menstrual phase (e.g. FOLLICULAR, OVULATING, LUTEAL, MENSTRUAL) |
| mood | – | – | Mood level (1-5 scale) |
| motivation | – | – | Motivation level (1-5 scale) |
| protein | – | – | Protein consumed (grams) |
| readiness | – | – | Readiness score (0-100) |
| respiration | – | – | Respiration rate in breaths per minute |
| resting_hr | – | – | Resting heart rate in bpm |
| sleep_quality | – | – | Sleep quality (1-5 scale) |
| sleep_secs | – | – | Sleep duration in seconds |
| soreness | – | – | Soreness level (1-5 scale) |
| spo2 | – | – | Blood oxygen saturation percentage (SpO2) |
| stress | – | – | Stress level (1-5 scale) |
| systolic | – | – | Systolic blood pressure in mmHg |
| vo2max | – | – | VO2max (ml/kg/min) — lab result or device estimate |
| weight | – | – | Weight in kg |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
icu_update_workout Icu Update Workout ~752
Change fields on an EXISTING library workout — only the fields you pass are sent. To save a new workout use icu_create_workout. This edits the library workout only; calendar events are separate records changed with icu_update_event.
| Name | Type | Req | Description |
|---|---|---|---|
| athlete_id | – | – | Athlete ID (for coaches managing multiple athletes) |
| color | – | – | Updated color (hex string) |
| day | – | – | PLAN folders only: updated day offset from plan start |
| description | – | – | Updated workout steps. For WORKOUT events the server parses this into structured, device-syncable steps with zones and a training load. Use Intervals.icu workout syntax: one step per line as '- <dura… |
| distance_meters | – | – | Updated distance in meters |
| duration_seconds | – | – | Updated duration in seconds |
| folder_id | – | – | Move the workout to this folder or plan |
| indoor | – | – | Mark as an indoor workout |
| name | – | – | Updated workout name |
| tags | – | – | Replacement tag list |
| target | – | – | Updated device target type: AUTO, POWER, HR, or PACE |
| training_load | – | – | Updated training load |
| workout_id | integer | yes | Library workout ID (from icu_get_workouts_in_folder) |
| workout_type | – | – | Updated 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.
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.