@@ -185,7 +185,7 @@ def __init__(
185185 self ._request_id = 0
186186 self ._receive_request_type = receive_request_type
187187 self ._receive_notification_type = receive_notification_type
188- self ._read_timeout_seconds = read_timeout_seconds
188+ self ._session_read_timeout_seconds = read_timeout_seconds
189189 self ._in_flight = {}
190190
191191 self ._exit_stack = AsyncExitStack ()
@@ -213,6 +213,7 @@ async def send_request(
213213 self ,
214214 request : SendRequestT ,
215215 result_type : type [ReceiveResultT ],
216+ request_read_timeout_seconds : timedelta | None = None
216217 ) -> ReceiveResultT :
217218 """
218219 Sends a request and wait for a response. Raises an McpError if the
@@ -243,12 +244,15 @@ async def send_request(
243244
244245 await self ._write_stream .send (JSONRPCMessage (jsonrpc_request ))
245246
247+ # request read timeout takes precedence over session read timeout
248+ timeout = None
249+ if request_read_timeout_seconds is not None :
250+ timeout = request_read_timeout_seconds .total_seconds ()
251+ elif self ._session_read_timeout_seconds is not None :
252+ timeout = self ._session_read_timeout_seconds .total_seconds ()
253+
246254 try :
247- with anyio .fail_after (
248- None
249- if self ._read_timeout_seconds is None
250- else self ._read_timeout_seconds .total_seconds ()
251- ):
255+ with anyio .fail_after (timeout ):
252256 response_or_error = await response_stream_reader .receive ()
253257 except TimeoutError :
254258 raise McpError (
@@ -257,7 +261,7 @@ async def send_request(
257261 message = (
258262 f"Timed out while waiting for response to "
259263 f"{ request .__class__ .__name__ } . Waited "
260- f"{ self . _read_timeout_seconds } seconds."
264+ f"{ timeout } seconds."
261265 ),
262266 )
263267 )
0 commit comments