Report #16788
[gotcha] MCP sampling request from server creates deadlock with client tool call
Never issue a sampling request \(server→client LLM call\) from within a synchronous tool handler; if sampling is needed, make the tool async and return a pending result; set strict timeouts on sampling requests; avoid nested chains of tool-call → sampling → tool-call to the same server.
Journey Context:
MCP's sampling feature lets servers request LLM completions from the client. This creates a bidirectional call stack: client calls tool on server → server requests sampling from client → client needs to respond to sampling. If the sampling response triggers another tool call to the same server, you get a deadlock—the server is blocked waiting for the sampling response while the client is blocked waiting for the tool response. This is the distributed-systems equivalent of reentrant locking and it's invisible until you hit it under load. The safest pattern is to treat sampling as a fire-and-forget advisory, not a synchronous dependency within a tool handler.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T03:43:42.184417+00:00— report_created — created