runframe-mcp-server
Enables managing incident response workflows including incidents, on-call, postmortems, and more through the Runframe platform using MCP tools.
README
runframe-mcp-server
Runframe is the complete incident lifecycle platform for engineering teams, covering incident response, on-call, and status pages. This MCP server lets you manage those workflows from your IDE or AI agent.
17 tools covering incidents, on-call, services, postmortems, teams, and people lookup. Requires Node.js 20+.
Why Use This
- Stay in your editor — acknowledge incidents, page responders, and write postmortems without switching to a browser
- Let agents handle the routine — AI agents can triage, escalate, and update incidents autonomously using scoped API keys
- Zero infrastructure — runs via
npx, no server to deploy for local use
How It Works
Your IDE / Agent
↓ (stdio or HTTP)
MCP Server (this package)
↓ (HTTPS, scoped API key)
Runframe API
The server is stateless. It translates MCP tool calls into Runframe API requests, scoped by your API key permissions. No data is stored locally.
Examples
Ask your agent:
- "Acknowledge incident INC-2026-001" → calls
runframe_acknowledge_incident - "Who is on call right now?" → calls
runframe_get_current_oncall - "Create a postmortem for the database outage" → calls
runframe_create_postmortem - "Page the backend team lead about the API latency spike" → calls
runframe_page_someone - "List all open SEV1 incidents" → calls
runframe_list_incidentswith severity filter - "Find Alex so I can check their open incidents" → calls
runframe_find_user
Install
Get your API key from settings inside Runframe.io, then add to your agent:
Claude Code:
claude mcp add runframe -e RUNFRAME_API_KEY=rf_your_key_here -- npx -y @runframe/mcp-server
Cursor (~/.cursor/mcp.json) · VS Code (.vscode/mcp.json) · Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"runframe": {
"command": "npx",
"args": ["-y", "@runframe/mcp-server"],
"env": { "RUNFRAME_API_KEY": "rf_your_key_here" }
}
}
}
Other MCP clients: Add the JSON config above to your client's MCP config file.
Interactive setup wizard:
npx @runframe/mcp-server --setup
Environment Variables
| Variable | Required | Default | Description |
|---|---|---|---|
RUNFRAME_API_KEY |
Yes | — | API key (starts with rf_) |
RUNFRAME_API_URL |
No | https://runframe.io |
API base URL |
MCP_ACCESS_TOKEN |
HTTP only | — | Bearer token for HTTP transport. Comma-separated for rotation (new_token,old_token). |
Transports
stdio (default) — used by MCP clients like Claude Code and Cursor. No network exposure. This is what the install commands above configure.
Streamable HTTP — for containerized or remote deployments. Requires MCP_ACCESS_TOKEN for bearer auth:
RUNFRAME_API_KEY=rf_... \
MCP_ACCESS_TOKEN=your_token \
npx @runframe/mcp-server --transport http --port 3100 --host 127.0.0.1
Security Model
Responsibility is split across three boundaries:
- Runframe API handles authorization and scopes via
RUNFRAME_API_KEY. - This MCP server handles process isolation (stdio) and bearer-token validation (HTTP). It also enforces method filtering, Host/Origin checks on localhost, declared Content-Length validation (1 MB limit), 8 KB header limit, and 15s upstream timeout.
- Your reverse proxy handles TLS, rate limiting, and streamed-body enforcement if you expose HTTP mode to a network.
The server stores nothing. It is a pass-through to the Runframe API.
Tools
Incidents (9)
| Tool | Scopes | Description |
|---|---|---|
runframe_list_incidents |
incidents:read |
List incidents with filters and pagination |
runframe_get_incident |
incidents:read |
Get incident by ID or number |
runframe_create_incident |
incidents:write |
Create an incident |
runframe_update_incident |
incidents:write |
Update title, description, severity, or assignment |
runframe_change_incident_status |
incidents:write |
Move to a new status (new, investigating, fixing, monitoring, resolved, closed) |
runframe_acknowledge_incident |
incidents:write |
Acknowledge (auto-assigns, tracks SLA) |
runframe_add_incident_event |
incidents:write |
Add a timeline entry |
runframe_escalate_incident |
incidents:write |
Escalate to the next policy level |
runframe_page_someone |
incidents:write |
Page a responder via Slack or email |
On-call (1)
| Tool | Scopes | Description |
|---|---|---|
runframe_get_current_oncall |
oncall:read |
Who is on call right now |
Services (2)
| Tool | Scopes | Description |
|---|---|---|
runframe_list_services |
services:read |
List services |
runframe_get_service |
services:read |
Get service details |
Postmortems (2)
| Tool | Scopes | Description |
|---|---|---|
runframe_create_postmortem |
postmortems:write |
Create a postmortem |
runframe_get_postmortem |
postmortems:read |
Get postmortem for an incident |
Teams (2)
| Tool | Scopes | Description |
|---|---|---|
runframe_list_teams |
teams:read |
List teams |
runframe_get_escalation_policy |
oncall:read |
Get escalation policy for a severity level |
Users (1)
| Tool | Scopes | Description |
|---|---|---|
runframe_find_user |
users:read |
Search users by name or email, with optional inactive-user support for historical lookups |
Direct API alignment
This MCP server follows the public Runframe direct API contract.
- Incident create requires
service_idscontaining public service keys likesvc_K7M4Q9TZ2H, not internal UUIDs. runframe_get_servicenow looks up services by publicservice_key, not UUID.- Incident tools now follow the latest V1 contract: use incident numbers like
INC-2026-001in path parameters. - Incident update and list filters now use the latest public identifiers where V1 does: assignee/resolver email and
team_name. runframe_create_incidentaccepts an optionalidempotency_key, which is forwarded as theIdempotency-Keyheader for retry-safe creates.runframe_create_incidentdefaultsseveritytoSEV2when omitted, matching the V1 API.- Incident create now mirrors the V1 API limits:
titlemust be 1-200 chars,descriptionmaxes at 10000 chars, andservice_idsallows at most 50 items. - Incident creation depends on valid SLA configuration for the requested severity. If acknowledge or closure deadlines are missing, the API rejects the create.
- Use
runframe_list_servicesto discover validservice_keyvalues before creating incidents. runframe_page_someonenow uses the latest V1 delivery contract:email,channels, and optionalmessage.- Postmortem tools now follow the latest V1 contract: use
incident_numberand snake_case nested fields likeusers_affected,owner_email, andtime_to_acknowledge. - Use
runframe_find_userto resolve a person name to an email address before filtering incidents byassigned_toorresolved_by. - Set
include_inactive=trueonrunframe_find_userwhen you need to resolve former employees in historical incident queries. - Set
is_active=trueoris_active=falseonrunframe_find_userwhen you need an explicit V1 active-state filter. - Use
runframe_list_teamswithsearchto resolve the exactteam_namebefore filtering incidents.
Docker
The Docker image runs HTTP transport by default on port 3100:
docker build -t runframe-mcp-server .
docker run -e RUNFRAME_API_KEY=rf_... -e MCP_ACCESS_TOKEN=your_token -p 3100:3100 runframe-mcp-server
Deploying HTTP Mode
HTTP mode is meant for private networks. If you put it on the internet:
- Run behind TLS (nginx, Caddy, cloud LB). This server does not do TLS.
- Use a reverse proxy for rate limiting and request buffering.
- Prefer private subnets or VPNs over public exposure.
- Rotate
MCP_ACCESS_TOKENregularly. Pass old and new tokens comma-separated for zero-downtime swaps.
Rate limiting
The Runframe API enforces rate limits server-side. If you hit a limit, tools return a 429 error with a retry hint. For HTTP transport deployments, your reverse proxy can add additional request-level throttling.
Token rotation
MCP_ACCESS_TOKEN accepts comma-separated tokens:
- Set
MCP_ACCESS_TOKEN=new_token,old_token - Update clients to
new_token - Drop the old one:
MCP_ACCESS_TOKEN=new_token
Limitations
- Read-only for schedules — you can query on-call and escalation policies but not modify them via MCP
- Requires a Runframe account and API key
Contributing
Issues and PRs welcome at github.com/runframe/runframe-mcp-server.
License
推荐服务器
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 模型以安全和受控的方式获取实时的网络信息。