summaryrefslogtreecommitdiff
path: root/packages/core/src/tools/mcp-tool.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/core/src/tools/mcp-tool.ts')
-rw-r--r--packages/core/src/tools/mcp-tool.ts30
1 files changed, 30 insertions, 0 deletions
diff --git a/packages/core/src/tools/mcp-tool.ts b/packages/core/src/tools/mcp-tool.ts
index fbb104fd..88e89c85 100644
--- a/packages/core/src/tools/mcp-tool.ts
+++ b/packages/core/src/tools/mcp-tool.ts
@@ -104,6 +104,28 @@ class DiscoveredMCPToolInvocation extends BaseToolInvocation<
return confirmationDetails;
}
+ // Determine if the response contains tool errors
+ // This is needed because CallToolResults should return errors inside the response.
+ // ref: https://modelcontextprotocol.io/specification/2025-06-18/schema#calltoolresult
+ isMCPToolError(rawResponseParts: Part[]): boolean {
+ const functionResponse = rawResponseParts?.[0]?.functionResponse;
+ const response = functionResponse?.response;
+
+ interface McpError {
+ isError?: boolean | string;
+ }
+
+ if (response) {
+ const error = (response as { error?: McpError })?.error;
+ const isError = error?.isError;
+
+ if (error && (isError === true || isError === 'true')) {
+ return true;
+ }
+ }
+ return false;
+ }
+
async execute(): Promise<ToolResult> {
const functionCalls: FunctionCall[] = [
{
@@ -113,6 +135,14 @@ class DiscoveredMCPToolInvocation extends BaseToolInvocation<
];
const rawResponseParts = await this.mcpTool.callTool(functionCalls);
+
+ // Ensure the response is not an error
+ if (this.isMCPToolError(rawResponseParts)) {
+ throw new Error(
+ `MCP tool '${this.serverToolName}' reported tool error with response: ${JSON.stringify(rawResponseParts)}`,
+ );
+ }
+
const transformedParts = transformMcpContentToParts(rawResponseParts);
return {