已弃用的功能
2026-07-28 规范让五项内容退役。SDK 仍然实现了其中每一项,而且每一项现在都带有弃用警告。
下表列出了每一项已弃用的功能、它为什么要退场,以及应该改用的替代方案。
弃用了什么
| 已弃用 | 原因 | 替代做法 |
|---|---|---|
根目录(roots):ctx.session.list_roots()、client.send_roots_list_changed()、传给 Client(...) 的 list_roots_callback= |
SEP-2577 弃用了这一能力。 | 把路径作为普通的工具参数或资源 URI 传入,或者在 InputRequiredResult 中嵌入一个 ListRootsRequest(见 多轮往返(multi-round-trip)请求)。 |
服务器发起的采样(sampling):ctx.session.create_message()、传给 Client(...) 的 sampling_callback= |
SEP-2577 弃用了这一能力。 | 返回 InputRequiredResult,让客户端重试该调用(见 多轮往返请求)。 |
协议日志:ctx.log()、ctx.debug()、ctx.info()、ctx.warning()、ctx.error()、ctx.session.send_log_message()、client.set_logging_level() |
SEP-2577 弃用了这一能力。协议内没有任何替代。 | 用普通的 import logging 输出到 stderr(见 日志)。 |
ping:client.send_ping() |
从协议中移除,而不仅仅是弃用。2026-07-28 中没有 ping 方法。 |
无。它只在 mode="legacy" 连接上有效。 |
客户端->服务器进度:client.send_progress_notification() |
2026-07-28 规定进度只能由服务器发往客户端。 | 没有什么可发送的。你的服务器用 ctx.report_progress() 报告进度(见 进度)。 |
从这张表可以看出三点:
- 根目录、采样和日志是一起的。一份提案 SEP-2577 一次性弃用了这三项能力。
- 采样和根目录有一个更深层的共同问题:它们都是服务器向客户端发送请求的地方。2026-07-28 用 多轮往返请求 取代的正是这整个方向。消失的是独立的 RPC 方法(
sampling/createMessage、roots/list和推送式的elicitation/create);CreateMessageRequest/ListRootsRequest/ElicitRequest这些载荷类型保留了下来,嵌入在InputRequiredResult.input_requests中,在客户端它们触发的还是同样的回调。 ping是个例外。协议不是弃用它,而是移除它。SDK 的方法仍会发出警告(消息里写的是“removed”,而不是“deprecated”),在现代连接上调用它会得到“Method not found”的回应。
弃用只是建议性的
今天什么都不会坏。
上面的每个方法在任何协商为 2025-11-25 或更早版本的会话上都能继续工作。在客户端固定 mode="legacy",得到的就是 2026 之前的行为,分毫不差。线路上没有任何变化,能力协商也没有变。
变化在于,每个方法第一次运行时你会看到一条醒目的警告:
MCPDeprecationWarning: The logging capability is deprecated as of 2026-07-28 (SEP-2577).
MCPDeprecationWarning 继承自 UserWarning,而不是 DeprecationWarning。这是有意为之:Python 的默认过滤器只在直接作为 __main__ 运行的代码中显示 DeprecationWarning,库就是这样弃用东西、然后两年都没人注意到的。这个警告到处都会显示,不需要 -W 标志。
Warning
“建议性”止于线路。采样和根目录是服务器发往客户端的请求,而 2026-07-28 会话没有承载这类请求的通道。在现代连接上的工具里调用 ctx.session.create_message(),警告照样触发,然后发送失败并报错:
Cannot send 'sampling/createMessage': this transport context has no back-channel
for server-initiated requests.
两个信号,按这个顺序。MCPDeprecationWarning 在你调用方法的那一刻触发,任何连接上都是如此。错误是 SDK 随后尝试发送时返回的结果。这两个功能只有在 mode="legacy" 连接上、且客户端注册了对应回调时,才能端到端地工作。
屏蔽警告
新代码里不要这样做。
但如果你维护的服务器确实在为 2026 之前的客户端提供服务,它完全有理由要一份安静的日志。在第一个已弃用调用运行之前过滤掉这个类别:
import warnings
from mcp import MCPDeprecationWarning
warnings.filterwarnings("ignore", category=MCPDeprecationWarning)
整个 API 就这些。没有按方法的开关,你也不需要:只用一个类别的意义就在于,一行代码让它静音,一行代码把它恢复。
Check
反过来用这个过滤器,就白得一个回归测试。在 pytest 配置的 filterwarnings 设置里加上 "error::mcp.MCPDeprecationWarning",已弃用的调用就会抛出异常而不是发出警告。一个名为 old_log、仍在调用 ctx.info() 的工具不再通过,转而报告:
Error executing tool old_log: The logging capability is deprecated as of 2026-07-28 (SEP-2577).
一行 pytest 配置,已弃用的调用就再也不可能悄悄溜回你的代码库而不让测试失败。
回顾
- 2026-07-28 规范弃用了根目录、服务器发起的采样和协议日志(都出自 SEP-2577),把进度限制为只能由服务器发往客户端,并移除了
ping。 - 替代做法那一列为你指明了去处:采样和根目录看 多轮往返请求,日志看 日志,进度看 进度。
ping什么都不需要。 - 弃用只是建议性的:线路上没有变化,在 2026 之前的会话上一切照常工作,你会看到一条醒目的
MCPDeprecationWarning(它是UserWarning,所以默认开启)。 - 采样和根目录还需要一条反向通道(back-channel),而 2026-07-28 会话没有。在现代连接上,它们先警告,然后抛出异常。
warnings.filterwarnings("ignore", category=MCPDeprecationWarning)让整个类别静音;pytest 中的"error::mcp.MCPDeprecationWarning"把它变成测试失败。- 新代码不应建立在其中任何一项之上。
本文档的其他每一页讲的都是当前的 API。