2026-06-08 23:08:57 +08:00
|
|
|
|
---
|
2026-06-09 23:15:17 +08:00
|
|
|
|
tags: [MCP, 配置, settings-json, 企业策略, 插件, Claude-Code]
|
|
|
|
|
|
create time: 2026-06-09 22:30
|
2026-06-08 23:08:57 +08:00
|
|
|
|
---
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
# MCP 配置 - 多来源合并、作用域与策略管控
|
|
|
|
|
|
|
|
|
|
|
|
## 概述
|
|
|
|
|
|
|
|
|
|
|
|
Claude Code 的 MCP 配置来自 8 个来源(企业管控、项目、用户、插件、claude.ai 等),按优先级合并,支持 stdio/SSE/HTTP/WebSocket 四种传输类型。企业管控可进入排他模式覆盖所有其他配置,并通过 allowlist/denylist 策略精细控制可用服务器。
|
|
|
|
|
|
|
|
|
|
|
|
## 正文
|
|
|
|
|
|
|
|
|
|
|
|
### 配置来源与作用域
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
Claude Code 的 MCP 配置来自多个来源,每个来源对应一个 `scope`(作用域)。配置按优先级合并,高优先级来源的同名配置覆盖低优先级。
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### 来源列表
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
| 来源 | Scope | 文件/接口 | 说明 |
|
|
|
|
|
|
|------|-------|----------|------|
|
|
|
|
|
|
| 企业管控 | `enterprise` | 系统管理路径 `managed-mcp.json` | **排他模式**:存在时忽略所有其他来源 |
|
|
|
|
|
|
| 本地项目 | `local` | `<project>/.claude/settings.local.json` | 项目级私有配置(不提交到 VCS) |
|
|
|
|
|
|
| 项目配置 | `project` | `<project>/.mcp.json` | 项目级共享配置(可提交到 VCS) |
|
|
|
|
|
|
| 用户全局 | `user` | `~/.claude/settings.json` | 用户级配置,所有项目共享 |
|
|
|
|
|
|
| 插件 | `dynamic` | 插件 manifest 中 `.mcp.json` / `.mcpb` | 插件提供的 MCP 服务器 |
|
|
|
|
|
|
| claude.ai | `claudeai` | 通过 API 获取 | claude.ai 网页端配置的连接器 |
|
|
|
|
|
|
| 内置动态 | `dynamic` | 代码中注册 | Computer Use / Chrome 等内置服务器 |
|
|
|
|
|
|
| IDE SDK | `sdk` | IDE 传入 | VS Code / JetBrains 嵌入模式 |
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### 合并优先级(从低到高)
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
```mermaid
|
|
|
|
|
|
flowchart TD
|
|
|
|
|
|
A["claude.ai 连接器\n最低优先级"] --> B["插件服务器"]
|
|
|
|
|
|
B --> C["用户全局配置"]
|
|
|
|
|
|
C --> D["项目配置 .mcp.json\n需要用户审批"]
|
|
|
|
|
|
D --> E["本地项目配置"]
|
|
|
|
|
|
E --> F["动态配置 内置 MCP\n最高优先级"]
|
2026-06-08 23:08:57 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
`Object.assign({}, dedupedPluginServers, userServers, approvedProjectServers, localServers)` 实现合并——后出现的同名键覆盖前者。
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
### 企业管控模式
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
当 `managed-mcp.json` 文件存在时,进入**排他模式**:
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
```typescript
|
|
|
|
|
|
// config.ts:1084
|
|
|
|
|
|
if (doesEnterpriseMcpConfigExist()) {
|
|
|
|
|
|
// 只返回企业配置,忽略所有用户/项目/插件/claude.ai 配置
|
|
|
|
|
|
return { servers: filtered, errors: [] }
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
> [!warning] 排他模式特性
|
|
|
|
|
|
> - 路径由系统管理决定
|
|
|
|
|
|
> - 覆盖所有用户级、项目级、插件和 claude.ai 配置
|
|
|
|
|
|
> - 仍然应用策略过滤(allowlist/denylist)
|
|
|
|
|
|
> - 无法通过 CLI 添加新服务器
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
### 传输类型与配置 Schema
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### stdio(默认)
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
启动子进程,通过 stdin/stdout JSON-RPC 通信。
|
|
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
|
{
|
|
|
|
|
|
"my-server": {
|
|
|
|
|
|
"command": "npx",
|
|
|
|
|
|
"args": ["-y", "@my-org/mcp-server"],
|
|
|
|
|
|
"env": { "API_KEY": "..." }
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
`type` 字段可省略(默认为 `stdio`)。环境变量通过 `env` 传递给子进程,会与当前进程环境合并。
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
> [!tip] Windows 注意
|
|
|
|
|
|
> 使用 `npx` 需要包装为 `cmd /c npx`,否则会报错。
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### SSE(Server-Sent Events)
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
通过 HTTP SSE 连接远程 MCP 服务器,支持 OAuth 认证流程。
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
|
{
|
|
|
|
|
|
"my-remote": {
|
|
|
|
|
|
"type": "sse",
|
|
|
|
|
|
"url": "https://mcp.example.com/sse",
|
|
|
|
|
|
"headers": { "Authorization": "Bearer ..." },
|
|
|
|
|
|
"oauth": {
|
|
|
|
|
|
"clientId": "...",
|
|
|
|
|
|
"authServerMetadataUrl": "https://auth.example.com/.well-known/oauth-authorization-server"
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
认证失败时进入 `needs-auth` 状态,15 分钟 TTL 缓存避免重复提示。
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### HTTP(Streamable HTTP)
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
|
{
|
|
|
|
|
|
"my-http": {
|
|
|
|
|
|
"type": "http",
|
|
|
|
|
|
"url": "https://mcp.example.com/mcp",
|
|
|
|
|
|
"headers": { "X-API-Key": "..." }
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
支持与 SSE 相同的 OAuth 配置。
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### WebSocket
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
|
{
|
|
|
|
|
|
"my-ws": {
|
|
|
|
|
|
"type": "ws",
|
|
|
|
|
|
"url": "wss://mcp.example.com/ws"
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### 内部传输类型
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
| 类型 | 用途 | 认证方式 |
|
|
|
|
|
|
|------|------|---------|
|
|
|
|
|
|
| `sse-ide` | IDE 扩展专用 | lockfile token |
|
|
|
|
|
|
| `ws-ide` | IDE WebSocket | `X-Claude-Code-Ide-Authorization` header |
|
|
|
|
|
|
| `sdk` | IDE 嵌入模式 | 不经过保留名称检查和企业管控 |
|
|
|
|
|
|
| `claudeai-proxy` | claude.ai 连接器 | OAuth bearer + 401 重试 |
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
### 配置操作
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### 添加 MCP 服务器
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 添加到用户配置
|
|
|
|
|
|
claude mcp add my-server -s user -- npx @my-org/mcp-server
|
|
|
|
|
|
|
|
|
|
|
|
# 添加到项目配置
|
|
|
|
|
|
claude mcp add my-server -s project -- npx @my-org/mcp-server
|
|
|
|
|
|
|
|
|
|
|
|
# 添加 HTTP 类型
|
|
|
|
|
|
claude mcp add my-remote -s user -t http -u https://mcp.example.com/mcp
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
添加时的验证流程:
|
|
|
|
|
|
|
|
|
|
|
|
1. **名称校验**:只允许字母、数字、连字符和下划线
|
|
|
|
|
|
2. **保留名检查**:`claude-in-chrome` 和 `computer-use` 被保留
|
|
|
|
|
|
3. **企业管控检查**:企业模式下拒绝添加
|
|
|
|
|
|
4. **Schema 验证**:Zod 校验配置格式
|
|
|
|
|
|
5. **策略检查**:denylist 拒绝、allowlist 验证
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### 移除和列出
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
claude mcp remove my-server -s user
|
|
|
|
|
|
claude mcp list
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
### 项目配置审批
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
`.mcp.json` 中的项目配置需要用户显式审批才能生效:
|
|
|
|
|
|
|
|
|
|
|
|
```typescript
|
|
|
|
|
|
// config.ts:1166
|
|
|
|
|
|
const approvedProjectServers: Record<string, ScopedMcpServerConfig> = {}
|
|
|
|
|
|
for (const [name, config] of Object.entries(projectServers)) {
|
|
|
|
|
|
if (getProjectMcpServerStatus(name) === 'approved') {
|
|
|
|
|
|
approvedProjectServers[name] = config
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
首次打开项目时,Claude Code 会提示用户审批 `.mcp.json` 中的每个服务器。审批状态持久化在本地配置中。
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
### 插件 MCP 集成
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
插件通过 manifest 中的 `.mcp.json` 或 `.mcpb` 文件声明 MCP 服务器。
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### 插件命名空间
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
插件 MCP 服务器名格式为 `plugin:<pluginName>:<serverName>`,不会与手动配置的名称冲突。
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### 去重机制
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
插件服务器通过内容签名去重(`dedupPluginMcpServers`):
|
|
|
|
|
|
|
|
|
|
|
|
- **stdio 类型**:签名 = `stdio:` + JSON.stringify([command, ...args])
|
2026-06-09 23:15:17 +08:00
|
|
|
|
- **URL 类型**:签名 = `url:` + 原始 URL
|
2026-06-08 23:08:57 +08:00
|
|
|
|
- **sdk 类型**:签名为 null,不去重
|
|
|
|
|
|
|
|
|
|
|
|
去重规则:
|
|
|
|
|
|
1. 手动配置优先于插件配置
|
|
|
|
|
|
2. 先加载的插件优先于后加载的
|
|
|
|
|
|
3. 被抑制的插件服务器在 `/plugin` UI 中显示提示
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
### 策略管控
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### Allowlist / Denylist
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
企业策略通过 allowlist 和 denylist 控制可用的 MCP 服务器:
|
|
|
|
|
|
|
|
|
|
|
|
```typescript
|
|
|
|
|
|
// config.ts:1243 - 最终策略过滤
|
|
|
|
|
|
for (const [name, serverConfig] of Object.entries(configs)) {
|
|
|
|
|
|
if (!isMcpServerAllowedByPolicy(name, serverConfig)) {
|
|
|
|
|
|
continue // 跳过策略禁止的服务器
|
|
|
|
|
|
}
|
|
|
|
|
|
filtered[name] = serverConfig
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
策略检查考虑:
|
|
|
|
|
|
- 服务器名称匹配
|
|
|
|
|
|
- stdio 类型的 command + args 匹配
|
|
|
|
|
|
- URL 类型的 URL 模式匹配(支持通配符)
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### 插件专用模式
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
`isRestrictedToPluginOnly('mcp')` 启用时,只允许插件提供的 MCP 服务器——用户/项目级配置被忽略。
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
### 环境变量展开
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
MCP 配置中的环境变量支持 `$VAR` 和 `${VAR}` 语法展开:
|
|
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
|
{
|
|
|
|
|
|
"my-server": {
|
|
|
|
|
|
"command": "npx",
|
|
|
|
|
|
"args": ["@my-org/mcp-server"],
|
|
|
|
|
|
"env": {
|
|
|
|
|
|
"API_KEY": "$MY_API_KEY",
|
|
|
|
|
|
"DB_URL": "${DATABASE_URL}"
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
展开时缺失的变量会生成警告信息,但不阻止配置加载。
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
### 内置 MCP 动态注册
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
内置 MCP 服务器在 `main.tsx` 启动流程中动态注入配置:
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
| 服务器 | 名称 | Feature Flag | 启用方式 |
|
|
|
|
|
|
|--------|------|-------------|---------|
|
|
|
|
|
|
| Computer Use | `computer-use` | `CHICAGO_MCP` | GrowthBook gate + macOS + interactive |
|
|
|
|
|
|
| Claude in Chrome | `claude-in-chrome` | — | `--chrome` 参数或配置 |
|
|
|
|
|
|
| VSCode SDK | `claude-vscode` | — | IDE 嵌入模式 (type:`sdk`) |
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
### 保留名称
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
以下 MCP 服务器名称被保留,用户无法手动配置同名服务器:
|
|
|
|
|
|
|
|
|
|
|
|
| 名称 | 用途 | 检查条件 |
|
|
|
|
|
|
|------|------|---------|
|
|
|
|
|
|
| `claude-in-chrome` | Chrome 浏览器控制 | 始终检查 |
|
|
|
|
|
|
| `computer-use` | 桌面自动化 | `CHICAGO_MCP` feature flag 开启时检查 |
|
|
|
|
|
|
| `claude-vscode` | VSCode IDE 集成 | 由 SDK 传入,不经过名称检查 |
|
|
|
|
|
|
|
|
|
|
|
|
保留名检查在两个位置:
|
|
|
|
|
|
1. `addMcpConfig()`(`config.ts:636-648`)— 运行时拒绝
|
|
|
|
|
|
2. `main.tsx` 启动检查(`main.tsx:2351-2368`)— 启动时退出
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
### 关键源文件索引
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
| 文件 | 职责 |
|
|
|
|
|
|
|------|------|
|
|
|
|
|
|
| `src/services/mcp/config.ts` | 配置管理核心:合并、去重、策略、添加/删除 |
|
|
|
|
|
|
| `src/services/mcp/types.ts` | Zod Schema 定义、类型声明 |
|
|
|
|
|
|
| `src/services/mcp/client.ts` | 连接管理、传输层选择 |
|
|
|
|
|
|
| `src/utils/plugins/mcpPluginIntegration.ts` | 插件 MCP 配置加载 |
|
|
|
|
|
|
| `src/utils/computerUse/setup.ts` | Computer Use 动态注册 |
|
|
|
|
|
|
| `src/utils/claudeInChrome/common.ts` | Chrome MCP 保留名与工具名 |
|
|
|
|
|
|
| `src/services/mcp/vscodeSdkMcp.ts` | VSCode SDK 双向通知 |
|
2026-06-09 23:15:17 +08:00
|
|
|
|
|
|
|
|
|
|
## 关联笔记
|
|
|
|
|
|
|
|
|
|
|
|
- [[mcp-protocol|MCP 协议]]
|
|
|
|
|
|
- [[custom-agents|自定义 Agent]]
|
|
|
|
|
|
- [[skills|Skills 技能系统]]
|
|
|
|
|
|
- [[hooks|Hooks 生命周期钩子]]
|