| # MCP协议集成:Claude Code如何扩展AI Agent的能力边界
【Claude Code源码分析·第20篇】
如果说大语言模型是"大脑",那么MCP协议就是让AI Agent拥有"四肢"的关键------让它能够调用外部工具、访问实时数据、操作真实世界。
一、MCP协议:让AI与工具"说同一种语言"
MCP(Model Context Protocol)是由Anthropic主导推出的开放协议,旨在为AI模型与外部工具之间建立统一、标准、双向的通信桥梁。
传统的AI Agent调用工具,需要为每个工具单独开发适配代码,导致:
- 🔧 集成成本极高:每增加一个工具,需要写大量胶水代码
- 📦 依赖爆炸:每个工具都有自己的SDK、认证方式、错误处理
- 🔒 安全风险:分散的集成难以统一管控权限
MCP通过定义统一的通信协议,解决了以上所有问题。
MCP的核心设计理念
主机(Claude Code) ←→ MCP Server ←→ 外部工具/数据源
Claude Code作为MCP Host ,通过标准化的MCP协议 与一个或多个MCP Server通信,每个Server可以连接多个外部工具或数据源。
二、Claude Code的MCP实现架构
2.1 核心组件
Claude Code源码中的MCP实现由以下核心模块组成:
1. McpManager - 全局管理器
typescript
// 位置: src/tools/mcp/index.ts
export class McpManager {
private servers: Map<string, McpServer> = new Map();
private toolAdapters: Map<string, McpToolAdapter> = new Map();
// 启动MCP服务器
async startServer(name: string, config: McpServerConfig): Promise<void>;
// 停止所有服务器
async stopAll(): Promise<void>;
// 获取可用的MCP工具列表
getAvailableTools(): Tool[];
}
2. McpClient - 协议客户端
McpClient负责与MCP Server建立连接并进行JSON-RPC 2.0通信:
typescript
class McpClient {
private connection: MessagePort | WebSocket;
private pendingRequests: Map<string, {resolve, reject, timeout}> = new Map();
// 发送JSON-RPC请求
async sendRequest(method: string, params: object): Promise<any>;
// 发送JSON-RPC通知(无响应)
sendNotification(method: string, params: object): void;
// 接收服务器响应
private handleResponse(message: JsonRpcResponse): void;
}
3. McpToolAdapter - 工具适配器
将MCP工具适配为Claude Code内部统一的Tool格式:
typescript
class McpToolAdapter {
constructor(
private mcpClient: McpClient,
private toolDefinition: ToolDefinition
) {}
// 将Claude Code的工具调用请求转换为MCP格式
async invoke(input: ToolInput): Promise<ToolResult> {
const mcpRequest = this.toMcpRequest(input);
const response = await this.mcpClient.sendRequest(
'tools/call',
mcpRequest
);
return this.fromMcpResponse(response);
}
}
2.2 通信协议:JSON-RPC 2.0
MCP使用JSON-RPC 2.0作为底层通信协议。请求示例:
json
// 工具调用请求
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "filesystem_read",
"arguments": {
"path": "/project/src/main.ts"
}
}
}
// 响应
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "export class Main { ... }"
}
]
}
}
三、安全设计:Claude Code如何保护你的系统
3.1 进程隔离
每个MCP Server运行在独立的子进程中:
typescript
// MCP Server以独立进程启动
const serverProcess = spawn('node', [serverScriptPath], {
stdio: ['pipe', 'pipe', 'pipe', 'ipc'],
env: { ...filteredEnv },
cwd: workspacePath
});
这样做的好处:
- 🔒 MCP Server崩溃不会影响Claude Code主进程
- 🛡️ 可以通过进程级别的权限控制限制Server能力
- 📊 独立的stdout/stderr便于日志记录
3.2 权限层级
MCP支持声明式权限控制:
json
{
"name": "filesystem_server",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem"],
"allowedDirectories": ["/project/src", "/project/tests"],
"env": {
"READ_ONLY": "true"
}
}
Claude Code会根据配置的allowedDirectories在调用前校验路径,防止工具访问未授权区域。
3.3 确认机制
对于高风险操作,Claude Code会要求用户确认:
typescript
async function invokeWithConfirmation(
tool: McpTool,
args: object
): Promise<ToolResult> {
if (tool.requiresConfirmation) {
const confirmed = await promptUser(
`允许执行 ${tool.name}?`,
`参数: ${JSON.stringify(args)}`
);
if (!confirmed) {
throw new Error('操作已取消');
}
}
return invokeTool(tool, args);
}
四、实战:配置MCP Server
4.1 安装MCP Server
通过npm安装官方Server:
bash
npm install -g @modelcontextprotocol/server-filesystem
npm install -g @modelcontextprotocol/server-github
npm install -g @modelcontextprotocol/server-brave-search
4.2 在Claude Code中配置
在项目根目录创建.claude/mcp.json:
json
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/project"],
"env": {
"READ_ONLY": "false"
}
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}"
}
},
"brave-search": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-brave-search"],
"env": {
"BRAVE_API_KEY": "${BRAVE_SEARCH_KEY}"
}
}
}
}
4.3 验证配置
bash
claude mcp list
输出示例:
MCP Servers:
✓ filesystem (running) - 文件系统操作
✓ github (running) - GitHub API集成
✓ brave-search (running) - 网页搜索
Available Tools:
- filesystem_read(path: string) → string
- filesystem_write(path: string, content: string) → boolean
- filesystem_list_directory(path: string) → FileInfo[]
- github_get_issue(owner: string, repo: string, number: number) → Issue
- brave_web_search(query: string, count?: number) → SearchResult[]
五、MCP与Function Calling的对比
很多人分不清MCP和Function Calling的区别:
| 维度 | Function Calling | MCP |
|---|---|---|
| 定义方 | AI模型(如GPT-4、Claude) | Anthropic/社区 |
| 通信方式 | 模型输出的结构化JSON | 标准JSON-RPC 2.0 |
| 注册方式 | 每次请求传入 | 持久化配置 |
| 工具发现 | 手动注册 | 自动发现 |
| 适用场景 | 简单函数调用 | 复杂工具生态 |
Function Calling是模型级别的能力 ,而MCP是协议级别的标准。两者可以结合使用:MCP Server内部可以暴露Function Calling接口。
六、源码核心逻辑分析
6.1 工具注册流程
typescript
// src/tools/mcp/registry.ts
export class McpToolRegistry {
async registerServer(serverConfig: McpServerConfig): Promise<void> {
// 1. 启动服务器进程
const server = await McpServer.start(serverConfig);
// 2. 获取服务器提供的工具列表
const tools = await server.listTools();
// 3. 为每个工具创建适配器
for (const tool of tools) {
const adapter = new McpToolAdapter(server.client, tool);
this.adapters.set(tool.name, adapter);
}
// 4. 注册到全局工具管理器
toolManager.registerBulk(this.adapters.values());
}
}
6.2 工具调用流程
用户请求 → Loop解析意图 → 工具选择 →
↓
McpToolAdapter.invoke() → McpClient.sendRequest()
↓
MCP Server处理 → 返回JSON-RPC响应
↓
McpToolAdapter.fromMcpResponse() → ToolResult
↓
Loop接收结果 → 整合到响应中 → 返回用户
七、总结与展望
MCP协议代表了AI Agent工具集成的新范式------从"烟囱式集成"到"标准化协议"的飞跃。
Claude Code通过MCP获得了:
- 🌐 生态扩展:可接入任何遵循MCP标准的工具
- 🔒 安全可控:进程隔离+权限控制
- 🔄 动态发现:无需重启即可发现新工具
- 📦 开箱即用:丰富的官方Server支持
未来,随着MCP生态的壮大,Claude Code的"工具箱"将越来越丰富,真正成为开发者的AI超级助手。
往期精选: