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(