Intervals MCP
Remote MCP server for intervals.icu run data and analysis
Connector by ljcl · GitHub account verified by the MCP Registry
Install
Pick your client. Read the repository before you give any tool access to your data.
No install instructions from the source yet. Check the repository for setup steps.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this server can do and what it asks for, from its tool list and install config. Checked Oct 25, 2026.
- Tools
- 34 read · 5 write · 1 delete
- Secrets
- None asked for
- Install scripts
- Not scanned yet
- Runs as
- Docker image
Tools by what they do 40
Read from the source code; the running server may list different tools.
Read 34 · Look things up without changing anything.
compare-activitiesget-activityget-activity-lapsget-activity-streamsget-activity-streams-rawget-activity-zonesget-activity-zones-dataget-aerobic-analysisget-athlete-statsget-athlete-zonesget-best-effortsget-cadence-trend-data
Show 22 more tools
get-compare-activities-dataget-fitness-trendget-fitness-trend-dataget-hill-analysisget-interval-analysisget-race-predictionget-route-map-dataget-running-dynamicsget-running-summaryget-split-analysisget-training-loadget-training-load-dataget-wellnesslist-activitieslist-gearview-activity-chartview-activity-zonesview-cadence-trendsview-compare-activitiesview-fitness-trendview-route-mapview-training-load
Write 5 · Create, change, send or run things.
set-brush-windowset-metricset-scopeset-viewset-viewport
Delete 1 · Delete, drop, revoke or wipe things.
update-activity
Tools (40)
Read from the source code; the running server may differ. Descriptions are the server’s own words; hidden characters are shown as [U+…].
compare-activitiesCompare two activitiesread-onlyCompares two running activities side by side: pace, HR, cadence, load and running dynamics for each, the differences (activity 2 minus activity 1), and an efficiency factor per run (metres per minute per heartbeat, higher is better, grade-adjusted when both runs have GAP). Use it for the same route on two days, progress over time, or two races. A per-km table pairs the runs at the same distance (pace, HR and efficiency difference) with a verdict: constant offset (the gap is there from km 1: conditions or recovery) or growing drift (it grows: fatigue). For one run's aerobic durability, use ge…
get-activityActivity detailsread-onlyReturns one intervals.icu activity in detail: core metrics, training load, HR time in zone, running-dynamics averages, each WORK/RECOVERY interval, gear name, description, heart-rate recovery, and any best or threshold rise intervals.icu marked on it. Works for any sport: runs show pace per km, swims pace per 100 m, other sports speed in km/h. Use it after list-activities. For a run, prefer get-running-summary: the same detail plus cadence, HR zone and dynamics assessments and a lap table, in one call. Use get-activity-laps for lap GAP, power or elevation, and the analysis tools (get-split-a…
get-activity-lapsActivity lapsread-onlyReturns one intervals.icu activity's laps: distance, time, pace and grade-adjusted pace (runs), pace per 100 m (swims) or speed (other sports), HR, cadence, power, elevation gain and gradient for each lap. Works for any sport. For a run, get-running-summary already includes this lap table with the rest of the summary, and get-activity lists the same intervals with pace and HR. To judge a workout's reps, use get-interval-analysis; for even 1 km splits, get-split-analysis. Notes: - intervals.icu has no separate lap list: these are its intervals (icu_intervals), which usually match the devic…
get-activity-streamsActivity streamsread-onlyReturns time-series streams for one activity (heart rate, speed, cadence, altitude, GPS track, power and running dynamics), downsampled to at most maxPoints per stream, as index-aligned arrays with a unit per type. The text repeats the data as a CSV block. Use it only when you need the raw series: the analysis tools already turn streams into answers (get-split-analysis for km splits, get-hill-analysis for climbs, get-interval-analysis for reps, get-aerobic-analysis for decoupling), and view-activity-chart shows them. Ask only for the types you need: the response has a size budget, so a high …
get-activity-streams-rawActivity chart dataread-onlyInternal data feed for the activity chart UI: returns per-sample arrays (time, distance, heartrate, watts, velocity_smooth, altitude, cadence, grade_smooth, and running dynamics stance_time/vertical_oscillation/vertical_ratio/step_length), downsampled to about 1,000 points, plus interval bands (type, label, start/end index) as JSON for one activity. The view-activity-chart app calls this; not intended for direct model use.
get-activity-zonesTime in heart-rate zonesread-onlyReturns one intervals.icu activity's heart rate time in zone: time and percent in each zone, from the activity's own recorded zone bounds (not today's sport settings). For today's settings and zone ranges, use get-athlete-zones. get-activity and get-running-summary already include HR zone time. Use this tool when zones are all you need, or to compare zone distribution between activities; use view-activity-zones to show it as a chart. Notes: - Power and pace zones are not covered. - An activity with no zone data (no HR sensor, no recorded bounds) returns an empty zone_sets list and a messa…
get-activity-zones-dataHeart-rate zones chart dataread-onlyInternal data feed for the activity-zones UI: returns per-zone time distributions (bucket bounds, seconds, percentages) for the activity's heart rate zones as JSON. The view-activity-zones app calls this; not intended for direct model use.
get-aerobic-analysisAerobic analysisread-onlyMeasures aerobic durability and efficiency for one activity: aerobic decoupling (the drift in output per heartbeat from the first to the second half of the moving time), the efficiency factor (metres per minute per beat on the gap and pace bases, watts per beat on the power basis) and, on the power basis, the intensity factor. Use it for long steady runs: "did my aerobic system hold up?" or "was this easy run actually easy?". To compare two runs' efficiency, use compare-activities; for pacing drift over km splits, get-split-analysis. Notes: - Decoupling under +5% is excellent, +5 to +10% mo…
get-athlete-statsTraining totalsread-onlyReturns training totals for this week, the last 4 weeks, this month and the year to date, in two sets. Run totals: run count, distance, moving time, elevation gain, training load and average pace. All-sports totals: count, moving time, distance and training load for each activity type, and a total for all types together. No inputs. Use it for "how much have I been running?", "how many strength sessions did I do this month?" or "how far have I swum this year?" instead of adding up list-activities. For weekly volume trends and volume-spike warnings, use get-training-load. For fitness, fatigue …
get-athlete-zonesZones and thresholdsread-onlyReturns the athlete's own zones and thresholds from intervals.icu sport settings, with units: LTHR, max HR, HR zones, threshold pace, pace zones and FTP. Use it for "what are my HR zones?", "is 150 bpm zone 2 for me?" or "what is my threshold pace?". It also compares LTHR and max HR with the athlete's recent heart rate bests, and says when a setting looks out of date. For the time spent in each zone on one activity, use get-activity-zones. It uses the zone bounds recorded with that activity, which can be older than these settings. Notes: - sport is an intervals.icu activity type (default Ru…
get-best-effortsBest effortsread-onlyReturns best times at standard running distances (400 m to marathon by default). Over your history it reads intervals.icu's pace curves for all time, the last year, the last 90 days or a custom range: "what is my fastest 5K?". With an id it searches one run instead and says where each effort starts and ends: "what was my fastest 5K inside Sunday's half?" or "my 3 fastest km today" (id "latest" is your newest run). For predicted race times or goal pacing, use get-race-prediction. For even 1 km splits of one run, use get-split-analysis. Notes: - Each time is the elapsed time across the fastes…
get-cadence-trend-dataCadence trends chart dataread-onlyInternal data feed for the cadence-trends UI: returns per-run summary cadence and pace for recent running activities as JSON. The view-cadence-trends app calls this; not intended for direct model use.
get-compare-activities-dataActivity comparison chart dataread-onlyInternal data feed for the compare-activities UI: returns the aggregate comparison (per-activity summaries, activity2−activity1 differences, efficiency analysis) as JSON. The view-compare-activities app calls this alongside get-activity-streams-raw; not intended for direct model use.
get-fitness-trendFitness trendread-onlyReturns fitness (CTL, a 42-day load average), fatigue (ATL, 7-day) and form (TSB, CTL minus ATL: negative is carrying fatigue, positive is fresh) day by day, and can project them forward or solve a taper. Use it for "am I fresh for Saturday?", "when does my form turn positive?", taper planning, or whether a block is digging too deep. get-wellness and get-training-load also report CTL/ATL/TSB, but only as recorded values, with no projection or taper. Use view-fitness-trend to show this as a chart. Notes: - By default CTL/ATL come straight from intervals.icu's daily wellness record, matchin…
get-fitness-trend-dataFitness trend chart dataread-onlyInternal data feed for the fitness-trend UI: returns the per-day CTL/ATL/TSB series, the forward projection, any solved taper plan (weekly loads and the days they produce), and the dated deep-fatigue / freshness / steep-ramp bands as JSON. The view-fitness-trend app calls this; not intended for direct model use.
Show 25 more tools
get-hill-analysisHill analysisread-onlyFinds the sustained climbs (at least 2% for at least 200 m) and descents in one activity, with each segment's length, grade, gain, moving and grade-adjusted pace, HR, cadence and power. The headline is early-versus-late climb drift: HR per unit of grade-adjusted speed on climbs in the first half against the second half. Positive drift means the same climbing cost more late in the run. For per-km pacing on a hilly course, use get-split-analysis; for whole-run aerobic durability, get-aerobic-analysis. Notes: - Grade comes from intervals.icu's smoothed grade stream, else from altitude over a…
get-interval-analysisInterval analysisread-onlyDecides whether one activity was an interval session and analyses its reps: pace, HR, cadence and power per rep, fade across reps, and a verdict with a confidence and a reasoning trail. Use it for "how did my intervals go?" or "was this a workout at all?". With findSimilar it also compares the reps with earlier sessions of the same structure: "am I getting faster at my 1 km repeats?". For laps exactly as recorded, use get-activity-laps; for continuous pacing, get-split-analysis. Notes: - Clean intervals.icu laps (icu_intervals) are preferred, and they also catch jog-recovery sessions. Con…
get-race-predictionRace predictionread-onlyDescription is built at runtime.
get-route-map-dataRoute map dataread-onlyInternal data feed for the route-map UI: returns [lat, lng] coordinates from the activity's recorded GPS track plus start/end points, distance, elevation gain, and (for activities with GPS streams) index-aligned metric streams (time, distance, altitude, heartrate, watts, velocity_smooth, grade_smooth) and annotation anchors (WORK-interval end markers, caller-supplied distance-anchored waypoints) for one activity as JSON. The view-route-map app calls this; not intended for direct model use.
get-running-dynamicsRunning dynamicsread-onlyReturns one activity's running dynamics: ground contact time (GCT), vertical oscillation (VO), vertical ratio, step length and cadence. It gives activity averages with a within/high/low status against common targets (VO under 100 mm, GCT 200 to 260 ms), plus a row per WORK interval. get-activity and get-running-summary already show the activity averages. Use this tool for the per-interval rows and the status, for example to see whether form held up across repeats. Notes: - Vertical ratio is a value only, with no status (under about 8% is commonly called efficient). - stride_m is distance …
get-running-summaryRunning summaryread-onlyReturns a run-focused summary of one intervals.icu activity: get-activity's detail plus a cadence assessment, HR zone time and percent, ground contact time and vertical oscillation assessments, and the lap table. The best single call for "how was my run?". It already includes the laps and HR zone time, so skip get-activity-laps and get-activity-zones. Use get-running-dynamics for per-interval dynamics, the analysis tools (get-split-analysis, get-hill-analysis, get-interval-analysis, get-aerobic-analysis) for deeper questions, and get-activity for other sports. Notes: - Accepts Run, TrailRun…
get-split-analysisSplit analysisread-onlyBreaks one run into even 1 km splits (moving pace, grade-adjusted pace, elevation, grade, HR, cadence, power) and gives a two-halves pacing verdict twice, on the clock and grade-adjusted, with how many percentage points of the change the terrain explains. Use it for "did I fade?" and pacing discipline. It ignores device laps: use get-activity-laps for those and get-interval-analysis for workout reps. For climbs, use get-hill-analysis. For the fastest 1 km or 5 km anywhere in the run, not on km marks, use get-best-efforts with its id. Notes: - Halves are cut at the exact midpoint of recorded…
get-training-loadTraining loadread-onlyReturns weekly running volume (distance, time, elevation, run count) with a trend and volume-spike warnings, weekly intervals.icu training load, and current CTL/ATL/TSB. Use it for "how is my training volume trending?" or "am I ramping up too fast?", or with newest for a past block. For the day-by-day CTL/ATL/TSB trend, a projection or a taper plan, use get-fitness-trend. For plain totals (this week, month, year to date), use get-athlete-stats; to show weekly volume as a chart, view-training-load. Notes: - Weekly volume and warnings always count runs only (Run, TrailRun, VirtualRun). - Tr…
get-training-load-dataTraining load chart dataread-onlyInternal data feed for the training-load UI: returns per-week running volume (distance, runs, time, elevation), a rolling trend value, and volume-spike warning flags with reasons as JSON. The view-training-load app calls this; not intended for direct model use.
get-wellnessWellnessread-onlyReturns daily wellness from intervals.icu for a day or a date range: HRV (rMSSD, SDNN or both), resting HR, sleep, weight, CTL/ATL/TSB, and the subjective scores the athlete or a device logged (readiness, soreness, fatigue, stress, mood, motivation, SpO2, respiration, comments). Use it to explain how a run felt or to check recovery. For form trends, a projection or a taper, use get-fitness-trend; this tool reports each day's recorded values only. Notes: - With no date, oldest or newest, it returns today only. A range cannot exceed 90 days. - The HRV measure depends on the athlete's device…
list-activitiesList activitiesread-onlyLists intervals.icu activities in a local date range, newest first. Start here: each entry carries the activity id that every per-activity tool needs, plus distance, time, pace (per km for runs, per 100 m for swims) or speed (km/h for other sports), heart rate, training load, and the types of any best or threshold rise intervals.icu marked (get-activity has the detail). For the most recent run, pass id "latest" to the per-activity tool instead of listing first; type "runs" lists runs only. search finds activities by name or #tag across all history, beyond the 366-day window (for example "wh…
list-gearList gearread-onlyLists the athlete's intervals.icu gear (shoes) with total distance, activity count, retirement status and any usage reminders. Use it to see which shoes are racking up mileage, or to find a gear id for update-activity. Notes: - Retired gear is left out unless includeRetired is true. - distance_km includes any starting distance entered when the item was added, not only distance from activities.
set-brush-windowZoom the chartZoom the activity chart's x-axis to one window of the activity, given either in kilometres from the start or in seconds of elapsed time. Use it to put the part of the run being discussed on screen — a surge, a climb, an interval — rather than describing where to look. Pass reset to show the whole activity again.
set-metricChange the compared metricChoose which metric the comparison overlays and whether its x-axis is distance or time. Only metrics both activities recorded are available.
set-scopeChange the fitness viewSwitch the fitness chart between whole-body load and runs only, and show or hide the fitness, fatigue, form and plan series.
set-viewChange the cadence viewDescription is built at runtime.
set-viewportFrame part of the routeZoom the route map to a stretch of the course, given in kilometres from the start. Use it to show the user where on the route something happens — a climb, a split, a segment — instead of only describing it. Omit both bounds and pass reset to show the whole route again.
update-activityUpdate activitycan change or delete dataUpdates one intervals.icu activity's name, description, gear, RPE or feel. It is the only tool that writes: confirm the change with the athlete first. To add a note, use descriptionMode "append" so the existing description stays. Notes: - Give at least one of name, description, gearId, rpe or feel. - With no descriptionMode, a call that would overwrite an existing description fails and writes nothing. - It reads the activity fresh, sends only the fields that differ in one PUT (never retried), then re-reads and echoes before and after values. - gearId is checked against the current gear l…
view-activity-chartActivity chartread-onlyOpen an interactive chart of one activity with selectable heart rate, power, pace, altitude, cadence, and grade overlays. Prefer this over a text summary when the user wants to see or explore how metrics change over the course of an activity. Takes the activity id.
view-activity-zonesHeart-rate zones chartread-onlyOpen an interactive time-in-zone chart for one activity: bars for the time spent in each heart rate zone, with percentages and an easy/moderate/hard split. Prefer this over the text-only get-activity-zones when the user wants to see how a workout's effort was distributed. Takes the activity id.
view-cadence-trendsCadence trends chartread-onlyOpen an interactive cadence dashboard across recent runs: trend timeline, cadence-versus-pace scatter, pace-zone breakdown, and per-run overlay comparison. Prefer this over text when the user wants to explore cadence patterns over time. Takes a number of days of history.
view-compare-activitiesActivity comparison chartread-onlyOpen an interactive side-by-side overlay of two activities: their pace, heart rate, power, cadence, or altitude streams aligned on a shared distance or time axis, with an aggregate delta summary. Prefer this over the text-only compare-activities when the user wants to see WHERE in the activities the difference happened. Takes both activity ids.
view-fitness-trendFitness trend chartread-onlyOpen an interactive fitness/fatigue/form chart (the performance-management chart): fitness (CTL) and fatigue (ATL) over the lookback window with form (TSB) on its own axis, deep-fatigue, freshness, and steep-ramp periods shaded, and a dashed continuation past today. Pass targetDate to chart a solved taper landing on targetTsb on that day, week by week; omit it for a rest projection. Pass newest to chart a past block instead; it has no projection or taper. Prefer this over the text-only get-fitness-trend when the user wants to see whether they are peaking or digging a hole.
view-route-mapRoute mapread-onlyOpen an interactive map of one activity's GPS track, fit to bounds with start and finish markers and a distance/elevation summary. Prefer this over a text summary when the user wants to see where an activity went. Takes the activity id. Optionally pin distance-anchored waypoints (fueling points, climb warnings, …) along the track via the waypoints array, useful when discussing a race plan or course guide.
view-training-loadTraining load chartread-onlyOpen an interactive training-load chart: weekly running volume bars with a rolling trend line, and volume-spike weeks (over 1.5 times the average of the 4 weeks before) highlighted with their reason on hover. Prefer this over text when the user wants to see how their training volume is trending. Takes a number of days of history, and newest to end the chart on a past date.
Signals
- Stars
- 0
- Forks
- 0
- Open issues
- 10
- Last commit
- Oct 18, 2026 (10 days ago)
- Last release
- Oct 10, 2026 (19 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- Registry name
io.github.ljcl/intervals-mcp- Version
- 2.7.0
- Auth
- API key
- Packages
- oci
ghcr.io/ljcl/intervals-mcp:2.7.0 - License
- MIT
- Repository
- github.com/ljcl/intervals-mcp
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
More from ljcl
Cite this page
Intervals MCP. Agent Mart. https://agentmart.dev/connectors/ljcl-intervals-mcp (last updated 2026-10-24)