Atlas / MCP servers / rootly-ai-labs / Rootly

RootlyBLOCK

mcp/rootly-ai-labs/rootly

Rootly MCP server

Verdict
BLOCK
Grade
F
Trust score
58 /100
Exposed tools
—
Transport
sse · stdio · streamable-http
License
Apache-2.0
Stars
45
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

[](https://pypi.org/project/rootly-mcp-server/) [](https://pypi.org/project/rootly-mcp-server/) [](https://pypi.org/project/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/mcp
  • SSE (stable alternative): https://mcp.rootly.com/sse
  • Code Mode: https://mcp.rootly.com/mcp-codemode

Hosted tool profiles:

  • Full (default): use the URLs above as-is
  • Slim (~70 tools): add ?tool_profile=slim to the hosted URL, for example https://mcp.rootly.com/mcp?tool_profile=slim
  • Header alternative: send X-Rootly-Tool-Profile: slim
  • Server-wide default: set ROOTLY_MCP_HOSTED_TOOL_PROFILE=full|slim
  • Exact custom override: set 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"
}
}
}
}

SSE (alternative):

{
"mcpServers": {
"rootly": {
"url": "https://mcp.rootly.com/sse"
}
}
}

Code Mode:

``

Read from source at commit 829427cf8b02OBSERVED · 2026-10-08
Advertisement
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code (pypi)
claude mcp add rootly-mcp-server --env ROOTLY_API_TOKEN=${ROOTLY_API_TOKEN} -- None rootly-mcp-server==2.2.9
03

Trust audit

BLOCKgrade F · trust 58/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (1 observation(s))
Network
declared (7 observation(s))
Shell
none-observed
Dependencies
pinned
Secrets in source
found

Findings (25)

HIGHHard-coded secrets · secret.db_uri · CWE-798, CWE-321
src/rootly_mcp_server/telemetry_scrubber.py:212
# postgres://user:pw@host -- the host stays, since it is usually the point
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
tests/unit/test_telemetry_scrubber.py:148
"postgres://svc:hunter2@db/x",
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
tests/unit/test_telemetry_scrubber.py:298
("postgres://svc:[email protected]:5432/rootly", "hunter2"),
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/unit/test_security.py:68
token = "valid_token_12345678901234567890"
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/unit/test_security.py:89
token = "test_token_12345678901234567890"
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/unit/test_telemetry_scrubber.py:397
secret = "eyJhbGciOiJIUzI1NiJ9supersecrettoken"
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
tests/unit/test_telemetry_scrubber.py:610
"$exception_list": [{"value": "token=ghp_abcdefghijklmnopqrstuvwxyz0123456789"}],
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
tests/unit/test_telemetry_scrubber.py:301
"-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKC\n-----END RSA PRIVATE KEY-----",
MEDIUMHard-coded secrets · secret.slack · CWE-798, CWE-321
tests/unit/test_telemetry_scrubber.py:256
"xoxb-1234567890-abcdef",
LOWInventory / provenance · inv.hidden_file · CWE-1104
.plugin-scanner.toml
.plugin-scanner.toml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInformation disclosure · disclose.log_secret · CWE-209, CWE-532
tests/test_client.py:173
print(f"✅ API token found: {token[:10]}...")
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/unit/test_tools.py:1462
["../../v1/users", "foo/bar", "a b", "with\\slash", "..", "seg/../seg"],
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/unit/test_tools.py:1520
result = await tools["get_incident"](incident_id="../../v1/users")
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/unit/test_tools.py:2128
result = await tools["get_incident_meeting_transcripts"](incident_id="../../etc")
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
.github/workflows/ci.yml:144
-e POSTHOG_HOST=http://127.0.0.1:9 \
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
README.md:431
Then connect an MCP client to `http://127.0.0.1:8000/mcp` and verify `tools/list` returns only:
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/integration/local/test_tool_allowlists.py:114
base_url = f"http://127.0.0.1:{port}"
LOWPrompt injection · prompt.authority_framing · CWE-94, CWE-1427
README.md:327
- **Global API Key**: Full access across the Rootly instance. Best for organization-wide visibility.
LOWPrompt injection · prompt.credential_read · CWE-94, CWE-1427
CHANGELOG.md:237
- **Upstream Token Validation**: Validated Bearer tokens against the upstream Rootly API before granting MCP access, surfacing malformed or expired credentials at the edge with clearer errors
Why it matters. asks the agent to read credentials
LOWSupply chain · prompt.pipe_to_shell · CWE-829, CWE-1357
README.md:319
curl -LsSf https://astral.sh/uv/install.sh | sh
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
CHANGELOG.md:12
- **No `session_id` parameter in hosted tool schemas**: AgentCat session correlation now runs in the SDK's hook mode (`resolve_session_id`). The server derives the session from the request (always sco
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
README.md:718
**Major Expansion**: This version includes 50+ new endpoints covering communications, dashboards, playbooks, post-incident reviews, monitoring, and advanced form management - while carefully excluding
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWInventory / provenance · mcp.no_tools_extracted · CWE-1104
server.json
Why it matters. the tool list is enumerated at runtime by tools/list, not declared in source
Fix. the page says so rather than showing an empty table
INFOInventory / provenance · inv.oversize · CWE-1104
rootly-mcp-server-demo.gif
rootly-mcp-server-demo.gif
Why it matters. 6046865 bytes not read
INFOInventory / provenance · inv.oversize · CWE-1104
rootly_openapi.json
rootly_openapi.json
Why it matters. 3250194 bytes not read

Gates applied: no_behavioural_pass.

Audited 2026-10-08 · audit v0.4.1 · source sha 829427cf8b02full audit observations/trust-audit/mcp-server/rootly-ai-labs__rootly.json · Report an issue / request a re-scan
04

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-08829427cf8b02BLOCKF58first audit
05

Questions

What is the Rootly MCP server?

Rootly MCP server

Is Rootly safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (58/100) and found 1 critical or high issue in the source. Each one is listed on this page with the file and line it is on.

What credentials does Rootly need?

It reads ONCALLHEALTH_API_KEY, POSTHOG_PROJECT_TOKEN, ROOTLY_API_TOKEN and ROOTLY_OPENAI_APPS_CHALLENGE_TOKEN from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does Rootly run?

It speaks sse, stdio and streamable-http, so it runs as a local process your client starts. It is published on PyPI as rootly-mcp-server.

How current is this page?

The grade is for one exact copy of the source (829427cf8b02), read on 2026-10-08. The repository is watched and re-audited when it changes.

Advertisement