oncall-router-mcp
Enables incident responders to answer who owns a service, who to escalate to and when, which runbook steps to try first, and whether the current escalation step is on time, all from a local file with no external APIs or network calls.
README
oncall-router-mcp
An MCP server that answers the three questions that eat the first ten minutes of an incident: who owns this, who do I wake and by when, and what does the runbook say to try first. Plus a fourth that most tools get wrong, which is where should we be on the clock right now, measured from when impact started rather than from when somebody opened a ticket.
No runtime dependencies, no API key, no network calls, no telemetry. It reads one local file. pytest is needed only to run the gates.
Why this exists
Escalation knowledge lives in three places: a wiki nobody updated, a rotation tool that only knows the current shift, and the head of whoever has been there longest. At 2am the expensive minutes go to working out who to call, not to fixing anything.
This puts that knowledge somewhere an assistant can reach it, and makes the timing explicit. The design opinion in the code is that escalation timing runs from impact start. A ticket opened twenty minutes late does not buy the responder twenty extra minutes, and a tool that measures from ticket creation will quietly tell you that it does.
The four tools
| tool | answers | when it cannot |
|---|---|---|
who_owns |
which team owns a service, and how to reach them now | says so, and offers near matches as candidates rather than as an answer |
escalation_path |
who to wake, in order, with the minute each hop is due | refuses an unknown severity rather than defaulting to the quietest one |
playbook |
what the runbook says to check first | falls back to the service's general steps and sets fell_back so the caller can tell |
impact_clock |
which hop should be active now, and what is overdue | requires an explicit now, and refuses a start time in the future |
Every tool fails closed. A near miss never silently resolves, because a confident wrong escalation costs more than an honest "I do not know".
See docs/TRANSCRIPT.md for real output from every tool, including the failure paths. CI regenerates that file and fails the build if it drifts from what the code actually produces.
Run it
git clone <this repo> && cd oncall-router-mcp
python -m pip install "pytest>=7" # the only dependency, and only to run the tests
python -m pytest tests/ -q # 40 tests
PYTHONPATH=src python -m oncall_router.server --catalog catalog.toml
To wire it into Claude Desktop or Claude Code, add this to your MCP client config, using absolute paths:
{
"mcpServers": {
"oncall-router": {
"command": "python",
"args": ["-m", "oncall_router.server", "--catalog", "/abs/path/to/catalog.toml"],
"env": { "PYTHONPATH": "/abs/path/to/oncall-router-mcp/src" }
}
}
}
Point an MCP client at that command. To use your own data, copy catalog.toml, edit it,
and pass --catalog yours.toml. No code changes: the catalog is data, and a test proves
it by running the same tool against two different catalogs.
The catalog
One TOML file holding services, the team that owns each, escalation chains with timings,
and runbook steps by symptom. TOML rather than YAML because tomllib ships in the Python
standard library, so the catalog costs this project zero dependencies.
Aliases matter more than they look. During an incident people type the name they remember,
so gateway, apigw, edge and the gateway all resolve to api-gateway.
What this deliberately does not do
- No live integrations. It does not read your incident tool, your rotation tool, or your monitoring. Those are per-customer decisions and they belong behind a boundary.
- No write actions. It never pages anyone, opens anything, or changes state. It answers questions and a human decides.
- The shipped catalog is fictional. Every service, team, and handle in
catalog.tomlis invented. A test fails the build if anything employer-identifying appears in the repo. - The timing model is a convention, not a standard. Cumulative minutes from impact start, carried forward when the chain climbs to another team. Reasonable, and not the only reasonable choice.
- No cost or latency figures, because there are no model calls. The server is deterministic and local.
Gates
Built against a rubric frozen before the first line of code. The ones worth knowing:
- Every tool answers through a real client speaking the wire protocol, not just as a function call in a test.
- Every tool has a failure-path test proving it declines rather than guesses.
- Tests were observed failing before each implementation existed.
- Swapping the catalog changes every answer with no code edit, proven by a test.
- The committed transcript regenerates, or the build fails.
- No credentials, no network calls in the source, no employer content, no third-party imports. This gate blocks.
推荐服务器
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 模型以安全和受控的方式获取实时的网络信息。