Futureweb Intervals MCP – open-source MCP server for ChatGPT & Claude: coaching analytics, all custom fields & streams, sign in with Intervals.icu

Hi all,

I’d like to share Futureweb Intervals MCP, an open-source MCP server that lets AI assistants like ChatGPT and Claude work directly with your own Intervals.icu data:

GitHub - futureweb/intervals-mcp-server: Advanced Intervals.icu MCP server for ChatGPT & Claude: Garmin-enriched metrics, all custom fields & streams, recovery insights, endurance performance analysis, OAuth. Community-maintained continuation of mvilanova/intervals-mcp-server. · GitHub

It continues Marc Vilanova’s original intervals-mcp-server, which is no longer actively developed. The open community contributions are merged, the known bugs are fixed, and it has been rebuilt for coaching. The first public beta, 1.0.0b1, is out today.

What you can ask your AI coach

  • “Analyse yesterday’s workout against the plan.” Planned vs executed per step, also with Garmin auto-laps, extended rides and deleted events; time beyond the plan is reported separately.
  • “How is my training load and intensity distribution over the last 4 weeks?” Acute:chronic ratio, monotony and strain, polarization index, durability.
  • “How am I recovering?” HRV, resting HR, sleep and readiness against your personal baselines. Values that have not arrived yet for today (e.g. before your morning sync) are flagged as missing, not treated as normal.
  • “What happens to my form if I add a 5 h ride on Saturday and taper for the race on the 29th?” What-if load projection with form on race day and plan checks.
  • “How does my HR drift after 1,500 kJ?” Long-ride fatigue profile in kJ and kJ/kg, submax test trends, power meter comparison across rides (never an automatic correction factor).
  • “How was my fueling?” Carbs used vs ingested per hour, sweat loss, W′ balance and weather in the activity report, earlier rides on the same route.

Highlights

  • Every custom field and stream you defined in Intervals.icu, with names and units. Together with the Garmin Intervals Bridge that includes stamina, training effect, recovery time, VO₂max, running dynamics, sleep and HRV details.
  • Safe by default. Read-only unless you enable writes. Writes (workouts, notes) are validated first, support a dry run, refuse duplicates on the same day and read back what Intervals.icu actually stored. Deletions need an explicit confirmation of the previewed events.
  • Self-hosted. Your data only travels between your server or computer, Intervals.icu and your AI assistant.
  • Sign in with Intervals.icu for ChatGPT and Claude.ai: a built-in OAuth 2.1 server, so only your athlete can connect (or, optionally, a few friends with their own data).

Install

  • Claude Desktop: download the .mcpb bundle from the release page and open it, or use uvx [email protected] (PyPI).
  • Claude Code: claude mcp add intervals-icu -e API_KEY=... -e ATHLETE_ID=i... -- uvx [email protected]
  • Docker: futurewebat/futureweb-intervals-mcp on Docker Hub or ghcr.io/futureweb/intervals-mcp-server (amd64 and arm64).
  • ChatGPT / Claude.ai: run it on a server with HTTPS and connect it as a custom connector. The README explains the OAuth setup (sign in with an Intervals.icu OAuth app, a password or your API key).
  • It is also listed in the official MCP Registry as io.github.futureweb/intervals-mcp-server.

You need your Intervals.icu API key and athlete ID (Settings → Developer Settings).

It’s a beta, so feedback, ideas and bug reports are very welcome, here or on GitHub.

Not affiliated with Intervals.icu or Garmin.

3 Likes

Here’s what a morning check looks like in practice. I asked my ChatGPT coach, which is connected to the MCP, for a wellness check. Note how it flags the values Garmin hasn’t synced yet instead of guessing:

Morning Wellness Check – October 10, 2026

Today’s Verdict

:green_circle: Good recovery markers: HRV is near baseline, resting HR is lower, and sleep quality, readiness and Body Battery are above average.

:yellow_circle: Easy training day recommended: Yesterday’s threshold workout and accumulated training load warrant some caution despite the positive morning metrics.

Wellness vs. Personal Baseline

Metric Today 42-day baseline Deviation Note
HRV 38 ms 37.5 ms +0.5 Normal
Resting HR 49 bpm 51.0 bpm −2.0 Favorable
Sleep duration 7h 48m 7h 36m +12m Above average
Sleep score 85 75.2 +9.8 Good
Sleeping HR 55 bpm 56.7 bpm −1.7 Favorable
Respiration 14/min 14.6/min −0.6 Normal
SpO₂ 95% 95.0% ~0 Baseline
Training Readiness 77/100 55.1 +21.9 Above average
Body Battery max 87/100 74.5 +12.5 Good recharge

Training Context

Metric Current
CTL / ATL 63.7 / 64.1
Form (CTL − ATL) −0.4
Acute:Chronic ratio 1.06
Last 7 days’ load 560
Last 28 days’ load 2,112

Yesterday’s threshold ride contributed 125 Intervals.icu Load.

Today’s Recommendation

40–60 minutes easy recovery cycling (Z1, approximately 90–125 W), or rest if the legs feel heavy. No additional threshold or VO₂max work today.

Based on stable HRV, lower resting HR, good sleep and readiness, balanced CTL/ATL, and recent training stress.

Data Completeness

Latest wellness sync: 12:27 CEST. Today’s record remains preliminary.

Garmin Recovery Time, Body Battery Charged and several daily totals are not yet synced. Missing data are not interpreted as normal or zero.

Second example: an analysis of my latest session. The MCP compares the planned workout with what I actually did, step by step, and adds fueling and W′ balance when the data are there:

:person_biking: Threshold Ride – October 9, 2026

Canyon Ultimate CFR Di2 | 1:27:06 moving | 41.5 km | 333 m elevation | Training Load 125 | IF 0.93

Key Findings

  • Workout successfully executed: All 7 planned steps matched, including 3×10-minute threshold intervals. All three work blocks were within the ±5% target tolerance.

  • Excellent power consistency: 249 / 249 / 253 W, with no meaningful power fade. Slightly above the exact prescribed targets.

  • Progressive cardiovascular response: Average HR increased from 153 to 160 bpm across the work intervals.

  • Additional training: 22:07 beyond the planned workout, including a 50-second effort averaging 432 W. This extra work was correctly excluded from workout compliance.

  • Garmin Training Effect: Aerobic 3.9, anaerobic 1.6 — classified as Threshold.

Planned vs. Executed

Interval Target Actual Time in range* HR drift
10 min #1 238–242 W 249 W 54% +7.4%
10 min #2 240–244 W 249 W 47% +3.5%
10 min #3 242–246 W 253 W 45% +4.9%
Extra effort Not planned 432 W / 50 s — —

Time within the target range, allowing ±5%. HR drift represents the reported Power decoupling within each work interval.

Fueling & Fatigue

Metric Recorded
Carbohydrates ingested 50 g / 34 g/h
Estimated carbohydrate use 258 g / 178 g/h
Estimated sweat loss 827 ml / 570 ml/h
W′ capacity 18.0 kJ
Minimum modeled W′ balance 2.2 kJ (12%)
Garmin Stamina 100% → 69%
Minimum Stamina 38%

Fluid and sodium intake were not logged. Carbohydrate use and sweat loss are estimates, not direct measurements.

Coach’s Note

A strong, controlled threshold session. Power remained remarkably consistent despite increasing cardiovascular demand.

Next time, aim slightly closer to the prescribed wattage to preserve the intended training stimulus. For longer sessions, recording fluid and electrolyte intake would improve fueling analysis.

The low modeled W′ balance deserves monitoring, but it is model-dependent and should not be interpreted as a direct measurement of remaining energy.

And planning: my form was positive, so I asked whether a VO2max session fits this week. It checks load and recovery, builds the workout, validates it and shows a dry run of what it would put into my calendar. Nothing is written until I confirm:

VO₂max Readiness Check — October 10, 2026

Verdict:

Provisionally ready

for a VO₂max session on Monday, October 12. I would keep Sunday easy or rest, then recheck recovery before the harder workout.

Why now?

Metric Current Context
HRV 38 ms Baseline 37.5 ms
Resting HR 49 bpm Baseline 51 bpm
Sleep 7h 48m Sleep score 85
Garmin Readiness 77/100 Body Battery max 87
CTL / ATL 63.7 / 64.1 Form −0.4
Acute:Chronic ratio 1.06 7-day load 560

Recovery markers are reassuring, but Friday’s threshold ride added 125 training load, following other substantial sessions earlier in the week. Monday provides more recovery time than Sunday.

The calendar and training plan currently contain no workouts scheduled for October 11–12. Some Garmin recovery fields are not yet synced, so this remains a conditional recommendation.

Proposed workout — Monday, October 12

Current Ride FTP: 234 W; VO₂max Zone 5: 246–280 W.

Block Duration Power target
Progressive warm-up 17 min 50–75% FTP (117–176 W)
VO₂max × 5 3 min each 115% FTP (~269 W)
Recovery × 4, between efforts 3 min each 50% FTP (~117 W)
Cool-down 10 min 55→40% FTP (129→94 W)
Total 54 min 15 min high-intensity work

Aim for 90–105 rpm during the efforts, keeping the first repeat controlled rather than starting with a sprint.

Validation passed: validate_workout returned ok: true, with zero errors, zero warnings and no calendar conflict. The structured workout contains 11 expanded steps and is Garmin-compatible according to the MCP validator.

Calendar Dry-Run Preview

Validated — nothing written

I called add_or_update_event(dry_run=true) successfully.

Field Preview
Date Monday, October 12, 2026
Name VO2max 5x3 min - Ultimate
Sport Ride
Category WORKOUT
Duration 54 minutes
Location Outdoor
Targets %FTP, with cadence cues
Duplicate check No conflict

The preview would create a new calendar event using POST /athlete/{athlete_id}/events. Its default start field is 2026-10-12T00:00:00, representing a date-only calendar placement, not a requested midnight training time.

The server explicitly confirmed:

Dry run: nothing was written.

Projected Training Load — October 13

Using get_load_projection with a what-if workout on October 12:

  • Estimated workout IF: 0.86
  • Estimated workout load: 67
  • All other days assumed to have no training
Metric Without workout With VO₂max Difference
CTL 59.4 60.9 +1.5
ATL 41.8 49.5 +7.7
Form +17.6 +11.4 −6.2

Projected end-of-day values for Tuesday, October 13. The workout load is an estimate based on 54 minutes at IF 0.86; these are model outputs, not physiological forecasts.

This is a manageable modeled addition, provided Sunday remains easy and Monday’s recovery markers are still acceptable.

Would you like me to add this validated 54-minute VO₂max workout to your Intervals.icu calendar for Monday, October 12? I won’t write anything until you confirm.

→

→

1 Like

A quick update since the first post:

1.0.0b1 is released. It’s on PyPI (uvx [email protected]), on Docker Hub (futurewebat/futureweb-intervals-mcp) and GHCR, as a Claude Desktop bundle (.mcpb) on the release page, and in the official MCP Registry.

New: route-aware outdoor workouts with lap-button steps

Outdoors, a timed 10-minute interval often starts on a descent or at a junction. The MCP can now write steps that end on the lap button (Intervals.icu’s native “Press lap”). You ride easy until the road suits the next effort, e.g. the foot of a climb, press lap, and the work step runs timed as usual. This is close to what was discussed in Routebased workouts – any ideas?.

You can simply ask your AI coach something like “3×10 min at 240–250 W, easy until I press lap before each interval”. It then:

  • writes the flexible phases as lap-press steps, with a planning estimate for the planned time and load;
  • validates the workout and can show a dry run first;
  • reads back what Intervals.icu stored, including a warning if a lap-press step ended up as a timed step.

What I have checked so far:

  • Intervals.icu stores these steps as until_lap_press, and its Garmin FIT export writes them as OPEN steps without a time limit.
  • On my Edge 1040 they show up as “Bis Lap-Taste” (“until lap button”), with the power range and cadence target. The timed steps and the repeat block look right too (screenshots below).

Tip for outdoor use: put course points at the start of each climb on your Garmin course and press lap there. Auto Pause also pauses timed steps at traffic lights; lap steps don’t care.

Also new since the first post:

  • Safer writes: dry run, a refusal when the same workout is already planned that day, and a read-back after every write.
  • Today’s wellness record is flagged as incomplete when the morning sync hasn’t brought everything yet. Missing values are no longer treated as normal.
  • A much smaller tool catalogue for the AI client, plus an optional multi-user mode for sharing one server with friends, each with their own data.

If you use other devices (Wahoo, Hammerhead, Suunto, a Forerunner/Fenix), I’d be curious how lap-press steps from Intervals.icu behave there.

Where to find it

Where What it is How to use it
GitHub Source, docs, issues, releases Read the README; report bugs or ideas as issues
PyPI The Python package uvx [email protected]. Runs locally, e.g. for Claude Desktop or Claude Code
Docker Hub / GHCR Ready-made image (amd64, arm64) docker run -i -e API_KEY=… -e ATHLETE_ID=i… futurewebat/futureweb-intervals-mcp:1.0.0b2, or run it on your own server with HTTPS for ChatGPT / Claude.ai
Claude Desktop bundle One-click install file (.mcpb) Download, double-click, enter API key and athlete ID
Official MCP Registry The standard index MCP clients use to look up servers Some MCP clients find it there by name (io.github.futureweb/intervals-mcp-server)
Glama / mcpservers.org MCP directories with a security and quality check (Glama: license A, quality A) Browse the tool list and score; install from GitHub/PyPI/Docker as above

Your API key and athlete ID stay with you: run the server yourself rather than entering your Intervals.icu API key on a third-party host. All you need is your key and athlete ID from Intervals.icu → Settings → Developer Settings.