┌──────────────────────────────────────────────────┐
│ 第 1 层:Built-in 插件 MCP(始终可用) │
│ plugin:context7, plugin:playwright, plugin:github │
│ → 不受任何配置文件控制,始终加载 │
└──────────────────────────────────────────────────┘
+
┌──────────────────────────────────────────────────┐
│ 第 2 层:用户配置的 MCP(settings.json 或 .claude.json)│
│ codegraph, memory, sequential-thinking, lark-mcp │
│ → 受以下覆盖链控制 │
└──────────────────────────────────────────────────┘
| 文件 | 路径 | 维护者 | 用途 |
|---|---|---|---|
| settings.json | ~/.claude/settings.json |
用户手动编辑 | 全局偏好:模型、权限、MCP 服务器 |
| .claude.json | ~/.claude.json |
Claude Code 自动生成 | 运行时状态:项目统计、项目级 MCP |
.claude.json 项目级的 mcpServers 完全覆盖 settings.json 的 mcpServers,不是合并。
Claude Code 启动
│
├─ 检查 .claude.json → projects[当前项目路径]
│
├─ 该项目的 mcpServers 是否有内容?
│ ├─ YES → 使用项目级,忽略 settings.json
│ ├─ {} → 空对象,但 key 存在,也忽略 settings.json ⚠️
│ └─ key 不存在 → 回退 settings.json
│
└─ + 第 1 层 Built-in 插件 MCP(始终附加)
Claude Code 为新项目自动创建 "mcpServers": {}。按逻辑 {} 应该表示"没有项目级配置,用全局的",但实际行为是:
mcpServers: {} ← key 存在 → "走项目级" → 空配置,全局 MCP 全部丢失
mcpServers 未定义 ← key 不存在 → "走全局" → 用 settings.json
settings.json mcpServers: { codegraph, memory, sequential-thinking }
.claude.json projects[项目]: { codegraph, lark-mcp, memory, sequential-thinking }
结果: 使用项目级(4 个)+ Built-in 插件 = 8 个
.claude.json projects[项目]: mcpServers: {}
结果: 只有 4 个 Built-in 插件,全局 MCP 全部丢失
方式 1:手动把 settings.json 的 MCP 配置复制到 .claude.json 对应项目条目下
方式 2:删除项目的 mcpServers key(但 Claude 可能重新创建 {})
方式 3(推荐):用 /mcp 面板添加/启用服务器
| 时机 | 行为 |
|---|---|
| 首次在某目录启动 Claude | 创建项目条目,mcpServers: {} |
使用 /mcp 面板操作 |
更新 mcpServers、enabledMcpjsonServers |
| 每次会话结束 | 更新统计字段(lastCost、lastDuration) |
不会自动将 settings.json 的全局 MCP 同步到 .claude.json。
"mcpServers": {}这是 .claude.json 的顶层字段,始终为 {},是 /mcp 面板(全局视图)的持久化占位,不参与项目级解析,不需要手动修改。