An Intervals.icu MCP server built for Stryd runners — power-based running analysis (a dual PMC with RSS and LBSS), designed so the LLM never does the math.
23 tools with consistent verb-noun naming (get_, create_, update_, delete_, list_). All tools have descriptions (avg 85 chars, within baseline 34-392). Input schemas present for all tools with typed parameters. However, parameter descriptions are minimal (often single phrases like 'The activity ID'), lacking actionable constraints, format guidance, and dependency hints. Output schemas are not documented in visible code. Error handling is absent, no recovery guidance, categorization, or actionable error messages. No tool annotations (readOnlyHint/destructiveHint). Composition is sound: tools are single-responsibility, and chaining IDs are returned (activity_id, event_id, gear_id). Security: credentials injected via environment (INTERVALS_API_KEY, INTERVALS_ATHLETE_ID), not exposed as parameters.
Assign gear to an activity
Clear the activity stream cache
Create calendar events in Intervals.icu
Create a new gear item (shoe or bike)
Delete a calendar event from Intervals.icu
Delete multiple calendar events from Intervals.icu
Estimate critical impact (CI) for Stryd power-based running analysis
Retrieve activities from Intervals.icu
Parameter descriptions lack actionable constraints. E.g., 'ISO 8601 date string' is stated but no guidance on range (past 5 years? future dates allowed?), timezone handling, or what happens if dates are invalid.
No output schema documentation visible in source. LLMs cannot plan downstream tool calls or extract required fields (e.g., what fields does get_activities return? Is there pagination?). Violates pattern:tool and mxe:strip-api-responses.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | <=2025-11-25 | v2 |
Retrieve detailed information about a specific activity
Retrieve athlete summary data for a date range
Get current Performance Management Chart (PMC) data with Stryd power metrics
Retrieve calendar events from Intervals.icu
Retrieve HRV (Heart Rate Variability) trends
Get phase summary of Stryd power-based training metrics
Retrieve activity stream data summary
Get weekly summary of Stryd power-based training metrics
Retrieve wellness data from Intervals.icu
List all gear (shoes, bikes) from Intervals.icu
Retire a gear item
Search for activities similar to a given activity
Enable or disable the activity stream cache
Update a calendar event in Intervals.icu
Update LBSS (Leg Spring Stiffness Score) and Critical Impact table
No error handling or recovery guidance. Tools throw on hard failure but provide no actionable error messages. E.g., if activity_id is invalid, does the tool return 404 with 'Activity not found. Try get_activities() to list available activities'? Or a bare error?
Destructive tools (delete_event, delete_events) lack confirmation or dry-run support. No pattern:confirmation-request. Agents can accidentally delete multiple events without safeguards.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot infer which tools are safe to retry, which modify state, or which are read-only without explicit hints.