Remote MCP server for intervals.icu run data and analysis
Connect Runs on your machine
claude mcp add intervals-mcp -e INTERVALS_API_KEY=<INTERVALS_API_KEY> -e INTERVALS_ATHLETE_ID=<INTERVALS_ATHLETE_ID> -e TZ=<TZ> -e ORS_API_KEY=<ORS_API_KEY> -e HOME_START=<HOME_START> -e OSM_EXTRACT_URL=<OSM_EXTRACT_URL> -e MCP_AUTH_TOKEN=<MCP_AUTH_TOKEN> -e PORT=<PORT> -e DATA_DIR=<DATA_DIR> -e ROUTE_RETENTION_DAYS=<ROUTE_RETENTION_DAYS> -e PUBLIC_URL=<PUBLIC_URL> -- docker run -i --rm ghcr.io/ljcl/intervals-mcp:2.19.0
{
"mcpServers": {
"intervals-mcp": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/ljcl/intervals-mcp:2.19.0"
],
"env": {
"INTERVALS_API_KEY": "<INTERVALS_API_KEY>",
"INTERVALS_ATHLETE_ID": "<INTERVALS_ATHLETE_ID>",
"TZ": "<TZ>",
"ORS_API_KEY": "<ORS_API_KEY>",
"HOME_START": "<HOME_START>",
"OSM_EXTRACT_URL": "<OSM_EXTRACT_URL>",
"MCP_AUTH_TOKEN": "<MCP_AUTH_TOKEN>",
"PORT": "<PORT>",
"DATA_DIR": "<DATA_DIR>",
"ROUTE_RETENTION_DAYS": "<ROUTE_RETENTION_DAYS>",
"PUBLIC_URL": "<PUBLIC_URL>"
}
}
}
}
{
"mcpServers": {
"intervals-mcp": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/ljcl/intervals-mcp:2.19.0"
],
"env": {
"INTERVALS_API_KEY": "<INTERVALS_API_KEY>",
"INTERVALS_ATHLETE_ID": "<INTERVALS_ATHLETE_ID>",
"TZ": "<TZ>",
"ORS_API_KEY": "<ORS_API_KEY>",
"HOME_START": "<HOME_START>",
"OSM_EXTRACT_URL": "<OSM_EXTRACT_URL>",
"MCP_AUTH_TOKEN": "<MCP_AUTH_TOKEN>",
"PORT": "<PORT>",
"DATA_DIR": "<DATA_DIR>",
"ROUTE_RETENTION_DAYS": "<ROUTE_RETENTION_DAYS>",
"PUBLIC_URL": "<PUBLIC_URL>"
}
}
}
}
{
"servers": {
"intervals-mcp": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/ljcl/intervals-mcp:2.19.0"
],
"env": {
"INTERVALS_API_KEY": "<INTERVALS_API_KEY>",
"INTERVALS_ATHLETE_ID": "<INTERVALS_ATHLETE_ID>",
"TZ": "<TZ>",
"ORS_API_KEY": "<ORS_API_KEY>",
"HOME_START": "<HOME_START>",
"OSM_EXTRACT_URL": "<OSM_EXTRACT_URL>",
"MCP_AUTH_TOKEN": "<MCP_AUTH_TOKEN>",
"PORT": "<PORT>",
"DATA_DIR": "<DATA_DIR>",
"ROUTE_RETENTION_DAYS": "<ROUTE_RETENTION_DAYS>",
"PUBLIC_URL": "<PUBLIC_URL>"
}
}
}
}
Replace the values in angle brackets with your own. Keys stay on your machine; we never see them.
Tools
This server runs locally, so its tools are listed by your MCP client once it starts.
Environment variables
| Name | Description |
|---|---|
INTERVALS_API_KEYRequired, secret | intervals.icu personal API key (Settings, Developer Settings) |
INTERVALS_ATHLETE_IDOptional | Athlete id: 0 (default, the API key's own athlete) or e.g. i12345 |
TZOptional | IANA time zone for local dates, e.g. Australia/Sydney; unset or UTC follows the athlete's intervals.icu time zone (Etc/UTC pins UTC) |
ORS_API_KEYOptional, secret | OpenRouteService API key (openrouteservice.org) for generated route suggestions; unset offers past runs only |
HOME_STARTOptional, secret | Usual run start as lat,lng (e.g. 37.79,-122.39); unset infers it from recent GPS runs |
OSM_EXTRACT_URLOptional | URL of an .osm.pbf (e.g. a BBBike city or Geofabrik region) for the local OpenStreetMap index that counts road crossings in route suggestions; needs HOME_START |
MCP_AUTH_TOKENOptional, secret | Shared secret (32+ characters) gating /mcp and detailed /health (recommended when internet-facing) |
PORTOptional | Server port, 1-65535 (default 3000) |
DATA_DIROptional | Directory for stored routes (stitch-route, amend-route); the image uses /data, a volume in docker-compose.yml. Default ./data |
ROUTE_RETENTION_DAYSOptional | Days a stored route not read or changed is kept, 1-3650 (default 30) |
PUBLIC_URLOptional | Public URL, used only to warn when /mcp is exposed without MCP_AUTH_TOKEN |
Details
| Package | ghcr.io/ljcl/intervals-mcp:2.19.0 (OCI, streamable-http) |
| First published | 11 Nov 2026 |
| Last updated | 11 Nov 2026 |
| Registry name | io.github.ljcl/intervals-mcp |
More other servers See all
Listing data from the official MCP registry. Status and tools from NestDaddy's daily check. Browse all MCP servers.
