081421d838
_handle_session_expired_and_retry only reached the at-most-once guard when a reconnectable server record existed; without one (server torn down, MCP loop not running) a write-capable call fell through to the generic "MCP call failed" error, which invites the model to replay a write that may already have landed. The session-expired classification now runs first and a write-capable call always gets the outcome_uncertain error; the reconnect is attempted only when a server can be signalled. _track_inflight_rpc's teardown RuntimeError said "retry the request on the rebuilt session" for every op; for a write-capable tools/call it now says the request may already have been dispatched and must be verified first, so the wording matches the at-most-once contract the recoverer enforces. Docs: the readOnlyHint row explains that the same hint gates auto-retry after a mid-call session expiry, and that unannotated tools on an idle-TTL Streamable-HTTP server return outcome_uncertain on the first call after idle instead of being transparently replayed.