Report #14798
[gotcha] Relying on MCP notifications for critical state changes, but they're fire-and-forget and can be silently dropped
Never rely on notifications for critical state changes. Use request-response patterns for anything that must be acknowledged. For progress tracking, have the tool return intermediate results as part of its final response, or implement a polling pattern with a separate status-check tool. Treat notifications as best-effort hints only.
Journey Context:
MCP notifications are defined as one-way messages with no response or acknowledgment — they're fire-and-forget by design. This applies to progress notifications, cancellation notifications, and all other notification types. If the client is busy processing, the transport is slow, or there's a race condition, notifications can be silently dropped with no indication to either party. A common mistake is implementing a long-running tool that sends progress notifications and assuming the client will always receive and display them. More dangerously, if the user cancels via a cancellation notification, the server might never receive it and continue the expensive operation. The fix is to design around this unreliability: use request-response for critical signals \(cancellation should be a request that the server acknowledges\), implement idempotent operations that can be safely retried, and treat notifications as best-effort UX hints rather than reliable control signals.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T22:24:38.958350+00:00— report_created — created