@@ -91,7 +91,7 @@ async def store_event(self, stream_id: StreamId, message: JSONRPCMessage | None)
9191 Returns:
9292 The generated event ID for the stored event
9393 """
94- pass # pragma: no cover
94+ pass # pragma: lax no cover
9595
9696 @abstractmethod
9797 async def replay_events_after (
@@ -108,7 +108,7 @@ async def replay_events_after(
108108 Returns:
109109 The stream ID of the replayed events
110110 """
111- pass # pragma: no cover
111+ pass # pragma: lax no cover
112112
113113
114114class StreamableHTTPServerTransport :
@@ -175,7 +175,7 @@ def is_terminated(self) -> bool:
175175 """Check if this transport has been explicitly terminated."""
176176 return self ._terminated
177177
178- def close_sse_stream (self , request_id : RequestId ) -> None : # pragma: no cover
178+ def close_sse_stream (self , request_id : RequestId ) -> None : # pragma: lax no cover
179179 """Close SSE connection for a specific request without terminating the stream.
180180
181181 This method closes the HTTP connection for the specified request, triggering
@@ -203,7 +203,7 @@ def close_sse_stream(self, request_id: RequestId) -> None: # pragma: no cover
203203 send_stream .close ()
204204 receive_stream .close ()
205205
206- def close_standalone_sse_stream (self ) -> None : # pragma: no cover
206+ def close_standalone_sse_stream (self ) -> None : # pragma: lax no cover
207207 """Close the standalone GET SSE stream, triggering client reconnection.
208208
209209 This method closes the HTTP connection for the standalone GET stream used
@@ -238,10 +238,10 @@ def _create_session_message(
238238 # Only provide close callbacks when client supports resumability
239239 if self ._event_store and protocol_version >= "2025-11-25" :
240240
241- async def close_stream_callback () -> None : # pragma: no cover
241+ async def close_stream_callback () -> None : # pragma: lax no cover
242242 self .close_sse_stream (request_id )
243243
244- async def close_standalone_stream_callback () -> None : # pragma: no cover
244+ async def close_standalone_stream_callback () -> None : # pragma: lax no cover
245245 self .close_standalone_sse_stream ()
246246
247247 metadata = ServerMessageMetadata (
@@ -289,7 +289,7 @@ def _create_error_response(
289289 ) -> Response :
290290 """Create an error response with a simple string message."""
291291 response_headers = {"Content-Type" : CONTENT_TYPE_JSON }
292- if headers : # pragma: no cover
292+ if headers : # pragma: lax no cover
293293 response_headers .update (headers )
294294
295295 if self .mcp_session_id :
@@ -328,11 +328,11 @@ def _create_json_response(
328328 headers = response_headers ,
329329 )
330330
331- def _get_session_id (self , request : Request ) -> str | None : # pragma: no cover
331+ def _get_session_id (self , request : Request ) -> str | None : # pragma: lax no cover
332332 """Extract the session ID from request headers."""
333333 return request .headers .get (MCP_SESSION_ID_HEADER )
334334
335- def _create_event_data (self , event_message : EventMessage ) -> dict [str , str ]: # pragma: no cover
335+ def _create_event_data (self , event_message : EventMessage ) -> dict [str , str ]: # pragma: lax no cover
336336 """Create event data dictionary from an EventMessage."""
337337 event_data = {
338338 "event" : "message" ,
@@ -352,7 +352,7 @@ async def _clean_up_memory_streams(self, request_id: RequestId) -> None:
352352 # Close the request stream
353353 await self ._request_streams [request_id ][0 ].aclose ()
354354 await self ._request_streams [request_id ][1 ].aclose ()
355- except Exception : # pragma: no cover
355+ except Exception : # pragma: lax no cover
356356 # During cleanup, we catch all exceptions since streams might be in various states
357357 logger .debug ("Error closing memory streams - may already be closed" )
358358 finally :
@@ -370,7 +370,7 @@ async def handle_request(self, scope: Scope, receive: Receive, send: Send) -> No
370370 await error_response (scope , receive , send )
371371 return
372372
373- if self ._terminated : # pragma: no cover
373+ if self ._terminated : # pragma: lax no cover
374374 # If the session has been terminated, return 404 Not Found
375375 response = self ._create_error_response (
376376 "Not Found: Session has been terminated" ,
@@ -381,11 +381,11 @@ async def handle_request(self, scope: Scope, receive: Receive, send: Send) -> No
381381
382382 if request .method == "POST" :
383383 await self ._handle_post_request (scope , request , receive , send )
384- elif request .method == "GET" : # pragma: no cover
384+ elif request .method == "GET" : # pragma: lax no cover
385385 await self ._handle_get_request (request , send )
386- elif request .method == "DELETE" : # pragma: no cover
386+ elif request .method == "DELETE" : # pragma: lax no cover
387387 await self ._handle_delete_request (request , send )
388- else : # pragma: no cover
388+ else : # pragma: lax no cover
389389 await self ._handle_unsupported_request (request , send )
390390
391391 def _check_accept_headers (self , request : Request ) -> tuple [bool , bool ]:
@@ -442,15 +442,15 @@ async def _validate_accept_header(self, request: Request, scope: Scope, send: Se
442442 async def _handle_post_request (self , scope : Scope , request : Request , receive : Receive , send : Send ) -> None :
443443 """Handle POST requests containing JSON-RPC messages."""
444444 writer = self ._read_stream_writer
445- if writer is None : # pragma: no cover
445+ if writer is None : # pragma: lax no cover
446446 raise ValueError ("No read stream writer available. Ensure connect() is called first." )
447447 try :
448448 # Validate Accept header
449449 if not await self ._validate_accept_header (request , scope , send ):
450450 return
451451
452452 # Validate Content-Type
453- if not self ._check_content_type (request ): # pragma: no cover
453+ if not self ._check_content_type (request ): # pragma: lax no cover
454454 response = self ._create_error_response (
455455 "Unsupported Media Type: Content-Type must be application/json" ,
456456 HTTPStatus .UNSUPPORTED_MEDIA_TYPE ,
@@ -470,7 +470,7 @@ async def _handle_post_request(self, scope: Scope, request: Request, receive: Re
470470
471471 try :
472472 message = jsonrpc_message_adapter .validate_python (raw_message , by_name = False )
473- except ValidationError as e : # pragma: no cover
473+ except ValidationError as e : # pragma: lax no cover
474474 response = self ._create_error_response (
475475 f"Validation error: { str (e )} " ,
476476 HTTPStatus .BAD_REQUEST ,
@@ -482,7 +482,7 @@ async def _handle_post_request(self, scope: Scope, request: Request, receive: Re
482482 # Check if this is an initialization request
483483 is_initialization_request = isinstance (message , JSONRPCRequest ) and message .method == "initialize"
484484
485- if is_initialization_request : # pragma: no cover
485+ if is_initialization_request : # pragma: lax no cover
486486 # Check if the server already has an established session
487487 if self .mcp_session_id :
488488 # Check if request has a session ID
@@ -496,11 +496,11 @@ async def _handle_post_request(self, scope: Scope, request: Request, receive: Re
496496 )
497497 await response (scope , receive , send )
498498 return
499- elif not await self ._validate_request_headers (request , send ): # pragma: no cover
499+ elif not await self ._validate_request_headers (request , send ): # pragma: lax no cover
500500 return
501501
502502 # For notifications and responses only, return 202 Accepted
503- if not isinstance (message , JSONRPCRequest ): # pragma: no cover
503+ if not isinstance (message , JSONRPCRequest ): # pragma: lax no cover
504504 # Create response object and send it
505505 response = self ._create_json_response (
506506 None ,
@@ -547,23 +547,23 @@ async def _handle_post_request(self, scope: Scope, request: Request, receive: Re
547547 response_message = event_message .message
548548 break
549549 # For notifications and request, keep waiting
550- else : # pragma: no cover
550+ else : # pragma: lax no cover
551551 logger .debug (f"received: { event_message .message .method } " )
552552
553553 # At this point we should have a response
554554 if response_message :
555555 # Create JSON response
556556 response = self ._create_json_response (response_message )
557557 await response (scope , receive , send )
558- else : # pragma: no cover
558+ else : # pragma: lax no cover
559559 # This shouldn't happen in normal operation
560560 logger .error ("No response message received before stream closed" )
561561 response = self ._create_error_response (
562562 "Error processing request: No response received" ,
563563 HTTPStatus .INTERNAL_SERVER_ERROR ,
564564 )
565565 await response (scope , receive , send )
566- except Exception : # pragma: no cover
566+ except Exception : # pragma: lax no cover
567567 logger .exception ("Error processing JSON response" )
568568 response = self ._create_error_response (
569569 "Error processing request" ,
@@ -573,7 +573,7 @@ async def _handle_post_request(self, scope: Scope, request: Request, receive: Re
573573 await response (scope , receive , send )
574574 finally :
575575 await self ._clean_up_memory_streams (request_id )
576- else : # pragma: no cover
576+ else : # pragma: lax no cover
577577 # Create SSE stream
578578 sse_stream_writer , sse_stream_reader = anyio .create_memory_object_stream [dict [str , str ]](0 )
579579
@@ -635,7 +635,7 @@ async def sse_writer():
635635 await sse_stream_reader .aclose ()
636636 await self ._clean_up_memory_streams (request_id )
637637
638- except Exception as err : # pragma: no cover
638+ except Exception as err : # pragma: lax no cover
639639 logger .exception ("Error handling POST request" )
640640 response = self ._create_error_response (
641641 f"Error handling POST request: { err } " ,
@@ -647,7 +647,7 @@ async def sse_writer():
647647 await writer .send (Exception (err ))
648648 return
649649
650- async def _handle_get_request (self , request : Request , send : Send ) -> None : # pragma: no cover
650+ async def _handle_get_request (self , request : Request , send : Send ) -> None : # pragma: lax no cover
651651 """Handle GET request to establish SSE.
652652
653653 This allows the server to communicate to the client without the client
@@ -738,7 +738,7 @@ async def standalone_sse_writer():
738738 await sse_stream_reader .aclose ()
739739 await self ._clean_up_memory_streams (GET_STREAM_KEY )
740740
741- async def _handle_delete_request (self , request : Request , send : Send ) -> None : # pragma: no cover
741+ async def _handle_delete_request (self , request : Request , send : Send ) -> None : # pragma: lax no cover
742742 """Handle DELETE requests for explicit session termination."""
743743 # Validate session ID
744744 if not self .mcp_session_id :
@@ -788,11 +788,11 @@ async def terminate(self) -> None:
788788 await self ._write_stream_reader .aclose ()
789789 if self ._write_stream is not None : # pragma: no branch
790790 await self ._write_stream .aclose ()
791- except Exception as e : # pragma: no cover
791+ except Exception as e : # pragma: lax no cover
792792 # During cleanup, we catch all exceptions since streams might be in various states
793793 logger .debug (f"Error closing streams: { e } " )
794794
795- async def _handle_unsupported_request (self , request : Request , send : Send ) -> None : # pragma: no cover
795+ async def _handle_unsupported_request (self , request : Request , send : Send ) -> None : # pragma: lax no cover
796796 """Handle unsupported HTTP methods."""
797797 headers = {
798798 "Content-Type" : CONTENT_TYPE_JSON ,
@@ -808,14 +808,14 @@ async def _handle_unsupported_request(self, request: Request, send: Send) -> Non
808808 )
809809 await response (request .scope , request .receive , send )
810810
811- async def _validate_request_headers (self , request : Request , send : Send ) -> bool : # pragma: no cover
811+ async def _validate_request_headers (self , request : Request , send : Send ) -> bool : # pragma: lax no cover
812812 if not await self ._validate_session (request , send ):
813813 return False
814814 if not await self ._validate_protocol_version (request , send ):
815815 return False
816816 return True
817817
818- async def _validate_session (self , request : Request , send : Send ) -> bool : # pragma: no cover
818+ async def _validate_session (self , request : Request , send : Send ) -> bool : # pragma: lax no cover
819819 """Validate the session ID in the request."""
820820 if not self .mcp_session_id :
821821 # If we're not using session IDs, return True
@@ -844,7 +844,7 @@ async def _validate_session(self, request: Request, send: Send) -> bool: # prag
844844
845845 return True
846846
847- async def _validate_protocol_version (self , request : Request , send : Send ) -> bool : # pragma: no cover
847+ async def _validate_protocol_version (self , request : Request , send : Send ) -> bool : # pragma: lax no cover
848848 """Validate the protocol version header in the request."""
849849 # Get the protocol version from the request headers
850850 protocol_version = request .headers .get (MCP_PROTOCOL_VERSION_HEADER )
@@ -866,7 +866,7 @@ async def _validate_protocol_version(self, request: Request, send: Send) -> bool
866866
867867 return True
868868
869- async def _replay_events (self , last_event_id : str , request : Request , send : Send ) -> None : # pragma: no cover
869+ async def _replay_events (self , last_event_id : str , request : Request , send : Send ) -> None : # pragma: lax no cover
870870 """Replays events that would have been sent after the specified event ID.
871871 Only used when resumability is enabled.
872872 """
@@ -992,7 +992,7 @@ async def message_router():
992992 # send it there
993993 target_request_id = response_id
994994 # Extract related_request_id from meta if it exists
995- elif ( # pragma: no cover
995+ elif ( # pragma: lax no cover
996996 session_message .metadata is not None
997997 and isinstance (
998998 session_message .metadata ,
@@ -1016,13 +1016,13 @@ async def message_router():
10161016 try :
10171017 # Send both the message and the event ID
10181018 await self ._request_streams [request_stream_id ][0 ].send (EventMessage (message , event_id ))
1019- except ( # pragma: no cover
1019+ except ( # pragma: lax no cover
10201020 anyio .BrokenResourceError ,
10211021 anyio .ClosedResourceError ,
10221022 ):
10231023 # Stream might be closed, remove from registry
10241024 self ._request_streams .pop (request_stream_id , None )
1025- else : # pragma: no cover
1025+ else : # pragma: lax no cover
10261026 logger .debug (
10271027 f"""Request stream { request_stream_id } not found
10281028 for message. Still processing message as the client
@@ -1053,6 +1053,6 @@ async def message_router():
10531053 await read_stream .aclose ()
10541054 await write_stream_reader .aclose ()
10551055 await write_stream .aclose ()
1056- except Exception as e : # pragma: no cover
1056+ except Exception as e : # pragma: lax no cover
10571057 # During cleanup, we catch all exceptions since streams might be in various states
10581058 logger .debug (f"Error closing streams: { e } " )
0 commit comments