
    )`i                        d Z ddlZddlZddl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 ddlmZ ddlmZ ddlZdd	lmZmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlm Z m!Z!m"Z" ddl#m$Z$m%Z% ddl&m'Z'm(Z( ddl)m*Z* ddl+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6  ej7        e8          Z9dZ:dZ;dZ<dZ=dZ>dZ? ej@        d          ZAeBZCeBZDe G d d                      ZEe
eEge	d         f         ZF G d de          ZG G d d          ZHdS ) 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)Any)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                   2    e Zd ZU dZeed<   dZedz  ed<   dS )EventMessagezM
    A JSONRPCMessage with an optional event ID for stream resumability.
    messageNevent_id)__name__
__module____qualname____doc__r!   __annotations__r)   str     n/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/mcp/server/streamable_http.pyr'   r'   H   s>           HcDjr1   r'   c                   f    e Zd ZdZedededz  defd            Zedede	dedz  fd	            Z
dS )

EventStorez?
    Interface for resumability support via event storage.
    	stream_idr(   Nreturnc                 
   K   dS )a  
        Stores an event for later retrieval.

        Args:
            stream_id: ID of the stream the event belongs to
            message: The JSON-RPC message to store, or None for priming events

        Returns:
            The generated event ID for the stored event
        Nr0   )selfr5   r(   s      r2   store_eventzEventStore.store_eventZ   s       	r1   last_event_idsend_callbackc                 
   K   dS )a2  
        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
        Nr0   )r8   r:   r;   s      r2   replay_events_afterzEventStore.replay_events_afterh   s        	r1   )r*   r+   r,   r-   r   StreamIdr!   EventIdr9   EventCallbackr=   r0   r1   r2   r4   r4   U   s          8 nt>S X_    ^  % 
D	   ^  r1   r4   c                      e Zd ZU dZdZeeez           dz  ed<   dZ	e
eez           dz  ed<   dZee         dz  ed<   dZe
e         dz  ed<   eed<   	 	 	 	 d7d	edz  d
ededz  dedz  dedz  ddfdZedefd            ZdeddfdZd8dZdededededef
dZdedeeeef                  deddfdZedfdede dedeeef         dz  de!f
dZ"e j#        dfdedz  de deeef         dz  de!fd Z$dededz  fd!Z%d"e&deeef         fd#Z'deddfd$Z(d%e)d&e*d'e+ddfd(Z,dede-eef         fd)Z.dedefd*Z/ded%e)d'e+defd+Z0d%e)ded&e*d'e+ddf
d,Z1ded'e+ddfd-Z2ded'e+ddfd.Z3d8d/Z4ded'e+ddfd0Z5ded'e+defd1Z6ded'e+defd2Z7ded'e+defd3Z8d4eded'e+ddfd5Z9e:de;e-e
eez           ee         f         df         fd6            Z<dS )9StreamableHTTPServerTransportz
    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	_securityFmcp_session_idis_json_response_enabledevent_storesecurity_settingsretry_intervalr6   c                     |)t                               |          st          d          || _        || _        || _        t          |          | _        || _        i | _	        i | _
        d| _        dS )am  
        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.
            retry_interval: Retry interval in milliseconds to suggest to clients in SSE
                           retry field. When set, the server will send a retry field in
                           SSE priming events to control client reconnection timing for
                           polling behavior. Only used when event_store is provided.

        Raises:
            ValueError: If the session ID contains invalid characters.
        NzASession ID must only contain visible ASCII characters (0x21-0x7E)F)SESSION_ID_PATTERN	fullmatch
ValueErrorrH   rI   _event_storer   rG   _retry_interval_request_streams_sse_stream_writers_terminated)r8   rH   rI   rJ   rK   rL   s         r2   __init__z&StreamableHTTPServerTransport.__init__   s    8 %.@.J.J>.Z.Z%`aaa,(@%'45FGG-  	 ]_  r1   c                     | j         S )z7Check if this transport has been explicitly terminated.)rU   r8   s    r2   is_terminatedz+StreamableHTTPServerTransport.is_terminated   s     r1   
request_idc                    | j                             |d          }|r|                                 || j        v rG| j                            |          \  }}|                                 |                                 dS dS )a  Close SSE connection for a specific request without terminating the stream.

        This method closes the HTTP connection for the specified request, triggering
        client reconnection. Events continue to be stored in the event store and will
        be replayed when the client reconnects with Last-Event-ID.

        Use this to implement polling behavior during long-running operations -
        client will reconnect after the retry interval specified in the priming event.

        Args:
            request_id: The request ID whose SSE stream should be closed.

        Note:
            This is a no-op if there is no active stream for the request ID.
            Requires event_store to be configured for events to be stored during
            the disconnect.
        N)rT   popcloserS   )r8   rZ   writersend_streamreceive_streams        r2   close_sse_streamz.StreamableHTTPServerTransport.close_sse_stream   s    $ )--j$?? 	LLNNN ...*.*?*C*CJ*O*O'K  """"" /.r1   c                 :    |                      t                     dS )aF  Close the standalone GET SSE stream, triggering client reconnection.

        This method closes the HTTP connection for the standalone GET stream used
        for unsolicited server-to-client notifications. The client SHOULD reconnect
        with Last-Event-ID to resume receiving notifications.

        Use this to implement polling behavior for the notification stream -
        client will reconnect after the retry interval specified in the priming event.

        Note:
            This is a no-op if there is no active standalone SSE stream.
            Requires event_store to be configured for events to be stored during
            the disconnect.
            Currently, client reconnection for standalone GET streams is NOT
            implemented - this is a known gap (see test_standalone_get_stream_reconnection).
        N)ra   GET_STREAM_KEYrX   s    r2   close_standalone_sse_streamz9StreamableHTTPServerTransport.close_standalone_sse_stream   s    " 	n-----r1   r(   requestprotocol_versionc                       j         r&|dk    r d	 fd}d	 fd}t          |||          }nt          |          }t          ||          S )
aJ  Create a session message with metadata including close_sse_stream callback.

        The close_sse_stream callbacks are only provided when the client supports
        resumability (protocol version >= 2025-11-25). Old clients can't resume if
        the stream is closed early because they didn't receive a priming event.
        
2025-11-25r6   Nc                  6   K                                    d S N)ra   )rZ   r8   s   r2   close_stream_callbackzTStreamableHTTPServerTransport._create_session_message.<locals>.close_stream_callback   s!      %%j11111r1   c                  4   K                                      d S rj   )rd   rX   s   r2    close_standalone_stream_callbackz_StreamableHTTPServerTransport._create_session_message.<locals>.close_standalone_stream_callback   s      0022222r1   )request_contextra   rd   rn   metadatar6   N)rQ   r   r   )r8   r(   re   rZ   rf   rk   rm   rq   s   `  `    r2   _create_session_messagez5StreamableHTTPServerTransport._create_session_message   s      	F!1\!A!A2 2 2 2 2 2 23 3 3 3 3 3 - '!6,L  HH -WEEEHg9999r1   sse_stream_writerc                    K   | j         sdS |dk     rdS | j                             t          |          d           d{V }|dd}| j        
| j        |d<   |                    |           d{V  dS )a#  Send priming event for SSE resumability if event_store is configured.

        Only sends priming events to clients with protocol version >= 2025-11-25,
        which includes the fix for handling empty SSE data. Older clients would
        crash trying to parse empty data as JSON.
        Nrh    )iddataretry)rQ   r9   r/   rR   send)r8   rZ   rt   rf   priming_event_idpriming_events         r2   _maybe_send_priming_eventz7StreamableHTTPServerTransport._maybe_send_priming_event  s         	Fl**F!%!2!>!>
OO"
 "
 
 
 
 
 
 
 6Fr.R.R+%)%9M'"$$]33333333333r1   error_messagestatus_code
error_codeheadersc                     dt           i}|r|                    |           | j        r| j        |t          <   t	          ddt          ||                    }t          |                    dd          ||          S )	z6Create an error response with a simple string message.Content-Typez2.0zserver-error)coder(   )jsonrpcrw   errorTby_aliasexclude_noner   r   )CONTENT_TYPE_JSONupdaterH   MCP_SESSION_ID_HEADERr    r   r   model_dump_json)r8   r~   r   r   r   response_headerserror_responses          r2   _create_error_responsez4StreamableHTTPServerTransport._create_error_response&  s     +,=> 	-##G,,, 	J6:6I23 &%  
 
 
 **Dt*LL#$
 
 
 	
r1   response_messagec                     dt           i}|r|                    |           | j        r| j        |t          <   t	          |r|                    dd          nd||          S )z,Create a JSON response from a JSONRPCMessager   Tr   Nr   )r   r   rH   r   r   r   )r8   r   r   r   r   s        r2   _create_json_responsez3StreamableHTTPServerTransport._create_json_responseE  s     +,=> 	-##G,,, 	J6:6I23Rbl,,d,NNNhl#$
 
 
 	
r1   c                 @    |j                             t                    S )z,Extract the session ID from request headers.)r   getr   )r8   re   s     r2   _get_session_idz-StreamableHTTPServerTransport._get_session_idY  s    ""#8999r1   event_messagec                 f    d|j                             dd          d}|j        r
|j        |d<   |S )z2Create event data dictionary from an EventMessage.r(   Tr   )eventrx   rw   )r(   r   r)   )r8   r   
event_datas      r2   _create_event_dataz0StreamableHTTPServerTransport._create_event_data]  sM     !)994VZ9[[
 

 ! 	6,5Jtr1   c                   K   || j         v r	 | j         |         d                                          d{V  | j         |         d                                          d{V  n*# t          $ r t                              d           Y nw xY w| j                             |d           dS # | j                             |d           w xY wdS )z/Clean up memory streams for a given request ID.r   N   z4Error closing memory streams - may already be closed)rS   aclose	Exceptionloggerdebugr\   )r8   rZ   s     r2   _clean_up_memory_streamsz6StreamableHTTPServerTransport._clean_up_memory_streamsj  s      ...	<+J7:AACCCCCCCCC+J7:AACCCCCCCCCC U U USTTTTTU
 %))*d;;;;;%))*d;;;; /.s*   AA$ #B+ $$BB+ 
BB+ +Cscopereceiverz   c                 \  K   t          ||          }|j        dk    }| j                            ||           d{V }|r ||||           d{V  dS | j        r5|                     dt          j                  } ||||           d{V  dS |j        dk    r |                     ||||           d{V  dS |j        dk    r| 	                    ||           d{V  dS |j        dk    r| 
                    ||           d{V  dS |                     ||           d{V  dS )z6Application entry point that handles all HTTP requestsPOST)is_postNz&Not Found: Session has been terminatedGETDELETE)r   methodrG   validate_requestrU   r   r
   	NOT_FOUND_handle_post_request_handle_get_request_handle_delete_request_handle_unsupported_request)r8   r   r   rz   re   r   r   responses           r2   handle_requestz,StreamableHTTPServerTransport.handle_requestx  s     %)) .F*#~>>wPW>XXXXXXXX 	 .666666666F 	228$ H (5'4000000000F>V##++E7GTJJJJJJJJJJJ^u$$**7D99999999999^x''--gt<<<<<<<<<<<227DAAAAAAAAAAAr1   c                     |j                             dd          }d |                    d          D             }t          d |D                       }t          d |D                       }||fS )z6Check if the request accepts the required media types.acceptrv   c                 6    g | ]}|                                 S r0   strip.0
media_types     r2   
<listcomp>zGStreamableHTTPServerTransport._check_accept_headers.<locals>.<listcomp>  s$    VVVz
((**VVVr1   ,c              3   J   K   | ]}|                     t                    V  d S rj   )
startswithr   r   s     r2   	<genexpr>zFStreamableHTTPServerTransport._check_accept_headers.<locals>.<genexpr>  s1      __Jz,,->??______r1   c              3   J   K   | ]}|                     t                    V  d S rj   )r   CONTENT_TYPE_SSEr   s     r2   r   zFStreamableHTTPServerTransport._check_accept_headers.<locals>.<genexpr>  s1      ]]*j++,<==]]]]]]r1   r   r   splitany)r8   re   accept_headeraccept_typeshas_jsonhas_sses         r2   _check_accept_headersz3StreamableHTTPServerTransport._check_accept_headers  s    ++Hb99VV]=P=PQT=U=UVVV__R^_____]]P\]]]]]  r1   c                     |j                             dd          }d |                    d          d                             d          D             }t          d |D                       S )z2Check if the request has the correct Content-Type.zcontent-typerv   c                 6    g | ]}|                                 S r0   r   r   parts     r2   r   zEStreamableHTTPServerTransport._check_content_type.<locals>.<listcomp>  s     ]]]tdjjll]]]r1   ;r   r   c              3   ,   K   | ]}|t           k    V  d S rj   )r   r   s     r2   r   zDStreamableHTTPServerTransport._check_content_type.<locals>.<genexpr>  s(      LL4,,LLLLLLr1   r   )r8   re   content_typecontent_type_partss       r2   _check_content_typez1StreamableHTTPServerTransport._check_content_type  sm    **>2>>]]|7I7I#7N7Nq7Q7W7WX[7\7\]]]LL9KLLLLLLr1   c                 >  K   |                      |          \  }}| j        r=|s:|                     dt          j                  } |||j        |           d{V  dS n>|r|s:|                     dt          j                  } |||j        |           d{V  dS dS )zEValidate Accept header based on response mode. Returns True if valid.z3Not Acceptable: Client must accept application/jsonNFzNNot Acceptable: Client must accept both application/json and text/event-streamT)r   rI   r   r
   NOT_ACCEPTABLEr   )r8   re   r   rz   r   r   r   s          r2   _validate_accept_headerz5StreamableHTTPServerTransport._validate_accept_header  s       66w??'( 	 66I-  hugot<<<<<<<<<u  	w 	22`) H (5'/48888888885tr1   c                    K    j         }|t          d          	                      |||           d{V sdS                      |          s5                     dt
          j                  } ||||           d{V  dS |                                 d{V }	 t          j	        |          }nf# t          j
        $ rT}	                     dt          |	           t
          j        t                    } ||||           d{V  Y d}	~	dS d}	~	ww xY w	 t          j        |          }
na# t           $ rT}	                     dt          |	           t
          j        t"                    } ||||           d{V  Y d}	~	dS d}	~	ww xY wt%          |
j        t(                    o|
j        j        dk    }|r_ j        rW                     |          }|r@| j        k    r5                     dt
          j                  } ||||           d{V  dS n                     ||           d{V sdS t%          |
j        t(                    sq                     dt
          j                  } ||||           d{V  t9          |          }t;          |
|	          }|                    |           d{V  dS |r>|
j        j        r2t          |
j        j                             d
tB                              n$|j"                             tF          tB                    t          |
j        j$                  tK          j&        tN                   d           j(        <    j(                 d          j)        rt9          |          }t;          |
|	          }|                    |           d{V  	 d}2 3 d{V }t%          |j*        j        tV          tX          z            r	|j*        } n.tZ          .                    d|j*        j        j                    d6 |r)                     |          } ||||           d{V  nMtZ          /                    d                                dt
          j0                  } ||||           d{V  nc# tb          $ rV tZ          2                    d                                dt
          j0        tf                    } ||||           d{V  Y nw xY w 4                               d{V  dS #  4                               d{V  w xY wtK          j&        tj          t          t          f                  d          \  } j6        <    fd}ddtn          d j        rtp           j        ini }ts          |||          }	 tK          j:                    4 d{V }|;                    ||||            <                    |
|          }|                    |           d{V  ddd          d{V  n# 1 d{V swxY w Y   dS dS # tb          $ rm tZ          2                    d           =                                 d{V  |=                                 d{V   4                               d{V  Y dS w xY w# tb          $ r}tZ          2                    d                                d| t
          j0        tf                    } ||||           d{V  |r(|                    tc          |                     d{V  Y d}~dS d}~ww xY w)z2Handle POST requests containing JSON-RPC messages.NBNo read stream writer available. Ensure connect() is called first.z=Unsupported Media Type: Content-Type must be application/jsonzParse error: zValidation error: 
initialize(Not Found: Invalid or expired session IDro   rp   protocolVersionr   r   z
received: z1No response message received before stream closedz.Error processing request: No response receivedzError processing JSON responsezError processing requestc                    K   	 4 d {V  4 d {V                                  d {V  2 3 d {V }                     |           }                    |           d {V  t          | j        j        t          t          z            r na6 	 d d d           d {V  n# 1 d {V swxY w Y   d d d           d {V  n# 1 d {V swxY w Y   nT# t          j	        $ r t                              d           Y n)t          $ r t                              d           Y nw xY wt                              d           j                            d                                           d {V  d S # t                              d           j                            d                                           d {V  w xY w)Nz'SSE stream closed by close_sse_stream()zError in SSE writerzClosing SSE writer)r}   r   rz   
isinstancer(   rootr#   r    anyioClosedResourceErrorr   r   r   	exceptionrT   r\   r   )r   r   rf   rZ   request_stream_readerr8   rt   s     r2   
sse_writerzFStreamableHTTPServerTransport._handle_post_request.<locals>.sse_writerK  sd     H#4 * * * * * * * *6K * * * * * * * *"&"@"@M^`p"q"qqqqqqqq 8M 
* 
* 
* 
* 
* 
* 
*m-1-D-D]-S-S
&7&<&<Z&H&H H H H H H H H $.$1$9$>$3l$B$" $" !* %*E	!* 8M7L* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *  !4 P P P%NOOOOO$ @ @ @(()>?????@ %9:::044ZFFF";;JGGGGGGGGGGG %9:::044ZFFF";;JGGGGGGGGGGs   C  	C B+BAB+C+
B5	5C8B5	9C<C  
CC  CC  F  )D1	F #D1.F 0D11F AGno-cache, no-transform
keep-alivezCache-Control
Connectionr   contentdata_sender_callabler   zSSE response errorzError handling POST requestzError handling POST request: )>rC   rP   r   r   r   r
   UNSUPPORTED_MEDIA_TYPEbodyjsonloadsJSONDecodeErrorr/   BAD_REQUESTr   r!   model_validater   r   r   r   r"   r   rH   r   r   _validate_request_headersr   ACCEPTEDr   r   rz   paramsr   r   r   MCP_PROTOCOL_VERSION_HEADERrw   r   create_memory_object_streamr'   rS   rI   r(   r#   r    r   r   r   INTERNAL_SERVER_ERRORr   r   r   r   dictrT   r   r   r   create_task_group
start_soonrs   r   )r8   r   re   r   rz   r^   r   r   raw_messageer(   is_initialization_requestrequest_session_idrq   session_messager   r   sse_stream_readerr   r   tgerrrf   rZ   r   rt   s   `                     @@@@r2   r   z2StreamableHTTPServerTransport._handle_post_request  s
     )>abbbN	55gudKKKKKKKK  ++G44 66S5  hugt444444444 !''''''D"j..'   667Os1vv7O7OQ[Qgituuhugt444444444
	(7DD"   661Q11*" 
 hugt444444444 7<88`W\=PT`=` & ) & )-)=)=g)F)F& * .@DDW.W.W#'#>#>F&0$ $ 'hugt<<<<<<<<<99'4HHHHHHHH  glN;; 55'  hugt444444444 1III"08"L"L"Lkk/222222222 -b181DbGL'++,=?YZZ[[[_(()DF`aa  W\_--J050QR^0_`a0b0bD!*-$($9*$Ea$H!, jD0III"08"L"L"Lkk/222222222%D (,$ 0E [ [ [ [ [ [ [m%m&;&@/T`B`aa [/</D,!E #LL)Ym6K6P6W)Y)YZZZZ 0E ( =#'#=#=>N#O#O&hugt<<<<<<<<<< %XYYY#'#>#>L&<$ $ 'hugt<<<<<<<<<  9 9 9$$%EFFF#::2"8&   H
 #(5'4888888888889 77
CCCCCCCCCCC$77
CCCCCCCCCC 8=7XY]^acf^fYg7hij7k7k4!#4 8I(4H H H H H H H H HB &>".$4  HLGZb-t/BCC`b	 /-)3#  D$688 ; ; ; ; ; ; ;BhwEEE*.*F*FwPWYceu*v*v$kk/:::::::::	; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
 ! D D D$$%9:::+22444444444+2244444444477
CCCCCCCCCCCC	D  
	 
	 
	:;;;225550 H
 (5'4000000000 2kk)C..111111111FFFFF
	s  [  A[ 
[ %B: 9[ :D	A	D[ D[ !D6 5[ 6
F A	F	[ FB[ ![  B	[ C<[ R* P0CR* )T* *AT
T* 	T

T* [ *UA>[ Y AX=+Y =
YY 
YY A3[	[ [		[ 
]!B ]]!c                 Z   K    j         }|t          d                               |          \  }}|s?                     dt          j                  } ||j        |j        |           d{V  dS                      ||           d{V sdS |j	        
                    t                    x}r                     |||           d{V  dS ddt          d} j        r j        |t          <   t            j        v r?                     dt          j                  } ||j        |j        |           d{V  dS t'          j        t*          t,          t,          f                  d          \  }	 fd	}
t/          |	|
|
          }	  ||j        |j        |           d{V  dS # t0          $ rr t2                              d                                            d{V  |	                                 d{V                       t                      d{V  Y dS w xY w)a   
        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                    K   	 t          j        t                   d          j        t          <   j        t                   d         } 4 d {V  | 4 d {V  | 2 3 d {V }                    |          }                    |           d {V  86 	 d d d           d {V  n# 1 d {V swxY w Y   d d d           d {V  n# 1 d {V swxY w Y   n*# t          $ r t          	                    d           Y nw xY wt          
                    d                               t                     d {V  d S # t          
                    d                               t                     d {V  w xY w)Nr   r   zError in standalone SSE writerzClosing standalone SSE writer)r   r   r'   rS   rc   r   rz   r   r   r   r   r   )standalone_stream_readerr   r   r8   rt   s      r2   standalone_sse_writerzPStreamableHTTPServerTransport._handle_get_request.<locals>.standalone_sse_writer  s(     D 9>8YZf8ghi8j8j%n5+/+@+PQR+S(, 
A 
A 
A 
A 
A 
A 
A 
A.F 
A 
A 
A 
A 
A 
A 
A 
A/G A A A A A A Am &*%<%<]%K%K
/44Z@@@@@@@@@@ 0H/G
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A  C C C  !ABBBBBC <===33NCCCCCCCCCCC <===33NCCCCCCCCCCs~   AC 	CB)B#3B)C)
B3	3C6B3	7C:C 
CC CC E $DE DE <F r   z Error in standalone SSE response)rC   rP   r   r   r
   r   r   r   r   r   r   LAST_EVENT_ID_HEADER_replay_eventsr   rH   r   rc   rS   CONFLICTr   r   r   r/   r   r   r   r   r   r   )r8   re   rz   r^   _r   r   r:   r   r   r  rt   s   `          @r2   r   z1StreamableHTTPServerTransport._handle_get_request  s      )>abbb //88
7 	22F) H (7='/4@@@@@@@@@F33GTBBBBBBBB 	F $O//0DEEE= 	%%mWdCCCCCCCCCF 6&,
 
  	A-1-@G)* T22222F# H (7='/4@@@@@@@@@F 05/PQUVY[^V^Q_/`ab/c/c,,	D 	D 	D 	D 	D 	D2 '%!6
 
 
	@(7='/4@@@@@@@@@@@ 	@ 	@ 	@?@@@#**,,,,,,,,,#**,,,,,,,,,//????????????		@s   F. .A8H*)H*c                   K   | j         s?|                     dt          j                  } ||j        |j        |           d{V  dS |                     ||           d{V sdS |                                  d{V  |                     dt          j	                  } ||j        |j        |           d{V  dS )z8Handle DELETE requests for explicit session termination.z5Method Not Allowed: Session termination not supportedN)
rH   r   r
   METHOD_NOT_ALLOWEDr   r   r   	terminater   OK)r8   re   rz   r   s       r2   r   z4StreamableHTTPServerTransport._handle_delete_request  s      " 	22G- H (7='/4@@@@@@@@@F33GTBBBBBBBB 	Fnn--M
 
 hw}got<<<<<<<<<<<r1   c                   K   d| _         t                              d| j                    t	          | j                                                  }|D ]}|                     |           d{V  | j                                         	 | j	        | j	        
                                 d{V  | j        | j        
                                 d{V  | j        | j        
                                 d{V  | j        !| j        
                                 d{V  dS dS # t          $ r(}t                              d|            Y d}~dS d}~ww xY w)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: )rU   r   inforH   listrS   keysr   clearrC   r   rD   rF   rE   r   r   )r8   request_stream_keyskeyr   s       r2   r  z'StreamableHTTPServerTransport.terminate  s       AD,?AABBB #4#8#=#=#?#?@@ ' 	5 	5C//4444444444 	##%%%	8'3.55777777777 ,'..000000000(4/66888888888!-(//11111111111 .- 	8 	8 	8LL6166777777777	8s   BD( (
E2EEc                    K   t           dd}| j        r| j        |t          <   |                     dt          j        |          } ||j        |j        |           d{V  dS )z Handle unsupported HTTP methods.zGET, POST, DELETE)r   AllowzMethod Not Allowed)r   N)r   rH   r   r   r
   r  r   r   )r8   re   rz   r   r   s        r2   r   z9StreamableHTTPServerTransport._handle_unsupported_request#  s       .(
 
  	A-1-@G)*.. ) / 
 

 hw}got<<<<<<<<<<<r1   c                    K   |                      ||           d {V sdS |                     ||           d {V sdS dS )NFT)_validate_session_validate_protocol_version)r8   re   rz   s      r2   r   z7StreamableHTTPServerTransport._validate_request_headers3  si      ++GT:::::::: 	544WdCCCCCCCC 	5tr1   c                 \  K   | j         sdS |                     |          }|s?|                     dt          j                  } ||j        |j        |           d{V  dS || j         k    r?|                     dt          j                  } ||j        |j        |           d{V  dS dS )z'Validate the session ID in the request.TzBad Request: Missing session IDNFr   )rH   r   r   r
   r   r   r   r   )r8   re   rz   r   r   s        r2   r  z/StreamableHTTPServerTransport._validate_session:  s      " 	4 "11':: " 	221& H (7='/4@@@@@@@@@5 !44422:$ H (7='/4@@@@@@@@@5tr1   c                 2  K   |j                             t                    }|t          }|t          vrcd                    t                    }|                     d| dd| z   t          j                  } ||j	        |j
        |           d{V  dS dS )z4Validate the protocol version header in the request.Nz, z+Bad Request: Unsupported protocol version: z. zSupported versions: FT)r   r   r   r   r   joinr   r
   r   r   r   )r8   re   rz   rf   supported_versionsr   s         r2   r  z8StreamableHTTPServerTransport._validate_protocol_versionW  s       #?../JKK #9 #>>>!%+F!G!G22R>NRRR=);==>& H
 (7='/4@@@@@@@@@5tr1   r:   c                    	
K    j         sdS 	 ddt          d} j        r j        |t          <   |j                            t          t                    	t          j	        t          t          t          f                  d          \  
}	 
fd}t          |||          }	  ||j        |j        |           d{V  n*# t          $ r t                               d           Y nw xY w
                                 d{V  |                                 d{V  dS # 
                                 d{V  |                                 d{V  w xY w# t          $ ra t                               d	                                d	t(          j        t,                    } ||j        |j        |           d{V  Y dS w xY w)
z
        Replays events that would have been sent after the specified event ID.
        Only used when resumability is enabled.
        Nr   r   r   r   c                    K   	 	4 d {V  dt           dd f	fd}                     |            d {V }|r|j        vrɉ	j        |<                       |	           d {V  t          j        t                    d          j        |<   j        |         d         }|4 d {V  |2 3 d {V }                    |          }	                    |           d {V  86 	 d d d           d {V  n# 1 d {V swxY w Y   d d d           d {V  d S # 1 d {V swxY w Y   d S # t
          j	        $ r t                              d           Y d S t          $ r t                              d           Y d S w xY w)Nr   r6   c                 l   K                        |           }                    |           d {V  d S rj   )r   rz   )r   r   r8   rt   s     r2   
send_eventzWStreamableHTTPServerTransport._replay_events.<locals>.replay_sender.<locals>.send_event  sF      )-)@)@)O)OJ"3"8"8"D"DDDDDDDDDDr1   r   r   z.Replay SSE stream closed by close_sse_stream()zError in replay sender)r'   r=   rS   rT   r}   r   r   r   rz   r   r   r   r   r   )
r#  r5   
msg_readerr   r   rJ   r:   replay_protocol_versionr8   rt   s
        r2   replay_senderzCStreamableHTTPServerTransport._replay_events.<locals>.replay_sender  s      ?0 M M M M M M M MEL ET E E E E E E E
 +6*I*I-Yc*d*d$d$d$d$d$d$d	 % M$:O)O)OBSD4Y? #'"@"@L]_v"w"wwwwwwww @E?`am?nop?q?qD1)<)-)>y)I!)LJ (2 M M M M M M M M;E !M !M !M !M !M !M !M-151H1H1W1WJ*;*@*@*L*L$L$L$L$L$L$L$L$L <F:M M M M M M M M M M M M M M M M M M M M M M M M M M M-M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M6 0 S S SLL!QRRRRRR  ? ? ?$$%=>>>>>>?sk   D4 B!D!.C=1C)73C=+D!=
D	D!
D	D!D4 !
D++D4 .D+/D4 4)F #FFr   zError in replay responsezError replaying events)rQ   r   rH   r   r   r   r   r   r   r   r   r/   r   r   r   r   r   r   r   r   r
   r   r   )r8   r:   re   rz   r   r   r&  r   rJ   r%  rt   s   ``      @@@r2   r  z,StreamableHTTPServerTransport._replay_eventsm  s     
 ' 	FI	A!9* 0 G " E151D-. '.o&9&9:UWq&r&r# 493TUYZ]_bZbUc3def3g3g00!? !? !? !? !? !? !? !? !?H +)%2  H1hw}gotDDDDDDDDDD = = =  !;<<<<<= (..000000000'..00000000000 (..000000000'..0000000000 	A 	A 	A566622(0 H
 (7='/4@@@@@@@@@@@@	AsI   BE! *C D( $C/,D( .C//D( 24E! (6EE! !A'GGc                   K   t          j        t          t          z           d          \  }}t          j        t                   d          \  }| _        | _         _        | _        t          j                    4 d{V } fd}|	                    |           	 ||fW V  t           j                                                  D ]}                     |           d{V   j                                         	 |                                 d{V  |                                 d{V                                   d{V  |                                 d{V  n4# t          $ r(}t                               d|            Y d}~nd}~ww xY w# t           j                                                  D ]}                     |           d{V   j                                         	 |                                 d{V  |                                 d{V                                   d{V  |                                 d{V  w # t          $ r'}t                               d|            Y d}~w d}~ww xY wxY wddd          d{V  dS # 1 d{V swxY w Y   dS )zContext manager that provides read and write streams for a connection.

        Yields:
            Tuple of (read_stream, write_stream) for bidirectional communication
        r   Nc                     K   	 2 3 d {V } | j         }d }t          |j        t          t          z            rt          |j        j                  }|}nF| j        ?t          | j        t                    r%| j        j	        t          | j        j	                  }||nt          }d }j        rAj                            ||           d {V }t                              d| d|            |j        v rz	 j        |         d                             t#          ||                     d {V  /# t$          j        t$          j        f$ r j                            |d            Y hw xY wt                              d| d           6 d S # t$          j        $ rB j        rt                              d           Y d S t                              d           Y d S t0          $ r t                              d           Y d S w xY w)	NzStored z from r   zRequest stream z not found 
                                for message. Still processing message as the client
                                might reconnect and replay.zRead stream closed by clientz3Unexpected closure of read stream in message routerzError in message router)r(   r   r   r#   r    r/   rw   rq   r   related_request_idrc   rQ   r9   r   r   rS   rz   r'   r   BrokenResourceErrorr   r\   rU   r   r   )r   r(   target_request_idresponse_idrequest_stream_idr)   r8   write_stream_readers         r2   message_routerz=StreamableHTTPServerTransport.connect.<locals>.message_router  s     6@1D . . . . . . .o"1"9,0)%glOl4RSS a*-glo*>*>K 1<-- ,4@ * / 8 5! ! A
 !0 8 K W03O4L4_0`0`-ARA^,=,=dr)
 $(, X-1->-J-JK\^e-f-f'f'f'f'f'f'fH"LL)V8)V)VCT)V)VWWW,0EEES&*&;<M&Nq&Q&V&VWcdkmuWvWv&w&w w w w w w w w w % 9 % 9$ S S S
 !% 5 9 9:KT R R R R RS #LL!?4E !? !? !?   U 2E1D1D^ 0 ` ` `' `%CDDDDDD(()^______  @ @ @$$%>??????@sL   F FC,F ::D64F 66E0,F /E00$F 0H	H&#HHr  )r   r   r   r   rC   rD   rF   rE   r   r   r  rS   r  r   r  r   r   r   )	r8   read_stream_writerread_streamwrite_streamr  r/  r5   r   r.  s	   `       @r2   connectz%StreamableHTTPServerTransport.connect  sr     $ +0*KN]fLf*ghi*j*j'K,1,Mn,]^_,`,`)) $6 '$7!) *,, N	@ N	@ N	@ N	@ N	@ N	@ N	@7@ 7@ 7@ 7@ 7@ 7@t MM.)))@!</////!%d&;&@&@&B&B!C!C C CI77	BBBBBBBBBB%++---@,33555555555%,,.........-44666666666&--//////////  @ @ @LL!>1!>!>????????@ "&d&;&@&@&B&B!C!C C CI77	BBBBBBBBBB%++---@,33555555555%,,.........-44666666666&--//////////  @ @ @LL!>1!>!>????????@YN	@ N	@ N	@ N	@ N	@ N	@ N	@ N	@ N	@ N	@ N	@ N	@ N	@ N	@ N	@ N	@ N	@ N	@ N	@ N	@ N	@ N	@ N	@ N	@ N	@ N	@ N	@ N	@ N	@ N	@s   J9#F'*AJ9A(E20J92
F$<FJ9F$$J9'AJ#A(I/.J#/
J 	9J	J#J 	 J##J99
KK)FNNNrr   )=r*   r+   r,   r-   rC   r   r   r   r.   rD   r   rE   rF   r   r/   boolr4   r   intrV   propertyrY   r$   ra   rd   r!   r   rs   r   r   r}   r   r
   r   r   r  r   r   r'   r   r   r   r   r   r   tupler   r   r   r   r   r   r  r   r   r  r  r  r   r   r3  r0   r1   r2   rB   rB   {   s          VZ/0JKdRYYYQUL+NY,FG$NUUUCGM).9D@GGGMQ3NCdJQQQ****
 */)->B%),! ,!d
,! #',!  $&	,!
 5t;,! d
,! 
,! ,! ,! ,!\  t       X #9 # # # # #8. . . .&:: : 	:
 : 
: : : :@44 2$sCx.A4 	4
 
4 4 4 4< *)-
 

  
 	

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

 

 
 
 
(:w :3: : : : : c3h    < <t < < < <B% B' B BRV B B B B:!W !tTz9J ! ! ! !M7 Mt M M M MW U RV [_    ,S S SRY Sae Sjn S S S SjZ@ Z@ Z@ Z@ Z@ Z@ Z@x=G =4 =D = = = =.8 8 8 8>= = =QU = = = = w d t    w d t    : t PT    ,RA# RA RAt RAX\ RA RA RA RAh i@	%ny&@A">24	
 			
i@ i@ i@ i@ i@ i@r1   rB   )Ir-   r   loggingreabcr   r   collections.abcr   r   r   
contextlibr   dataclassesr	   httpr
   typingr   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   r   r   r  r   r   rc   compilerN   r/   r>   r?   r'   r@   r4   rB   r0   r1   r2   <module>rL     s"      				 # # # # # # # # ? ? ? ? ? ? ? ? ? ? * * * * * * ! ! ! ! ! !              R R R R R R R R $ $ $ $ $ $ - - - - - - & & & & & & ( ( ( ( ( ( 0 0 0 0 0 0 0 0 0 0        E D D D D D D D : : : : : :                          
	8	$	$ ) 4 &  ' &    RZ 122  
                 ,489# # # # # # # #Lp@ p@ p@ p@ p@ p@ p@ p@ p@ p@r1   