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.
Files changed (81) hide show
  1. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/CHANGELOG.md +20 -0
  2. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/PKG-INFO +20 -10
  3. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/README.md +18 -8
  4. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/pyproject.toml +3 -3
  5. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/__main__.py +6 -3
  6. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/uv.lock +56 -54
  7. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.dockerignore +0 -0
  8. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.gitattributes +0 -0
  9. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.github/dependabot.yml +0 -0
  10. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.github/openapi-audit-remote-baseline.json +0 -0
  11. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.github/workflows/ci.yml +0 -0
  12. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.github/workflows/dependency-review.yml +0 -0
  13. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.github/workflows/openapi-audit.yml +0 -0
  14. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.github/workflows/pypi-release.yml +0 -0
  15. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.gitignore +0 -0
  16. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.semaphore/deploy-staging.yml +0 -0
  17. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.semaphore/deploy.yml +0 -0
  18. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.semaphore/semaphore.yml +0 -0
  19. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/.semaphore/update-task-definition.sh +0 -0
  20. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/CONTRIBUTING.md +0 -0
  21. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/Dockerfile +0 -0
  22. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/LICENSE +0 -0
  23. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/examples/skills/README.md +0 -0
  24. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/gemini-extension.json +0 -0
  25. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/rootly-mcp-server-demo.gif +0 -0
  26. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/rootly_openapi.json +0 -0
  27. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/scripts/audit_openapi.py +0 -0
  28. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/scripts/setup-hooks.sh +0 -0
  29. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/server.json +0 -0
  30. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/__init__.py +0 -0
  31. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/client.py +0 -0
  32. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/code_mode.py +0 -0
  33. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/data/__init__.py +0 -0
  34. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/exceptions.py +0 -0
  35. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/legacy_server.py +0 -0
  36. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/mcp_error.py +0 -0
  37. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/monitoring.py +0 -0
  38. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/och_client.py +0 -0
  39. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/pagination.py +0 -0
  40. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/payload_stripping.py +0 -0
  41. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/security.py +0 -0
  42. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/server.py +0 -0
  43. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/server_defaults.py +0 -0
  44. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/smart_utils.py +0 -0
  45. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/spec_transform.py +0 -0
  46. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/tools/__init__.py +0 -0
  47. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/tools/alerts.py +0 -0
  48. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/tools/incidents.py +0 -0
  49. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/tools/oncall.py +0 -0
  50. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/tools/resources.py +0 -0
  51. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/transport.py +0 -0
  52. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/utils.py +0 -0
  53. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/src/rootly_mcp_server/validators.py +0 -0
  54. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/README.md +0 -0
  55. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/conftest.py +0 -0
  56. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/integration/local/test_basic.py +0 -0
  57. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/integration/local/test_smart_tools.py +0 -0
  58. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/integration/remote/test_essential.py +0 -0
  59. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/test_client.py +0 -0
  60. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_alert_stripping.py +0 -0
  61. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_authentication.py +0 -0
  62. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_code_mode_module.py +0 -0
  63. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_exceptions.py +0 -0
  64. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_http_headers.py +0 -0
  65. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_legacy_server_module.py +0 -0
  66. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_main_transport.py +0 -0
  67. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_mcp_error_module.py +0 -0
  68. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_och_client.py +0 -0
  69. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_oncall_handoff.py +0 -0
  70. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_oncall_metrics.py +0 -0
  71. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_oncall_new_tools.py +0 -0
  72. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_oncall_severity_normalization.py +0 -0
  73. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_payload_stripping_module.py +0 -0
  74. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_security.py +0 -0
  75. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_server.py +0 -0
  76. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_server_defaults_module.py +0 -0
  77. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_smart_utils.py +0 -0
  78. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_tools.py +0 -0
  79. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_transport_module.py +0 -0
  80. {rootly_mcp_server-2.2.16 → rootly_mcp_server-2.2.17}/tests/unit/test_utils.py +0 -0
  81. {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.16
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.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,7 @@ 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==)
49
+ [![Install MCP Server](https://cursor.com/deeplink/mcp-install-dark.svg)](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 (fallback):** `https://mcp.rootly.com/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 fallback:
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 fallback:
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": "sse",
149
- "url": "https://mcp.rootly.com/sse",
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**: Defaults to 10 items per request for incident endpoints to prevent context window overflow
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
  [![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==)
7
+ [![Install MCP Server](https://cursor.com/deeplink/mcp-install-dark.svg)](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 (fallback):** `https://mcp.rootly.com/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 fallback:
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 fallback:
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": "sse",
107
- "url": "https://mcp.rootly.com/sse",
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**: Defaults to 10 items per request for incident endpoints to prevent context window overflow
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.16"
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.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"]),
@@ -397,55 +397,55 @@ wheels = [
397
397
 
398
398
  [[package]]
399
399
  name = "cryptography"
400
- version = "46.0.6"
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/a4/ba/04b1bd4218cbc58dc90ce967106d51582371b898690f3ae0402876cc4f34/cryptography-46.0.6.tar.gz", hash = "sha256:27550628a518c5c6c903d84f637fbecf287f6cb9ced3804838a1295dc1fd0759", size = 750542, upload-time = "2026-03-25T23:34:53.396Z" }
406
- wheels = [
407
- { url = "https://files.pythonhosted.org/packages/47/23/9285e15e3bc57325b0a72e592921983a701efc1ee8f91c06c5f0235d86d9/cryptography-46.0.6-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:64235194bad039a10bb6d2d930ab3323baaec67e2ce36215fd0952fad0930ca8", size = 7176401, upload-time = "2026-03-25T23:33:22.096Z" },
408
- { url = "https://files.pythonhosted.org/packages/60/f8/e61f8f13950ab6195b31913b42d39f0f9afc7d93f76710f299b5ec286ae6/cryptography-46.0.6-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:26031f1e5ca62fcb9d1fcb34b2b60b390d1aacaa15dc8b895a9ed00968b97b30", size = 4275275, upload-time = "2026-03-25T23:33:23.844Z" },
409
- { url = "https://files.pythonhosted.org/packages/19/69/732a736d12c2631e140be2348b4ad3d226302df63ef64d30dfdb8db7ad1c/cryptography-46.0.6-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9a693028b9cbe51b5a1136232ee8f2bc242e4e19d456ded3fa7c86e43c713b4a", size = 4425320, upload-time = "2026-03-25T23:33:25.703Z" },
410
- { url = "https://files.pythonhosted.org/packages/d4/12/123be7292674abf76b21ac1fc0e1af50661f0e5b8f0ec8285faac18eb99e/cryptography-46.0.6-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:67177e8a9f421aa2d3a170c3e56eca4e0128883cf52a071a7cbf53297f18b175", size = 4278082, upload-time = "2026-03-25T23:33:27.423Z" },
411
- { url = "https://files.pythonhosted.org/packages/5b/ba/d5e27f8d68c24951b0a484924a84c7cdaed7502bac9f18601cd357f8b1d2/cryptography-46.0.6-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:d9528b535a6c4f8ff37847144b8986a9a143585f0540fbcb1a98115b543aa463", size = 4926514, upload-time = "2026-03-25T23:33:29.206Z" },
412
- { url = "https://files.pythonhosted.org/packages/34/71/1ea5a7352ae516d5512d17babe7e1b87d9db5150b21f794b1377eac1edc0/cryptography-46.0.6-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:22259338084d6ae497a19bae5d4c66b7ca1387d3264d1c2c0e72d9e9b6a77b97", size = 4457766, upload-time = "2026-03-25T23:33:30.834Z" },
413
- { url = "https://files.pythonhosted.org/packages/01/59/562be1e653accee4fdad92c7a2e88fced26b3fdfce144047519bbebc299e/cryptography-46.0.6-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:760997a4b950ff00d418398ad73fbc91aa2894b5c1db7ccb45b4f68b42a63b3c", size = 3986535, upload-time = "2026-03-25T23:33:33.02Z" },
414
- { url = "https://files.pythonhosted.org/packages/d6/8b/b1ebfeb788bf4624d36e45ed2662b8bd43a05ff62157093c1539c1288a18/cryptography-46.0.6-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:3dfa6567f2e9e4c5dceb8ccb5a708158a2a871052fa75c8b78cb0977063f1507", size = 4277618, upload-time = "2026-03-25T23:33:34.567Z" },
415
- { url = "https://files.pythonhosted.org/packages/dd/52/a005f8eabdb28df57c20f84c44d397a755782d6ff6d455f05baa2785bd91/cryptography-46.0.6-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:cdcd3edcbc5d55757e5f5f3d330dd00007ae463a7e7aa5bf132d1f22a4b62b19", size = 4890802, upload-time = "2026-03-25T23:33:37.034Z" },
416
- { url = "https://files.pythonhosted.org/packages/ec/4d/8e7d7245c79c617d08724e2efa397737715ca0ec830ecb3c91e547302555/cryptography-46.0.6-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:d4e4aadb7fc1f88687f47ca20bb7227981b03afaae69287029da08096853b738", size = 4457425, upload-time = "2026-03-25T23:33:38.904Z" },
417
- { url = "https://files.pythonhosted.org/packages/1d/5c/f6c3596a1430cec6f949085f0e1a970638d76f81c3ea56d93d564d04c340/cryptography-46.0.6-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2b417edbe8877cda9022dde3a008e2deb50be9c407eef034aeeb3a8b11d9db3c", size = 4405530, upload-time = "2026-03-25T23:33:40.842Z" },
418
- { url = "https://files.pythonhosted.org/packages/7e/c9/9f9cea13ee2dbde070424e0c4f621c091a91ffcc504ffea5e74f0e1daeff/cryptography-46.0.6-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:380343e0653b1c9d7e1f55b52aaa2dbb2fdf2730088d48c43ca1c7c0abb7cc2f", size = 4667896, upload-time = "2026-03-25T23:33:42.781Z" },
419
- { url = "https://files.pythonhosted.org/packages/ad/b5/1895bc0821226f129bc74d00eccfc6a5969e2028f8617c09790bf89c185e/cryptography-46.0.6-cp311-abi3-win32.whl", hash = "sha256:bcb87663e1f7b075e48c3be3ecb5f0b46c8fc50b50a97cf264e7f60242dca3f2", size = 3026348, upload-time = "2026-03-25T23:33:45.021Z" },
420
- { url = "https://files.pythonhosted.org/packages/c3/f8/c9bcbf0d3e6ad288b9d9aa0b1dee04b063d19e8c4f871855a03ab3a297ab/cryptography-46.0.6-cp311-abi3-win_amd64.whl", hash = "sha256:6739d56300662c468fddb0e5e291f9b4d084bead381667b9e654c7dd81705124", size = 3483896, upload-time = "2026-03-25T23:33:46.649Z" },
421
- { url = "https://files.pythonhosted.org/packages/01/41/3a578f7fd5c70611c0aacba52cd13cb364a5dee895a5c1d467208a9380b0/cryptography-46.0.6-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:2ef9e69886cbb137c2aef9772c2e7138dc581fad4fcbcf13cc181eb5a3ab6275", size = 7117147, upload-time = "2026-03-25T23:33:48.249Z" },
422
- { url = "https://files.pythonhosted.org/packages/fa/87/887f35a6fca9dde90cad08e0de0c89263a8e59b2d2ff904fd9fcd8025b6f/cryptography-46.0.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7f417f034f91dcec1cb6c5c35b07cdbb2ef262557f701b4ecd803ee8cefed4f4", size = 4266221, upload-time = "2026-03-25T23:33:49.874Z" },
423
- { url = "https://files.pythonhosted.org/packages/aa/a8/0a90c4f0b0871e0e3d1ed126aed101328a8a57fd9fd17f00fb67e82a51ca/cryptography-46.0.6-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d24c13369e856b94892a89ddf70b332e0b70ad4a5c43cf3e9cb71d6d7ffa1f7b", size = 4408952, upload-time = "2026-03-25T23:33:52.128Z" },
424
- { url = "https://files.pythonhosted.org/packages/16/0b/b239701eb946523e4e9f329336e4ff32b1247e109cbab32d1a7b61da8ed7/cryptography-46.0.6-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:aad75154a7ac9039936d50cf431719a2f8d4ed3d3c277ac03f3339ded1a5e707", size = 4270141, upload-time = "2026-03-25T23:33:54.11Z" },
425
- { url = "https://files.pythonhosted.org/packages/0f/a8/976acdd4f0f30df7b25605f4b9d3d89295351665c2091d18224f7ad5cdbf/cryptography-46.0.6-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:3c21d92ed15e9cfc6eb64c1f5a0326db22ca9c2566ca46d845119b45b4400361", size = 4904178, upload-time = "2026-03-25T23:33:55.725Z" },
426
- { url = "https://files.pythonhosted.org/packages/b1/1b/bf0e01a88efd0e59679b69f42d4afd5bced8700bb5e80617b2d63a3741af/cryptography-46.0.6-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:4668298aef7cddeaf5c6ecc244c2302a2b8e40f384255505c22875eebb47888b", size = 4441812, upload-time = "2026-03-25T23:33:57.364Z" },
427
- { url = "https://files.pythonhosted.org/packages/bb/8b/11df86de2ea389c65aa1806f331cae145f2ed18011f30234cc10ca253de8/cryptography-46.0.6-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:8ce35b77aaf02f3b59c90b2c8a05c73bac12cea5b4e8f3fbece1f5fddea5f0ca", size = 3963923, upload-time = "2026-03-25T23:33:59.361Z" },
428
- { url = "https://files.pythonhosted.org/packages/91/e0/207fb177c3a9ef6a8108f234208c3e9e76a6aa8cf20d51932916bd43bda0/cryptography-46.0.6-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:c89eb37fae9216985d8734c1afd172ba4927f5a05cfd9bf0e4863c6d5465b013", size = 4269695, upload-time = "2026-03-25T23:34:00.909Z" },
429
- { url = "https://files.pythonhosted.org/packages/21/5e/19f3260ed1e95bced52ace7501fabcd266df67077eeb382b79c81729d2d3/cryptography-46.0.6-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:ed418c37d095aeddf5336898a132fba01091f0ac5844e3e8018506f014b6d2c4", size = 4869785, upload-time = "2026-03-25T23:34:02.796Z" },
430
- { url = "https://files.pythonhosted.org/packages/10/38/cd7864d79aa1d92ef6f1a584281433419b955ad5a5ba8d1eb6c872165bcb/cryptography-46.0.6-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:69cf0056d6947edc6e6760e5f17afe4bea06b56a9ac8a06de9d2bd6b532d4f3a", size = 4441404, upload-time = "2026-03-25T23:34:04.35Z" },
431
- { url = "https://files.pythonhosted.org/packages/09/0a/4fe7a8d25fed74419f91835cf5829ade6408fd1963c9eae9c4bce390ecbb/cryptography-46.0.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e7304c4f4e9490e11efe56af6713983460ee0780f16c63f219984dab3af9d2d", size = 4397549, upload-time = "2026-03-25T23:34:06.342Z" },
432
- { url = "https://files.pythonhosted.org/packages/5f/a0/7d738944eac6513cd60a8da98b65951f4a3b279b93479a7e8926d9cd730b/cryptography-46.0.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b928a3ca837c77a10e81a814a693f2295200adb3352395fad024559b7be7a736", size = 4651874, upload-time = "2026-03-25T23:34:07.916Z" },
433
- { url = "https://files.pythonhosted.org/packages/cb/f1/c2326781ca05208845efca38bf714f76939ae446cd492d7613808badedf1/cryptography-46.0.6-cp314-cp314t-win32.whl", hash = "sha256:97c8115b27e19e592a05c45d0dd89c57f81f841cc9880e353e0d3bf25b2139ed", size = 3001511, upload-time = "2026-03-25T23:34:09.892Z" },
434
- { url = "https://files.pythonhosted.org/packages/c9/57/fe4a23eb549ac9d903bd4698ffda13383808ef0876cc912bcb2838799ece/cryptography-46.0.6-cp314-cp314t-win_amd64.whl", hash = "sha256:c797e2517cb7880f8297e2c0f43bb910e91381339336f75d2c1c2cbf811b70b4", size = 3471692, upload-time = "2026-03-25T23:34:11.613Z" },
435
- { url = "https://files.pythonhosted.org/packages/c4/cc/f330e982852403da79008552de9906804568ae9230da8432f7496ce02b71/cryptography-46.0.6-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:12cae594e9473bca1a7aceb90536060643128bb274fcea0fc459ab90f7d1ae7a", size = 7162776, upload-time = "2026-03-25T23:34:13.308Z" },
436
- { url = "https://files.pythonhosted.org/packages/49/b3/dc27efd8dcc4bff583b3f01d4a3943cd8b5821777a58b3a6a5f054d61b79/cryptography-46.0.6-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:639301950939d844a9e1c4464d7e07f902fe9a7f6b215bb0d4f28584729935d8", size = 4270529, upload-time = "2026-03-25T23:34:15.019Z" },
437
- { url = "https://files.pythonhosted.org/packages/e6/05/e8d0e6eb4f0d83365b3cb0e00eb3c484f7348db0266652ccd84632a3d58d/cryptography-46.0.6-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ed3775295fb91f70b4027aeba878d79b3e55c0b3e97eaa4de71f8f23a9f2eb77", size = 4414827, upload-time = "2026-03-25T23:34:16.604Z" },
438
- { url = "https://files.pythonhosted.org/packages/2f/97/daba0f5d2dc6d855e2dcb70733c812558a7977a55dd4a6722756628c44d1/cryptography-46.0.6-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:8927ccfbe967c7df312ade694f987e7e9e22b2425976ddbf28271d7e58845290", size = 4271265, upload-time = "2026-03-25T23:34:18.586Z" },
439
- { url = "https://files.pythonhosted.org/packages/89/06/fe1fce39a37ac452e58d04b43b0855261dac320a2ebf8f5260dd55b201a9/cryptography-46.0.6-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:b12c6b1e1651e42ab5de8b1e00dc3b6354fdfd778e7fa60541ddacc27cd21410", size = 4916800, upload-time = "2026-03-25T23:34:20.561Z" },
440
- { url = "https://files.pythonhosted.org/packages/ff/8a/b14f3101fe9c3592603339eb5d94046c3ce5f7fc76d6512a2d40efd9724e/cryptography-46.0.6-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:063b67749f338ca9c5a0b7fe438a52c25f9526b851e24e6c9310e7195aad3b4d", size = 4448771, upload-time = "2026-03-25T23:34:22.406Z" },
441
- { url = "https://files.pythonhosted.org/packages/01/b3/0796998056a66d1973fd52ee89dc1bb3b6581960a91ad4ac705f182d398f/cryptography-46.0.6-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:02fad249cb0e090b574e30b276a3da6a149e04ee2f049725b1f69e7b8351ec70", size = 3978333, upload-time = "2026-03-25T23:34:24.281Z" },
442
- { url = "https://files.pythonhosted.org/packages/c5/3d/db200af5a4ffd08918cd55c08399dc6c9c50b0bc72c00a3246e099d3a849/cryptography-46.0.6-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:7e6142674f2a9291463e5e150090b95a8519b2fb6e6aaec8917dd8d094ce750d", size = 4271069, upload-time = "2026-03-25T23:34:25.895Z" },
443
- { url = "https://files.pythonhosted.org/packages/d7/18/61acfd5b414309d74ee838be321c636fe71815436f53c9f0334bf19064fa/cryptography-46.0.6-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:456b3215172aeefb9284550b162801d62f5f264a081049a3e94307fe20792cfa", size = 4878358, upload-time = "2026-03-25T23:34:27.67Z" },
444
- { url = "https://files.pythonhosted.org/packages/8b/65/5bf43286d566f8171917cae23ac6add941654ccf085d739195a4eacf1674/cryptography-46.0.6-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:341359d6c9e68834e204ceaf25936dffeafea3829ab80e9503860dcc4f4dac58", size = 4448061, upload-time = "2026-03-25T23:34:29.375Z" },
445
- { url = "https://files.pythonhosted.org/packages/e0/25/7e49c0fa7205cf3597e525d156a6bce5b5c9de1fd7e8cb01120e459f205a/cryptography-46.0.6-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9a9c42a2723999a710445bc0d974e345c32adfd8d2fac6d8a251fa829ad31cfb", size = 4399103, upload-time = "2026-03-25T23:34:32.036Z" },
446
- { url = "https://files.pythonhosted.org/packages/44/46/466269e833f1c4718d6cd496ffe20c56c9c8d013486ff66b4f69c302a68d/cryptography-46.0.6-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6617f67b1606dfd9fe4dbfa354a9508d4a6d37afe30306fe6c101b7ce3274b72", size = 4659255, upload-time = "2026-03-25T23:34:33.679Z" },
447
- { url = "https://files.pythonhosted.org/packages/0a/09/ddc5f630cc32287d2c953fc5d32705e63ec73e37308e5120955316f53827/cryptography-46.0.6-cp38-abi3-win32.whl", hash = "sha256:7f6690b6c55e9c5332c0b59b9c8a3fb232ebf059094c17f9019a51e9827df91c", size = 3010660, upload-time = "2026-03-25T23:34:35.418Z" },
448
- { url = "https://files.pythonhosted.org/packages/1b/82/ca4893968aeb2709aacfb57a30dec6fa2ab25b10fa9f064b8882ce33f599/cryptography-46.0.6-cp38-abi3-win_amd64.whl", hash = "sha256:79e865c642cfc5c0b3eb12af83c35c5aeff4fa5c672dc28c43721c2c9fdd2f0f", size = 3471160, upload-time = "2026-03-25T23:34:37.191Z" },
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 = "8.3.5"
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/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891, upload-time = "2025-03-02T12:54:54.503Z" }
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/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634, upload-time = "2025-03-02T12:54:52.069Z" },
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.1.0"
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/4e/51/f8794af39eeb870e87a8c8068642fc07bce0c854d6865d7dd0f2a9d338c2/pytest_asyncio-1.1.0.tar.gz", hash = "sha256:796aa822981e01b68c12e4827b8697108f7205020f24b5793b3c41555dab68ea", size = 46652, upload-time = "2025-07-16T04:29:26.393Z" }
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/c7/9d/bf86eddabf8c6c9cb1ea9a869d6873b46f105a5d292d3a6f7071f5b07935/pytest_asyncio-1.1.0-py3-none-any.whl", hash = "sha256:5fe2d69607b0bd75c656d1211f969cadba035030156745ee09e7d71740e58ecf", size = 15157, upload-time = "2025-07-16T04:29:24.929Z" },
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.15"
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.6" },
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 = ">=8.0.0" },
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" },