From 83f4e8e1560c1489796bd8dbf2e07e3f3e7e2471 Mon Sep 17 00:00:00 2001 From: rmoriz Date: Sat, 9 Aug 2025 02:04:26 +0200 Subject: [PATCH] Clarify remote mcp error (#1729) Co-authored-by: opencode --- packages/opencode/src/mcp/index.ts | 77 +++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 22 deletions(-) diff --git a/packages/opencode/src/mcp/index.ts b/packages/opencode/src/mcp/index.ts index 7057be51..8f614b63 100644 --- a/packages/opencode/src/mcp/index.ts +++ b/packages/opencode/src/mcp/index.ts @@ -35,35 +35,58 @@ export namespace MCP { log.info("found", { key, type: mcp.type }) if (mcp.type === "remote") { const transports = [ - new StreamableHTTPClientTransport(new URL(mcp.url), { - requestInit: { - headers: mcp.headers, - }, - }), - new SSEClientTransport(new URL(mcp.url), { - requestInit: { - headers: mcp.headers, - }, - }), + { + name: "StreamableHTTP", + transport: new StreamableHTTPClientTransport(new URL(mcp.url), { + requestInit: { + headers: mcp.headers, + }, + }), + }, + { + name: "SSE", + transport: new SSEClientTransport(new URL(mcp.url), { + requestInit: { + headers: mcp.headers, + }, + }), + }, ] - for (const transport of transports) { + let lastError: Error | undefined + for (const { name, transport } of transports) { const client = await experimental_createMCPClient({ name: key, transport, - }).catch(() => {}) - if (!client) continue - clients[key] = client - break + }).catch((error) => { + lastError = error instanceof Error ? error : new Error(String(error)) + log.debug("transport connection failed", { + key, + transport: name, + url: mcp.url, + error: lastError.message, + }) + return null + }) + if (client) { + log.debug("transport connection succeeded", { key, transport: name }) + clients[key] = client + break + } } - if (!clients[key]) + if (!clients[key]) { + const errorMessage = lastError + ? `MCP server ${key} failed to connect: ${lastError.message}` + : `MCP server ${key} failed to connect to ${mcp.url}` + log.error("remote mcp connection failed", { key, url: mcp.url, error: lastError?.message }) Bus.publish(Session.Event.Error, { error: { name: "UnknownError", data: { - message: `MCP server ${key} failed to start`, + message: errorMessage, }, }, }) + } } if (mcp.type === "local") { @@ -80,19 +103,29 @@ export namespace MCP { ...mcp.environment, }, }), - }).catch(() => {}) - if (!client) { + }).catch((error) => { + const errorMessage = + error instanceof Error + ? `MCP server ${key} failed to start: ${error.message}` + : `MCP server ${key} failed to start` + log.error("local mcp startup failed", { + key, + command: mcp.command, + error: error instanceof Error ? error.message : String(error), + }) Bus.publish(Session.Event.Error, { error: { name: "UnknownError", data: { - message: `MCP server ${key} failed to start`, + message: errorMessage, }, }, }) - continue + return null + }) + if (client) { + clients[key] = client } - clients[key] = client } }