| # 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 - 全局管理器
// 位置: 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通信:

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格式:

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作为底层通信协议。请求示例:

// 工具调用请求
{
  "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运行在独立的子进程中:

// 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支持声明式权限控制:

{
  "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会要求用户确认:

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:

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

{
  "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 验证配置

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 工具注册流程

// 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超级助手。


往期精选:

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐