Просмотр исходного кода

Clarify remote mcp error (#1729)

Co-authored-by: opencode <[email protected]>
rmoriz 6 месяцев назад
Родитель
Сommit
83f4e8e156
1 измененных файлов с 55 добавлено и 22 удалено
  1. 55 22
      packages/opencode/src/mcp/index.ts

+ 55 - 22
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
         }
       }