MCP 协议服务
Claude Code 实现了完整的 MCP (Model Context Protocol) 客户端,管理与外部 MCP 服务器的连接、工具发现和资源访问。
MCP 客户端架构
通过配置发现的 MCP 服务器(无单例 MCPManager)
├── MCPServerConnection[filesystem] → stdio 连接 → npx @modelcontextprotocol/server-filesystem
├── MCPServerConnection[github] → stdio 连接 → npx @modelcontextprotocol/server-github
├── MCPServerConnection[postgres] → SSE 连接 → https://postgres-mcp.example.com
└── MCPServerConnection[custom] → stdio 连接 → ./custom-mcp-server配置发现
MCP 服务器配置从 多层 来源合并(优先级从低到高):
- 用户级配置 (
~/.claude/settings.json中的mcpServers) - 项目级配置 (
.claude/settings.json中的mcpServers) - 企业托管配置 (远程托管设置中的
mcpServers) - 环境变量 (
CLAUDE_MCP_SERVERSJSON) - CLI 参数 (命令行指定的 MCP 服务器)
合并策略:后来者覆盖同名服务器。配置加载通过内部设置加载机制实现,非单独的 loadSettings('global') 函数。
MCPServerConnection 生命周期
typescript
// 实际是 type,非 class——通过配置创建
type MCPServerConnection = {
name: string
transport: 'stdio' | 'sse'
status: 'connecting' | 'connected' | 'disconnected' | 'error'
// 连接流程示意(简化):
// 1. 启动进程或建立 SSE 连接
// stdio: spawn(command, args, { env })
// sse: 使用 SDK 的 SSEClientTransport(非自定义 SSEClient)
//
// 2. 初始化握手
// sendRequest('initialize', { protocolVersion, capabilities })
//
// 3. 发现工具
// sendRequest('tools/list')
//
// 4. 发现资源
// sendRequest('resources/list')
}工具注册
MCP 工具通过配置自动注册,每个 MCP 工具使用 buildTool() 构建。命名规则:mcp__<serverName>__<toolName>。
JSON Schema 与 Zod 之间的转换通过内部机制处理,工具调用通过 MCP SDK 的连接方法执行,结果中的不同类型(text、image 等)分别处理。
MCP OAuth 认证
src/services/mcpAuth/ 目录包含 MCP 服务器的 OAuth 2.0 认证流程实现。流程为:获取认证 URL、打开浏览器、等待回调、交换 token、存储 token。
健康检查
MCP 连接状态通过 MCPServerConnection 的 status 字段跟踪('connecting' | 'connected' | 'disconnected' | 'error')。连接异常时自动重试或标记为 error 状态。