
    Cho                        S r SSKrSSKrSSKrSSKJrJr  SSKJrJ	r	J
r
  SSKJr  SSKJr  SSKJr  SSKrSSKJrJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJrJrJ r   SSK!J"r"J#r#  SSK$J%r%J&r&  SSK'J(r(  SSK)J*r*J+r+J,r,J-r-J.r.J/r/J0r0J1r1J2r2J3r3J4r4  \Rj                  " \65      r7Sr8Sr9Sr:Sr;Sr<Sr=\R|                  " S5      r?\@rA\@rB\ " S S5      5       rC\
\C/\	S   4   rD " S S\5      rE " S S5      rFg)z
StreamableHTTP Server Transport Module

This module implements an HTTP transport layer with Streamable HTTP.

The transport handles bidirectional communication using HTTP requests and
responses, with streaming support for long-running operations.
    N)ABCabstractmethod)AsyncGenerator	AwaitableCallable)asynccontextmanager)	dataclass)
HTTPStatus)MemoryObjectReceiveStreamMemoryObjectSendStream)ValidationError)EventSourceResponse)Request)Response)ReceiveScopeSend)TransportSecurityMiddlewareTransportSecuritySettings)ServerMessageMetadataSessionMessage)SUPPORTED_PROTOCOL_VERSIONS)DEFAULT_NEGOTIATED_VERSIONINTERNAL_ERRORINVALID_PARAMSINVALID_REQUESTPARSE_ERROR	ErrorDataJSONRPCErrorJSONRPCMessageJSONRPCRequestJSONRPCResponse	RequestIdzmcp-session-idzmcp-protocol-versionzlast-event-idzapplication/jsonztext/event-stream_GET_streamz^[\x21-\x7E]+$c                   8    \ rS rSr% Sr\\S'   Sr\S-  \S'   Sr	g)EventMessageG   zE
A JSONRPCMessage with an optional event ID for stream resumability.
messageNevent_id )
__name__
__module____qualname____firstlineno____doc__r    __annotations__r)   str__static_attributes__r*       T/home/james-whalen/.local/lib/python3.13/site-packages/mcp/server/streamable_http.pyr&   r&   G   s     HcDjr3   r&   c                   ^    \ rS rSrSr\S\S\S\4S j5       r	\S\S\
S\S	-  4S
 j5       rSrg	)
EventStoreT   z7
Interface for resumability support via event storage.
	stream_idr(   returnc                    #    g7f)z
Stores an event for later retrieval.

Args:
    stream_id: ID of the stream the event belongs to
    message: The JSON-RPC message to store

Returns:
    The generated event ID for the stored event
Nr*   )selfr8   r(   s      r4   store_eventEventStore.store_eventY   s
      	   last_event_idsend_callbackNc                    #    g7f)z
Replays events that occurred after the specified event ID.

Args:
    last_event_id: The ID of the last event the client received
    send_callback: A callback function to send events to the client

Returns:
    The stream ID of the replayed events
Nr*   )r;   r?   r@   s      r4   replay_events_afterEventStore.replay_events_afterg   s
       	r>   r*   )r+   r,   r-   r.   r/   r   StreamIdr    EventIdr<   EventCallbackrB   r2   r*   r3   r4   r6   r6   T   se     8 n QX    % 
D	 r3   r6   c                      \ rS rSr% SrSr\\\-     S-  \	S'   Sr
\\\-     S-  \	S'   Sr\\   S-  \	S'   Sr\\   S-  \	S'   \\	S'      S/S	\S-  S
\S\S-  S\S-  SS4
S jjr\S\4S j5       r\S4S\S\S\S\\\4   S-  S\4
S jjr\R8                  S4S\S-  S\S\\\4   S-  S\4S jjrS\S\S-  4S jr S\!S\\\4   4S jr"S\#SS4S jr$S\%S\&S\'SS4S  jr(S\S\)\\4   4S! jr*S\S\4S" jr+S\%S\S\&S\'SS4
S# jr,S\S\'SS4S$ jr-S\S\'SS4S% jr.S0S& jr/S\S\'SS4S' jr0S\S\'S\4S( jr1S\S\'S\4S) jr2S\S\'S\4S* jr3S+\S\S\'SS4S, jr4\5S\6\)\\\-     \\   4   S4   4S- j5       r7S.r8g)1StreamableHTTPServerTransportz   z
HTTP server transport with event streaming support for MCP.

Handles JSON-RPC messages in HTTP POST requests with SSE streaming.
Supports optional JSON responses and session management.
N_read_stream_writer_read_stream_write_stream_write_stream_reader	_securitymcp_session_idis_json_response_enabledevent_storesecurity_settingsr9   c                     Ub%  [         R                  U5      (       d  [        S5      eXl        X l        X0l        [        U5      U l        0 U l        SU l	        g)a  
Initialize a new StreamableHTTP server transport.

Args:
    mcp_session_id: Optional session identifier for this connection.
                    Must contain only visible ASCII characters (0x21-0x7E).
    is_json_response_enabled: If True, return JSON responses for requests
                            instead of SSE streams. Default is False.
    event_store: Event store for resumability support. If provided,
                resumability will be enabled, allowing clients to
                reconnect and resume messages.
    security_settings: Optional security settings for DNS rebinding protection.

Raises:
    ValueError: If the session ID contains invalid characters.
NzASession ID must only contain visible ASCII characters (0x21-0x7E)F)
SESSION_ID_PATTERN	fullmatch
ValueErrorrO   rP   _event_storer   rN   _request_streams_terminated)r;   rO   rP   rQ   rR   s        r4   __init__&StreamableHTTPServerTransport.__init__   s]    . %.@.J.J>.Z.Z`aa,(@%'45FG  	 !r3   c                     U R                   $ )z7Check if this transport has been explicitly terminated.)rY   )r;   s    r4   is_terminated+StreamableHTTPServerTransport.is_terminated   s     r3   error_messagestatus_code
error_codeheadersc           	          S[         0nU(       a  UR                  U5        U R                  (       a  U R                  U[        '   [	        SS[        UUS9S9n[        UR                  SSS9UUS9$ )	z6Create an error response with a simple string message.Content-Typez2.0zserver-error)coder(   )jsonrpciderrorTby_aliasexclude_noner`   rb   )CONTENT_TYPE_JSONupdaterO   MCP_SESSION_ID_HEADERr   r   r   model_dump_json)r;   r_   r`   ra   rb   response_headerserror_responses          r4   _create_error_response4StreamableHTTPServerTransport._create_error_response   s     +,=>##G,6:6I6I23 &%
 **Dt*L#$
 	
r3   response_messagec                     S[         0nU(       a  UR                  U5        U R                  (       a  U R                  U[        '   [	        U(       a  UR                  SSS9OSUUS9$ )z,Create a JSON response from a JSONRPCMessagerd   Tri   Nrl   )rm   rn   rO   ro   r   rp   )r;   ru   r`   rb   rq   s        r4   _create_json_response3StreamableHTTPServerTransport._create_json_response   sh     +,=>##G,6:6I6I23Rb,,d,Nhl#$
 	
r3   requestc                 @    UR                   R                  [        5      $ )z,Extract the session ID from request headers.)rb   getro   )r;   ry   s     r4   _get_session_id-StreamableHTTPServerTransport._get_session_id   s    ""#899r3   event_messagec                     SUR                   R                  SSS9S.nUR                  (       a  UR                  US'   U$ )z2Create event data dictionary from an EventMessage.r(   Tri   )eventdatarg   )r(   rp   r)   )r;   r~   
event_datas      r4   _create_event_data0StreamableHTTPServerTransport._create_event_data   sI     !))994VZ9[

 !!,55Jtr3   
request_idc                   #    XR                   ;   an   U R                   U   S   R                  5       I Sh  vN   U R                   U   S   R                  5       I Sh  vN   U R                   R                  US5        gg NJ N$! [         a    [        R	                  S5         NCf = f! U R                   R                  US5        f = f7f)z/Clean up memory streams for a given request ID.r   N   z4Error closing memory streams - may already be closed)rX   aclose	Exceptionloggerdebugpop)r;   r   s     r4   _clean_up_memory_streams6StreamableHTTPServerTransport._clean_up_memory_streams   s     ...	<++J7:AACCC++J7:AACCC %%))*d; / DC USTU
 %%))*d;sV   C#B B'B BB #CB B B'$B* &B''B* *CCscopereceivesendc                   #    [        X5      nUR                  S:H  nU R                  R                  XES9I Sh  vN nU(       a  U" XU5      I Sh  vN   gU R                  (       a2  U R                  S[        R                  5      nU" XU5      I Sh  vN   gUR                  S:X  a  U R                  XX#5      I Sh  vN   gUR                  S:X  a  U R                  XC5      I Sh  vN   gUR                  S:X  a  U R                  XC5      I Sh  vN   gU R                  XC5      I Sh  vN   g N N N Ny NQ N) N7f)z6Application entry point that handles all HTTP requestsPOST)is_postNz&Not Found: Session has been terminatedGETDELETE)r   methodrN   validate_requestrY   rs   r
   	NOT_FOUND_handle_post_request_handle_get_request_handle_delete_request_handle_unsupported_request)r;   r   r   r   ry   r   rr   responses           r4   handle_request,StreamableHTTPServerTransport.handle_request  s    %) ..F*#~~>>w>XX 666228$$H 54000>>V#++EGJJJ^^u$**7999^^x'--g<<<227AAA+ Y6 1 K9<As|   7ED3ED5AED7*E?D9 )E)D;*)ED=E-D?.E5E7E9E;E=E?Ec                     UR                   R                  SS5      nUR                  S5       Vs/ s H  o3R                  5       PM     nn[	        S U 5       5      n[	        S U 5       5      nXV4$ s  snf )z6Check if the request accepts the required media types.accept ,c              3   J   #    U  H  oR                  [        5      v   M     g 7fN)
startswithrm   .0
media_types     r4   	<genexpr>FStreamableHTTPServerTransport._check_accept_headers.<locals>.<genexpr>)  s     _R^J,,->??R^   !#c              3   J   #    U  H  oR                  [        5      v   M     g 7fr   )r   CONTENT_TYPE_SSEr   s     r4   r   r   *  s     ]P\*++,<==P\r   rb   r{   splitstripany)r;   ry   accept_headerr   accept_typeshas_jsonhas_sses          r4   _check_accept_headers3StreamableHTTPServerTransport._check_accept_headers$  sr    ++Hb9=J=P=PQT=UV=Uz((*=UV_R^__]P\]]   Ws   A2c                     UR                   R                  SS5      nUR                  S5      S   R                  S5       Vs/ s H  o3R                  5       PM     nn[	        S U 5       5      $ s  snf )z2Check if the request has the correct Content-Type.zcontent-typer   ;r   r   c              3   2   #    U  H  o[         :H  v   M     g 7fr   )rm   )r   parts     r4   r   DStreamableHTTPServerTransport._check_content_type.<locals>.<genexpr>3  s     L9K,,9Ks   r   )r;   ry   content_typer   content_type_partss        r4   _check_content_type1StreamableHTTPServerTransport._check_content_type.  sg    **>2>7C7I7I#7Nq7Q7W7WX[7\]7\tjjl7\]L9KLLL ^s   A/c                   ^ ^^^#    T R                   nUc  [        S5      e T R                  U5      u  pgU(       a  U(       d2  T R                  S[        R
                  5      nU" XU5      I Sh  vN   gT R                  U5      (       d2  T R                  S[        R                  5      nU" XU5      I Sh  vN   gUR                  5       I Sh  vN n	 [        R                  " U	5      n
 [        R                   " U
5      n['        UR(                  [*        5      =(       a    UR(                  R,                  S:H  nU(       al  T R.                  (       aZ  T R1                  U5      nU(       aB  UT R.                  :w  a2  T R                  S[        R2                  5      nU" XU5      I Sh  vN   gOT R5                  X$5      I Sh  vN (       d  g['        UR(                  [*        5      (       d]  T R7                  S[        R8                  5      nU" XU5      I Sh  vN   [;        US	9n[=        XS
9nUR?                  U5      I Sh  vN   g[        UR(                  R@                  5      m[B        RD                  [F           " S5      T RH                  T'   T RH                  T   S   mT RJ                  (       Ga:  [;        US	9n[=        XS
9nUR?                  U5      I Sh  vN    SnT  Sh  vN n['        URL                  R(                  [N        [P        -  5      (       a  URL                  n  O8[R        RU                  SURL                  R(                  R,                   35        M  U(       a#  T R7                  U5      nU" XU5      I Sh  vN   OG[R        RW                  S5        T R                  S[        RX                  5      nU" XU5      I Sh  vN    T Ra                  T5      I Sh  vN   g[B        RD                  [b        [        [        4      " S5      u  mnUUU U4S jnSS[d        S.T R.                  (       a  [f        T R.                  0O0 En[i        UUUS9n [B        Rj                  " 5        ISh  vN nURm                  XX45        [;        US	9n[=        XS
9nUR?                  U5      I Sh  vN   SSS5      ISh  vN   g GN` GN GN! [        R                   aM  nT R                  S[        U5       3[        R                  [        5      nU" XU5      I Sh  vN     SnAgSnAff = f! ["         aM  nT R                  S[        U5       3[        R                  [$        5      nU" XU5      I Sh  vN     SnAgSnAff = f GN GN GN GNZ GN GN
 GND GN  GN! [Z         aP    [R        R]                  S5        T R                  S[        RX                  [^        5      nU" XU5      I Sh  vN     GN2f = f GN"! T Ra                  T5      I Sh  vN    f = f GN GNz GNm! , ISh  vN  (       d  f       g= f! [Z         ad    [R        R]                  S5        TRo                  5       I Sh  vN    URo                  5       I Sh  vN    T Ra                  T5      I Sh  vN     gf = f! [Z         a  n[R        R]                  S5        T R                  SU 3[        RX                  [^        5      nU" XU5      I Sh  vN    U(       a#  UR?                  [[        U5      5      I Sh  vN     SnAgSnAff = f7f)z2Handle POST requests containing JSON-RPC messages.NBNo read stream writer available. Ensure connect() is called first.zNNot Acceptable: Client must accept both application/json and text/event-streamz=Unsupported Media Type: Content-Type must be application/jsonzParse error: zValidation error: 
initialize(Not Found: Invalid or expired session ID)request_context)metadatar   r   z
received: z1No response message received before stream closedz.Error processing request: No response receivedzError processing JSON responsezError processing requestc                    >#     T IS h  vN   T IS h  vN   T  S h  vN n TR                  U 5      nTR                  U5      I S h  vN   [        U R                  R                  [
        [        -  5      (       d  Me    S S S 5      IS h  vN   S S S 5      IS h  vN   [        R                  S5        TR                  T5      I S h  vN   g  N N N N
 NY NM! , IS h  vN  (       d  f       Nb= f NY! , IS h  vN  (       d  f       Nn= f! [         a    [        R                  S5         Nf = f Nl! [        R                  S5        TR                  T5      I S h  vN    f = f7f)NzError in SSE writerzClosing SSE writer)r   r   
isinstancer(   rootr"   r   r   r   	exceptionr   r   )r~   r   r   request_stream_readerr;   sse_stream_writers     r4   
sse_writerFStreamableHTTPServerTransport._handle_post_request.<locals>.sse_writer  s$    H#4#46K6K7L 
*m-1-D-D]-S
&7&<&<Z&H H H $.$1$9$9$>$>$3l$B$" $" %* 7L6K#4#4  %9:";;JGGG# $56K
* !I 8M 7L6K6K6K#4#4#4#4 % @(()>?@ H %9:";;JGGGs   E/D CD C:CC:CCC
C&CC
2CCC:CC:D C8D #)E/D9E/D C:CCCC:C5	$C'%C5	1C:8D :D DDD D; D D63D; 5D66D; 9E/;*E,%E(&E,,E/no-cache, no-transform
keep-alivezCache-Control
Connectionrd   contentdata_sender_callablerb   zSSE response errorzError handling POST requestzError handling POST request: )8rJ   rV   r   rs   r
   NOT_ACCEPTABLEr   UNSUPPORTED_MEDIA_TYPEbodyjsonloadsJSONDecodeErrorr1   BAD_REQUESTr   r    model_validater   r   r   r   r!   r   rO   r|   r   _validate_request_headersrw   ACCEPTEDr   r   r   rg   anyiocreate_memory_object_streamr&   rX   rP   r(   r"   r   r   r   rh   INTERNAL_SERVER_ERRORr   r   r   r   dictr   ro   r   create_task_group
start_soonr   )r;   r   ry   r   r   writerr   r   r   r   raw_messageer(   is_initialization_requestrequest_session_idr   session_messageru   r~   sse_stream_readerr   rb   tgerrr   r   r   s   `                       @@@r4   r   2StreamableHTTPServerTransport._handle_post_request5  sj    ))>abb@	 $ : :7 CH66e-- ut444 ++G4466S55 ut444 !'D"jj.	(77D )37<<(P(xU\UaUaUhUhlxUx%(&&)-)=)=g)F& *.@DDWDW.W#'#>#>F&00$ 'ut<<<99'HHH gllN;;55'' ut444 1I"0"Lkk/222 W\\__-J050Q0QR^0_`a0bD!!*-$($9$9*$Ea$H!,,,0I"0"Lkk/222%D (,$ 0E [m%m&;&;&@&@/T`B`aa/</D/D,! #LL:m6K6K6P6P6W6W5X)YZ (#'#=#=>N#O&ut<<< %XY#'#>#>L&<<$ 'ut<<< 77
CCC 8=7X7XY]^acf^fYg7hij7k4!#4H H4 &>".$4 HLGZGZ-t/B/BC`b	 /-)3#D$6688BhwE#8#Q*8*T$kk/:::  988E 5 5 ( '' 66s1vh7OQ[QgQgituut444 # 66(Q1**"
 ut4440 =H 5
 3 3[/D = =  9$$%EF#::2"88& H
 #548889 D$77
CCCZ  9
 ;  9888 ! D$$%9:+22444+2244477
CCC	D  
	:;22/u500H
 54000kk)C.111
	s  ]A[ /S0[ 4]5A[ 7S8[ <]=[ S[ S -T< B&[ )V*[ .]/[ V	[ ]A[ V*[ V[ 
]B[ V"[ $V1 (V(,V%-V(0BV1 V+V1 X AV1 V.V1 X [ ,X-[ 1]2A0[ #Y <X0=Y  9X99X3:X9>Y 	X6
Y ][ [ [ T9,=T4)T,*T4/[ 3]4T99[ <
V=VVV	[ ]V[ [ [ [ "[ %V((V1 +V1 .V1 1AXXXX 
XX [ X-&X)'X--[ 0Y 3X96Y 9Y?Y YY ]Y 2[Z[Z![8Z;9[>[ ?] [[ 
]A	]\)]]]]]]c                   ^ ^#    T R                   nUc  [        S5      eT R                  U5      u  pEU(       dG  T R                  S[        R
                  5      nU" UR                  UR                  U5      I Sh  vN   gT R                  X5      I Sh  vN (       d  gUR                  R                  [        5      =n(       a  T R                  XqU5      I Sh  vN   gSS[        S.nT R                  (       a  T R                  U[        '   [         T R"                  ;   aG  T R                  S[        R$                  5      nU" UR                  UR                  U5      I Sh  vN   g[&        R(                  [*        [,        [,        4      " S5      u  mn	U U4S	 jn
[/        U	U
US
9n U" UR                  UR                  U5      I Sh  vN   g GNV GN? N Nt N! [0         ah    [2        R5                  S5        TR7                  5       I Sh  vN    U	R7                  5       I Sh  vN    T R9                  [         5      I Sh  vN     gf = f7f)z
Handle GET request to establish SSE.

This allows the server to communicate to the client without the client
first sending data via HTTP POST. The server can send JSON-RPC requests
and notifications on this stream.
Nr   z4Not Acceptable: Client must accept text/event-streamr   r   r   z4Conflict: Only one SSE stream is allowed per sessionr   c                    >#     [         R                  [           " S5      TR                  [        '   TR                  [           S   n T IS h  vN   U  IS h  vN   U   S h  vN nTR                  U5      nTR                  U5      I S h  vN   M5   NF N= N4 N
 S S S 5      IS h  vN    O! , IS h  vN  (       d  f       O= fS S S 5      IS h  vN    O?! , IS h  vN  (       d  f       O(= f! [         a    [        R                  S5         Of = f[        R                  S5        TR                  [        5      I S h  vN    g ! [        R                  S5        TR                  [        5      I S h  vN    f = f7f)Nr   r   zError in standalone SSE writerzClosing standalone SSE writer)r   r   r&   rX   GET_STREAM_KEYr   r   r   r   r   r   r   )standalone_stream_readerr~   r   r;   r   s      r4   standalone_sse_writerPStreamableHTTPServerTransport._handle_get_request.<locals>.standalone_sse_writer0  s/    D 9>8Y8YZf8ghi8j%%n5+/+@+@+PQR+S(,,.F.F/G Am &*%<%<]%K
/44Z@@@ -.FA A 0H /G.F.F.F.F.F,,,,,,  C  !ABC <=33NCCC <=33NCCCs  FA
C7 BC7 CBCB1!B%B
&B)&B1B
B1C7 CBB1B1C*B-+C1C	7B:8C	CC7 CC7 E C4#C&$C40C7 3E 4C7 7DE DE -F	E
F.F>F?FFr   z Error in standalone SSE response)rJ   rV   r   rs   r
   r   r   r   r   rb   r{   LAST_EVENT_ID_HEADER_replay_eventsr   rO   ro   r   rX   CONFLICTr   r   r   r1   r   r   r   r   r   r   )r;   ry   r   r   _r   r   r?   rb   r   r   r   s   `          @r4   r   1StreamableHTTPServerTransport._handle_get_request  s     ))>abb //8
22F))H 7=='//4@@@33GBBB $OO//0DEE=E%%mdCCC 6&,
 -1-@-@G)* T22222F##H 7=='//4@@@ 05/P/PQUVY[^V^Q_/`ab/c,,	D2 '%!6
	@7=='//4@@@C A C
 D$ AN A 	@?@#**,,,#**,,,//???		@s   A6I:G;IGAIGBI#G$AI)!G 
GG IIIIG 2IHI'H*(IIIIIIc                   #    U R                   (       dG  U R                  S[        R                  5      nU" UR                  UR
                  U5      I Sh  vN   gU R                  X5      I Sh  vN (       d  gU R                  5       I Sh  vN   U R                  S[        R                  5      nU" UR                  UR
                  U5      I Sh  vN   g N Nk NO N7f)z8Handle DELETE requests for explicit session termination.z5Method Not Allowed: Session termination not supportedN)
rO   rs   r
   METHOD_NOT_ALLOWEDr   r   r   	terminaterw   OK)r;   ry   r   r   s       r4   r   4StreamableHTTPServerTransport._handle_delete_requestX  s      ""22G--H 7=='//4@@@33GBBBnn--MM
 w}}goot<<< A C 	 	=sI   AC!CC!/C0C!CAC!CC!C!C!C!c                 
  #    SU l         [        R                  SU R                   35        [	        U R
                  R                  5       5      nU H  nU R                  U5      I Sh  vN   M     U R
                  R                  5          U R                  b"  U R                  R                  5       I Sh  vN   U R                  b"  U R                  R                  5       I Sh  vN   U R                  b"  U R                  R                  5       I Sh  vN   U R                  b#  U R                  R                  5       I Sh  vN   gg N N Nh N; N! [         a"  n[        R                  SU 35         SnAgSnAff = f7f)zTerminate the current session, closing all streams.

Once terminated, all requests with this session ID will receive 404 Not Found.
TzTerminating session: NError closing streams: )rY   r   inforO   listrX   keysr   clearrJ   r   rK   rM   rL   r   r   )r;   request_stream_keyskeyr   s       r4   r   'StreamableHTTPServerTransport.terminateo  sM      +D,?,?+@AB #4#8#8#=#=#?@ 'C//444 ' 	##%	8''3..55777  ,''..000((4//66888!!-((//111 . 5 8081 	8LL21#677	8s   A&F(E
)"F*E 6E7.E %E&.E E.E EE FE E E E 
F E;6F;F  Fc                    #    [         SS.nU R                  (       a  U R                  U[        '   U R                  S[        R
                  US9nU" UR                  UR                  U5      I Sh  vN   g N7f)z Handle unsupported HTTP methods.zGET, POST, DELETE)rd   AllowzMethod Not Allowed)rb   N)rm   rO   ro   rs   r
   r   r   r   )r;   ry   r   rb   r   s        r4   r   9StreamableHTTPServerTransport._handle_unsupported_request  sp      .(
 -1-@-@G)*.. )) / 

 w}}goot<<<s   A.A80A61A8c                    #    U R                  X5      I S h  vN (       d  gU R                  X5      I S h  vN (       d  gg N* N7f)NFT)_validate_session_validate_protocol_version)r;   ry   r   s      r4   r   7StreamableHTTPServerTransport._validate_request_headers  s>     ++G:::44WCCC	 ;Cs   AAAAAAc                   #    U R                   (       d  gU R                  U5      nU(       dG  U R                  S[        R                  5      nU" UR
                  UR                  U5      I Sh  vN   gX0R                   :w  aG  U R                  S[        R                  5      nU" UR
                  UR                  U5      I Sh  vN   gg N\ N7f)z'Validate the session ID in the request.TzBad Request: Missing session IDNFr   )rO   r|   rs   r
   r   r   r   r   )r;   ry   r   r   r   s        r4   r  /StreamableHTTPServerTransport._validate_session  s     "" "11': "221&&H 7=='//4@@@ !4!4422:$$H 7=='//4@@@ A As%   A,C.C/ACCCCc                 @  #    UR                   R                  [        5      nUc  [        nU[        ;  af  SR                  [        5      nU R                  SU S3SU 3-   [        R                  5      nU" UR                  UR                  U5      I Sh  vN   gg N7f)z4Validate the protocol version header in the request.Nz, z+Bad Request: Unsupported protocol version: z. zSupported versions: FT)rb   r{   MCP_PROTOCOL_VERSION_HEADERr   r   joinrs   r
   r   r   r   )r;   ry   r   protocol_versionsupported_versionsr   s         r4   r  8StreamableHTTPServerTransport._validate_protocol_version  s      #??../JK #9 #>>!%+F!G22=>N=OrR();(<=>&&H
 7=='//4@@@ As   BBBBr?   c                 p  ^ ^^^	#    T R                   mT(       d  g SS[        S.nT R                  (       a  T R                  U[        '   [        R
                  [        [        [        4      " S5      u  m	nUUU U	4S jn[        UUUS9n U" UR                  UR                  U5      I Sh  vN   T	R                  5       I Sh  vN   UR                  5       I Sh  vN   g N5! [         a    [        R                  S5         NTf = f ND N.! T	R                  5       I Sh  vN    UR                  5       I Sh  vN    f = f! [         ad    [        R                  S	5        T R                  S	[         R"                  [$        5      nU" UR                  UR                  U5      I Sh  vN     gf = f7f)
zp
Replays events that would have been sent after the specified event ID.
Only used when resumability is enabled.
Nr   r   r   r   c                    >#     T IS h  vN   S[         SS 4UU4S jjn TR                  TU 5      I S h  vN nU(       a  UTR                  ;  a~  [        R                  [            " S5      TR                  U'   TR                  U   S   nU IS h  vN   U  S h  vN nTR                  U5      nTR                  U5      I S h  vN   M5  S S S 5      IS h  vN   g  N N NP NG N
 S S S 5      IS h  vN    M/  ! , IS h  vN  (       d  f       NF= f N=! , IS h  vN  (       d  f       g = f! [         a    [        R                  S5         g f = f7f)Nr~   r9   c                 f   >#    TR                  U 5      nTR                  U5      I S h  vN   g  N7fr   )r   r   )r~   r   r;   r   s     r4   
send_eventWStreamableHTTPServerTransport._replay_events.<locals>.replay_sender.<locals>.send_event  s*     )-)@)@)OJ"3"8"8"DDDs   &1/1r   r   zError in replay sender)
r&   rB   rX   r   r   r   r   r   r   r   )	r  r8   
msg_readerr~   r   rQ   r?   r;   r   s	        r4   replay_senderCStreamableHTTPServerTransport._replay_events.<locals>.replay_sender  s)    ?00EL ET E E
 +6*I*I-Yc*d$d	 %$:O:O)O?D?`?`am?nop?qD11)<)-)>)>y)I!)LJ (2z;E !M-151H1H1WJ*;*@*@*L$L$L'  100 %e (2!M %M <F (2zzzzz  1000( ! ?$$%=>?s  ED5 C!D5 'DC#ADC%DC?C+C'
 C+#&C?	C)

C?D5 DD5  E!D5 #D%D'C+)C?+C?,D7C:8D?D	DD	DD5 D2!D$"D2.D5 1E2D5 5EEEEr   zError in replay responsezError replaying events)rW   r   rO   ro   r   r   r   r1   r   r   r   r   r   r   r   rs   r
   r   r   )
r;   r?   ry   r   rb   r   r   r   rQ   r   s
   ``      @@r4   r   ,StreamableHTTPServerTransport._replay_events  s    
 ''<	A!9* 0G ""151D1D-. 493T3TUYZ]_bZbUc3def3g00? ?4 +)%2H1w}}gootDDD (..000'..000 E =  !;<= 10 (..000'..000 	A5622(00H
 7=='//4@@@	As   F6A/E !C% -C#.C% 2E D
E DE "F6#C% %DD DD 
E E E"D%#E;D><EE A%F3*F-+F30F62F33F6c                  ^ ^#    [         R                  [        [        -     " S5      u  p[         R                  [           " S5      u  nmUT l        UT l        TT l        UT l        [         R                  " 5        ISh  vN nU U4S jnUR                  U5         X#47v   [        T R                  R                  5       5       H  nT R                  U5      I Sh  vN   M     T R                  R                  5          UR                  5       I Sh  vN   UR                  5       I Sh  vN   TR                  5       I Sh  vN   UR                  5       I Sh  vN   SSS5      ISh  vN   g N N Na NK N5 N! [         a"  n[         R#                  SU 35         SnANDSnAff = f! [        T R                  R                  5       5       H  nT R                  U5      I Sh  vN    M     T R                  R                  5          UR                  5       I Sh  vN    UR                  5       I Sh  vN    TR                  5       I Sh  vN    UR                  5       I Sh  vN    f ! [         a"  n[         R#                  SU 35         SnAf SnAff = f= f GN8! , ISh  vN  (       d  f       g= f7f)zContext manager that provides read and write streams for a connection.

Yields:
    Tuple of (read_stream, write_stream) for bidirectional communication
r   Nc                    >#     T  S h  vN n U R                   nS n[        UR                  [        [        -  5      (       a"  [        UR                  R                  5      nUnObU R                  bU  [        U R                  [        5      (       a6  U R                  R                  b  [        U R                  R                  5      nUb  UO[        nS nTR                  (       a>  TR                  R                  XA5      I S h  vN n[        R                  SU SU 35        UTR                  ;   a6   TR                  U   S   R!                  [#        X5      5      I S h  vN   GMc  [,        R                  " SU S35        GM   GN| N N)! [$        R&                  [$        R(                  4 a!    TR                  R+                  US 5         GM  f = f
 g ! [.         a    [        R1                  S5         g f = f7f)NzStored z from r   zRequest stream z not found 
                                for message. Still processing message as the client
                                might reconnect and replay.zError in message router)r(   r   r   r"   r   r1   rg   r   r   related_request_idr   rW   r<   r   r   rX   r   r&   r   BrokenResourceErrorClosedResourceErrorr   loggingr   r   )r   r(   target_request_idresponse_idrequest_stream_idr)   r;   write_stream_readers         r4   message_router=StreamableHTTPServerTransport.connect.<locals>.message_router=  s    1@1D .o"1"9"9,0)%gllOl4RSS*-glloo*>K 1<- ,44@ * / 8 8 5! ! !0 8 8 K K W03O4L4L4_4_0`-ARA^,=dr)
 $(,,-1->->-J-JK\-f'fH"LL78*FCTBU)VW,0E0EES&*&;&;<M&Nq&Q&V&VWcdkWv&w w w $MM$34E3F G< !?U.8 (g !x % 9 9 % 9 9$ S
 !% 5 5 9 9:KT R RSG 2E^ ! @$$%>?@s   G=G GFGC5G F
/G 5-F"F#F' G G
G FA GG GG G=G:7G=9G::G=r  )r   r   r   r   rJ   rK   rM   rL   r   r   r  rX   r  r   r  r   r   r   )	r;   read_stream_writerread_streamwrite_streamr   r-  r8   r   r,  s	   `       @r4   connect%StreamableHTTPServerTransport.connect  sG    $ +0*K*KN]fLf*ghi*j',1,M,Mn,]^_,`)) $6 '$7!) **,,2@j MM.)@!//!%d&;&;&@&@&B!CI77	BBB "D%%++-@,33555%,,...-44666&--///M -,,| C
 6.6/  @LL#:1#!>??@ "&d&;&;&@&@&B!CI77	BBB "D%%++-@,33555%,,...-44666&--///  @LL#:1#!>??@O -,,,sD  A<K E3KJ(F.$:J(E5"J(E?E7E?-E9.E?E;E?E=E?"K-J%.K5J(7E?9E?;E?=E??
F+	F&!J(&F++J(.;J")G,*#J"I3!H$
"I3:H=
;I3I
I3,I/
-I32J"3
J	=J	J"J	J""J(%K(J?.J1/J?;K)
rW   rK   rJ   rX   rN   rY   rL   rM   rP   rO   )FNN)r9   N)9r+   r,   r-   r.   r/   rJ   r   r   r   r0   rK   r   rL   rM   r   r1   boolr6   r   rZ   propertyr]   r   r
   intr   r   rs   r   r    rw   r   r|   r&   r   r#   r   r   r   r   r   tupler   r   r   r   r   r   r   r   r  r  r   r   r   r2  r2   r*   r3   r4   rH   rH   z   sk    VZ/0JKdRYQUL+NY,FG$NUCGM).9D@GMQ3NCdJQ**
 */)->B%!d
%! #'%!  $&	%!
 5t;%! 
%!N  t     *)-

  
 	

 c3h$&
 

D #---)-	
(4/
  
 c3h$&	

 

(:w :3: : c3h < <t <B% B' B BRV B:!W !tTz9J !M7 Mt ME E ERY Eae Ejn ENZ@ Z@ Z@ Z@x=G =4 =D =.8>= = =QU = w d t w d t : t PT ,EA# EA EAt EAX\ EAN d@	%ny&@A">24	
 			
d@ d@r3   rH   )Gr/   r   r(  reabcr   r   collections.abcr   r   r   
contextlibr   dataclassesr	   httpr
   r   anyio.streams.memoryr   r   pydanticr   sse_starletter   starlette.requestsr   starlette.responsesr   starlette.typesr   r   r   mcp.server.transport_securityr   r   mcp.shared.messager   r   mcp.shared.versionr   	mcp.typesr   r   r   r   r   r   r   r    r!   r"   r#   	getLoggerr+   r   ro   r  r   rm   r   r   compilerT   r1   rD   rE   r&   rF   r6   rH   r*   r3   r4   <module>rJ     s     	 # ? ? * !   R $ - & ( 0 0 E :    
		8	$ ) 4 &  ' &   ZZ 12  
       ,489# #LJ@ J@r3   