intervals-mcp
Local MCP server for analyzing Intervals.icu accounts, creating AI-assisted training plans, and applying managed drafts to the calendar after explicit confirmation.
README
Intervals MCP
Local Python client and MCP server for analyzing an Intervals.icu account, building AI-assisted training plans, and applying only managed drafts to the calendar after explicit confirmation.
Intervals.icu is the operational source of truth. When an account is connected to Garmin Connect, this MCP can also read the Garmin-derived activities and wellness data exposed by Intervals.icu. It does not call the Garmin API directly.
Quick start
Install the project and create your local configuration:
uv sync --dev
cp .env.example .env
cp PERSONAL.example.md PERSONAL.md
Set INTERVALS_API_KEY in .env, then register the local MCP server with Codex:
codex mcp add intervals_icu -- \
uv run --directory /absolute/path/to/intervals-mcp intervals-mcp
Restart Codex if it was already open, then use /mcp to confirm that intervals_icu is connected. You can now ask Codex things such as:
Read my private training context and list my managed Intervals.icu draft plans.
Read my recent training context and summarize the last two weeks.
Create a draft plan for next week, but show me the preview before writing anything.
The server is local and communicates over stdio. It does not send data to a separate service. Read operations can run immediately; every mutation first returns a preview and requires a second call with confirmed=true after explicit approval. Scheduling can make workouts available for Garmin synchronization, but Garmin delivery must still be verified separately.
For Claude Code, use the equivalent command in Connect to Claude Code. For detailed setup, safety rules, and development commands, continue below.
Codex or Claude Code
│
▼ MCP (stdio)
intervals-mcp ──────── Intervals.icu API
│
▼
Library: [IA] ...
│
athlete review
│
apply plan in Intervals
│
▼
Calendar → Garmin
Why a skill plus MCP
- The skill teaches the LLM the training workflow, workout syntax, and safety guardrails.
- The MCP keeps API access outside the conversation context and exposes typed operations.
PERSONAL.example.mdis the tracked template;PERSONAL.mdstores the active athlete's private context and is ignored by Git.- The Python client verifies that writes belong to the managed namespace.
- Intervals.icu remains the dashboard, calendar, and analysis system.
The MCP provides a deterministic safety boundary around the API: it avoids exposing credentials in prompts and does not provide unrestricted calendar CRUD.
Current capabilities
The server exposes tools for:
- Reading private athlete context with
get_personal_contextandset_personal_fact. - Reading filtered body and health profile metrics with
get_athlete_profile. - Reading activities, wellness, and calendar data with
get_training_contextfor ranges up to 180 days. - Reading power, pace, and heart-rate curves with
get_performance_curves. - Listing and reading managed plans with
list_draft_plansandget_draft_plan. - Creating, cloning, renaming, and editing private managed library plans.
- Adding and updating structured workouts inside managed plans.
- Applying a managed plan to the calendar from an exact future date with
schedule_draft_plan. - Removing only calendar copies from a managed application with
unschedule_draft_plan. - Serving
intervals://safety-policy,intervals://personal-context, andintervals://draft-plansresources. - Serving the
draft_training_weekMCP prompt.
Generic event create, edit, and delete operations are not exposed. Every mutation first returns a preview with confirmed=false; it can only proceed with confirmed=true after explicit approval.
Local personal memory
Copy PERSONAL.example.md to PERSONAL.md and fill it with the active athlete's private memory. The local file is ignored by Git, and the skill requires reading it before analyzing or changing a plan. Durable information can be stored through set_personal_fact; reusing the same key replaces the previous value.
Store only goals, events, recurring availability, preferences, performance markers, equipment, integrations, and training constraints. Never store examples, guesses, API keys, passwords, tokens, payment data, or sensitive health information unless explicitly requested.
Requirements
- Python 3.13 or newer.
uv.- An Intervals.icu account and personal API key.
- Codex or Claude Code to consume the MCP.
Setup
uv sync --dev
cp .env.example .env
Then set INTERVALS_API_KEY in the local .env file. Never commit .env or paste the key into a conversation. Personal Intervals.icu authentication uses HTTP Basic with the literal username API_KEY; the client configures this automatically.
To check read access:
uv run intervals-mcp-cli doctor
The command only lists library containers and does not write anything.
Run and inspect the MCP
uv run intervals-mcp
The process waits for JSON-RPC messages on stdin; this is expected. For visual inspection, use:
uv run mcp dev src/intervals_mcp/mcp_server.py
npx -y @modelcontextprotocol/inspector uv run intervals-mcp
Connect to Codex
codex mcp add intervals_icu -- \
uv run --directory /absolute/path/to/intervals-mcp intervals-mcp
codex mcp list
Use /mcp inside Codex to inspect the server and its tools. The equivalent configuration is:
[mcp_servers.intervals_icu]
command = "uv"
args = ["run", "intervals-mcp"]
cwd = "/absolute/path/to/intervals-mcp"
startup_timeout_sec = 20
tool_timeout_sec = 90
default_tools_approval_mode = "writes"
The writes setting makes Codex request approval for mutating tools. The server also requires its own confirmed=true.
Enable the skill in Codex
mkdir -p .agents/skills
ln -s ../../skills/manage-intervals-icu .agents/skills/manage-intervals-icu
Connect to Claude Code
claude mcp add --transport stdio --scope local intervals_icu -- \
uv run --directory /absolute/path/to/intervals-mcp intervals-mcp
claude mcp list
For a project-shared command, use --scope project, which creates .mcp.json. Do not put the API key in that file; every user must keep a local .env.
Claude Code discovers project skills under .claude/skills:
mkdir -p .claude/skills
ln -s ../../skills/manage-intervals-icu .claude/skills/manage-intervals-icu
Recommended first run
- Run
doctor. - Connect the MCP to Codex or Claude Code.
- Ask it to use the Intervals.icu skill and list managed drafts.
- Request recent training context and verify that no secrets are returned.
- Create an empty plan with
confirmed=falseand inspect the preview. - Approve the second call with
confirmed=true. - Open Intervals.icu and confirm that a private
[IA] ...plan appears. - Add one easy session and verify that Intervals.icu interprets its steps correctly.
- Preview
schedule_draft_plan, review dates and conflicts, and approve only when ready.
Safety model
- A managed plan must have
type == PLANand a description containing[intervals-mcp:managed]. [IA]is only a display prefix; security does not depend on the human-facing name.- Every edit requires the latest remote content hash.
- Only complete managed-plan applications can be scheduled or removed; generic event CRUD is unavailable.
- Scheduling rejects past dates, empty plans, stale hashes, and duplicate applications.
- Existing events in the target dates require additional approval through
allow_calendar_conflicts=true. - Unscheduling resolves IDs by
plan_folder_idand application range, then deletes only those exact events after confirmation. - The server never prints the API key or authentication responses.
- Scheduling may make eligible workouts available for Garmin synchronization; Garmin delivery must be reported as pending until verified.
Development
uv run ruff format --check .
uv run ruff check .
uv run mypy
uv run pytest -q
uv run python scripts/smoke_mcp.py
HTTP tests use a mocked Intervals.icu service. They do not need credentials or modify a real account.
Project status
The client and MCP are implemented and tested against the current public Intervals.icu contract. A manual test with a real API key is still needed to verify exactly how the library displays plans and processes workouts in a specific account.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。