An MCP server for the Rootly API that integrates seamlessly with MCP-compatible editors like Cursor, Windsurf, and Claude. Resolve production incidents in under a minute without leaving your IDE.
- Python 3.12 or higher
uvpackage managercurl -LsSf https://astral.sh/uv/install.sh | sh- Rootly API token with appropriate permissions (see below)
The MCP server requires a Rootly API token. Choose the appropriate token type based on your needs:
- Global API Key (Recommended): Full access to all entities across your Rootly instance. Required for organization-wide visibility across teams, schedules, and incidents.
- Team API Key: Team Admin permissions with full read/edit access to entities owned by that team. Suitable for team-specific workflows.
- Personal API Key: Inherits the permissions of the user who created it. Works for individual use cases but may have limited visibility.
For full functionality of tools like get_oncall_handoff_summary, get_oncall_shift_metrics, and organization-wide incident search, a Global API Key is recommended.
Configure your MCP-compatible editor (tested with Cursor) with one of the configurations below. The package will be automatically downloaded and installed when you first open your editor.
{
"mcpServers": {
"rootly": {
"command": "uv",
"args": [
"tool",
"run",
"--from",
"rootly-mcp-server",
"rootly-mcp-server"
],
"env": {
"ROOTLY_API_TOKEN": "<YOUR_ROOTLY_API_TOKEN>"
}
}
}
}{
"mcpServers": {
"rootly": {
"command": "uvx",
"args": [
"--from",
"rootly-mcp-server",
"rootly-mcp-server"
],
"env": {
"ROOTLY_API_TOKEN": "<YOUR_ROOTLY_API_TOKEN>"
}
}
}
}To customize allowed_paths and access additional Rootly API paths, clone the repository and use this configuration:
{
"mcpServers": {
"rootly": {
"command": "uv",
"args": [
"run",
"--directory",
"/path/to/rootly-mcp-server",
"rootly-mcp-server"
],
"env": {
"ROOTLY_API_TOKEN": "<YOUR_ROOTLY_API_TOKEN>"
}
}
}
}Alternatively, connect directly to our hosted MCP server:
{
"mcpServers": {
"rootly": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://mcp.rootly.com/sse",
"--header",
"Authorization:${ROOTLY_AUTH_HEADER}"
],
"env": {
"ROOTLY_AUTH_HEADER": "Bearer <YOUR_ROOTLY_API_TOKEN>"
}
}
}
}- Dynamic Tool Generation: Automatically creates MCP resources from Rootly's OpenAPI (Swagger) specification
- Smart Pagination: Defaults to 10 items per request for incident endpoints to prevent context window overflow
- API Filtering: Limits exposed API endpoints for security and performance
- Intelligent Incident Analysis: Smart tools that analyze historical incident data
find_related_incidents: Uses TF-IDF similarity analysis to find historically similar incidentssuggest_solutions: Mines past incident resolutions to recommend actionable solutions
- MCP Resources: Exposes incident and team data as structured resources for easy AI reference
- Intelligent Pattern Recognition: Automatically identifies services, error types, and resolution patterns
Alerts
listIncidentAlertslistAlertsattachAlertcreateAlert
Environments
listEnvironmentscreateEnvironment
Functionalities
listFunctionalitiescreateFunctionality
Workflows
listWorkflowscreateWorkflow
Incidents
listIncidentActionItemscreateIncidentActionItemlistIncident_TypescreateIncidentTypesearch_incidentsfind_related_incidentssuggest_solutions
On-Call
get_oncall_shift_metricsget_oncall_handoff_summaryget_shift_incidents
Services & Severities
listServicescreateServicelistSeveritiescreateSeverity
Teams & Users
listTeamscreateTeamlistUsersgetCurrentUser
Meta
list_endpoints
We limit exposed API paths for two key reasons:
- Context Management: Rootly's comprehensive API can overwhelm AI agents, affecting their ability to perform simple tasks effectively
- Security: Controls which information and actions are accessible through the MCP server
To expose additional paths, modify the allowed_paths variable in src/rootly_mcp_server/server.py.
The MCP server includes intelligent tools that analyze historical incident data to provide actionable insights:
Finds historically similar incidents using text similarity analysis:
find_related_incidents(incident_id="12345", similarity_threshold=0.15, max_results=5)
- Input: Incident ID, similarity threshold (0.0-1.0), max results
- Output: Similar incidents with confidence scores, matched services, and resolution times
- Use Case: Get context from past incidents to understand patterns and solutions
Recommends solutions by analyzing how similar incidents were resolved:
suggest_solutions(incident_id="12345", max_solutions=3)
# OR for new incidents:
suggest_solutions(incident_title="Payment API errors", incident_description="Users getting 500 errors during checkout")
- Input: Either incident ID OR title/description text
- Output: Actionable solution recommendations with confidence scores and time estimates
- Use Case: Get intelligent suggestions based on successful past resolutions
- Text Similarity: Uses TF-IDF vectorization and cosine similarity (scikit-learn)
- Service Detection: Automatically identifies affected services from incident text
- Pattern Recognition: Finds common error types, resolution patterns, and time estimates
- Fallback Mode: Works without ML libraries using keyword-based similarity
- Solution Mining: Extracts actionable steps from resolution summaries
For optimal results, ensure your Rootly incidents have descriptive:
- Titles: Clear, specific incident descriptions
- Summaries: Detailed resolution steps when closing incidents
- Service Tags: Proper service identification
Example good resolution summary: "Restarted auth-service, cleared Redis cache, and increased connection pool from 10 to 50"
Get on-call shift metrics for any time period, grouped by user, team, or schedule. Includes primary/secondary role tracking, shift counts, hours, and days on-call.
get_oncall_shift_metrics(
start_date="2025-10-01",
end_date="2025-10-31",
group_by="user"
)
Complete handoff: current/next on-call + incidents during shifts.
# All on-call (any timezone)
get_oncall_handoff_summary(
team_ids="team-1,team-2",
timezone="America/Los_Angeles"
)
# Regional filter - only show APAC on-call during APAC business hours
get_oncall_handoff_summary(
timezone="Asia/Tokyo",
filter_by_region=True
)Regional filtering shows only people on-call during business hours (9am-5pm) in the specified timezone.
Returns: schedules with current_oncall, next_oncall, and shift_incidents
Incidents during a time period, with filtering by severity/status/tags.
get_shift_incidents(
start_time="2025-10-20T09:00:00Z",
end_time="2025-10-20T17:00:00Z",
severity="critical", # optional
status="resolved", # optional
tags="database,api" # optional
)Returns: incidents list + summary (counts, avg resolution time, grouping)
This project was developed by Rootly AI Labs, where we're building the future of system reliability and operational excellence. As an open-source incubator, we share ideas, experiment, and rapidly prototype solutions that benefit the entire community.

- Python 3.12 or higher
uvfor dependency management
Create and activate a virtual environment:
uv venv .venv
source .venv/bin/activate # Always activate before running scriptsInstall all project dependencies:
uv pip install .To add new dependencies during development:
uv pip install <package>Install pre-commit hooks to automatically run linting and tests before commits:
./scripts/setup-hooks.shThis ensures code quality by running:
- Ruff linting
- Pyright type checking
- Unit tests
The server should now be ready to use with your MCP-compatible editor.
For developers: Additional testing tools are available in the tests/ directory.
