refactor(mcp): fix mock placement, type annotation, and constructor validation
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 14s
CI / build (pull_request) Successful in 16s
CI / typecheck (pull_request) Successful in 30s
CI / quality (pull_request) Successful in 32s
CI / security (pull_request) Successful in 34s
CI / integration_tests (pull_request) Successful in 3m24s
CI / unit_tests (pull_request) Successful in 10m40s
CI / docker (pull_request) Successful in 1m4s
CI / benchmark-regression (pull_request) Successful in 19m50s
CI / coverage (pull_request) Successful in 28m33s

- Extract MockMCPTransport to features/mocks/mock_mcp_transport.py
- Use ToolRegistry type with TYPE_CHECKING in register_tools()
- Move transport config validation into __init__ via _validate_config()
This commit is contained in:
2026-02-25 14:17:34 +00:00
parent 2deddd3fe2
commit 2f9707cfdf
5 changed files with 102 additions and 109 deletions
+12 -35
View File
@@ -14,42 +14,18 @@ import sys
from pathlib import Path
from typing import Any
_ROOT = str(Path(__file__).resolve().parents[1])
_SRC = str(Path(__file__).resolve().parents[1] / "src")
if _SRC not in sys.path:
sys.path.insert(0, _SRC)
for _p in (_SRC, _ROOT):
if _p not in sys.path:
sys.path.insert(0, _p)
from cleveragents.mcp.adapter import ( # noqa: E402
MCPServerConfig,
MCPToolAdapter,
MCPTransport,
)
from features.mocks.mock_mcp_transport import MockMCPTransport # noqa: E402
from cleveragents.mcp.adapter import MCPServerConfig, MCPToolAdapter # noqa: E402
from cleveragents.tool.registry import ToolRegistry # noqa: E402
class _MockTransport(MCPTransport):
"""Minimal mock transport for smoke tests."""
def __init__(self, tools: list[dict[str, Any]] | None = None) -> None:
self._tools = tools or []
self._results: dict[str, dict[str, Any]] = {}
def connect(self, config: MCPServerConfig) -> dict[str, Any]:
return {"capabilities": {"tools": True}}
def call(self, method: str, params: dict[str, Any]) -> dict[str, Any]:
if method == "tools/list":
return {"tools": list(self._tools)}
if method == "tools/call":
name = params.get("name", "")
if name in self._results:
return {"content": self._results[name]}
return {"content": {"result": "ok"}}
return {}
def close(self) -> None:
pass
def _mock_tool(name: str) -> dict[str, Any]:
return {"name": name, "description": f"Mock {name}", "inputSchema": {}}
@@ -89,7 +65,7 @@ def _discover_tools() -> int:
_mock_tool("search"),
]
config = MCPServerConfig(name="test", transport="stdio", command="echo")
transport = _MockTransport(tools=tools)
transport = MockMCPTransport(tools=tools)
adapter = MCPToolAdapter(config=config, transport=transport)
adapter.connect()
discovered = adapter.discover_tools()
@@ -102,8 +78,9 @@ def _discover_tools() -> int:
def _invoke_tool() -> int:
tools = [_mock_tool("create_issue")]
config = MCPServerConfig(name="test", transport="stdio", command="echo")
transport = _MockTransport(tools=tools)
transport._results["create_issue"] = {"id": 42}
transport = MockMCPTransport(
tools=tools, invoke_results={"create_issue": {"id": 42}}
)
adapter = MCPToolAdapter(config=config, transport=transport)
adapter.connect()
adapter.discover_tools()
@@ -116,7 +93,7 @@ def _invoke_tool() -> int:
def _register_tools() -> int:
tools = [_mock_tool("tool_a"), _mock_tool("tool_b")]
config = MCPServerConfig(name="test", transport="stdio", command="echo")
transport = _MockTransport(tools=tools)
transport = MockMCPTransport(tools=tools)
adapter = MCPToolAdapter(config=config, transport=transport)
adapter.connect()
registry = ToolRegistry()