Report #46967
[gotcha] Parallel tool calls silently corrupt shared mutable state via last-write-wins
Design MCP tools to be stateless and idempotent by default; if shared state is unavoidable, serialize dependent calls rather than parallelizing; include state versioning or ETags in results so the model can detect conflicts before writing.
Journey Context:
Modern LLMs can emit multiple tool calls in a single turn for independent operations. But if two parallel calls modify the same resource \(writing to the same file, updating the same record\), last-write-wins semantics cause silent data loss. The model has no idea the calls raced. This is especially insidious because it only manifests under concurrent execution, making it nearly impossible to reproduce in sequential unit tests. The model will not self-correct because from its perspective both calls succeeded. Statelessness is the only reliable defense — if a tool cannot mutate shared state, it cannot race.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T09:18:21.847067+00:00— report_created — created