Skip to content

Commit cd421be

Browse files
committed
fix: handle cancellation race in RequestResponder.respond()
When a CancelledNotification arrives after the handler completes but before respond() is called, cancel() sets _completed=True and sends an error response. The subsequent respond() call would hit an AssertionError. This change replaces the assert with a guard: if _completed is already True, respond() returns silently since the cancellation response was already sent. Fixes: #2416 _Submitted via TTClaw bounty hunter._
1 parent f27d2aa commit cd421be

File tree

1 file changed

+3
-1
lines changed

1 file changed

+3
-1
lines changed

src/mcp/shared/session.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,9 @@ async def respond(self, response: SendResultT | ErrorData) -> None:
130130
"""
131131
if not self._entered: # pragma: no cover
132132
raise RuntimeError("RequestResponder must be used as a context manager")
133-
assert not self._completed, "Request already responded to"
133+
# Guard against race: if cancel() already set _completed, skip silently.
134+
if self._completed:
135+
return
134136

135137
if not self.cancelled: # pragma: no branch
136138
self._completed = True

0 commit comments

Comments
 (0)