diff --git a/openhcs/mcp/server.py b/openhcs/mcp/server.py index 90a44d50e..d9978ca56 100644 --- a/openhcs/mcp/server.py +++ b/openhcs/mcp/server.py @@ -1986,9 +1986,8 @@ def control_args( arguments: Mapping[str, JsonValue], timeout_policy: type[McpControlTimeoutPolicy] = McpViewerTimeoutPolicy, ) -> "McpViewerConnectionToolArgs": - return dataclass_from_mapping( - McpViewerConnectionToolFields, - arguments, + return McpViewerConnectionToolFields.from_tool_arguments( + arguments ).to_control_args(timeout_policy) @staticmethod @@ -2647,6 +2646,26 @@ class McpViewerConnectionToolFields: transport_mode: TransportMode | None = None timeout_ms: int | None = None + @classmethod + def from_tool_arguments( + cls, + arguments: Mapping[str, JsonValue], + ) -> Self: + """Reconstruct this record from its own declared tool fields.""" + declared_names = tuple( + declared_field.name + for declared_field in dataclass_fields(cls) + if declared_field.init + ) + return dataclass_from_mapping( + cls, + { + field_name: arguments[field_name] + for field_name in declared_names + if field_name in arguments + }, + ) + @classmethod def signature_parameters( cls, diff --git a/tests/unit/agent/test_mcp_server.py b/tests/unit/agent/test_mcp_server.py index e2a984e10..41c0026f2 100644 --- a/tests/unit/agent/test_mcp_server.py +++ b/tests/unit/agent/test_mcp_server.py @@ -14830,6 +14830,7 @@ def test_mcp_viewer_connection_tool_fields_parse_nominal_transport_from_wire(): "host": "127.0.0.1", "transport_mode": "tcp", "timeout_ms": 2000, + "route_key": "image-layer", }, server.McpViewerCommandTimeoutPolicy, )