rootly-mcp-server 2.3.0__tar.gz → 2.3.1__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 (83) hide show
  1. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/CHANGELOG.md +13 -0
  2. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/PKG-INFO +1 -1
  3. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/pyproject.toml +1 -1
  4. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/src/rootly_mcp_server/server_defaults.py +75 -29
  5. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/unit/test_server.py +3 -9
  6. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/uv.lock +1 -1
  7. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/.dockerignore +0 -0
  8. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/.gitattributes +0 -0
  9. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/.github/dependabot.yml +0 -0
  10. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/.github/openapi-audit-remote-baseline.json +0 -0
  11. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/.github/workflows/ci.yml +0 -0
  12. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/.github/workflows/dependency-review.yml +0 -0
  13. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/.github/workflows/openapi-audit.yml +0 -0
  14. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/.github/workflows/pypi-release.yml +0 -0
  15. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/.gitignore +0 -0
  16. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/.semaphore/deploy-staging.yml +0 -0
  17. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/.semaphore/deploy.yml +0 -0
  18. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/.semaphore/semaphore.yml +0 -0
  19. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/.semaphore/update-task-definition.sh +0 -0
  20. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/CONTRIBUTING.md +0 -0
  21. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/Dockerfile +0 -0
  22. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/LICENSE +0 -0
  23. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/README.md +0 -0
  24. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/examples/skills/README.md +0 -0
  25. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/gemini-extension.json +0 -0
  26. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/rootly-mcp-server-demo.gif +0 -0
  27. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/rootly_openapi.json +0 -0
  28. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/scripts/audit_openapi.py +0 -0
  29. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/scripts/setup-hooks.sh +0 -0
  30. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/server.json +0 -0
  31. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/src/rootly_mcp_server/__init__.py +0 -0
  32. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/src/rootly_mcp_server/__main__.py +0 -0
  33. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/src/rootly_mcp_server/audit.py +0 -0
  34. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/src/rootly_mcp_server/client.py +0 -0
  35. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/src/rootly_mcp_server/code_mode.py +0 -0
  36. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/src/rootly_mcp_server/data/__init__.py +0 -0
  37. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/src/rootly_mcp_server/exceptions.py +0 -0
  38. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/src/rootly_mcp_server/legacy_server.py +0 -0
  39. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/src/rootly_mcp_server/mcp_error.py +0 -0
  40. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/src/rootly_mcp_server/monitoring.py +0 -0
  41. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/src/rootly_mcp_server/och_client.py +0 -0
  42. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/src/rootly_mcp_server/pagination.py +0 -0
  43. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/src/rootly_mcp_server/payload_stripping.py +0 -0
  44. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/src/rootly_mcp_server/security.py +0 -0
  45. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/src/rootly_mcp_server/server.py +0 -0
  46. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/src/rootly_mcp_server/smart_utils.py +0 -0
  47. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/src/rootly_mcp_server/spec_transform.py +0 -0
  48. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/src/rootly_mcp_server/tools/__init__.py +0 -0
  49. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/src/rootly_mcp_server/tools/alerts.py +0 -0
  50. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/src/rootly_mcp_server/tools/incidents.py +0 -0
  51. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/src/rootly_mcp_server/tools/oncall.py +0 -0
  52. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/src/rootly_mcp_server/tools/resources.py +0 -0
  53. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/src/rootly_mcp_server/transport.py +0 -0
  54. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/src/rootly_mcp_server/utils.py +0 -0
  55. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/src/rootly_mcp_server/validators.py +0 -0
  56. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/README.md +0 -0
  57. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/conftest.py +0 -0
  58. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/integration/local/test_basic.py +0 -0
  59. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/integration/local/test_smart_tools.py +0 -0
  60. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/integration/local/test_tool_allowlists.py +0 -0
  61. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/integration/remote/test_essential.py +0 -0
  62. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/test_client.py +0 -0
  63. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/unit/test_alert_stripping.py +0 -0
  64. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/unit/test_authentication.py +0 -0
  65. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/unit/test_code_mode_module.py +0 -0
  66. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/unit/test_exceptions.py +0 -0
  67. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/unit/test_http_headers.py +0 -0
  68. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/unit/test_legacy_server_module.py +0 -0
  69. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/unit/test_main_transport.py +0 -0
  70. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/unit/test_mcp_error_module.py +0 -0
  71. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/unit/test_och_client.py +0 -0
  72. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/unit/test_oncall_handoff.py +0 -0
  73. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/unit/test_oncall_metrics.py +0 -0
  74. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/unit/test_oncall_new_tools.py +0 -0
  75. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/unit/test_oncall_severity_normalization.py +0 -0
  76. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/unit/test_payload_stripping_module.py +0 -0
  77. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/unit/test_security.py +0 -0
  78. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/unit/test_server_defaults_module.py +0 -0
  79. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/unit/test_smart_utils.py +0 -0
  80. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/unit/test_tools.py +0 -0
  81. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/unit/test_transport_module.py +0 -0
  82. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/unit/test_utils.py +0 -0
  83. {rootly_mcp_server-2.3.0 → rootly_mcp_server-2.3.1}/tests/unit/test_validators.py +0 -0
@@ -5,6 +5,19 @@ 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.3.1] - Released 2026-04-23
9
+
10
+ ### Fixed
11
+
12
+ - **Create Operations Restored**: Restored missing create operations for workflows, schedules, and configuration resources by expanding `DEFAULT_WRITE_ALLOWED_PATHS` to include collection/base paths (not only `/{id}` update paths)
13
+ - **Write Surface Completeness**: Re-enabled create + update parity across key families including workflows, workflow groups, schedules, escalation policies, services, teams, environments, dashboards, playbooks, monitoring, retrospectives, communications, causes, and catalogs
14
+ - **Test Accuracy**: Corrected alert source tool-name assertions in unit tests (`createAlertSource` / `updateAlertSource`) to prevent false confidence
15
+
16
+ ### Notes
17
+
18
+ - `createWorkflow` remains the correct tool name (singular), not `createWorkflows`
19
+ - Security exclusions for sensitive families remain unchanged
20
+
8
21
  ## [2.3.0] - Released 2026-04-23
9
22
 
10
23
  ### Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rootly-mcp-server
3
- Version: 2.3.0
3
+ Version: 2.3.1
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "rootly-mcp-server"
3
- version = "2.3.0"
3
+ version = "2.3.1"
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"
@@ -333,52 +333,98 @@ SECURITY_EXCLUDED_PATHS = [
333
333
  # write tools are explicitly enabled. This keeps the default surface focused on
334
334
  # read-only workflows and avoids exposing broader admin/config writes.
335
335
  DEFAULT_WRITE_ALLOWED_PATHS = [
336
- # Core incident and infrastructure updates
337
- "/alert_events/{id}",
336
+ # Core incident and infrastructure - create + update
337
+ "/environments",
338
338
  "/environments/{environment_id}",
339
- "/escalation_levels/{escalation_level_id}",
340
- "/escalation_paths/{escalation_policy_path_id}",
341
- "/escalation_policies/{escalation_policy_id}",
339
+ "/functionalities",
342
340
  "/functionalities/{functionality_id}",
341
+ "/incident_types",
342
+ "/incident_types/{incident_type_id}",
343
+ "/services",
344
+ "/services/{service_id}",
345
+ "/severities",
346
+ "/severities/{severity_id}",
347
+ "/teams",
348
+ "/teams/{team_id}",
349
+ # Incident mutations
350
+ "/alert_events/{id}",
343
351
  "/incidents/{incident_id}/action_items",
344
352
  "/incidents/{incident_id}/form_field_selections",
345
353
  "/incident_form_field_selections/{id}",
346
- "/incident_types/{incident_type_id}",
347
- "/on_call_roles/{on_call_role_id}",
348
- "/on_call_shadows/{on_call_shadow_id}",
349
- "/override_shifts/{override_shift_id}",
354
+ # On-call schedules - create + update
355
+ "/schedules",
350
356
  "/schedules/{schedule_id}",
357
+ "/schedules/{schedule_id}/schedule_rotations",
351
358
  "/schedule_rotations/{schedule_rotation_id}",
352
- "/services/{service_id}",
353
- "/severities/{severity_id}",
354
- "/teams/{team_id}",
359
+ "/schedules/{schedule_id}/override_shifts",
360
+ "/override_shifts/{override_shift_id}",
361
+ "/schedules/{schedule_id}/on_call_shadows",
362
+ "/on_call_shadows/{on_call_shadow_id}",
363
+ "/on_call_roles",
364
+ "/on_call_roles/{on_call_role_id}",
365
+ # Escalation policies - create + update
366
+ "/escalation_policies",
367
+ "/escalation_policies/{escalation_policy_id}",
368
+ "/escalation_policies/{escalation_policy_id}/escalation_paths",
369
+ "/escalation_paths/{escalation_policy_path_id}",
370
+ "/escalation_paths/{escalation_policy_path_id}/escalation_levels",
371
+ "/escalation_levels/{escalation_level_id}",
372
+ # Workflows - create + update
373
+ "/workflows",
355
374
  "/workflows/{workflow_id}",
375
+ "/workflow_groups",
356
376
  "/workflows/{workflow_id}/workflow_tasks",
357
377
  "/workflow_tasks/{id}",
358
- # Communications and templates
359
- "/communications_groups/{id}",
360
- "/communications_stages/{id}",
361
- "/communications_templates/{id}",
362
- "/communications_types/{id}",
363
- # Dashboards and analytics
378
+ "/workflows/{workflow_id}/form_field_conditions",
379
+ # Dashboards - create + update
380
+ "/dashboards",
364
381
  "/dashboards/{id}",
382
+ "/dashboards/{dashboard_id}/panels",
365
383
  "/dashboard_panels/{id}",
366
- # Playbooks and operational procedures
384
+ # Playbooks - create + update
385
+ "/playbooks",
367
386
  "/playbooks/{id}",
387
+ "/playbooks/{playbook_id}/playbook_tasks",
368
388
  "/playbook_tasks/{id}",
369
- # Post-incident and retrospectives
389
+ # Monitoring - create + update
390
+ "/heartbeats",
391
+ "/heartbeats/{id}",
392
+ "/pulses",
393
+ "/pulses/{id}",
394
+ "/live_call_routers",
395
+ "/live_call_routers/{id}",
396
+ # Post-incident and retrospectives - create + update
370
397
  "/post_incident_reviews/{id}",
398
+ "/retrospective_processes",
371
399
  "/retrospective_processes/{id}",
400
+ "/retrospective_processes/{retrospective_process_id}/groups",
372
401
  "/retrospective_process_groups/{id}",
402
+ "/retrospective_processes/{retrospective_process_id}/retrospective_steps",
373
403
  "/retrospective_steps/{id}",
374
404
  "/postmortem_templates/{id}",
375
- # Monitoring and health checks
376
- "/heartbeats/{id}",
377
- "/pulses/{id}",
378
- "/live_call_routers/{id}",
379
- # User notification preferences (safe user updates)
405
+ # Communications - create + update
406
+ "/communications_groups",
407
+ "/communications_groups/{id}",
408
+ "/communications_stages",
409
+ "/communications_stages/{id}",
410
+ "/communications_templates",
411
+ "/communications_templates/{id}",
412
+ "/communications_types",
413
+ "/communications_types/{id}",
414
+ # Causes and catalog - create + update
415
+ "/causes",
416
+ "/catalogs",
417
+ "/catalogs/{catalog_id}/entities",
418
+ # Sub-statuses - create + update
419
+ "/sub_statuses",
420
+ "/sub_statuses/{id}",
421
+ "/incident_sub_statuses/{id}",
422
+ # User notification preferences - create + update
423
+ "/users/{user_id}/notification_rules",
380
424
  "/user_notification_rules/{id}",
425
+ "/users/{user_id}/email_addresses",
381
426
  "/user_email_addresses/{id}",
427
+ "/users/{user_id}/phone_numbers",
382
428
  "/user_phone_numbers/{id}",
383
429
  # Extended incident management
384
430
  "/incident_events/{id}",
@@ -386,17 +432,17 @@ DEFAULT_WRITE_ALLOWED_PATHS = [
386
432
  "/incident_postmortems/{id}",
387
433
  "/incident_retrospective_steps/{id}",
388
434
  "/incident_status_pages/{id}",
389
- # Advanced form and field management
435
+ # Form and field management - create + update
436
+ "/custom_fields",
390
437
  "/custom_fields/{id}",
391
438
  "/custom_field_options/{id}",
439
+ "/form_sets",
392
440
  "/form_sets/{id}",
393
441
  "/form_field_placements/{id}",
394
442
  "/form_field_placement_conditions/{id}",
395
443
  "/form_set_conditions/{id}",
396
- # Status and sub-status management
444
+ # Status page templates
397
445
  "/status_page_templates/{id}",
398
- "/sub_statuses/{id}",
399
- "/incident_sub_statuses/{id}",
400
446
  ]
401
447
 
402
448
  # DELETE operations are only exposed for these high-priority screenshot families.
@@ -371,14 +371,9 @@ class TestBundledIncidentFormFieldSelectionTools:
371
371
  assert "listCauses" in tool_names
372
372
  assert "getCause" in tool_names
373
373
 
374
- # Keep broader writes on these families disabled
374
+ # Workflow creates now enabled, but workflow runs remain excluded
375
375
  assert "createWorkflowRun" not in tool_names
376
- assert "createWorkflowGroup" not in tool_names
377
- assert "updateWorkflowGroup" not in tool_names
378
- assert "createStatusPage" not in tool_names
379
- assert "updateStatusPage" not in tool_names
380
- assert "createStatusPageTemplate" not in tool_names
381
- assert "updateStatusPageTemplate" not in tool_names
376
+ # Alert configuration writes remain excluded (connects to external systems)
382
377
  assert "createAlertGroup" not in tool_names
383
378
  assert "updateAlertGroup" not in tool_names
384
379
  assert "createAlertRoutingRule" not in tool_names
@@ -387,12 +382,11 @@ class TestBundledIncidentFormFieldSelectionTools:
387
382
  assert "updateAlertSource" not in tool_names
388
383
  assert "createAlertUrgency" not in tool_names
389
384
  assert "updateAlertUrgency" not in tool_names
385
+ # Custom form/field creation excluded (schema-level configuration)
390
386
  assert "createCustomForm" not in tool_names
391
387
  assert "updateCustomForm" not in tool_names
392
388
  assert "createFormField" not in tool_names
393
389
  assert "updateFormField" not in tool_names
394
- assert "createCatalog" not in tool_names
395
- assert "updateCatalog" not in tool_names
396
390
 
397
391
  async def test_enable_write_tools_exposes_curated_generated_write_tools(
398
392
  self, mock_environment_token
@@ -1715,7 +1715,7 @@ wheels = [
1715
1715
 
1716
1716
  [[package]]
1717
1717
  name = "rootly-mcp-server"
1718
- version = "2.2.24"
1718
+ version = "2.3.1"
1719
1719
  source = { editable = "." }
1720
1720
  dependencies = [
1721
1721
  { name = "authlib" },