Sfoglia il codice sorgente

better mcp support - should fix hanging when streamable http server is added

Dax Raad 7 mesi fa
parent
commit
e8eaa77bf1
2 ha cambiato i file con 30 aggiunte e 14 eliminazioni
  1. 4 0
      opencode.json
  2. 26 14
      packages/opencode/src/mcp/index.ts

+ 4 - 0
opencode.json

@@ -20,6 +20,10 @@
     }
   },
   "mcp": {
+    "context7": {
+      "type": "remote",
+      "url": "https://mcp.context7.com/sse"
+    },
     "weather": {
       "type": "local",
       "command": ["opencode", "x", "@h1deya/mcp-server-weather"]

+ 26 - 14
packages/opencode/src/mcp/index.ts

@@ -1,5 +1,7 @@
 import { experimental_createMCPClient, type Tool } from "ai"
-import { Experimental_StdioMCPTransport } from "ai/mcp-stdio"
+import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"
+import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js"
+import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js"
 import { App } from "../app/app"
 import { Config } from "../config/config"
 import { Log } from "../util/log"
@@ -32,15 +34,28 @@ export namespace MCP {
         }
         log.info("found", { key, type: mcp.type })
         if (mcp.type === "remote") {
-          const client = await experimental_createMCPClient({
-            name: key,
-            transport: {
-              type: "sse",
-              url: mcp.url,
-              headers: mcp.headers,
-            },
-          }).catch(() => {})
-          if (!client) {
+          const transports = [
+            new StreamableHTTPClientTransport(new URL(mcp.url), {
+              requestInit: {
+                headers: mcp.headers,
+              },
+            }),
+            new SSEClientTransport(new URL(mcp.url), {
+              requestInit: {
+                headers: mcp.headers,
+              },
+            }),
+          ]
+          for (const transport of transports) {
+            const client = await experimental_createMCPClient({
+              name: key,
+              transport,
+            }).catch(() => {})
+            if (!client) continue
+            clients[key] = client
+            break
+          }
+          if (!clients[key])
             Bus.publish(Session.Event.Error, {
               error: {
                 name: "UnknownError",
@@ -49,16 +64,13 @@ export namespace MCP {
                 },
               },
             })
-            continue
-          }
-          clients[key] = client
         }
 
         if (mcp.type === "local") {
           const [cmd, ...args] = mcp.command
           const client = await experimental_createMCPClient({
             name: key,
-            transport: new Experimental_StdioMCPTransport({
+            transport: new StdioClientTransport({
               stderr: "ignore",
               command: cmd,
               args,