C++ 实现 MCP 客户端
Model Context Protocol(MCP) 是 Anthropic 推出的开放协议,旨在让 AI 模型能够标准化地调用外部工具、读取资源、执行 Prompt。本文结合 C++ 实现代码,讲解 MCP 客户端的架构设计与核心机制。
MCP 协议简介
MCP 是一套 AI 与外部工具之间的通信协议。它定义了三种核心能力:
- Tools(工具):AI 可以调用的函数,例如查询天气、执行代码
- Prompts(提示模板):预定义的提示词模板,支持参数化
- Resources(资源):AI 可以读取的外部数据,例如文件、数据库条目
这套协议使用 JSON-RPC 2.0 作为消息格式,保证了跨语言、跨平台的互操作性。
整体架构设计
这份代码包含三个核心类,分工明确:
MCPServiceIntegrator ← 顶层集成器,统一对外暴露
└── MCPClient ← 传输层,负责与 MCP Server 通信
└── MCPToolManager ← 工具管理层,缓存工具列表、处理调用
传输层:两种通信模式
MCPClient 支持两种传输方式,由 MCPTransportType 枚举区分:
| 模式 | 适用场景 | 实现方式 |
|---|---|---|
| STDIO | 本地进程 | fork() + pipe() + execv() |
| SSE | 远程 HTTP 服务 | libcurl + Server-Sent Events |
STDIO 模式:本地进程通信
核心流程
父进程(MCPClient) 子进程(MCP Server)
│ │
│──── stdin_pipe ──────────>│ 写入 JSON-RPC 请求
│ │
│<─── stdout_pipe ─────────│ 读取 JSON-RPC 响应/通知
启动子进程
在 startMCPServer() 中,我们通过标准系统调用建立管道并启动子进程:
// 1. 创建两对管道
int stdin_pipe_fd[2]; // 父写 → 子读
int stdout_pipe_fd[2]; // 子写 → 父读
(stdin_pipe_fd);
(stdout_pipe_fd);
server_pid_ = fork();
(server_pid_ == ) {
(stdin_pipe_fd[], STDIN_FILENO);
(stdout_pipe_fd[], STDOUT_FILENO);
(server_path_.(), argv.());
}
stdin_pipe_ = stdin_pipe_fd[];
stdout_pipe_ = stdout_pipe_fd[];
(stdout_pipe_, F_SETFL, O_NONBLOCK);

