Skip to content

服务端概述 ​

McpServer 类向连接的 MCP 客户端暴露能力(工具、资源、提示)。

创建服务端 ​

cpp
auto transport = std::make_shared<StdioServerTransport>();

ServerOptions opts;
opts.server_info = Implementation{"MyServer", "1.0.0"};

auto server = McpServer::Create(transport, opts);
server->Run();

对于 Streamable HTTP 模式:

cpp
StreamableHttpServerOptions http_opts;
http_opts.port = 3001;
http_opts.stateless = true;  // 或 false 使用会话模式

auto transport = std::make_shared<StreamableHttpServerTransport>(http_opts);

ServerOptions opts;
opts.server_info = Implementation{"MyServer", "1.0.0"};

auto server = McpServer::Create(transport, opts);
server->Run();

ServerOptions ​

字段类型描述
server_infooptional<Implementation>服务端标识(名称、版本)
protocol_versionoptional<string>固定到特定协议版本
server_instructionsoptional<string>发送给客户端的指令
initialization_timeoutchrono::seconds握手超时时间(默认 60s)
declare_loggingbool显式声明 logging 能力(合并进推导能力,默认 false)
declare_completionsbool显式声明 completions 能力(默认 false)
task_storeshared_ptr<IMcpTaskStore>任务持久化后端
request_state_verifierfunction<bool(string_view)>MRTR 的 HMAC/AEAD 验证器
request_state_keyoptional<string>MRTR 服务端请求状态签名密钥(HMAC);设置后若未显式提供 request_state_verifier,自动接线内置验证器,在处理器前拒绝篡改/过期的状态(返回 -32602 且 data.reason="invalid_request_state")
request_state_ttlchrono::seconds签发的请求状态最大寿命(默认 0 = 不检查过期)
cache_hintsoptional<map<string, CacheHint, less<>>>按方法的缓存提示(ttlMs, cacheScope)
cache_hint_resolverfunction<optional<CacheHint>(string_view)>按方法动态解析缓存提示的逃生钩子(优先于 cache_hints 静态表;运行时可经 SetCacheable 替换)
supported_protocol_versionsoptional<vector<string>>窄化服务端支持版本表(discover 应答、initialize 候选集、_meta 门控与错误 data.supported 三处同时生效;空即全表)
subscriptions_enabledbool订阅总开关(默认 true;关闭则 subscriptions/listen 回 MethodNotFound)
max_tool_input_elementsoptional<size_t>工具参数元素数上限(对象键数/数组长度;超限回 is_error 工具结果而非协议错误)
input_required_configoptional<InputRequiredConfig>MRTR/elicitation 行为的配置
input_required_config.max_roundsint最大启发式收集轮次(默认 10)
input_required_config.round_timeoutchrono::seconds每轮超时时间(默认 600s)
input_required_config.legacy_shimbool启用旧版兼容垫片(默认 true)
on_requestfunction收到每个入站 JSON-RPC 请求时回调,包含方法名和完整请求体
on_responsefunction发送每个出站 JSON-RPC 响应时回调
on_errorfunction发送每个出站 JSON-RPC 错误时回调
on_notificationfunction收到每个入站 JSON-RPC 通知时回调
on_method_calledfunction(string_view)简写——仅方法名(与 on_request 同时触发)
on_protocol_errorfunction(string_view)简写——仅错误消息(与 on_error 同时触发)
on_client_connectedfunction(const Implementation&)客户端完成 initialize 时回调
on_initializedfunction()客户端发送 notifications/initialized 时回调
on_transport_closefunction()传输连接关闭时回调
on_transport_errorfunction(string_view)传输层错误时回调
incoming_filtersshared_ptr<FilterPipeline>用于拦截/修改/阻断入站消息的管道
outgoing_filtersshared_ptr<FilterPipeline>用于拦截/修改/阻断出站消息的管道

简写回调(on_method_called、on_protocol_error)和完整消息回调(on_request、on_error)为链式触发 — 同时设置时两者都会触发。

RequestContext<TParams> ​

每个工具处理器接收到一个 RequestContext<CallToolRequestParams>,提供请求上下文:

成员返回类型说明
Params()const TParams&反序列化后的请求参数
Server()McpServer&所属服务端实例的引用
GetRequest()const JsonRpcRequest&原始 JSON-RPC 请求
LogLevel()optional<LoggingLevel>来自 _meta 的每请求日志级别(2026 时代)
Log(level, data)void发送日志通知,受 LogLevel() 过滤
IsCancellationRequested()bool本请求是否已收到 notifications/cancelled;handler 轮询该标志实现协作取消

Log() 方法遵循每请求日志级别:低于请求 LogLevel() 的消息会被静默丢弃。

McpServerTool ​

对于可复用的工具定义,可以继承 McpServerTool 或使用 McpServerTool::Create:

cpp
auto tool = McpServerTool::Create("get_weather",
    [](const RequestContext<CallToolRequestParams>& ctx) -> CallToolResult {
        // ...
    },
    ToolOptions{}.Description("获取天气"));
server->RegisterTool(tool);

McpServerTool 抽象类暴露:

  • ProtocolTool() — 返回协议层的 Tool 结构体
  • InvokeAsync(ctx, promise) — 重写以实现自定义异步执行

基于 lambda 的 RegisterTool 重载内部同样创建 McpServerTool,行为一致。

属性 ​

方法返回类型说明
GetClientCapabilities()std::shared_ptr<const ClientCapabilities>仅在 2025 时代客户端 initialize 握手时填充;2026 时代(无 initialize)下恒为 nullptr
GetClientInfo()std::shared_ptr<const Implementation>客户端标识(连接前为 nullptr)
GetNegotiatedProtocolVersion()std::string协商后的协议版本字符串
GetCapabilities()const ServerCapabilities&从注册原语自动推导的服务端能力
IsMrtrSupported()bool是否支持 MRTR(多轮工具检索)

通知 ​

方法说明
SendToolListChanged()通知客户端工具列表已变更
SendResourceListChanged()通知客户端资源列表已变更
SendResourceUpdated(uri)通知客户端某个资源的内容已变更(只投递给订阅了该 uri 的订阅者)
SendPromptListChanged()通知客户端提示列表已变更
SendLoggingMessage(level, data)发送日志消息(遵循客户端的 logging/setLevel)
SendLoggingMessage(level, data, min_level)重载,带有显式最低级别覆盖

补全处理器 ​

为 completion/complete 请求注册可选处理器(如参数自动补全):

cpp
server->SetCompletionHandler(
    [](const CompleteRequestParams& params) -> CompleteResult {
        CompleteResult result;
        result.completion = JsonValue::Parse(R"({"values":["value1","value2"]})");
        return result;
    });

生命周期 ​

  1. 构造:McpServer::Create — 创建会话处理器、挂载处理器、启动消息循环
  2. 注册:通过 RegisterTool、RegisterResource、RegisterResourceTemplate、RegisterPrompt 注册工具、资源、提示
  3. 运行:server->Run() — 阻塞直到 Close() 被调用;会话处理器异步处理消息
  4. 关闭:server->Close() — 等待待处理的异步调用、关闭处理器和传输层

能力推导 ​

能力从注册的原语中自动推导。例如,注册工具会设置 capabilities.tools.list_changed = true。ServerOptions 没有 capabilities 字段——能力始终从已注册的工具、资源、提示和任务存储自动推导;例外是 declare_logging 与 declare_completions,为 true 时即使尚未注册对应处理器也会显式声明 logging/completions 能力(合并进推导结果)。