devhelm-mcp-server 0.7.0__tar.gz → 0.8.2__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 (43) hide show
  1. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/PKG-INFO +2 -2
  2. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/docs/openapi/monitoring-api.json +223 -23
  3. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/pyproject.toml +6 -4
  4. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/src/devhelm_mcp/client.py +22 -1
  5. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/src/devhelm_mcp/server.py +210 -25
  6. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/src/devhelm_mcp/tools/alert_channels.py +7 -7
  7. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/src/devhelm_mcp/tools/api_keys.py +5 -5
  8. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/src/devhelm_mcp/tools/dependencies.py +5 -5
  9. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/src/devhelm_mcp/tools/deploy_lock.py +5 -5
  10. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/src/devhelm_mcp/tools/environments.py +6 -6
  11. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/src/devhelm_mcp/tools/forensics.py +6 -6
  12. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/src/devhelm_mcp/tools/incidents.py +5 -5
  13. devhelm_mcp_server-0.8.2/src/devhelm_mcp/tools/maintenance_windows.py +266 -0
  14. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/src/devhelm_mcp/tools/monitors.py +58 -13
  15. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/src/devhelm_mcp/tools/notification_policies.py +7 -7
  16. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/src/devhelm_mcp/tools/resource_groups.py +8 -8
  17. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/src/devhelm_mcp/tools/secrets.py +5 -5
  18. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/src/devhelm_mcp/tools/status.py +2 -2
  19. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/src/devhelm_mcp/tools/status_pages.py +31 -31
  20. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/src/devhelm_mcp/tools/tags.py +6 -6
  21. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/src/devhelm_mcp/tools/webhooks.py +7 -7
  22. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/tests/test_cli.py +5 -1
  23. devhelm_mcp_server-0.8.2/tests/test_devex_round3_fixes.py +450 -0
  24. devhelm_mcp_server-0.8.2/tests/test_maintenance_windows.py +492 -0
  25. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/tests/test_tools.py +19 -9
  26. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/uv.lock +5 -5
  27. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/.github/workflows/ci.yml +0 -0
  28. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/.github/workflows/release.yml +0 -0
  29. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/.github/workflows/spec-check.yml +0 -0
  30. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/.gitignore +0 -0
  31. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/LICENSE +0 -0
  32. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/Makefile +0 -0
  33. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/README.md +0 -0
  34. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/docker/Dockerfile +0 -0
  35. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/scripts/regen-from.sh +0 -0
  36. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/scripts/release.sh +0 -0
  37. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/src/devhelm_mcp/__init__.py +0 -0
  38. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/src/devhelm_mcp/tools/__init__.py +0 -0
  39. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/tests/__init__.py +0 -0
  40. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/tests/run_mcp.py +0 -0
  41. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/tests/test_auth.py +0 -0
  42. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/tests/test_client.py +0 -0
  43. {devhelm_mcp_server-0.7.0 → devhelm_mcp_server-0.8.2}/tests/test_typed_schemas.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devhelm-mcp-server
3
- Version: 0.7.0
3
+ Version: 0.8.2
4
4
  Summary: DevHelm MCP server — AI agent access to monitors, incidents, alerting, and more
5
5
  Project-URL: Homepage, https://devhelm.io
6
6
  Project-URL: Repository, https://github.com/devhelmhq/mcp-server
@@ -18,7 +18,7 @@ Classifier: Programming Language :: Python :: 3.12
18
18
  Classifier: Programming Language :: Python :: 3.13
19
19
  Classifier: Topic :: Software Development :: Libraries
20
20
  Requires-Python: >=3.11
21
- Requires-Dist: devhelm>=0.6.0
21
+ Requires-Dist: devhelm>=0.7.2
22
22
  Requires-Dist: fastmcp>=2.0.0
23
23
  Description-Content-Type: text/markdown
24
24
 
@@ -166,8 +166,52 @@
166
166
  "Alert Channels"
167
167
  ],
168
168
  "summary": "List active alert channels for the authenticated org",
169
+ "description": "Supports filtering by `type` (channel integration), `managedBy` (creating surface), and `search` (case-insensitive contains on name). Unrecognised query parameters are silently ignored — pin to the documented set above.",
169
170
  "operationId": "list_14",
170
171
  "parameters": [
172
+ {
173
+ "name": "type",
174
+ "in": "query",
175
+ "description": "Filter by channel integration type (e.g. SLACK, WEBHOOK, EMAIL)",
176
+ "required": false,
177
+ "schema": {
178
+ "type": "string",
179
+ "enum": [
180
+ "email",
181
+ "webhook",
182
+ "slack",
183
+ "pagerduty",
184
+ "opsgenie",
185
+ "teams",
186
+ "discord"
187
+ ]
188
+ }
189
+ },
190
+ {
191
+ "name": "managedBy",
192
+ "in": "query",
193
+ "description": "Filter by managed-by source (DASHBOARD, CLI, TERRAFORM, MCP, API)",
194
+ "required": false,
195
+ "schema": {
196
+ "type": "string",
197
+ "enum": [
198
+ "DASHBOARD",
199
+ "CLI",
200
+ "TERRAFORM",
201
+ "MCP",
202
+ "API"
203
+ ]
204
+ }
205
+ },
206
+ {
207
+ "name": "search",
208
+ "in": "query",
209
+ "description": "Case-insensitive contains-match on the channel name",
210
+ "required": false,
211
+ "schema": {
212
+ "type": "string"
213
+ }
214
+ },
171
215
  {
172
216
  "name": "pageable",
173
217
  "in": "query",
@@ -6374,17 +6418,27 @@
6374
6418
  "Monitors"
6375
6419
  ],
6376
6420
  "summary": "List monitors for the authenticated org",
6421
+ "description": "Supports filtering by `enabled`, `status` (alias active|paused for enabled), `type`, `managedBy`, `tag` / `tags`, `search`, and `environmentId`. Unrecognised query parameters are silently ignored (Spring's default binding behaviour) — pin to the documented set above.",
6377
6422
  "operationId": "list_8",
6378
6423
  "parameters": [
6379
6424
  {
6380
6425
  "name": "enabled",
6381
6426
  "in": "query",
6382
- "description": "Filter by enabled state",
6427
+ "description": "Filter by enabled state (true/false)",
6383
6428
  "required": false,
6384
6429
  "schema": {
6385
6430
  "type": "boolean"
6386
6431
  }
6387
6432
  },
6433
+ {
6434
+ "name": "status",
6435
+ "in": "query",
6436
+ "description": "Lifecycle status alias: 'active' (enabled=true) or 'paused' (enabled=false). Ignored when ?enabled is also supplied.",
6437
+ "required": false,
6438
+ "schema": {
6439
+ "type": "string"
6440
+ }
6441
+ },
6388
6442
  {
6389
6443
  "name": "type",
6390
6444
  "in": "query",
@@ -6412,14 +6466,25 @@
6412
6466
  "enum": [
6413
6467
  "DASHBOARD",
6414
6468
  "CLI",
6415
- "TERRAFORM"
6469
+ "TERRAFORM",
6470
+ "MCP",
6471
+ "API"
6416
6472
  ]
6417
6473
  }
6418
6474
  },
6419
6475
  {
6420
6476
  "name": "tags",
6421
6477
  "in": "query",
6422
- "description": "Filter by tag names, comma-separated (e.g. prod,critical)",
6478
+ "description": "Filter by tag names, comma-separated (e.g. prod,critical); OR semantics",
6479
+ "required": false,
6480
+ "schema": {
6481
+ "type": "string"
6482
+ }
6483
+ },
6484
+ {
6485
+ "name": "tag",
6486
+ "in": "query",
6487
+ "description": "Filter by a single tag name (alias for ?tags=); merged with ?tags using OR semantics",
6423
6488
  "required": false,
6424
6489
  "schema": {
6425
6490
  "type": "string"
@@ -21727,6 +21792,18 @@
21727
21792
  "description": "SHA-256 hash of the channel config; use for change detection",
21728
21793
  "nullable": true
21729
21794
  },
21795
+ "managedBy": {
21796
+ "type": "string",
21797
+ "description": "Source that created/owns this channel: DASHBOARD, CLI, TERRAFORM, MCP, or API. Null on channels created before this attribution column existed.",
21798
+ "nullable": true,
21799
+ "enum": [
21800
+ "DASHBOARD",
21801
+ "CLI",
21802
+ "TERRAFORM",
21803
+ "MCP",
21804
+ "API"
21805
+ ]
21806
+ },
21730
21807
  "lastDeliveryAt": {
21731
21808
  "type": "string",
21732
21809
  "description": "Timestamp of the most recent delivery attempt",
@@ -22927,6 +23004,18 @@
22927
23004
  "$ref": "#/components/schemas/WebhookChannelConfig"
22928
23005
  }
22929
23006
  ]
23007
+ },
23008
+ "managedBy": {
23009
+ "type": "string",
23010
+ "description": "Source creating this channel: DASHBOARD, CLI, TERRAFORM, MCP, or API. Defaults to API when omitted.",
23011
+ "nullable": true,
23012
+ "enum": [
23013
+ "DASHBOARD",
23014
+ "CLI",
23015
+ "TERRAFORM",
23016
+ "MCP",
23017
+ "API"
23018
+ ]
22930
23019
  }
22931
23020
  }
22932
23021
  },
@@ -23187,12 +23276,14 @@
23187
23276
  "maxLength": 100,
23188
23277
  "minLength": 0,
23189
23278
  "type": "string",
23190
- "description": "iCal RRULE for recurring windows (max 100 chars); null for one-time",
23279
+ "description": "Reserved: iCal RRULE for recurring windows (stored but not yet honored)",
23191
23280
  "nullable": true
23192
23281
  },
23193
23282
  "reason": {
23283
+ "maxLength": 500,
23284
+ "minLength": 0,
23194
23285
  "type": "string",
23195
- "description": "Human-readable reason for the maintenance",
23286
+ "description": "Human-readable reason for the maintenance (max 500 chars)",
23196
23287
  "nullable": true
23197
23288
  },
23198
23289
  "suppressAlerts": {
@@ -23239,7 +23330,6 @@
23239
23330
  "CreateMonitorRequest": {
23240
23331
  "required": [
23241
23332
  "config",
23242
- "managedBy",
23243
23333
  "name",
23244
23334
  "type"
23245
23335
  ],
@@ -23286,8 +23376,10 @@
23286
23376
  ]
23287
23377
  },
23288
23378
  "frequencySeconds": {
23379
+ "maximum": 86400,
23380
+ "minimum": 10,
23289
23381
  "type": "integer",
23290
- "description": "Check frequency in seconds (30–86400); null defaults to plan minimum (60s on most paid plans)",
23382
+ "description": "Check frequency in seconds (10–86400); null defaults to plan minimum (60s on most paid plans)",
23291
23383
  "format": "int32",
23292
23384
  "nullable": true
23293
23385
  },
@@ -23298,20 +23390,23 @@
23298
23390
  },
23299
23391
  "regions": {
23300
23392
  "type": "array",
23301
- "description": "Probe regions to run checks from, e.g. us-east, eu-west",
23393
+ "description": "Probe regions to run checks from. Allowed values are deployment-dependent; production: us-east, us-west, eu-west, ap-south.",
23302
23394
  "nullable": true,
23303
23395
  "items": {
23304
23396
  "type": "string",
23305
- "description": "Probe regions to run checks from, e.g. us-east, eu-west"
23397
+ "description": "Probe regions to run checks from. Allowed values are deployment-dependent; production: us-east, us-west, eu-west, ap-south."
23306
23398
  }
23307
23399
  },
23308
23400
  "managedBy": {
23309
23401
  "type": "string",
23310
- "description": "Who manages this monitor: DASHBOARD or CLI",
23402
+ "description": "Source that created/owns this monitor: DASHBOARD, CLI, TERRAFORM, MCP, or API. Defaults to API when omitted; set to your surface so audit logs, drift detection, and analytics attribute correctly.",
23403
+ "nullable": true,
23311
23404
  "enum": [
23312
23405
  "DASHBOARD",
23313
23406
  "CLI",
23314
- "TERRAFORM"
23407
+ "TERRAFORM",
23408
+ "MCP",
23409
+ "API"
23315
23410
  ]
23316
23411
  },
23317
23412
  "environmentId": {
@@ -23506,6 +23601,18 @@
23506
23601
  "description": "Recovery cooldown in minutes after group incident resolves (0–60)",
23507
23602
  "format": "int32",
23508
23603
  "nullable": true
23604
+ },
23605
+ "managedBy": {
23606
+ "type": "string",
23607
+ "description": "Source creating this group: DASHBOARD, CLI, TERRAFORM, MCP, or API. Defaults to API when omitted.",
23608
+ "nullable": true,
23609
+ "enum": [
23610
+ "DASHBOARD",
23611
+ "CLI",
23612
+ "TERRAFORM",
23613
+ "MCP",
23614
+ "API"
23615
+ ]
23509
23616
  }
23510
23617
  },
23511
23618
  "description": "Request body for creating a resource group"
@@ -23807,6 +23914,18 @@
23807
23914
  "REVIEW",
23808
23915
  "AUTOMATIC"
23809
23916
  ]
23917
+ },
23918
+ "managedBy": {
23919
+ "type": "string",
23920
+ "description": "Source creating this page: DASHBOARD, CLI, TERRAFORM, MCP, or API. Defaults to API when omitted.",
23921
+ "nullable": true,
23922
+ "enum": [
23923
+ "DASHBOARD",
23924
+ "CLI",
23925
+ "TERRAFORM",
23926
+ "MCP",
23927
+ "API"
23928
+ ]
23810
23929
  }
23811
23930
  }
23812
23931
  },
@@ -26432,7 +26551,7 @@
26432
26551
  },
26433
26552
  "repeatRule": {
26434
26553
  "type": "string",
26435
- "description": "iCal RRULE for recurring windows; null for one-time",
26554
+ "description": "Reserved: iCal RRULE for recurring windows (stored but not yet honored)",
26436
26555
  "nullable": true
26437
26556
  },
26438
26557
  "reason": {
@@ -27194,11 +27313,13 @@
27194
27313
  },
27195
27314
  "managedBy": {
27196
27315
  "type": "string",
27197
- "description": "Management source: DASHBOARD or CLI",
27316
+ "description": "Source that created/owns this monitor: DASHBOARD, CLI, TERRAFORM, MCP, or API",
27198
27317
  "enum": [
27199
27318
  "DASHBOARD",
27200
27319
  "CLI",
27201
- "TERRAFORM"
27320
+ "TERRAFORM",
27321
+ "MCP",
27322
+ "API"
27202
27323
  ]
27203
27324
  },
27204
27325
  "createdAt": {
@@ -27265,6 +27386,18 @@
27265
27386
  "description": "Alert channel IDs linked to this monitor; populated on single-monitor responses",
27266
27387
  "format": "uuid"
27267
27388
  }
27389
+ },
27390
+ "currentStatus": {
27391
+ "type": "string",
27392
+ "description": "Current operational state — UP, DOWN, DEGRADED, PAUSED, or UNKNOWN if no probe data yet",
27393
+ "nullable": true,
27394
+ "enum": [
27395
+ "up",
27396
+ "degraded",
27397
+ "down",
27398
+ "paused",
27399
+ "unknown"
27400
+ ]
27268
27401
  }
27269
27402
  },
27270
27403
  "description": "Full monitor representation"
@@ -28455,6 +28588,18 @@
28455
28588
  "$ref": "#/components/schemas/ResourceGroupMemberDto"
28456
28589
  }
28457
28590
  },
28591
+ "managedBy": {
28592
+ "type": "string",
28593
+ "description": "Source that created/owns this group: DASHBOARD, CLI, TERRAFORM, MCP, or API. Null on groups created before this attribution column existed.",
28594
+ "nullable": true,
28595
+ "enum": [
28596
+ "DASHBOARD",
28597
+ "CLI",
28598
+ "TERRAFORM",
28599
+ "MCP",
28600
+ "API"
28601
+ ]
28602
+ },
28458
28603
  "createdAt": {
28459
28604
  "type": "string",
28460
28605
  "description": "Timestamp when the group was created",
@@ -28715,6 +28860,7 @@
28715
28860
  "up",
28716
28861
  "degraded",
28717
28862
  "down",
28863
+ "paused",
28718
28864
  "unknown"
28719
28865
  ]
28720
28866
  },
@@ -31050,6 +31196,18 @@
31050
31196
  "UNDER_MAINTENANCE"
31051
31197
  ]
31052
31198
  },
31199
+ "managedBy": {
31200
+ "type": "string",
31201
+ "description": "Source that created/owns this status page: DASHBOARD, CLI, TERRAFORM, MCP, or API. Null on pages created before this attribution column existed.",
31202
+ "nullable": true,
31203
+ "enum": [
31204
+ "DASHBOARD",
31205
+ "CLI",
31206
+ "TERRAFORM",
31207
+ "MCP",
31208
+ "API"
31209
+ ]
31210
+ },
31053
31211
  "createdAt": {
31054
31212
  "type": "string",
31055
31213
  "format": "date-time"
@@ -32993,6 +33151,18 @@
32993
33151
  "$ref": "#/components/schemas/WebhookChannelConfig"
32994
33152
  }
32995
33153
  ]
33154
+ },
33155
+ "managedBy": {
33156
+ "type": "string",
33157
+ "description": "New attribution source: DASHBOARD, CLI, TERRAFORM, MCP, or API; null preserves current value.",
33158
+ "nullable": true,
33159
+ "enum": [
33160
+ "DASHBOARD",
33161
+ "CLI",
33162
+ "TERRAFORM",
33163
+ "MCP",
33164
+ "API"
33165
+ ]
32996
33166
  }
32997
33167
  }
32998
33168
  },
@@ -33233,7 +33403,7 @@
33233
33403
  "properties": {
33234
33404
  "monitorId": {
33235
33405
  "type": "string",
33236
- "description": "Monitor to attach this maintenance window to; null preserves current",
33406
+ "description": "Monitor this window applies to; null switches the window to org-wide",
33237
33407
  "format": "uuid",
33238
33408
  "nullable": true
33239
33409
  },
@@ -33251,17 +33421,19 @@
33251
33421
  "maxLength": 100,
33252
33422
  "minLength": 0,
33253
33423
  "type": "string",
33254
- "description": "Updated iCal RRULE; null clears the repeat rule",
33424
+ "description": "Reserved: iCal RRULE for recurring windows (stored but not yet honored); null clears it",
33255
33425
  "nullable": true
33256
33426
  },
33257
33427
  "reason": {
33428
+ "maxLength": 500,
33429
+ "minLength": 0,
33258
33430
  "type": "string",
33259
- "description": "Updated reason; null clears the existing reason",
33431
+ "description": "Updated reason (max 500 chars); null clears the existing reason",
33260
33432
  "nullable": true
33261
33433
  },
33262
33434
  "suppressAlerts": {
33263
33435
  "type": "boolean",
33264
- "description": "Whether to suppress alerts; null preserves current",
33436
+ "description": "Whether to suppress alerts during this window; null defaults to true",
33265
33437
  "nullable": true
33266
33438
  }
33267
33439
  }
@@ -33324,8 +33496,10 @@
33324
33496
  ]
33325
33497
  },
33326
33498
  "frequencySeconds": {
33499
+ "maximum": 86400,
33500
+ "minimum": 10,
33327
33501
  "type": "integer",
33328
- "description": "New check frequency in seconds (30–86400); null preserves current",
33502
+ "description": "New check frequency in seconds (10–86400); null preserves current",
33329
33503
  "format": "int32",
33330
33504
  "nullable": true
33331
33505
  },
@@ -33336,21 +33510,23 @@
33336
33510
  },
33337
33511
  "regions": {
33338
33512
  "type": "array",
33339
- "description": "New probe regions; null preserves current",
33513
+ "description": "New probe regions; null preserves current. Allowed values are deployment-dependent.",
33340
33514
  "nullable": true,
33341
33515
  "items": {
33342
33516
  "type": "string",
33343
- "description": "New probe regions; null preserves current"
33517
+ "description": "New probe regions; null preserves current. Allowed values are deployment-dependent."
33344
33518
  }
33345
33519
  },
33346
33520
  "managedBy": {
33347
33521
  "type": "string",
33348
- "description": "New management source; null preserves current",
33522
+ "description": "New ownership source: DASHBOARD, CLI, TERRAFORM, MCP, or API; null preserves current value",
33349
33523
  "nullable": true,
33350
33524
  "enum": [
33351
33525
  "DASHBOARD",
33352
33526
  "CLI",
33353
- "TERRAFORM"
33527
+ "TERRAFORM",
33528
+ "MCP",
33529
+ "API"
33354
33530
  ]
33355
33531
  },
33356
33532
  "environmentId": {
@@ -33597,6 +33773,18 @@
33597
33773
  "description": "Recovery cooldown in minutes; null clears",
33598
33774
  "format": "int32",
33599
33775
  "nullable": true
33776
+ },
33777
+ "managedBy": {
33778
+ "type": "string",
33779
+ "description": "New attribution source: DASHBOARD, CLI, TERRAFORM, MCP, or API; null preserves current value.",
33780
+ "nullable": true,
33781
+ "enum": [
33782
+ "DASHBOARD",
33783
+ "CLI",
33784
+ "TERRAFORM",
33785
+ "MCP",
33786
+ "API"
33787
+ ]
33600
33788
  }
33601
33789
  },
33602
33790
  "description": "Request body for updating a resource group"
@@ -33801,6 +33989,18 @@
33801
33989
  "REVIEW",
33802
33990
  "AUTOMATIC"
33803
33991
  ]
33992
+ },
33993
+ "managedBy": {
33994
+ "type": "string",
33995
+ "description": "New attribution source: DASHBOARD, CLI, TERRAFORM, MCP, or API; null preserves current value.",
33996
+ "nullable": true,
33997
+ "enum": [
33998
+ "DASHBOARD",
33999
+ "CLI",
34000
+ "TERRAFORM",
34001
+ "MCP",
34002
+ "API"
34003
+ ]
33804
34004
  }
33805
34005
  }
33806
34006
  },
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "devhelm-mcp-server"
3
- version = "0.7.0"
3
+ version = "0.8.2"
4
4
  description = "DevHelm MCP server — AI agent access to monitors, incidents, alerting, and more"
5
5
  authors = [{ name = "DevHelm", email = "hello@devhelm.io" }]
6
6
  license = "MIT"
@@ -19,9 +19,11 @@ classifiers = [
19
19
  ]
20
20
 
21
21
  dependencies = [
22
- # Floor bumped to 0.5.0 for the forensic read resource (timeline / trace /
23
- # evaluations / transitions / policy snapshot) used by tools/forensics.py.
24
- "devhelm>=0.6.0",
22
+ # Floor bumped to 0.7.2: required for `managedBy` field on resource DTOs
23
+ # and for the new monitor validation contract (frequencySeconds bounds,
24
+ # dynamic region whitelist). Older devhelm versions raise Pydantic
25
+ # `extra_forbidden` errors when the API returns `managedBy`.
26
+ "devhelm>=0.7.2",
25
27
  "fastmcp>=2.0.0",
26
28
  ]
27
29
 
@@ -5,7 +5,7 @@ from __future__ import annotations
5
5
  import os
6
6
  from importlib.metadata import PackageNotFoundError
7
7
  from importlib.metadata import version as _pkg_version
8
- from typing import Any
8
+ from typing import Any, NoReturn
9
9
 
10
10
  from devhelm import (
11
11
  Devhelm,
@@ -15,6 +15,7 @@ from devhelm import (
15
15
  DevhelmTransportError,
16
16
  DevhelmValidationError,
17
17
  )
18
+ from fastmcp.exceptions import ToolError
18
19
  from pydantic import BaseModel
19
20
 
20
21
  API_BASE_URL = os.getenv("DEVHELM_API_URL", "https://api.devhelm.io")
@@ -201,6 +202,26 @@ def format_error(err: DevhelmError) -> str:
201
202
  return f"Error: {err}"
202
203
 
203
204
 
205
+ def raise_tool_error(err: DevhelmError) -> NoReturn:
206
+ """Convert an SDK error into a FastMCP ``ToolError`` so ``isError=true``.
207
+
208
+ Per the MCP spec, upstream API failures must surface as
209
+ ``CallToolResult.isError = true`` so the LLM can distinguish a tool that
210
+ *ran but failed* from one that *succeeded with an error message in the
211
+ response* — those have the same shape on the wire otherwise.
212
+
213
+ The previous behavior returned ``format_error(err)`` as a regular tool
214
+ return value (``isError = false``), which caused agents to confidently
215
+ report success after a 4xx/5xx (silent-corruption bug from the round-3
216
+ DevEx audit). FastMCP catches the ``ToolError`` raised here and
217
+ serializes it into ``CallToolResult(isError=True, content=[...])``,
218
+ preserving the human-readable formatted message for the LLM.
219
+
220
+ See https://modelcontextprotocol.io/specification/server/tools#error-handling.
221
+ """
222
+ raise ToolError(format_error(err)) from err
223
+
224
+
204
225
  JsonValue = dict[str, "JsonValue"] | list["JsonValue"] | str | int | float | bool | None
205
226
 
206
227