From 8be853a6576db8112166b3ff9f660c133153f671 Mon Sep 17 00:00:00 2001 From: Vamil Gandhi <13998000+vamgan@users.noreply.github.com> Date: Mon, 11 May 2026 01:55:59 -0400 Subject: [PATCH] Improve MCP text response decoding --- src/index.ts | 16 ++++++++++++++-- test/client.test.ts | 17 +++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index 8b93ee4..5d2c5a3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -145,9 +145,21 @@ function removeUndefinedValues(input: Record): Record(result: unknown): Result { if (isTextContentResult(result)) { - const text = result.content.find((item) => item.type === "text")?.text; - if (typeof text === "string") { + const text = result.content + .filter((item) => item.type === "text" && typeof item.text === "string") + .map((item) => item.text) + .join("\n") + .trim(); + if ((result as { isError?: unknown }).isError === true) { + throw new Error(text || "MCP tool call failed."); + } + if (!text) { + throw new Error("MCP tool response did not include text content."); + } + try { return JSON.parse(text) as Result; + } catch (error) { + throw new Error(`MCP tool response was not valid JSON: ${error instanceof Error ? error.message : String(error)}`); } } return result as Result; diff --git a/test/client.test.ts b/test/client.test.ts index caa2f3e..cfdd352 100644 --- a/test/client.test.ts +++ b/test/client.test.ts @@ -167,4 +167,21 @@ describe("AgentDispatchMcpClient", () => { await expect(client.listProviders()).resolves.toEqual(["aws", "gcp"]); }); + + it("throws clear errors for MCP error and malformed text responses", async () => { + const errorClient = new AgentDispatchMcpClient({ + callTool: async () => ({ content: [{ type: "text", text: "bad request" }], isError: true }) + }); + await expect(errorClient.listProviders()).rejects.toThrow("bad request"); + + const malformedClient = new AgentDispatchMcpClient({ + callTool: async () => ({ content: [{ type: "text", text: "not json" }] }) + }); + await expect(malformedClient.listProviders()).rejects.toThrow("not valid JSON"); + + const emptyClient = new AgentDispatchMcpClient({ + callTool: async () => ({ content: [{ type: "image", data: "..." }] }) + }); + await expect(emptyClient.listProviders()).rejects.toThrow("did not include text content"); + }); });