Skip to content

协议版本

SDK 通过双 WireCodec 架构支持两个 MCP 协议时代。

版本对比

版本状态关键特性
2024-11-05旧版原始规范
2025-03-26旧版稳定握手
2025-06-18旧版中间版本
2025-11-25旧版initialize 握手,独立的服务器到客户端请求
2026-07-28当前server/discover、每请求 _meta、MRTR、subscriptions/listen

WireCodec

WireCodec 工厂通过字符串比较自动选择正确的编解码器:

cpp
auto codec = MakeWireCodec("2026-07-28");
// 如果版本 >= "2026-07-28",返回 Rev2026Codec
// 否则回退至 Rev2025Codec 用于旧版本

SetNegotiatedProtocolVersion(version) 同时存储版本号并通过 MakeWireCodec(version) 重建 WireCodec,在 Rev2025Codec(无 _meta 信封)和 Rev2026Codec(每请求 _meta)之间切换。

注意 HandleDiscover 返回 {"2025-11-25", "2026-07-28"}调用 SetNegotiatedProtocolVersion —— 现代客户端通过 _meta.protocolVersion 按请求驱动版本选择。

时代之间的关键差异

方面2025-11-252026-07-28
连接initialize 握手server/discover 每请求 _meta
能力一次性协商通过 _meta 每请求指定
采样独立请求已移除(使用 Elicitation)
日志logging/setLevel RPC每请求 _meta.logLevel
订阅subscribe/unsubscribesubscriptions/listen
错误码直接值重新映射(-32001-32020 等)
结果普通 JSON(恒等编解码)resultType 字段的类型化结果(自动标记 "complete"
_meta 验证不需要server/discover 外所有请求必须携带

2026 时代的 Wire 验证

Rev2026Codec::ValidateRequest 拒绝缺少 _meta 信封的请求,server/discover 除外(它是引导调用)。这强制实现了无状态协议设计。

结果编码

  • 2025 时代EncodeResult/DecodeResult 为恒等操作——原始 JSON 直接通过。
  • 2026 时代EncodeResult 自动在结果中标记 resultType: "complete"(如果尚未存在)。resultType 字段使下游能够区分正常结果和 input_required(MRTR)结果。

IncomingRequestMeta

IncomingRequestMeta 结构体从 2026 时代的 _meta 信封中提取以下字段:

字段_meta
protocol_versionio.modelcontextprotocol/protocolVersion
client_infoio.modelcontextprotocol/clientInfo
client_capabilitiesio.modelcontextprotocol/clientCapabilities
log_levelio.modelcontextprotocol/logLevel
progress_tokenprogressToken
subscription_idio.modelcontextprotocol/subscriptionId

StampOutgoingMeta 辅助函数将 protocolVersionclientInfoclientCapabilitieslogLevel 标记到传出请求的 _meta 中。

按时代划分的方法

编解码器定义了每个时代的方法集合:

集合方法
公共(两个时代)tools/listtools/callresources/listresources/readresources/templates/listprompts/listprompts/getcompletion/completeelicitation/create
仅 2025pinginitializeresources/subscriberesources/unsubscribelogging/setLevelroots/listsampling/createMessage
仅 2026server/discoverserver/extensions/listsubscriptions/listentasks/gettasks/updatetasks/cancel

按时代划分的通知

集合通知
公共(两个时代)notifications/cancellednotifications/progressnotifications/resources/updatednotifications/resources/list_changednotifications/tools/list_changednotifications/prompts/list_changednotifications/subscriptions/acknowledged
仅 2025notifications/initializednotifications/messagenotifications/roots/list_changednotifications/elicitation/complete
仅 2026notifications/tasks/statusnotifications/tasks/workingnotifications/tasks/completednotifications/tasks/failednotifications/tasks/cancellednotifications/tasks/input_required

订阅系统

2026 时代的订阅系统使用 SubscriptionFilter 声明兴趣:

cpp
struct SubscriptionFilter {
    std::optional<bool> tools_list_changed;
    std::optional<bool> prompts_list_changed;
    std::optional<bool> resources_list_changed;
    std::vector<std::string> resource_subscriptions;
};

客户端通过 subscriptions/listen 发送过滤器;服务端通过 AddSubscription/AddSubscriptionEntry 跟踪订阅条目,并通过 NotifySubscribers 分发通知,根据每个订阅的过滤器匹配通知类型。通知的 _meta 中包含 io.modelcontextprotocol/subscriptionId

语义辅助函数

McpSessionMcpSessionHandler 都提供:

cpp
bool IsJuly2026OrLater() const;
// 如果 negotiated_version_ >= "2026-07-28" 返回 true

用于在应用代码中控制协议时代相关的行为。

协议基础设施

MessageChannel

MessageChannel 提供了基于 std::queuestd::mutexstd::condition_variable 的有界异步消息队列,支持背压:

  • AsyncReceive(callback) — 阻塞直到消息到达或通道关闭
  • Send(message) — 缓冲区满时阻塞(背压)
  • TrySend(message) — 非阻塞发送
  • Close() — 唤醒所有等待者

McpSessionHandler 用于异步消息循环。

MessageFilter 管道

FilterPipeline 链式组合多个 MessageFilter 实例,用于拦截(认证、审计、限流、请求修改):

cpp
auto pipeline = std::make_shared<FilterPipeline>();
pipeline->AddFilter(std::make_shared<IncomingMessageFilter>(
    [](const JsonRpcMessage& msg, MessageFilterNext next) {
        // 检查/修改,然后调用 next(filtered) 或短路
        next(msg);
    }));

入站过滤器包装处理程序分发;出站过滤器包装传输层发送。两者都是可选的,通过 ServerOptions::incoming_filters / outgoing_filters 配置。

X-Mcp-Header 注解

XMcpHeaders.hpp 为 JSON Schema 中的 x-mcp-header 注解提供辅助函数:

  • ScanXMcpHeaders(schema) — 从 x-mcp-header 声明中提取 paramName → headerName 映射
  • ExtractXMcpHeaderValues(params, decls) — 从参数中提取基本类型(字符串、整数、布尔值)的头部值

错误码重新映射(2026 时代)

代码名称2025 值2026 值
HeaderMismatch头部不匹配-32001-32020
MissingRequiredClientCapability缺少必要能力-32003-32021
UnsupportedProtocolVersion版本不匹配-32004-32022