Files
ITWorx_MCP_Hub-Public/packages/hub_clients/matrix.py
T

70 lines
2.2 KiB
Python

"""Deterministic MCP discovery/invocation matrix for supported client profiles."""
from __future__ import annotations
from dataclasses import dataclass
from typing import Any
from .models import ClientKind
@dataclass(frozen=True)
class MatrixResult:
client_kind: ClientKind
protocol_version: str
connector: str
tool: str
discovered: bool
invoked: bool
detail: str
class FakeVirtualServer:
"""Offline project virtual server used for the client matrix and negative cases."""
def __init__(self) -> None:
self.tools = {
"gitea": "gitea.repository.get",
"knowledge": "knowledge.document.search",
"unraid": "unraid.container.inspect",
}
self.revoked: set[str] = set()
def discover(self, client_key: str, protocol_version: str) -> tuple[str, ...]:
if client_key in self.revoked:
raise PermissionError("client revoked")
if protocol_version not in {"2026-07-28", "2025-11-25"}:
raise ValueError("unsupported protocol version")
return tuple(self.tools.values())
def invoke(
self, client_key: str, tool: str, arguments: dict[str, Any] | None = None
) -> dict[str, Any]:
del arguments
if client_key in self.revoked:
raise PermissionError("client revoked")
if tool not in self.tools.values():
raise LookupError("tool not found")
return {"tool": tool, "ok": True, "truncated": False}
def run_matrix(server: FakeVirtualServer) -> tuple[MatrixResult, ...]:
profiles = (
(ClientKind.NATIVE_2026, "2026-07-28"),
(ClientKind.COMPATIBILITY_2025, "2025-11-25"),
(ClientKind.STDIO_BRIDGE, "2026-07-28"),
(ClientKind.INSPECTOR, "2026-07-28"),
)
results: list[MatrixResult] = []
for kind, revision in profiles:
client_key = kind.value
tools = server.discover(client_key, revision)
for connector, tool in server.tools.items():
invoked = bool(server.invoke(client_key, tool)["ok"])
results.append(
MatrixResult(
kind, revision, connector, tool, tool in tools, invoked, "fixture success"
)
)
return tuple(results)