Ë
    ïñþi¤n  ã                   ó  — d Z ddlZddlZddlmZmZmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZmZ ddlmZ ddlZddlZdd	lmZ dd
lmZmZ ddlmZmZmZ ddlmZ ddlmZm Z  ddl!m"Z"m#Z# ddl$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,  ejZ                  e.«      Z/e#e0z  Z1ee1   Z2ee#   Z3eg e4dz  f   Z5dZ6dZ7dZ8dZ9dZ:dZ;dZ<dZ=dZ> e?«       Z@ G d„ de0«      ZA G d„ deA«      ZBe	 G d„ d«      «       ZC G d„ d «      ZDedd!d"œd#e4d$ejŠ                  dz  d%eFd&eeGee#e0z     ee#   e5f   df   fd'„«       ZHe ed(«      dd)d*d!e dfd#e4d+eIe4e4f   dz  d,eJez  d-eJez  d%eFd.ed/ej–                  dz  d&eeGee#e0z     ee#   e5f   df   fd0„«       «       ZLy)1zÕ
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)ÚAnyÚoverload)Úwarn)Ú	TaskGroup)ÚMemoryObjectReceiveStreamÚMemoryObjectSendStream)ÚEventSourceÚServerSentEventÚaconnect_sse)Ú
deprecated)ÚMcpHttpClientFactoryÚcreate_mcp_http_client)ÚClientMessageMetadataÚSessionMessage)Ú	ErrorDataÚInitializeResultÚJSONRPCErrorÚJSONRPCMessageÚJSONRPCNotificationÚJSONRPCRequestÚJSONRPCResponseÚ	RequestIdzmcp-session-idzmcp-protocol-versionzlast-event-idiè  é   zcontent-typeÚacceptzapplication/jsonztext/event-streamc                   ó   — e Zd ZdZy)ÚStreamableHTTPErrorz3Base exception for StreamableHTTP transport errors.N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úZ/root/aria/mcps/aria-brain/venv/lib/python3.12/site-packages/mcp/client/streamable_http.pyr"   r"   C   s   „ Ú=r)   r"   c                   ó   — e Zd ZdZy)ÚResumptionErrorz*Raised when resumption request is invalid.Nr#   r(   r)   r*   r,   r,   G   s   „ Ú4r)   r,   c                   ó–   — e Zd ZU dZej
                  ed<   edz  ed<   eed<   e	dz  ed<   e
ed<   dZeeef   dz  ed<   dZedz  ed	<   y)
ÚRequestContextz Context for a request operation.ÚclientNÚ
session_idÚsession_messageÚmetadataÚread_stream_writerÚheadersÚsse_read_timeout)r$   r%   r&   r'   ÚhttpxÚAsyncClientÚ__annotations__Ústrr   r   ÚStreamWriterr4   Údictr5   Úfloatr(   r)   r*   r.   r.   K   sX   … á*à×ÑÓØ�d‘
ÓØ#Ó#Ø# dÑ*Ó*Ø$Ó$Ø%)€GˆT�#�s�(‰^˜dÑ"Ó)Ø%)Ð�e˜d‘lÔ)r)   r.   c                   óú  — e Zd ZdZededdfd„«       Ze ed«      	 	 	 	 d0dedeeef   dz  de	e
z  d	e	e
z  d
ej                  dz  ddfd„«       «       Zeeeefdededed	ed
eddfd„Zdeeef   fd„Zdedefd„Zdedefd„Zdej(                  ddfd„Zdeddfd„Z	 	 	 d1dedededz  deeged   f   dz  dedefd„Zdej:                  deddfd„Zdeddfd„Z deddfd„Z!	 d2dej(                  dededdfd„Z"	 d2dej(                  dededdfd „Z#	 	 d3ded!ed"e$dz  d#e$ddf
d$„Z%d%ededdfd&„Z&ded'eddfd(„Z'dej:                  d)e(ded*e)e*   d+eg df   d,e+ddfd-„Z,dej:                  ddfd.„Z-dedz  fd/„Z.y)4ÚStreamableHTTPTransportz/StreamableHTTP client transport implementation.ÚurlÚreturnNc                  ó   — y ©Nr(   )Úselfr?   s     r*   Ú__init__z StreamableHTTPTransport.__init__[   s   € Ø*-r)   zyParameters headers, timeout, sse_read_timeout, and auth are deprecated. Configure these on the httpx.AsyncClient instead.r4   Útimeoutr5   Úauthc                  ó   — y rB   r(   )rC   r?   r4   rE   r5   rF   s         r*   rD   z StreamableHTTPTransport.__init__^   s   € ð r)   c                 óH  — g }|t         ur|j                  d«       |t         ur|j                  d«       |t         ur|j                  d«       |t         ur|j                  d«       |r%t        ddj                  |«      › d�t        d¬	«       || _        d
| _        d
| _        y
)aS  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.
        r4   rE   r5   rF   zParameters ú, zV are deprecated and will be ignored. Configure these on the httpx.AsyncClient instead.r   )Ú
stacklevelN)Ú_UNSETÚappendr   ÚjoinÚDeprecationWarningr?   r0   Úprotocol_version)rC   r?   r4   rE   r5   rF   Údeprecated_paramss          r*   rD   z StreamableHTTPTransport.__init__l   sª   € ð$ (*ÐØœ&Ñ Ø×$Ñ$ YÔ/Øœ&Ñ Ø×$Ñ$ YÔ/Ø¤6Ñ)Ø×$Ñ$Ð%7Ô8Ø”vÑØ×$Ñ$ VÔ,áÜØ˜dŸi™iÐ(9Ó:Ð;ð <Dð Dä"Øõ	ð ˆŒØˆŒØ $ˆÕr)   c                 óÌ   — i }t         › dt        › �|t        <   t         |t        <   | j                  r| j                  |t
        <   | j                  r| j                  |t        <   |S )z»Build MCP-specific request headers.

        These headers will be merged with the httpx.AsyncClient's default headers,
        with these MCP-specific headers taking precedence.
        rI   )ÚJSONÚSSEÚACCEPTÚCONTENT_TYPEr0   ÚMCP_SESSION_IDrO   ÚMCP_PROTOCOL_VERSION)rC   r4   s     r*   Ú_prepare_headersz(StreamableHTTPTransport._prepare_headers”   s[   € ð #%ˆä!˜F "¤S EÐ*ˆ”‰Ü $ˆ”Ñà�?Š?Ø&*§o¡oˆG”NÑ#Ø× Ò Ø,0×,AÑ,AˆGÔ(Ñ)Øˆr)   Úmessagec                 ól   — t        |j                  t        «      xr |j                  j                  dk(  S )z2Check if the message is an initialization request.Ú
initialize)Ú
isinstanceÚrootr   Úmethod©rC   rY   s     r*   Ú_is_initialization_requestz2StreamableHTTPTransport._is_initialization_request¥   s(   € ä˜'Ÿ,™,¬Ó7Ò_¸G¿L¹L×<OÑ<OÐS_Ñ<_Ð_r)   c                 ól   — t        |j                  t        «      xr |j                  j                  dk(  S )z4Check if the message is an initialized notification.znotifications/initialized)r\   r]   r   r^   r_   s     r*   Ú_is_initialized_notificationz4StreamableHTTPTransport._is_initialized_notification©   s)   € ä˜'Ÿ,™,Ô(;Ó<ÒsÀÇÁ×ATÑATÐXsÑAsÐsr)   Úresponsec                 óš   — |j                   j                  t        «      }|r*|| _        t        j                  d| j                  › �«       yy)z3Extract and store session ID from response headers.zReceived session ID: N)r4   ÚgetrV   r0   ÚloggerÚinfo)rC   rc   Únew_session_ids      r*   Ú'_maybe_extract_session_id_from_responsez?StreamableHTTPTransport._maybe_extract_session_id_from_response­   sB   € ð
 "×)Ñ)×-Ñ-¬nÓ=ˆÙØ,ˆDŒOÜ�K‰KÐ/°·±Ð/@ÐAÕBð r)   c                 óè  — t        |j                  t        «      r~|j                  j                  rg	 t	        j
                  |j                  j                  «      }t        |j                  «      | _        t        j                  d| j                  › �«       yyy# t        $ rN}t        j                  d|› �«       t        j                  d|j                  j                  › �«       Y d}~yd}~ww xY w)z>Extract protocol version from initialization response message.zNegotiated protocol version: z=Failed to parse initialization response as InitializeResult: zRaw result: N)r\   r]   r   Úresultr   Úmodel_validater9   ÚprotocolVersionrO   rf   rg   Ú	ExceptionÚwarning)rC   rY   Úinit_resultÚexcs       r*   Ú,_maybe_extract_protocol_version_from_messagezDStreamableHTTPTransport._maybe_extract_protocol_version_from_message·   sÄ   € ô
 �g—l‘l¤OÔ4¸¿¹×9LÒ9Lð	Eä.×=Ñ=¸g¿l¹l×>QÑ>QÓR�Ü(+¨K×,GÑ,GÓ(H�Ô%Ü—‘Ð;¸D×<QÑ<QÐ;RÐSÕTð :MÐ4øô ò EÜ—‘ØSÐTWÐSXÐYôô —‘ ¨g¯l©l×.AÑ.AÐ-BÐC×DÑDûð	Eús   ²A%B Â	C1Â#AC,Ã,C1Ússer3   Úoriginal_request_idÚresumption_callbackÚis_initializationc              ƒ   óJ  K  — |j                   dk(  �r!|j                  s)|j                  r|r ||j                  «      ƒ d{  –—†  y	 t        j                  |j                  «      }t
        j                  d|› �«       |r| j                  |«       |�2t        |j                  t        t        z  «      r||j                  _        t        |«      }|j                  |«      ƒ d{  –—†  |j                  r|r ||j                  «      ƒ d{  –—†  t        |j                  t        t        z  «      S t
        j!                  d|j                   › �«       y7 �Œ7 Œs7 ŒM# t        $ r9}t
        j                  d«       |j                  |«      ƒ d{  –—†7   Y d}~yd}~ww xY w­w)z@Handle an SSE event, returning True if the response is complete.rY   NFzSSE message: zError parsing SSE messagezUnknown SSE event: )ÚeventÚdataÚidr   Úmodel_validate_jsonrf   Údebugrr   r\   r]   r   r   r   Úsendrn   Ú	exceptionro   )	rC   rs   r3   rt   ru   rv   rY   r1   rq   s	            r*   Ú_handle_sse_eventz)StreamableHTTPTransport._handle_sse_eventÈ   sY  è ø€ ð �9‰9˜	Ó!à—8’8à—6’6Ñ1Ù-¨c¯f©fÓ5×5Ð5ØðÜ(×<Ñ<¸S¿X¹XÓF�Ü—‘˜}¨W¨IÐ6Ô7ñ %Ø×EÑEÀgÔNð 'Ð2´zÀ'Ç,Á,ÔP_ÔbnÑPnÔ7oØ&9�G—L‘L”Oä"0°Ó"9�Ø(×-Ñ-¨oÓ>×>Ð>ð —6’6Ñ1Ù-¨c¯f©fÓ5×5Ð5ô " '§,¡,´Ä,Ñ0NÓOÐOô �N‰NÐ0°·±°Ð<Ô=Øð? 6ùð ?øð 6ùô ò Ü× Ñ Ð!<Ô=Ø(×-Ñ-¨cÓ2×2Ñ2Üûðüsm   ‚A F#ÁEÁF#Á	BE Ã&EÃ''E ÄEÄ$E Ä3%F#ÅE ÅE Å	F Å')FÆFÆFÆF#ÆF Æ F#r/   c              ƒ   óž  K  — d}d}d}|t         k  rß	 | j                  sy| j                  «       }|r	||t        <   t	        |d| j
                  |¬«      4 ƒd{  –—† }|j                  j                  «        t        j                  d«       |j                  «       2 3 d{  –—† }|j                  r|j                  }|j                  �|j                  }| j                  ||«      ƒ d{  –—†  ŒTyy7 Œ™7 ŒS7 Œ6 d}ddd«      ƒd{  –—†7   n# 1 ƒd{  –—†7  sw Y   nxY wn3# t        $ r'}	t        j                  d|	› �«       |dz  }Y d}	~	nd}	~	ww xY w|t         k\  rt        j                  dt         › d	�«       y|�|nt        }
t        j!                  d
|
› d�«       t#        j$                  |
dz  «      ƒ d{  –—†7   |t         k  r�ŒºŒÝ­w)zDHandle GET stream for server-initiated messages with auto-reconnect.Nr   ÚGET©r4   zGET SSE connection establishedzGET stream error: é   z&GET stream max reconnection attempts (ú
) exceededz)GET stream disconnected, reconnecting in zms...ç     @�@)ÚMAX_RECONNECTION_ATTEMPTSr0   rX   ÚLAST_EVENT_IDr   r?   rc   Úraise_for_statusrf   r|   Ú	aiter_sserz   Úretryr   rn   ÚDEFAULT_RECONNECTION_DELAY_MSrg   ÚanyioÚsleep)rC   r/   r3   Úlast_event_idÚretry_interval_msÚattemptr4   Úevent_sourcers   rq   Údelay_mss              r*   Úhandle_get_streamz)StreamableHTTPTransport.handle_get_stream÷   sÄ  è ø€ ð %)ˆØ(,ÐØˆàÔ1Ò1ð Ø—’Øà×/Ñ/Ó1�Ù Ø-:�GœMÑ*ä'ØØØ—H‘HØ#ô	÷  ð  ð
 "Ø ×)Ñ)×:Ñ:Ô<Ü—L‘LÐ!AÔBà%1×%;Ñ%;Ó%=÷ Nð N˜càŸ6š6Ø,/¯F©F˜MàŸ9™9Ð0Ø03·	±	Ð-à"×4Ñ4°SÐ:LÓM×MÑMøð5 2ð øðNøð Nøð &>ð  �G÷) ÷  ÷  ÷  ó  üô, ò Ü—‘Ð1°#°Ð7Ô8Ø˜1‘•ûðúð Ô3Ò3Ü—‘ÐEÔF_ÐE`Ð`jÐkÔlØð ->Ð,IÑ(ÔOlˆHÜ�K‰KÐCÀHÀ:ÈUÐSÔTÜ—+‘+˜h¨Ñ/Ó0×0Ñ0ðU Ô1Ô1úsÅ   ‚G“D# ŸG 8D# ÁC2ÁD# ÁA DÂC8Â C4Â!C8Â$ADÃ*C6Ã+DÃ0GÃ2D# Ã4C8Ã6DÃ8DÃ;D# ÄD	ÄD# ÄDÄDÄDÄD# Ä"GÄ#	EÄ,EÅ	GÅEÅA(GÆ;F>Æ<GÚctxc              ƒ   óœ  K  — | j                  «       }|j                  r4|j                  j                  r|j                  j                  |t        <   nt	        d«      ‚d}t        |j                  j                  j                  t        «      r*|j                  j                  j                  j                  }t        |j                  d| j                  |¬«      4 ƒd{  –—† }|j                  j                  «        t         j#                  d«       |j%                  «       2 3 d{  –—† }| j'                  ||j(                  ||j                  r|j                  j*                  nd«      ƒ d{  –—† }|sŒT|j                  j-                  «       ƒ d{  –—†   ddd«      ƒd{  –—†  y7 ŒË7 Œ…7 Œ?7 Œ6 Œ7 Œ# 1 ƒd{  –—†7  sw Y   yxY w­w)z/Handle a resumption request using GET with SSE.z.Resumption request requires a resumption tokenNr�   r‚   z)Resumption GET SSE connection established)rX   r2   Úresumption_tokenr‡   r,   r\   r1   rY   r]   r   rz   r   r/   r?   rc   rˆ   rf   r|   r‰   r   r3   Úon_resumption_token_updateÚaclose)rC   r”   r4   rt   r‘   rs   Úis_completes          r*   Ú_handle_resumption_requestz2StreamableHTTPTransport._handle_resumption_request-  s‚  è ø€ à×'Ñ'Ó)ˆØ�<Š<˜CŸL™L×9Ò9Ø%(§\¡\×%BÑ%BˆG”MÒ"ä!Ð"RÓSÐSð #ÐÜ�c×)Ñ)×1Ñ1×6Ñ6¼ÔGØ"%×"5Ñ"5×"=Ñ"=×"BÑ"B×"EÑ"EÐäØ�J‰JØØ�H‰HØô	
÷ 	ð 	ð
 Ø×!Ñ!×2Ñ2Ô4Ü�L‰LÐDÔEà)×3Ñ3Ó5÷ 	ð 	�cØ$(×$:Ñ$:ØØ×*Ñ*Ø'Ø?B¿|º|�C—L‘L×;Ò;ÐQUó	%÷ �ò Ø&×/Ñ/×6Ñ6Ó8×8Ð8Ø÷%	÷ 	ñ 	øð	øðøð 9øð 6øð	ø÷ 	÷ 	ñ 	üs˜   ‚CGÃF+Ã GÃ#A F7Ä#F3Ä'F-Ä(F3Ä+AF7Å/F/Å0F7Å7F7ÆF1ÆF7ÆGÆ%F5Æ&GÆ-F3Æ/F7Æ1F7Æ3F7Æ5GÆ7G	Æ=G Æ>G	ÇGc           	   ƒ   ó¼  K  — | j                  «       }|j                  j                  }| j                  |«      }|j                  j                  d| j                  |j                  ddd¬«      |¬«      4 ƒd{  –—† }|j                  dk(  r't        j                  d«       	 ddd«      ƒd{  –—†  y|j                  d	k(  rdt        |j                  t        «      r8| j                  |j                  |j                  j                   «      ƒ d{  –—†  	 ddd«      ƒd{  –—†  y|j#                  «        |r| j%                  |«       t        |j                  t        «      r¾|j&                  j)                  t*        d
«      j-                  «       }|j/                  t0        «      r&| j3                  ||j                  |«      ƒ d{  –—†  nU|j/                  t4        «      r| j7                  |||«      ƒ d{  –—†  n$| j9                  ||j                  «      ƒ d{  –—†  ddd«      ƒd{  –—†  y7 �Œº7 �Œˆ7 �Œ)7 �Œ7 Œw7 ŒH7 Œ%7 Œ# 1 ƒd{  –—†7  sw Y   yxY w­w)z/Handle a POST request with response processing.ÚPOSTTÚjson)Úby_aliasÚmodeÚexclude_none)r�   r4   NéÊ   zReceived 202 Acceptedi”  Ú )rX   r1   rY   r`   r/   Ústreamr?   Ú
model_dumpÚstatus_coderf   r|   r\   r]   r   Ú_send_session_terminated_errorr3   rz   rˆ   ri   r4   re   rU   ÚlowerÚ
startswithrR   Ú_handle_json_responserS   Ú_handle_sse_responseÚ_handle_unexpected_content_type)rC   r”   r4   rY   rv   rc   Úcontent_types          r*   Ú_handle_post_requestz,StreamableHTTPTransport._handle_post_requestN  s  è ø€ à×'Ñ'Ó)ˆØ×%Ñ%×-Ñ-ˆØ ×;Ñ;¸GÓDÐà—:‘:×$Ñ$ØØ�H‰HØ×#Ñ#¨T¸ÈTÐ#ÓRØð	 %ó 
÷ "	ð "	ð
 Ø×#Ñ# sÒ*Ü—‘Ð4Ô5Ø÷"	÷ "	ð "	ð ×#Ñ# sÒ*Ü˜gŸl™l¬NÔ;Ø×=Ñ=Ø×.Ñ.ØŸ™Ÿ™ó÷ ð ð ÷!"	÷ "	ð "	ð$ ×%Ñ%Ô'Ù Ø×<Ñ<¸XÔFô ˜'Ÿ,™,¬Ô7Ø'×/Ñ/×3Ñ3´LÀ"ÓE×KÑKÓM�Ø×*Ñ*¬4Ô0Ø×4Ñ4°X¸s×?UÑ?UÐWhÓi×iÑiØ!×,Ñ,¬SÔ1Ø×3Ñ3°H¸cÐCTÓU×UÑUà×>Ñ>Ø$Ø×.Ñ.ó÷ ð ÷?"	÷ "	ñ "	ùð "	ùðùð"	ùð6 jøàUøðøð?"	ø÷ "	÷ "	ñ "	üsÎ   ‚A7IÁ9H3Á:IÁ=&IÂ#IÂ.H6Â/IÂ4AIÄH9ÄIÄIÄ!H<Ä"IÄ'B IÇH?Ç0IÇ8IÇ9$IÈIÈIÈ"IÈ-IÈ.IÈ6IÈ9IÈ<IÈ?IÉIÉIÉIÉIÉIÉIÉIc              ƒ   óh  K  — 	 |j                  «       ƒ d{  –—† }t        j                  |«      }|r| j                  |«       t	        |«      }|j                  |«      ƒ d{  –—†  y7 ŒQ7 Œ# t        $ r9}t        j                  d«       |j                  |«      ƒ d{  –—†7   Y d}~yd}~ww xY w­w)z%Handle JSON response from the server.NzError parsing JSON response)	Úareadr   r{   rr   r   r}   rn   rf   r~   )rC   rc   r3   rv   ÚcontentrY   r1   rq   s           r*   r©   z-StreamableHTTPTransport._handle_json_responsex  s˜   è ø€ ð	/Ø$ŸN™NÓ,×,ˆGÜ$×8Ñ8¸ÓAˆGñ !Ø×AÑAÀ'ÔJä,¨WÓ5ˆOØ$×)Ñ)¨/Ó:×:Ñ:ð -øð ;ùÜò 	/Ü×ÑÐ:Ô;Ø$×)Ñ)¨#Ó.×.Ö.ûð	/üs]   ‚B2„A- —A)˜AA- Á#A+Á$A- Á(B2Á)A- Á+A- Á-	B/Á6)B*ÂB"Â B*Â%B2Â*B/Â/B2c              ƒ   ó^  K  — d}d}	 t        |«      }|j                  «       2 3 d{  –—† }|j                  r|j                  }|j                  �|j                  }| j	                  ||j
                  |j                  r|j                  j                  nd|¬«      ƒ d{  –—† }|sŒ…|j                  «       ƒ d{  –—†   y7 Œš7 Œ#7 Œ
6 n.# t        $ r"}	t        j                  d|	› �«       Y d}	~	nd}	~	ww xY w|�2t        j                  d«       | j                  |||«      ƒ d{  –—†7   yy­w)z$Handle SSE response from the server.N)ru   rv   zSSE stream ended: ú(SSE stream disconnected, reconnecting...)r   r‰   rz   rŠ   r   r3   r2   r—   r˜   rn   rf   r|   rg   Ú_handle_reconnection)
rC   rc   r”   rv   rŽ   r�   r‘   rs   r™   Úes
             r*   rª   z,StreamableHTTPTransport._handle_sse_response�  s,  è ø€ ð %)ˆØ(,Ðð	3Ü& xÓ0ˆLØ)×3Ñ3Ó5÷ ð �cà—6’6Ø$'§F¡F�Mð —9‘9Ð(Ø(+¯	©	Ð%à$(×$:Ñ$:ØØ×*Ñ*ØTW×T`ÒT`¨¯©×)PÒ)PÐfjØ&7ð	 %;ó %÷ �ò Ø"Ÿ/™/Ó+×+Ð+Ùð'øðøð ,øñ% 6øô( ò 	3Ü�L‰LÐ-¨a¨SÐ1×2Ñ2ûð	3úð Ð$Ü�K‰KÐBÔCØ×+Ñ+¨C°Ð@QÓR×RÒRð %ùs‹   ‚D-ˆC
 £C§C¨C«A5C
 Â CÂ!C
 Â(C
 Â;CÂ<C
 ÃD-ÃCÃC
 ÃC
 ÃC
 Ã	D-Ã
	C5ÃC0Ã+D-Ã0C5Ã50D-Ä%D(Ä&D-rŽ   r�   r�   c              ƒ   óN  K  — |t         k\  rt        j                  dt         › d�«       y|�|nt        }t	        j
                  |dz  «      ƒ d{  –—†  | j                  «       }||t        <   d}t        |j                  j                  j                  t        «      r*|j                  j                  j                  j                  }	 t        |j                  d| j                   |¬«      4 ƒd{  –—† }|j"                  j%                  «        t        j'                  d«       |}	|}
|j)                  «       2 3 d{  –—† }|j                  r|j                  }	|j*                  �|j*                  }
| j-                  ||j.                  ||j0                  r|j0                  j2                  nd«      ƒ d{  –—† }|sŒ„|j"                  j5                  «       ƒ d{  –—†   ddd«      ƒd{  –—†  y7 �Œ 7 �Œ7 Œ¹7 ŒC7 Œ 7 Œ6 t        j'                  d«       | j7                  ||	|
d	«      ƒ d{  –—†7   ddd«      ƒd{  –—†7   y# 1 ƒd{  –—†7  sw Y   yxY w# t8        $ rB}t        j                  d
|› �«       | j7                  ||||dz   «      ƒ d{  –—†7   Y d}~yd}~ww xY w­w)zFReconnect with Last-Event-ID to resume stream after server disconnect.zMax reconnection attempts (r„   Nr…   r�   r‚   zReconnected to SSE streamr²   r   zReconnection failed: rƒ   )r†   rf   r|   r‹   rŒ   r�   rX   r‡   r\   r1   rY   r]   r   rz   r   r/   r?   rc   rˆ   rg   r‰   rŠ   r   r3   r2   r—   r˜   r³   rn   )rC   r”   rŽ   r�   r�   r’   r4   rt   r‘   Úreconnect_last_event_idÚreconnect_retry_msrs   r™   r´   s                 r*   r³   z,StreamableHTTPTransport._handle_reconnectionµ  sv  è ø€ ð Ô/Ò/Ü�L‰LÐ6Ô7PÐ6QÐQ[Ð\Ô]Øð ):Ð(EÑ$ÔKhˆÜ�k‰k˜( VÑ+Ó,×,Ð,à×'Ñ'Ó)ˆØ!.ˆ”Ñð #ÐÜ�c×)Ñ)×1Ñ1×6Ñ6¼ÔGØ"%×"5Ñ"5×"=Ñ"=×"BÑ"B×"EÑ"EÐð$	`Ü#Ø—
‘
ØØ—‘Øô	÷ eð eð
 Ø×%Ñ%×6Ñ6Ô8Ü—‘Ð7Ô8ð 0=Ð'Ø%6Ð"à!-×!7Ñ!7Ó!9÷ ð ˜#Ø—v’vØ25·&±&Ð/Ø—y‘yÐ,Ø-0¯Y©YÐ*à(,×(>Ñ(>ØØ×.Ñ.Ø+ØCFÇ<Â<˜Ÿ™×?Ò?ÐUYó	)÷ #�Kò #Ø*×3Ñ3×:Ñ:Ó<×<Ð<Ø÷7e÷ eð eð 	-ùðeùðøð#øð =øð5eøð ":ô" —‘ÐFÔGØ×/Ñ/°Ð5LÐN`ÐbcÓd×dÑd÷?e÷ e÷ e÷ eó eûô@ ò 	`Ü�L‰LÐ0°°Ð4Ô5à×+Ñ+¨C°Ð@QÐSZÐ]^ÑS^Ó_×_Ö_ûð	`üs  ‚AJ%ÁG/ÁA7J%Ã'I Ã/G2Ã0I Ã3AIÄ7G=Ä;G5Ä<G=Ä?A4IÆ3G7Æ4IÆ;IÇG9ÇIÇI Ç)G;Ç*I Ç.J%Ç2I Ç5G=Ç7IÇ9IÇ;I Ç=-IÈ*H-È+IÈ0I È;H>È<I ÉJ%ÉIÉIÉ	IÉI ÉJ%ÉI É	J"É 2JÊJÊJÊJ%ÊJ"Ê"J%r¬   c              ƒ   óˆ   K  — d|› �}t         j                  |«       |j                  t        |«      «      ƒ d{  –—†  y7 Œ­w)z+Handle unexpected content type in response.zUnexpected content type: N)rf   Úerrorr}   Ú
ValueError)rC   r¬   r3   Ú	error_msgs       r*   r«   z7StreamableHTTPTransport._handle_unexpected_content_typeô  s9   è ø€ ð 0°¨~Ð>ˆ	Ü�‰�YÔØ ×%Ñ%¤j°Ó&;Ó<×<Ò<ús   ‚8AºA »AÚ
request_idc              ƒ   óœ   K  — t        d|t        dd¬«      ¬«      }t        t        |«      «      }|j	                  |«      ƒ d{  –—†  y7 Œ­w)z)Send a session terminated error response.z2.0iX  zSession terminated)ÚcoderY   )Újsonrpcrz   r¹   N)r   r   r   r   r}   )rC   r3   r¼   Újsonrpc_errorr1   s        r*   r¦   z6StreamableHTTPTransport._send_session_terminated_errorþ  sH   è ø€ ô %ØØÜ Ð0DÔEô
ˆô
 )¬¸Ó)FÓGˆØ ×%Ñ% oÓ6×6Ò6ús   ‚AAÁA
ÁAÚwrite_stream_readerÚwrite_streamÚstart_get_streamÚtgc           	   ƒ   ól  ‡ ‡‡K  — 	 |4 ƒd{  –—†  |2 3 d{  –—† }|j                   }t        |j                  t        «      r|j                  nd}	t	        |	xr |	j
                  «      Št        j                  d|› �«       ‰ j                  |«      r |«        t        |‰ j                  ||	|¬«      Šˆˆˆ fd„}
t        |j                  t        «      r|j                  |
«       ŒÓ |
«       ƒ d{  –—†  Œã7 Œé7 Œà7 Œ	6 ddd«      ƒd{  –—†7   n# 1 ƒd{  –—†7  sw Y   nxY wn$# t        $ r t        j                  d«       Y nw xY w|j!                  «       ƒ d{  –—†7   |j!                  «       ƒ d{  –—†7   y# |j!                  «       ƒ d{  –—†7   |j!                  «       ƒ d{  –—†7   w xY w­w)z&Handle writing requests to the server.NzSending client message: )r/   r0   r1   r2   r3   c               “   ó€   •K  — ‰r‰j                  ‰ «      ƒ d {  –—†  y ‰j                  ‰ «      ƒ d {  –—†  y 7 Œ7 Œ­wrB   )rš   r­   )r”   Úis_resumptionrC   s   €€€r*   Úhandle_request_asynczAStreamableHTTPTransport.post_writer.<locals>.handle_request_async1  s<   øè ø€ Ù(Ø"&×"AÑ"AÀ#Ó"F×FÑFà"&×";Ñ";¸CÓ"@×@Ñ@ð Gøà@ús   ƒ>š:›>´<µ>¼>zError in post_writer)rY   r\   r2   r   Úboolr–   rf   r|   rb   r.   r0   r]   r   Ú
start_soonrn   r~   r˜   )rC   r/   rÁ   r3   rÂ   rÃ   rÄ   r1   rY   r2   rÈ   r”   rÇ   s   `          @@r*   Úpost_writerz#StreamableHTTPTransport.post_writer  sˆ  úè ø€ ð+	(Ø*÷ $5ñ $5Ø-@÷ #5ð #5˜/Ø-×5Ñ5�Gô & o×&>Ñ&>Ô@UÔVð (×0Ò0à!ð ô %)¨Ò)O°h×6OÑ6OÓ$P�Mä—L‘LÐ#;¸G¸9Ð!EÔFð ×8Ñ8¸ÔAÙ(Ô*ä(Ø%Ø#'§?¡?Ø(7Ø!)Ø+=ô�CöAô " '§,¡,´Ô?ØŸ™Ð&:Õ;á2Ó4×4Ñ4ðI$5øð#5øðF 5øðG .A÷$5÷ $5÷ $5÷ $5ó $5üôL ò 	5Ü×ÑÐ3Ö4ð	5úð %×+Ñ+Ó-×-Ñ-Ø×%Ñ%Ó'×'Ò'øð %×+Ñ+Ó-×-Ñ-Ø×%Ñ%Ó'×'Ò'üsÜ   …F4‡D& �C7ŽD& ‘D”C=˜C9™C=œCDÃ1C;Ã2DÃ7D& Ã9C=Ã;DÃ=DÃ>D& Ä	DÄ
D& ÄD"ÄDÄD"ÄD& Ä%E= Ä&EÅE= ÅEÅE= Å
F4ÅE ÅF4Å6E9Å7F4Å=F1ÆFÆF1Æ*F-Æ+F1Æ1F4c              ƒ   óž  K  — | j                   sy	 | j                  «       }|j                  | j                  |¬«      ƒ d{  –—† }|j                  dk(  rt
        j                  d«       y|j                  dvr#t
        j                  d|j                  › �«       yy7 Œ[# t        $ r"}t
        j                  d|› �«       Y d}~yd}~ww xY w­w)z2Terminate the session by sending a DELETE request.Nr‚   i•  z)Server does not allow session termination)éÈ   éÌ   zSession termination failed: )	r0   rX   Údeleter?   r¥   rf   r|   ro   rn   )rC   r/   r4   rc   rq   s        r*   Úterminate_sessionz)StreamableHTTPTransport.terminate_sessionC  s¶   è ø€ à�ŠØð		AØ×+Ñ+Ó-ˆGØ#Ÿ]™]¨4¯8©8¸W˜]ÓE×EˆHà×#Ñ# sÒ*Ü—‘ÐHÕIØ×%Ñ%¨ZÑ7Ü—‘Ð!=¸h×>RÑ>RÐ=SÐTÕUð 8ð	 Fùô ò 	AÜ�N‰NÐ9¸#¸Ð?×@Ñ@ûð	AüsL   ‚C‘0B ÁBÁ(B Á*CÁ+0B ÂCÂB Â	C
Â(CÃ CÃC
Ã
Cc                 ó   — | j                   S )zGet the current session ID.)r0   )rC   s    r*   Úget_session_idz&StreamableHTTPTransport.get_session_idS  s   € à�‰Ðr)   )Né   é,  N)NNF)F)Nr   )/r$   r%   r&   r'   r
   r9   rD   r   r;   r<   r   r6   ÚAuthrK   r	   rX   r   rÉ   r`   rb   ÚResponseri   rr   r   r:   r   r   r   r   r7   r“   r.   rš   r­   r©   rª   Úintr³   r«   r¦   ÚStreamReaderr   r   r   rË   rÐ   rÒ   r(   r)   r*   r>   r>   X   s¦  „ Ù9àØ-˜CÐ- DÒ-ó Ø-àÙð	<óð *.Ø%'Ø.4Ø"&ñàðð �c˜3�h‘ $Ñ&ðð ˜Ñ"ð	ð
   )Ñ+ðð �j‰j˜4Ñðð 
òó	ó ð
ð ØØ &Øñ&%àð&%ð ð&%ð ð	&%ð
 ð&%ð ð&%ð 
ó&%ðP $ s¨C x¡.ó ð"`°.ð `ÀTó `ðt°Nð tÀtó tðCà—.‘.ðCð 
óCðEàðEð 
óEð* 15ØGKØ"'ñ-àð-ð )ð-ð '¨Ñ-ð	-ð
 & s e¨Y°t©_Ð&<Ñ=ÀÑDð-ð  ð-ð 
ó-ð^41à×!Ñ!ð41ð )ð41ð 
ó	41ðl°Nð Àtó ðB(¨nð (Àó (ð\ #(ñ	/à—.‘.ð/ð )ð/ð  ð	/ð
 
ó/ð2 #(ñ	&Sà—.‘.ð&Sð ð&Sð  ð	&Sð
 
ó&SðX )-Øñ=`àð=`ð ð=`ð  ™:ð	=`ð
 ð=`ð 
ó=`ð~=àð=ð )ð=ð 
ó	=ð7à(ð7ð ð7ð 
ó	7ð5(à×!Ñ!ð5(ð *ð5(ð )ð	5(ð
 -¨^Ñ<ð5(ð # 2 t 8Ñ,ð5(ð ð5(ð 
ó5(ðnA¨e×.?Ñ.?ð AÀDó Að   d¡
ô r)   r>   T©Úhttp_clientÚterminate_on_closer?   rÚ   rÛ   r@   c               óÂ  ‡	‡
‡‡K  — t        j                  t        t        z     d«      \  Š
}t        j                  t           d«      \  }}|du}|Š	‰	€
t	        «       Š	t        | «      Št        j                  «       4 ƒd{  –—† Š	 t        j                  d| › �«       t        j                  «       4 ƒd{  –—† }|s|j                  ‰	«      ƒ d{  –—†  dˆ	ˆ
ˆˆfd„}‰j                  ‰j                  ‰	|‰
||‰«       	 ||‰j                  f­–— ‰j                  r|r‰j!                  ‰	«      ƒ d{  –—†  ‰j"                  j%                  «        ddd«      ƒd{  –—†  ‰
j'                  «       ƒ d{  –—†  |j'                  «       ƒ d{  –—†  ddd«      ƒd{  –—†  y7 �Œ%7 Œñ7 ŒØ7 Œv# ‰j                  r|r‰j!                  ‰	«      ƒ d{  –—†7   ‰j"                  j%                  «        w xY w7 Œ•# 1 ƒd{  –—†7  sw Y   Œ¥xY w7 Œ”7 Œ~# ‰
j'                  «       ƒ d{  –—†7   |j'                  «       ƒ d{  –—†7   w xY w7 Œ§# 1 ƒd{  –—†7  sw Y   yxY w­w)a8  
    Client transport for StreamableHTTP.

    Args:
        url: The MCP server endpoint URL.
        http_client: Optional pre-configured httpx.AsyncClient. If None, a default
            client with recommended MCP timeouts will be created. To configure headers,
            authentication, or other HTTP settings, create an httpx.AsyncClient and pass it here.
        terminate_on_close: If True, send a DELETE request to terminate the session
            when the context exits.

    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

    Example:
        See examples/snippets/clients/ for usage patterns.
    r   Nz'Connecting to StreamableHTTP endpoint: c                  ó@   •— ‰j                  ‰j                  ‰ ‰«       y rB   )rÊ   r“   )r/   r3   rÄ   Ú	transports   €€€€r*   rÃ   z0streamable_http_client.<locals>.start_get_stream�  s   ø€ Ø—M‘M )×"=Ñ"=¸vÐGYÕZr)   )r@   N)rŒ   Úcreate_memory_object_streamr   rn   r   r>   Úcreate_task_grouprf   r|   Ú
contextlibÚAsyncExitStackÚenter_async_contextrÊ   rË   rÒ   r0   rÐ   Úcancel_scopeÚcancelr˜   )r?   rÚ   rÛ   Úread_streamrÂ   rÁ   Úclient_providedÚstackrÃ   r/   r3   rÄ   rÞ   s            @@@@r*   Ústreamable_http_clientré   X  s9  ûè ø€ ôD ',×&GÑ&GÌÔYbÑHbÑ&cÐdeÓ&fÑ#Ð˜Ü(-×(IÑ(IÌ.Ñ(YÐZ[Ó(\Ñ%€LÐ%ð "¨Ð-€OØ€Fà€~ä'Ó)ˆä'¨Ó,€Iä×&Ñ&Ó(÷ "(ð "(¨Bð!	(Ü�L‰LÐBÀ3À%ÐHÔIä!×0Ñ0Ó2÷ -ð -°eá&Ø×3Ñ3°FÓ;×;Ð;÷[ð [ð —‘Ø×)Ñ)ØØ'Ø&Ø Ø$Øôð	-à#Ø$Ø!×0Ñ0ðó ð !×+Ò+Ñ0BØ'×9Ñ9¸&ÓA×AÐAØ—O‘O×*Ñ*Ô,÷7-÷ -ð: %×+Ñ+Ó-×-Ð-Ø×%Ñ%Ó'×'Ð'÷E"(÷ "(ñ "(ùð-øð <øð. Bùð !×+Ò+Ñ0BØ'×9Ñ9¸&ÓA×AÑAØ—O‘O×*Ñ*Õ,úð7-ø÷ -÷ -ñ -úð: .øØ'ùð %×+Ñ+Ó-×-Ñ-Ø×%Ñ%Ó'×'Ò'úðE"(ø÷ "(÷ "(ñ "(üs,  †A;IÂF&ÂIÂI
Â0HÂ7F)Â8HÂ;G8ÃF+Ã.G8ÄF/Ä"G8Ä6F-Ä7G8ÅHÅ G6Å!HÅ%I
Å8HÅ9I
ÆHÆI
ÆIÆ IÆ!IÆ)HÆ+G8Æ-G8Æ/#G3ÇGÇ G3Ç3G8Ç6HÇ8H
	Ç>HÇ?H
	ÈHÈI
ÈI
ÈIÈ%H(
È&IÈ>I
È?IÉI
ÉIÉ
IÉIÉIÉIz%Use `streamable_http_client` instead.rÓ   rÔ   r4   rE   r5   Úhttpx_client_factoryrF   c                óÆ  K  — t        |t        «      r|j                  «       n|}t        |t        «      r|j                  «       n|} ||t        j                  ||¬«      |¬«      }	|	4 ƒd {  –—†  t        | |	|¬«      4 ƒd {  –—† }
|
­–— d d d «      ƒd {  –—†  d d d «      ƒd {  –—†  y 7 ŒA7 Œ,7 Œ# 1 ƒd {  –—†7  sw Y   Œ)xY w7 Œ # 1 ƒd {  –—†7  sw Y   y xY w­w)N)Úread)r4   rE   rF   rÙ   )r\   r   Útotal_secondsr6   ÚTimeoutré   )r?   r4   rE   r5   rÛ   rê   rF   Útimeout_secondsÚsse_read_timeout_secondsr/   Ústreamss              r*   Ústreamablehttp_clientrò   ¬  sá   è ø€ ô& 2<¸GÄYÔ1O�g×+Ñ+Ô-ÐU\€Oä,6Ð7GÌÔ,SÐ×&Ñ&Ô(ÐYið ñ
 "ØÜ—‘˜oÐ4LÔMØô€Fð ÷ ñ Ü)ØØØ1ô
÷ 	ð 	ð Ø‹M÷	÷ 	÷÷ ñ øð	øð 	ø÷ 	÷ 	ñ 	úðø÷ ÷ ñ üs�   ‚A+C!Á-B/Á.C!Á1CÂB1ÂCÂB5ÂCÂB3ÂCÂC!Â)C
Â*C!Â1CÂ3CÂ5C	Â;B>Â<C	ÃCÃ
C!ÃCÃCÃCÃC!)Mr'   rá   ÚloggingÚcollections.abcr   r   r   r   Údataclassesr   Údatetimer   Útypingr	   r
   Úwarningsr   rŒ   r6   Ú	anyio.abcr   Úanyio.streams.memoryr   r   Ú	httpx_sser   r   r   Útyping_extensionsr   Úmcp.shared._httpx_utilsr   r   Úmcp.shared.messager   r   Ú	mcp.typesr   r   r   r   r   r   r   r   Ú	getLoggerr$   rf   rn   ÚSessionMessageOrErrorr:   rØ   r9   ÚGetSessionIdCallbackrV   rW   r‡   r‹   r†   rU   rT   rR   rS   ÚobjectrK   r"   r,   r.   r>   r7   rÉ   Útupleré   r;   r<   rÕ   rò   r(   r)   r*   ú<module>r     sy  ðñó Û ß ?Ñ ?Ý *Ý !Ý ß  Ý ã Û Ý ß Rß @Ñ @Ý (÷÷ E÷	÷ 	ó 	ð 
ˆ×	Ñ	˜8Ó	$€ð '¨Ñ2Ð Ø%Ð&;Ñ<€Ø(¨Ñ8€Ø  C¨$¡J Ñ/Ð à!€Ø-Ð Ø€ð !%Ð ØÐ Ø€Ø	€ð €Ø€ñ 
‹€ô>˜)ô >ô5Ð)ô 5ð ÷	*ð 	*ó ð	*÷}ñ }ð@ ð -1Ø#ò	P(Ø	ðP(ð ×"Ñ" TÑ)ðP(ð ð	P(ð
 Ø	Ø! .°9Ñ"<Ñ=Ø˜~Ñ.Øð	ñð
 	ð
ñòP(ó ðP(ðf ÙÐ3Ó4ð &*Ø!#Ø*0Ø#Ø1GØ"ñ$Ø	ð$à�#�s�(‰^˜dÑ"ð$ð �YÑð$ð ˜iÑ'ð	$ð
 ð$ð /ð$ð �*‰*�tÑ
ð$ð Ø	Ø! .°9Ñ"<Ñ=Ø˜~Ñ.Øð	ñð
 	ð
ñò$ó 5ó ñ$r)   