Skip to content

[FEATURE]: MCP manager - per-server output panel with clickable local panel URLs #58652

Closed as not planned

Description

@arin8513
  • I have verified this feature I'm about to request hasn't been suggested before.

Describe the enhancement you want to request

Many MCP servers ship their own local web UI and print its URL to stdout/stderr on startup
(a config panel, a DB browser, a graph UI). OpenCode logs that stream undifferentiated, so the
only way a user ever sees the URL is by scrolling the global MCP log with several servers'
lines interleaved.

Real case from our setup: codebase-memory-mcp runs through a PowerShell wrapper whose only
extra job is to print the panel URL, because nothing else surfaces it:

"codebase-memory-mcp": {
  "type": "local",
  "command": [
    "powershell.exe", "-NoProfile", "-Command",
    "[Console]::Error.WriteLine(' Codebase Memory UI:\n http://127.0.0.1:9749'); & codebase-memory-mcp --ui=true --port=9749"
  ]
}

Request: render http://localhost / http://127.0.0.1 URLs found in a server's stdout/stderr -
or declared through an optional links field next to that server's config - as a per-server,
clickable output section in the MCP manager area (/mcps and the desktop/web MCP panel),
filtered per server instead of mixed into the global log. Keeping the last N lines of that
server's own output there would also solve the debug problem raised in #50710, where a failing
server's stderr is truncated before the chained cause.

Why is this needed?

Three cooperating agents and one human share ~30 MCP servers on this machine; four of them
expose local panels. Today those URLs are copy-pasted out of a raw log, and one config carries
a wrapper that exists purely to make its URL visible - a workaround that only works because we
control that config file.

Related issues

Additional context

Activity

  1. opencode-agent commented on Oct 24, 2026

    @opencode-agent
    Contributor

    Thanks for splitting this out of #58243! You're asking for the MCP manager (/mcps in the TUI and the desktop/web MCP panel) to show each local server's own recent stdout/stderr, filtered to that server. Any http://localhost / http://127.0.0.1 URLs in that output, or declared in an optional links field in the server config, would be clickable. That way you don't have to dig local panel URLs out of the global log or print them from a wrapper script. Maintainers will consider it.

    At the moment a local MCP server's stderr goes only to the debug log. A short tail is kept only to explain an unexpected exit. Plugins can't read that output or add to the MCP manager, so a plugin can't do this today.

    Related issues:

  2. arin8513 commented on Oct 24, 2026

    @arin8513
    Author

    Clarifying the user-facing intent of this request, because that is the part that matters in practice.

    The point is not only that the panel URL appears somewhere log-like - it is that a user who runs an MCP server sees that server's own panel link inside the manager surface and can click it, in the same places a user already manages servers: the TUI manager and the desktop/web MCP panel (/mcps included). Clicking it should open the panel the way any other link in the app opens - no copy-pasting out of a log stream, and no wrapper hack like the one in the config example.

    Concretely, per server:

    • a small "output / links" area on that server's row or detail view;
    • the URL rendered as a clickable element (opening the panel in the app's browser surface or the operator's own browser), not as raw text;
    • the last few lines of that server's own output next to it, so a link printed at startup is still findable later in the session.

    This is item 1 of #58243, split out per the triage bot's suggestion; the same wording ("the user sees it and clicks it") applies to the desktop and web clients, not only a terminal log pane.

  3. arin8513 commented on Oct 29, 2026

    @arin8513
    Author

    Surface proposal: an Output launcher beside Review / Terminal / Open file

    Following the duplicate note on #60248, here is the one thing that issue added on top of this request - carried here so the discussion stays in one place.

    The data stays exactly as this issue describes it

    Per-server stdout/stderr tail, every http://localhost / http://127.0.0.1 URL in it rendered as a clickable link, and an optional links field next to that server's config for servers that print nothing. Nothing here changes that ask.

    The open question is WHERE it lives

    This issue places the output in the MCP manager area (/mcps, desktop/web MCP panel). We would like to propose the alternative - and let a maintainer choose:

    A fourth launcher in the session side region, beside the three existing ones - Review, Terminal, Open file - named Output (Ctrl+Alt+O in the v2 web UI).

    The Output tab would show one collapsible section per MCP server:

    Column Content
    server name + connection state (connected / starting / failed / needs auth)
    tools the tool count, expandable to that server's full tool list
    output that server's own recent stdout/stderr tail
    links every localhost / 127.0.0.1 URL in that output, as a clickable link that opens in the OS default browser

    Why this surface: the three existing launchers are where a user already looks while working inside a session, and a panel URL is a session-time thing - you want it next to the terminal you are already reading, not behind a settings entry. The MCP manager area stays the place to configure servers; Output is the place to watch them.

    Offer to implement

    We are happy to implement this as a PR against anomalyco/opencode, following CONTRIBUTING.md and the existing side-panel patterns, with tests. Two decisions we need before starting:

    1. Surface - the Output launcher in the session side region, or per-server output inside the existing /mcps area?
    2. Ownership - do you want us to open the PR ourselves, and if so against which branch and with which test expectations?

    Related: #58243 (closed umbrella), #50710 (a failing server's stderr truncated before the chained cause), #58653 / #58654 (sibling asks, which stay separate).

  4. arin8513 commented on Oct 29, 2026

    @arin8513
    Author

    @Tarquinen - a nudge on the two decisions in the comment above, since this is now the only thread for this ask (the duplicate #60248 is closed and its surface proposal was carried here).

    Short version: the data is this issue's original ask; the open questions are where it lives and whether we should build it.

    We would rather not sit on a decision, so our plan is to work on it ourselves and open a PR against anomalyco/opencode: the Output side-region launcher, following CONTRIBUTING.md and the existing panel patterns, with tests.

    1. Is an Output launcher in the session side region acceptable, or would you rather keep this inside /mcps?
    2. Do you want the PR from us, and if so against which branch and with which test expectations?

    One honest note on what is buildable outside your tree today: a GUI plugin (./gui-experimental) can add a tab to the session side region and open links with ctx.system.openExternal - that part we already run locally. What a plugin cannot do is read a local server's stdout/stderr or contribute to the MCP manager, which is exactly the part that needs this change. So the PR would be the real fix; the plugin is only a stand-in.

    If you would rather not take it, say so and we will keep it as a local plugin and stop nudging.

  5. neriousy commented on Nov 12, 2026

    @neriousy
    Member

    Thanks for the detailed proposal. This isn't something we plan to build, so closing to keep the tracker focused.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions