summaryrefslogtreecommitdiffhomepage
path: root/packages
diff options
context:
space:
mode:
authorAbdelkader Boudih <[email protected]>2025-12-24 02:36:37 +0100
committerGitHub <[email protected]>2025-12-23 19:36:37 -0600
commitf4d61be8bdd857bd85481a787fc754dfa766fe92 (patch)
treed9a2bd2dfd6af8ddefe5d4dc4f5cca8fb0cd5200 /packages
parent8b40e38cd7f03fa7141f21020a971a6030673cc9 (diff)
downloadopencode-f4d61be8bdd857bd85481a787fc754dfa766fe92.tar.gz
opencode-f4d61be8bdd857bd85481a787fc754dfa766fe92.zip
feat(mcp): handle tools/list_changed notifications (#5913)
Co-authored-by: Aiden Cline <[email protected]> Co-authored-by: Aiden Cline <[email protected]>
Diffstat (limited to 'packages')
-rw-r--r--packages/opencode/src/mcp/index.ts20
1 files changed, 19 insertions, 1 deletions
diff --git a/packages/opencode/src/mcp/index.ts b/packages/opencode/src/mcp/index.ts
index 40ee25565..88886c4ff 100644
--- a/packages/opencode/src/mcp/index.ts
+++ b/packages/opencode/src/mcp/index.ts
@@ -4,7 +4,7 @@ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/
import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js"
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js"
import { UnauthorizedError } from "@modelcontextprotocol/sdk/client/auth.js"
-import type { Tool as MCPToolDef } from "@modelcontextprotocol/sdk/types.js"
+import { type Tool as MCPToolDef, ToolListChangedNotificationSchema } from "@modelcontextprotocol/sdk/types.js"
import { Config } from "../config/config"
import { Log } from "../util/log"
import { NamedError } from "@opencode-ai/util/error"
@@ -15,6 +15,7 @@ import { withTimeout } from "@/util/timeout"
import { McpOAuthProvider } from "./oauth-provider"
import { McpOAuthCallback } from "./oauth-callback"
import { McpAuth } from "./auth"
+import { BusEvent } from "../bus/bus-event"
import { Bus } from "@/bus"
import { TuiEvent } from "@/cli/cmd/tui/event"
import open from "open"
@@ -22,6 +23,13 @@ import open from "open"
export namespace MCP {
const log = Log.create({ service: "mcp" })
+ export const ToolsChanged = BusEvent.define(
+ "mcp.tools.changed",
+ z.object({
+ server: z.string(),
+ }),
+ )
+
export const Failed = NamedError.create(
"MCPFailed",
z.object({
@@ -76,6 +84,14 @@ export namespace MCP {
})
export type Status = z.infer<typeof Status>
+ // Register notification handlers for MCP client
+ function registerNotificationHandlers(client: MCPClient, serverName: string) {
+ client.setNotificationHandler(ToolListChangedNotificationSchema, async () => {
+ log.info("tools list changed notification received", { server: serverName })
+ Bus.publish(ToolsChanged, { server: serverName })
+ })
+ }
+
// Convert MCP tool definition to AI SDK Tool type
function convertMcpTool(mcpTool: MCPToolDef, client: MCPClient): Tool {
const inputSchema = mcpTool.inputSchema
@@ -236,6 +252,7 @@ export namespace MCP {
version: Installation.VERSION,
})
await client.connect(transport)
+ registerNotificationHandlers(client, key)
mcpClient = client
log.info("connected", { key, transport: name })
status = { status: "connected" }
@@ -308,6 +325,7 @@ export namespace MCP {
version: Installation.VERSION,
})
await client.connect(transport)
+ registerNotificationHandlers(client, key)
mcpClient = client
status = {
status: "connected",