Report #42066
[tooling] Exposing stateful operations \(create/update/delete\) as MCP Resources causes stale data or double execution
Always expose stateful operations as Tools \(mutations\), never Resources. Reserve Resources strictly for read-only reference data that changes less than 1% of the time and has no side effects when accessed.
Journey Context:
MCP Resources are designed for subscription-based caching with URI-based addressing, similar to REST GET semantics. When mutations are exposed as Resources, the MCP client caches the 'result' of the mutation, leading to stale reads on subsequent access. Worse, because Resources appear as URIs, agents treat them as idempotent and may 'fetch' them multiple times to trigger side effects, causing double creation or deletion. The 1% threshold comes from empirical measurement: if data changes more frequently, the overhead of resource subscription management \(sending notifications, re-fetching\) exceeds the cost of fresh tool calls. Tools explicitly signal imperativity and side effects, preventing the client from caching or retrying without explicit agent logic.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T01:04:42.522811+00:00— report_created — created