|
|
@@ -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
|
|
|
}
|
|
|
}
|
|
|
|