From 9258e8ca86136bb1f4f7d6831ccc6744051e3ee0 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Sun, 14 Jun 2026 21:24:54 -0500 Subject: [PATCH] fix(mcp): type tool error content --- packages/opencode/src/mcp/catalog.ts | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/packages/opencode/src/mcp/catalog.ts b/packages/opencode/src/mcp/catalog.ts index de374d26f..1253e5f08 100644 --- a/packages/opencode/src/mcp/catalog.ts +++ b/packages/opencode/src/mcp/catalog.ts @@ -64,12 +64,7 @@ export function convertTool(mcpTool: MCPToolDef, client: Client, timeout?: numbe }, ) if (result.isError) - throw new Error( - result.content - .flatMap((item) => (item.type === "text" ? [item.text] : [])) - .filter((text) => text.trim()) - .join("\n\n") || "MCP tool returned an error", - ) + throw new Error(formatToolErrorContent(result.content)) if (result.structuredContent === undefined || result.structuredContent === null) return result return { ...result, @@ -107,6 +102,22 @@ export function fetch( export const sanitize = (value: string) => value.replace(/[^a-zA-Z0-9_-]/g, "_") +function formatToolErrorContent(content: unknown) { + if (!Array.isArray(content)) return "MCP tool returned an error" + return ( + content + .flatMap((item) => (isTextContent(item) ? [item.text] : [])) + .filter((text) => text.trim()) + .join("\n\n") || "MCP tool returned an error" + ) +} + +function isTextContent(value: unknown): value is { type: "text"; text: string } { + if (typeof value !== "object" || value === null) return false + const item = value as Record + return item.type === "text" && typeof item.text === "string" +} + export function prompts(client: Client, timeout?: number) { if (!client.getServerCapabilities()?.prompts) return Promise.resolve([]) return paginate(