
    ChM                     B   S r SSK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rSSKJr  SSKJr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JrJ r J!r!J"r"J#r#J$r$J%r%  \RL                  " \'5      r(\\)-  r*\\*   r+\\   r,\/ \-S-  4   r.Sr/Sr0Sr1Sr2Sr3Sr4Sr5 " S S\)5      r6 " S S\65      r7\	 " S S5      5       r8 " S S5      r9\SSSS\S4S\-S \:\-\-4   S-  S!\;\-  S"\;\-  S#\<S$\S%\Rz                  S-  S&\\>\\\)-     \\   \.4   S4   4S' jj5       r?g)(z
StreamableHTTP Client Transport Module

This module implements the StreamableHTTP transport for MCP clients,
providing support for HTTP POST requests with optional SSE streaming responses
and session management.
    N)AsyncGenerator	AwaitableCallable)asynccontextmanager)	dataclass)	timedelta)	TaskGroup)MemoryObjectReceiveStreamMemoryObjectSendStream)EventSourceServerSentEventaconnect_sse)McpHttpClientFactorycreate_mcp_http_client)ClientMessageMetadataSessionMessage)	ErrorDataInitializeResultJSONRPCErrorJSONRPCMessageJSONRPCNotificationJSONRPCRequestJSONRPCResponse	RequestIdzmcp-session-idzmcp-protocol-versionzlast-event-idzcontent-typeacceptzapplication/jsonztext/event-streamc                       \ rS rSrSrSrg)StreamableHTTPError5   z3Base exception for StreamableHTTP transport errors. N__name__
__module____qualname____firstlineno____doc____static_attributes__r       T/home/james-whalen/.local/lib/python3.13/site-packages/mcp/client/streamable_http.pyr   r   5   s    =r'   r   c                       \ rS rSrSrSrg)ResumptionError9   z*Raised when resumption request is invalid.r   Nr    r   r'   r(   r*   r*   9   s    4r'   r*   c                       \ rS rSr% Sr\R                  \S'   \\	\	4   \S'   \	S-  \S'   \
\S'   \S-  \S'   \\S	'   \\S
'   Srg)RequestContext=   z Context for a request operation.clientheadersN
session_idsession_messagemetadataread_stream_writersse_read_timeoutr   )r!   r"   r#   r$   r%   httpxAsyncClient__annotations__dictstrr   r   StreamWriterfloatr&   r   r'   r(   r-   r-   =   sF    *#s(^d
###d**$$r'   r-   c                      \ rS rSrSr    S,S\S\\\4   S-  S\\-  S\\-  S\	R                  S-  S	S4S
 jjrS\\\4   S	\\\4   4S jrS\S	\4S jrS\S	\4S jrS\	R"                  S	S4S jrS\S	S4S jr   S-S\S\S\S-  S\\/\S   4   S-  S\S	\4S jjrS\	R4                  S\S	S4S jrS\S	S4S jrS\S	S4S jr S.S\	R"                  S\S\S	S4S jjr S.S\	R"                  S\S\S	S4S jjr S \S\S	S4S! jr!S\S"\S	S4S# jr"S\	R4                  S$\#S\S%\$\%   S&\/ S4   S'\&S	S4S( jr'S\	R4                  S	S4S) jr(S	\S-  4S* jr)S+r*g)/StreamableHTTPTransportJ   z/StreamableHTTP client transport implementation.Nurlr0   timeoutr5   authreturnc                 h   Xl         U=(       d    0 U l        [        U[        5      (       a  UR	                  5       OUU l        [        U[        5      (       a  UR	                  5       OUU l        XPl        SU l        SU l	        [        [         S[         3[        [        0U R                  EU l        g)a  Initialize the StreamableHTTP transport.

Args:
    url: The endpoint URL.
    headers: Optional headers to include in requests.
    timeout: HTTP timeout for regular operations.
    sse_read_timeout: Timeout for SSE read operations.
    auth: Optional HTTPX authentication handler.
Nz, )r@   r0   
isinstancer   total_secondsrA   r5   rB   r1   protocol_versionACCEPTJSONSSECONTENT_TYPErequest_headers)selfr@   r0   rA   r5   rB   s         r(   __init__ StreamableHTTPTransport.__init__M   s    " }"2<Wi2P2Pw,,.V]0:;KY0W0W**,]m 	 	 $tfBse$$ 
 ll 
r'   base_headersc                     UR                  5       nU R                  (       a  U R                  U[        '   U R                  (       a  U R                  U[        '   U$ )zAUpdate headers with session ID and protocol version if available.)copyr1   MCP_SESSION_IDrG   MCP_PROTOCOL_VERSION)rM   rP   r0   s      r(   _prepare_request_headers0StreamableHTTPTransport._prepare_request_headersm   sD    ##%??&*ooGN#  ,0,A,AG()r'   messagec                 v    [        UR                  [        5      =(       a    UR                  R                  S:H  $ )z2Check if the message is an initialization request.
initialize)rE   rootr   methodrM   rW   s     r(   _is_initialization_request2StreamableHTTPTransport._is_initialization_requestv   s(    ',,7_GLL<O<OS_<__r'   c                 v    [        UR                  [        5      =(       a    UR                  R                  S:H  $ )z4Check if the message is an initialized notification.znotifications/initialized)rE   rZ   r   r[   r\   s     r(   _is_initialized_notification4StreamableHTTPTransport._is_initialized_notificationz   s)    ',,(;<sATATXsAssr'   responsec                     UR                   R                  [        5      nU(       a)  X l        [        R                  SU R                   35        gg)z3Extract and store session ID from response headers.zReceived session ID: N)r0   getrS   r1   loggerinfo)rM   rb   new_session_ids      r(   '_maybe_extract_session_id_from_response?StreamableHTTPTransport._maybe_extract_session_id_from_response~   s@    
 "))--n=,OKK//@AB r'   c                     [        UR                  [        5      (       a  UR                  R                  (       ah   [        R
                  " UR                  R                  5      n[        UR                  5      U l        [        R                  SU R                   35        ggg! [         aN  n[        R                  SU 35        [        R                  SUR                  R                   35         SnAgSnAff = f)z>Extract protocol version from initialization response message.zNegotiated protocol version: z=Failed to parse initialization response as InitializeResult: zRaw result: N)rE   rZ   r   resultr   model_validater:   protocolVersionrG   re   rf   	Exceptionwarning)rM   rW   init_resultexcs       r(   ,_maybe_extract_protocol_version_from_messageDStreamableHTTPTransport._maybe_extract_protocol_version_from_message   s    
 gllO449L9LE.==gll>Q>QR(+K,G,G(H%;D<Q<Q;RST :M4  E!^_b^cdegll.A.A-BCDDEs   A&B% %
C=/AC88C=sser4   original_request_idresumption_callbackis_initializationc                   #    UR                   S:X  Ga   [        R                  " UR                  5      n[        R                  SU 35        U(       a  U R                  U5        Ub6  [        UR                  [        [        -  5      (       a  X6R                  l        [        U5      nUR                  U5      I Sh  vN   UR                  (       a!  U(       a  U" UR                  5      I Sh  vN   [        UR                  [        [        -  5      $ [        R!                  SUR                    35        g Nz NJ! [         a9  n[        R                  S5        UR                  U5      I Sh  vN     SnAgSnAff = f7f)z@Handle an SSE event, returning True if the response is complete.rW   zSSE message: NzError parsing SSE messageFzUnknown SSE event: )eventr   model_validate_jsondatare   debugrr   rE   rZ   r   r   idr   sendrn   	exceptionro   )	rM   rt   r4   ru   rv   rw   rW   r2   rq   s	            r(   _handle_sse_event)StreamableHTTPTransport._handle_sse_event   s,     99	!(<<SXXF}WI67 %EEgN '2z',,P_bnPn7o7o&9LLO"0"9(--o>>> 661-cff555 "',,,0NOO NN0<=! ? 6    !<=(--c222s_   FB(D< =D8>1D< /D:0$D< $F8D< :D< <
E?)E:/E20E:5F:E??Fr/   c                 ~  #     U R                   (       d  gU R                  U R                  5      n[        USU R                  U[
        R                  " U R                  U R                  S9S9 ISh  vN nUR                  R                  5         [        R                  S5        UR                  5         Sh  vN nU R                  XR5      I Sh  vN   M$   Ng N! N

 SSS5      ISh  vN    g! , ISh  vN  (       d  f       g= f! [         a"  n[        R                  SU 35         SnAgSnAff = f7f)z0Handle GET stream for server-initiated messages.NGETreadr0   rA   zGET SSE connection establishedzGET stream error (non-fatal): )r1   rU   rL   r   r@   r6   TimeoutrA   r5   rb   raise_for_statusre   r|   	aiter_sser   rn   )rM   r/   r4   r0   event_sourcert   rq   s          r(   handle_get_stream)StreamableHTTPTransport.handle_get_stream   s    	A??33D4H4HIG#dll9N9NO  %%668=>!-!7!7!9 J#00IIIJI ":       	ALL9#?@@	As   D=D D=AD 3C4D 7A C47C!;C<C!?C4CC4D C!C4!C4"D -C0.D 3D=4D:C=;DD 
D=D 
D:D50D=5D::D=ctxc                 :  #    U R                  UR                  5      nUR                  (       a9  UR                  R                  (       a  UR                  R                  U[        '   O[        S5      eSn[        UR                  R                  R                  [        5      (       a*  UR                  R                  R                  R                  n[        UR                  SU R                  U[        R                   " U R"                  U R$                  S9S9 ISh  vN nUR&                  R)                  5         [*        R-                  S5        UR/                  5         Sh  vN nU R1                  UUR2                  UUR                  (       a  UR                  R4                  OS5      I Sh  vN nU(       d  M_  UR&                  R7                  5       I Sh  vN     SSS5      ISh  vN   g N N NE N
 N N! , ISh  vN  (       d  f       g= f7f)z/Handle a resumption request using GET with SSE.z.Resumption request requires a resumption tokenNr   r   r   z)Resumption GET SSE connection established)rU   r0   r3   resumption_tokenLAST_EVENT_IDr*   rE   r2   rW   rZ   r   r}   r   r/   r@   r6   r   rA   r5   rb   r   re   r|   r   r   r4   on_resumption_token_updateaclose)rM   r   r0   ru   r   rt   is_completes          r(   _handle_resumption_request2StreamableHTTPTransport._handle_resumption_request   s    //<<<CLL99%(\\%B%BGM"!"RSS #c))1166GG"%"5"5"="="B"B"E"EJJHHMM$,,T5J5JK
 
 !!224LLDE)335 	c$($:$:**'?B||CLL;;QU	%  ;&//66888'
 
 
	 9 6
 
 
 
s   DHG5H"A H"G=&G7'G=*A	H3G94	HHG;H$H/G?0H7G=9H;H=H?HHH
HHc           
        #    U R                  UR                  5      nUR                  R                  nU R	                  U5      nUR
                  R                  SU R                  UR                  SSSS9US9 ISh  vN nUR                  S:X  a'  [        R                  S5         SSS5      ISh  vN   gUR                  S	:X  ai  [        UR                  [        5      (       a8  U R                  UR                   UR                  R"                  5      I Sh  vN    SSS5      ISh  vN   gUR%                  5         U(       a  U R'                  U5        [        UR                  [        5      (       a  UR                  R)                  [*        S
5      R-                  5       nUR/                  [0        5      (       a%  U R3                  XQR                   U5      I Sh  vN   OYUR/                  [4        5      (       a  U R7                  XQU5      I Sh  vN   O$U R9                  UUR                   5      I Sh  vN   SSS5      ISh  vN   g GN GN GN; GN- N{ NH N% N! , ISh  vN  (       d  f       g= f7f)z/Handle a POST request with response processing.POSTTjson)by_aliasmodeexclude_none)r   r0   N   zReceived 202 Acceptedi   )rU   r0   r2   rW   r]   r/   streamr@   
model_dumpstatus_codere   r|   rE   rZ   r   _send_session_terminated_errorr4   r}   r   rh   rd   rK   lower
startswithrI   _handle_json_responserJ   _handle_sse_response_handle_unexpected_content_type)rM   r   r0   rW   rw   rb   content_types          r(   _handle_post_request,StreamableHTTPTransport._handle_post_request   s    //<%%-- ;;GD::$$HH##TT#R	 % 
 

 ##s*45
 
 
 ##s*gllN;;==..   !
 
 
$ %%' <<XF ',,77'//33L"EKKM**40044X?U?UWhiii!,,S1133HCTUUU>>$..  ?
 
 

6 jU?
 
 
 
s   A<I?>I?I?'I%)I?4I5I?:A"I%II%"I?-I.I?3B.I%!I"4I%I$I%;I!<I% I?I#I?I?I%I?I%I%!I%#I?%I<+I.,I<8I?c                 v  #     UR                  5       I Sh  vN n[        R                  " U5      nU(       a  U R                  U5        [	        U5      nUR                  U5      I Sh  vN   g NW N! [         a9  n[        R                  S5        UR                  U5      I Sh  vN     SnAgSnAff = f7f)z%Handle JSON response from the server.NzError parsing JSON response)	areadr   rz   rr   r   r~   rn   re   r   )rM   rb   r4   rw   contentrW   r2   rq   s           r(   r   -StreamableHTTPTransport._handle_json_response(  s     	/$NN,,G$88AG !AA'J,W5O$))/::: - ; 	/:;$))#...	/s]   B9A3 A/AA3 )A1*A3 .B9/A3 1A3 3
B6=)B1&B)'B1,B91B66B9c                   #     [        U5      nUR                  5         Sh  vN nU R                  UUR                  UR                  (       a  UR                  R
                  OSUS9I Sh  vN nU(       d  M]  UR                  5       I Sh  vN     g Nr N) N

 g! [         aC  n[        R                  S5        UR                  R                  U5      I Sh  vN     SnAgSnAff = f7f)z$Handle SSE response from the server.N)rv   rw   zError reading SSE stream:)r   r   r   r4   r3   r   r   rn   re   r   r~   )rM   rb   r   rw   r   rt   r   es           r(   r   ,StreamableHTTPTransport._handle_sse_response=  s     	1&x0L)335 c$($:$:**TWT`T`)P)Pfj&7	 %; %  ;"//+++ , 6  	189((--a000	1s   C.B BBBAB .B/	B <B BB C.BB B B C.
C+(3C&CC&!C.&C++C.r   c                    #    SU 3n[         R                  U5        UR                  [        U5      5      I Sh  vN   g N7f)z+Handle unexpected content type in response.zUnexpected content type: N)re   errorr~   
ValueError)rM   r   r4   	error_msgs       r(   r   7StreamableHTTPTransport._handle_unexpected_content_typeV  s8      0~>	Y %%j&;<<<s   8AA A
request_idc           	         #    [        SU[        SSS9S9n[        [        U5      5      nUR	                  U5      I Sh  vN   g N7f)z)Send a session terminated error response.z2.0iX  zSession terminated)coderW   )jsonrpcr}   r   N)r   r   r   r   r~   )rM   r4   r   jsonrpc_errorr2   s        r(   r   6StreamableHTTPTransport._send_session_terminated_error`  sG      %0DE

 ))FG %%o666s   <AAAwrite_stream_readerwrite_streamstart_get_streamtgc                   ^ ^^#     U ISh  vN   U  Sh  vN nUR                   n[        UR                  [        5      (       a  UR                  OSn	[	        U	=(       a    U	R
                  5      m[        R                  SU 35        T R                  U5      (       a  U" 5         [        UT R                  T R                  UU	UT R                  S9mUUU 4S jn
[        UR                  [        5      (       a  UR                  U
5        M  U
" 5       I Sh  vN   GM   GN GN N
 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UR%                  5       I Sh  vN    UR%                  5       I Sh  vN    g! UR%                  5       I Sh  vN    UR%                  5       I Sh  vN    f = f7f)z&Handle writing requests to the server.NzSending client message: )r/   r0   r1   r2   r3   r4   r5   c                     >#    T(       a  TR                  T 5      I S h  vN   g TR                  T 5      I S h  vN   g  N N7fN)r   r   )r   is_resumptionrM   s   r(   handle_request_asyncAStreamableHTTPTransport.post_writer.<locals>.handle_request_async  s:     ("&"A"A#"FFF"&";";C"@@@ G@s   A?AAAAzError in post_writer)rW   rE   r3   r   boolr   re   r|   r`   r-   rL   r1   r5   rZ   r   
start_soonrn   r   r   )rM   r/   r   r4   r   r   r   r2   rW   r3   r   r   r   s   `          @@r(   post_writer#StreamableHTTPTransport.post_writern  s    -	(**-@ %5/-55G &o&>&>@UVV (00!  %))Oh6O6O$PMLL#;G9!EF 88AA(*(% $ 4 4#'??(7!)+=)-)>)>CA "',,??&:;2444M +%5J 5K .A +*****P  	534	5 %++---%%''' %++---%%'''s   G&E D"E D=D*D%D*C>D=D(D="E %D*(D=*D=+E 6D97E <F/ =EEEE F/ E E96F/ 8E99F/ <G&FG&(F+)G&/G#GG#GG##G&c                   #    U R                   (       d  g U R                  U R                  5      nUR                  U R                  US9I Sh  vN nUR
                  S:X  a  [        R                  S5        gUR
                  S;  a#  [        R                  SUR
                   35        gg N^! [         a"  n[        R                  SU 35         SnAgSnAff = f7f)z2Terminate the session by sending a DELETE request.N)r0   i  z)Server does not allow session termination)      zSession termination failed: )
r1   rU   rL   deleter@   r   re   r|   ro   rn   )rM   r/   r0   rb   rq   s        r(   terminate_session)StreamableHTTPTransport.terminate_session  s     		A33D4H4HIG#]]488W]EEH##s*HI%%Z7!=h>R>R=STU 8	 F  	ANN9#?@@	AsL   C8B/ B-)B/ 8C92B/ +C-B/ /
C9CCCCc                     U R                   $ )zGet the current session ID.)r1   )rM   s    r(   get_session_id&StreamableHTTPTransport.get_session_id  s    r'   )rB   r0   rG   rL   r1   r5   rA   r@   )N   ,  N)NNF)F)+r!   r"   r#   r$   r%   r:   r9   r<   r   r6   AuthrN   rU   r   r   r]   r`   Responserh   rr   r   r;   r   r   r   r   r7   r   r-   r   r   r   r   r   r   StreamReaderr   r   r	   r   r   r   r&   r   r'   r(   r>   r>   J   s   9
 *.%'.4"&

 c3h$&
 "	

  )+
 jj4
 

@T#s(^ SRUX `. `T `tN tt tC..C 
CEE 
E& 15GK"''' )' '-	'
 &seYt_&<=D'  ' 
'RA!!A )A 
	A8 N  t  D(n ( (\ #(	/../ )/  	/
 
/2 #(	1..1 1  	1
 
12== )= 
	=7(7 7 
	77(!!7( *7( )	7(
 -^<7( #2t8,7( 7( 
7(rAe.?.? AD A d
 r'   r>   r   r   Tr@   r0   rA   r5   terminate_on_closehttpx_client_factoryrB   rC   c                
  ^^^^#    [        XX#U5      m[        R                  [        [        -     " S5      u  mn[        R                  [           " S5      u  p[        R
                  " 5        ISh  vN m [        R                  SU  35        U" TR                  [        R                  " TR                  TR                  S9TR                  S9 ISh  vN mSUUUU4S jjn
TR                  TR                  TU	TUU
T5         UUTR                   47v   TR"                  (       a   U(       a  TR%                  T5      I Sh  vN   TR&                  R)                  5         SSS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 GNE N Nt! TR"                  (       a!  U(       a  TR%                  T5      I Sh  vN    TR&                  R)                  5         f = f N! , ISh  vN  (       d  f       N= f N N! TR+                  5       I Sh  vN    UR+                  5       I Sh  vN    f = f N! , ISh  vN  (       d  f       g= f7f)a  
Client transport for StreamableHTTP.

`sse_read_timeout` determines how long (in seconds) the client will wait for a new
event before disconnecting. All other HTTP operations are controlled by `timeout`.

Yields:
    Tuple containing:
        - read_stream: Stream for reading messages from the server
        - write_stream: Stream for sending messages to the server
        - get_session_id_callback: Function to retrieve the current session ID
r   Nz'Connecting to StreamableHTTP endpoint: r   )r0   rA   rB   c                  @   > TR                  TR                  T T5        g r   )r   r   )r/   r4   r   	transports   r(   r   /streamablehttp_client.<locals>.start_get_stream  s    MM)"="=vGYZr'   )rC   N)r>   anyiocreate_memory_object_streamr   rn   create_task_groupre   r|   rL   r6   r   rA   r5   rB   r   r   r   r1   r   cancel_scopecancelr   )r@   r0   rA   r5   r   r   rB   read_streamr   r   r   r/   r4   r   r   s              @@@@r(   streamablehttp_clientr     s    : (gQUVI&+&G&GYbHb&cde&f#(-(I(I.(YZ[(\%L&&((B"	(LLB3%HI+!11i&7&7i>X>XY^^  [ [ ))'& $	-#$!00  !++0B'99&AAAOO**,9 < %++---%%'''G )((6 B !++0B'99&AAAOO**,9   < .' %++---%%'''G )(((s  A-J3F84J7I)9AH0F;H0-H
F?,HF=	H'H02H3H07I)
H,I)"H.#I)'J2I'3J;H0=H?-H,G/- HHH0H)	HH)	%H0,I).I)0I$I
I$I 
I$$I)'J)J /I20J <J)@r%   loggingcollections.abcr   r   r   
contextlibr   dataclassesr   datetimer   r   r6   	anyio.abcr	   anyio.streams.memoryr
   r   	httpx_sser   r   r   mcp.shared._httpx_utilsr   r   mcp.shared.messager   r   	mcp.typesr   r   r   r   r   r   r   r   	getLoggerr!   re   rn   SessionMessageOrErrorr;   r   r:   GetSessionIdCallbackrS   rT   r   rK   rH   rI   rJ   r   r*   r-   r>   r9   r<   r   r   tupler   r   r'   r(   <module>r      s    ? ? * !     R @ @ P D	 	 	 
		8	$ '2 %&;<(8C$J/ !- 	 >) >5) 5 	 	 	o od  &*!#*0#1G"D(	D(#s(^d"D( YD( i'	D(
 D( /D( **t
D( 	!.9"<=~.	
 	
D( D(r'   