modelcontextprotocol/ext-tasks
MCP Tasks 的完整规范和文档。
为什么不直接阻塞?
你可以一直保持连接,直到工作完成。但 Tasks 解决的是阻塞无法解决的问题:- 不需要长期连接。 阻塞会在整个操作期间占用连接。许多客户端和传输中间层都有超时限制,使得超过几秒的阻塞并不现实。
- 崩溃恢复能力。 Task ID 是持久句柄。如果客户端断开连接或重启,可以使用同一个 ID 继续轮询。
- 进度可见性。 Tasks 携带状态元数据(
working、input_required、completed、failed、cancelled)和可选状态消息,让客户端可以看到进度。 - 执行中交互。 当 task 需要输入时(例如用于用户确认的引出),它会进入
input_required并暴露请求。客户端通过tasks/update响应,不需要第二条连接,也不需要未经请求的服务器到客户端消息。 - 由服务器决定。 服务器按请求决定是否创建 task。客户端只需通过扩展能力显式选择启用一次,然后处理返回的任意结果形态。不需要按工具预热,也不需要按请求设置标志。
Tasks 如何工作
Tasks 扩展了标准请求流程。当服务器判断某个请求会长时间运行时,它会返回 task handle,而不是最终结果。客户端会轮询直到完成。-
能力协商。 客户端在每个请求的能力中包含
io.modelcontextprotocol/tasks。服务器在自己的server/discover能力中声明同一扩展。 -
Task 创建。 响应受支持的请求时,服务器返回
CreateTaskResult(通过resultType: "task"标识),其中包含taskId、初始状态、TTL 和建议轮询间隔。Task 会在响应发送前被持久创建。 -
轮询。 客户端使用
taskId调用tasks/get。响应携带当前状态;对于终止状态,还会携带最终结果或错误。 -
执行中输入。 如果 task 进入
input_required,tasks/get响应会包含一个inputRequestsmap,其中带有引出或其他服务器请求。客户端通过tasks/update完成这些请求。 -
完成。 当状态到达
completed时,result字段包含原始请求同步返回时应有的内容。如果状态为failed,error字段包含 JSON-RPC 错误。 -
取消。 客户端可以随时发送
tasks/cancel。取消是协作式的,服务器会确认取消意图,但没有义务停止工作。
何时使用 Tasks
当使用场景涉及以下情况时,Tasks 很适合: 长时间运行操作。 需要数分钟或数小时的 CI 流水线、批量数据处理或模型训练任务。 人在环工作流。 审批关卡、评审步骤,或任何会暂停等待用户确认的操作。Task 会进入input_required,客户端展示该请求。
外部任务系统。 如果服务器包装的 API 已经使用 job IDs(云部署、异步 API、排队工作),可以在创建 job 时返回 task,并在 job 完成时解析它。
不可靠连接。 移动客户端、间歇性网络,或连接容易断开的环境。Task IDs 可以跨断线保留。
批处理。 处理大量项目(批量导入、大量更新)且部分进度有意义的操作。状态消息可以报告进度。
Task 生命周期
completed、failed 和 cancelled 是终止状态,一旦达到,task 状态不会再变化。
通知
服务器可以通过notifications/tasks 推送状态更新。客户端通过 subscriptions/listen 机制显式选择启用。每条通知都携带完整 task 状态,因此不需要额外一次 tasks/get 往返。
轮询是默认方式。如果服务器支持通知,客户端可以依赖通知而不是轮询。
实现指南
面向 MCP 客户端
要消费带 task 的响应,你的客户端必须:1
声明支持
在每个请求的能力中包含该扩展:
2
处理多态结果
发出受支持请求(例如
tools/call)时,要准备好接收标准结果,或接收带 resultType: "task" 的 CreateTaskResult。3
轮询完成状态
使用返回的
taskId 调用 tasks/get,并遵守 pollIntervalMs 值。持续轮询,直到 task 达到终止状态(completed、failed 或 cancelled)。4
处理输入请求
如果 task 状态为
input_required,读取 inputRequests map,将请求展示给用户或模型,并通过 tasks/update 提交响应。5
持久化 task IDs
持久保存 task IDs,以便客户端崩溃或重启后可以继续轮询。
面向 MCP 服务器
要从服务器返回 tasks:1
声明能力支持
在
server/discover 能力中包含该扩展:2
检查客户端能力
返回
CreateTaskResult 前,确认客户端已在每个请求的能力中包含该扩展。不要向未声明支持的客户端返回 task。3
返回 CreateTaskResult
当某个请求会长时间运行时,返回
resultType: "task",以及包含唯一 taskId、初始状态、ttlMs 和 pollIntervalMs 的 Task 对象。Task 必须在发送响应前被持久创建。4
提供 tasks/get
每次轮询时返回当前 task 状态。对于终止状态,包含
result(completed 时)或 error(failed 时)字段。5
处理 tasks/update
接收以未完成
inputRequests 为 key 的 inputResponses。用空结果确认。忽略未知 key 或已满足 key 的响应。6
处理 tasks/cancel
用空结果确认取消请求。尽可能执行取消,但取消是协作式的,task 仍可能达到非
cancelled 的终止状态。客户端支持
MCP Tasks 是核心 MCP 规范的扩展。不同客户端的主机支持情况不同。
规范
Tasks 扩展在 experimental-ext-tasks 仓库 中定义。它使用标准 MCP 扩展协商机制:客户端和服务器会在初始化期间,在各自能力的extensions 字段中声明支持。