diff --git a/src/core/tools/UseMcpToolTool.ts b/src/core/tools/UseMcpToolTool.ts index 4534a8fed8..66a66b0dae 100644 --- a/src/core/tools/UseMcpToolTool.ts +++ b/src/core/tools/UseMcpToolTool.ts @@ -325,17 +325,18 @@ export class UseMcpToolTool extends BaseTool<"use_mcp_tool"> { // Build the result text let resultText = outputText || "" - // If there are images, save them to temp storage and provide file paths to the LLM - // This avoids passing raw base64 through LLM context which causes corruption and high costs + // If there are images, save them to temp storage and provide both file paths and raw data to the LLM. + // File paths enable efficient persistence for future context, while raw base64 data allows + // the model to analyze images in the current turn. if (images.length > 0) { const savedImagePaths = await this.saveImagesToTempStorage(task, images, serverName, toolName) const imagePathsSection = savedImagePaths .map( (imgPath, index) => - `\n ${imgPath}\n`, + `\n ${imgPath}\n ${images[index]}\n`, ) .join("\n\n") - const imageInfo = `\n\n[${images.length} image(s) received and saved to temporary storage. Use save_image tool with source_path to save to your desired location.]\n\n${imagePathsSection}` + const imageInfo = `\n\n[${images.length} image(s) received and saved to temporary storage. Use save_image tool with source_path (preferred) or data to save to your desired location.]\n\n${imagePathsSection}` resultText = resultText ? resultText + imageInfo : imageInfo.trim() } diff --git a/src/core/tools/__tests__/useMcpToolTool.spec.ts b/src/core/tools/__tests__/useMcpToolTool.spec.ts index fc81b17978..402b4454d6 100644 --- a/src/core/tools/__tests__/useMcpToolTool.spec.ts +++ b/src/core/tools/__tests__/useMcpToolTool.spec.ts @@ -658,16 +658,21 @@ describe("useMcpToolTool", () => { expect(mockTask.say).toHaveBeenCalledWith( "mcp_server_response", expect.stringContaining( - "[1 image(s) received and saved to temporary storage. Use save_image tool with source_path to save to your desired location.]", + "[1 image(s) received and saved to temporary storage. Use save_image tool with source_path (preferred) or data to save to your desired location.]", ), ["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJ"], ) - // Text response should contain source_path XML tags, not raw base64 + // Text response should contain both source_path and data XML tags expect(mockTask.say).toHaveBeenCalledWith( "mcp_server_response", expect.stringContaining(""), expect.anything(), ) + expect(mockTask.say).toHaveBeenCalledWith( + "mcp_server_response", + expect.stringContaining(""), + expect.anything(), + ) expect(mockPushToolResult).toHaveBeenCalledWith(expect.stringContaining("with 1 image(s)")) }) @@ -726,12 +731,17 @@ describe("useMcpToolTool", () => { expect.stringContaining("Node name: Button"), ["data:image/png;base64,base64imagedata"], ) - // Text response should contain source_path, not raw base64 + // Text response should contain both source_path and data XML tags expect(mockTask.say).toHaveBeenCalledWith( "mcp_server_response", expect.stringContaining(""), expect.anything(), ) + expect(mockTask.say).toHaveBeenCalledWith( + "mcp_server_response", + expect.stringContaining(""), + expect.anything(), + ) expect(mockPushToolResult).toHaveBeenCalledWith(expect.stringContaining("with 1 image(s)")) }) @@ -788,7 +798,7 @@ describe("useMcpToolTool", () => { expect(mockTask.say).toHaveBeenCalledWith( "mcp_server_response", expect.stringContaining( - "[1 image(s) received and saved to temporary storage. Use save_image tool with source_path to save to your desired location.]", + "[1 image(s) received and saved to temporary storage. Use save_image tool with source_path (preferred) or data to save to your desired location.]", ), ["data:image/jpeg;base64,/9j/4AAQSkZJRg=="], ) @@ -851,7 +861,7 @@ describe("useMcpToolTool", () => { expect(mockTask.say).toHaveBeenCalledWith( "mcp_server_response", expect.stringContaining( - "[2 image(s) received and saved to temporary storage. Use save_image tool with source_path to save to your desired location.]", + "[2 image(s) received and saved to temporary storage. Use save_image tool with source_path (preferred) or data to save to your desired location.]", ), ["data:image/png;base64,image1data", "data:image/png;base64,image2data"], )