intervals-icu-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@intervals-icu-mcpWhat's my CCI trend from my last few rides?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
intervals-icu-mcp
MCP server that connects Claude to your training data on intervals.icu — advanced physiological analysis with AI
What it is and who it's for
intervals-icu-mcp exposes your intervals.icu data — activities, wellness, calendar, second-by-second streams — as tools callable by Claude Desktop, plus a layer of proprietary physiological analysis (CCI, HRV correction, field aerodynamics) built on top. It runs locally: Claude Desktop connects to the server via MCP (stdio), and the server talks to the intervals.icu API using your API key.
It's not just another dashboard. It enables analysis that doesn't exist today in any training platform: separating sympathetic fatigue from real aerobic improvement by cross-referencing HRV Z-Score with power and heart rate, detecting when a lower "cardiac cost" is actually cardiac suppression rather than efficiency, or estimating your CdA in the air from position angles without setting foot in a wind tunnel. All conversational, in natural language, with persistent memory across sessions.
Related MCP server: claude-garmin
Quick start
Clone the repo
git clone https://github.com/andiarenaleandro-ux/intervals-icu-mcp.git cd intervals-icu-mcpInstall everything with one command
python install.pyCreates the virtual environment, installs dependencies, and copies the example config files (
.env,SYSTEM_PROMPT.md,athlete_profile.json).Edit
.envwith your intervals.icu credentials:INTERVALS_ATHLETE_ID— visible in the URL:https://intervals.icu/athlete/i12345→ your ID isi12345INTERVALS_API_KEY— generate it in intervals.icu → Settings → Developer Settings → API Key
Connect Claude Desktop automatically
python setup_claude.pyDetects your operating system, finds
claude_desktop_config.json, and adds the server entry without touching the rest of your configuration (other MCPs stay intact). Shows you the JSON before writing and asks for confirmation.Restart Claude Desktop. The tools icon should appear with the
intervals-icutools available.
Main features
Full CRUD for intervals.icu — activities, wellness, calendar, sport settings.
Second-by-second streams — power, heart rate, cadence, speed, elevation, for fine-grained analysis.
Local
.fitfile analysis — no need for the activity to be uploaded to intervals.icu.CCI (Cardiac Cost Index) — proprietary cardiac efficiency metric (
HR / %FTP) that separates real work from recovery laps.HRV Z-Score correction — distinguishes sympathetic fatigue from real adaptation when CCI drops.
Freshness Ratio matrix (HRV × TSB) — 4 clinical quadrants (fresh, optimal load, acute overload, non-functional overreaching) instead of looking at TSB in isolation.
Cardiac suppression detection — identifies when a lower heart rate is autonomic nervous system exhaustion, not improved efficiency.
Aerodynamics — estimated CdA from position and real field CdA (Martin et al. 1998 method).
Persistent biomechanical profile — fitting history, position angles, injuries, training context.
Local SQLite memory — weekly and per-session snapshots for longitudinal trends without re-spending tokens on refetches.
Available tools (48)
Activities (7)
Tool | Description |
| Activities from the last N days with all intervals.icu KPIs |
| Full detail of an activity by ID, including intervals and streams |
| Second-by-second streams (power, HR, cadence, speed, elevation) |
| Laps/intervals of an activity |
| Filters activities by sport (Ride, Run, Swim, ...) over the last N days |
| Creates a manual activity in intervals.icu |
| Updates name, description, RPE, or feel of an existing activity |
Fitness & zones (4)
Tool | Description |
| CTL/ATL/TSB history for the last N days |
| Current CTL/ATL/TSB snapshot with interpretation |
| Full zone and FTP configuration for a sport |
| Updates FTP or LTHR for a sport in intervals.icu |
Wellness (3)
Tool | Description |
| HRV, resting HR, sleep, weight, subjective fatigue for the last N days |
| Today's wellness record |
| Records or updates wellness for a specific date |
Athlete profile (3)
Tool | Description |
| Full profile with FTP, LTHR, zones, and MMP model |
| Type A/B/C races and events on the calendar |
| Power zones calculated from cycling FTP |
Calendar (7)
Tool | Description |
| Planned workouts for the next N days |
| All of today's events: workouts, notes, and targets |
| Calendar events over a date range |
| Creates an event/workout on the calendar |
| Creates multiple workouts at once |
| Modifies an existing calendar event |
| Deletes a calendar event |
.fit files (3)
Tool | Description |
| Lists the |
| Detailed analysis: power, 1/5/20/60min peaks, HR, cadence, zones |
| Explores the message types and fields available in a |
Extended profile (5)
Tool | Description |
| Biomechanical profile: fitting, angles, history, injuries, context |
| Updates the bike fitting data in the local profile |
| Records a fitting change with before/after metrics |
| Records an injury or issue in the history |
| Updates the athlete's general profile notes |
Aerodynamics (4)
Tool | Description |
| Estimates CdA from torso, hip, and elbow angles |
| Real field CdA — Martin et al. (1998) method |
| Compares two positions in CdA, speed, and projected race time |
| Expected speed given a power level and CdA |
Advanced analytics (3)
Tool | Description |
| CCI per interval, EF by zone, HR drift, HRV Z-Score correction |
| Compares N equivalent sessions to detect adaptation trends |
| EF-by-zone curve over time for a session type |
Memory & trends (9)
Tool | Description |
| Saves or updates the weekly KPI snapshot in SQLite |
| KPI trends for the last N weeks from the local DB |
| Active or resolved KPI alerts |
| Records a KPI alert in the DB |
| Saves a persistent observation or insight from the agent |
| Retrieves agent notes from the last N days |
| Fetches the snapshot for a specific week |
| Saves the result of |
| CCI/EF history from the local DB, with calculated trend |
Project structure
intervals-icu-mcp/
├── install.py ← Installer: venv + dependencies + config
├── setup_claude.py ← Configures Claude Desktop automatically
├── requirements.txt
├── .env.example ← Credentials template
├── SYSTEM_PROMPT.example.md ← Agent role/persona template
├── athlete_profile.example.json ← Biomechanical profile template
├── fit_files/ ← Your local .fit files
├── db/ ← SQLite (created automatically)
└── server/
├── main.py ← Entry point: registers all tools
├── config.py ← Configuration (reads .env)
└── tools/
├── activities.py
├── fitness.py
├── wellness.py
├── athlete.py
├── calendar.py
├── fit_parser.py
├── profile.py
├── aerodynamics.py
├── analytics.py
└── memory.pyCustomization
SYSTEM_PROMPT.md
This file defines how Claude behaves as your sports analyst. Copy the example and replace the placeholders with your data.
cp SYSTEM_PROMPT.example.md SYSTEM_PROMPT.md # install.py does this automaticallyPlaceholder | What it is | Where to find it |
| Your name | — |
| Your city/country | — |
| Your age | — |
| Sports you practice | e.g. "Triathlon and duathlon" |
| Your target race/event | e.g. "Ironman 70.3 — September 2026" |
| Functional Threshold Power (watts) | intervals.icu → Settings → Sport Settings → Ride → FTP |
| Body weight in kg | intervals.icu → Settings → Profile |
| Lactate threshold HR (cycling) | intervals.icu → Sport Settings → Ride → LTHR |
| Lactate threshold HR (running) | intervals.icu → Sport Settings → Run → LTHR |
| Maximum heart rate | intervals.icu → Sport Settings → Ride → Max HR |
| Resting heart rate | Your watch/wellness data |
| Your bike model | e.g. "Cervélo P5" |
| Your power meter | e.g. "Stages L, Garmin Rally" |
If you don't know your FTP or LTHR, intervals.icu estimates them automatically from your training data. Check Sport Settings after a few weeks of recorded activities.
The interpretation rules (CCI, HRV correction, drift thresholds) are universal and don't need modification — they work for any athlete.
athlete_profile.json
This file stores data that intervals.icu doesn't have: bike fitting, position angles, injury history, and training context. It's optional — the MCP works without it, but the aerodynamics and biomechanics tools need it for full analysis.
cp athlete_profile.example.json athlete_profile.json # install.py does this automaticallyThe most important fields to fill in:
equipment.bike.model— your bikeequipment.bike.power_meter— your power meterbike_fit.crank_length_mm.current— your current crank length in mmbike_fit.position_current— your position angles (if you have them from a fit)physiology.ftp_w— same as{FTP}above
Position angles (torso, hip, knee, elbow) are measured during a professional bike fit. If you haven't had one, leave them
null— the aerodynamics tools will use literature reference values instead.
You can update this file anytime through Claude by saying "update my crank length to 165mm" — the agent writes to the file directly.
Session naming convention
The analytics engine groups sessions by name to compare equivalent workouts week over week. Name your activities in intervals.icu using these standard prefixes for automatic detection:
Prefix | Session type | Example |
| Cycling threshold intervals | "BIKE_FTP 4x8min" |
| Cycling VO2max intervals | "BIKE_VO2 5x3min" |
| Endurance/sweet spot ride | "BIKE_STAMINA 2h30" |
| Running threshold intervals | "RUN_FTP 3x10min" |
| Running VO2max intervals | "RUN_VO2 6x3min" |
| Long endurance run | "RUN_LONG 90min" |
| Transition run (after bike) | "RUN_T2 15min" |
| Easy swim | "SWIM_RECOVERY 45min" |
| Threshold swim | "SWIM_FTP CSS sets" |
| VO2max swim | "SWIM_VO2 8x100" |
This is optional. You can also compare sessions manually by providing activity IDs — the naming convention just enables automatic grouping.
The power threshold that separates a real work lap from warmup/recovery for each of these prefixes is
SESSION_POWER_THRESHOLDinserver/tools/analytics.py. Adjust it if the way you structure sessions differs from the standard convention.
Example queries
"Show me my activities from the last week"
"Analyze my last FTP session — I want the CCI and the drift"
"Compare my last 4 BIKE_FTP sessions and tell me if I'm improving"
"Estimate my CdA with my current position"
"How's my CTL looking ahead of my next race?"Technology
Stack: Python 3.10+, FastMCP,
httpx,fitparse, SQLiteProtocol: MCP (Model Context Protocol)
Transport: stdio (local) — each user runs their own server, no shared backend
Limitations
Requires Claude Desktop (or any MCP client compatible with stdio).
One user = one athlete (single-tenant); not designed for multiple athletes on the same instance.
No automated tests or CI.
No remote deployment — runs locally, no hosted version.
Contributing
Want to add a tool, fix a bug, or improve the analysis? Check out CONTRIBUTING.md for the workflow and project conventions.
License
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityFmaintenanceA Model Context Protocol (MCP) server for Intervals.icu integration. Access your training data, wellness metrics, and performance analysis through Claude and other LLMs.4835MIT
- Alicense-qualityBmaintenanceMCP server that connects Garmin Connect data to Claude, enabling training analysis, recovery checks, and personalized plans based on real metrics like HRV, training load, and activities.12MIT
- Flicense-qualityDmaintenanceProvides MCP servers for Claude to access fitness data from Strava and intervals.icu, enabling natural language queries for activity analysis, advanced training metrics, and wellness tracking.1
- Flicense-qualityBmaintenanceMCP server that gives Claude access to real-time Garmin Connect and Strava data for analyzing training and suggesting sessions.
Related MCP Connectors
Garmin data in Claude: 135 tools — activities, sleep, HRV, training, workouts. Free, open source.
Garmin data in Claude & ChatGPT via the Garmin Health API. OAuth sign-in, no password sharing.
WHOOP recovery, strain, sleep and workouts in Claude via official WHOOP OAuth. Free, open source.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/andiarenaleandro-ux/intervals-icu-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server