客户端概述
McpClient 类连接 MCP 服务器,协商协议版本,并调用服务器能力。
创建客户端
cpp
StdioClientTransportOptions transport_opts;
transport_opts.command = "path/to/server";
auto transport = std::make_shared<StdioClientTransport>(transport_opts);
ClientOptions opts;
opts.client_info = Implementation{"MyClient", "1.0.0"};
auto client = McpClient::Create(transport, opts);ClientOptions
| 字段 | 类型 | 描述 |
|---|---|---|
client_info | Implementation | 客户端标识 |
capabilities | optional<ClientCapabilities> | 声明的能力 |
connect_mode | ConnectMode | Auto(发现 → 初始化)、Legacy、Pin |
initialization_timeout | chrono::seconds | 握手超时(默认 60s) |
pin_protocol_version | optional<string> | 固定到特定协议版本(用于 Pin 模式) |
discover_probe_timeout | chrono::seconds | 服务发现探测超时(默认 5s) |
supported_protocol_versions | vector<string> | 客户端声明的协议版本 |
input_required_config | InputRequiredConfig | MRTR elicitation 响应的配置 |
cache_config | CacheConfig | 客户端缓存配置 |
extensions | optional<JsonValue> | 协议扩展声明 |
enforce_strict_capabilities | bool | 拒绝未知能力(默认 false) |
list_max_pages | int | 分页列表操作的最大页数(默认 64) |
发起请求
cpp
// 列出工具
auto tools = client->ListTools();
// 调用工具
auto result = client->CallTool("echo",
JsonValue(JsonValue::Object{{"text", "Hello"}}));
// 读取资源
auto resource = client->ReadResource("file:///config.json");
// 获取提示词
auto prompt = client->GetPrompt("code_review",
JsonValue(JsonValue::Object{{"diff", "..."}}));
// 补全提示词/资源引用
auto completion = client->Complete(params);
// Ping(心跳)
client->Ping();服务端到客户端处理器
注册用于处理服务器发起请求的处理器:
cpp
client->SetElicitationHandler(
[](const ElicitRequestParams& params) -> ElicitResult {
// 提示用户输入,返回结果
ElicitResult result;
result.values = JsonValue(JsonValue::Object{{"name", "Alice"}});
return result;
});
client->SetSamplingHandler(
[](const CreateMessageRequestParams& params) -> CreateMessageResult {
// 已弃用:请使用 Elicitation 替代
});
client->SetRootsHandler(
[](const ListRootsRequestParams& params) -> ListRootsResult {
// 已弃用:提供根目录
});订阅
cpp
// 订阅服务器通知(2026 时代)
SubscriptionsListenRequestParams subs;
subs.notifications.tools_list_changed = true;
subs.notifications.resources_list_changed = true;
client->SubscribeAsync(subs);版本协商
客户端自动协商协议版本:
- Auto(默认):探测
server/discover,回退至initialize握手 - Pin:强制指定版本
- Legacy:仅使用
initialize握手