From 127f7009eba919df9d78958d7a82d5422b0ac027 Mon Sep 17 00:00:00 2001 From: ivy Date: Wed, 12 Mar 2025 17:12:07 +0800 Subject: [PATCH] fix: Improve error handling in MCP tool callbacks - Add null check for isError() method in SyncMcpToolCallback - Implement consistent error handling in AsyncMcpToolCallback to match SyncMcpToolCallback behavior - Throw IllegalStateException with error content when tool calls fail Resolves #2447 Signed-off-by: Christian Tzolov Co-authored-by: Christian Tzolov --- .../org/springframework/ai/mcp/AsyncMcpToolCallback.java | 9 ++++++--- .../org/springframework/ai/mcp/SyncMcpToolCallback.java | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/mcp/common/src/main/java/org/springframework/ai/mcp/AsyncMcpToolCallback.java b/mcp/common/src/main/java/org/springframework/ai/mcp/AsyncMcpToolCallback.java index 95d1b9039..f67b61632 100644 --- a/mcp/common/src/main/java/org/springframework/ai/mcp/AsyncMcpToolCallback.java +++ b/mcp/common/src/main/java/org/springframework/ai/mcp/AsyncMcpToolCallback.java @@ -109,9 +109,12 @@ public class AsyncMcpToolCallback implements ToolCallback { Map arguments = ModelOptionsUtils.jsonToMap(functionInput); // Note that we use the original tool name here, not the adapted one from // getToolDefinition - return this.asyncMcpClient.callTool(new CallToolRequest(this.tool.name(), arguments)) - .map(response -> ModelOptionsUtils.toJsonString(response.content())) - .block(); + return this.asyncMcpClient.callTool(new CallToolRequest(this.tool.name(), arguments)).map(response -> { + if (response.isError() != null && response.isError()) { + throw new IllegalStateException("Error calling tool: " + response.content()); + } + return ModelOptionsUtils.toJsonString(response.content()); + }).block(); } @Override diff --git a/mcp/common/src/main/java/org/springframework/ai/mcp/SyncMcpToolCallback.java b/mcp/common/src/main/java/org/springframework/ai/mcp/SyncMcpToolCallback.java index 1b71e9301..aa51e1f36 100644 --- a/mcp/common/src/main/java/org/springframework/ai/mcp/SyncMcpToolCallback.java +++ b/mcp/common/src/main/java/org/springframework/ai/mcp/SyncMcpToolCallback.java @@ -113,7 +113,7 @@ public class SyncMcpToolCallback implements ToolCallback { // Note that we use the original tool name here, not the adapted one from // getToolDefinition CallToolResult response = this.mcpClient.callTool(new CallToolRequest(this.tool.name(), arguments)); - if (response.isError()) { + if (response.isError() != null && response.isError()) { throw new IllegalStateException("Error calling tool: " + response.content()); } return ModelOptionsUtils.toJsonString(response.content());