SEP-2577:弃用 Roots、Sampling 和 Logging

SEP-2577:弃用 Roots、Sampling 和 Logging

社区译文;来源: MCP 29affa6b

本 SEP 已达到 Final 状态,并作为已接受设计的历史记录保留。 定稿后对协议所做的更改不会反映在此处。权威要求请参阅当前规范 及其变更日志。
字段值
SEP2577
标题弃用 Roots、Sampling 和 Logging
状态Final
类型标准跟踪
创建日期2026-04-14
作者Kurtis Van Gent (@kurtisvg)
发起人@kurtisvg
PR#2577

摘要

本 SEP 弃用以下核心协议特性:

  • Roots(roots/list、notifications/roots/list_changed)
  • Sampling(sampling/createMessage、 ClientCapabilities.tasks.requests.sampling)
  • Logging(logging/setLevel、notifications/message)

这些特性自纳入本 SEP 的规范版本(预计为 2026 年 6 月)起弃用。在该版本发布后一年内发布的 所有规范版本中,它们仍将保持完整功能。

假设另一份 SEP 提议的“每版本支持一年”政策生效,此后的每个版本又会在自身发布后继续支持这些 特性一年。这为实现在彻底移除这些特性前提供了更长的迁移窗口。

弃用期间,线级行为不变。不删除类型,不改变能力协商,也不会破坏现有实现。弃用用于向生态发出 信号:停止基于这些特性构建新功能,并为它们最终被移除做好规划。

动机

MCP 规范旨在保持精简和聚焦。采用率低、与现有替代方案重叠,或相对于其价值给实现带来过重负担的 特性,都适合考虑移除。将此类特性保留在核心规范中,会增加每个客户端和服务器的负担,减慢协议演进, 并使规范更难学习。以下三个特性符合这些条件。

最近一次核心贡献者会议提出弃用这些特性。本 SEP 通过具体实施计划正式确定该提案。参见 讨论 #2536。

Roots

Roots 提供关于服务器应在哪些目录或文件上操作的“信息性指导”。实践中:

  • 采用率低:支持 roots 的客户端很少,依赖它的服务器也很少。 特性支持矩阵显示客户端覆盖有限。
  • 语义模糊:规范将 roots 描述为信息性的,服务器无需遵守,因此其实用性降低。
  • 替代方案重叠:工作目录上下文可以通过工具参数、资源 URI、服务器配置或环境变量提供, 这些方式都更加明确。

Sampling

Sampling 允许服务器向客户端请求 LLM 补全。尽管概念上很强大,它的采用情况一直不理想:

  • 实现复杂:正确实现 sampling 需要人工介入审批、模型选择逻辑、安全考虑,以及(自 SEP-1577 起) 工具循环支持。这种复杂性导致客户端采用率较低。
  • 采用率低:特性支持矩阵显示,尽管该特性自 2024 年 11 月版规范起已可用, 但支持 sampling 的客户端很少。
  • 直接替代方案:需要 LLM 能力的服务器可以直接集成 LLM 提供商 API,从而完全控制模型选择、 参数和流式传输。

Logging

Logging 允许服务器通过协议向客户端发送结构化日志消息:

  • 与基础设施重叠:标准日志机制(stdio 传输使用 stderr,结构化可观测性使用 OpenTelemetry) 已成熟且广泛采用,比应用协议通道更适合承载日志。
  • 相对于复杂度价值较低:向核心规范添加日志消息类型、严重级别和 logging/setLevel 请求, 会增加所有客户端和服务器的实现面。

规范

变更概览

  1. 在 schema 中使用 @deprecated 注解标记弃用特性
  2. 在特性文档页面添加弃用提示
  3. 弃用期间不改变线级协议

Schema 变更

为 schema/draft/schema.ts 中的以下项目添加 @deprecated JSDoc 注解。不删除任何类型、接口或 联合类型成员。

已弃用能力

能力位置
ClientCapabilities.roots用于列出 roots 的客户端能力
ClientCapabilities.sampling用于 LLM sampling 的客户端能力
ClientCapabilities.tasks.requests.sampling使用任务增强的 sampling 子能力
ServerCapabilities.logging用于日志消息的服务器能力

已弃用类型:Roots

类型说明
Root表示根目录或文件
ListRootsRequest用于 roots/list 的服务器到客户端请求
ListRootsResult包含 roots 数组的结果
ListRootsResultResponseJSON-RPC 响应包装器
RootsListChangedNotificationroots 发生变化时的客户端通知

已弃用类型:Sampling

类型说明
CreateMessageRequestParamssampling/createMessage 的参数
CreateMessageRequest服务器到客户端的 sampling 请求
CreateMessageResultsampling 请求的结果
CreateMessageResultResponseJSON-RPC 响应包装器
SamplingMessagesampling 对话中的消息
SamplingMessageContentBlocksampling 消息的内容块联合类型
ToolChoice控制 sampling 期间的模型工具选择
ToolUseContentsampling 消息中的工具使用内容块
ToolResultContentsampling 消息中的工具结果内容块
ModelPreferences服务器的模型选择偏好
ModelHint模型选择提示

已弃用类型:Logging

类型说明
LoggingLevelSyslog 严重级别枚举
SetLevelRequestParamslogging/setLevel 的参数
SetLevelRequest用于设置级别的客户端到服务器请求
SetLevelResultResponseJSON-RPC 响应包装器
LoggingMessageNotificationParams日志消息通知的参数
LoggingMessageNotification服务器到客户端的日志消息

注解格式

每个已弃用项目 SHOULD 获得一个带简短说明的 JSDoc @deprecated 标签:

/**
 * Present if the client supports listing roots.
 *
 * @deprecated Deprecated as of this specification version. Will be included
 * in all versions released within one year, then may be removed.
 */
roots?: {
  listChanged?: boolean;
};

联合类型

以下联合类型引用了已弃用类型,但弃用期间 MUST NOT 修改它们。移除已弃用类型时再更新这些联合类型:

  • ClientNotification(包含 RootsListChangedNotification)
  • ClientResult(包含 CreateMessageResult、ListRootsResult)
  • ServerRequest(包含 CreateMessageRequest、ListRootsRequest)
  • ServerNotification(包含 LoggingMessageNotification)

文档变更

在各特性文档页面标题之后添加弃用警告块:

docs/specification/draft/client/roots.mdx:

<Warning>
**Deprecated**: The Roots feature is deprecated as of this specification
version. It will remain fully functional in all specification versions released
within one year of the <YYYY-MM-DD> release. Each of those versions will
continue to support it for one year after its own release.
</Warning>

docs/specification/draft/client/sampling.mdx:

<Warning>
**Deprecated**: The Sampling feature is deprecated as of this specification
version. It will remain fully functional in all specification versions released
within one year of the <YYYY-MM-DD> release. Each of those versions will
continue to support it for one year after its own release.
</Warning>

docs/specification/draft/server/utilities/logging.mdx:

<Warning>
**Deprecated**: The Logging feature is deprecated as of this specification
version. It will remain fully functional in all specification versions released
within one year of the <YYYY-MM-DD> release. Each of those versions will
continue to support it for one year after its own release.
</Warning>

能力协商

弃用期间,能力协商不变:

  • 支持已弃用特性的客户端和服务器 SHOULD 继续声明相应能力。
  • 遇到已弃用能力的实现 MUST 仍然正确处理它们。
  • 协商到已弃用能力时,实现 SHOULD 发出警告(例如写入日志或开发者工具)。
  • 新实现 SHOULD NOT 增加对已弃用特性的支持,除非需要与现有对端保持向后兼容。

时间线

  • 弃用:在下一版规范中(目前计划于 2026 年 6 月发布)。
  • 后续版本继续包含:此版本发布后一年内发布的所有规范版本 MUST 继续包含这些已弃用特性。
  • 每版本支持:根据另一份 SEP 提议的“每版本支持一年”政策,每个包含这些特性的版本都将在 自身发布后继续支持它们一年。
  • 移除:此版本发布一年以后发布的规范版本 MAY 完全移除这些特性。

理由

为什么弃用,而不是移入扩展?

许多客户端和服务器已经实现这些特性。扩展机制(SEP-2133)规定,除非提供了扩展,否则实现必须 表现为扩展不存在。将此逻辑追溯应用到现有 SDK,尤其是跨多个协议版本应用,会复杂且容易出错。 先弃用再移除的破坏性更小:实现在过渡期可以继续原样使用这些特性,在特性移除后停止使用即可。

为什么弃用,而不是立即移除?

尽管这些特性的采用率较低,但仍有人使用。立即移除会给用户、客户端与服务器所有者以及 SDK 构建者带来不必要的变动和干扰。弃用窗口可让生态按自己的节奏迁移,从而尽量降低影响。

为什么专门选择这三个特性?

核心贡献者会议认为,这些特性的采用率与复杂度之比最低。每项特性在协议之外都有可行替代方案, 且没有一项是定义 MCP 的核心资源/工具/提示词交互模型所必需的。参见 讨论 #2536。

向后兼容性

弃用期间不存在向后兼容问题。所有已弃用特性继续以完全相同的方式工作,不引入线级变更。

移除后(即在此版本发布一年以后发布的规范版本中):

  • 协商到包含这些特性的旧协议版本的实现,仍可通过该版本的 schema 使用它们。
  • 协商到已移除这些特性的版本的实现,将不再能使用它们。

安全影响

弃用这些特性对安全有净正面影响:

  • Sampling 是三者中对安全最敏感的特性。它允许服务器通过客户端请求 LLM 补全, 会产生提示注入和数据外泄的攻击面。移除它可降低此风险。
  • Roots 向服务器暴露客户端文件系统信息。移除它可降低服务器利用 root 信息尝试目录遍历或 访问预期边界以外文件的风险。
  • Logging 的安全影响很小,但移除它可简化协议表面。

弃用不会引入新的安全问题。

参考实现

无需参考实现。本 SEP 只将现有功能标记为已弃用,不引入新的协议行为。