From 6f3d9a5dd498766a9b8d6e88d32c6cb30811468f Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Sun, 6 Apr 2025 19:25:17 -0700 Subject: [PATCH] fix: patch returns for MCP tools (#1593) --- letta/functions/mcp_client/base_client.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/letta/functions/mcp_client/base_client.py b/letta/functions/mcp_client/base_client.py index 851c3d30..28d7e3da 100644 --- a/letta/functions/mcp_client/base_client.py +++ b/letta/functions/mcp_client/base_client.py @@ -2,6 +2,7 @@ import asyncio from typing import List, Optional, Tuple from mcp import ClientSession +from mcp.types import TextContent from letta.functions.mcp_client.exceptions import MCPTimeoutError from letta.functions.mcp_client.types import BaseServerConfig, MCPTool @@ -60,7 +61,23 @@ class BaseMCPClient: result = self.loop.run_until_complete( asyncio.wait_for(self.session.call_tool(tool_name, tool_args), timeout=tool_settings.mcp_execute_tool_timeout) ) - return str(result.content), result.isError + + parsed_content = [] + for content_piece in result.content: + if isinstance(content_piece, TextContent): + parsed_content.append(content_piece.text) + print("parsed_content (text)", parsed_content) + else: + parsed_content.append(str(content_piece)) + print("parsed_content (other)", parsed_content) + + if len(parsed_content) > 0: + final_content = " ".join(parsed_content) + else: + # TODO move hardcoding to constants + final_content = "Empty response from tool" + + return final_content, result.isError except asyncio.TimeoutError: logger.error( f"Timed out while executing tool '{tool_name}' for MCP server {self.server_config.server_name} (timeout={tool_settings.mcp_execute_tool_timeout}s)."