Desktop app: no way to enable/disable Claude Code MCP servers (`/mcp disable` fails, no Settings UI)
What happens
In the desktop app, there is no way to enable or disable a Claude Code MCP server.
/mcp disable <server> fails every time:
MCP controls aren't available right now — the terminal is still starting up or is showing another view.
This is reproducible on an idle session with no other view open. The interactive /mcp picker never renders either — it's a terminal dialog, like /permissions, /config, and /hooks.
Why this looks like a bug rather than a missing feature
The capability already exists in the terminal. The in-session MCP toggle shipped in v2.0.10, and /mcp there gives a clean list with per-server enable/disable. Same version, same machine, same config — it just isn't reachable from the desktop app.
It's also easy to assume the feature is present, because Settings has two MCP panels that don't cover Claude Code:
| Settings panel | Manages | Config |
|---|---|---|
| Extensions | Desktop app's own MCP servers (.mcpb / .dxt bundles) | claude_desktop_config.json |
| Connectors | claude.ai remote connectors (Gmail, Slack, Notion…) | server-side |
| — none — | Claude Code's MCP servers | ~/.claude.json |
So a user with 13 servers in ~/.claude.json opens Settings, sees an MCP screen listing one unrelated server, and has no path forward.
Why it matters
Context. Every enabled server's tools load at session start, so disabling unused servers is the main lever a user has over startup context. In my case 4 connected servers contributed 151 tools (meta-ads 97, razorpay-pvtltd 42, Sentry 9, cloudflare-api 3). Turning them off is worth doing regularly — but in the desktop app it currently costs a config edit plus a new chat, and starting a new chat loses the conversation you're in.
Workaround (for anyone hitting this)
Two mechanisms, because neither alone is sufficient:
- Live, mid-session — add
mcp__<server>topermissions.denyin./.claude/settings.local.json. Permission rules are re-read while a session runs, so the block applies immediately with no restart. This stops tool use, not tool loading, so it does not save context. - Persistent — add the server to
disabledMcpServersunderprojects["<abs path>"]in~/.claude.json. This prevents the server launching next session, which is what actually saves context.
One trap worth documenting: disabledMcpServers is keyed by absolute project path, and each git worktree is its own key with its own empty list. Disabling a server in the main checkout has no effect in any worktree. Servers can also be defined per-project rather than globally, so enumerating only mcpServers at the top level of ~/.claude.json misses some.
Request
Either:
- port the terminal's MCP panel to the desktop app, or
- make the non-interactive form (
/mcp enable|disable|reconnect <server>) work there.
The non-interactive form alone would be enough — it's already the documented usage string, it just never executes.
Environment
- Claude Code v2.1.220 (desktop app)
- macOS 27.0.0 (arm64)
- 14 MCP servers configured in
~/.claude.json(13 global, 1 project-scoped)
Related
#10447 · #30595 · #17921 · #4879 · #5722 · #50826 — all cover CLI or config-file toggling. None cover the desktop app having no MCP surface at all.