diff --git a/plugins/communication_protocols/mcp/pyproject.toml b/plugins/communication_protocols/mcp/pyproject.toml index 2cfd9a2..87461b7 100644 --- a/plugins/communication_protocols/mcp/pyproject.toml +++ b/plugins/communication_protocols/mcp/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "utcp-mcp" -version = "1.1.0" +version = "1.1.2" authors = [ { name = "UTCP Contributors" }, ] diff --git a/plugins/communication_protocols/mcp/src/utcp_mcp/mcp_communication_protocol.py b/plugins/communication_protocols/mcp/src/utcp_mcp/mcp_communication_protocol.py index 3d419d4..7204b43 100644 --- a/plugins/communication_protocols/mcp/src/utcp_mcp/mcp_communication_protocol.py +++ b/plugins/communication_protocols/mcp/src/utcp_mcp/mcp_communication_protocol.py @@ -194,8 +194,8 @@ async def register_manual(self, caller: 'UtcpClient', manual_call_template: Call utcp_tool = Tool( name=mcp_tool.name, description=mcp_tool.description, - input_schema=mcp_tool.inputSchema, - output_schema=mcp_tool.outputSchema, + inputs=mcp_tool.inputSchema, + outputs=mcp_tool.outputSchema, tool_call_template=manual_call_template ) all_tools.append(utcp_tool) @@ -212,12 +212,12 @@ async def register_manual(self, caller: 'UtcpClient', manual_call_template: Call resource_tool = Tool( name=f"{server_name}.resource_{mcp_resource.name}", description=f"Read resource: {mcp_resource.description or mcp_resource.name}. URI: {mcp_resource.uri}", - input_schema={ + inputs={ "type": "object", "properties": {}, "required": [] }, - output_schema={ + outputs={ "type": "object", "properties": { "contents": { @@ -384,12 +384,15 @@ async def call_tool_streaming(self, caller: 'UtcpClient', tool_name: str, tool_a def _process_tool_result(self, result, tool_name: str) -> Any: self._log_info(f"Processing tool result for '{tool_name}', type: {type(result)}") - # Check for structured output first - if hasattr(result, 'structured_output'): - self._log_info(f"Found structured_output: {result.structured_output}") - return result.structured_output + # Check for structured output first - this is the expected behavior + if hasattr(result, 'structuredContent'): + self._log_info(f"Found structuredContent: {result.structuredContent}") + # If structuredContent has a 'result' key, unwrap it + if isinstance(result.structuredContent, dict) and 'result' in result.structuredContent: + return result.structuredContent['result'] + return result.structuredContent - # Process content if available + # Process content if available (fallback) if hasattr(result, 'content'): content = result.content self._log_info(f"Content type: {type(content)}") @@ -427,6 +430,10 @@ def _process_tool_result(self, result, tool_name: str) -> Any: return content + # Handle dictionary with 'result' key + if isinstance(result, dict) and 'result' in result: + return result['result'] + # Fallback to result attribute if hasattr(result, 'result'): return result.result diff --git a/plugins/communication_protocols/mcp/tests/test_mcp_http_transport.py b/plugins/communication_protocols/mcp/tests/test_mcp_http_transport.py index adaadb4..ff82f68 100644 --- a/plugins/communication_protocols/mcp/tests/test_mcp_http_transport.py +++ b/plugins/communication_protocols/mcp/tests/test_mcp_http_transport.py @@ -154,9 +154,7 @@ async def test_http_list_output( assert isinstance(result, list) assert len(result) == 3 - assert result[0] == "item_0" - assert result[1] == "item_1" - assert result[2] == "item_2" + assert result == ["item_0", "item_1", "item_2"] @pytest.mark.asyncio