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.
Files changed (84) hide show
  1. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/CHANGELOG.md +44 -0
  2. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/PKG-INFO +55 -11
  3. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/README.md +53 -9
  4. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/pyproject.toml +3 -3
  5. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/__main__.py +6 -3
  6. rootly_mcp_server-2.2.18/src/rootly_mcp_server/data/chatgpt_incident_workbench.html +576 -0
  7. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/server.py +8 -0
  8. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/server_defaults.py +2 -0
  9. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/tools/__init__.py +2 -0
  10. rootly_mcp_server-2.2.18/src/rootly_mcp_server/tools/chatgpt_app.py +350 -0
  11. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/tools/incidents.py +139 -123
  12. rootly_mcp_server-2.2.18/tests/unit/test_chatgpt_app_module.py +229 -0
  13. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_server.py +13 -0
  14. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_server_defaults_module.py +2 -0
  15. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/uv.lock +56 -54
  16. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/.dockerignore +0 -0
  17. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/.gitattributes +0 -0
  18. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/.github/dependabot.yml +0 -0
  19. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/.github/openapi-audit-remote-baseline.json +0 -0
  20. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/.github/workflows/ci.yml +0 -0
  21. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/.github/workflows/dependency-review.yml +0 -0
  22. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/.github/workflows/openapi-audit.yml +0 -0
  23. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/.github/workflows/pypi-release.yml +0 -0
  24. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/.gitignore +0 -0
  25. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/.semaphore/deploy-staging.yml +0 -0
  26. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/.semaphore/deploy.yml +0 -0
  27. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/.semaphore/semaphore.yml +0 -0
  28. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/.semaphore/update-task-definition.sh +0 -0
  29. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/CONTRIBUTING.md +0 -0
  30. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/Dockerfile +0 -0
  31. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/LICENSE +0 -0
  32. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/examples/skills/README.md +0 -0
  33. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/gemini-extension.json +0 -0
  34. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/rootly-mcp-server-demo.gif +0 -0
  35. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/rootly_openapi.json +0 -0
  36. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/scripts/audit_openapi.py +0 -0
  37. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/scripts/setup-hooks.sh +0 -0
  38. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/server.json +0 -0
  39. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/__init__.py +0 -0
  40. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/client.py +0 -0
  41. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/code_mode.py +0 -0
  42. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/data/__init__.py +0 -0
  43. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/exceptions.py +0 -0
  44. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/legacy_server.py +0 -0
  45. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/mcp_error.py +0 -0
  46. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/monitoring.py +0 -0
  47. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/och_client.py +0 -0
  48. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/pagination.py +0 -0
  49. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/payload_stripping.py +0 -0
  50. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/security.py +0 -0
  51. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/smart_utils.py +0 -0
  52. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/spec_transform.py +0 -0
  53. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/tools/alerts.py +0 -0
  54. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/tools/oncall.py +0 -0
  55. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/tools/resources.py +0 -0
  56. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/transport.py +0 -0
  57. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/utils.py +0 -0
  58. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/src/rootly_mcp_server/validators.py +0 -0
  59. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/README.md +0 -0
  60. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/conftest.py +0 -0
  61. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/integration/local/test_basic.py +0 -0
  62. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/integration/local/test_smart_tools.py +0 -0
  63. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/integration/remote/test_essential.py +0 -0
  64. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/test_client.py +0 -0
  65. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_alert_stripping.py +0 -0
  66. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_authentication.py +0 -0
  67. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_code_mode_module.py +0 -0
  68. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_exceptions.py +0 -0
  69. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_http_headers.py +0 -0
  70. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_legacy_server_module.py +0 -0
  71. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_main_transport.py +0 -0
  72. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_mcp_error_module.py +0 -0
  73. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_och_client.py +0 -0
  74. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_oncall_handoff.py +0 -0
  75. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_oncall_metrics.py +0 -0
  76. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_oncall_new_tools.py +0 -0
  77. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_oncall_severity_normalization.py +0 -0
  78. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_payload_stripping_module.py +0 -0
  79. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_security.py +0 -0
  80. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_smart_utils.py +0 -0
  81. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_tools.py +0 -0
  82. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_transport_module.py +0 -0
  83. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.18}/tests/unit/test_utils.py +0 -0
  84. {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.16
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.6
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
  [![PyPI version](https://badge.fury.io/py/rootly-mcp-server.svg)](https://pypi.org/project/rootly-mcp-server/)
47
47
  [![PyPI - Downloads](https://img.shields.io/pypi/dm/rootly-mcp-server)](https://pypi.org/project/rootly-mcp-server/)
48
48
  [![Python Version](https://img.shields.io/pypi/pyversions/rootly-mcp-server.svg)](https://pypi.org/project/rootly-mcp-server/)
49
- [![Install MCP Server](https://cursor.com/deeplink/mcp-install-dark.svg)](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 (fallback):** `https://mcp.rootly.com/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 fallback:
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 fallback:
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": "sse",
149
- "url": "https://mcp.rootly.com/sse",
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**: Defaults to 10 items per request for incident endpoints to prevent context window overflow
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 **105 tools**.
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
  [![PyPI version](https://badge.fury.io/py/rootly-mcp-server.svg)](https://pypi.org/project/rootly-mcp-server/)
5
5
  [![PyPI - Downloads](https://img.shields.io/pypi/dm/rootly-mcp-server)](https://pypi.org/project/rootly-mcp-server/)
6
6
  [![Python Version](https://img.shields.io/pypi/pyversions/rootly-mcp-server.svg)](https://pypi.org/project/rootly-mcp-server/)
7
- [![Install MCP Server](https://cursor.com/deeplink/mcp-install-dark.svg)](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 (fallback):** `https://mcp.rootly.com/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 fallback:
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 fallback:
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": "sse",
107
- "url": "https://mcp.rootly.com/sse",
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**: Defaults to 10 items per request for incident endpoints to prevent context window overflow
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 **105 tools**.
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.16"
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.6", # Override vulnerable transitive cryptography
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>=8.0.0",
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
- mcp = get_server()
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
- streamable_methods = ["POST", "DELETE"] if stateless_http else None
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"]),