Skip to content

客户端概述

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_infoImplementation客户端标识
capabilitiesoptional<ClientCapabilities>声明的能力
connect_modeConnectModeAuto(发现 → 初始化)、LegacyPin
initialization_timeoutchrono::seconds握手超时(默认 60s)
pin_protocol_versionoptional<string>固定到特定协议版本(用于 Pin 模式)
discover_probe_timeoutchrono::seconds服务发现探测超时(默认 5s)
supported_protocol_versionsvector<string>客户端声明的协议版本
input_required_configInputRequiredConfigMRTR elicitation 响应的配置
cache_configCacheConfig客户端缓存配置
extensionsoptional<JsonValue>协议扩展声明
enforce_strict_capabilitiesbool拒绝未知能力(默认 false)
list_max_pagesint分页列表操作的最大页数(默认 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);

版本协商

客户端自动协商协议版本:

  1. Auto(默认):探测 server/discover,回退至 initialize 握手
  2. Pin:强制指定版本
  3. Legacy:仅使用 initialize 握手