手动修改的 MCP 配置文件被 cc-switch 覆盖
Quick fix
MCP 请在 cc-switch 面板内改并升级到 v3.13.0+ 防跨应用泄漏;settings.json 的插件/hooks 用「通用配置」在供应商间共享。
Symptom
Section titled “Symptom”每次重新打开 cc-switch 或执行任何 MCP 操作时,我的修改都会被覆盖,配置恢复到 cc-switch 数据库中的旧版本。cc-switch 的 MCP 同步是单向的(DB → live):import_from_*() 只在数据库 MCP 表为空时(首次启动)执行一次,之后 sync_all_enabled()、upsert_server()、toggle_app() 都会直接用数据库里的旧状态整段重写 ~/.claude.json、~/.codex/config.toml、~/.gemini/settings.json 等 live 文件,不会先读回你在 cc-switch 之外做的修改。Issue #2170 曾提议参照 Prompts 的 Backfill Protection(v3.7.0 起)给 MCP 加 backfill_from_live(),但该 issue 因 60 天无活动被 stale 关闭,机制并未实现;#685 也被指为与 #902 相同的设计问题。因此目前手动编辑 live 文件没有官方防覆盖手段。
同一「全量写入」机制还有两个变体:其一,v3.13.0 之前 MCP 没有 per-app 启用标志,只同步 Claude Code 的 MCP 也会泄漏进 OpenCode、Codex 等其他应用的配置;且 visibleApps.opencode=false 只控制 UI 可见性,启动时只要 OpenCode 配置目录存在仍会被 import 并回灌到 ~/.codex/config.toml(该泄漏已在 v3.13.0 通过 enabled_claude/enabled_codex/enabled_gemini/enabled_opencode 标志修复)。其二,切换供应商时 cc-switch 会把 provider 的 settings_config 全量写回 ~/.claude/settings.json,不做读回合并,导致 Claude Code 自己管理的 enabledPlugins、hooks、enabledMcpjsonServers、disabledMcpjsonServers 被静默清空(#4322 被 maintainer 标记为 #3631 的重复;#1594 中 maintainer 说明全量写入是 v3.11.0 尝试 merge 方案后权衡保留的设计,建议用「通用配置」传递插件等共享配置)。
把 cc-switch 升级到 v3.13.0 或更高版本:该版本为每个 MCP 服务器引入独立的 enabled_claude / enabled_codex / enabled_gemini / enabled_opencode 启用标志,导出到各应用 live 文件时只导出 enabled_*=true 的服务器,修复了 MCP 泄漏到未勾选应用的问题。
不要再直接手动编辑 ~/.claude.json、~/.codex/config.toml 或 ~/.gemini/settings.json 里的 MCP 段;一律在 cc-switch 的 MCP 管理面板中添加/修改,让数据库与 live 文件保持一致,避免下次启动或切换供应商时你的修改被 DB 旧状态覆盖。
如果切换供应商后 ~/.claude/settings.json 里的 enabledPlugins / hooks 丢失:在 cc-switch 中编辑供应商 → 打开「通用配置」面板 → 点「从当前供应商提取」,把插件、hooks 等共享配置放入通用配置;新建供应商时勾选「写入通用配置」,这样这些字段会在所有供应商之间保留。你首次导入的默认供应商里保存了全部原始配置,不会丢失。
如果升级到 v3.13.0+ 后 MCP 仍被写入未启用的应用,或 settings.json 全量覆盖问题仍需跟踪,请到原 issue(#1486 / #3631 / #2170)补充当前版本与复现步骤并请求 reopen——settings.json 的 merge/保留修复当时归并在 #3631 跟踪,本集群未包含其最终修复版本。
Affected Versions
Section titled “Affected Versions”Source Issues
Section titled “Source Issues”本页汇总自 5 个真实 issue
- #685[Bug] 手动修改的 MCP 配置文件被 cc-switch 覆盖
- #1486[Bug] 只同步 Claude Code的MCP配置, 但是MCP 仍泄漏到 OpenCode
- #1594Bug Report: Plugin Configuration Not Synced Across Providers
- #2170feat(mcp): extend prompts-style backfill protection to MCP sync
- #4322bug: switching providers wipes enabledPlugins/hooks from ~/.claude/settings.json
- 我明明在 MCP 面板里把 OpenCode 的开关关掉了(甚至 visibleApps 里也禁用了 OpenCode),为什么 MCP 还是被写进 OpenCode / Codex 的配置?
- 这是 v3.13.0 之前的 bug:visibleApps.opencode=false 只控制 UI 可见性,启动期 should_sync_opencode_mcp() 只检查 OpenCode 配置目录是否存在;且当时导出 MCP 不按应用过滤。升级到 v3.13.0 后,只有 enabled_*=true 的 MCP 才会写入对应应用的 live 文件。
- 切换供应商之后我的插件配置怎么不见了?
- Claude Code 把 enabledPlugins 存在 ~/.claude/settings.json,而 cc-switch 每次切换都全量重写该文件(maintainer 说明这是 v3.11.0 尝试 merge 方案后权衡保留的设计)。请用「通用配置」:编辑供应商 → 通用配置面板 →「从当前供应商提取」,新建供应商勾选「写入通用配置」。相比之下 claude mcp add 写入的 ~/.claude.json 不会被切换覆盖。
- 能不能让 cc-switch 检测到我在外部改过配置文件、别直接覆盖?
- Issue #2170 已提议参照 Prompts 的 Backfill Protection 给 MCP 加 backfill_from_live()(同步前先把 live 内容读回 DB),但该 issue 因 60 天无活动被 stale 关闭,截至本集群信息该机制尚未实现。目前的规避方法是只在 cc-switch 面板内改 MCP。
- 我让 Claude 自己改 ~/.claude.json,每次都被覆盖,调试配置很麻烦怎么办?
- 在 backfill 机制落地前没有官方方案。变通做法是:外部改完后立刻打开 cc-switch 的 MCP 面板把同样的修改同步进数据库,防止下次启动或切换供应商时被旧状态覆盖。
- Skill 配置是不是也有同样的泄漏/覆盖问题?
- #1486 的报告者提到看到过 skill 的类似 issue,怀疑是相同原因(应用选择与后台同步作用域未绑定),但本集群未包含该 issue 的详情,无法确认,建议在仓库中搜索 skill 相关 issue 核实。
这是一个非官方社区 wiki,与 cc-switch 作者及项目本身无隶属关系。内容整理自项目公开的 GitHub issues。本站不分发任何软件。