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.
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/PKG-INFO +3 -3
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/docs/openapi/monitoring-api.json +52 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/pyproject.toml +3 -3
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/api_keys.py +8 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/tests/run_mcp.py +9 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/tests/test_tools.py +12 -2
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/uv.lock +6 -6
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/.github/workflows/ci.yml +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/.github/workflows/release.yml +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/.github/workflows/spec-check.yml +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/.gitignore +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/CHANGELOG.md +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/LICENSE +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/Makefile +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/README.md +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/docker/Dockerfile +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/scripts/regen-from.sh +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/scripts/release.sh +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/server.json +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/__init__.py +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/client.py +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/server.py +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/__init__.py +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/alert_channels.py +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/dependencies.py +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/deploy_lock.py +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/environments.py +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/forensics.py +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/incidents.py +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/maintenance_windows.py +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/monitors.py +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/notification_policies.py +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/resource_groups.py +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/secrets.py +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/services.py +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/status.py +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/status_pages.py +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/tags.py +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/webhooks.py +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/tests/__init__.py +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/tests/test_auth.py +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/tests/test_cli.py +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/tests/test_client.py +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/tests/test_devex_round3_fixes.py +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/tests/test_maintenance_windows.py +0 -0
- {devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/tests/test_services.py +0 -0
- {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.
|
|
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.
|
|
22
|
-
Requires-Dist: fastmcp
|
|
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.
|
|
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.
|
|
27
|
-
"fastmcp>=2.
|
|
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
|
-
|
|
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.
|
|
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/
|
|
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/
|
|
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.
|
|
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.
|
|
423
|
-
{ name = "fastmcp", specifier = ">=2.
|
|
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]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/alert_channels.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/maintenance_windows.py
RENAMED
|
File without changes
|
|
File without changes
|
{devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/notification_policies.py
RENAMED
|
File without changes
|
{devhelm_mcp_server-1.2.0 → devhelm_mcp_server-1.4.0}/src/devhelm_mcp/tools/resource_groups.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|