Claude Code MCP Tasks 上手:长任务回 taskId

Claude Code 从 CLI v2.1.304 起把 MCP Tasks 放进公测:MCP 服务器可以用 resultType: "task" 接手构建、导出这类长活,工具调用先回任务 ID,会话继续干别的,页脚出现「1 MCP task」,结果到了再交给模型。今天快讯《Claude Code 公测 MCP Tasks》说过它是什么,这篇在本机(Claude Code 2.1.309)写了一个最小服务器,把握手、tasks/get 轮询和 elicitation 形状跑通,并记下哪些步骤还碰不到云端开关。
站内已有 MCP 入门配置、40 行写 MCP 服务器、Skill 和 MCP 怎么分工、Claude Code hooks 护栏。这篇不重复配 filesystem,只盯 Tasks 这一条新能力线。
前置条件
- Claude Code CLI ≥ 2.1.304。本文环境:Debian、Linux 6.12 x86_64、Claude Code 2.1.309(路径
/home/box/.local/bin/claude),测试日期北京时间 2026-10-25。 - Python 3.13。我们用虚拟环境装了官方
mcp==2.3.0包做对照,但演示服务器本身是纯 stdio JSON-RPC,不依赖 SDK 里尚未对齐的 Tasks API。 - 完整「会话页脚出现 MCP task、
/tasks能停」需要:能拉 feature flag 的 Anthropic 登录、服务器实际协商到协议修订 2026-07-28、调用发生在主对话而不是 subagent。本机claude auth status显示未登录,因此真·Tasks UI 未实测;下文测的是服务器侧字段与连接健康检查。
先分清:Tasks 不是「超时丢后台」
官方 MCP 文档同一页写了两套不堵会话的机制,名字接近,行为差很多:
| 机制 | 工作在哪一侧 | 退出 CLI 之后 | 怎么触发 |
|---|---|---|---|
| 自动后台(auto-background) | 仍是这一次工具调用,只是挪到后台任务视图 | 一般不保留;文档写明不跨退出 | 主对话里工具跑过约 2 分钟;可用环境变量 CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS 改阈值,设 0 关闭 |
| MCP Tasks(公测) | MCP 服务器自己调度的长任务 | 远程 HTTP 服务器上的任务可继续;stdio 本地进程退出通常停 | 服务器对 tools/call 回 resultType: "task",且会话满足协议版本 / feature flag / 表面条件 |
远程 MCP task 可以跨退出接着跟;stdio 任务跟进程同生共死——文档建议退出前先在
/tasks收尾。
公测表面(文档原文):终端 CLI、Agent SDK、GitHub Actions。VS Code 扩展和桌面端还没有。任务中途可以弹 elicitation 问用户;非交互会话(含 claude -p)遇到提问会直接取消任务,也不会跑你的 Elicitation hook。
MCP task 的进度来自服务器的 tasks/get,页脚会显示类似「1 MCP task」的计数。结果进模型上下文,transcript 里通常只有一句完成提示——文档写结果要去问 Claude。
第 1 步:最小服务器,按文档回 task
Claude Code 文档「MCP tasks for server authors」给出的首包形状如下(字段名以官方为准;缺 taskId / status / 时间戳 / ttlMs 会变成工具错误):
{
"resultType": "task",
"taskId": "build-7f3a9c2e",
"status": "working",
"statusMessage": "Compiling, 40 of 212 files done",
"createdAt": "2026-10-22T14:03:07Z",
"lastUpdatedAt": "2026-10-22T14:03:07Z",
"ttlMs": null,
"pollIntervalMs": 5000
}
客户端随后反复发 tasks/get。完成时应答里带 resultType: "complete",并把普通工具结果放进 result.content。只有当请求 _meta["io.modelcontextprotocol/clientCapabilities"].extensions 里出现 io.modelcontextprotocol/tasks 时,才应该回 task——否则 Claude 会报 Unsupported result type 'task' for tools/call。
我们在 /workspace/proj-test/mcp-tasks/ 放了 task_server.py 和驱动脚本 test_handshake.py。两个工具:
start_long_build:在客户端声明了 tasks 扩展时回 task;可选ask_confirm走input_required+ elicitation。slow_sleep:普通阻塞睡眠,方便以后对照CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS(本机未开长超时实测)。

2026-10-25 实测:taskId build-17387a7a,端到端约 2.10 秒,第 8 次 tasks/get 看到 completed,结果文本为 demo build finished after ~2.0s。elicitation 路径:先 input_required 且 inputRequests.confirm 指向 elicitation/create,用 tasks/update 回 action: accept 后继续跑到 completed。
第 2 步:挂进 Claude Code,先拿 Connected
cd /workspace/proj-test/mcp-tasks
python3 -m venv .venv && .venv/bin/pip install mcp==2.3.0 # 可选
claude mcp add --transport stdio --scope project demo-tasks -- \
.venv/bin/python task_server.py
# 项目级 .mcp.json 需要批准:交互里点允许,或在 ~/.claude.json
# 对应 project 写入 enabledMcpjsonServers: ["demo-tasks"] 并信任工作区
claude mcp list
claude mcp get demo-tasks

抓到的健康检查 JSON-RPC 顺序是:
- 先发
server/discover,_meta里带着协议 2026-07-28 和 clientInfoclaude-code 2.1.309。 - 若服务器不懂 discover,再发
initialize,此时protocolVersion经常是 2025-11-25。 - 然后
notifications/initialized→tools/list。
第一版服务器只回 2026-07-28,claude mcp list 报错:Server's protocol version is not supported: 2026-07-28。改成按客户端声明的已知版本协商之后才 Connected。文档要求真正的 MCP task 连接谈成 2026-07-28。list 显示 Connected,只说明工具能列出来,不代表 Tasks 路径已经打开。
第 3 步:环境变量与你暂时看不到的 UI
2.1.309 二进制里能搜到 CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS、CLAUDE_CODE_DISABLE_MCP_TASK_BACKGROUND 等字符串。常见写法是放进用户 settings 的 env:
{
"env": {
"CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS": "120000"
}
}
设为 0:关掉自动后台,交互会话里 Claude 会一直等到 MCP 调用结束。设 CLAUDE_CODE_DISABLE_MCP_TASK_BACKGROUND=1:文档说 Claude 会等 task 结果;若自动后台仍开启,短任务可能先按普通后台逻辑挪走,长任务则不挡你。
取消任务:在 /tasks 里选中按 x,或让 Claude 去停。文档强调——发出取消不等于服务器立刻停,可能已经做完一部分。按 Esc 不会停后台 MCP task。
未实测(写明原因):
- 未登录 Anthropic,拉不到 feature flag,无法在真实会话里看到页脚「1 MCP task」和
/tasks详情。 - 未把 demo 工具接到一次需要付费/订阅额度的主对话里验证「调用是否升级成 task」。
- 未测 VS Code / 桌面端(文档写明未覆盖)。
- 未测远程 HTTP 服务器上「退出后任务仍在跑、再
--resume接上」的路径。
常见坑(本机踩到的优先)
- 硬回 task:客户端没带 tasks 扩展时回
resultType: "task",会拿到 unsupported。我们的服务器在这种情况下改回同步content文本。 - 协议只认一个版本:健康检查的 initialize 可能是 2025-11-25。服务器要协商,不要只接受 2026-07-28。
- stdio 任务不保活:退出 Claude Code 会结束本地进程。长任务用远程 HTTP,或退出前在
/tasks停掉。 - 两套「Tasks」文档:modelcontextprotocol.io 的 2025-11-25 Tasks 章节是另一套偏
params.task/tasks/result的实验设计;Claude Code 公测用的是resultType+ttlMs+tasks/get。写给 Claude Code 的服务器以 code.claude.com/docs 为准,规范页只作对照。 - 表面和开关:Bedrock / 关掉遥测 / 明确关掉 flag 拉取的会话,文档写不会变成 MCP task。subagent 里的调用也不会。
完成标准
claude --version≥ 2.1.304;本机服务器在claude mcp list为 Connected。- 自测脚本能打印
resultType: "task",并轮询到completed(本文约 2.1 秒)。 - 能向同事说清:哪些已在无账号环境验证,哪些必须登录且走 2026-07-28 / flag 才能看到。
最后
给 Claude Code 写长耗时 MCP 工具时,先按官方字段表把 task 与 elicitation 做进服务器,用本文握手脚本在无账号环境把形状跑通;登录 Anthropic 后,再进交互会话确认 /tasks 里是否出现真实任务。若要看运行时层如何挂起 Agent,可读同日扩写的 AWS Infinity。