summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDax Raad <[email protected]>2025-07-25 19:19:25 -0400
committerDax Raad <[email protected]>2025-07-25 19:19:47 -0400
commite8eaa77bf1714af985f82faf2cee6950ec3ea0f3 (patch)
treeff816baffa66842a6a49096ed8ccb95d57aae373
parenta07f37073b5726ef53c1f34a46990bd99cce59de (diff)
downloadopencode-e8eaa77bf1714af985f82faf2cee6950ec3ea0f3.tar.gz
opencode-e8eaa77bf1714af985f82faf2cee6950ec3ea0f3.zip
better mcp support - should fix hanging when streamable http server is added
-rw-r--r--opencode.json4
-rw-r--r--packages/opencode/src/mcp/index.ts40
2 files changed, 30 insertions, 14 deletions
diff --git a/opencode.json b/opencode.json
index a6c771813..8efc57a7a 100644
--- a/opencode.json
+++ b/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"]
diff --git a/packages/opencode/src/mcp/index.ts b/packages/opencode/src/mcp/index.ts
index 34aec6406..65c1253f3 100644
--- a/packages/opencode/src/mcp/index.ts
+++ b/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,