fix(core): clean up mcp event surface (#35221)

This commit is contained in:
Aiden Cline 2026-07-03 13:43:21 -05:00 committed by GitHub
parent 394e0b9045
commit bf3ae45439
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 28 additions and 36 deletions

View file

@ -46,7 +46,11 @@ const TolerantListPromptsResult = ListPromptsResultSchema.extend({
export class NeedsAuthError extends Schema.TaggedErrorClass<NeedsAuthError>()("MCP.NeedsAuthError", {
server: Schema.String,
}) {}
}) {
override get message() {
return `MCP server requires authentication: ${this.server}`
}
}
export class ConnectError extends Schema.TaggedErrorClass<ConnectError>()("MCP.ConnectError", {
server: Schema.String,

View file

@ -127,7 +127,11 @@ export class ResourceContent extends Schema.Class<ResourceContent>("MCP.Resource
export class NotFoundError extends Schema.TaggedErrorClass<NotFoundError>()("MCP.NotFoundError", {
server: ServerName,
}) {}
}) {
override get message() {
return `MCP server not found: ${this.server}`
}
}
export class ToolCallError extends Schema.TaggedErrorClass<ToolCallError>()("MCP.ToolCallError", {
server: ServerName,

View file

@ -0,0 +1,14 @@
import { describe, expect, test } from "bun:test"
import { MCP } from "@opencode-ai/core/mcp/index"
import { MCPClient } from "@opencode-ai/core/mcp/client"
describe("MCP errors", () => {
test("expose useful messages", () => {
expect(new MCP.NotFoundError({ server: MCP.ServerName.make("demo") }).message).toBe("MCP server not found: demo")
expect(new MCP.ToolCallError({ server: MCP.ServerName.make("demo"), tool: "search", message: "failed" }).message).toBe(
"failed",
)
expect(new MCPClient.NeedsAuthError({ server: "demo" }).message).toBe("MCP server requires authentication: demo")
expect(new MCPClient.ConnectError({ server: "demo", message: "offline" }).message).toBe("offline")
})
})

View file

@ -27,4 +27,4 @@ export const StatusChanged = Event.ephemeral({
},
})
export const Definitions = Event.inventory(ToolsChanged, BrowserOpenFailed, StatusChanged)
export const Definitions = Event.inventory(ToolsChanged, StatusChanged)

View file

@ -12,6 +12,7 @@ import {
} from "../src/index.js"
import { EventManifest } from "../src/event-manifest.js"
import { IdeEvent } from "../src/ide-event.js"
import { McpEvent } from "../src/mcp-event.js"
import { SessionEvent } from "../src/session-event.js"
import { SessionTodo } from "../src/session-todo.js"
import { SessionV1 } from "../src/session-v1.js"
@ -63,6 +64,8 @@ describe("public event manifest", () => {
expect(Permission.Event.Definitions).toEqual([Permission.Event.Asked, Permission.Event.Replied])
expect(Form.Event.Definitions).toEqual([Form.Event.Created, Form.Event.Replied, Form.Event.Cancelled])
expect(Reference.Event.Definitions).toEqual([Reference.Event.Updated])
expect(McpEvent.Definitions).toEqual([McpEvent.ToolsChanged, McpEvent.StatusChanged])
expect(EventManifest.Latest.has("mcp.browser.open.failed")).toBe(false)
expect(EventManifest.Latest.has("ide.installed")).toBe(false)
expect(IdeEvent.Definitions).toEqual([IdeEvent.Installed])
const sessionV1TailStart = EventManifest.Definitions.indexOf(SessionV1.Event.PartDelta)

View file

@ -89,7 +89,6 @@ export type Event =
| EventTuiToastShow2
| EventTuiSessionSelect2
| EventMcpToolsChanged
| EventMcpBrowserOpenFailed
| EventMcpStatusChanged
| EventCommandExecuted
| EventProjectUpdated
@ -1556,14 +1555,6 @@ export type GlobalEvent = {
server: string
}
}
| {
id: string
type: "mcp.browser.open.failed"
properties: {
mcpName: string
url: string
}
}
| {
id: string
type: "mcp.status.changed"
@ -3177,7 +3168,6 @@ export type V2Event =
| TuiToastShow
| TuiSessionSelect
| McpToolsChanged
| McpBrowserOpenFailed
| McpStatusChanged
| CommandExecuted
| ProjectUpdated
@ -6373,20 +6363,6 @@ export type McpToolsChanged = {
}
}
export type McpBrowserOpenFailed = {
id: string
created: number
metadata?: {
[key: string]: unknown
}
type: "mcp.browser.open.failed"
location?: LocationRef
data: {
mcpName: string
url: string
}
}
export type McpStatusChanged = {
id: string
created: number
@ -7493,15 +7469,6 @@ export type EventMcpToolsChanged = {
}
}
export type EventMcpBrowserOpenFailed = {
id: string
type: "mcp.browser.open.failed"
properties: {
mcpName: string
url: string
}
}
export type EventMcpStatusChanged = {
id: string
type: "mcp.status.changed"