2 秒一次轮询、10 分钟任务 300 次请求:MCP Tasks 到货,聚合网关的计费口径要先改
10 月 23 日:长任务第一次有了句柄
Anthropic 开发者账号 10 月 23 日公布,Claude 开始支持 MCP 的 Tasks 与 Elicitations 两项能力,先在 Claude Code CLI 公开测试,要求 v2.1.304 及以上版本(该版本 10 月 19 日发布),官方口径是随后推向更多 Claude 产品。Tasks 并非临时发明,它在 2026-07-28 的 MCP 版本里就以扩展形式存在,命名空间为 io.modelcontextprotocol/tasks。
机制:用一个 taskId 换掉一条长连接
旧模型下,一次工具调用会占住对话,直到插件返回结果才算完。Claude Code 虽然会把跑过 2 分钟的调用挪到后台,但会话一关,后台调用也一起消失。Tasks 把责任交给服务端:服务端接下长任务后立刻返回一个 taskId,客户端按 pollIntervalMs 去 tasks/get 查进度。Claude Code 默认每 2000 毫秒查一次,并把服务端给的间隔夹在 250 到 30000 毫秒之间;一个任务至少带 taskId、status、createdAt、lastUpdatedAt 和 ttlMs 五个字段,其中 taskId 最长 128 个可打印 ASCII 字符。状态机分五档:working、input_required、completed、failed、cancelled。远端服务端的任务在你退出后继续跑,重开同一个会话可以接回来。
第一笔账:轮询请求到底算不算调用
按默认 2 秒一次测算,一个跑 10 分钟的任务,客户端要发约 300 次 tasks/get(600 秒除以 2 秒)。对直接调官方 API 的开发者,这只是网络开销;但对走聚合网关的用户,这 300 次请求要么进账单、要么进 RPM 配额。价目表必须写明两件事:tasks/get 是否单独计费,以及它是否消耗限流额度。写得含糊的供应商,第一个长任务客户出现时就会吵起来。
第二笔账:failed 与 cancelled 不该收钱
五档状态里有两档不给结果。计费若挂在发起调用而不是终态,客户就要为 failed 和 cancelled 买单。把计费绑定在 completed 上、并在文档里写死退费规则,是这类异步协议上线时最省事的做法,它省掉了后面无数张工单。
第三笔账:没有人可问的时候,任务会被取消
Elicitations 是服务端在任务中途向人提问:一个终端表单,或者一个要跳浏览器的登录链接,用途从确认退款到选择部署环境都算。两者相交的地方在于,一个正在跑的任务可以切到 input_required 停下来等人批。但在非交互运行里没有人可问,Claude Code 会直接要求服务端取消这个任务。结论很直接:跑在 cron、CI、批处理里的 Agent,必须预置 Elicitation hook 自动作答,否则长任务跑到一半白跑。反过来,交互场景里把付款、退款、部署这类动作做成协议级确认,对合规是净收益,只是网关要额外记两栏——谁批的、批了什么。
给聚合平台与自建中台的判断
Tasks 本身是好事:它把长任务从不可靠的阻塞调用,变成可轮询、可取消、可恢复的对象,重连后按 taskId 续查,不用重复执行。代价是复杂度从协议层挪到了轮询和超时管理上。按这次公开的规范,聚合方至少要补三条:一,tasks/get 的计价与限流口径;二,终态计费与退费条款;三,长任务的 TTL 与跨连接可查承诺,taskId 必须跨连接可应答,否则一次断线就是一次重复执行加一份双份账单。三条不补,客户最先感知到的成本不是 token 费,而是每个任务 300 次空轮询和一次断线重跑。
来源:Anthropic ClaudeDevs 公告、Claude Code v2.1.304 文档、Upstash 与 CellCog 技术解析(2026-10-23 至 10-24)。