Claude Code auto-loads MCP servers from at least six distinct places — user config, local project state, committed .mcp.json, bundled plugin .mcp.jsons, claude.ai OAuth integrations, and in-memory overrides. Starting a session with all of them enabled burns hundreds of tokens of context before you type a character.
The built-in /mcp menu toggles things one row at a time. ccmcp toggles them in bulk, by scope, or by filter, and gives you a single view that reflects what will actually load in the current project.
brew install robworks-code/tap/ccmcp
go install (Go 1.25+)go install github.com/ringo380/ccmcp@latest
Download from the releases page.
git clone https://github.com/ringo380/ccmcp
cd ccmcp
go build -ldflags='-s -w' -o ~/bin/ccmcp .
In any project directory:
ccmcp
The effective view is the default. It lists every MCP that will load in this project, with a badge showing its source and a checkbox showing whether it's currently enabled here. Three keystrokes to turn off every plugin-registered MCP for this project:
/plugin <enter> N w
cloudflare)disabledMcpServers for this project only)Undo the same way with A.
| Badge | Source | Location | Effect |
|---|---|---|---|
| u | user | ~/.claude.json#/mcpServers | loads in every project |
| l | local | ~/.claude.json#/projects[…]/mcpServers | this directory only |
| p | project | ./.mcp.json | shared via git, team-wide |
| P | plugin | bundled .mcp.json per enabled plugin | loads when plugin enabled |
| @ | claude.ai | OAuth remote integration | loads wherever you're signed in |
| s | stash | ~/.claude-mcp-stash.json | ccmcp-owned, parked |
[x] — will load in this project[~] — disabled here via a per-project override (easy to undo)[ ] — not active in this project by any source[?] — in disabledMcpServers but no live source found (stale); the row description explains why, and ccmcp mcp prune cleans it upFilter by substring, then A/N flips every visible row at once — per scope, in one keystroke.
One view across user, local, .mcp.json, plugin-bundled, and claude.ai OAuth. Every row has a resolved source.
Park servers you don't currently need in ~/.claude-mcp-stash.json. S smart-toggles — stash a live row, unstash a parked one.
Snapshot the current project's MCP set and reapply it later with one keystroke.
ccmcp mcp prune classifies every entry in disabledMcpServers into 7 buckets and removes what's truly stale — orphan plugin keys, deleted MCPs — while preserving intentional per-project disables.
Four marketplace source formats (bare path, url, git-subdir, github), with optional sha pinning and purge-on-remove.
Atomic writes (temp + fsync + rename). Every mutation snapshots the target file to ~/.claude-mcp-backups/. --dry-run never touches disk.
Every TUI action has a CLI equivalent. ccmcp status --json for pipelines. 158 tests cover readers, writers, and a headless TUI state machine.
List, enable/disable, create, move, and remove skills, agents, and slash commands across user, project, and plugin scopes. ccmcp command conflicts surfaces shadowed commands before they bite.
Lint CLAUDE.md and MEMORY.md for structural issues — stale entries, missing sections, broken pointers. Press f in the TUI to preview an autofix as a unified diff or F to bulk-fix every issue sharing the cursor's code in one keystroke (programmatic edits stack directly; CLI codes bundle into a single Claude Haiku invocation). The bundled l review and post-review a apply use the same single-call pattern. Every fix snapshots the original to ~/.claude-mcp-backups/doctor/ and Claude-CLI fixes can be reverted with u.
Point-in-time snapshots, cross-project sweep tables, drift diffs against a baseline, and full stale-override audits — all in JSON, Markdown, or CSV.
ccmcp status # show everything at once
ccmcp status --json # JSON for scripts
ccmcp mcp list [--scope SCOPE] # user|local|project|plugin|claudeai|stash|all
ccmcp mcp enable <name> [--scope SCOPE]
ccmcp mcp disable <name> [--scope SCOPE] [--to-stash]
ccmcp mcp move <name> --to {user|local|stash}
ccmcp mcp override <name> [--undo] # per-project disable
ccmcp mcp prune [--dry-run] [--yes] [--include-stash-ghosts]
ccmcp mcp stash [<name>...] # user-scope → stash
ccmcp mcp restore [<name>...] # stash → user-scope (alias: unstash)
ccmcp profile save|list|show|use|delete <name> [<mcp>...]
ccmcp profile export <name> [--out FILE] [--with-config]
ccmcp profile import [FILE|-] [--overwrite]
ccmcp skill list [--scope user|project|plugin] [--enabled|--disabled]
ccmcp skill enable|disable <name> [<name>...]
ccmcp skill new|move|rm|show <name> [--scope user|project]
ccmcp agent list|new|move|rm|show <name>
ccmcp command list [--scope user|project|plugin]
ccmcp command conflicts [--include-ignored] [--json]
ccmcp command resolve <effective-name> [--strategy disable-skill|ignore|list]
ccmcp report snapshot [--out FILE] [--format json|md|csv]
ccmcp report sweep [--base PATH] [--format json|md|csv]
ccmcp report drift --from <snapshot.json> [--format json|md]
ccmcp report audit [--format json|md|csv]
ccmcp doctor md [--user] [--memory-dir DIR]
ccmcp doctor md --llm-review [--provider anthropic|openai]
ccmcp plugin list [--enabled|--disabled]
ccmcp plugin enable|disable|install|remove <id> [--marketplace M] [--purge]
ccmcp marketplace list|add|remove <name> [--source github|git|local] [--repo R]
ccmcp tui --dump [--tab mcps|plugins|skills|agents|commands|profiles|summary|doctor]
Global flags: --path <dir>, --dry-run, --json, --no-color.
Full key reference, scope terminology, and implementation notes live in the README.