Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
a7e439a
fix(tui): display dynamically registered MCP servers in status
altendky Jan 6, 2026
d2f7459
Merge branch 'dev' into report-dynamically-registered-mcps
altendky Jan 6, 2026
330d6b1
Merge branch 'dev' into report-dynamically-registered-mcps
altendky Jan 6, 2026
3eb0605
Merge branch 'dev' into report-dynamically-registered-mcps
altendky Jan 10, 2026
40512a4
Merge branch 'dev' into report-dynamically-registered-mcps
altendky Jan 21, 2026
21536a6
Merge branch 'dev' into report-dynamically-registered-mcps
altendky Jan 30, 2026
7901f35
Merge branch 'dev' into report-dynamically-registered-mcps
altendky Mar 11, 2026
5577152
Merge branch 'dev' into report-dynamically-registered-mcps
altendky Mar 31, 2026
42f82d1
test(mcp): add tests for dynamic MCP server status and refresh event
altendky Mar 31, 2026
b715dbf
refactor(prompt): use Provider service in effect layers (#20167)
kitlangton Apr 1, 2026
e9aa9c4
Merge branch 'dev' into report-dynamically-registered-mcps
altendky Apr 1, 2026
c08bc8d
Merge branch 'dev' into report-dynamically-registered-mcps
altendky Apr 7, 2026
5884b82
Merge branch 'dev' into report-dynamically-registered-mcps
altendky Apr 8, 2026
38ac36b
Merge branch 'dev' into report-dynamically-registered-mcps
altendky Apr 8, 2026
aefae10
Merge branch 'dev' into report-dynamically-registered-mcps
altendky Apr 9, 2026
ab237c8
Merge branch 'dev' into report-dynamically-registered-mcps
altendky Apr 12, 2026
97ca250
Merge branch 'dev' into report-dynamically-registered-mcps
altendky Apr 13, 2026
3e1504e
Merge branch 'dev' into report-dynamically-registered-mcps
altendky Apr 16, 2026
56e9191
Merge branch 'dev' into report-dynamically-registered-mcps
altendky Apr 16, 2026
934f4d2
Merge branch 'dev' into report-dynamically-registered-mcps
altendky Apr 17, 2026
8f8e458
Merge branch 'dev' into report-dynamically-registered-mcps
altendky Apr 17, 2026
110213d
Merge branch 'dev' into report-dynamically-registered-mcps
altendky Apr 18, 2026
9fb405c
Merge branch 'dev' into report-dynamically-registered-mcps
altendky Apr 19, 2026
97f3c74
feat: update codex plugin to support 5.5 (#23789)
rekram1-node Apr 22, 2026
69e2f3b
chore: bump Bun to 1.3.13 (#23791)
Hona Apr 22, 2026
a45d9a9
fix(app): improve icon override handling in project edit dialog (#23768)
Brendonovich Apr 22, 2026
ed3d364
chore: update nix node_modules hashes
opencode-agent[bot] Apr 22, 2026
bb69648
fix: preserve BOM in text tool round-trips (#23797)
Hona Apr 22, 2026
bfb954e
chore: generate
opencode-agent[bot] Apr 22, 2026
0595c28
test: fix cross-spawn stderr race on Windows CI (#23808)
Hona Apr 22, 2026
6aa475f
chore: generate
opencode-agent[bot] Apr 22, 2026
88c5f6b
fix: consolidate project avatar source logic (#23819)
Brendonovich Apr 22, 2026
2a480a9
fix(tui): fail fast on invalid session startup (#23837)
nexxeln Apr 22, 2026
266e965
chore: generate
opencode-agent[bot] Apr 22, 2026
c85bab1
Merge branch 'dev' into report-dynamically-registered-mcps
altendky Apr 22, 2026
9225dd2
Merge branch 'dev' into report-dynamically-registered-mcps
altendky Apr 23, 2026
6c004f2
undo
altendky Apr 23, 2026
a0f4ffb
Merge branch 'dev' into report-dynamically-registered-mcps
altendky Apr 24, 2026
94acabe
Merge branch 'dev' into report-dynamically-registered-mcps
altendky Apr 27, 2026
ea447d6
Merge branch 'dev' into report-dynamically-registered-mcps
altendky Apr 29, 2026
ec80009
Merge branch 'dev' into report-dynamically-registered-mcps
altendky Apr 29, 2026
71887a4
Merge branch 'dev' into report-dynamically-registered-mcps
altendky Apr 30, 2026
c41f0e5
Merge branch 'dev' into report-dynamically-registered-mcps
altendky May 1, 2026
ccd9535
Merge branch 'dev' into report-dynamically-registered-mcps
altendky May 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions packages/opencode/src/cli/cmd/tui/context/sync.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,11 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
break
}

case "tui.mcp.refresh": {
sdk.client.mcp.status().then((x) => setStore("mcp", reconcile(x.data!)))
break
}

case "vcs.branch.updated": {
setStore("vcs", { branch: event.properties.branch })
break
Expand Down
1 change: 1 addition & 0 deletions packages/opencode/src/cli/cmd/tui/event.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ const DEFAULT_TOAST_DURATION = 5000

export const TuiEvent = {
PromptAppend: BusEvent.define("tui.prompt.append", Schema.Struct({ text: Schema.String })),
McpRefresh: BusEvent.define("tui.mcp.refresh", Schema.Struct({})),
CommandExecute: BusEvent.define(
"tui.command.execute",
Schema.Struct({
Expand Down
8 changes: 8 additions & 0 deletions packages/opencode/src/mcp/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -583,6 +583,13 @@ export const layer = Layer.effect(
result[key] = s.status[key] ?? { status: "disabled" }
}

// Include dynamically registered MCPs not in config
for (const [key, v] of Object.entries(s.status)) {
if (!(key in result)) {
result[key] = v
}
}

return result
})

Expand All @@ -608,6 +615,7 @@ export const layer = Layer.effect(
const add = Effect.fn("MCP.add")(function* (name: string, mcp: ConfigMCP.Info) {
yield* createAndStore(name, mcp)
const s = yield* InstanceState.get(state)
yield* bus.publish(TuiEvent.McpRefresh, {})
return { status: s.status }
})

Expand Down
52 changes: 52 additions & 0 deletions packages/opencode/test/mcp/lifecycle.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,8 @@ const { MCP } = await import("../../src/mcp/index")
const { Instance } = await import("../../src/project/instance")
const { WithInstance } = await import("../../src/project/with-instance")
const { tmpdir } = await import("../fixture/fixture")
const { Bus } = await import("../../src/bus")
const { TuiEvent } = await import("../../src/cli/cmd/tui/event")

// --- Helper ---

Expand Down Expand Up @@ -786,3 +788,53 @@ test(
}),
),
)

// ========================================================================
// Test: dynamically added server appears in MCP.status()
// ========================================================================

test(
"dynamically added server appears in status",
withInstance({}, (mcp) =>
Effect.gen(function* () {
lastCreatedClientName = "dynamic-server"
getOrCreateClientState("dynamic-server")

yield* mcp.add("dynamic-server", {
type: "local",
command: ["echo", "test"],
})

const status = yield* mcp.status()
expect(status["dynamic-server"]).toBeDefined()
expect(status["dynamic-server"]?.status).toBe("connected")
}),
),
)

// ========================================================================
// Test: MCP.add() publishes TuiEvent.McpRefresh
// ========================================================================

test(
"add publishes TuiEvent.McpRefresh",
withInstance({}, (mcp) =>
Effect.gen(function* () {
const events: Array<Record<string, unknown>> = []
const unsubscribe = Bus.subscribe(TuiEvent.McpRefresh, (evt) => {
events.push(evt.properties)
})

lastCreatedClientName = "refresh-server"
getOrCreateClientState("refresh-server")

yield* mcp.add("refresh-server", {
type: "local",
command: ["echo", "test"],
})

unsubscribe()
expect(events).toHaveLength(1)
}),
),
)
10 changes: 10 additions & 0 deletions packages/sdk/js/src/v2/gen/types.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ export type Event =
| EventSessionIdle
| EventSessionCompacted
| EventTuiPromptAppend
| EventTuiMcpRefresh
| EventTuiCommandExecute
| EventTuiToastShow1
| EventTuiSessionSelect
Expand Down Expand Up @@ -791,6 +792,7 @@ export type GlobalEvent = {
| EventSessionIdle
| EventSessionCompacted
| EventTuiPromptAppend
| EventTuiMcpRefresh
| EventTuiCommandExecute
| EventTuiToastShow
| EventTuiSessionSelect
Expand Down Expand Up @@ -2416,6 +2418,14 @@ export type EventSessionCompacted = {
}
}

export type EventTuiMcpRefresh = {
id: string
type: "tui.mcp.refresh"
properties: {
[key: string]: unknown
}
}

export type EventMcpToolsChanged = {
id: string
type: "mcp.tools.changed"
Expand Down
Loading