Skip to content

Add hand-entered (custom) MCP servers not listed in any registry #5031

Description

@yh928

Summary

Let users add an MCP server they run themselves — a local stdio command or a remote HTTP(S) endpoint — from the desktop UI, for servers that no registry (mcp_official / Smithery) lists. Surfaces as a "Custom servers" pane on the MCP Servers tab (Connections → MCP Servers).

Problem

The MCP Servers tab today can only install servers a registry lists. There is no way from the UI to connect a server you host yourself: a local npx/uvx command, or a private/internal HTTP MCP endpoint. The only workaround is hand-editing config outside the app, which doesn't integrate with the registry UI, the connection health toolbar, or the OAuth flow. The store schema already carries the needed columns (command, args_json, transport, deployment_url, enabled) — only the add/edit path and UI are missing.

Solution (optional)

Scope: core + app.

  • Core RPCs mcp_clients_add_custom / mcp_clients_update_custom writing an ordinary InstalledServer with a new ServerProvenance (registry vs hand-entered) column, reusing the existing MCP transport / OAuth / tool-safety code paths — no second MCP client.
  • UI: a side pane + add/edit modal on the MCP Servers tab.
  • Credentials are scope-bound (write-only env; stored secrets, including the OAuth bundle, are dropped and must be re-entered when the credential scope changes — transport switch or HTTP origin change — never carried across).

Acceptance criteria

  • Add local (stdio) server — command + args, launched and connectable
  • Add remote (HTTP) server — http/https URL, connectable including OAuth
  • Edit / remove a custom server; identity stable across a rename
  • Provenance — legacy rows backfill to registry; install cannot clobber a custom row
  • Diff coverage ≥ 80% — the implementing PR meets the changed-lines coverage gate (Vitest + cargo-llvm-cov, enforced by .github/workflows/ci-lite.yml).

Related

Implementation ready on a fork; PR to follow. That PR also carries a small, related MCP fix (cancelling the OAuth sign-in wait), tracked separately.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions