SEP-2577:弃用 Roots、Sampling 和 Logging
社区译文;来源: MCP 29affa6b
| 字段 | 值 |
|---|---|
| SEP | 2577 |
| 标题 | 弃用 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请求, 会增加所有客户端和服务器的实现面。
规范
变更概览
- 在 schema 中使用
@deprecated注解标记弃用特性 - 在特性文档页面添加弃用提示
- 弃用期间不改变线级协议
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 数组的结果 |
ListRootsResultResponse | JSON-RPC 响应包装器 |
RootsListChangedNotification | roots 发生变化时的客户端通知 |
已弃用类型:Sampling
| 类型 | 说明 |
|---|---|
CreateMessageRequestParams | sampling/createMessage 的参数 |
CreateMessageRequest | 服务器到客户端的 sampling 请求 |
CreateMessageResult | sampling 请求的结果 |
CreateMessageResultResponse | JSON-RPC 响应包装器 |
SamplingMessage | sampling 对话中的消息 |
SamplingMessageContentBlock | sampling 消息的内容块联合类型 |
ToolChoice | 控制 sampling 期间的模型工具选择 |
ToolUseContent | sampling 消息中的工具使用内容块 |
ToolResultContent | sampling 消息中的工具结果内容块 |
ModelPreferences | 服务器的模型选择偏好 |
ModelHint | 模型选择提示 |
已弃用类型:Logging
| 类型 | 说明 |
|---|---|
LoggingLevel | Syslog 严重级别枚举 |
SetLevelRequestParams | logging/setLevel 的参数 |
SetLevelRequest | 用于设置级别的客户端到服务器请求 |
SetLevelResultResponse | JSON-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 只将现有功能标记为已弃用,不引入新的协议行为。