Claude Tool Call Stuck on Pending: Fixes

The tool-call spinner keeps spinning — no result, no timeout, no error. Usually a missing tool_result, a pause_turn from web search, the Claude Desktop render bug, or a dropped MCP connector. Diagnose by surface and unstick.

Claude starts a tool call — web search, code execution, an MCP connector, or a custom function — and the spinner just keeps spinning. Five minutes later it is still “pending.” No error, no timeout, just a hung state. Refreshing often returns to the same hang.

Fastest fix first: on claude.ai or Claude Desktop, click to expand the collapsed “Used [tool] integration” panel — a known Desktop render bug (since ~Jan 30 2026) finishes the call server-side in milliseconds but does not repaint the UI until you open that panel. If expanding does nothing, refresh the conversation (clears ~30% of hangs), then check status.anthropic.com. For web search specifically, the call usually is not stuck at all — it returned pause_turn and is waiting to be resumed (see cause 3 below). The remaining causes are a missing or malformed tool_result, a dropped MCP connection, or a long-running tool that blew past the timeout. Find your bucket, then apply the matching fix.

Which surface are you on?

The fix lane depends entirely on where the call hangs. Identify yours first.

SurfaceWhat “pending” looks likeMost likely cause
claude.ai / Claude Desktop, built-in toolsWeb search / code spinner never resolvespause_turn not resumed, per-call timeout, or status incident
claude.ai / Claude Desktop, MCP connector”Used [server] integration” stays spinningDesktop render bug, dropped connection, or protocol-version mismatch
Claude Code (CLI)Spinner hangs, Ctrl+C and Esc do nothingMCP bridge stalled with no client-side timeout
Your own API integrationRequest hangs in your client, not in Claude UIMissing / malformed tool_result, or incomplete tool_use from max_tokens

Common causes

Ordered by hit rate, highest first.

1. Claude Desktop renders the result only after you expand the panel

This is the single most common “false hang” as of mid-2026. The MCP server completes the call in milliseconds and returns a valid result, but Claude Desktop does not repaint the conversation until you manually click the collapsed “Used [server] integration” panel. Logs show the server replying in roughly 75ms while the UI sits for 20+ seconds.

How to judge: Click or expand the tool panel under the assistant message. If the result appears instantly and the conversation continues, this was it — not a real hang.

2. Tool server never returned a result

For custom API integrations and MCP servers, Claude waits for a tool_result content block. If the server crashed, exceeded its own timeout, or never sent the response, the UI shows the call as pending indefinitely.

How to judge: Check the tool-server logs for a request matching the timestamp. No log entry at all = the request never landed. Log entry but no response = the server crashed mid-call.

3. Web search / web fetch returned pause_turn and was not resumed

Built-in server tools (web search, web fetch) run a server-side sampling loop with a default limit of 10 iterations per request. When that limit is reached, the API returns stop_reason: "pause_turn" with a server_tool_use block but no matching server_tool_result. On the API this is normal — you continue the conversation to finish. In a custom agent loop that does not handle pause_turn, the turn looks frozen.

How to judge: Inspect the response. stop_reason is pause_turn and the last block is a server_tool_use (IDs use the srvtoolu_ prefix, not toolu_). That is a resume, not a failure.

4. Tool result returned but with the wrong shape

The Messages API expects a tool_result block carrying tool_use_id and content. If your integration returned a plain string, sent a text block instead of tool_result, or omitted tool_use_id, Claude cannot match it to the original call. On the API you get Tool result block missing corresponding tool use block; in a UI the call stays pending.

How to judge: Inspect the raw API request you send back. The block must look like { "type": "tool_result", "tool_use_id": "toolu_...", "content": "..." }, and the tool_use_id must exactly match the id from the preceding tool_use block.

5. Incomplete tool_use because the response hit max_tokens

If the assistant turn that emits the tool call gets truncated at max_tokens, the tool_use block arrives incomplete (invalid or cut-off JSON input). The loop then has nothing valid to execute and appears stuck.

How to judge: Check stop_reason. If it is max_tokens and the last content block is a tool_use, the call was truncated. Retry with a higher max_tokens (for example bump 1024 to 4096).

6. MCP connector dropped, or its protocol version mismatched

An MCP connection that drops mid-call leaves the UI in flight; reconnecting cannot resume the in-flight call. A related failure: after a Claude Desktop update, an MCP extension can initialize but then time out on every tool call because of an MCP protocol-version mismatch between the app and the server.

How to judge: Open Settings -> Connectors and read each server’s status. A badge showing disconnected or reconnecting is the likely culprit. If the server connects but every call times out right after a Desktop update, suspect a protocol-version mismatch and update the connector.

7. Claude Code hangs on a stalled MCP bridge with no timeout

In Claude Code (CLI), MCP tool calls have no client-side timeout and no cancel. If the bridge (such as mcp-remote) stalls on reconnect after a backend restart, the spinner hangs and neither Ctrl+C nor Esc aborts it. The only recovery is to kill the process.

How to judge: You are in the terminal, the spinner is frozen, and Ctrl+C / Esc do nothing. That combination is specific to this bug.

8. “Claude reached its tool-use limit for this turn”

Claude has a per-turn cap on how many tool calls it makes in one response (roughly 10-20 actions: searches, file reads, connector requests). This cap was tightened around March 2026, so sessions that previously chained 60-80 calls now stop earlier. This shows as a message, not a silent spinner, but it is easy to read as a hang.

How to judge: Look for the literal text “Claude reached its tool-use limit for this turn.” If present, simply send “continue” to pick up where it stopped.

9. Browser tab was backgrounded and the connection suspended

Chrome and Safari suspend long-lived connections in background tabs. If you switched away mid-call, the streaming response may have been killed.

How to judge: Bring the tab to the foreground, wait 10 seconds, and see if it recovers. If not, refresh.

10. Parallel tool calls confused the UI state

When Claude fires several tool calls at once and one returns out of order, the UI can mis-track which is still pending versus already finished.

How to judge: Look at the chain of calls. If the latest call shows a result but an earlier one is still pending, it is a UI tracking glitch — expand or refresh.

Before you start

  • Note whether the tool is built-in (web search, code execution), an MCP connector, or a custom API integration. The fix lane differs.
  • Have the tool-server logs ready if it is a custom or MCP tool.
  • Decide whether to cancel and retry or wait it out — cancelling loses partial progress.

Information to collect

  • Which tool was called (name, integration, or built-in label).
  • The approximate timestamp of the call, for log correlation.
  • Surface and tab state: claude.ai, Desktop, or Claude Code; foreground or background; browser; OS.
  • Whether other tool calls in the same conversation worked normally.
  • For API integrations: the raw request you send back, plus the stop_reason of the assistant turn.
  • For MCP: connector status in Settings, and whether a Desktop update just landed.

Step-by-step fix

Step 1: Expand the tool panel, then refresh

First click to expand the collapsed “Used [tool] integration” panel — on Desktop this alone resolves the render-bug hang. If nothing changes, refresh the conversation. About 30% of genuine hangs clear on refresh: the connection reconnects and Claude re-reads conversation state. If the call completed server-side it now shows its result; if it truly hung it reappears as pending or as an error.

Step 2: Wait the full timeout window

For built-in tools the timeout is typically 60-120 seconds. Set a timer and wait. If the call eventually shows an error or “no result,” that is the correct outcome — retry the prompt with a smaller scope.

Step 3: Check the status page and connector status

Open status.anthropic.com in a new tab. If web search or code execution is degraded, every call to those tools will hang regardless of what you do. Then open Settings -> Connectors and confirm none show disconnected.

Step 4: For web search, resume a pause_turn instead of waiting

If your stalled call is web search or web fetch in a custom integration, check stop_reason. If it is pause_turn, the call is not stuck — append the assistant’s response to your messages array and send another request to let Claude continue. Loop until stop_reason is no longer pause_turn (cap your loop at a handful of continuations to avoid runaway requests). In the chat UI the equivalent is to send “continue.”

Step 5: For custom integrations, fix the response shape

The Messages API needs a well-formed tool_result block to close the loop:

{
  "role": "user",
  "content": [
    {
      "type": "tool_result",
      "tool_use_id": "toolu_01ABC...",
      "content": "the result string or structured content"
    }
  ]
}

If your server returned a plain string, used a text block, or omitted tool_use_id, Claude cannot match it and you will see Tool result block missing corresponding tool use block. The tool_use_id must equal the id of the preceding tool_use block exactly. Also check stop_reason on the assistant turn: if it is max_tokens and the last block is a tool_use, the tool call itself was truncated — retry that turn with a higher max_tokens (for example 4096) before worrying about the result.

Step 6: For MCP, reconnect (and check the protocol version)

If a connector shows disconnected: Settings -> Connectors -> click the connector -> Reconnect. Then retry the prompt in a new turn, not the hung one — reconnecting does not retroactively complete the stuck call. If the connector reconnects but every call times out right after a Claude Desktop update, update the connector/extension to clear an MCP protocol-version mismatch.

Step 7: In Claude Code, kill the stalled bridge

If the spinner is frozen in the CLI and Ctrl+C / Esc do nothing, force-kill from another terminal, then reconnect before retrying:

pkill -f "claude"
pkill -f "mcp-remote"
claude
/mcp

Running /mcp re-establishes connectors before your next tool call so it does not hang on the same stale session.

Step 8: Cancel and retry with a narrower scope

If expand, refresh, resume, and reconnect all failed, cancel the hung call and retry with less surface area:

Stop the current tool call. Try again, but instead of searching
the entire repository, only search the apps/web/src/billing/ directory.

A smaller scope usually completes within the timeout.

Step 9: For long-running tools, switch to background execution

For tools that take more than 60 seconds (large data jobs, slow APIs), redesign the tool to return a job ID immediately and let Claude poll:

1. Tool call A: starts the job, returns { "job_id": "abc123" }
2. Tool call B: checks status by job_id, returns done or pending

This avoids the UI timeout entirely.

How to confirm it’s fixed

  • Repeat the same prompt in a fresh conversation. If it completes quickly, the fix held.
  • For custom integrations, send a tool_result with a matching tool_use_id and confirm Claude accepts it (no missing corresponding tool use block error).
  • For MCP, run a trivial call (list files, get user) and confirm it returns quickly. On Desktop, confirm the result now renders without manually expanding the panel.
  • For web search, confirm stop_reason ends as end_turn, not pause_turn.
  • Keep the tab in the foreground during the retry to rule out browser suspension.

Long-term prevention

  • For custom tool servers, set internal timeouts shorter than Claude’s UI timeout (aim for 45s) and always return a result or an error within that window.
  • Always handle pause_turn in any agent loop that uses server tools: add the assistant response to messages and send another request.
  • Check stop_reason before processing every response so max_tokens truncation and pause_turn are caught instead of read as hangs.
  • For MCP servers, add health checks and auto-reconnect on transient failures, and re-test connectors after each Claude Desktop update for protocol drift.
  • Keep prompts scoped for built-in tools: “search recent posts about X” beats “search the entire web for everything about X.”
  • Document the expected tool_result shape in your tool-server README so future integrations do not regress.

Common pitfalls

  • Refreshing five times in a row. Once is enough; expanding the Desktop panel often beats refreshing.
  • Reading a pause_turn web-search turn as a failure and retrying from scratch instead of continuing.
  • Returning the tool result as plain text instead of a tool_result block — easy to miss in custom integrations.
  • Forgetting that tool_use_id is per-call, not per-tool. Each call has a fresh ID, and server tools use srvtoolu_ while client tools use toolu_.
  • Letting a custom tool run 5+ minutes without returning anything. Claude UI will not wait.
  • Treating an MCP “connected” badge as proof of health — make a real call to verify.

FAQ

  • What is the fastest unstick on Claude Desktop? Click to expand the “Used [tool] integration” panel. A render bug present since ~Jan 30 2026 finishes the call server-side but does not repaint until you open that panel.
  • My web search spins forever — is it stuck? Usually not. Server tools return pause_turn when the server-side loop hits its 10-iteration limit. Continue the conversation (or send “continue”) to resume; do not start over.
  • How long is Claude’s tool-call timeout? Built-in tools time out around 60-120 seconds. Custom integrations depend on your own server; the API does not enforce a strict cap, but the claude.ai UI does. Claude Code has no client-side timeout, which is why a stalled MCP bridge hangs with no Ctrl+C.
  • Why does the API say “Tool result block missing corresponding tool use block”? Your tool_result has a tool_use_id that does not match any tool_use in the previous assistant message, or the tool_result shape is wrong. Match the id exactly.
  • Can I cancel a pending tool call? In the web UI, click the stop button on the spinner, or refresh. In Claude Code, Ctrl+C and Esc do not abort a stalled MCP call — kill the process with pkill -f "claude" and pkill -f "mcp-remote", then run /mcp.
  • Is this a Claude bug? Sometimes — the Desktop render bug and the Claude Code no-timeout issue are genuine, tracked bugs. More often it is a downstream tool that did not respond properly or a pause_turn left unresumed.

Tags: #Claude #Troubleshooting #Tools