devhelm-mcp-server 1.2.0__tar.gz → 1.4.0__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 (47) hide show
  1. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/PKG-INFO +3 -3
  2. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/docs/openapi/monitoring-api.json +52 -0
  3. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/pyproject.toml +3 -3
  4. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/api_keys.py +8 -0
  5. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/tests/run_mcp.py +9 -0
  6. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/tests/test_tools.py +12 -2
  7. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/uv.lock +6 -6
  8. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/.github/workflows/ci.yml +0 -0
  9. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/.github/workflows/release.yml +0 -0
  10. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/.github/workflows/spec-check.yml +0 -0
  11. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/.gitignore +0 -0
  12. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/CHANGELOG.md +0 -0
  13. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/LICENSE +0 -0
  14. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/Makefile +0 -0
  15. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/README.md +0 -0
  16. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/docker/Dockerfile +0 -0
  17. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/scripts/regen-from.sh +0 -0
  18. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/scripts/release.sh +0 -0
  19. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/server.json +0 -0
  20. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/__init__.py +0 -0
  21. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/client.py +0 -0
  22. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/server.py +0 -0
  23. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/__init__.py +0 -0
  24. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/alert_channels.py +0 -0
  25. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/dependencies.py +0 -0
  26. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/deploy_lock.py +0 -0
  27. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/environments.py +0 -0
  28. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/forensics.py +0 -0
  29. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/incidents.py +0 -0
  30. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/maintenance_windows.py +0 -0
  31. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/monitors.py +0 -0
  32. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/notification_policies.py +0 -0
  33. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/resource_groups.py +0 -0
  34. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/secrets.py +0 -0
  35. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/services.py +0 -0
  36. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/status.py +0 -0
  37. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/status_pages.py +0 -0
  38. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/tags.py +0 -0
  39. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/webhooks.py +0 -0
  40. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/tests/__init__.py +0 -0
  41. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/tests/test_auth.py +0 -0
  42. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/tests/test_cli.py +0 -0
  43. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/tests/test_client.py +0 -0
  44. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/tests/test_devex_round3_fixes.py +0 -0
  45. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/tests/test_maintenance_windows.py +0 -0
  46. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/tests/test_services.py +0 -0
  47. {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/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: 1.2.0
3
+ Version: 1.4.0
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,8 +18,8 @@ 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>=1.3.0
22
- Requires-Dist: fastmcp>=2.0.0
21
+ Requires-Dist: devhelm>=1.4.0
22
+ Requires-Dist: fastmcp<4,>=3.2.3
23
23
  Description-Content-Type: text/markdown
24
24
 
25
25
  # DevHelm MCP Server
@@ -2274,6 +2274,18 @@
2274
2274
  ],
2275
2275
  "summary": "List categories with service counts",
2276
2276
  "operationId": "listCategories",
2277
+ "parameters": [
2278
+ {
2279
+ "name": "publishedOnly",
2280
+ "in": "query",
2281
+ "description": "Count only published services (curated public pSEO set); default false",
2282
+ "required": false,
2283
+ "schema": {
2284
+ "type": "boolean",
2285
+ "default": false
2286
+ }
2287
+ }
2288
+ ],
2277
2289
  "responses": {
2278
2290
  "200": {
2279
2291
  "description": "OK",
@@ -13520,6 +13532,24 @@
13520
13532
  "type": "boolean"
13521
13533
  }
13522
13534
  },
13535
+ {
13536
+ "name": "search",
13537
+ "in": "query",
13538
+ "description": "Case-insensitive substring match on service name or slug",
13539
+ "required": false,
13540
+ "schema": {
13541
+ "type": "string"
13542
+ }
13543
+ },
13544
+ {
13545
+ "name": "sort",
13546
+ "in": "query",
13547
+ "description": "Result ordering: 'recent' (default, newest first) or 'curated' (curated/recognizable first)",
13548
+ "required": false,
13549
+ "schema": {
13550
+ "type": "string"
13551
+ }
13552
+ },
13523
13553
  {
13524
13554
  "name": "cursor",
13525
13555
  "in": "query",
@@ -13661,6 +13691,16 @@
13661
13691
  "type": "boolean",
13662
13692
  "default": false
13663
13693
  }
13694
+ },
13695
+ {
13696
+ "name": "publishedOnly",
13697
+ "in": "query",
13698
+ "description": "Resolve only published services (curated public pSEO set); 404 otherwise. Default false",
13699
+ "required": false,
13700
+ "schema": {
13701
+ "type": "boolean",
13702
+ "default": false
13703
+ }
13664
13704
  }
13665
13705
  ],
13666
13706
  "responses": {
@@ -15358,6 +15398,18 @@
15358
15398
  "summary": "Global status summary across all services",
15359
15399
  "description": "Returns aggregate counts of services by status and a list of services currently experiencing issues.",
15360
15400
  "operationId": "getGlobalStatusSummary",
15401
+ "parameters": [
15402
+ {
15403
+ "name": "publishedOnly",
15404
+ "in": "query",
15405
+ "description": "Aggregate only published services (curated public pSEO set); default false",
15406
+ "required": false,
15407
+ "schema": {
15408
+ "type": "boolean",
15409
+ "default": false
15410
+ }
15411
+ }
15412
+ ],
15361
15413
  "responses": {
15362
15414
  "200": {
15363
15415
  "description": "OK",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "devhelm-mcp-server"
3
- version = "1.2.0"
3
+ version = "1.4.0"
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"
@@ -23,8 +23,8 @@ dependencies = [
23
23
  # `client.services` catalog resource and the extended
24
24
  # `client.dependencies` (component-level track + alert sensitivity)
25
25
  # that the services/dependencies tool modules call directly.
26
- "devhelm>=1.3.0",
27
- "fastmcp>=2.0.0",
26
+ "devhelm>=1.4.0",
27
+ "fastmcp>=3.2.3,<4",
28
28
  ]
29
29
 
30
30
  [project.urls]
@@ -24,6 +24,14 @@ def register(mcp: FastMCP) -> None:
24
24
  except DevhelmError as e:
25
25
  raise_tool_error(e)
26
26
 
27
+ @mcp.tool()
28
+ def get_api_key(key_id: str, api_token: str | None = None) -> ToolResult:
29
+ """Get a single API key's metadata by id. The secret value is never returned."""
30
+ try:
31
+ return serialize(get_client(api_token).api_keys.get(key_id))
32
+ except DevhelmError as e:
33
+ raise_tool_error(e)
34
+
27
35
  @mcp.tool()
28
36
  def create_api_key(
29
37
  body: CreateApiKeyRequest, api_token: str | None = None
@@ -71,6 +71,15 @@ def main() -> None:
71
71
  kwargs = extract_kwargs(args)
72
72
  kwargs["api_token"] = token
73
73
 
74
+ # The harness contract is "error JSON on stderr, nothing else" — the
75
+ # monorepo surface tests json.loads() the stream. fastmcp >= 3 logs
76
+ # tool-call exceptions to stderr as Rich tracebacks, which silently
77
+ # degraded every parsed error payload to a raw string. Kill all
78
+ # library logging before the server is imported.
79
+ import logging
80
+
81
+ logging.disable(logging.CRITICAL)
82
+
74
83
  import asyncio
75
84
 
76
85
  from devhelm_mcp.server import mcp # noqa: E402
@@ -11,7 +11,7 @@ from typing import Any
11
11
 
12
12
  import pytest
13
13
 
14
- from devhelm_mcp.server import mcp
14
+ from devhelm_mcp.server import _strip_internal_schema_fields, mcp
15
15
 
16
16
  RegisteredTools = dict[str, Any]
17
17
 
@@ -75,6 +75,7 @@ EXPECTED_TOOLS = [
75
75
  "delete_webhook",
76
76
  "test_webhook",
77
77
  "list_api_keys",
78
+ "get_api_key",
78
79
  "create_api_key",
79
80
  "revoke_api_key",
80
81
  "delete_api_key",
@@ -141,7 +142,16 @@ EXPECTED_TOOLS = [
141
142
 
142
143
  @pytest.fixture(scope="module")
143
144
  def registered_tools() -> RegisteredTools:
144
- tools = asyncio.run(mcp.list_tools())
145
+ # Mirror production startup: the schema strip (api_token / managedBy) is
146
+ # applied in the HTTP lifespan and stdio entrypoint, NOT at import time
147
+ # (that was moved out in the v0.7.2 hotfix to avoid an asyncio.run() crash
148
+ # under Uvicorn). The fixture must apply it too, otherwise it asserts
149
+ # against the pre-strip schema and the hidden-field tests fail.
150
+ async def _build() -> list[Any]:
151
+ await _strip_internal_schema_fields()
152
+ return list(await mcp.list_tools())
153
+
154
+ tools = asyncio.run(_build())
145
155
  return {t.name: t for t in tools}
146
156
 
147
157
 
@@ -388,20 +388,20 @@ wheels = [
388
388
 
389
389
  [[package]]
390
390
  name = "devhelm"
391
- version = "1.3.0"
391
+ version = "1.4.0"
392
392
  source = { registry = "https://pypi.org/simple" }
393
393
  dependencies = [
394
394
  { name = "httpx" },
395
395
  { name = "pydantic", extra = ["email"] },
396
396
  ]
397
- sdist = { url = "https://files.pythonhosted.org/packages/2f/2e/317082ad26945cdf815040ce48c45ecde7537ccae89d8011bc02840c9325/devhelm-1.3.0.tar.gz", hash = "sha256:fb270af6919bf6bc426de850b0bbd6251ec72a061f6d3170a79e2ead271283cb", size = 261987, upload-time = "2026-06-10T14:00:21.546Z" }
397
+ sdist = { url = "https://files.pythonhosted.org/packages/03/e2/9446a3c3751fa0b09462172f9f9208777aeb4bcb624eaa58a1a38eff42af/devhelm-1.4.0.tar.gz", hash = "sha256:739cd4eb8e35d7a42a63e961c62d4bc62470a70a83a67652a4e4037ce0788a98", size = 263937, upload-time = "2026-06-12T12:16:36.526Z" }
398
398
  wheels = [
399
- { url = "https://files.pythonhosted.org/packages/c5/62/261bc0a6551d8098670e755e4a44a74ea8c032edda472364d9a6bd73992c/devhelm-1.3.0-py3-none-any.whl", hash = "sha256:19fac4faad7af71e384ebcb7afd63c8198ad03367c411f88769ac81a1bcbdea2", size = 88194, upload-time = "2026-06-10T14:00:20.547Z" },
399
+ { url = "https://files.pythonhosted.org/packages/1d/13/19cd23030b714a573e1d4f8d61ada95277c818c9915382b4edf3fb066a4b/devhelm-1.4.0-py3-none-any.whl", hash = "sha256:9b2b1dfb450f0871dc5806b462d41a3603932013148914c7447b278fd7995edc", size = 88701, upload-time = "2026-06-12T12:16:35.469Z" },
400
400
  ]
401
401
 
402
402
  [[package]]
403
403
  name = "devhelm-mcp-server"
404
- version = "1.2.0"
404
+ version = "1.4.0"
405
405
  source = { editable = "." }
406
406
  dependencies = [
407
407
  { name = "devhelm" },
@@ -419,8 +419,8 @@ dev = [
419
419
 
420
420
  [package.metadata]
421
421
  requires-dist = [
422
- { name = "devhelm", specifier = ">=1.3.0" },
423
- { name = "fastmcp", specifier = ">=2.0.0" },
422
+ { name = "devhelm", specifier = ">=1.4.0" },
423
+ { name = "fastmcp", specifier = ">=3.2.3,<4" },
424
424
  ]
425
425
 
426
426
  [package.metadata.requires-dev]