Skip to content

[FEATURE]: Compact sidebar MCP rows without status text #53321

Open

Description

@Nowaker

Feature hasn't been suggested before.

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

Describe the enhancement you want to request

Every MCP server row in the session sidebar spells out its status next to a dot whose color already carries it:

▼ MCP
• alpha-tools Connected
• beta-search Connected
• broken-server ENOENT: no such file
  or directory, posix_spawn '/
  nonexistent/mcp-binary'
• parked-server Disabled
• remote-oauth Needs auth

Once you know the dot colors (green connected, red failed, orange needs auth, gray disabled), the words are repetition, and a failure reason wraps over several lines of a narrow sidebar. With many servers the list takes far more height than it needs.

Proposal: a tui.json option, sidebar.mcp_list:

  • "descriptive" (or unset): today's rows, dot + name + status text. Nothing changes for existing users.
  • "compact": dot + name only; the colored dot carries the status.
▼ MCP
• alpha-tools
• beta-search
• broken-server
• parked-server
• remote-oauth

Compact drops the failure reason too: the red dot still marks the failure, and /status lists every server with its full status, error message and auth hint.

Activity

  1. opencodejr commented on Oct 27, 2026

    @opencodejr

    Thanks for the detailed proposal! You're asking for an option to show sidebar MCP rows as just the colored dot and the server name, without the status text, so long lists take less space. Maintainers will consider it.

    One note: your example (Needs auth, the full error wrapping over several lines, tui.json) looks like v1 output. In v2 the sidebar already uses short, single-line labels (Connected, Error, Sign in, Disabled) and doesn't show the failure reason. The labels are still there, though, so your request still applies.

    Related:

    In the meantime, you can get this in v2 now with a small local TUI plugin that replaces the built-in MCP section. It type-checks against the current plugin API, but I haven't run it in a live TUI.

    1. Save this as ~/.config/opencode/plugins/mcp-compact/tui.tsx (plugins in that folder are discovered automatically):
    import { Plugin } from "@opencode/plugin/tui"
    import { createMemo, For, Show } from "solid-js"
    
    export default Plugin.define({
      id: "local.sidebar.mcp-compact",
      setup(context) {
        const theme = context.theme
        const color = (status: string) => {
          if (status === "connected") return theme.text.feedback.success.base
          if (status === "failed") return theme.text.feedback.error.base
          if (status === "needs_auth") return theme.text.feedback.warning.base
          return theme.text.muted
        }
        context.ui.slot({
          append: "sidebar.content",
          render: (props) => {
            const session = createMemo(() => context.data.session.get(props.sessionID))
            const list = createMemo(() => context.data.location.mcp.server.list(session()?.location) ?? [])
            return (
              <Show when={list().length > 0}>
                <box>
                  <text fg={theme.text.base}>
                    <b>MCP</b>
                  </text>
                  <For each={list()}>
                    {(item) => (
                      <box flexDirection="row" gap={1} minWidth={0}>
                        <text flexShrink={0} fg={color(item.status.status)}>
                          •
                        </text>
                        <text fg={theme.text.base} wrapMode="none" truncate flexGrow={1} flexShrink={1} minWidth={0}>
                          {item.name}
                        </text>
                      </box>
                    )}
                  </For>
                </box>
              </Show>
            )
          },
        })
      },
    })
    1. Turn off the built-in MCP section in ~/.config/opencode/cli.json:
    {
      "plugins": ["-opencode.sidebar.mcp"]
    }

    The sidebar will then show a plain MCP heading with dot + name rows. /status and /mcps still show each server's full status and errors. This simplified version doesn't keep the built-in collapse toggle or open the MCP dialog when you click a row; you can add both with context.storage and context.ui.dialog if you want them.

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

Metadata

Metadata

Assignees

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