Intervals.icu MCP
Provides extra context and data by integrating with Strava MCP to combine Strava and Intervals.icu data for richer cycling analysis.
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 MCPShow my most recent workout"
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
Minimal local stdio MCP server for Intervals.icu, generated from the official OpenAPI spec. Exposes every API operation as an MCP tool. Works with Claude Desktop, mcphost (Ollama / OpenRouter), Cline, and any other MCP client that speaks stdio; this repo is fully self-contained.
Files
|____spec/intervals-openapi-spec.json # the Intervals.ICU API spec
|____README.md # that's me!
|____config.js.example # example config.js file
|____package.json # npm package dependency file
|____mcp-stdio.mjs # the MCP server
|____mcp-stdio.mjs # agent definitionRelated MCP server: intervals-icu-mcp
Requirements
Node.js ≥ 18
An Intervals.icu API key — get it from https://intervals.icu/settings (bottom of the page, "Developer settings")
Install
Clone the repo and store it anywhere on your machine. Copy config.js.example to config.js and set INTERVALS_TOKEN to your Intervals.icu API key.
cp config.js.example config.js
npm installTest it
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | node mcp-stdio.mjs | python3 -mjson.tool | grep "name\"" | headYou should see on stderr:
[intervals-mcp] ready · 147 tools loaded
"name": "updateLastSeenMessageId",
"name": "updateMessage",
"name": "deleteMessage",
"name": "showWorkout",
"name": "updateWorkout",
"name": "deleteWorkout",
"name": "getRecord",
"name": "updateWellness",
"name": "updateWellnessBulk",
"name": "uploadWellness",Press Ctrl-C to exit. The server is now ready to be driven by an MCP client.
Shrinking the tool surface (for small/local models)
The full spec generates 147 tools. Smaller models (qwen2.5:7b, llama3.1:8b, ...) struggle to pick the right one out of so many. Edit config.js to filter:
export const METHODS = ["GET"]; // read-only server
export const TAGS = ["Activity", "Wellness"]; // only these OpenAPI tags
export const INCLUDE = ["getActivities", "getWellness"]; // exact allow-list
export const EXCLUDE = ["someNoisyTool"];
export const DESCRIPTION_STYLE = "short"; // terse one-liners (vs "full")Filters apply in order: METHODS → TAGS → INCLUDE → EXCLUDE. Restart the server after editing. Claude can handle all 147 tools comfortably; for Ollama/mcphost/Tome with small models, keep it under ~20 tools.
Claude Desktop
Edit Claude Desktop config file (create it if missing):
MacOS -
~/Library/Application Support/Claude/claude_desktop_config.jsonLinux -
~/.config/Claude/claude_desktop_config.jsonWindows -
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"intervals-icu": {
"command": "node",
"args": ["/ABSOLUTE/PATH/TO/local/mcp-stdio.mjs"],
"env": { "INTERVALS_TOKEN": "your_api_key_here" }
}
}
}The env block is optional if you already set INTERVALS_TOKEN in config.js. Restart Claude Desktop. The Intervals.icu tools are now available.
Agent - The AI Sports Scientist Layer - aka 'coach'
The 'coach'. Load the intervals-coach-agent.yaml defintion into your agents/custom modes definition. Once connected to this MCP server, your LLM gains real-time, programmatic visibility into your structured training data. It is pre-conditioned to act as an advanced exercise physiologist and endurance data companion—translating granular on-bike telemetry into accessible, motivational, and actionable insights.
Automated Ride & Stream Analysis
Every time the agent pulls a ride stream, it evaluates key metabolic and physiological markers:
Biomechanical Metrics: Computes or extracts NP (Normalized Power), IF (Intensity Factor), TSS (Training Stress Score), and VI (Variability Index).
Aerobic Efficiency: Monitors Pw:Hr (Aerobic Decoupling) to analyze cardiac drift and gauge metabolic penalty or heat stress during threshold efforts.
Advanced Diagnostics: Identifies subtle performance trend signals, such as $VO_2\text{max}$ progressions, multi-day fatigue accumulation, or cadence decay over long durations.
Training Load Modeling (CTL / ATL / TSB)
The agent references systemic training loads using industry-standard formulas to help optimize your training progression without risking chronic burnout:
Form Management: Automatically tracks TSB (Training Stress Balance) to keep your training stimulus safely inside the Optimal Training Zone (TSB between -10 and -30) and flags risk factors when entering the Danger Zone (TSB below -30).
Progressive Overload Planning: Uses automated calculations to model micro-periodization blocks, suggesting safe week-over-week CTL Ramp Rates (+3 to +5 points max) and customized weekly TSS targets for build vs. recovery cycles.
Personalized Context & Asset Profiles
The agent maps your exact physiological baselines (FTP, CP, W', LTHR, HR Zones, and weight) and matches them contextually against your equipment profiles (e.g., Road vs. Gravel bike weights) and workout schemas. It gracefully handles structured step data, ensuring initial high-intensity intervals are never misclassified as warm-ups.
You should edit
intervals-coach-agent.yaml:customInstructionsproperty with your own values. Some data might be available at intervals.icu already and the agent is capable of fetching it, but won't be any harm setting them up. Once configured, agent will be available thru/intervals-coachslug.
Note: This tool is built to enhance data literacy, illuminate physiological correlations, and simplify deep data exploration—it is designed to act as an analytical companion layer, not a replacement for a human cycling coach.
Extra Context with Strava MCP
Now that Strava has released their own MCP, you can bring additional context and data into this; altogether Strava and Intevals.icu data will provide a richier vision of your data.
Ollama / OpenRouter (via mcphost)
mcphost is a small CLI that bridges any MCP server to Ollama or OpenRouter models.
Model suggestion for Ollama:
qwen3 or qwen2.5-coder:32b (if your machine can run it)
llama3.1:8b — surprisingly solid at tool calls
mistral-small3.1 / mistral-nemo — trained for function calling
Model suggestion for OpenRouter:
anthropic/claude-3.5-sonnet, openai/gpt-4o-mini, google/gemini-2.0-flash
# install
go install github.com/mark3labs/mcphost@latest
# config: ~/.config/mcphost.intervals.json
{
"mcpServers": {
"intervals-icu": {
"command": "node",
"args": ["/ABSOLUTE/PATH/TO/local/mcp-stdio.mjs"],
"env": { "INTERVALS_TOKEN": "your_api_key_here" }
}
}
}
# run with Ollama
mcphost -m ollama:qwen2.5 --config ~/.config/mcphost.intervals.json
# or OpenRouter
mcphost -m openrouter:anthropic/claude-3.5-sonnetIf you'd rather a Desktop app instead of CLI, you can use Tome, which offers pretty straightforward configuration for adding MCP servers.
Authentication
Intervals.icu uses HTTP Basic auth. The server sends:
Authorization: Basic base64("API_KEY:${INTERVALS_TOKEN}")This matches the official curl -u "API_KEY:TOKEN" style. If your token already contains a colon (e.g. myuser:mytoken), it is used verbatim.
Troubleshooting
INTERVALS_TOKEN is not set— set it inconfig.jsor export it as an environment variable.HTTP 401— token is wrong or expired. Regenerate at https://intervals.icu/settings.Tool not found in Claude — restart Claude Desktop fully after editing the config file.
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.
Latest Blog Posts
- 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/fm4tt0s/intervals.icu-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server