mirror of
https://github.com/aljazceru/opencode.git
synced 2026-01-09 02:44:55 +01:00
better mcp support - should fix hanging when streamable http server is added
This commit is contained in:
@@ -20,6 +20,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mcp": {
|
"mcp": {
|
||||||
|
"context7": {
|
||||||
|
"type": "remote",
|
||||||
|
"url": "https://mcp.context7.com/sse"
|
||||||
|
},
|
||||||
"weather": {
|
"weather": {
|
||||||
"type": "local",
|
"type": "local",
|
||||||
"command": ["opencode", "x", "@h1deya/mcp-server-weather"]
|
"command": ["opencode", "x", "@h1deya/mcp-server-weather"]
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import { experimental_createMCPClient, type Tool } from "ai"
|
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 { App } from "../app/app"
|
||||||
import { Config } from "../config/config"
|
import { Config } from "../config/config"
|
||||||
import { Log } from "../util/log"
|
import { Log } from "../util/log"
|
||||||
@@ -32,15 +34,28 @@ export namespace MCP {
|
|||||||
}
|
}
|
||||||
log.info("found", { key, type: mcp.type })
|
log.info("found", { key, type: mcp.type })
|
||||||
if (mcp.type === "remote") {
|
if (mcp.type === "remote") {
|
||||||
const client = await experimental_createMCPClient({
|
const transports = [
|
||||||
name: key,
|
new StreamableHTTPClientTransport(new URL(mcp.url), {
|
||||||
transport: {
|
requestInit: {
|
||||||
type: "sse",
|
headers: mcp.headers,
|
||||||
url: mcp.url,
|
},
|
||||||
headers: mcp.headers,
|
}),
|
||||||
},
|
new SSEClientTransport(new URL(mcp.url), {
|
||||||
}).catch(() => {})
|
requestInit: {
|
||||||
if (!client) {
|
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, {
|
Bus.publish(Session.Event.Error, {
|
||||||
error: {
|
error: {
|
||||||
name: "UnknownError",
|
name: "UnknownError",
|
||||||
@@ -49,16 +64,13 @@ export namespace MCP {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
continue
|
|
||||||
}
|
|
||||||
clients[key] = client
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mcp.type === "local") {
|
if (mcp.type === "local") {
|
||||||
const [cmd, ...args] = mcp.command
|
const [cmd, ...args] = mcp.command
|
||||||
const client = await experimental_createMCPClient({
|
const client = await experimental_createMCPClient({
|
||||||
name: key,
|
name: key,
|
||||||
transport: new Experimental_StdioMCPTransport({
|
transport: new StdioClientTransport({
|
||||||
stderr: "ignore",
|
stderr: "ignore",
|
||||||
command: cmd,
|
command: cmd,
|
||||||
args,
|
args,
|
||||||
|
|||||||
Reference in New Issue
Block a user