rootly-mcp-server 2.2.16__tar.gz → 2.2.17__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.17}/CHANGELOG.md +20 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/PKG-INFO +20 -10
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/README.md +18 -8
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/pyproject.toml +3 -3
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/__main__.py +6 -3
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/uv.lock +56 -54
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.dockerignore +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.gitattributes +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.github/dependabot.yml +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.github/openapi-audit-remote-baseline.json +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.github/workflows/ci.yml +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.github/workflows/dependency-review.yml +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.github/workflows/openapi-audit.yml +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.github/workflows/pypi-release.yml +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.gitignore +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.semaphore/deploy-staging.yml +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.semaphore/deploy.yml +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.semaphore/semaphore.yml +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.semaphore/update-task-definition.sh +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/CONTRIBUTING.md +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/Dockerfile +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/LICENSE +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/examples/skills/README.md +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/gemini-extension.json +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/rootly-mcp-server-demo.gif +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/rootly_openapi.json +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/scripts/audit_openapi.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/scripts/setup-hooks.sh +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/server.json +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/__init__.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/client.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/code_mode.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/data/__init__.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/exceptions.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/legacy_server.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/mcp_error.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/monitoring.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/och_client.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/pagination.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/payload_stripping.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/security.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/server.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/server_defaults.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/smart_utils.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/spec_transform.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/tools/__init__.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/tools/alerts.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/tools/incidents.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/tools/oncall.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/tools/resources.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/transport.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/utils.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/validators.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/README.md +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/conftest.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/integration/local/test_basic.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/integration/local/test_smart_tools.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/integration/remote/test_essential.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/test_client.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_alert_stripping.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_authentication.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_code_mode_module.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_exceptions.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_http_headers.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_legacy_server_module.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_main_transport.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_mcp_error_module.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_och_client.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_oncall_handoff.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_oncall_metrics.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_oncall_new_tools.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_oncall_severity_normalization.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_payload_stripping_module.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_security.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_server.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_server_defaults_module.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_smart_utils.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_tools.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_transport_module.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_utils.py +0 -0
- {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_validators.py +0 -0
|
@@ -5,6 +5,26 @@ 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.17] - Released 2026-04-14
|
|
9
|
+
|
|
10
|
+
### Fixes
|
|
11
|
+
|
|
12
|
+
- **Critical HTTP Streamable Transport Fix**: Fixed Route configuration where `stateless_http=False` caused `streamable_methods=None`, breaking the `/mcp` endpoint
|
|
13
|
+
- **Transport Reliability**: Always allow POST and DELETE methods for HTTP streamable endpoints, resolving "streamable HTTP not working" reports
|
|
14
|
+
- **Client Configuration**: Added transport flag explanation in README to prevent auto-fallback from HTTP streamable to SSE
|
|
15
|
+
|
|
16
|
+
### Security
|
|
17
|
+
|
|
18
|
+
- **Dependency Updates**: Updated `cryptography` from 46.0.6 to 46.0.7 (CVE fix)
|
|
19
|
+
- **Testing Framework**: Updated `pytest` from 8.0.0 to 9.0.3 (CVE fix)
|
|
20
|
+
- **Vulnerability Resolution**: Addressed 2 medium severity Dependabot alerts
|
|
21
|
+
|
|
22
|
+
### Documentation
|
|
23
|
+
|
|
24
|
+
- **Transport Recommendations**: Restored Streamable HTTP as recommended transport (now that it's fixed)
|
|
25
|
+
- **Configuration Examples**: Fixed Claude Code transport option from `http-only` to `http`
|
|
26
|
+
- **User Guidance**: Added explanatory notes for forcing HTTP streamable transport in clients
|
|
27
|
+
|
|
8
28
|
## [2.2.16] - Released 2026-04-13
|
|
9
29
|
|
|
10
30
|
### 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.17
|
|
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,7 @@ 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=
|
|
49
|
+
[](https://cursor.com/install-mcp?name=rootly&config=eyJ1cmwiOiJodHRwczovL21jcC5yb290bHkuY29tL21jcCIsImhlYWRlcnMiOnsiQXV0aG9yaXphdGlvbiI6IkJlYXJlciA8WU9VUl9ST09UTFlfQVBJX1RPS0VOPiJ9fQo=)
|
|
50
50
|
|
|
51
51
|
An MCP server for the [Rootly API](https://docs.rootly.com/api-reference/overview) for Cursor, Windsurf, Claude, and other MCP clients.
|
|
52
52
|
|
|
@@ -59,7 +59,7 @@ Use the hosted MCP server. No local installation required.
|
|
|
59
59
|
### Hosted Transport Options
|
|
60
60
|
|
|
61
61
|
- **Streamable HTTP (recommended):** `https://mcp.rootly.com/mcp`
|
|
62
|
-
- **SSE (
|
|
62
|
+
- **SSE (stable alternative):** `https://mcp.rootly.com/sse`
|
|
63
63
|
- **Code Mode:** `https://mcp.rootly.com/mcp-codemode`
|
|
64
64
|
|
|
65
65
|
### General Remote Setup
|
|
@@ -79,7 +79,7 @@ Default remote config (HTTP streamable):
|
|
|
79
79
|
}
|
|
80
80
|
```
|
|
81
81
|
|
|
82
|
-
SSE
|
|
82
|
+
SSE (alternative):
|
|
83
83
|
|
|
84
84
|
```json
|
|
85
85
|
{
|
|
@@ -130,7 +130,7 @@ claude mcp add rootly-codemode --transport http https://mcp.rootly.com/mcp-codem
|
|
|
130
130
|
--header "Authorization: Bearer YOUR_ROOTLY_API_TOKEN"
|
|
131
131
|
```
|
|
132
132
|
|
|
133
|
-
SSE
|
|
133
|
+
SSE (alternative):
|
|
134
134
|
|
|
135
135
|
```bash
|
|
136
136
|
claude mcp add --transport sse rootly-sse https://mcp.rootly.com/sse \
|
|
@@ -145,8 +145,8 @@ Create `.mcp.json` in your project root:
|
|
|
145
145
|
{
|
|
146
146
|
"mcpServers": {
|
|
147
147
|
"rootly": {
|
|
148
|
-
"type": "
|
|
149
|
-
"url": "https://mcp.rootly.com/
|
|
148
|
+
"type": "http",
|
|
149
|
+
"url": "https://mcp.rootly.com/mcp",
|
|
150
150
|
"headers": {
|
|
151
151
|
"Authorization": "Bearer YOUR_ROOTLY_API_TOKEN"
|
|
152
152
|
}
|
|
@@ -254,6 +254,8 @@ bearer_token_env_var = "ROOTLY_API_TOKEN"
|
|
|
254
254
|
|
|
255
255
|
Add to `claude_desktop_config.json`:
|
|
256
256
|
|
|
257
|
+
> **Note:** The `--transport http` flag ensures HTTP streamable transport is used instead of auto-falling back to SSE.
|
|
258
|
+
|
|
257
259
|
```json
|
|
258
260
|
{
|
|
259
261
|
"mcpServers": {
|
|
@@ -263,6 +265,8 @@ Add to `claude_desktop_config.json`:
|
|
|
263
265
|
"-y",
|
|
264
266
|
"mcp-remote",
|
|
265
267
|
"https://mcp.rootly.com/mcp",
|
|
268
|
+
"--transport",
|
|
269
|
+
"http",
|
|
266
270
|
"--header",
|
|
267
271
|
"Authorization: Bearer <YOUR_ROOTLY_API_TOKEN>"
|
|
268
272
|
]
|
|
@@ -394,7 +398,7 @@ docker run -p 8000:8000 \
|
|
|
394
398
|
## Features
|
|
395
399
|
|
|
396
400
|
- **Dynamic Tool Generation**: Automatically creates MCP resources from Rootly's OpenAPI (Swagger) specification
|
|
397
|
-
- **Smart Pagination**:
|
|
401
|
+
- **Smart Pagination**: Uses bounded pagination and compact incident responses to prevent context window overflow
|
|
398
402
|
- **API Filtering**: Limits exposed API endpoints for security and performance
|
|
399
403
|
- **Intelligent Incident Analysis**: Smart tools that analyze historical incident data
|
|
400
404
|
- **`find_related_incidents`**: Uses TF-IDF similarity analysis to find historically similar incidents
|
|
@@ -411,6 +415,7 @@ The default server configuration exposes **105 tools**.
|
|
|
411
415
|
|
|
412
416
|
- `check_oncall_health_risk`
|
|
413
417
|
- `check_responder_availability`
|
|
418
|
+
- `collect_incidents`
|
|
414
419
|
- `create_override_recommendation`
|
|
415
420
|
- `find_related_incidents`
|
|
416
421
|
- `getIncident` - retrieve a single incident for direct verification, including PIR-related fields
|
|
@@ -421,6 +426,7 @@ The default server configuration exposes **105 tools**.
|
|
|
421
426
|
- `get_server_version`
|
|
422
427
|
- `get_shift_incidents`
|
|
423
428
|
- `list_endpoints`
|
|
429
|
+
- `list_incidents`
|
|
424
430
|
- `list_shifts`
|
|
425
431
|
- `search_incidents`
|
|
426
432
|
- `suggest_solutions`
|
|
@@ -438,6 +444,7 @@ createEscalationPath
|
|
|
438
444
|
createEscalationPolicy
|
|
439
445
|
createFunctionality
|
|
440
446
|
createIncidentActionItem
|
|
447
|
+
createIncidentFormFieldSelection
|
|
441
448
|
createIncidentType
|
|
442
449
|
createOnCallRole
|
|
443
450
|
createOnCallShadow
|
|
@@ -462,6 +469,7 @@ getEscalationLevel
|
|
|
462
469
|
getEscalationPath
|
|
463
470
|
getEscalationPolicy
|
|
464
471
|
getFunctionality
|
|
472
|
+
getIncidentFormFieldSelection
|
|
465
473
|
getIncidentType
|
|
466
474
|
getOnCallRole
|
|
467
475
|
getOnCallShadow
|
|
@@ -483,6 +491,7 @@ listEscalationPolicies
|
|
|
483
491
|
listFunctionalities
|
|
484
492
|
listIncidentActionItems
|
|
485
493
|
listIncidentAlerts
|
|
494
|
+
listIncidentFormFieldSelections
|
|
486
495
|
listIncident_Types
|
|
487
496
|
listOnCallRoles
|
|
488
497
|
listOnCallShadows
|
|
@@ -503,6 +512,7 @@ updateEscalationLevel
|
|
|
503
512
|
updateEscalationPath
|
|
504
513
|
updateEscalationPolicy
|
|
505
514
|
updateFunctionality
|
|
515
|
+
updateIncidentFormFieldSelection
|
|
506
516
|
updateIncidentType
|
|
507
517
|
updateOnCallRole
|
|
508
518
|
updateOnCallShadow
|
|
@@ -532,7 +542,7 @@ Set the `ONCALLHEALTH_API_KEY` environment variable:
|
|
|
532
542
|
"mcpServers": {
|
|
533
543
|
"rootly": {
|
|
534
544
|
"command": "uvx",
|
|
535
|
-
"args": ["rootly-mcp-server"],
|
|
545
|
+
"args": ["--from", "rootly-mcp-server", "rootly-mcp-server"],
|
|
536
546
|
"env": {
|
|
537
547
|
"ROOTLY_API_TOKEN": "your_rootly_token",
|
|
538
548
|
"ONCALLHEALTH_API_KEY": "och_live_your_key"
|
|
@@ -4,7 +4,7 @@
|
|
|
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=
|
|
7
|
+
[](https://cursor.com/install-mcp?name=rootly&config=eyJ1cmwiOiJodHRwczovL21jcC5yb290bHkuY29tL21jcCIsImhlYWRlcnMiOnsiQXV0aG9yaXphdGlvbiI6IkJlYXJlciA8WU9VUl9ST09UTFlfQVBJX1RPS0VOPiJ9fQo=)
|
|
8
8
|
|
|
9
9
|
An MCP server for the [Rootly API](https://docs.rootly.com/api-reference/overview) for Cursor, Windsurf, Claude, and other MCP clients.
|
|
10
10
|
|
|
@@ -17,7 +17,7 @@ Use the hosted MCP server. No local installation required.
|
|
|
17
17
|
### Hosted Transport Options
|
|
18
18
|
|
|
19
19
|
- **Streamable HTTP (recommended):** `https://mcp.rootly.com/mcp`
|
|
20
|
-
- **SSE (
|
|
20
|
+
- **SSE (stable alternative):** `https://mcp.rootly.com/sse`
|
|
21
21
|
- **Code Mode:** `https://mcp.rootly.com/mcp-codemode`
|
|
22
22
|
|
|
23
23
|
### General Remote Setup
|
|
@@ -37,7 +37,7 @@ Default remote config (HTTP streamable):
|
|
|
37
37
|
}
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
SSE
|
|
40
|
+
SSE (alternative):
|
|
41
41
|
|
|
42
42
|
```json
|
|
43
43
|
{
|
|
@@ -88,7 +88,7 @@ claude mcp add rootly-codemode --transport http https://mcp.rootly.com/mcp-codem
|
|
|
88
88
|
--header "Authorization: Bearer YOUR_ROOTLY_API_TOKEN"
|
|
89
89
|
```
|
|
90
90
|
|
|
91
|
-
SSE
|
|
91
|
+
SSE (alternative):
|
|
92
92
|
|
|
93
93
|
```bash
|
|
94
94
|
claude mcp add --transport sse rootly-sse https://mcp.rootly.com/sse \
|
|
@@ -103,8 +103,8 @@ Create `.mcp.json` in your project root:
|
|
|
103
103
|
{
|
|
104
104
|
"mcpServers": {
|
|
105
105
|
"rootly": {
|
|
106
|
-
"type": "
|
|
107
|
-
"url": "https://mcp.rootly.com/
|
|
106
|
+
"type": "http",
|
|
107
|
+
"url": "https://mcp.rootly.com/mcp",
|
|
108
108
|
"headers": {
|
|
109
109
|
"Authorization": "Bearer YOUR_ROOTLY_API_TOKEN"
|
|
110
110
|
}
|
|
@@ -212,6 +212,8 @@ bearer_token_env_var = "ROOTLY_API_TOKEN"
|
|
|
212
212
|
|
|
213
213
|
Add to `claude_desktop_config.json`:
|
|
214
214
|
|
|
215
|
+
> **Note:** The `--transport http` flag ensures HTTP streamable transport is used instead of auto-falling back to SSE.
|
|
216
|
+
|
|
215
217
|
```json
|
|
216
218
|
{
|
|
217
219
|
"mcpServers": {
|
|
@@ -221,6 +223,8 @@ Add to `claude_desktop_config.json`:
|
|
|
221
223
|
"-y",
|
|
222
224
|
"mcp-remote",
|
|
223
225
|
"https://mcp.rootly.com/mcp",
|
|
226
|
+
"--transport",
|
|
227
|
+
"http",
|
|
224
228
|
"--header",
|
|
225
229
|
"Authorization: Bearer <YOUR_ROOTLY_API_TOKEN>"
|
|
226
230
|
]
|
|
@@ -352,7 +356,7 @@ docker run -p 8000:8000 \
|
|
|
352
356
|
## Features
|
|
353
357
|
|
|
354
358
|
- **Dynamic Tool Generation**: Automatically creates MCP resources from Rootly's OpenAPI (Swagger) specification
|
|
355
|
-
- **Smart Pagination**:
|
|
359
|
+
- **Smart Pagination**: Uses bounded pagination and compact incident responses to prevent context window overflow
|
|
356
360
|
- **API Filtering**: Limits exposed API endpoints for security and performance
|
|
357
361
|
- **Intelligent Incident Analysis**: Smart tools that analyze historical incident data
|
|
358
362
|
- **`find_related_incidents`**: Uses TF-IDF similarity analysis to find historically similar incidents
|
|
@@ -369,6 +373,7 @@ The default server configuration exposes **105 tools**.
|
|
|
369
373
|
|
|
370
374
|
- `check_oncall_health_risk`
|
|
371
375
|
- `check_responder_availability`
|
|
376
|
+
- `collect_incidents`
|
|
372
377
|
- `create_override_recommendation`
|
|
373
378
|
- `find_related_incidents`
|
|
374
379
|
- `getIncident` - retrieve a single incident for direct verification, including PIR-related fields
|
|
@@ -379,6 +384,7 @@ The default server configuration exposes **105 tools**.
|
|
|
379
384
|
- `get_server_version`
|
|
380
385
|
- `get_shift_incidents`
|
|
381
386
|
- `list_endpoints`
|
|
387
|
+
- `list_incidents`
|
|
382
388
|
- `list_shifts`
|
|
383
389
|
- `search_incidents`
|
|
384
390
|
- `suggest_solutions`
|
|
@@ -396,6 +402,7 @@ createEscalationPath
|
|
|
396
402
|
createEscalationPolicy
|
|
397
403
|
createFunctionality
|
|
398
404
|
createIncidentActionItem
|
|
405
|
+
createIncidentFormFieldSelection
|
|
399
406
|
createIncidentType
|
|
400
407
|
createOnCallRole
|
|
401
408
|
createOnCallShadow
|
|
@@ -420,6 +427,7 @@ getEscalationLevel
|
|
|
420
427
|
getEscalationPath
|
|
421
428
|
getEscalationPolicy
|
|
422
429
|
getFunctionality
|
|
430
|
+
getIncidentFormFieldSelection
|
|
423
431
|
getIncidentType
|
|
424
432
|
getOnCallRole
|
|
425
433
|
getOnCallShadow
|
|
@@ -441,6 +449,7 @@ listEscalationPolicies
|
|
|
441
449
|
listFunctionalities
|
|
442
450
|
listIncidentActionItems
|
|
443
451
|
listIncidentAlerts
|
|
452
|
+
listIncidentFormFieldSelections
|
|
444
453
|
listIncident_Types
|
|
445
454
|
listOnCallRoles
|
|
446
455
|
listOnCallShadows
|
|
@@ -461,6 +470,7 @@ updateEscalationLevel
|
|
|
461
470
|
updateEscalationPath
|
|
462
471
|
updateEscalationPolicy
|
|
463
472
|
updateFunctionality
|
|
473
|
+
updateIncidentFormFieldSelection
|
|
464
474
|
updateIncidentType
|
|
465
475
|
updateOnCallRole
|
|
466
476
|
updateOnCallShadow
|
|
@@ -490,7 +500,7 @@ Set the `ONCALLHEALTH_API_KEY` environment variable:
|
|
|
490
500
|
"mcpServers": {
|
|
491
501
|
"rootly": {
|
|
492
502
|
"command": "uvx",
|
|
493
|
-
"args": ["rootly-mcp-server"],
|
|
503
|
+
"args": ["--from", "rootly-mcp-server", "rootly-mcp-server"],
|
|
494
504
|
"env": {
|
|
495
505
|
"ROOTLY_API_TOKEN": "your_rootly_token",
|
|
496
506
|
"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.17"
|
|
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"]),
|
|
@@ -397,55 +397,55 @@ wheels = [
|
|
|
397
397
|
|
|
398
398
|
[[package]]
|
|
399
399
|
name = "cryptography"
|
|
400
|
-
version = "46.0.
|
|
400
|
+
version = "46.0.7"
|
|
401
401
|
source = { registry = "https://pypi.org/simple" }
|
|
402
402
|
dependencies = [
|
|
403
403
|
{ name = "cffi", marker = "platform_python_implementation != 'PyPy'" },
|
|
404
404
|
]
|
|
405
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
406
|
-
wheels = [
|
|
407
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
408
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
409
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
410
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
411
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
412
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
413
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
414
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
415
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
416
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
417
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
418
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
419
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
420
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
421
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
422
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
423
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
424
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
425
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
426
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
427
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
428
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
429
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
430
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
431
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
432
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
433
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
434
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
435
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
436
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
437
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
438
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
439
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
440
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
441
|
-
{ url = "https://files.pythonhosted.org/packages/01/
|
|
442
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
443
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
444
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
445
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
446
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
447
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
448
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
405
|
+
sdist = { url = "https://files.pythonhosted.org/packages/47/93/ac8f3d5ff04d54bc814e961a43ae5b0b146154c89c61b47bb07557679b18/cryptography-46.0.7.tar.gz", hash = "sha256:e4cfd68c5f3e0bfdad0d38e023239b96a2fe84146481852dffbcca442c245aa5", size = 750652, upload-time = "2026-04-08T01:57:54.692Z" }
|
|
406
|
+
wheels = [
|
|
407
|
+
{ url = "https://files.pythonhosted.org/packages/0b/5d/4a8f770695d73be252331e60e526291e3df0c9b27556a90a6b47bccca4c2/cryptography-46.0.7-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:ea42cbe97209df307fdc3b155f1b6fa2577c0defa8f1f7d3be7d31d189108ad4", size = 7179869, upload-time = "2026-04-08T01:56:17.157Z" },
|
|
408
|
+
{ url = "https://files.pythonhosted.org/packages/5f/45/6d80dc379b0bbc1f9d1e429f42e4cb9e1d319c7a8201beffd967c516ea01/cryptography-46.0.7-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b36a4695e29fe69215d75960b22577197aca3f7a25b9cf9d165dcfe9d80bc325", size = 4275492, upload-time = "2026-04-08T01:56:19.36Z" },
|
|
409
|
+
{ url = "https://files.pythonhosted.org/packages/4a/9a/1765afe9f572e239c3469f2cb429f3ba7b31878c893b246b4b2994ffe2fe/cryptography-46.0.7-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5ad9ef796328c5e3c4ceed237a183f5d41d21150f972455a9d926593a1dcb308", size = 4426670, upload-time = "2026-04-08T01:56:21.415Z" },
|
|
410
|
+
{ url = "https://files.pythonhosted.org/packages/8f/3e/af9246aaf23cd4ee060699adab1e47ced3f5f7e7a8ffdd339f817b446462/cryptography-46.0.7-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:73510b83623e080a2c35c62c15298096e2a5dc8d51c3b4e1740211839d0dea77", size = 4280275, upload-time = "2026-04-08T01:56:23.539Z" },
|
|
411
|
+
{ url = "https://files.pythonhosted.org/packages/0f/54/6bbbfc5efe86f9d71041827b793c24811a017c6ac0fd12883e4caa86b8ed/cryptography-46.0.7-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:cbd5fb06b62bd0721e1170273d3f4d5a277044c47ca27ee257025146c34cbdd1", size = 4928402, upload-time = "2026-04-08T01:56:25.624Z" },
|
|
412
|
+
{ url = "https://files.pythonhosted.org/packages/2d/cf/054b9d8220f81509939599c8bdbc0c408dbd2bdd41688616a20731371fe0/cryptography-46.0.7-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:420b1e4109cc95f0e5700eed79908cef9268265c773d3a66f7af1eef53d409ef", size = 4459985, upload-time = "2026-04-08T01:56:27.309Z" },
|
|
413
|
+
{ url = "https://files.pythonhosted.org/packages/f9/46/4e4e9c6040fb01c7467d47217d2f882daddeb8828f7df800cb806d8a2288/cryptography-46.0.7-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:24402210aa54baae71d99441d15bb5a1919c195398a87b563df84468160a65de", size = 3990652, upload-time = "2026-04-08T01:56:29.095Z" },
|
|
414
|
+
{ url = "https://files.pythonhosted.org/packages/36/5f/313586c3be5a2fbe87e4c9a254207b860155a8e1f3cca99f9910008e7d08/cryptography-46.0.7-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:8a469028a86f12eb7d2fe97162d0634026d92a21f3ae0ac87ed1c4a447886c83", size = 4279805, upload-time = "2026-04-08T01:56:30.928Z" },
|
|
415
|
+
{ url = "https://files.pythonhosted.org/packages/69/33/60dfc4595f334a2082749673386a4d05e4f0cf4df8248e63b2c3437585f2/cryptography-46.0.7-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9694078c5d44c157ef3162e3bf3946510b857df5a3955458381d1c7cfc143ddb", size = 4892883, upload-time = "2026-04-08T01:56:32.614Z" },
|
|
416
|
+
{ url = "https://files.pythonhosted.org/packages/c7/0b/333ddab4270c4f5b972f980adef4faa66951a4aaf646ca067af597f15563/cryptography-46.0.7-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:42a1e5f98abb6391717978baf9f90dc28a743b7d9be7f0751a6f56a75d14065b", size = 4459756, upload-time = "2026-04-08T01:56:34.306Z" },
|
|
417
|
+
{ url = "https://files.pythonhosted.org/packages/d2/14/633913398b43b75f1234834170947957c6b623d1701ffc7a9600da907e89/cryptography-46.0.7-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:91bbcb08347344f810cbe49065914fe048949648f6bd5c2519f34619142bbe85", size = 4410244, upload-time = "2026-04-08T01:56:35.977Z" },
|
|
418
|
+
{ url = "https://files.pythonhosted.org/packages/10/f2/19ceb3b3dc14009373432af0c13f46aa08e3ce334ec6eff13492e1812ccd/cryptography-46.0.7-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5d1c02a14ceb9148cc7816249f64f623fbfee39e8c03b3650d842ad3f34d637e", size = 4674868, upload-time = "2026-04-08T01:56:38.034Z" },
|
|
419
|
+
{ url = "https://files.pythonhosted.org/packages/1a/bb/a5c213c19ee94b15dfccc48f363738633a493812687f5567addbcbba9f6f/cryptography-46.0.7-cp311-abi3-win32.whl", hash = "sha256:d23c8ca48e44ee015cd0a54aeccdf9f09004eba9fc96f38c911011d9ff1bd457", size = 3026504, upload-time = "2026-04-08T01:56:39.666Z" },
|
|
420
|
+
{ url = "https://files.pythonhosted.org/packages/2b/02/7788f9fefa1d060ca68717c3901ae7fffa21ee087a90b7f23c7a603c32ae/cryptography-46.0.7-cp311-abi3-win_amd64.whl", hash = "sha256:397655da831414d165029da9bc483bed2fe0e75dde6a1523ec2fe63f3c46046b", size = 3488363, upload-time = "2026-04-08T01:56:41.893Z" },
|
|
421
|
+
{ url = "https://files.pythonhosted.org/packages/7b/56/15619b210e689c5403bb0540e4cb7dbf11a6bf42e483b7644e471a2812b3/cryptography-46.0.7-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:d151173275e1728cf7839aaa80c34fe550c04ddb27b34f48c232193df8db5842", size = 7119671, upload-time = "2026-04-08T01:56:44Z" },
|
|
422
|
+
{ url = "https://files.pythonhosted.org/packages/74/66/e3ce040721b0b5599e175ba91ab08884c75928fbeb74597dd10ef13505d2/cryptography-46.0.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:db0f493b9181c7820c8134437eb8b0b4792085d37dbb24da050476ccb664e59c", size = 4268551, upload-time = "2026-04-08T01:56:46.071Z" },
|
|
423
|
+
{ url = "https://files.pythonhosted.org/packages/03/11/5e395f961d6868269835dee1bafec6a1ac176505a167f68b7d8818431068/cryptography-46.0.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ebd6daf519b9f189f85c479427bbd6e9c9037862cf8fe89ee35503bd209ed902", size = 4408887, upload-time = "2026-04-08T01:56:47.718Z" },
|
|
424
|
+
{ url = "https://files.pythonhosted.org/packages/40/53/8ed1cf4c3b9c8e611e7122fb56f1c32d09e1fff0f1d77e78d9ff7c82653e/cryptography-46.0.7-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:b7b412817be92117ec5ed95f880defe9cf18a832e8cafacf0a22337dc1981b4d", size = 4271354, upload-time = "2026-04-08T01:56:49.312Z" },
|
|
425
|
+
{ url = "https://files.pythonhosted.org/packages/50/46/cf71e26025c2e767c5609162c866a78e8a2915bbcfa408b7ca495c6140c4/cryptography-46.0.7-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:fbfd0e5f273877695cb93baf14b185f4878128b250cc9f8e617ea0c025dfb022", size = 4905845, upload-time = "2026-04-08T01:56:50.916Z" },
|
|
426
|
+
{ url = "https://files.pythonhosted.org/packages/c0/ea/01276740375bac6249d0a971ebdf6b4dc9ead0ee0a34ef3b5a88c1a9b0d4/cryptography-46.0.7-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:ffca7aa1d00cf7d6469b988c581598f2259e46215e0140af408966a24cf086ce", size = 4444641, upload-time = "2026-04-08T01:56:52.882Z" },
|
|
427
|
+
{ url = "https://files.pythonhosted.org/packages/3d/4c/7d258f169ae71230f25d9f3d06caabcff8c3baf0978e2b7d65e0acac3827/cryptography-46.0.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:60627cf07e0d9274338521205899337c5d18249db56865f943cbe753aa96f40f", size = 3967749, upload-time = "2026-04-08T01:56:54.597Z" },
|
|
428
|
+
{ url = "https://files.pythonhosted.org/packages/b5/2a/2ea0767cad19e71b3530e4cad9605d0b5e338b6a1e72c37c9c1ceb86c333/cryptography-46.0.7-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:80406c3065e2c55d7f49a9550fe0c49b3f12e5bfff5dedb727e319e1afb9bf99", size = 4270942, upload-time = "2026-04-08T01:56:56.416Z" },
|
|
429
|
+
{ url = "https://files.pythonhosted.org/packages/41/3d/fe14df95a83319af25717677e956567a105bb6ab25641acaa093db79975d/cryptography-46.0.7-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:c5b1ccd1239f48b7151a65bc6dd54bcfcc15e028c8ac126d3fada09db0e07ef1", size = 4871079, upload-time = "2026-04-08T01:56:58.31Z" },
|
|
430
|
+
{ url = "https://files.pythonhosted.org/packages/9c/59/4a479e0f36f8f378d397f4eab4c850b4ffb79a2f0d58704b8fa0703ddc11/cryptography-46.0.7-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:d5f7520159cd9c2154eb61eb67548ca05c5774d39e9c2c4339fd793fe7d097b2", size = 4443999, upload-time = "2026-04-08T01:57:00.508Z" },
|
|
431
|
+
{ url = "https://files.pythonhosted.org/packages/28/17/b59a741645822ec6d04732b43c5d35e4ef58be7bfa84a81e5ae6f05a1d33/cryptography-46.0.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fcd8eac50d9138c1d7fc53a653ba60a2bee81a505f9f8850b6b2888555a45d0e", size = 4399191, upload-time = "2026-04-08T01:57:02.654Z" },
|
|
432
|
+
{ url = "https://files.pythonhosted.org/packages/59/6a/bb2e166d6d0e0955f1e9ff70f10ec4b2824c9cfcdb4da772c7dd69cc7d80/cryptography-46.0.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:65814c60f8cc400c63131584e3e1fad01235edba2614b61fbfbfa954082db0ee", size = 4655782, upload-time = "2026-04-08T01:57:04.592Z" },
|
|
433
|
+
{ url = "https://files.pythonhosted.org/packages/95/b6/3da51d48415bcb63b00dc17c2eff3a651b7c4fed484308d0f19b30e8cb2c/cryptography-46.0.7-cp314-cp314t-win32.whl", hash = "sha256:fdd1736fed309b4300346f88f74cd120c27c56852c3838cab416e7a166f67298", size = 3002227, upload-time = "2026-04-08T01:57:06.91Z" },
|
|
434
|
+
{ url = "https://files.pythonhosted.org/packages/32/a8/9f0e4ed57ec9cebe506e58db11ae472972ecb0c659e4d52bbaee80ca340a/cryptography-46.0.7-cp314-cp314t-win_amd64.whl", hash = "sha256:e06acf3c99be55aa3b516397fe42f5855597f430add9c17fa46bf2e0fb34c9bb", size = 3475332, upload-time = "2026-04-08T01:57:08.807Z" },
|
|
435
|
+
{ url = "https://files.pythonhosted.org/packages/a7/7f/cd42fc3614386bc0c12f0cb3c4ae1fc2bbca5c9662dfed031514911d513d/cryptography-46.0.7-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:462ad5cb1c148a22b2e3bcc5ad52504dff325d17daf5df8d88c17dda1f75f2a4", size = 7165618, upload-time = "2026-04-08T01:57:10.645Z" },
|
|
436
|
+
{ url = "https://files.pythonhosted.org/packages/a5/d0/36a49f0262d2319139d2829f773f1b97ef8aef7f97e6e5bd21455e5a8fb5/cryptography-46.0.7-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:84d4cced91f0f159a7ddacad249cc077e63195c36aac40b4150e7a57e84fffe7", size = 4270628, upload-time = "2026-04-08T01:57:12.885Z" },
|
|
437
|
+
{ url = "https://files.pythonhosted.org/packages/8a/6c/1a42450f464dda6ffbe578a911f773e54dd48c10f9895a23a7e88b3e7db5/cryptography-46.0.7-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:128c5edfe5e5938b86b03941e94fac9ee793a94452ad1365c9fc3f4f62216832", size = 4415405, upload-time = "2026-04-08T01:57:14.923Z" },
|
|
438
|
+
{ url = "https://files.pythonhosted.org/packages/9a/92/4ed714dbe93a066dc1f4b4581a464d2d7dbec9046f7c8b7016f5286329e2/cryptography-46.0.7-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5e51be372b26ef4ba3de3c167cd3d1022934bc838ae9eaad7e644986d2a3d163", size = 4272715, upload-time = "2026-04-08T01:57:16.638Z" },
|
|
439
|
+
{ url = "https://files.pythonhosted.org/packages/b7/e6/a26b84096eddd51494bba19111f8fffe976f6a09f132706f8f1bf03f51f7/cryptography-46.0.7-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:cdf1a610ef82abb396451862739e3fc93b071c844399e15b90726ef7470eeaf2", size = 4918400, upload-time = "2026-04-08T01:57:19.021Z" },
|
|
440
|
+
{ url = "https://files.pythonhosted.org/packages/c7/08/ffd537b605568a148543ac3c2b239708ae0bd635064bab41359252ef88ed/cryptography-46.0.7-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1d25aee46d0c6f1a501adcddb2d2fee4b979381346a78558ed13e50aa8a59067", size = 4450634, upload-time = "2026-04-08T01:57:21.185Z" },
|
|
441
|
+
{ url = "https://files.pythonhosted.org/packages/16/01/0cd51dd86ab5b9befe0d031e276510491976c3a80e9f6e31810cce46c4ad/cryptography-46.0.7-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:cdfbe22376065ffcf8be74dc9a909f032df19bc58a699456a21712d6e5eabfd0", size = 3985233, upload-time = "2026-04-08T01:57:22.862Z" },
|
|
442
|
+
{ url = "https://files.pythonhosted.org/packages/92/49/819d6ed3a7d9349c2939f81b500a738cb733ab62fbecdbc1e38e83d45e12/cryptography-46.0.7-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:abad9dac36cbf55de6eb49badd4016806b3165d396f64925bf2999bcb67837ba", size = 4271955, upload-time = "2026-04-08T01:57:24.814Z" },
|
|
443
|
+
{ url = "https://files.pythonhosted.org/packages/80/07/ad9b3c56ebb95ed2473d46df0847357e01583f4c52a85754d1a55e29e4d0/cryptography-46.0.7-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:935ce7e3cfdb53e3536119a542b839bb94ec1ad081013e9ab9b7cfd478b05006", size = 4879888, upload-time = "2026-04-08T01:57:26.88Z" },
|
|
444
|
+
{ url = "https://files.pythonhosted.org/packages/b8/c7/201d3d58f30c4c2bdbe9b03844c291feb77c20511cc3586daf7edc12a47b/cryptography-46.0.7-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:35719dc79d4730d30f1c2b6474bd6acda36ae2dfae1e3c16f2051f215df33ce0", size = 4449961, upload-time = "2026-04-08T01:57:29.068Z" },
|
|
445
|
+
{ url = "https://files.pythonhosted.org/packages/a5/ef/649750cbf96f3033c3c976e112265c33906f8e462291a33d77f90356548c/cryptography-46.0.7-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7bbc6ccf49d05ac8f7d7b5e2e2c33830d4fe2061def88210a126d130d7f71a85", size = 4401696, upload-time = "2026-04-08T01:57:31.029Z" },
|
|
446
|
+
{ url = "https://files.pythonhosted.org/packages/41/52/a8908dcb1a389a459a29008c29966c1d552588d4ae6d43f3a1a4512e0ebe/cryptography-46.0.7-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a1529d614f44b863a7b480c6d000fe93b59acee9c82ffa027cfadc77521a9f5e", size = 4664256, upload-time = "2026-04-08T01:57:33.144Z" },
|
|
447
|
+
{ url = "https://files.pythonhosted.org/packages/4b/fa/f0ab06238e899cc3fb332623f337a7364f36f4bb3f2534c2bb95a35b132c/cryptography-46.0.7-cp38-abi3-win32.whl", hash = "sha256:f247c8c1a1fb45e12586afbb436ef21ff1e80670b2861a90353d9b025583d246", size = 3013001, upload-time = "2026-04-08T01:57:34.933Z" },
|
|
448
|
+
{ url = "https://files.pythonhosted.org/packages/d2/f1/00ce3bde3ca542d1acd8f8cfa38e446840945aa6363f9b74746394b14127/cryptography-46.0.7-cp38-abi3-win_amd64.whl", hash = "sha256:506c4ff91eff4f82bdac7633318a526b1d1309fc07ca76a3ad182cb5b686d6d3", size = 3472985, upload-time = "2026-04-08T01:57:36.714Z" },
|
|
449
449
|
]
|
|
450
450
|
|
|
451
451
|
[[package]]
|
|
@@ -1450,29 +1450,31 @@ wheels = [
|
|
|
1450
1450
|
|
|
1451
1451
|
[[package]]
|
|
1452
1452
|
name = "pytest"
|
|
1453
|
-
version = "
|
|
1453
|
+
version = "9.0.3"
|
|
1454
1454
|
source = { registry = "https://pypi.org/simple" }
|
|
1455
1455
|
dependencies = [
|
|
1456
1456
|
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
|
1457
1457
|
{ name = "iniconfig" },
|
|
1458
1458
|
{ name = "packaging" },
|
|
1459
1459
|
{ name = "pluggy" },
|
|
1460
|
+
{ name = "pygments" },
|
|
1460
1461
|
]
|
|
1461
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1462
|
+
sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" }
|
|
1462
1463
|
wheels = [
|
|
1463
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1464
|
+
{ url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" },
|
|
1464
1465
|
]
|
|
1465
1466
|
|
|
1466
1467
|
[[package]]
|
|
1467
1468
|
name = "pytest-asyncio"
|
|
1468
|
-
version = "1.
|
|
1469
|
+
version = "1.3.0"
|
|
1469
1470
|
source = { registry = "https://pypi.org/simple" }
|
|
1470
1471
|
dependencies = [
|
|
1471
1472
|
{ name = "pytest" },
|
|
1473
|
+
{ name = "typing-extensions", marker = "python_full_version < '3.13'" },
|
|
1472
1474
|
]
|
|
1473
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1475
|
+
sdist = { url = "https://files.pythonhosted.org/packages/90/2c/8af215c0f776415f3590cac4f9086ccefd6fd463befeae41cd4d3f193e5a/pytest_asyncio-1.3.0.tar.gz", hash = "sha256:d7f52f36d231b80ee124cd216ffb19369aa168fc10095013c6b014a34d3ee9e5", size = 50087, upload-time = "2025-11-10T16:07:47.256Z" }
|
|
1474
1476
|
wheels = [
|
|
1475
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1477
|
+
{ url = "https://files.pythonhosted.org/packages/e5/35/f8b19922b6a25bc0880171a2f1a003eaeb93657475193ab516fd87cac9da/pytest_asyncio-1.3.0-py3-none-any.whl", hash = "sha256:611e26147c7f77640e6d0a92a38ed17c3e9848063698d5c93d5aa7aa11cebff5", size = 15075, upload-time = "2025-11-10T16:07:45.537Z" },
|
|
1476
1478
|
]
|
|
1477
1479
|
|
|
1478
1480
|
[[package]]
|
|
@@ -1700,7 +1702,7 @@ wheels = [
|
|
|
1700
1702
|
|
|
1701
1703
|
[[package]]
|
|
1702
1704
|
name = "rootly-mcp-server"
|
|
1703
|
-
version = "2.2.
|
|
1705
|
+
version = "2.2.16"
|
|
1704
1706
|
source = { editable = "." }
|
|
1705
1707
|
dependencies = [
|
|
1706
1708
|
{ name = "authlib" },
|
|
@@ -1748,7 +1750,7 @@ requires-dist = [
|
|
|
1748
1750
|
{ name = "bandit", marker = "extra == 'dev'", specifier = ">=1.7.0" },
|
|
1749
1751
|
{ name = "black", marker = "extra == 'dev'", specifier = ">=26.3.1" },
|
|
1750
1752
|
{ name = "brotli", specifier = ">=1.2.0" },
|
|
1751
|
-
{ name = "cryptography", specifier = ">=46.0.
|
|
1753
|
+
{ name = "cryptography", specifier = ">=46.0.7" },
|
|
1752
1754
|
{ name = "fastmcp", extras = ["code-mode"], specifier = "==3.2.0" },
|
|
1753
1755
|
{ name = "httpx", specifier = "==0.28.1" },
|
|
1754
1756
|
{ name = "isort", marker = "extra == 'dev'", specifier = ">=5.0.0" },
|
|
@@ -1769,7 +1771,7 @@ dev = [
|
|
|
1769
1771
|
{ name = "mypy", specifier = ">=1.0.0" },
|
|
1770
1772
|
{ name = "pip-audit", specifier = ">=2.7.0" },
|
|
1771
1773
|
{ name = "pyright", specifier = ">=1.1.404" },
|
|
1772
|
-
{ name = "pytest", specifier = ">=
|
|
1774
|
+
{ name = "pytest", specifier = ">=9.0.3" },
|
|
1773
1775
|
{ name = "pytest-asyncio", specifier = ">=0.23.0" },
|
|
1774
1776
|
{ name = "pytest-cov", specifier = ">=4.0.0" },
|
|
1775
1777
|
{ name = "pytest-mock", specifier = ">=3.12.0" },
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.github/openapi-audit-remote-baseline.json
RENAMED
|
File without changes
|
|
File without changes
|
{rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.github/workflows/dependency-review.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/data/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/legacy_server.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/payload_stripping.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/server_defaults.py
RENAMED
|
File without changes
|
|
File without changes
|
{rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/spec_transform.py
RENAMED
|
File without changes
|
{rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/tools/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/tools/incidents.py
RENAMED
|
File without changes
|
|
File without changes
|
{rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/tools/resources.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/integration/local/test_smart_tools.py
RENAMED
|
File without changes
|
{rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/integration/remote/test_essential.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_legacy_server_module.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_payload_stripping_module.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_server_defaults_module.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|