Rootly MCP server
OfficialSummary: The Rootly MCP server exposes Rootly incident-management and related API capabilities to MCP clients.
List, search, and create incidents, including paginated incident search and fetching all matches.
Manage alerts: list alerts, list incident alerts, attach alerts to incidents, and create alerts.
Create and list incident action items, incident types, environments, functionalities, workflows, services, severities, and teams.
List users and get the current authenticated user.
List available Rootly API endpoints.
Broader deployments also support on-call, schedules, post-incident reviews, dashboards, playbooks, monitoring, and many more Rootly tools; write actions depend on server configuration.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Rootly MCP server search for recent incidents with status open"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Rootly MCP Server
An MCP server for the Rootly API for Cursor, Windsurf, Claude, and other MCP clients.

Quick Start
Use the hosted MCP server. No local installation required.
Hosted Transport Options
Streamable HTTP (recommended):
https://mcp.rootly.com/mcpCode Mode:
https://mcp.rootly.com/mcp-codemodeSSE (deprecated, removed after 2026-11-20):
https://mcp.rootly.com/sse
SSE is deprecated. The hosted https://mcp.rootly.com/sse endpoint and the self-hosted --transport sse option will be removed after 2026-11-20. Switch your client to Streamable HTTP (https://mcp.rootly.com/mcp) or Code Mode (https://mcp.rootly.com/mcp-codemode); for most clients that means changing the URL and, if your client config has one, setting the transport to http/streamable-http. SSE responses now carry Deprecation, Sunset and Link: rel="successor-version" headers.
Toolsets
Every client loads the whole tool list into the model's context: the full surface is about 125k tokens. Tools are grouped into toolsets (the same model as GitHub's and Datadog's MCP servers) so a client can load only what it needs. Recommended: ?toolsets=core, about 29 tools and 10k tokens. Without a selection you still get every tool, so existing configurations keep working.
Toolset | What it covers |
| Everyday incident response: find and update incidents, alerts, who is on call (~29 tools) |
| Action items, events, roles, retrospectives, form field selections, meeting recordings |
| Alerts, alert sources, routes and routing rules, urgencies, heartbeats, live call routers |
| Schedules, rotations, shifts, overrides, escalation policies and paths |
| Workflows, workflow tasks and runs, playbooks |
| Services, functionalities, teams, environments, catalogs |
| Status pages, templates, pulses |
| Severities, causes, incident types, forms, retrospective processes, dashboards |
| Users, notification rules, contact methods |
| AI SRE investigations, AI automations and skills |
| Rootly Observability logs and patterns |
| Audit log |
Pick toolsets:
https://mcp.rootly.com/mcp?toolsets=core,workflows, or sendX-MCP-Toolsets: core,workflowsEverything:
?toolsets=all(about 280 tools)Read-only: add
readonly=true(orX-MCP-Readonly: true), e.g.?toolsets=all&readonly=true. Any value other thanfalse/0/no/offturns it on. Write tools are hidden and refused, and the server also refuses any non-GET request to the Rootly API on that connection. It is a per-connection guard; for a hard guarantee, connect with a Rootly API key whose role cannot writeDeprecated:
?tool_profile=andX-Rootly-Tool-Profile. They still work (full/allmean?toolsets=all;slimkeeps its fixed ~85-tool list) and will be removed; switch to?toolsets=. Each use is logged so remaining clients can be foundServer-wide default:
ROOTLY_MCP_TOOLSETS=core,alertssets what a client gets with no selection (defaultall);ROOTLY_MCP_HOSTED_TOOL_PROFILE=slimmakes slim the default insteadExact custom override:
ROOTLY_MCP_ENABLED_TOOLS=...replaces toolsets entirely
A tool outside the selection is refused with the toolset that holds it (list_workflows is not available here: it is in the 'workflows' toolset ... Reconnect with ?toolsets=core,workflows), and the server instructions list every toolset, so an assistant can tell you the exact change. Code Mode (/mcp-codemode) always has the full catalog; readonly=true applies there too, to every tool a script calls. readonly also applies under the slim profile and ROOTLY_MCP_ENABLED_TOOLS.
General Remote Setup
With OAuth2 (recommended):
{
"mcpServers": {
"rootly": {
"url": "https://mcp.rootly.com/mcp"
}
}
}Your MCP client handles OAuth2 login automatically — a browser window opens for you to authenticate with Rootly. No API token needed.
With API Token:
{
"mcpServers": {
"rootly": {
"url": "https://mcp.rootly.com/mcp",
"headers": {
"Authorization": "Bearer YOUR_ROOTLY_API_TOKEN"
}
}
}
}Code Mode:
{
"mcpServers": {
"rootly": {
"url": "https://mcp.rootly.com/mcp-codemode"
}
}
}If your config still points at https://mcp.rootly.com/sse, replace it with https://mcp.rootly.com/mcp before 2026-11-20 (SSE is deprecated, see above).
Agent Setup
With OAuth2 (recommended):
claude mcp add --transport http rootly https://mcp.rootly.com/mcp
# Code Mode:
claude mcp add --transport http rootly-codemode https://mcp.rootly.com/mcp-codemodeWith API Token:
claude mcp add --transport http rootly https://mcp.rootly.com/mcp \
--header "Authorization: Bearer YOUR_ROOTLY_API_TOKEN"Manual Configuration — Create .mcp.json in your project root:
{
"mcpServers": {
"rootly": {
"type": "http",
"url": "https://mcp.rootly.com/mcp"
}
}
}Install the extension:
gemini extensions install https://github.com/rootlyhq/rootly-mcp-serverOr configure manually in ~/.gemini/settings.json:
{
"mcpServers": {
"rootly": {
"command": "uvx",
"args": ["--from", "rootly-mcp-server", "rootly-mcp-server"],
"env": {
"ROOTLY_API_TOKEN": "<YOUR_ROOTLY_API_TOKEN>"
}
}
}
}Add to .cursor/mcp.json or ~/.cursor/mcp.json:
With OAuth2 (recommended):
{
"mcpServers": {
"rootly": {
"url": "https://mcp.rootly.com/mcp"
}
}
}With API Token:
{
"mcpServers": {
"rootly": {
"url": "https://mcp.rootly.com/mcp",
"headers": {
"Authorization": "Bearer <YOUR_ROOTLY_API_TOKEN>"
}
}
}
}Add to ~/.codeium/windsurf/mcp_config.json:
With OAuth2 (recommended):
{
"mcpServers": {
"rootly": {
"serverUrl": "https://mcp.rootly.com/mcp"
}
}
}With API Token:
{
"mcpServers": {
"rootly": {
"serverUrl": "https://mcp.rootly.com/mcp",
"headers": {
"Authorization": "Bearer <YOUR_ROOTLY_API_TOKEN>"
}
}
}
}Add to ~/.codex/config.toml:
With OAuth2 (recommended):
[mcp_servers.rootly]
url = "https://mcp.rootly.com/mcp"With API Token:
[mcp_servers.rootly]
url = "https://mcp.rootly.com/mcp"
bearer_token_env_var = "ROOTLY_API_TOKEN"With OAuth2 (recommended):
Add to claude_desktop_config.json:
{
"mcpServers": {
"rootly": {
"url": "https://mcp.rootly.com/mcp"
}
}
}Claude Desktop handles OAuth2 login automatically.
With API Token (via mcp-remote):
{
"mcpServers": {
"rootly": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://mcp.rootly.com/mcp",
"--transport",
"http",
"--header",
"Authorization: Bearer <YOUR_ROOTLY_API_TOKEN>"
]
}
}
}Register the hosted server in Unity Gateway so Supervisor Agent, AI Playground, and other Databricks agents can use it:
In your workspace, open Unity Gateway > MCPs, click + MCP, and choose Connect an existing MCP server.
Pick a catalog and schema, name the MCP, and create a new connection with URL
https://mcp.rootly.com/mcp.Choose an authentication method:
Dynamic Client Registration (recommended): each user signs in to Rootly with their own account.
Bearer token: paste a Rootly API token.
Click Create & load tools, click Login if prompted, and select the tools to expose.
Or create the connection with the Databricks SDK:
from databricks.sdk import WorkspaceClient
from databricks.sdk.service import catalog as c
WorkspaceClient().connections.create(
name="rootly_connection",
parent="schemas/main.default",
connection_type=c.ConnectionType.HTTP,
options={
"host": "https://mcp.rootly.com",
"port": "443",
"base_path": "/mcp",
"bearer_token": "<YOUR_ROOTLY_API_TOKEN>",
},
)The full profile exposes about 250 tools. Use Unity Gateway tool selection to expose only what your agents need. See docs/databricks-marketplace.md for the Marketplace listing details.
Related MCP server: OpsLevel MCP
Rootly CLI
Standalone CLI for incidents, alerts, services, and on-call operations.
Install via Homebrew:
brew install rootlyhq/tap/rootly-cliOr via Go:
go install github.com/rootlyhq/rootly-cli/cmd/rootly@latestFor more details, see the Rootly CLI repository.
Alternative Installation (Local)
Run the MCP server locally if you do not want to use the hosted service.
Prerequisites
Python 3.12 or higher
uvpackage managercurl -LsSf https://astral.sh/uv/install.sh | sh
API Token Types
Choose the token type based on the access you need:
Global API Key: Full access across the Rootly instance. Best for organization-wide visibility.
Team API Key: Access limited to entities owned by that team.
Personal API Key: Access matches the user who created it.
A Global API Key is recommended for organization-wide queries and for actions that modify data, especially when workflows may span multiple teams, schedules, or incidents.
With uv
{
"mcpServers": {
"rootly": {
"command": "uv",
"args": [
"tool",
"run",
"--from",
"rootly-mcp-server",
"rootly-mcp-server"
],
"env": {
"ROOTLY_API_TOKEN": "<YOUR_ROOTLY_API_TOKEN>",
"ROOTLY_MCP_ENABLE_WRITE_TOOLS": "true"
}
}
}
}Self-Hosted Transport Options
Choose one transport per server process:
Streamable HTTP endpoint path:
/mcpSSE (deprecated, removed after 2026-11-20) endpoint path:
/sse.--transport sselogs a deprecation warning at startup; use--transport streamable-httpinstead.Code Mode (experimental) endpoint path:
/mcp-codemodein hosted dual-transport mode. Oneexecutecall may make at most 50 tool calls; setROOTLY_CODE_MODE_MAX_TOOL_CALLSto a positive integer to change that.Hosted default: full surface;
?toolsets=corefor the recommended small one (see Toolsets)Hosted slim profile (deprecated): about 85 high-usage tools via
?tool_profile=slimSelf-hosted default: full surface (
ROOTLY_MCP_TOOLSETSnarrows it)
To restrict either deployment to read-only tools, start the server with --no-enable-write-tools or set ROOTLY_MCP_ENABLE_WRITE_TOOLS=false.
For hosted clients, choose toolsets with ?toolsets= on the MCP URL or the X-MCP-Toolsets header (see Toolsets).
AgentCat and Sentry telemetry
Hosted deployments can send MCP telemetry to AgentCat by setting
ROOTLY_MCPCAT_PROJECT_ID. To also export AgentCat events to Sentry, provide
SENTRY_DSN through the deployment's secret store. The optional
ENVIRONMENT defaults to production, and SENTRY_RELEASE defaults to the
installed Rootly MCP Server version. Sentry performance tracing is enabled when
the exporter is configured.
Free-form event text is redacted and actor names are omitted from Sentry-bound
telemetry; stable internal actor IDs remain available for correlation.
AgentCat's enable_tool_call_context and enable_report_missing options are
disabled. The SDK does not add an analytics context parameter or the
get_more_tools feedback tool. Tool-call telemetry remains enabled, including
arguments, responses, timing, errors, and configured identity information,
subject to the existing redaction hooks.
Telemetry runs on AgentCat v2 (MCP 2026-07-28 spec). Session correlation uses the
SDK's hook mode (resolve_session_id): the server derives the session from the
request. The key always starts with the caller (authenticated user, or a digest
of the token), then the client's Mcp-Session-Id when it sends one, otherwise
the UTC hour. No session_id parameter or session instructions are added to
tool schemas. Clients holding a cached tool
list that still send context or session_id are tolerated; the stray
argument is dropped before validation. initialize and tools/list events are
no longer published by the SDK.
To override the hosted or self-hosted default profile entirely, set ROOTLY_MCP_ENABLED_TOOLS (or pass --enabled-tools) with a comma-separated allowlist of exact tool names. When that variable is set, it fully replaces the default selection.
To expose only a specific subset of MCP tools on a self-hosted deployment, set ROOTLY_MCP_ENABLED_TOOLS (or pass --enabled-tools) with a comma-separated allowlist of exact tool names, for example list_incidents,get_incident,get_server_version.
PostHog MCP analytics
Setting POSTHOG_PROJECT_TOKEN (and optionally POSTHOG_HOST, default
https://us.i.posthog.com) sends $mcp_* events to PostHog with the same
privacy settings as AgentCat: no injected context, conversation_id or
llm_model parameters, credential scrubbing before send, and hosted users
identified by Rootly user ID only.
When AgentCat is also configured, both run side by side. posthog.mcp's MCP SDK
1.x code path cannot handle AgentCat's middleware directly, so the server wraps
it in an adapter first. On the stateless hosted transport, PostHog sessions are
tied together through the Mcp-Session-Id header minted at initialize.
AgentCat's session resolver also reads that header (scoped to the
authenticated caller), so with PostHog on, AgentCat groups those clients'
calls per connection instead of per hour.
OpenAI Apps domain verification
Hosted deployments expose an unauthenticated domain-verification endpoint used by the OpenAI plugin directory:
Endpoint:
GET /.well-known/openai-apps-challengeEnvironment variable:
ROOTLY_OPENAI_APPS_CHALLENGE_TOKEN
Set ROOTLY_OPENAI_APPS_CHALLENGE_TOKEN to the token generated in the OpenAI submission portal. The endpoint returns that exact token as text/plain (with Cache-Control: no-store), and returns 404 when the variable is unset or empty. The token is read from the environment at request time — never hardcode or commit it. The route is served on both the dual-transport (--transport both) and profiled streamable-HTTP hosted deployments and is not subject to Bearer authentication.
To discover the exact tool names available under your current self-hosted configuration, run:
ROOTLY_API_TOKEN=<YOUR_ROOTLY_API_TOKEN> \
uv run python -m rootly_mcp_server --list-toolsThis prints the effective MCP tool names after applying your current settings, including ROOTLY_MCP_ENABLE_WRITE_TOOLS and ROOTLY_MCP_ENABLED_TOOLS.
Smoke-test a self-hosted allowlist:
ROOTLY_API_TOKEN=<YOUR_ROOTLY_API_TOKEN> \
ROOTLY_MCP_ENABLED_TOOLS=list_incidents,get_incident,get_server_version \
uv run python -m rootly_mcp_server --transport streamable-http --log-level ERRORThen connect an MCP client to http://127.0.0.1:8000/mcp and verify tools/list returns only:
get_server_version
get_incident
list_incidentsTo include specific write tools for self-hosted testing, add both the write flag and the allowlist:
ROOTLY_API_TOKEN=<YOUR_ROOTLY_API_TOKEN> \
ROOTLY_MCP_ENABLE_WRITE_TOOLS=true \
ROOTLY_MCP_ENABLED_TOOLS=create_incident,create_workflow_task,list_teams \
uv run python -m rootly_mcp_server --transport streamable-http --log-level ERRORExample Docker run (Streamable HTTP):
docker run -p 8000:8000 \
-e ROOTLY_TRANSPORT=streamable-http \
-e ROOTLY_API_TOKEN=<YOUR_ROOTLY_API_TOKEN> \
-e ROOTLY_MCP_ENABLE_WRITE_TOOLS=true \
rootly-mcp-serverExample Docker run (SSE, deprecated: removed after 2026-11-20, use Streamable HTTP above):
docker run -p 8000:8000 \
-e ROOTLY_TRANSPORT=sse \
-e ROOTLY_API_TOKEN=<YOUR_ROOTLY_API_TOKEN> \
rootly-mcp-serverExample Docker run (Dual transport + Code Mode; the /sse endpoint it also serves is deprecated):
docker run -p 8000:8000 \
-e ROOTLY_TRANSPORT=both \
-e ROOTLY_API_TOKEN=<YOUR_ROOTLY_API_TOKEN> \
rootly-mcp-serverWorkflow-Focused Tool Subsets
The full surface exposes about 280 tools. Toolsets cover most needs; for an exact list, use ROOTLY_MCP_ENABLED_TOOLS:
🚨 Incident Response (25 tools)
Essential tools for emergency responders and incident commanders
ROOTLY_MCP_ENABLED_TOOLS="list_incidents,get_incident,create_incident,update_incident,search_incidents,find_related_incidents,suggest_solutions,create_incident_action_item,list_incident_action_items,update_incident_form_field_selection,list_teams,get_current_user,list_services,list_severities,get_alert,list_alerts,get_alert_by_short_id,list_escalation_policies,get_escalation_policy,list_on_call_roles,list_schedules,get_schedule_shifts,get_oncall_handoff_summary,get_shift_incidents,list_endpoints"📅 On-Call Management (33 tools)
For schedule coordinators and on-call managers
ROOTLY_MCP_ENABLED_TOOLS="list_schedules,get_schedule,update_schedule,get_schedule_shifts,list_shifts,create_schedule_rotation,update_schedule_rotation,list_schedule_rotations,get_schedule_rotation,list_schedule_rotation_users,update_schedule_rotation_user,create_on_call_shadow,update_on_call_shadow,list_on_call_shadows,create_override_shift,update_override_shift,list_override_shifts,list_on_call_roles,update_on_call_role,get_oncall_schedule_summary,get_oncall_shift_metrics,check_responder_availability,create_override_recommendation,list_teams,get_team,list_users,get_user,get_current_user,list_escalation_policies,update_escalation_policy,list_escalation_paths,update_escalation_path,list_escalation_levels"📊 Monitoring & Alerting (40 tools)
For platform teams setting up observability
ROOTLY_MCP_ENABLED_TOOLS="list_alerts,get_alert,get_alert_by_short_id,create_alert_group,update_alert_group,list_alert_groups,create_alert_routing_rule,update_alert_routing_rule,list_alert_routing_rules,list_alert_events,get_alert_event,update_alert_event,create_heartbeat,update_heartbeat,list_heartbeats,get_heartbeat,create_pulse,update_pulse,list_pulses,get_pulse,create_dashboard,update_dashboard,list_dashboards,get_dashboard,create_dashboard_panel,update_dashboard_panel,list_status_pages,get_status_page,update_status_page,list_status_page_templates,get_status_page_template,list_communications_templates,update_communications_template,create_live_call_router,update_live_call_router,list_services,list_teams,get_current_user,list_environments,list_severities,list_endpoints"📋 Post-Incident Analysis (30 tools)
For SREs doing retrospectives and process improvement
ROOTLY_MCP_ENABLED_TOOLS="get_incident,update_incident,find_related_incidents,suggest_solutions,list_incident_action_items,create_incident_action_item,update_incident_form_field_selection,create_post_incident_review,update_post_incident_review,list_post_incident_reviews,get_post_incident_review,create_retrospective_step,update_retrospective_step,list_retrospective_steps,create_retrospective_process,update_retrospective_process,list_retrospective_processes,create_playbook,update_playbook,list_playbooks,get_playbook,create_playbook_task,update_playbook_task,list_causes,get_cause,update_cause,list_incident_types,get_incident_type,update_incident_type,get_current_user"📈 Analytics & Reporting (15 tools)
For leadership and metrics teams (read-only focus)
ROOTLY_MCP_ENABLED_TOOLS="list_incidents,search_incidents,collect_incidents,list_teams,list_services,list_schedules,get_oncall_shift_metrics,get_shift_incidents,list_dashboards,get_dashboard,list_alerts,list_heartbeats,list_pulses,get_current_user,list_endpoints"Multiple MCP Instances for Different Teams
You can run multiple MCP instances with different tool subsets:
{
"mcpServers": {
"rootly-incident-response": {
"command": "uvx", "args": ["--from", "rootly-mcp-server", "rootly-mcp-server"],
"env": {
"ROOTLY_API_TOKEN": "<token>",
"ROOTLY_MCP_ENABLED_TOOLS": "list_incidents,get_incident,create_incident,find_related_incidents,suggest_solutions..."
}
},
"rootly-oncall-management": {
"command": "uvx", "args": ["--from", "rootly-mcp-server", "rootly-mcp-server"],
"env": {
"ROOTLY_API_TOKEN": "<token>",
"ROOTLY_MCP_ENABLED_TOOLS": "list_schedules,update_schedule,create_override_shift,get_oncall_shift_metrics..."
}
}
}
}With uvx
{
"mcpServers": {
"rootly": {
"command": "uvx",
"args": [
"--from",
"rootly-mcp-server",
"rootly-mcp-server"
],
"env": {
"ROOTLY_API_TOKEN": "<YOUR_ROOTLY_API_TOKEN>"
}
}
}
}Features
Dynamic Tool Generation: Automatically creates MCP resources from Rootly's OpenAPI (Swagger) specification
Smart Pagination: Uses bounded pagination and compact incident responses 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 incidents, teams, on-call status, and workflow guides as structured resources for AI context
Intelligent Pattern Recognition: Automatically identifies services, error types, and resolution patterns
On-Call Health Integration (self-hosted only): Detects workload health risk in scheduled responders
Supported Tools
The default tool surface depends on deployment profile:
Hosted default: about 280 tools
Hosted
?toolsets=core(recommended): about 29 toolsHosted slim profile (deprecated): about 85 tools
Self-hosted default: about 280 tools
Custom Agentic Tools
check_oncall_health_risk- self-hosted onlycheck_responder_availabilitycollect_incidentscreate_incident- create a new incident with a scoped set of fields for agent workflowscreate_override_recommendationfind_related_incidentsget_incident- retrieve a single incident for direct verification, including PIR-related fieldsget_alert_by_short_idget_investigation- an AI SRE investigation's verdict, evidence, causal chain and open questions (by id, or latest for an alert/incident)get_investigation_progress- follow a running investigation; call again withafter_cursoruntildoneget_oncall_handoff_summaryget_oncall_schedule_summaryget_oncall_shift_metricsget_server_versionget_shift_incidentslist_endpointslist_investigationslist_incidentslist_shiftssearch_incidentsstart_investigation,cancel_investigation- start or cancel an AI SRE investigation; write toolssuggest_solutionsupdate_incident- update native incident fields with severity validation; retrospective status changes require the Rootly UI
OpenAPI-Generated Tools
Tool naming: all tools use
snake_case. The historicalcamelCasenames (e.g.getScheduleShifts,listIncidents) are no longer advertised intools/list, but remain callable as hidden aliases — they are transparently routed to theirsnake_casecanonical. Update configs andROOTLY_MCP_ENABLED_TOOLSallowlists to thesnake_casenames; legacy camelCase allowlist entries are auto-canonicalized.
list_workflow_runs
create_incident_action_item
create_incident_form_field_selection
create_workflow_task
get_alert
get_alert_event
get_alert_group
get_alert_routing_rule
get_alert_source
get_alert_urgency
get_catalog
get_catalog_entity
get_catalog_property
get_cause
get_current_user
get_custom_form
get_environment
get_escalation_level
get_escalation_path
get_escalation_policy
get_form_field
get_form_field_option
get_functionality
get_functionality_incidents_chart
get_functionality_uptime_chart
get_incident_action_items
get_incident_form_field_selection
get_incident_type
get_on_call_role
get_on_call_shadow
get_override_shift
get_schedule
get_schedule_rotation
get_schedule_shifts
get_service
get_service_incidents_chart
get_service_uptime_chart
get_severity
get_status_page
get_status_page_template
get_team
get_team_incidents_chart
get_user
get_workflow
get_workflow_form_field_condition
get_workflow_group
get_workflow_task
list_alert_events
list_alert_groups
list_alert_routing_rules
list_alert_sources
list_alert_urgencies
list_alerts
list_all_incident_action_items
list_catalog_entities
list_catalog_properties
list_catalogs
list_causes
list_custom_forms
list_environments
list_escalation_levels
list_escalation_levels_paths
list_escalation_paths
list_escalation_policies
list_form_field_options
list_form_fields
list_functionalities
list_incident_action_items
list_incident_alerts
list_incident_form_field_selections
list_incident_types
list_observability_logs
list_observability_patterns
count_observability_logs
list_on_call_roles
list_on_call_shadows
list_override_shifts
list_schedule_rotation_active_days
list_schedule_rotation_users
list_schedule_rotations
list_schedules
list_services
list_severities
list_shifts
list_status_page_templates
list_status_pages
list_teams
list_users
list_workflow_form_field_conditions
list_workflow_groups
list_workflows
list_workflow_tasks
update_environment
update_escalation_level
update_escalation_path
update_escalation_policy
update_functionality
update_incident_type
update_on_call_role
update_on_call_shadow
update_override_shift
update_schedule
update_schedule_rotation
update_service
update_severity
update_team
update_workflow
update_incident_form_field_selection
update_workflow_taskMajor Expansion: This version includes 50+ new endpoints covering communications, dashboards, playbooks, post-incident reviews, monitoring, and advanced form management - while carefully excluding security-sensitive operations like API key management, user creation/deletion, role management, and webhook configuration.
Delete operations remain disabled in the default tool surface.
On-Call Health Integration (Self-Hosted Only)
Integrates with On-Call Health to detect workload health risk in scheduled responders.
check_oncall_health_risk is unavailable on the hosted MCP service, including
the full and slim profiles, SSE, Streamable HTTP, and Code Mode. It is not
registered in hosted mode, so an API key or ROOTLY_MCP_ENABLED_TOOLS allowlist
cannot enable it. Ordinary on-call scheduling and incident tools remain available.
Self-hosted deployments retain this integration. Operators are responsible for appropriate employee disclosure and data handling for their deployment.
Setup
Set the ONCALLHEALTH_API_KEY environment variable:
{
"mcpServers": {
"rootly": {
"command": "uvx",
"args": ["--from", "rootly-mcp-server", "rootly-mcp-server"],
"env": {
"ROOTLY_API_TOKEN": "your_rootly_token",
"ONCALLHEALTH_API_KEY": "och_live_your_key"
}
}
}
}Usage
check_oncall_health_risk(
start_date="2026-02-09",
end_date="2026-02-15"
)Returns at-risk users who are scheduled, recommended safe replacements, and action summaries.
Example Skills
Pre-built Claude Code skills:
🚨 Rootly Incident Responder
This skill:
Analyzes production incidents with full context
Finds similar historical incidents using ML-based similarity matching
Suggests solutions based on past successful resolutions
Coordinates with on-call teams across timezones
Correlates incidents with recent code changes and deployments
Creates action items and remediation plans
Provides confidence scores and time estimates
Quick Start:
# Copy the skill to your project
mkdir -p .claude/skills
cp examples/skills/rootly-incident-responder.md .claude/skills/
# Then in Claude Code, invoke it:
# @rootly-incident-responder analyze incident #12345It demonstrates a full incident response workflow using Rootly tools and GitHub context.
On-Call Shift Metrics
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"
)On-Call Handoff Summary
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
MCP Resources for Context
AI agents can access these resources for situational awareness:
incident://{incident_id}- Detailed incident information for specific incidentsteam://{team_id}- Team details including name, color, and metadatarootly://incidents- List of recent incidents for quick referencerootly://oncall-status- Current on-call status across all schedules (critical for incident response)rootly://workflow-guide- Step-by-step workflow guidance for common operations
Example usage: "Check the current on-call status" → AI reads rootly://oncall-status resource
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)
Contributing
See CONTRIBUTING.md for developer setup and guidelines.
Play with it on Postman
About Rootly AI Labs
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.

Available Tools
274 toolsattach_alertAttach AlertC
Attach alerts to an incident from provided data
Inputs: data (required), incident_id (required). Returns: object
cancel_investigationCancel InvestigationBDestructiveIdempotent
Cancel a running investigation.
Inputs: investigation_id (required). Returns: object
check_oncall_health_riskCheck Oncall Health RiskARead-only
Check if any at-risk responders (based on On-Call Health analysis) are scheduled for on-call.
Integrates with On-Call Health (oncallhealth.ai) to identify responders with elevated workload health risk and checks if they are scheduled during the specified period. Optionally recommends safe replacement responders.
Privacy: This tool surfaces identifiable employee workload health data from On-Call Health. It is an opt-in feature — an administrator must explicitly configure the ONCALLHEALTH_API_KEY environment variable to enable it.
Available only in self-hosted deployments. Requires ONCALLHEALTH_API_KEY environment variable.
Inputs: end_date (required), start_date (required), och_threshold, och_analysis_id, +1 more. Returns: object
check_responder_availabilityCheck Responder AvailabilityARead-only
Check if specific users are scheduled for on-call in a date range.
Use this to verify if at-risk users (from On-Call Health) are scheduled, or to check availability before assigning new shifts.
Returns scheduled users with their shifts and total hours, plus users who are not scheduled. Shift times and hours are clipped to the requested window; date-only end dates include that entire UTC day.
Inputs: end_date (required), user_ids (required), start_date (required). Returns: object
collect_incidentsCollect IncidentsARead-only
Collect a bounded working set of incidents across multiple pages for audits and analysis.
Use this instead of list_incidents when you want a compact batch of incidents in one tool call, while keeping payload size under control.
Argument caps: max_results <= 100, batch_size between 10 and 100. Values outside those bounds are clamped and reported, not rejected.
Inputs: sort, query, teams, status, +8 more. Returns: object
count_observability_logsCount Observability LogsARead-only
Count logs matching a Logs explorer query, grouped by service, index, severity or an attribute key (@http.status_code). Answers questions like "errors per service in the last 6h" (filter[query]=severity:error, filter[from]=now-6h, group_by=service). Values are ordered by count, largest first; meta.total counts every matching log, and each value's logs_query drills into its rows with GET /v1/observability/logs (null for a blank value, which the query syntax cannot select, or when the drill-down would exceed the query limits: 512 characters or 20 clauses). A log can carry an attribute key more than once (log, resource and scope attributes), so attribute counts can add up to more than meta.total; when logs match but none have the attribute, data is empty and meta.warnings has code attribute_missing. Requires a personal or Global API key (Team API Keys are group-scoped and get 403 unsupported_api_key) or an OAuth token with the obs.logs:read (or all) scope, and the Observability logs read permission. A Global API key uses its service user's Observability role, which starts as the team's default Observability role. Limited to 60 requests per minute per token; on this endpoint the X-RateLimit-* headers report that per-minute budget, not the default API limit. Every 429 returns the errors envelope with code rate_limited and a Retry-After header.
Inputs: group_by, filter_to, page_size, filter_from, +1 more. Returns: object
create_alertCreate AlertC
Creates a new alert from provided data
Inputs: data (required). Returns: object
create_alert_eventCreate Alert EventC
Creates a new alert event
Inputs: alert_id (required), data. Returns: object
create_alert_groupCreate Alert GroupB
Creates a new alert group. Note: For enhanced functionality and future compatibility, consider using the advanced alert grouping with conditions field instead of the legacy group_by_alert_title, group_by_alert_urgency, and attributes fields.
Inputs: data (required). Returns: object
create_alert_routeCreate Alert RouteB
Creates a new alert route from provided data. Note: This endpoint requires access to Advanced Alert Routing. If you're unsure whether you have access to this feature, please contact Rootly customer support.
Asynchronous Rule Creation
For organizations with large numbers of routing rules, Rootly supports asynchronous rule processing to improve performance. When enabled, rule creation happens in the background.
Asynchronous processing is also applied automatically, whether or not it is enabled for your organization, when a request carries a rule graph too large to save within the request timeout. Size is measured in total dependent records — rules plus their condition groups, conditions and destinations — and for an update it includes the rules already on the route, not just those in the payload.
Important: Whenever rules are processed asynchronously, the rules list in the API response will not be up-to-date immediately after creation. You should refetch the alert route, or poll the async rule creation status endpoint with the request_id you supplied, to confirm the rules have landed.
If you experience slow operations when managing alert routes with many rules, contact Rootly customer support to enable asynchronous rule processing for your organization.
Inputs: data. Returns: object
create_alert_routing_ruleCreate Alert Routing RuleA
Creates a new alert routing rule from provided data. Note: If you are an advanced alert routing user, you should use the Alert Routes endpoint instead of this endpoint. If you don't know whether you are an advanced user, please contact Rootly customer support.
Inputs: data (required). Returns: object
create_alerts_sourceCreate Alerts SourceC
Creates a new alert source from provided data
Inputs: data (required). Returns: object
create_alert_urgencyCreate Alert UrgencyD
Creates a new alert urgency from provided data
Inputs: data (required). Returns: object
create_catalogCreate CatalogC
Creates a new catalog from provided data
Inputs: data (required). Returns: object
create_catalog_entityCreate Catalog EntityC
Creates a new Catalog Entity from provided data
Inputs: data (required), catalog_id (required). Returns: object
create_catalog_entity_propertyCreate Catalog Entity PropertyA
Deprecated: This endpoint is deprecated, please use the fields attribute on catalog entities or native catalog endpoints (teams, services, functionalities, incident_types, causes, environments) to set field values instead.
Creates a new Catalog Entity Property from provided data.
Inputs: data (required), catalog_entity_id (required). Returns: object
create_catalog_propertyCreate Catalog PropertyC
Creates a new Catalog Property - returns catalog_properties type
Inputs: data (required), catalog_id (required).
create_causeCreate CauseC
Creates a new cause from provided data
Inputs: data (required). Returns: object
create_custom_fieldCreate Custom FieldB
[DEPRECATED] Use form field endpoints instead. Creates a new custom field from provided data
Inputs: data (required). Returns: object
create_custom_formCreate Custom FormC
Creates a new custom form from provided data
Inputs: data (required). Returns: object
create_dashboardCreate DashboardC
Creates a new dashboard from provided data
Inputs: data (required). Returns: object
create_environmentCreate EnvironmentC
Creates a new environment from provided data
Inputs: data (required). Returns: object
create_escalation_levelCreate Escalation LevelC
Creates a new escalation level from provided data
Inputs: data (required), escalation_policy_id (required). Returns: object
create_escalation_level_pathsCreate Escalation Level PathsC
Creates a new escalation level from provided data
Inputs: data (required), escalation_policy_path_id (required). Returns: object
create_escalation_pathCreate Escalation PathC
Creates a new escalation path from provided data
Inputs: data (required), escalation_policy_id (required). Returns: object
create_escalation_policyCreate Escalation PolicyC
Creates a new escalation policy from provided data
Inputs: data (required). Returns: object
create_form_fieldCreate Form FieldC
Creates a new form_field from provided data
Inputs: data (required). Returns: object
create_form_field_optionCreate Form Field OptionC
Creates a new form_field_option from provided data
Inputs: data (required), form_field_id (required). Returns: object
create_form_setCreate Form SetC
Creates a new form_set from provided data
Inputs: data (required). Returns: object
create_functionalityCreate FunctionalityC
Creates a new functionality from provided data
Inputs: data (required). Returns: object
create_heartbeatCreate HeartbeatC
Creates a new heartbeat from provided data
Inputs: data (required). Returns: object
create_incidentCreate IncidentC
Create an incident with a scoped set of fields for agent-driven workflows.
Inputs: title, summary, team_ids, service_ids, +3 more. Returns: object
create_incident_action_itemCreate Incident Action ItemC
Creates a new action item from provided data
Inputs: data (required), incident_id (required). Returns: object
create_incident_custom_field_selectionCreate Incident Custom Field SelectionA
[DEPRECATED] Use form field endpoints instead. Creates a new incident custom field selection from provided data
Inputs: data (required), incident_id (required). Returns: object
create_incident_eventCreate Incident EventC
Creates a new event from provided data
Inputs: data (required), incident_id (required). Returns: object
create_incident_form_field_selectionCreate Incident Form Field SelectionC
Creates a new incident form field selection from provided data
Inputs: data (required), incident_id (required). Returns: object
create_incident_typeCreate Incident TypeC
Creates a new incident_type from provided data
Inputs: data (required). Returns: object
create_live_call_routerCreate Live Call RouterC
Creates a new Live Call Router from provided data
Inputs: data (required). Returns: object
create_on_call_roleCreate On Call RoleC
Creates a new On-Call Role from provided data
Inputs: data (required). Returns: object
create_on_call_shadowCreate On Call ShadowC
Creates a new on call shadow configuration from provided data
Inputs: data (required), schedule_id (required). Returns: object
create_override_recommendationCreate Override RecommendationARead-only
Recommend replacement responders for an override shift.
Finds users in the same schedule rotation who are not already heavily loaded during the period.
Returns recommended replacements sorted by current load (lowest first), plus a ready-to-use override payload for the top recommendation.
Inputs: end_date (required), start_date (required), schedule_id (required), original_user_id (required), +1 more. Returns: object
create_override_shiftCreate Override ShiftC
Creates a new override shift from provided data. If any existing override shifts overlap with the specified time range, they will be automatically deleted and replaced by the new override. This endpoint is idempotent: re-sending an identical override (same user and same start/end time) returns the existing override with a 200 status and does not recreate it.
Inputs: data (required), schedule_id (required). Returns: object
create_playbookCreate PlaybookC
Creates a new playbook from provided data
Inputs: data (required). Returns: object
create_pulseCreate PulseC
Creates a new pulse from provided data
Inputs: data (required). Returns: object
create_retrospective_processCreate Retrospective ProcessC
Creates a new retrospective process from provided data
Inputs: data (required). Returns: object
create_scheduleCreate ScheduleC
Creates a new schedule from provided data
Inputs: data (required). Returns: object
create_schedule_rotationCreate Schedule RotationC
Creates a new schedule rotation from provided data
Inputs: data (required), schedule_id (required). Returns: object
create_schedule_rotation_active_dayCreate Schedule Rotation Active DayC
Creates a new schedule rotation active day from provided data
Inputs: data (required), schedule_rotation_id (required). Returns: object
create_schedule_rotation_userCreate Schedule Rotation UserC
Creates a new schedule rotation user from provided data
Inputs: schedule_rotation_id (required), data. Returns: object
create_serviceCreate ServiceC
Creates a new service from provided data
Inputs: data (required). Returns: object
create_severityCreate SeverityC
Creates a new severity from provided data
Inputs: data (required). Returns: object
create_status_pageCreate Status PageC
Creates a new status page from provided data
Inputs: data (required). Returns: object
create_status_page_templateCreate Status Page TemplateC
Creates a new template from provided data
Inputs: body (required), title (required), created_at (required), updated_at (required), +8 more. Returns: object
create_sub_statusCreate Sub StatusC
Creates a new Sub-Status from provided data
Inputs: data (required). Returns: object
create_teamCreate TeamC
Creates a new team from provided data
Inputs: data (required). Returns: object
create_user_email_addressCreate User Email AddressC
Creates a new user email address from provided data
Inputs: data (required), user_id (required). Returns: object
create_user_notification_ruleCreate User Notification RuleC
Creates a new user notification rule from provided data
Inputs: data (required), user_id (required). Returns: object
create_user_phone_numberCreate User Phone NumberC
Creates a new user phone number from provided data
Inputs: data (required), user_id (required). Returns: object
create_workflowCreate WorkflowD
Creates a new workflow from provided data
Inputs: data (required). Returns: object
create_workflow_form_field_conditionCreate Workflow Form Field ConditionC
Creates a new workflow form field condition from provided data
Inputs: data (required), workflow_id (required). Returns: object
create_workflow_groupCreate Workflow GroupC
Creates a new workflow group from provided data
Inputs: data (required). Returns: object
create_workflow_runCreate Workflow RunC
Creates a new workflow run from provided data
Inputs: data (required), workflow_id (required). Returns: object
create_workflow_taskCreate Workflow TaskC
Creates a new workflow task from provided data
Inputs: data (required), workflow_id (required). Returns: object
get_alertGet AlertCRead-only
Retrieves a specific alert by id
Inputs: id (required), fields_alerts (required), include. Returns: object
get_alert_by_short_idGet Alert By Short IdARead-only
Get alert details by short_id or alert URL. Use this when a user pastes an alert URL or short_id from a pager notification and wants to investigate the alert.
Inputs: short_id (required). Returns: object
get_alert_eventGet Alert EventARead-only
Retrieves a specific alert_event by id
Inputs: id (required). Returns: object
get_alert_groupGet Alert GroupBRead-only
Retrieves a specific alert group by id
Inputs: id (required). Returns: object
get_alert_routeGet Alert RouteARead-only
Get a specific alert route by id. Note: This endpoint requires access to Advanced Alert Routing. If you're unsure whether you have access to this feature, please contact Rootly customer support.
Optional Parameters
show_nested_ids (query parameter): When set to
true, the response will include IDs for all nested resources (destinations, condition_groups, conditions). This is useful when you need to reference these nested resources for updates or deletions via PATCH requests.
Example: GET /v1/alert_routes/{id}?show_nested_ids=true
Inputs: id (required), show_nested_ids. Returns: object
get_alert_routing_ruleGet Alert Routing RuleARead-only
Retrieves a specific alert routing rule by id. Note: If you are an advanced alert routing user, you should use the Alert Routes endpoint instead of this endpoint. If you don't know whether you are an advanced user, please contact Rootly customer support.
Inputs: id (required). Returns: object
get_alerts_sourceGet Alerts SourceCRead-only
Retrieves a specific alert source by id
Inputs: id (required). Returns: object
get_alert_urgencyGet Alert UrgencyBRead-only
Retrieves a specific alert urgency by id
Inputs: id (required). Returns: object
get_catalogGet CatalogCRead-only
Retrieves a specific catalog by id
Inputs: id (required). Returns: object
get_catalog_entityGet Catalog EntityBRead-only
Retrieves a specific Catalog Entity by id
Inputs: id (required), include. Returns: object
get_catalog_entity_propertyGet Catalog Entity PropertyARead-only
Deprecated: This endpoint is deprecated, please use include=fields on catalog entities or native catalog endpoints (teams, services, functionalities, incident_types, causes, environments) to retrieve field values instead.
Retrieves a specific Catalog Entity Property by id.
Inputs: id (required), include. Returns: object
get_catalog_propertyGet Catalog PropertyBRead-only
Retrieves a specific Catalog Property by id - returns catalog_properties type
Inputs: id (required).
get_causeGet CauseCRead-only
Retrieves a specific cause by id
Inputs: id (required). Returns: object
get_current_userGet Current UserCRead-only
Get current user
Inputs: no named parameters. Returns: object
get_custom_fieldGet Custom FieldCRead-only
Retrieves a specific custom_field by id
Inputs: id (required), include. Returns: object
get_custom_field_optionGet Custom Field OptionARead-only
[DEPRECATED] Use form field endpoints instead. Retrieves a specific custom field option by id
Inputs: id (required). Returns: object
get_custom_formGet Custom FormBRead-only
Retrieves a specific custom form by id
Inputs: id (required). Returns: object
get_dashboardGet DashboardCRead-only
Retrieves a specific dashboard by id
Inputs: id (required), include. Returns: object
get_dashboard_panelGet Dashboard PanelBRead-only
Retrieves a specific dashboard panel by id
Inputs: id (required), range, period, time_zone. Returns: object
get_environmentGet EnvironmentCRead-only
Retrieves a specific environment by id
Inputs: id (required). Returns: object
get_escalation_levelGet Escalation LevelCRead-only
Retrieves a specific escalation level by id
Inputs: id (required). Returns: object
get_escalation_pathGet Escalation PathCRead-only
Retrieves a specific escalation path by id
Inputs: id (required), include. Returns: object
get_escalation_policyGet Escalation PolicyBRead-only
Retrieves a specific escalation policy by id
Inputs: id (required), include. Returns: object
get_form_fieldGet Form FieldCRead-only
Retrieves a specific form_field by id
Inputs: id (required), include. Returns: object
get_form_field_optionGet Form Field OptionARead-only
Retrieves a specific form_field_option by id
Inputs: id (required). Returns: object
get_form_field_placementGet Form Field PlacementCRead-only
Retrieves a specific form_field_placement by id
Inputs: id (required). Returns: object
get_form_field_placement_conditionGet Form Field Placement ConditionBRead-only
Retrieves a specific form_field_placement_condition by id
Inputs: id (required). Returns: object
get_form_setGet Form SetCRead-only
Retrieves a specific form_set by id
Inputs: id (required). Returns: object
get_form_set_conditionGet Form Set ConditionCRead-only
Retrieves a specific form_set_condition by id
Inputs: id (required). Returns: object
get_functionalityGet FunctionalityCRead-only
Retrieves a specific functionality by id
Inputs: id (required). Returns: object
get_functionality_incidents_chartGet Functionality Incidents ChartCRead-only
Get functionality incidents chart
Inputs: id (required), period (required), include, page_size, +2 more. Returns: object
get_functionality_uptime_chartGet Functionality Uptime ChartCRead-only
Get functionality uptime chart
Inputs: id (required), period. Returns: object
get_heartbeatGet HeartbeatBRead-only
Retrieves a specific heartbeat by id
Inputs: id (required). Returns: object
get_incidentGet IncidentARead-only
Retrieve a single incident with PIR-related fields for direct verification.
Inputs: incident_id (required). Returns: object
get_incident_action_itemsGet Incident Action ItemsCRead-only
Retrieves a specific incident_action_item by id
Inputs: id (required). Returns: object
get_incident_custom_field_selectionGet Incident Custom Field SelectionARead-only
[DEPRECATED] Use form field endpoints instead. Retrieves a specific incident custom field selection by id
Inputs: id (required), include, fields_incidents. Returns: object
get_incident_form_field_selectionGet Incident Form Field SelectionCRead-only
Retrieves a specific incident form field selection by id
Inputs: id (required), include, fields_incidents. Returns: object
get_incident_meeting_transcriptsGet Incident Meeting TranscriptsARead-only
Read what was said on an incident's calls (Rootly Meeting Scribe).
Returns the spoken transcript of each recorded call for the incident, as text per speaker turn, alongside Scribe's own summary. Covers Google Meet, Zoom and Microsoft Teams calls that Scribe recorded.
Use this to catch up on a call you missed, or to pull decisions and actions out of an incident bridge. Recordings where nobody spoke are skipped rather than returned empty.
Inputs: incident_id (required), max_recordings. Returns: object
get_incident_retrospectiveGet Incident RetrospectiveARead-only
Fetch the written retrospective for one incident.
Answers "what did we learn from INC-4460" in a single call. Returns the document's title, content and status alongside the incident it belongs to, and reports the incident's retrospective progress so a blank document is distinguishable from one nobody has started.
The route exists only in this direction: /post_mortems cannot be
filtered by incident, and the document carries no reference back to one,
so the id has to come from the incident's own relationship. Doing that
here keeps a caller from having to know it. Use
list_incident_post_mortems to search across retrospectives instead.
Inputs: incident_id (required). Returns: object
get_incident_retrospective_stepGet Incident Retrospective StepBRead-only
Retrieves a specific incident retrospective step by id
Inputs: id (required), include, fields_incidents. Returns: object
get_incident_sub_statusGet Incident Sub StatusCRead-only
Retrieves a specific incident_sub_status by id
Inputs: id (required), include, fields_incidents. Returns: object
get_incident_typeGet Incident TypeBRead-only
Retrieves a specific incident_type by id
Inputs: id (required), include, fields_incidents. Returns: object
get_investigationGet InvestigationARead-only
Get an investigation's verdict: summary, root cause, confidence, hypotheses, evidence, causal chain and open_questions (what Rootly couldn't verify, so you can check them with tools only you have).
Inputs: alert_id, incident_id, investigation_id. Returns: object
get_investigation_progressGet Investigation ProgressARead-only
Follow a running investigation. Returns new steps and tool calls since after_cursor, waiting up to wait_seconds for them. Keep calling with after_cursor=next_cursor until done is true.
Inputs: investigation_id (required), after_cursor, wait_seconds. Returns: object
get_live_call_routerGet Live Call RouterBRead-only
Retrieves a specific Live Call Router by id
Inputs: id (required). Returns: object
get_meeting_recordingGet Meeting RecordingBRead-only
Retrieve a single meeting recording session including its status, duration, speaker count, word count, and transcript summary.
Inputs: id (required), include. Returns: object
get_oncall_handoff_summaryGet Oncall Handoff SummaryARead-only
Get current on-call handoff summary. Shows who's currently on-call and who's next.
Optionally fetch incidents (set include_incidents=True, but slower).
Each responder's role is their On-Call role (e.g. Responder, Admin);
shifts themselves carry no role.
Use filter_by_region=True with a timezone to see only people on-call during business hours in that region (e.g., timezone='Asia/Tokyo', filter_by_region=True shows only APAC on-call during APAC business hours).
Useful for:
Quick on-call status checks
Daily handoff meetings
Regional on-call status (APAC, EU, Americas)
Team coordination across timezones
Inputs: team_ids, timezone, schedule_ids, filter_by_region, +1 more. Returns: object
get_on_call_roleGet On Call RoleBRead-only
Retrieves a specific On-Call Role by id
Inputs: id (required). Returns: object
get_oncall_schedule_summaryGet Oncall Schedule SummaryARead-only
Get compact on-call schedule summary for a date range.
Returns one entry per user per schedule (not raw shifts), with aggregated hours. Optimized for AI agent context windows.
Use this instead of list_shifts when you need:
Aggregated hours per responder
Schedule coverage overview
Responder load analysis with warnings
One row per user per schedule, so the response stays the same size whether the range is a week or a year. For individual shift times, or for one person's schedule, use list_shifts instead.
Ranges longer than the upstream cap are split into windows and merged automatically.
Inputs: end_date (required), start_date (required), team_ids, schedule_ids, +1 more. Returns: object
get_on_call_shadowGet On Call ShadowARead-only
Retrieves a specific On Call Shadow configuration by ID
Inputs: id (required). Returns: object
get_oncall_shift_metricsGet Oncall Shift MetricsARead-only
📊 Get on-call workload metrics and shift statistics - ESSENTIAL for fairness and planning.
WHEN TO USE: • Monthly/quarterly reviews of on-call distribution • Before adjusting schedules to ensure fair workload • For management reporting on on-call burden • When investigating potential on-call burnout
Returns shift counts, total hours, and statistics grouped by user, schedule, or team.
Examples:
Monthly report: start_date='2025-10-01', end_date='2025-10-31'
Specific user: start_date='2025-10-01', end_date='2025-10-31', user_ids='123,456'
Specific team: team_ids='team-1' (will query schedules for that team first)
Inputs: end_date (required), start_date (required), group_by, team_ids, +2 more. Returns: object
get_override_shiftGet Override ShiftARead-only
Retrieves a specific override shift by id
Inputs: id (required). Returns: object
get_playbookGet PlaybookCRead-only
Retrieves a specific playbook by id
Inputs: id (required), include. Returns: object
get_playbook_taskGet Playbook TaskCRead-only
Retrieves a specific playbook_task by id
Inputs: id (required). Returns: object
get_pulseGet PulseARead-only
Retrieves a specific pulse by id
Inputs: id (required). Returns: object
get_retrospective_processGet Retrospective ProcessCRead-only
Retrieves a specific retrospective process by id
Inputs: id (required), include. Returns: object
get_retrospective_process_groupGet Retrospective Process GroupCRead-only
Retrieves a specific Retrospective Process Group by id
Inputs: id (required), include. Returns: object
get_retrospective_stepGet Retrospective StepBRead-only
Retrieves a specific retrospective step by id
Inputs: id (required). Returns: object
get_scheduleGet ScheduleCRead-only
Retrieves a specific schedule by id
Inputs: id (required). Returns: object
get_schedule_rotationGet Schedule RotationCRead-only
Retrieves a specific schedule rotation by id
Inputs: id (required). Returns: object
get_schedule_shiftsGet Schedule ShiftsARead-only
List shifts for one schedule over a date range.
Replaces the generated getScheduleShifts, which passed the range
straight through and failed with Datetime range exceeds 1 month on
anything longer than the upstream accepts. Ranges longer than that are
split into windows and merged here, so a two-month question is a normal
request.
Use list_shifts instead when the question spans schedules or filters by user.
Inputs: id (required), end_date, start_date. Returns: object
get_server_versionGet Server VersionARead-only
Get the Rootly MCP server version.
Returns the current version of the deployed MCP server. Useful for checking if the server has been updated.
Inputs: no named parameters. Returns: object
get_serviceGet ServiceCRead-only
Retrieves a specific service by id
Inputs: id (required). Returns: object
get_service_incidents_chartGet Service Incidents ChartCRead-only
Get service incidents chart
Inputs: id (required), period (required), include, page_size, +2 more. Returns: object
get_service_uptime_chartGet Service Uptime ChartCRead-only
Get service uptime chart
Inputs: id (required), period. Returns: object
get_severityGet SeverityBRead-only
Retrieves a specific severity by id
Inputs: id (required). Returns: object
get_shift_coverage_requestGet Shift Coverage RequestCRead-only
Retrieves a specific shift coverage request.
Inputs: id (required). Returns: object
get_shift_incidentsGet Shift IncidentsBRead-only
Get incidents and alerts that occurred during a specific shift or time period.
Useful for:
Shift handoff summaries showing what happened during the shift
Post-shift debriefs and reporting
Incident analysis by time period
Understanding team workload during specific shifts
Returns incident details including severity, status, duration, and basic summary.
Inputs: end_time (required), start_time (required), tags, status, +2 more. Returns: object
get_status_pageGet Status PageCRead-only
Retrieves a specific status page by id
Inputs: id (required). Returns: object
get_status_page_templateGet Status Page TemplateBRead-only
Retrieves a specific status_page_template by id
Inputs: id (required). Returns: object
get_sub_statusGet Sub StatusCRead-only
Retrieves a specific Sub-Status by id
Inputs: id (required). Returns: object
get_teamGet TeamCRead-only
Retrieves a specific team by id
Inputs: id (required), include. Returns: object
get_team_incidents_chartGet Team Incidents ChartCRead-only
Get team incidents chart
Inputs: id (required), period (required), include, page_size, +2 more. Returns: object
get_userGet UserCRead-only
Retrieves a specific user by id
Inputs: id (required), include. Returns: object
get_user_email_addressesGet User Email AddressesBRead-only
Retrieves all email addresses for the specified user
Inputs: user_id (required). Returns: object
get_user_phone_numbersGet User Phone NumbersARead-only
Retrieves all phone numbers for the specified user
Inputs: user_id (required). Returns: object
get_workflowGet WorkflowCRead-only
Retrieves a specific workflow by id
Inputs: id (required), include. Returns: object
get_workflow_form_field_conditionGet Workflow Form Field ConditionCRead-only
Retrieves a specific workflow form field condition by id
Inputs: id (required). Returns: object
get_workflow_groupGet Workflow GroupCRead-only
Retrieves a specific workflow group by id
Inputs: id (required). Returns: object
get_workflow_taskGet Workflow TaskBRead-only
Retrieves a specific workflow_task by id
Inputs: id (required). Returns: object
list_alert_eventsList Alert EventsCRead-only
List alert_events
Inputs: alert_id (required), fields_alerts (required), include, page_size, +21 more. Returns: object
list_alert_groupsList Alert GroupsDRead-only
List alert groups
Inputs: include, filter_name_eq, filter_name_in, filter_slug_eq, +5 more. Returns: object
list_alert_routesList Alert RoutesBRead-only
List all alert routes for the current team with filtering and pagination. Note: This endpoint requires access to Advanced Alert Routing. If you're unsure whether you have access to this feature, please contact Rootly customer support.
Inputs: sort, page_size, filter_name, page_number, +9 more. Returns: object
list_alert_routing_rulesList Alert Routing RulesBRead-only
List alert routing rules. Note: If you are an advanced alert routing user, you should use the Alert Routes endpoint instead of this endpoint. If you don't know whether you are an advanced user, please contact Rootly customer support.
Inputs: sort, include, page_size, filter_name, +14 more. Returns: object
list_alertsList AlertsDRead-only
List alerts
Inputs: fields_alerts (required), include, page_size, page_after, +47 more. Returns: object
list_alerts_sourcesList Alerts SourcesDRead-only
List alert sources
Inputs: sort, include, page_size, filter_name, +5 more. Returns: object
list_alert_urgenciesList Alert UrgenciesDRead-only
List alert urgencies
Inputs: sort, include, page_size, filter_name, +10 more. Returns: object
list_all_incident_action_itemsList All Incident Action ItemsCRead-only
List all action items for an organization
Inputs: sort, include, page_size, filter_kind, +32 more. Returns: object
list_all_meeting_recordingsList All Meeting RecordingsARead-only
List meeting recordings across the organization. Returns the current user's standalone recordings plus incident-backed recordings the user can access. Supports filtering by status, platform, and created_by.
Inputs: status, platform, created_by. Returns: object
list_auditsList AuditsARead-onlyIdempotent
Read the Rootly audit log: who changed which configuration object, when, and what changed.
Each record carries the action, the acting user, the source, and the before-and-after value of every modified field. Use it to answer "who changed this escalation policy", "what did this workflow look like before", or to collect change evidence for a compliance review.
Covers roughly 60 resource types at the object level and is retained indefinitely. Two limits worth knowing: schedule rotations, escalation levels and shift overrides are not audited, and sign-in events are kept separately from this log.
Returns a single page of at most 25 records, newest first, alongside
total_matching so a wider search can be narrowed with the filters. It
does not walk the whole log, so a full compliance export belongs on the
REST endpoint rather than here.
Requires an API token whose role has the "Audits - read" permission.
Inputs: since, until, source, user_id, +4 more. Returns: object
list_catalog_entitiesList Catalog EntitiesDRead-only
List Catalog Entities
Inputs: catalog_id (required), sort, include, page_size, +23 more. Returns: object
list_catalog_entity_propertiesList Catalog Entity PropertiesARead-only
Deprecated: This endpoint is deprecated, please use include=fields on catalog entities or native catalog endpoints (teams, services, functionalities, incident_types, causes, environments) to retrieve field values instead.
List Catalog Entity Properties.
Inputs: catalog_entity_id (required), sort, include, page_size, +7 more. Returns: object
list_catalog_propertiesList Catalog PropertiesCRead-only
List Catalog Properties - returns catalog_properties type
Inputs: catalog_id (required).
list_catalogsList CatalogsDRead-only
List catalogs
Inputs: sort, include, page_size, filter_name, +21 more. Returns: object
list_causesList CausesDRead-only
List causes
Inputs: include, page_size, filter_name, filter_slug, +14 more. Returns: object
list_custom_fieldsList Custom FieldsBRead-only
[DEPRECATED] Use form field endpoints instead. List Custom fields
Inputs: sort, include, page_size, filter_kind, +24 more. Returns: object
list_custom_formsList Custom FormsDRead-only
List custom forms
Inputs: sort, page_size, filter_name, filter_slug, +7 more. Returns: object
list_dashboardsList DashboardsDRead-only
List dashboards
Inputs: include, page_size, page_number. Returns: object
list_endpointsList EndpointsARead-only
List all available Rootly API endpoints with their descriptions.
Inputs: no named parameters.
list_environmentsList EnvironmentsDRead-only
List environments
Inputs: sort, include, page_size, filter_name, +20 more. Returns: object
list_escalation_levelsList Escalation LevelsCRead-only
List escalation levels
Inputs: escalation_policy_id (required), include, page_size, page_number. Returns: object
list_escalation_levels_pathsList Escalation Levels PathsCRead-only
List escalation levels
Inputs: escalation_policy_path_id (required), include, page_size, page_number. Returns: object
list_escalation_pathsList Escalation PathsCRead-only
List escalation paths
Inputs: escalation_policy_id (required), include, page_size, page_number, +1 more. Returns: object
list_escalation_policiesList Escalation PoliciesDRead-only
List escalation policies
Inputs: include, page_size, filter_name, page_number, +14 more. Returns: object
list_form_field_optionsList Form Field OptionsDRead-only
List form_field_options
Inputs: form_field_id (required), include, page_size, page_number, +2 more. Returns: object
list_form_fieldsList Form FieldsDRead-only
List form_fields
Inputs: include, page_size, filter_kind, filter_name, +25 more. Returns: object
list_form_setsList Form SetsBRead-only
List form_sets. Without filter[resource_type], returns incident form sets and, when Problem Management is enabled, problem form sets. Pass filter[resource_type]=incident to list only incident form sets.
Inputs: include, page_size, filter_slug, page_number, +6 more. Returns: object
list_functionalitiesList FunctionalitiesDRead-only
List functionalities
Inputs: sort, include, page_size, filter_name, +19 more. Returns: object
list_heartbeatsList HeartbeatsDRead-only
List heartbeats
Inputs: include, page_size, filter_name, filter_slug, +6 more. Returns: object
list_incident_action_itemsList Incident Action ItemsCRead-only
List incident action items
Inputs: incident_id (required), include, page_size, page_number, +1 more. Returns: object
list_incident_alertsList Incident AlertsCRead-only
List incident alerts
Inputs: incident_id (required), fields_alerts (required), include, page_size, +20 more. Returns: object
list_incident_custom_field_selectionsList Incident Custom Field SelectionsARead-only
[DEPRECATED] Use form field endpoints instead. List incident custom field selections
Inputs: incident_id (required), include, page_size, page_number, +1 more. Returns: object
list_incident_eventsList Incident EventsCRead-only
List incident events
Inputs: incident_id (required), include, page_size, page_number, +1 more. Returns: object
list_incident_form_field_selectionsList Incident Form Field SelectionsCRead-only
List incident form field selections
Inputs: incident_id (required), include, page_size, page_number, +1 more. Returns: object
list_incident_post_mortemsList Incident Post MortemsARead-only
Browse retrospectives across incidents.
Answers "the last five retrospectives", "published ones for this team
since June", or "how many are still draft". Each result carries the
document's analysis -- summary, causes, impact, actions. A recognised
Timeline is dropped and the record says so with timeline_omitted,
because a minute-by-minute log is a third of a document and rarely what
a browse is after. What remains is still capped, and a record cut that
way carries content_truncated with its real content_chars. Use
get_incident_retrospective for one document whole, Timeline included
and nothing cut.
Filtering happens upstream for status, severity, team, service and
dates. Free-text search is not offered here because the API's search
matches titles only, and titles are generated from the incident name --
it cannot find a retrospective by what it says. Use
get_incident_retrospective when the incident is already known.
Inputs: sort, status, severity, team_ids, +5 more. Returns: object
list_incident_rolesList Incident RolesARead-only
List role assignments for an incident (who is Commander, Scribe, etc.).
Returns one entry per defined role with role metadata and the assigned
user (or user_id: null for roles that are defined on the incident but
not yet assigned). Use this to answer questions like "who is the
incident commander?", "is there a postmortem owner?", or "list all
roles for INC-4460".
Implementation note: this wraps GET /v1/incidents/{id}?include=roles
and flattens the JSON:API included array of incident_role_assignments
into a flat table so callers don't need to walk the relationships graph.
Inputs: incident_id (required). Returns: object
list_incidentsList IncidentsARead-only
🚨 List incidents with structured filters - ESSENTIAL for incident response.
WHEN TO USE: • During incident response to check for related ongoing incidents • For shift handoffs to review recent incidents by team/service • For post-incident analysis to find patterns by severity/date range • For audit workflows requiring specific filtering criteria
Use this when you need date-range, team, service, severity, or status filters. For simple text searches, prefer search_incidents instead.
Argument caps: page_size <= 100. Values outside the bounds are clamped and reported, not rejected.
Inputs: sort, query, teams, status, +8 more. Returns: object
list_incident_typesList Incident TypesDRead-only
List incident types
Inputs: sort, include, page_size, filter_name, +20 more. Returns: object
list_investigationsList InvestigationsBRead-only
List AI SRE investigations you can see, newest first.
Inputs: status, outcome, alert_id, page_size, +2 more. Returns: object
list_live_call_routersList Live Call RoutersDRead-only
List Live Call Routers
Inputs: sort, include, page_size, filter_name, +7 more. Returns: object
list_meeting_recordingsList Meeting RecordingsARead-only
List all meeting recording sessions for an incident. Returns recordings sorted by session number. Each recording represents one bot session with its own transcript, status, and metadata.
Inputs: incident_id (required), include, page_size, page_number, +1 more. Returns: object
list_observability_logsList Observability LogsARead-only
Search Rootly Observability logs with the Logs explorer query syntax (service:, severity:, index:, trace_id:, @attribute:value, OR inside field groups, - negation, * prefix, free text). Rows are newest first, clipped and redacted. meta.query and meta.window echo the effective query and window. Requires a personal or Global API key (Team API Keys are group-scoped and get 403 unsupported_api_key) or an OAuth token with the obs.logs:read (or all) scope, and the Observability logs read permission. A Global API key uses its service user's Observability role, which starts as the team's default Observability role. Limited to 60 requests per minute per token; on this endpoint the X-RateLimit-* headers report that per-minute budget, not the default API limit. Every 429 returns the errors envelope with code rate_limited and a Retry-After header.
Inputs: filter_to, page_size, filter_from, page_cursor, +1 more. Returns: object
list_observability_patternsList Observability PatternsARead-only
List log patterns (clustered log templates) with counts against the previous window of the same length. Only service:, severity: and pattern: filters apply; others are echoed in meta.ignored_filters. Each pattern's logs_query drills into matching rows with GET /v1/observability/logs; it is omitted when that query would exceed the /logs length or clause limits. Requires a personal or Global API key (Team API Keys are group-scoped and get 403 unsupported_api_key) or an OAuth token with the obs.logs:read (or all) scope, and the Observability logs read permission. A Global API key uses its service user's Observability role, which starts as the team's default Observability role. Limited to 60 requests per minute per token; on this endpoint the X-RateLimit-* headers report that per-minute budget, not the default API limit. Every 429 returns the errors envelope with code rate_limited and a Retry-After header.
Inputs: sort, filter_to, page_size, filter_from, +2 more. Returns: object
list_on_call_rolesList On Call RolesCRead-only
List On-Call Roles
Inputs: sort, include, page_size, filter_name, +7 more. Returns: object
list_on_call_shadowsList On Call ShadowsCRead-only
List shadow shifts for schedule
Inputs: schedule_id (required), include, page_size, page_number. Returns: object
list_override_shiftsList Override ShiftsDRead-only
List override shifts
Inputs: schedule_id (required), include, page_size, page_number. Returns: object
list_playbooksList PlaybooksDRead-only
List playbooks
Inputs: include, page_size, page_number. Returns: object
list_pulsesList PulsesDRead-only
List pulses
Inputs: include, page_size, filter_refs, page_number, +36 more. Returns: object
list_retrospective_processesList Retrospective ProcessesCRead-only
List retrospective processes
Inputs: include, page_size, page_number. Returns: object
list_schedule_rotation_active_daysList Schedule Rotation Active DaysDRead-only
List schedule rotation active days
Inputs: schedule_rotation_id (required), include, page_size, page_number. Returns: object
list_schedule_rotationsList Schedule RotationsDRead-only
List schedule rotations
Inputs: schedule_id (required), sort, include, page_size, +1 more. Returns: object
list_schedule_rotation_usersList Schedule Rotation UsersCRead-only
List schedule rotation users
Inputs: schedule_rotation_id (required), include, page_size, page_number. Returns: object
list_schedulesList SchedulesDRead-only
List schedules
Inputs: include, page_size, filter_name, page_number, +14 more. Returns: object
list_servicesList ServicesDRead-only
List services
Inputs: sort, include, page_size, filter_name, +29 more. Returns: object
list_severitiesList SeveritiesDRead-only
List severities
Inputs: sort, include, page_size, filter_name, +25 more. Returns: object
list_shift_coverage_requestsList Shift Coverage RequestsBRead-only
List active shift coverage requests for a schedule.
Inputs: schedule_id (required). Returns: object
list_shiftsList ShiftsARead-only
List on-call shifts with reliable filtering, enrichment, and MCP-level pagination.
Unlike the raw API, this tool:
Actually filters by user_ids (client-side filtering)
Includes user_name, user_email, schedule_name, team_name
Calculates total_hours for each shift
Returns a predictable paginated result for MCP clients
Use this instead of the auto-generated listShifts when you need user filtering or dependable pagination on large tenants.
Answers questions about individual shifts: who is on call at a given time, when a handoff happens, which shifts were overrides, or one person's schedule (via user_ids). For questions about totals across a team -- hours per responder, coverage, load -- use get_oncall_schedule_summary, whose response size depends on team size rather than on how long a range you asked for.
Ranges longer than the upstream cap are split into windows and merged automatically, so a multi-month range is a normal request.
Inputs: to_date (required), from_date (required), user_ids, page_size, +3 more. Returns: object
list_status_pagesList Status PagesDRead-only
List status pages
Inputs: sort, include, page_size, filter_name, +15 more. Returns: object
list_status_page_templatesList Status Page TemplatesCRead-only
List status page templates
Inputs: status_page_id (required), include, page_size, page_number. Returns: object
list_sub_statusesList Sub StatusesDRead-only
List Sub-Statuses
Inputs: include, page_size, filter_name, filter_slug, +6 more. Returns: object
list_teamsList TeamsDRead-only
List teams
Inputs: sort, include, page_size, filter_name, +34 more. Returns: object
list_user_notification_rulesList User Notification RulesCRead-only
List user notification rules
Inputs: user_id (required), sort, include, page_size, +1 more. Returns: object
list_usersList UsersDRead-only
List users
Inputs: sort, include, page_size, page_number, +6 more. Returns: object
list_workflow_form_field_conditionsList Workflow Form Field ConditionsCRead-only
List workflow form field conditions
Inputs: workflow_id (required), include, page_size, page_number. Returns: object
list_workflow_groupsList Workflow GroupsDRead-only
List workflow groups
Inputs: include, page_size, filter_kind, filter_name, +5 more. Returns: object
list_workflow_runsList Workflow RunsCRead-only
List workflow runs
Inputs: workflow_id (required), include, page_size, page_number, +4 more. Returns: object
list_workflowsList WorkflowsDRead-only
List workflows
Inputs: sort, include, page_size, filter_name, +15 more. Returns: object
list_workflow_tasksList Workflow TasksDRead-only
List workflow tasks
Inputs: workflow_id (required), include, page_size, filter_name, +11 more. Returns: object
patch_alert_routePatch Alert RouteCIdempotent
Updates an alert route. Note: This endpoint requires access to Advanced Alert Routing. If you're unsure whether you have access to this feature, please contact Rootly customer support.
Inputs: id (required), data (required). Returns: object
search_incidentsSearch IncidentsARead-only
Search incidents with flexible pagination control.
Use page_number=0 to fetch all matching results across multiple pages. Use page_number>0 to fetch a specific page.
max_results (also accepted as limit) caps how many incidents come back
in either mode: across pages when page_number=0, and within the page
otherwise. Left unset, a single page returns page_size incidents and
page_number=0 stops at 5.
Argument caps: page_size <= 20, max_results <= 10. Values outside those bounds are clamped and reported, not rejected.
Inputs: query, page_size, max_results, page_number. Returns: object
start_investigationStart InvestigationA
Start an AI SRE investigation on one alert or incident. Then follow it with get_investigation_progress.
Inputs: rerun, alert_id, incident_id. Returns: object
suggest_solutionsSuggest SolutionsARead-only
💡 Get actionable solution recommendations from similar resolved incidents - KEY for incident response.
WHEN TO USE: • AFTER find_related_incidents to get specific resolution steps • When team is stuck on how to resolve the current incident • To speed up incident resolution with proven solutions • For training new responders on resolution patterns
Provide either incident_id OR title/description. Defaults to resolved incidents for solution mining.
Argument caps: max_solutions <= 10. Values outside the bounds are clamped and reported, not rejected.
Inputs: incident_id, max_solutions, status_filter, incident_title, +1 more. Returns: object
update_alertUpdate AlertDIdempotent
Updates an alert
Inputs: id (required), data. Returns: object
update_alert_eventUpdate Alert EventAIdempotent
Updates a specific alert event. Only alert events with kind 'note' (user-created notes) can be updated. System-generated events are immutable to maintain audit trail integrity.
Inputs: id (required), data. Returns: object
update_alert_groupUpdate Alert GroupBIdempotent
Update a specific alert group by id. Note: For enhanced functionality and future compatibility, consider using the advanced alert grouping with conditions field instead of the legacy group_by_alert_title, group_by_alert_urgency, and attributes fields.
Inputs: id (required), data (required). Returns: object
update_alert_routeUpdate Alert RouteAIdempotent
Update a specific alert route by id. Note: This endpoint requires access to Advanced Alert Routing. If you're unsure whether you have access to this feature, please contact Rootly customer support.
Asynchronous Rule Creation
For organizations with large numbers of routing rules, Rootly supports asynchronous rule processing to improve performance. When enabled, rule updates happen in the background.
Asynchronous processing is also applied automatically, whether or not it is enabled for your organization, when a request carries a rule graph too large to save within the request timeout. Size is measured in total dependent records — rules plus their condition groups, conditions and destinations — and includes the rules already on the route, not just those in the payload, so a small payload against a large route may still be processed asynchronously.
Important: Whenever rules are processed asynchronously, the rules list in the API response will not be up-to-date immediately after update. You should refetch the alert route, or poll the async rule creation status endpoint with the request_id you supplied, to confirm the rules have landed.
If you experience slow operations when managing alert routes with many rules, contact Rootly customer support to enable asynchronous rule processing for your organization.
Inputs: id (required), data (required). Returns: object
update_alert_routing_ruleUpdate Alert Routing RuleBIdempotent
Update a specific alert routing rule by id. Note: If you are an advanced alert routing user, you should use the Alert Routes endpoint instead of this endpoint. If you don't know whether you are an advanced user, please contact Rootly customer support.
Inputs: id (required), data (required). Returns: object
update_alerts_sourceUpdate Alerts SourceCIdempotent
Update a specific alert source by id
Inputs: id (required), data (required). Returns: object
update_alert_urgencyUpdate Alert UrgencyCIdempotent
Update a specific alert urgency by id
Inputs: id (required), data (required). Returns: object
update_catalogUpdate CatalogCIdempotent
Update a specific catalog by id
Inputs: id (required), data (required). Returns: object
update_catalog_entityUpdate Catalog EntityCIdempotent
Update a specific Catalog Entity by id
Inputs: id (required), data (required). Returns: object
update_catalog_entity_propertyUpdate Catalog Entity PropertyAIdempotent
Deprecated: This endpoint is deprecated, please use the fields attribute on catalog entities or native catalog endpoints (teams, services, functionalities, incident_types, causes, environments) to set field values instead.
Update a specific Catalog Entity Property by id.
Inputs: id (required), data (required). Returns: object
update_catalog_propertyUpdate Catalog PropertyCIdempotent
Update a specific catalog_property by id - returns catalog_properties type
Inputs: id (required), data (required).
update_causeUpdate CauseCIdempotent
Update a specific cause by id
Inputs: id (required), data (required). Returns: object
update_custom_fieldUpdate Custom FieldAIdempotent
[DEPRECATED] Use form field endpoints instead. Update a specific custom field by id
Inputs: id (required), data (required). Returns: object
update_custom_field_optionUpdate Custom Field OptionAIdempotent
[DEPRECATED] Use form field endpoints instead. Update a specific custom field option by id
Inputs: id (required), data (required). Returns: object
update_custom_formUpdate Custom FormCIdempotent
Update a specific custom form by id
Inputs: id (required), data (required). Returns: object
update_dashboardUpdate DashboardCIdempotent
Update a specific dashboard by id
Inputs: id (required), data (required). Returns: object
update_dashboard_panelUpdate Dashboard PanelCIdempotent
Update a specific dashboard panel by id
Inputs: id (required), data (required). Returns: object
update_environmentUpdate EnvironmentCIdempotent
Update a specific environment by id
Inputs: id (required), data (required). Returns: object
update_escalation_levelUpdate Escalation LevelBIdempotent
Update a specific escalation level by id
Inputs: id (required), data (required). Returns: object
update_escalation_pathUpdate Escalation PathCIdempotent
Update a specific escalation path by id
Inputs: id (required), data (required). Returns: object
update_escalation_policyUpdate Escalation PolicyCIdempotent
Update a specific escalation policy by id
Inputs: id (required), data (required). Returns: object
update_form_fieldUpdate Form FieldCIdempotent
Update a specific form_field by id
Inputs: id (required), data (required). Returns: object
update_form_field_optionUpdate Form Field OptionCIdempotent
Update a specific form_field_option by id
Inputs: id (required), data (required). Returns: object
update_form_field_placementUpdate Form Field PlacementCIdempotent
Update a specific form_field_placement by id
Inputs: id (required), data (required). Returns: object
update_form_field_placement_conditionUpdate Form Field Placement ConditionCIdempotent
Update a specific form_field_placement_condition by id
Inputs: id (required), data (required). Returns: object
update_form_setUpdate Form SetCIdempotent
Update a specific form_set by id
Inputs: id (required), data (required). Returns: object
update_form_set_conditionUpdate Form Set ConditionCIdempotent
Update a specific form_set_condition by id
Inputs: id (required), data (required). Returns: object
update_functionalityUpdate FunctionalityCIdempotent
Update a specific functionality by id
Inputs: id (required), data (required). Returns: object
update_heartbeatUpdate HeartbeatCIdempotent
Update a specific heartbeat by id
Inputs: id (required), data (required). Returns: object
update_incidentUpdate IncidentAIdempotent
Update native incident fields via PUT /v1/incidents/{id}.
Only the arguments you provide are sent, so unspecified fields —
including the lifecycle status — are left untouched.
Inputs: incident_id (required), title, status, summary, +14 more. Returns: object
update_incident_action_itemUpdate Incident Action ItemCIdempotent
Update a specific incident action item by id
Inputs: id (required), data (required). Returns: object
update_incident_custom_field_selectionUpdate Incident Custom Field SelectionAIdempotent
[DEPRECATED] Use form field endpoints instead. Update a specific incident custom field selection by id
Inputs: id (required), data (required). Returns: object
update_incident_form_field_selectionUpdate Incident Form Field SelectionCIdempotent
Update a specific incident form field selection by id
Inputs: id (required), data (required). Returns: object
update_incident_retrospective_stepUpdate Incident Retrospective StepCIdempotent
Update a specific incident retrospective step by id
Inputs: id (required), data (required). Returns: object
update_incident_sub_statusUpdate Incident Sub StatusCIdempotent
Update a specific incident_sub_status by id
Inputs: id (required), data (required). Returns: object
update_incident_typeUpdate Incident TypeCIdempotent
Update a specific incident_type by id
Inputs: id (required), data (required). Returns: object
update_live_call_routerUpdate Live Call RouterCIdempotent
Update a specific Live Call Router by id
Inputs: id (required), data (required). Returns: object
update_on_call_roleUpdate On Call RoleCIdempotent
Update a specific On-Call Role by id
Inputs: id (required), data (required). Returns: object
update_on_call_shadowUpdate On Call ShadowCIdempotent
Update a specific on call shadow configuration by id
Inputs: id (required), data (required). Returns: object
update_override_shiftUpdate Override ShiftCIdempotent
Update a specific override shift by id
Inputs: id (required), data (required). Returns: object
update_playbookUpdate PlaybookCIdempotent
Update a specific playbook by id
Inputs: id (required), data (required). Returns: object
update_playbook_taskUpdate Playbook TaskCIdempotent
Update a specific playbook task by id
Inputs: id (required), data (required). Returns: object
update_pulseUpdate PulseCIdempotent
Update a specific pulse by id
Inputs: id (required), data (required). Returns: object
update_retrospective_processUpdate Retrospective ProcessCIdempotent
Updates a specific retrospective process by id
Inputs: id (required), data (required). Returns: object
update_retrospective_process_groupUpdate Retrospective Process GroupCIdempotent
Update a specific Retrospective Process Group by id
Inputs: id (required), data (required). Returns: object
update_retrospective_stepUpdate Retrospective StepCIdempotent
Update a specific retrospective step by id
Inputs: id (required), data (required). Returns: object
update_scheduleUpdate ScheduleCIdempotent
Updates a specific schedule by id
Inputs: id (required), data (required). Returns: object
update_schedule_rotationUpdate Schedule RotationBIdempotent
Update a specific schedule rotation by id
Inputs: id (required), data (required). Returns: object
update_serviceUpdate ServiceCIdempotent
Update a specific service by id
Inputs: id (required), data (required). Returns: object
update_severityUpdate SeverityCIdempotent
Update a specific severity by id
Inputs: id (required), data (required). Returns: object
update_status_pageUpdate Status PageCIdempotent
Update a specific status page by id
Inputs: id (required), data (required). Returns: object
update_status_page_templateUpdate Status Page TemplateCIdempotent
Update a specific template event by id
Inputs: id (required), body (required), title (required), created_at (required), +8 more. Returns: object
update_sub_statusUpdate Sub StatusCIdempotent
Update a specific Sub-Status by id
Inputs: id (required), data (required). Returns: object
update_teamUpdate TeamCIdempotent
Update a specific team by id
Inputs: id (required), data (required). Returns: object
update_workflowUpdate WorkflowCIdempotent
Update a specific workflow by id
Inputs: id (required), data (required). Returns: object
update_workflow_form_field_conditionUpdate Workflow Form Field ConditionCIdempotent
Update a specific workflow form field condition by id
Inputs: id (required), data (required). Returns: object
update_workflow_groupUpdate Workflow GroupCIdempotent
Update a specific workflow group by id
Inputs: id (required), data (required). Returns: object
update_workflow_taskUpdate Workflow TaskCIdempotent
Update a specific workflow task by id
Inputs: id (required), data (required). Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 274 tools
The set is dominated by near-duplicate surface: list_incidents vs search_incidents vs collect_incidents, list_alerts vs get_alert_by_short_id, update_alert_route vs patch_alert_route, list_alert_routes vs list_alert_routing_rules, list_escalation_levels vs list_escalation_levels_paths, list_meeting_recordings vs list_all_meeting_recordings, and a large deprecated custom_field/catalog_entity_property family that shadows the form_field endpoints. A handful of tools (list_incidents/search_incidents/collect_incidents, list_shifts/get_oncall_schedule_summary) carry good disambiguating prose, but most of the 274 entries give an agent no reliable basis for choosing among siblings.
The dominant convention is verb_noun snake_case (list_x/get_x/create_x/update_x), which is readable, but deviations accumulate: patch_alert_route alongside update_alert_route, singular/plural mismatches (get_alerts_source, create_alerts_source vs list_alerts_sources, create_alert), and purpose-verb names (search_incidents, collect_incidents, find_related_incidents, suggest_solutions, check_responder_availability, start_investigation). Individually minor, but at 274 tools the irregularities make name-based discovery unreliable.
274 tools is an extreme mismatch for any single MCP surface — it is essentially a whole REST API dumped into one server namespace, including deprecated endpoints the descriptions themselves tell you not to use. An agent cannot hold this tool list in context or select reliably from it; meaningful scoping or curated subsets would be required.
Coverage of the incident-management domain is unusually thorough: incidents, alerts and alert routing, on-call schedules/shifts/overrides, escalation policies, retrospects, workflows, forms, catalogs, status pages, audit log and observability all have read/write operations, plus higher-level agent tools (find_related_incidents, suggest_solutions, on-call health). The main gap is the near-total absence of delete/archive operations, which leaves lifecycle dead ends for resources an agent can create but not remove.
Maintenance
Related MCP Connectors
An MCP server that let you interact with Cycloid.io Internal Development Portal and Platform
Official Rewst MCP server: build, run, and debug Rewst workflows, forms, apps, and integrations.
The Cortex MCP server provides read-only access to real-time engineering context from the Cortex developer portal, allowing AI coding assistants to answer natural language questions about your organization's catalog (microservices, libraries, domains, teams, infrastructure), scorecards (engineering standards and best practices), initiatives (goals and deadlines), and Engineering Intelligence metrics. It includes tools for querying documentation, tracking personal entities, and accessing AI-assisted insights across the entire Cortex ecosystem.
The OpenRouter MCP server plugs OpenRouter into the AI tools you already use. Once connected, your assistant can pull live OpenRouter data (models, prices, your credits, rankings, and docs) and send quick test messages, all without leaving your editor.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server to expose VS Code editing features to an LLM for AI coding9561 npm392MIT

OpsLevel MCPofficial
AlicenseNot gradedqualityFmaintenanceModel Context Protocol (MCP) server for OpsLevel12MIT- FlicenseNot gradedqualityNot gradedmaintenanceA remote MCP server that provides AI agents access to the Rootly API for incident management, allowing users to query and manage incidents, alerts, teams, services, and other incident management resources through natural language.-
- AlicenseNot gradedqualityBmaintenanceMCP server for the Rootly incident management platform — alerts, incidents, on-call schedulesApache 2.0