Client-side support for the tasks extension (io.modelcontextprotocol/tasks, SEP-2663)

这个报错通常出现在把 MCP Python SDK v2 当作客户端,去调用启用了 SEP-2663 任务扩展( io.modelcontextprotocol/tasks )的服务端时:服务端在 tools/call 返回 resultType: "task" ,而当前 SDK 客户端没有内置对该

快速结论:这个报错通常出现在把 MCP Python SDK v2 当作客户端,去调用启用了 SEP-2663 任务扩展(io.modelcontextprotocol/tasks)的服务端时:服务端在 tools/call 返回 resultType: "task",而当前 SDK 客户端没有内置对该结果类型的 claim,于是结果校验失败。优先排查你使用的 SDK 版本是否已包含客户端 tasks 扩展支持,以及调用方是否被迫手写 ResultClaim。

适用环境:Issue 仅确认涉及 MCP Python SDK(v2)、SEP-2663 / io.modelcontextprotocol/tasks 扩展、spec-2026-07-28 服务端,以及 mcp_types / MCPModel 相关线协议模型。Issue 未提供操作系统、Python、CUDA、显卡或具体依赖版本信息。

最快修复方案:暂无确认的一步修复方案。该 Issue 被维护者以“与 #2806 重复”为由关闭,并指向 #2806 统一跟踪;Issue 讨论中提出的实现方案(引入 mcp/client/extensions/tasks.py、advertise tasks capability、claim resultType: "task"、通过 tasks/get 轮询等)尚属提案,未在本 Issue 内验证合并。

注意事项:Issue 中提到的 ~120 行实现与测试是提交者自述的工作实现,并非已合并代码;API 设计(透明轮询 vs 暴露原始 task handle、input_required 是否复用 elicitation 回调)仍存在未决讨论。不要据此在生产环境假定行为或接口已固定,应以 #2806 的最终结论为准。

问题场景

用户在 MCP Python SDK v2 中作为客户端调用一个符合 SEP-2663(2026-07-28 spec)的任务增强型服务端。服务端针对 tools/call 返回 resultType: "task",表示这是一个任务型结果而非直接结果。由于 SDK 客户端当时没有内置消费该扩展的能力,调用会走到结果校验并报错,除非每个调用方自己手写一个 ResultClaim 来认领该结果类型。Issue 正文同时指出 v2 已移除了旧的实验性 tasks API,改为 SEP-2663 扩展,但 SDK 没有同步提供客户端侧消费能力。

报错原文

Client-side support for the tasks extension (io.modelcontextprotocol/tasks, SEP-2663)

a `tools/call` that returns `resultType: "task"` fails result validation unless every consumer hand-writes a `ResultClaim`.

原因分析

最可能的原因是客户端缺少对 io.modelcontextprotocol/tasks 扩展的默认 claim 与能力声明:SDK 没有在请求能力中 advertise 该扩展,也没有在 tools/call 上认领 resultType: "task",因此返回的任务型结果无法通过结果验证。另一种可能原因是线协议模型基类问题——提交者指出自然基类应为 MCPModel(camelCase alias generator),而 mcp_types 当时并未重新导出该类,导致上游化时需要额外处理。以上均属 Issue 讨论中的分析,非最终定论。

环境排查

  • 确认所使用的 MCP Python SDK 版本是否为 v2,以及是否已包含客户端 tasks 扩展支持。
  • 确认服务端是否开启了 SEP-2663 / io.modelcontextprotocol/tasks 扩展,并会返回 resultType: "task"。
  • 确认调用方是否被迫手写 ResultClaim 才能消费结果。
  • 确认 mcp_types 是否已重新导出 MCPModel 作为线协议模型基类。
  • 关注 #2806 的跟踪进展,确认该能力是否已合入以及合入的版本。

解决步骤

  1. 先确认报错根因是否为“客户端未认领 tasks 扩展”,可通过检查 SDK 是否在 per-request capabilities 中 advertise io.modelcontextprotocol/tasks 判断。
  2. 如 SDK 尚未提供内置支持,可优先尝试在调用侧通过 ClientExtension.claims() 自行认领 resultType: "task",并按 tasks/get 轮询处理,作为临时绕行方案(Issue 正文明确提到扩展面 ClientExtension.claims() 可以干净地支持这一点)。
  3. 轮询时需遵守服务端返回的 pollIntervalMs,并处理任务执行中途该值发生变更的情况。
  4. 对应任务状态:failed 应映射为携带服务端 JSON-RPC 错误的异常,cancelled 应映射为另一种明确区分的错误。
  5. 在调用方 scope 被取消时,按规范的协作式取消模型发送尽力而为的 tasks/cancel(shielded)。
  6. 对 tasks/* 请求,通过 name_param 将 Mcp-Name 设为 taskId,以满足 SEP-2663 的路由头要求。
  7. 跟踪 #2806,等待维护者确定最终 API 形态(透明轮询默认值、是否暴露原始 task handle、input_required 是否复用 elicitation 回调)后再决定是否升级到内置实现。

验证方法

在符合 SEP-2663 的服务端(server-directed task creation)上发起一次会返回 resultType: "task" 的 tools/call:若客户端能够 advertise tasks capability、正确认领并解析任务、按 pollIntervalMs 轮询 tasks/get、正确映射 completed / failed / cancelled 三种状态,并在取消场景下尽力发送 tasks/cancel,则说明该问题已被覆盖。Issue 本身未提供合并后的验证记录,最终验证请以 #2806 的结论为准。

参考来源

modelcontextprotocol/python-sdk #3226

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 26893

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注