Claude 发起一次工具调用——网页搜索、代码执行、MCP connector、自定义函数——spinner 就这么一直转。五分钟过去还是 pending,没报错、没超时,就这么挂着。刷新页面常常回到同样的挂起状态。
先试最快的: 在 claude.ai 或 Claude Desktop 上,点开那个折叠的 “Used [工具] integration” 面板——这是一个已知的 Desktop 渲染 bug(约 2026-01-30 起出现):调用其实在服务端几毫秒就完成了,但 UI 在你点开那个面板之前不会刷新。点开没反应,就 刷新对话(约能清掉三成挂起),再看 status.anthropic.com。如果卡的是网页搜索,那多半根本没卡——它返回了 pause_turn 在等你继续(见下面原因 3)。剩下的根因就是 tool_result 没回或格式不对、MCP 断连、或工具跑太久撞了超时。先判断属于哪一类,再对症下药。
你是在哪个环境上?
修复路径完全取决于调用卡在哪儿。先确认你的环境。
| 运行环境 | ”pending” 长什么样 | 最可能的原因 |
|---|---|---|
| claude.ai / Claude Desktop,内置工具 | 网页搜索 / 代码 spinner 一直不出结果 | pause_turn 没被继续、单次超时、或状态页有事故 |
| claude.ai / Claude Desktop,MCP connector | ”Used [server] integration” 一直转 | Desktop 渲染 bug、断连、或协议版本不匹配 |
| Claude Code(CLI) | spinner 卡住,Ctrl+C 和 Esc 都没反应 | MCP bridge 卡死,客户端这边没有超时 |
| 你自己的 API 集成 | 请求挂在你的客户端里,不在 Claude UI | tool_result 缺失/格式不对,或 max_tokens 截断了 tool_use |
常见原因
按命中率从高到低。
1. Claude Desktop 要点开面板才渲染结果
这是 2026 年中最常见的”假卡死”。MCP server 几毫秒就把调用做完并返回了合法结果,但 Claude Desktop 在你手动点开折叠的 “Used [server] integration” 面板 之前不会刷新对话。日志显示 server 大约 75ms 就回了,而 UI 干等了 20 多秒。
怎么判断:点开助手消息下面那个工具面板。结果立刻出现、对话继续,那就是它——根本不是真卡。
2. Tool server 压根没回
对自定义 API 集成和 MCP server 来说,Claude 在等一个 tool_result content block。Server 崩了、自身超时了、或者就是没发回响应,UI 就会一直显示 pending。
怎么判断:去 tool server 日志按时间戳找请求。完全没日志 = 请求没到。有请求但没响应 = server 中途崩了。
3. 网页搜索 / 网页抓取返回了 pause_turn,但没被继续
内置 server 工具(web search、web fetch)跑的是服务端采样循环,默认上限是 每次请求 10 轮迭代。一旦到上限,API 就返回 stop_reason: "pause_turn",带一个 server_tool_use block 但没有对应的 server_tool_result。在 API 上这很正常——你把对话继续下去就能跑完。但在一个没处理 pause_turn 的自定义 agent 循环里,这一轮看起来就像冻住了。
怎么判断:看响应。stop_reason 是 pause_turn、最后一个 block 是 server_tool_use(server 工具的 ID 用 srvtoolu_ 前缀,不是 toolu_)。那是”待继续”,不是失败。
4. Tool result 回了但格式不对
Messages API 要的是带 tool_use_id 和 content 的 tool_result block。如果你的集成回了一个纯字符串、回成了 text block、或者漏了 tool_use_id,Claude 没法把它 match 回原来的调用。在 API 上你会拿到 Tool result block missing corresponding tool use block;在 UI 上则一直 pending。
怎么判断:看你回传的原始 API 请求。block 必须长成 { "type": "tool_result", "tool_use_id": "toolu_...", "content": "..." },而且 tool_use_id 要和前面那个 tool_use block 的 id 完全一致。
5. 因为撞了 max_tokens,tool_use 不完整
如果发出工具调用的那轮助手回复在 max_tokens 处被截断,tool_use block 就会不完整(input 的 JSON 残缺或非法)。循环这边拿不到可执行的有效内容,看起来就卡住了。
怎么判断:看 stop_reason。如果是 max_tokens 而且最后一个 content block 是 tool_use,那就是被截断了。把 max_tokens 调大重试(比如从 1024 提到 4096)。
6. MCP connector 断连,或协议版本不匹配
调用中途断连,UI 就会停在”飞行中”;重连之后也续不上原来那一次。还有一种相关故障:Claude Desktop 更新之后,某个 MCP 扩展能初始化、但之后每次工具调用都超时,原因是 app 和 server 之间 MCP 协议版本不匹配。
怎么判断:打开 Settings -> Connectors,看每个 server 的状态。显示 disconnected 或 reconnecting 的多半就是它。如果 server 能连上、但刚更新完 Desktop 之后每次调用都超时,那就怀疑协议版本不匹配,去更新这个 connector。
7. Claude Code 卡在卡死的 MCP bridge 上、且没有超时
在 Claude Code(CLI)里,MCP 工具调用 客户端这边既没有超时、也没法取消。如果 bridge(比如 mcp-remote)在后端重启后重连时卡住,spinner 就一直挂,Ctrl+C 和 Esc 都中止不了。唯一的恢复办法是杀进程。
怎么判断:你在终端里、spinner 冻住、Ctrl+C / Esc 都没反应。这个组合是这个 bug 的专属特征。
8. “Claude reached its tool-use limit for this turn”
Claude 单轮回复里能调用多少次工具有上限(大约 10-20 个动作:搜索、读文件、connector 请求)。这个上限在 2026 年 3 月前后被收紧了,所以以前能连着跑 60-80 次调用的会话现在会更早停下。它显示的是一条消息、不是静默 spinner,但很容易被当成卡死。
怎么判断:找有没有这句原文 “Claude reached its tool-use limit for this turn”。有的话,直接发一句 “continue” 就能从停下的地方接着跑。
9. 浏览器标签页被切到后台、连接被挂起
Chrome 和 Safari 会挂起后台标签页的长连接。如果你正切走时这个调用还在流式传输,传输可能被掐了。
怎么判断:把标签页切回前台等 10 秒,看是否恢复。不恢复就刷新。
10. 并发多个工具调用,UI 状态被搞乱
Claude 一次并发触发多个工具调用、其中一个乱序返回,UI 有时会跟错哪些还在 pending、哪些已经完成。
怎么判断:看工具调用链。最新那个已经有结果了、更早的反而还在 pending,那就是 UI 跟踪错位——点开或刷新即可。
开始前
- 弄清楚工具是内置(网页搜索、代码执行)、MCP 接的、还是自定义 API 集成,修复路径不同。
- 自定义工具或 MCP 工具的话,把 server 日志准备好。
- 决定是直接 cancel 重试,还是等——cancel 会丢失部分进度。
需要收集的信息
- 是哪个工具被调用(名字、集成、或者内置标签)。
- 调用大致时间戳(便于日志对齐)。
- 运行环境和标签页状态:claude.ai、Desktop、还是 Claude Code;前台还是后台;浏览器;OS。
- 同一对话里别的工具调用是否正常。
- API 集成情况下,你回传的原始请求,以及那轮助手回复的
stop_reason。 - MCP 情况下,Settings 里 connector 的状态,以及是不是刚更新过 Desktop。
一步一步修复
Step 1:先点开工具面板,再刷新
先点开那个折叠的 “Used [工具] integration” 面板——在 Desktop 上光这一下就能解掉渲染 bug 导致的假卡死。没变化的话,刷新对话。约三成的真卡死刷一下就清掉了:连接重连、Claude 重读对话状态。如果服务端其实已完成,会显示结果;如果真的挂了,会重新显示为 pending 或者一条报错。
Step 2:等满超时窗口
内置工具的超时一般是 60-120 秒。定个表等到时间。最后变成报错或”无结果”也算正确结局,缩窄 prompt 范围重试就好。
Step 3:看状态页和 connector 状态
新开一个标签页打开 status.anthropic.com。如果 web search 或 code execution 在降级中,那个工具的每次调用都会挂,你做什么都没用。然后打开 Settings -> Connectors,确认没有显示 disconnected 的。
Step 4:网页搜索的话,继续 pause_turn 而不是干等
如果卡住的是自定义集成里的 web search 或 web fetch,看 stop_reason。如果是 pause_turn,那它没卡——把助手的这条响应 append 进你的 messages 数组,再发一次请求让 Claude 接着跑。循环到 stop_reason 不再是 pause_turn 为止(给循环设个上限,几次就够,避免请求失控)。在聊天 UI 里对应的做法就是发一句 “continue”。
Step 5:自定义集成,把响应格式修对
Messages API 要一个格式正确的 tool_result block 才能闭环:
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01ABC...",
"content": "结果字符串或结构化内容"
}
]
}
如果你 server 回的是纯字符串、用了 text block、或者漏了 tool_use_id,Claude 没法 match,你就会看到 Tool result block missing corresponding tool use block。tool_use_id 必须和前面那个 tool_use block 的 id 一模一样。另外看那轮助手回复的 stop_reason:如果是 max_tokens 且最后一个 block 是 tool_use,那是工具调用本身被截断了——先把 max_tokens 调大(比如 4096)重试那一轮,再去管结果。
Step 6:MCP 的话,重连(并检查协议版本)
某个 connector 显示 disconnected:Settings -> Connectors -> 点它 -> Reconnect。然后在新一轮提问里重试这个 prompt,不是在挂掉的那轮——重连不会让卡死的那次调用回头完成。如果 connector 能重连、但刚更新完 Claude Desktop 之后每次调用都超时,那就更新这个 connector/扩展,清掉 MCP 协议版本不匹配。
Step 7:Claude Code 里,杀掉卡死的 bridge
如果是 CLI 里 spinner 冻住、Ctrl+C / Esc 都没反应,从另一个终端强杀,然后重连再重试:
pkill -f "claude"
pkill -f "mcp-remote"
claude
/mcp
跑 /mcp 会在你下一次工具调用之前先把 connector 重新建好,省得又卡在同一个过期会话上。
Step 8:取消、缩窄范围重试
点开、刷新、继续、重连都没用,那就 cancel 挂起的调用,缩小作用范围重试:
停掉当前工具调用。再试一次,但不要搜整个仓库,
只搜 apps/web/src/billing/ 目录。
范围小了,通常就能在超时之内完成。
Step 9:长耗时工具改成异步轮询
工具单次跑超过 60 秒(大数据任务、慢 API)的,重新设计成:先返回 job ID,让 Claude 轮询:
1. 调用 A:起任务,返回 { "job_id": "abc123" }
2. 调用 B:按 job_id 查状态,返回 done 或 pending
这样根本不会撞到 UI 超时。
怎么验证修好了
- 在一个新对话里再发同一条 prompt,能很快完成就说明修好了。
- 自定义集成,发一条带匹配
tool_use_id的tool_result,Claude 能接受即对(不再报missing corresponding tool use block)。 - MCP 跑一次最简单的调用(列文件、查用户),能很快回结果即对。Desktop 上确认结果不用手动点开面板就能渲染出来。
- 网页搜索,确认
stop_reason最终是end_turn而不是pause_turn。 - 重试时标签页保持前台,排除浏览器挂起的干扰。
长期预防
- 自定义 tool server 自身超时设得比 Claude UI 超时短(目标 45 秒以内),任何情况都要在窗口内返回结果或报错。
- 任何用到 server 工具的 agent 循环都要处理
pause_turn:把助手响应 append 进messages再发一次请求。 - 处理每条响应之前先看
stop_reason,把max_tokens截断和pause_turn都接住,别当成卡死。 - MCP server 加 health check 和瞬时故障自动重连,每次 Claude Desktop 更新后都重测 connector,防协议漂移。
- 内置工具的 prompt 范围要收紧:「搜最近关于 X 的帖子」好过「把网上关于 X 的所有内容全部找出来」。
- 把期望的
tool_result形态写进 tool server 的 README,以后新集成不至于回退。
容易踩的坑
- 一连刷新 5 次,一次就够,Desktop 上点开面板往往比刷新还快。
- 把
pause_turn的网页搜索当成失败、从头重试,而不是继续。 - 把工具结果当纯文本返回、不是
tool_resultblock——自定义集成里很容易漏。 - 忘了
tool_use_id是 per-call 不是 per-tool,每次调用 ID 都新生成,而且 server 工具用srvtoolu_、客户端工具用toolu_。 - 让自定义工具一跑跑 5 分钟不返回任何东西,Claude UI 不会等到。
- 把 MCP 显示 “connected” 当成 server 健康——做一次真实调用才算数。
常见问答
- Claude Desktop 上最快怎么解? 点开 “Used [工具] integration” 面板。一个约 2026-01-30 起就有的渲染 bug 会让调用在服务端跑完、却不刷新 UI,直到你点开那个面板。
- 我的网页搜索一直转——是卡了吗? 多半没有。server 工具在服务端循环撞到 10 轮迭代上限时会返回
pause_turn。把对话继续下去(或发 “continue”)就能接着跑,别从头来。 - Claude 工具调用超时是多久? 内置工具大约 60-120 秒。自定义集成看你 server,API 本身没硬上限,但 claude.ai UI 有。Claude Code 客户端这边没有超时,所以 MCP bridge 卡死时会一直挂、连 Ctrl+C 都没用。
- 为什么 API 报 “Tool result block missing corresponding tool use block”? 你的
tool_result带的tool_use_id在上一条助手消息里找不到对应的tool_use,或者tool_result的格式不对。把id对齐一致即可。 - 能不能 cancel 一个 pending 的调用? 网页 UI 里点 spinner 上的停止按钮,或者刷新。Claude Code 里 Ctrl+C 和 Esc 中止不了卡死的 MCP 调用——用
pkill -f "claude"和pkill -f "mcp-remote"杀进程,再跑/mcp。 - 是 Claude bug 吗? 有时是——Desktop 渲染 bug 和 Claude Code 没超时这两个是真实、已跟踪的 bug。但更常见是下游工具没正确响应,或者一个
pause_turn没被继续。