Source code for design_research_agents._mcp_server._adapters
"""Adapters between internal tool contracts and MCP JSON-RPC payloads."""
from __future__ import annotations
import json
from dataclasses import asdict
from design_research_agents._contracts._tools import ToolResult, ToolSpec
[docs]
def tool_spec_to_mcp_payload(spec: ToolSpec) -> dict[str, object]:
"""Convert one ToolSpec into MCP ``tools/list`` payload shape.
Args:
spec: Internal tool specification to expose over MCP.
Returns:
MCP-compatible ``tools/list`` entry.
"""
return {
"name": spec.name,
"description": spec.description,
"inputSchema": spec.input_schema,
}
[docs]
def tool_result_to_mcp_payload(result: ToolResult) -> dict[str, object]:
"""Convert one ToolResult into MCP ``tools/call`` response payload.
Args:
result: Internal tool invocation result.
Returns:
MCP-compatible ``tools/call`` response payload.
"""
structured_content = {
"tool_name": result.tool_name,
"ok": result.ok,
"result": result.result,
"artifacts": [asdict(artifact) for artifact in result.artifacts],
"warnings": list(result.warnings),
"error": asdict(result.error) if result.error is not None else None,
"metadata": result.metadata,
}
return {
"isError": not result.ok,
"structuredContent": structured_content,
"content": [
{
"type": "text",
"text": json.dumps(structured_content, ensure_ascii=True),
}
],
}
__all__ = ["tool_result_to_mcp_payload", "tool_spec_to_mcp_payload"]