Short answer: keep one canonical list of MCP servers in a single file and project it into each tool’s native config, instead of hand-editing each one. Brigade does this with brigade mcp sync: one catalog in .brigade/mcp.json, merged into Claude Code, Codex, Cursor, VS Code, OpenCode, and Antigravity, dry-run by default, with a diff you approve and a receipt you can roll back.
Why this is annoying in the first place
Every coding agent reads its MCP servers from a different file in a different shape:
| Tool | File | Format |
|---|---|---|
| Claude Code | .mcp.json | JSON |
| Cursor | .cursor/mcp.json | JSON |
| Codex CLI | .codex/config.toml | TOML |
| VS Code | .vscode/mcp.json | JSON, secrets as inputs[] |
| OpenCode | opencode.json | JSON |
| Antigravity | ~/.gemini/config/mcp_config.json | JSON, user-scoped |
Add one server and you are editing six files by hand, in three formats, and keeping them in sync forever. Miss one and that agent silently runs without the tool.
The options
| Approach | One source | Per-tool format | Review before write | Receipt / rollback |
|---|---|---|---|---|
| Hand-editing each config | no | manual | you are the diff | no |
| A dotfile manager (chezmoi) | as templates | you template each | no | git, not per-write |
| add-mcp / config-sync scripts | yes | a few targets | no | no |
| Brigade | yes | six native targets | yes, per-tool diff | yes |
Dotfile managers and small sync scripts get you part of the way: they copy one thing into a few places. They do not understand each tool’s config shape well enough to merge surgically, they write without showing you the diff, and they do not leave a receipt you can undo.
How Brigade does it
brigade mcp init # scaffold .brigade/mcp.json
brigade mcp add --name github --command npx \
--args "-y @modelcontextprotocol/server-github" \
--env GITHUB_TOKEN=ref:GITHUB_TOKEN
brigade mcp sync # dry-run: the per-tool diff, server by server
brigade mcp sync --write # merge into each tool's native config
brigade mcp sync is dry-run by default. It prints the plan for every tool before a single file changes:
brigade mcp sync (dry-run): ~/my-repo
claude github missing -> create
cursor github missing -> create
codex github missing -> create
vscode github missing -> create
opencode github missing -> create
Three things make it safe to run on a config you care about:
- It merges by server key, so servers you added by hand are left alone, and ones you edited are untouched unless you pass
--force. - Secrets are written as
${VAR}references (or VS Code${input:VAR}), never inlined. - Codex
config.tomlis merged surgically, so your other tables are preserved.
Tools and skills get the same treatment with brigade tools sync: one reviewed catalog, projected into each harness’s native format.
When you do not need this
If you run a single agent and never touch a second one, one config file is fine, edit it directly. Brigade earns its place the moment you have two or more agents that should share the same servers, or the moment a tool overwrites a config and you want a receipt of what changed.
Questions
Does it support Claude Code and Codex specifically? Yes. Claude Code writes to .mcp.json, Codex to .codex/config.toml, and Brigade keeps both in sync from one catalog. Cursor, VS Code, OpenCode, and Antigravity are supported too.
Will it overwrite servers I added by hand? No. It merges by server key and only touches a server you already own if you pass --force.
Is anything sent to a server or the cloud? No. Brigade writes local files when you run a command. There is no daemon and no hosted service.
Full behavior is in the MCP sync docs.