rootly-mcp-server 2.2.16__tar.gz → 2.2.18__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/CHANGELOG.md +44 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/PKG-INFO +55 -11
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/README.md +53 -9
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/pyproject.toml +3 -3
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/__main__.py +6 -3
- rootly_mcp_server-2.2.18/src/rootly_mcp_server/data/chatgpt_incident_workbench.html +576 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/server.py +8 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/server_defaults.py +2 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/tools/__init__.py +2 -0
- rootly_mcp_server-2.2.18/src/rootly_mcp_server/tools/chatgpt_app.py +350 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/tools/incidents.py +139 -123
- rootly_mcp_server-2.2.18/tests/unit/test_chatgpt_app_module.py +229 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_server.py +13 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_server_defaults_module.py +2 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/uv.lock +56 -54
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/.dockerignore +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/.gitattributes +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/.github/dependabot.yml +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/.github/openapi-audit-remote-baseline.json +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/.github/workflows/ci.yml +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/.github/workflows/dependency-review.yml +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/.github/workflows/openapi-audit.yml +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/.github/workflows/pypi-release.yml +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/.gitignore +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/.semaphore/deploy-staging.yml +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/.semaphore/deploy.yml +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/.semaphore/semaphore.yml +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/.semaphore/update-task-definition.sh +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/CONTRIBUTING.md +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/Dockerfile +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/LICENSE +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/examples/skills/README.md +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/gemini-extension.json +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/rootly-mcp-server-demo.gif +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/rootly_openapi.json +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/scripts/audit_openapi.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/scripts/setup-hooks.sh +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/server.json +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/__init__.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/client.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/code_mode.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/data/__init__.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/exceptions.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/legacy_server.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/mcp_error.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/monitoring.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/och_client.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/pagination.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/payload_stripping.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/security.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/smart_utils.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/spec_transform.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/tools/alerts.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/tools/oncall.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/tools/resources.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/transport.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/utils.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/validators.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/README.md +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/conftest.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/integration/local/test_basic.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/integration/local/test_smart_tools.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/integration/remote/test_essential.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/test_client.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_alert_stripping.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_authentication.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_code_mode_module.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_exceptions.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_http_headers.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_legacy_server_module.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_main_transport.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_mcp_error_module.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_och_client.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_oncall_handoff.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_oncall_metrics.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_oncall_new_tools.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_oncall_severity_normalization.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_payload_stripping_module.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_security.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_smart_utils.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_tools.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_transport_module.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_utils.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_validators.py +0 -0
|
@@ -5,6 +5,50 @@ All notable changes to the Rootly MCP Server will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [2.2.18] - Released 2026-04-15
|
|
9
|
+
|
|
10
|
+
### Features
|
|
11
|
+
|
|
12
|
+
- **Workflow Task Tools**: Added complete workflow task management tools to enable creation, listing, retrieval, and updating of workflow actions/tasks
|
|
13
|
+
- **Enhanced Workflow Functionality**: Users can now build complete functional workflows instead of just workflow shells
|
|
14
|
+
|
|
15
|
+
### New Tools
|
|
16
|
+
|
|
17
|
+
- `createWorkflowTask` - Create new workflow actions (POST `/v1/workflows/{workflow_id}/workflow_tasks`)
|
|
18
|
+
- `listWorkflowTasks` - List all actions in a workflow (GET `/v1/workflows/{workflow_id}/workflow_tasks`)
|
|
19
|
+
- `getWorkflowTask` - Retrieve specific workflow action details (GET `/v1/workflow_tasks/{id}`)
|
|
20
|
+
- `updateWorkflowTask` - Modify existing workflow actions (PUT `/v1/workflow_tasks/{id}`)
|
|
21
|
+
|
|
22
|
+
### Documentation
|
|
23
|
+
|
|
24
|
+
- **Tool Count Updated**: Increased from 105 to 109 tools reflecting new workflow task capabilities
|
|
25
|
+
- **Tool List Updated**: Added workflow task tools to OpenAPI-generated tools section
|
|
26
|
+
- **Badge Cleanup**: Removed broken Cursor install badge
|
|
27
|
+
|
|
28
|
+
### Security
|
|
29
|
+
|
|
30
|
+
- **Delete Operations**: `deleteWorkflowTask` remains intentionally excluded following security policy for destructive operations
|
|
31
|
+
|
|
32
|
+
## [2.2.17] - Released 2026-04-14
|
|
33
|
+
|
|
34
|
+
### Fixes
|
|
35
|
+
|
|
36
|
+
- **Critical HTTP Streamable Transport Fix**: Fixed Route configuration where `stateless_http=False` caused `streamable_methods=None`, breaking the `/mcp` endpoint
|
|
37
|
+
- **Transport Reliability**: Always allow POST and DELETE methods for HTTP streamable endpoints, resolving "streamable HTTP not working" reports
|
|
38
|
+
- **Client Configuration**: Added transport flag explanation in README to prevent auto-fallback from HTTP streamable to SSE
|
|
39
|
+
|
|
40
|
+
### Security
|
|
41
|
+
|
|
42
|
+
- **Dependency Updates**: Updated `cryptography` from 46.0.6 to 46.0.7 (CVE fix)
|
|
43
|
+
- **Testing Framework**: Updated `pytest` from 8.0.0 to 9.0.3 (CVE fix)
|
|
44
|
+
- **Vulnerability Resolution**: Addressed 2 medium severity Dependabot alerts
|
|
45
|
+
|
|
46
|
+
### Documentation
|
|
47
|
+
|
|
48
|
+
- **Transport Recommendations**: Restored Streamable HTTP as recommended transport (now that it's fixed)
|
|
49
|
+
- **Configuration Examples**: Fixed Claude Code transport option from `http-only` to `http`
|
|
50
|
+
- **User Guidance**: Added explanatory notes for forcing HTTP streamable transport in clients
|
|
51
|
+
|
|
8
52
|
## [2.2.16] - Released 2026-04-13
|
|
9
53
|
|
|
10
54
|
### Enhanced
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: rootly-mcp-server
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.18
|
|
4
4
|
Summary: Secure Model Context Protocol server for Rootly APIs with AI SRE capabilities, comprehensive error handling, and input validation
|
|
5
5
|
Project-URL: Homepage, https://github.com/Rootly-AI-Labs/Rootly-MCP-server
|
|
6
6
|
Project-URL: Issues, https://github.com/Rootly-AI-Labs/Rootly-MCP-server/issues
|
|
@@ -23,7 +23,7 @@ Classifier: Topic :: System :: Systems Administration
|
|
|
23
23
|
Requires-Python: >=3.12
|
|
24
24
|
Requires-Dist: authlib>=1.6.9
|
|
25
25
|
Requires-Dist: brotli>=1.2.0
|
|
26
|
-
Requires-Dist: cryptography>=46.0.
|
|
26
|
+
Requires-Dist: cryptography>=46.0.7
|
|
27
27
|
Requires-Dist: fastmcp[code-mode]==3.2.0
|
|
28
28
|
Requires-Dist: httpx==0.28.1
|
|
29
29
|
Requires-Dist: numpy>=1.24.0
|
|
@@ -46,7 +46,6 @@ Description-Content-Type: text/markdown
|
|
|
46
46
|
[](https://pypi.org/project/rootly-mcp-server/)
|
|
47
47
|
[](https://pypi.org/project/rootly-mcp-server/)
|
|
48
48
|
[](https://pypi.org/project/rootly-mcp-server/)
|
|
49
|
-
[](https://cursor.com/install-mcp?name=rootly&config=eyJ1cmwiOiJodHRwczovL21jcC5yb290bHkuY29tL3NzZSIsImhlYWRlcnMiOnsiQXV0aG9yaXphdGlvbiI6IkJlYXJlciA8WU9VUl9ST09UTFlfQVBJX1RPS0VOPiJ9fQ==)
|
|
50
49
|
|
|
51
50
|
An MCP server for the [Rootly API](https://docs.rootly.com/api-reference/overview) for Cursor, Windsurf, Claude, and other MCP clients.
|
|
52
51
|
|
|
@@ -59,7 +58,7 @@ Use the hosted MCP server. No local installation required.
|
|
|
59
58
|
### Hosted Transport Options
|
|
60
59
|
|
|
61
60
|
- **Streamable HTTP (recommended):** `https://mcp.rootly.com/mcp`
|
|
62
|
-
- **SSE (
|
|
61
|
+
- **SSE (stable alternative):** `https://mcp.rootly.com/sse`
|
|
63
62
|
- **Code Mode:** `https://mcp.rootly.com/mcp-codemode`
|
|
64
63
|
|
|
65
64
|
### General Remote Setup
|
|
@@ -79,7 +78,7 @@ Default remote config (HTTP streamable):
|
|
|
79
78
|
}
|
|
80
79
|
```
|
|
81
80
|
|
|
82
|
-
SSE
|
|
81
|
+
SSE (alternative):
|
|
83
82
|
|
|
84
83
|
```json
|
|
85
84
|
{
|
|
@@ -130,7 +129,7 @@ claude mcp add rootly-codemode --transport http https://mcp.rootly.com/mcp-codem
|
|
|
130
129
|
--header "Authorization: Bearer YOUR_ROOTLY_API_TOKEN"
|
|
131
130
|
```
|
|
132
131
|
|
|
133
|
-
SSE
|
|
132
|
+
SSE (alternative):
|
|
134
133
|
|
|
135
134
|
```bash
|
|
136
135
|
claude mcp add --transport sse rootly-sse https://mcp.rootly.com/sse \
|
|
@@ -145,8 +144,8 @@ Create `.mcp.json` in your project root:
|
|
|
145
144
|
{
|
|
146
145
|
"mcpServers": {
|
|
147
146
|
"rootly": {
|
|
148
|
-
"type": "
|
|
149
|
-
"url": "https://mcp.rootly.com/
|
|
147
|
+
"type": "http",
|
|
148
|
+
"url": "https://mcp.rootly.com/mcp",
|
|
150
149
|
"headers": {
|
|
151
150
|
"Authorization": "Bearer YOUR_ROOTLY_API_TOKEN"
|
|
152
151
|
}
|
|
@@ -254,6 +253,8 @@ bearer_token_env_var = "ROOTLY_API_TOKEN"
|
|
|
254
253
|
|
|
255
254
|
Add to `claude_desktop_config.json`:
|
|
256
255
|
|
|
256
|
+
> **Note:** The `--transport http` flag ensures HTTP streamable transport is used instead of auto-falling back to SSE.
|
|
257
|
+
|
|
257
258
|
```json
|
|
258
259
|
{
|
|
259
260
|
"mcpServers": {
|
|
@@ -263,6 +264,8 @@ Add to `claude_desktop_config.json`:
|
|
|
263
264
|
"-y",
|
|
264
265
|
"mcp-remote",
|
|
265
266
|
"https://mcp.rootly.com/mcp",
|
|
267
|
+
"--transport",
|
|
268
|
+
"http",
|
|
266
269
|
"--header",
|
|
267
270
|
"Authorization: Bearer <YOUR_ROOTLY_API_TOKEN>"
|
|
268
271
|
]
|
|
@@ -273,6 +276,36 @@ Add to `claude_desktop_config.json`:
|
|
|
273
276
|
|
|
274
277
|
</details>
|
|
275
278
|
|
|
279
|
+
## ChatGPT App Starter
|
|
280
|
+
|
|
281
|
+
The server now includes a built-in ChatGPT app surface for incident exploration.
|
|
282
|
+
|
|
283
|
+
- **Model-visible app tool:** `open_rootly_incident_workbench`
|
|
284
|
+
- **App-only detail tool:** `get_rootly_incident_detail`
|
|
285
|
+
- **UI resource:** `ui://rootly/incident-workbench.html`
|
|
286
|
+
|
|
287
|
+
This gives ChatGPT a visual Rootly incident workbench without needing a separate backend.
|
|
288
|
+
|
|
289
|
+
### What it does
|
|
290
|
+
|
|
291
|
+
- Applies structured incident filters such as team, time range, severity, and status
|
|
292
|
+
- Collects a bounded set of incident summaries for the widget
|
|
293
|
+
- Lets the widget open a detailed incident pane without exposing the detail tool to the model
|
|
294
|
+
|
|
295
|
+
### Try it in ChatGPT Developer Mode
|
|
296
|
+
|
|
297
|
+
Once the MCP server is connected in ChatGPT Developer Mode, try prompts like:
|
|
298
|
+
|
|
299
|
+
- `Open the Rootly incident workbench for Infrastructure incidents from the last 7 days`
|
|
300
|
+
- `Show me resolved critical incidents for Infrastructure from April 1 through April 13`
|
|
301
|
+
- `Open the Rootly incident workbench for database timeout incidents`
|
|
302
|
+
|
|
303
|
+
### Production auth note
|
|
304
|
+
|
|
305
|
+
For internal testing and developer-mode setups, the existing bearer-token flow is enough.
|
|
306
|
+
|
|
307
|
+
For a public ChatGPT app that exposes customer-specific data or write actions, plan to add OAuth 2.1 support on the MCP side before submission. The current Rootly MCP server forwards bearer tokens, but public Apps SDK submissions expect OAuth 2.1-compatible MCP authorization metadata and token verification.
|
|
308
|
+
|
|
276
309
|
## Rootly CLI
|
|
277
310
|
|
|
278
311
|
Standalone CLI for incidents, alerts, services, and on-call operations.
|
|
@@ -394,7 +427,7 @@ docker run -p 8000:8000 \
|
|
|
394
427
|
## Features
|
|
395
428
|
|
|
396
429
|
- **Dynamic Tool Generation**: Automatically creates MCP resources from Rootly's OpenAPI (Swagger) specification
|
|
397
|
-
- **Smart Pagination**:
|
|
430
|
+
- **Smart Pagination**: Uses bounded pagination and compact incident responses to prevent context window overflow
|
|
398
431
|
- **API Filtering**: Limits exposed API endpoints for security and performance
|
|
399
432
|
- **Intelligent Incident Analysis**: Smart tools that analyze historical incident data
|
|
400
433
|
- **`find_related_incidents`**: Uses TF-IDF similarity analysis to find historically similar incidents
|
|
@@ -405,12 +438,13 @@ docker run -p 8000:8000 \
|
|
|
405
438
|
|
|
406
439
|
## Supported Tools
|
|
407
440
|
|
|
408
|
-
The default server configuration exposes **
|
|
441
|
+
The default server configuration exposes **110 tools**.
|
|
409
442
|
|
|
410
443
|
### Custom Agentic Tools
|
|
411
444
|
|
|
412
445
|
- `check_oncall_health_risk`
|
|
413
446
|
- `check_responder_availability`
|
|
447
|
+
- `collect_incidents`
|
|
414
448
|
- `create_override_recommendation`
|
|
415
449
|
- `find_related_incidents`
|
|
416
450
|
- `getIncident` - retrieve a single incident for direct verification, including PIR-related fields
|
|
@@ -421,7 +455,9 @@ The default server configuration exposes **105 tools**.
|
|
|
421
455
|
- `get_server_version`
|
|
422
456
|
- `get_shift_incidents`
|
|
423
457
|
- `list_endpoints`
|
|
458
|
+
- `list_incidents`
|
|
424
459
|
- `list_shifts`
|
|
460
|
+
- `open_rootly_incident_workbench`
|
|
425
461
|
- `search_incidents`
|
|
426
462
|
- `suggest_solutions`
|
|
427
463
|
- `updateIncident` - scoped incident update tool for `summary` and `retrospective_progress_status`
|
|
@@ -438,6 +474,7 @@ createEscalationPath
|
|
|
438
474
|
createEscalationPolicy
|
|
439
475
|
createFunctionality
|
|
440
476
|
createIncidentActionItem
|
|
477
|
+
createIncidentFormFieldSelection
|
|
441
478
|
createIncidentType
|
|
442
479
|
createOnCallRole
|
|
443
480
|
createOnCallShadow
|
|
@@ -450,6 +487,7 @@ createService
|
|
|
450
487
|
createSeverity
|
|
451
488
|
createTeam
|
|
452
489
|
createWorkflow
|
|
490
|
+
createWorkflowTask
|
|
453
491
|
deleteEscalationLevel
|
|
454
492
|
deleteEscalationPath
|
|
455
493
|
deleteEscalationPolicy
|
|
@@ -462,6 +500,7 @@ getEscalationLevel
|
|
|
462
500
|
getEscalationPath
|
|
463
501
|
getEscalationPolicy
|
|
464
502
|
getFunctionality
|
|
503
|
+
getIncidentFormFieldSelection
|
|
465
504
|
getIncidentType
|
|
466
505
|
getOnCallRole
|
|
467
506
|
getOnCallShadow
|
|
@@ -474,6 +513,7 @@ getSeverity
|
|
|
474
513
|
getTeam
|
|
475
514
|
getUser
|
|
476
515
|
getWorkflow
|
|
516
|
+
getWorkflowTask
|
|
477
517
|
listAlerts
|
|
478
518
|
listEnvironments
|
|
479
519
|
listEscalationLevels
|
|
@@ -483,6 +523,7 @@ listEscalationPolicies
|
|
|
483
523
|
listFunctionalities
|
|
484
524
|
listIncidentActionItems
|
|
485
525
|
listIncidentAlerts
|
|
526
|
+
listIncidentFormFieldSelections
|
|
486
527
|
listIncident_Types
|
|
487
528
|
listOnCallRoles
|
|
488
529
|
listOnCallShadows
|
|
@@ -497,12 +538,14 @@ listShifts
|
|
|
497
538
|
listTeams
|
|
498
539
|
listUsers
|
|
499
540
|
listWorkflows
|
|
541
|
+
listWorkflowTasks
|
|
500
542
|
updateAlert
|
|
501
543
|
updateEnvironment
|
|
502
544
|
updateEscalationLevel
|
|
503
545
|
updateEscalationPath
|
|
504
546
|
updateEscalationPolicy
|
|
505
547
|
updateFunctionality
|
|
548
|
+
updateIncidentFormFieldSelection
|
|
506
549
|
updateIncidentType
|
|
507
550
|
updateOnCallRole
|
|
508
551
|
updateOnCallShadow
|
|
@@ -514,6 +557,7 @@ updateSeverity
|
|
|
514
557
|
updateTeam
|
|
515
558
|
updateUser
|
|
516
559
|
updateWorkflow
|
|
560
|
+
updateWorkflowTask
|
|
517
561
|
```
|
|
518
562
|
|
|
519
563
|
Delete operations are intentionally scoped to screenshot coverage paths:
|
|
@@ -532,7 +576,7 @@ Set the `ONCALLHEALTH_API_KEY` environment variable:
|
|
|
532
576
|
"mcpServers": {
|
|
533
577
|
"rootly": {
|
|
534
578
|
"command": "uvx",
|
|
535
|
-
"args": ["rootly-mcp-server"],
|
|
579
|
+
"args": ["--from", "rootly-mcp-server", "rootly-mcp-server"],
|
|
536
580
|
"env": {
|
|
537
581
|
"ROOTLY_API_TOKEN": "your_rootly_token",
|
|
538
582
|
"ONCALLHEALTH_API_KEY": "och_live_your_key"
|
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
[](https://pypi.org/project/rootly-mcp-server/)
|
|
5
5
|
[](https://pypi.org/project/rootly-mcp-server/)
|
|
6
6
|
[](https://pypi.org/project/rootly-mcp-server/)
|
|
7
|
-
[](https://cursor.com/install-mcp?name=rootly&config=eyJ1cmwiOiJodHRwczovL21jcC5yb290bHkuY29tL3NzZSIsImhlYWRlcnMiOnsiQXV0aG9yaXphdGlvbiI6IkJlYXJlciA8WU9VUl9ST09UTFlfQVBJX1RPS0VOPiJ9fQ==)
|
|
8
7
|
|
|
9
8
|
An MCP server for the [Rootly API](https://docs.rootly.com/api-reference/overview) for Cursor, Windsurf, Claude, and other MCP clients.
|
|
10
9
|
|
|
@@ -17,7 +16,7 @@ Use the hosted MCP server. No local installation required.
|
|
|
17
16
|
### Hosted Transport Options
|
|
18
17
|
|
|
19
18
|
- **Streamable HTTP (recommended):** `https://mcp.rootly.com/mcp`
|
|
20
|
-
- **SSE (
|
|
19
|
+
- **SSE (stable alternative):** `https://mcp.rootly.com/sse`
|
|
21
20
|
- **Code Mode:** `https://mcp.rootly.com/mcp-codemode`
|
|
22
21
|
|
|
23
22
|
### General Remote Setup
|
|
@@ -37,7 +36,7 @@ Default remote config (HTTP streamable):
|
|
|
37
36
|
}
|
|
38
37
|
```
|
|
39
38
|
|
|
40
|
-
SSE
|
|
39
|
+
SSE (alternative):
|
|
41
40
|
|
|
42
41
|
```json
|
|
43
42
|
{
|
|
@@ -88,7 +87,7 @@ claude mcp add rootly-codemode --transport http https://mcp.rootly.com/mcp-codem
|
|
|
88
87
|
--header "Authorization: Bearer YOUR_ROOTLY_API_TOKEN"
|
|
89
88
|
```
|
|
90
89
|
|
|
91
|
-
SSE
|
|
90
|
+
SSE (alternative):
|
|
92
91
|
|
|
93
92
|
```bash
|
|
94
93
|
claude mcp add --transport sse rootly-sse https://mcp.rootly.com/sse \
|
|
@@ -103,8 +102,8 @@ Create `.mcp.json` in your project root:
|
|
|
103
102
|
{
|
|
104
103
|
"mcpServers": {
|
|
105
104
|
"rootly": {
|
|
106
|
-
"type": "
|
|
107
|
-
"url": "https://mcp.rootly.com/
|
|
105
|
+
"type": "http",
|
|
106
|
+
"url": "https://mcp.rootly.com/mcp",
|
|
108
107
|
"headers": {
|
|
109
108
|
"Authorization": "Bearer YOUR_ROOTLY_API_TOKEN"
|
|
110
109
|
}
|
|
@@ -212,6 +211,8 @@ bearer_token_env_var = "ROOTLY_API_TOKEN"
|
|
|
212
211
|
|
|
213
212
|
Add to `claude_desktop_config.json`:
|
|
214
213
|
|
|
214
|
+
> **Note:** The `--transport http` flag ensures HTTP streamable transport is used instead of auto-falling back to SSE.
|
|
215
|
+
|
|
215
216
|
```json
|
|
216
217
|
{
|
|
217
218
|
"mcpServers": {
|
|
@@ -221,6 +222,8 @@ Add to `claude_desktop_config.json`:
|
|
|
221
222
|
"-y",
|
|
222
223
|
"mcp-remote",
|
|
223
224
|
"https://mcp.rootly.com/mcp",
|
|
225
|
+
"--transport",
|
|
226
|
+
"http",
|
|
224
227
|
"--header",
|
|
225
228
|
"Authorization: Bearer <YOUR_ROOTLY_API_TOKEN>"
|
|
226
229
|
]
|
|
@@ -231,6 +234,36 @@ Add to `claude_desktop_config.json`:
|
|
|
231
234
|
|
|
232
235
|
</details>
|
|
233
236
|
|
|
237
|
+
## ChatGPT App Starter
|
|
238
|
+
|
|
239
|
+
The server now includes a built-in ChatGPT app surface for incident exploration.
|
|
240
|
+
|
|
241
|
+
- **Model-visible app tool:** `open_rootly_incident_workbench`
|
|
242
|
+
- **App-only detail tool:** `get_rootly_incident_detail`
|
|
243
|
+
- **UI resource:** `ui://rootly/incident-workbench.html`
|
|
244
|
+
|
|
245
|
+
This gives ChatGPT a visual Rootly incident workbench without needing a separate backend.
|
|
246
|
+
|
|
247
|
+
### What it does
|
|
248
|
+
|
|
249
|
+
- Applies structured incident filters such as team, time range, severity, and status
|
|
250
|
+
- Collects a bounded set of incident summaries for the widget
|
|
251
|
+
- Lets the widget open a detailed incident pane without exposing the detail tool to the model
|
|
252
|
+
|
|
253
|
+
### Try it in ChatGPT Developer Mode
|
|
254
|
+
|
|
255
|
+
Once the MCP server is connected in ChatGPT Developer Mode, try prompts like:
|
|
256
|
+
|
|
257
|
+
- `Open the Rootly incident workbench for Infrastructure incidents from the last 7 days`
|
|
258
|
+
- `Show me resolved critical incidents for Infrastructure from April 1 through April 13`
|
|
259
|
+
- `Open the Rootly incident workbench for database timeout incidents`
|
|
260
|
+
|
|
261
|
+
### Production auth note
|
|
262
|
+
|
|
263
|
+
For internal testing and developer-mode setups, the existing bearer-token flow is enough.
|
|
264
|
+
|
|
265
|
+
For a public ChatGPT app that exposes customer-specific data or write actions, plan to add OAuth 2.1 support on the MCP side before submission. The current Rootly MCP server forwards bearer tokens, but public Apps SDK submissions expect OAuth 2.1-compatible MCP authorization metadata and token verification.
|
|
266
|
+
|
|
234
267
|
## Rootly CLI
|
|
235
268
|
|
|
236
269
|
Standalone CLI for incidents, alerts, services, and on-call operations.
|
|
@@ -352,7 +385,7 @@ docker run -p 8000:8000 \
|
|
|
352
385
|
## Features
|
|
353
386
|
|
|
354
387
|
- **Dynamic Tool Generation**: Automatically creates MCP resources from Rootly's OpenAPI (Swagger) specification
|
|
355
|
-
- **Smart Pagination**:
|
|
388
|
+
- **Smart Pagination**: Uses bounded pagination and compact incident responses to prevent context window overflow
|
|
356
389
|
- **API Filtering**: Limits exposed API endpoints for security and performance
|
|
357
390
|
- **Intelligent Incident Analysis**: Smart tools that analyze historical incident data
|
|
358
391
|
- **`find_related_incidents`**: Uses TF-IDF similarity analysis to find historically similar incidents
|
|
@@ -363,12 +396,13 @@ docker run -p 8000:8000 \
|
|
|
363
396
|
|
|
364
397
|
## Supported Tools
|
|
365
398
|
|
|
366
|
-
The default server configuration exposes **
|
|
399
|
+
The default server configuration exposes **110 tools**.
|
|
367
400
|
|
|
368
401
|
### Custom Agentic Tools
|
|
369
402
|
|
|
370
403
|
- `check_oncall_health_risk`
|
|
371
404
|
- `check_responder_availability`
|
|
405
|
+
- `collect_incidents`
|
|
372
406
|
- `create_override_recommendation`
|
|
373
407
|
- `find_related_incidents`
|
|
374
408
|
- `getIncident` - retrieve a single incident for direct verification, including PIR-related fields
|
|
@@ -379,7 +413,9 @@ The default server configuration exposes **105 tools**.
|
|
|
379
413
|
- `get_server_version`
|
|
380
414
|
- `get_shift_incidents`
|
|
381
415
|
- `list_endpoints`
|
|
416
|
+
- `list_incidents`
|
|
382
417
|
- `list_shifts`
|
|
418
|
+
- `open_rootly_incident_workbench`
|
|
383
419
|
- `search_incidents`
|
|
384
420
|
- `suggest_solutions`
|
|
385
421
|
- `updateIncident` - scoped incident update tool for `summary` and `retrospective_progress_status`
|
|
@@ -396,6 +432,7 @@ createEscalationPath
|
|
|
396
432
|
createEscalationPolicy
|
|
397
433
|
createFunctionality
|
|
398
434
|
createIncidentActionItem
|
|
435
|
+
createIncidentFormFieldSelection
|
|
399
436
|
createIncidentType
|
|
400
437
|
createOnCallRole
|
|
401
438
|
createOnCallShadow
|
|
@@ -408,6 +445,7 @@ createService
|
|
|
408
445
|
createSeverity
|
|
409
446
|
createTeam
|
|
410
447
|
createWorkflow
|
|
448
|
+
createWorkflowTask
|
|
411
449
|
deleteEscalationLevel
|
|
412
450
|
deleteEscalationPath
|
|
413
451
|
deleteEscalationPolicy
|
|
@@ -420,6 +458,7 @@ getEscalationLevel
|
|
|
420
458
|
getEscalationPath
|
|
421
459
|
getEscalationPolicy
|
|
422
460
|
getFunctionality
|
|
461
|
+
getIncidentFormFieldSelection
|
|
423
462
|
getIncidentType
|
|
424
463
|
getOnCallRole
|
|
425
464
|
getOnCallShadow
|
|
@@ -432,6 +471,7 @@ getSeverity
|
|
|
432
471
|
getTeam
|
|
433
472
|
getUser
|
|
434
473
|
getWorkflow
|
|
474
|
+
getWorkflowTask
|
|
435
475
|
listAlerts
|
|
436
476
|
listEnvironments
|
|
437
477
|
listEscalationLevels
|
|
@@ -441,6 +481,7 @@ listEscalationPolicies
|
|
|
441
481
|
listFunctionalities
|
|
442
482
|
listIncidentActionItems
|
|
443
483
|
listIncidentAlerts
|
|
484
|
+
listIncidentFormFieldSelections
|
|
444
485
|
listIncident_Types
|
|
445
486
|
listOnCallRoles
|
|
446
487
|
listOnCallShadows
|
|
@@ -455,12 +496,14 @@ listShifts
|
|
|
455
496
|
listTeams
|
|
456
497
|
listUsers
|
|
457
498
|
listWorkflows
|
|
499
|
+
listWorkflowTasks
|
|
458
500
|
updateAlert
|
|
459
501
|
updateEnvironment
|
|
460
502
|
updateEscalationLevel
|
|
461
503
|
updateEscalationPath
|
|
462
504
|
updateEscalationPolicy
|
|
463
505
|
updateFunctionality
|
|
506
|
+
updateIncidentFormFieldSelection
|
|
464
507
|
updateIncidentType
|
|
465
508
|
updateOnCallRole
|
|
466
509
|
updateOnCallShadow
|
|
@@ -472,6 +515,7 @@ updateSeverity
|
|
|
472
515
|
updateTeam
|
|
473
516
|
updateUser
|
|
474
517
|
updateWorkflow
|
|
518
|
+
updateWorkflowTask
|
|
475
519
|
```
|
|
476
520
|
|
|
477
521
|
Delete operations are intentionally scoped to screenshot coverage paths:
|
|
@@ -490,7 +534,7 @@ Set the `ONCALLHEALTH_API_KEY` environment variable:
|
|
|
490
534
|
"mcpServers": {
|
|
491
535
|
"rootly": {
|
|
492
536
|
"command": "uvx",
|
|
493
|
-
"args": ["rootly-mcp-server"],
|
|
537
|
+
"args": ["--from", "rootly-mcp-server", "rootly-mcp-server"],
|
|
494
538
|
"env": {
|
|
495
539
|
"ROOTLY_API_TOKEN": "your_rootly_token",
|
|
496
540
|
"ONCALLHEALTH_API_KEY": "och_live_your_key"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "rootly-mcp-server"
|
|
3
|
-
version = "2.2.
|
|
3
|
+
version = "2.2.18"
|
|
4
4
|
description = "Secure Model Context Protocol server for Rootly APIs with AI SRE capabilities, comprehensive error handling, and input validation"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.12"
|
|
@@ -38,7 +38,7 @@ classifiers = [
|
|
|
38
38
|
dependencies = [
|
|
39
39
|
"fastmcp[code-mode]==3.2.0", # Pin to patched version with Code Mode support
|
|
40
40
|
"authlib>=1.6.9", # Override vulnerable transitive authlib from fastmcp
|
|
41
|
-
"cryptography>=46.0.
|
|
41
|
+
"cryptography>=46.0.7", # Override vulnerable transitive cryptography
|
|
42
42
|
"Pygments>=2.20.0", # Override vulnerable transitive Pygments
|
|
43
43
|
"requests==2.33.1", # Pin to patched version
|
|
44
44
|
"httpx==0.28.1", # Pin to specific version
|
|
@@ -85,7 +85,7 @@ dev = [
|
|
|
85
85
|
dev-dependencies = [
|
|
86
86
|
"pyright>=1.1.404",
|
|
87
87
|
"ruff>=0.7.3",
|
|
88
|
-
"pytest>=
|
|
88
|
+
"pytest>=9.0.3",
|
|
89
89
|
"pytest-cov>=4.0.0", # Coverage reporting
|
|
90
90
|
"pytest-asyncio>=0.23.0", # Async testing support
|
|
91
91
|
"pytest-mock>=3.12.0", # Mocking utilities
|
|
@@ -203,8 +203,10 @@ def get_server():
|
|
|
203
203
|
)
|
|
204
204
|
|
|
205
205
|
|
|
206
|
-
# Create the server instance for FastMCP CLI (follows quickstart pattern)
|
|
207
|
-
|
|
206
|
+
# Create the server instance for FastMCP CLI (follows quickstart pattern).
|
|
207
|
+
# Avoid eager construction when executing `python -m rootly_mcp_server`, because
|
|
208
|
+
# CLI flags like `--hosted` and `--transport` are parsed later in `main()`.
|
|
209
|
+
mcp = get_server() if __name__ != "__main__" else None
|
|
208
210
|
|
|
209
211
|
|
|
210
212
|
def run_dual_http_server(
|
|
@@ -254,7 +256,8 @@ def run_dual_http_server(
|
|
|
254
256
|
stateless=stateless_http,
|
|
255
257
|
)
|
|
256
258
|
streamable_http_app = StreamableHTTPASGIApp(session_manager)
|
|
257
|
-
|
|
259
|
+
# Always allow POST for streamable HTTP - stateless mode only affects session persistence
|
|
260
|
+
streamable_methods = ["POST", "DELETE"]
|
|
258
261
|
|
|
259
262
|
routes = [
|
|
260
263
|
Route(sse_path, endpoint=sse_endpoint, methods=["GET"]),
|