
    kKj/U                       U d dl mZ d dlmZmZmZm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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 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& d dl'm(Z( d dl)m*Z* d dl+m,Z, d dl-m.Z.m/Z/m0Z0 d dl1m2Z2m3Z3m4Z4m5Z5m6Z6 d dl7m8Z8 d dl9m:Z: d dl;m<Z< d dl=m>Z> erd dl?m@Z@  e>eA      ZBdZC G d de       ZD G d d       ZEd:d!ZFd;d"ZGd;d#ZHd<d$ZId=d%ZJd>d&ZKd:d'ZLd=d(ZMd?d)ZNd@d*ZO G d+ d,      ZP ed-d./      ZQd0eRd1<    G d2 d3e$      ZSe	dAd4       ZT G d5 d6      ZU	 	 dB	 	 	 	 	 	 	 	 	 dCd7ZV	 	 	 	 dD	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dEd8ZW	 	 	 	 	 	 	 	 	 	 	 dF	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dGd9ZXy.)H    )annotations)AsyncGeneratorCallable	GeneratorSequence)asynccontextmanagercontextmanager)
ContextVar)fnmatchcase)
ip_address)TYPE_CHECKINGAny)urlsplit)uuid4)build_resource_metadata_url)LifespanResultT)SseServerTransport)
EventStore)StreamableHTTPSessionManager)TransportSecuritySettings)	Starlette)Headers)
Middleware)Request)Response)	BaseRouteMountRoute)ASGIAppLifespanReceiveScopeSend)AuthProvider)RequireAuthMiddleware)SessionScopedEventStore)
get_logger)FastMCP)z	127.0.0.1	localhostz::1c                       e Zd ZdZ	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZedd       Zej                  dd       Z xZS )	#FastMCPStreamableHTTPSessionManagerzGSession manager that scopes resumability storage per transport session.c                >    d | _         t        | 	  ||||||       y )N)appevent_storejson_response	statelesssecurity_settingsretry_interval)_shared_event_storesuper__init__)selfr-   r.   r/   r0   r1   r2   	__class__s          d/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/fastmcp/server/http.pyr5   z,FastMCPStreamableHTTPSessionManager.__init__,   s1     7; #'/) 	 	
    c                n    | j                   y t        | j                   t               j                        S )N)
session_id)r3   r&   r   hexr6   s    r8   r.   z/FastMCPStreamableHTTPSessionManager.event_store?   s,    ##+ 't'?'?EGKKXXr9   c                    || _         y N)r3   )r6   r.   s     r8   r.   z/FastMCPStreamableHTTPSessionManager.event_storeG   s
    #. r9   )NFFNN)r-   r   r.   EventStore | Noner/   boolr0   rA   r1   z TransportSecuritySettings | Noner2   
int | NonereturnNone)rC   r@   )r.   r@   rC   rD   )	__name__
__module____qualname____doc__r5   propertyr.   setter__classcell__)r7   s   @r8   r+   r+   )   s    Q
 *.#>B%)

 '
 	

 
 <
 #
 

& Y Y / /r9   r+   c                       e Zd ZdZddZddZy)StreamableHTTPASGIAppz>ASGI application wrapper for Streamable HTTP server transport.c                    || _         y r?   )session_manager)r6   rO   s     r8   r5   zStreamableHTTPASGIApp.__init__O   s
    .r9   c                $  K   	 | j                   t        d      | j                   j                  |||       d {    y 7 # t        $ rA}t        |      dk(  r-t        j                  d| d       d}t        | d|       | d }~ww xY ww)Nz6Task group is not initialized. Make sure to use run().z(Original RuntimeError from mcp library: Texc_infoa  FastMCP's StreamableHTTPSessionManager task group was not initialized. This commonly occurs when the FastMCP application's lifespan is not passed to the parent ASGI application (e.g., FastAPI or Starlette). Please ensure you are setting `lifespan=mcp_app.lifespan` in your parent app's constructor, where `mcp_app` is the application instance returned by `fastmcp_instance.http_app()`. \nFor more details, see the FastMCP ASGI integration documentation: https://gofastmcp.com/deployment/asgiz\nOriginal error: )rO   RuntimeErrorhandle_requeststrloggererror)r6   scopereceivesendenew_error_messages         r8   __call__zStreamableHTTPASGIApp.__call__R   s     	##+"L  &&55eWdKKK 	1vQQ>qcBT  < " #&7%88KA3#OPVWW )	s8   B7A AA  BA 	B<BBBN)rO   z#StreamableHTTPSessionManager | NonerX   r"   rY   r!   rZ   r#   rC   rD   rE   rF   rG   rH   r5   r]    r9   r8   rM   rM   L   s    H/r9   rM   c                    | j                         j                         } | sy| j                  d      r| j                  d      }|dk(  r| S | d| S | j	                  d      dk(  r| j                  dd      d   S | S )N []   :r   )striplower
startswithfindcountrsplit)hostends     r8   _normalize_hostrp   p   sx    ::<Dsiin"9KAc{zz#!{{3"1%%Kr9   c                n    t        |       } | dk(  ry	 t        |       j                  S # t        $ r Y yw xY w)Nr)   TF)rp   r   is_loopback
ValueErrorrn   s    r8   _is_loopback_hostru      s?    4 D{$+++ s   ( 	44c                h    t        |       } | sy	 t        |       j                  S # t        $ r Y yw xY w)NTF)rp   r   is_unspecifiedrs   rt   s    r8   _is_unspecified_hostrx      s:    4 D$... s   % 	11c                d    t        |       } |D ]   }t        |      }|dk(  st        | |      s  y yN*TF)rp   r   )rn   allowed_hostsallowed_hostpatterns       r8   _host_matchesr      s8    4 D%!,/c>[w7 &
 r9   c                X    	 t        |       }|j                  xs dS # t        $ r Y yw xY w)Nrb   )r   rs   hostname)originparseds     r8   _origin_hostr      s6    &! ?? b   s    	))c                $    ||S | dk(  ry| dk(  ryy )NhttpP   httpsi  r`   )schemeports     r8   _origin_portr      s&    r9   c                <    d| v r| j                  d      sd|  dS | S )Nrg   rc   rd   )rj   rt   s    r8   _format_origin_hostr      s'    
d{4??3/4&{Kr9   c                   | j                         j                  d      } 	 t        |       }|j                  }|j                  r|j                  s| j                         S |j                  s|j                  s|j                  r| j                         S |j                  j                         }t        t        |j                              }t        ||      }|| d| S | d| d| S # t        $ r | j                         cY S w xY w)N/://rg   )rh   rstripr   r   rs   ri   r   r   pathqueryfragmentr   rp   r   )r   r   r   r   rn   normalized_ports         r8   _normalize_originr      s    \\^""3'F&!{{ ==||~{{fllfoo||~]]  "Fv?@D"640OTF##XSa011  ||~s   C+ +DDc                B    t        | j                  dd       d|       S )Nr   r   r   )r   get)rX   rn   s     r8   _request_originr      s$    		(F ;<CvFGGr9   c                d    t        |       } |D ]   }t        |      }|dk(  st        | |      s  y yrz   )r   r   )r   allowed_originsallowed_originr~   s       r8   _origin_matchesr      s8    v&F)#N3c>[9 *
 r9   c                  D    e Zd ZdZ	 	 d	 	 	 	 	 	 	 ddZd	dZd
dZddZy)HostOriginGuardMiddlewarezDValidate Host and Origin headers before requests reach MCP sessions.Nc                b    || _         t        |xs d      | _        t        |xs d      | _        y )Nr`   )r-   tupler|   r   )r6   r-   r|   r   s       r8   r5   z"HostOriginGuardMiddleware.__init__   s/     "=#6B7$_%:;r9   c                  K   |d   dk7  r| j                  |||       d {    y | j                  |      }t        |      }|j                  dd      }t	        ||      s t        dd      } ||||       d {    y |j                  d	      }t        ||      }	|r3| j                  ||	|      s t        d
d      } ||||       d {    y | j                  |||       d {    y 7 7 u7 %7 w)Ntyper   )rX   rn   rb   zMisdirected Requesti  )status_coder   zForbidden Origini  )r-   _allowed_hosts_for_scoper   r   r   r   r   _origin_allowed)
r6   rX   rY   rZ   r|   headersrn   responser   request_origins
             r8   r]   z"HostOriginGuardMiddleware.__call__   s     =F"((5'400055e<&{{62&T=1 53GH5'4000X&(5$..v~tL 2DH5'4000hhugt,,,' 1 1 1 	-sG   C8C0AC8<C2=AC8C4C8*C6+C82C84C86C8c                    t        t              }|j                  | j                         |j	                  d      }|r!|d   }t        |      s|j                  |       t        |      S )Nserverr   )listDEFAULT_HOSTSextendr|   r   rx   appendr   )r6   rX   r|   r   server_hosts        r8   r   z2HostOriginGuardMiddleware._allowed_hosts_for_scope  s[    ]+T//08$ )K'4$$[1]##r9   c                    t        || j                        ryt        |      }t        |      rt        |      ryt	        |      |k(  S )NT)r   r   r   ru   r   )r6   r   r   rn   origin_hosts        r8   r   z)HostOriginGuardMiddleware._origin_allowed  sB    64#7#78"6*[).?.E (N::r9   )NN)r-   r   r|   Sequence[str] | Noner   r   rC   rD   r^   )rX   r"   rC   ztuple[str, ...])r   rU   r   rU   rn   rU   rC   rA   )rE   rF   rG   rH   r5   r]   r   r   r`   r9   r8   r   r      sG    N
 /304	<< ,< .	<
 
<-.
$;r9   r   http_requestN)defaultzContextVar[Request | None]_current_http_requestc                      e Zd Zedd       Zy)StarletteWithLifespanc                .    | j                   j                  S r?   )routerlifespan_contextr=   s    r8   lifespanzStarletteWithLifespan.lifespan!  s    {{+++r9   N)rC   zLifespan[Starlette])rE   rF   rG   rI   r   r`   r9   r8   r   r      s    , ,r9   r   c              #     K   t         j                  |       }	 |  t         j                  |       y # t         j                  |       w xY wwr?   )r   setreset)requesttokens     r8   set_http_requestr   &  s=     !%%g.E+##E*##E*s   A3 AA

Ac                      e Zd ZdZd Zd Zy)RequestContextMiddlewarezV
    Middleware that stores each request in a ContextVar and sets transport type.
    c                    || _         y r?   r-   )r6   r-   s     r8   r5   z!RequestContextMiddleware.__init__4  s	    r9   c                x  K   |d   dk(  rsddl m}m} t        |d   j                  dd       }|r ||      nd }	 t        t        |            5  | j                  |||       d {    d d d        |	 ||       y y | j                  |||       d {    y 7 4# 1 sw Y   3xY w# |	 ||       w w xY w7 #w)Nr   r   r   )reset_transportset_transportr-   transport_type)fastmcp.server.contextr   r   getattrstater   r   r-   )r6   rX   rY   rZ   r   r   r   transport_tokens           r8   r]   z!RequestContextMiddleware.__call__7  s     =F"M %U5\%7%79I4PN?MmN;SWO5%gen5((5'4888 6 #.#O4 / ((5'4000 9 65 #.#O4 / 1sR   7B:B( B%B&B*B( 2"B:B8B:BB%!B( (B55B:Nr_   r`   r9   r8   r   r   /  s    1r9   r   c                ^    |j                  dt        t                     t        | |||      S )aR  Create a base Starlette app with common middleware and routes.

    Args:
        routes: List of routes to include in the app
        middleware: List of middleware to include in the app
        debug: Whether to enable debug mode
        lifespan: Optional lifespan manager for the app

    Returns:
        A Starlette application
    r   routes
middlewaredebugr   )insertr   r   r   r   s       r8   create_base_appr   H  s3    $ a$<=> 	 r9   c           
         g }g }t        |      d fd|r|j                         }	|j                  |      }
|j                  |
       |j                  |	       |j	                  |      }|rt        |      nd}|j                  t        |t        |j                  |      dg             |j                  t        |t        j                  |j                  |                   nJdfd}|j                  t        ||dg             |j                  t        |j                               |r|j                  |       |j                   j                                |r|j                  |       t        d fd       }t        ||||	      } |j                  _        ||j                  _        d
|j                  _        |S )a  Return an instance of the SSE server app.

    Args:
        server: The FastMCP server instance
        message_path: Path for SSE messages
        sse_path: Path for SSE connections
        auth: Optional authentication provider (AuthProvider)
        debug: Whether to enable debug mode
        routes: Optional list of custom routes
        middleware: Optional list of middleware
    Returns:
        A Starlette application with RequestContextMiddleware
    c                F  K   j                  | ||      4 d {   }j                  j                  |d   |d   j                  j                                d {    d d d       d {    t	               S 7 a7  7 # 1 d {  7  sw Y   t	               S xY ww)Nr   rf   )connect_sse_mcp_serverruncreate_initialization_optionsr   )rX   rY   rZ   streamsr   sses       r8   
handle_ssez"create_sse_app.<locals>.handle_sse  s     ??5'488G$$((

""@@B   98 z 9 9888 zsV   B!A=B!?BA?B#B!.B/B!?BB!B	B
BB!mcp_pathNGETendpointmethodsr   c                p   K    | j                   | j                  | j                         d {   S 7 wr?   )rX   rY   _send)r   r   s    r8   sse_endpointz$create_sse_app.<locals>.sse_endpoint  s(     #GMM7??GMMRRRRs   ,646c                  K   j                         4 d {    d  d d d       d {    y 7 7 # 1 d {  7  sw Y   y xY wwr?   )_lifespan_manager)r-   r   s    r8   r   z create_sse_app.<locals>.lifespan  s2     ++-- .------s:   A3A7A5AAA	A A	Ar   r   )rX   r"   rY   r!   rZ   r#   rC   r   )r   r   rC   r   r-   r   rC   zAsyncGenerator[None, None])r   get_middleware
get_routesr   _get_resource_urlr   r   r   r%   required_scopesr   handle_post_message_get_additional_http_routesr   r   r   fastmcp_serverr   r   )r   message_pathsse_pathauthr   r   r   server_routesserver_middlewareauth_middlewareauth_routesresource_urlresource_metadata_urlr   r   r-   r   r   s   `               @@r8   create_sse_appr   d  s   . &(M*, \
*C --/ ooxo8[)  1 --h79E'54 	
 	.(()
 
	
 	)++(()		
	S 	%	
 	++	
 V$;;=>   , 
 $	C  &CIICIIN$CIIJr9   c           
     >    g }g }t        d      |r|j                         }|j                  |      }|j                  |       |j                  |       |j	                  |      }|rt        |      nd}rddgng d}|j                  t        |t        |j                  |      |             n%rddgnd}|j                  t        ||             |r|j                  |       |j                   j                                |
r"|j                  dt        t        ||             |	r|j                  |	       t        d fd	       }t        ||||
      } |j                   _        ||j                   _        d|j                   _        |S )a  Return an instance of the StreamableHTTP server app.

    Args:
        server: The FastMCP server instance
        streamable_http_path: Path for StreamableHTTP connections
        event_store: Optional event store for SSE polling/resumability
        retry_interval: Optional retry interval in milliseconds for SSE polling.
            Controls how quickly clients should reconnect after server-initiated
            disconnections. Requires event_store to be set. Defaults to SDK default.
        auth: Optional authentication provider (AuthProvider)
        json_response: Whether to use JSON response format
        stateless_http: Whether to use stateless mode (new transport per request)
        debug: Whether to enable debug mode
        routes: Optional list of custom routes
        middleware: Optional list of middleware
        host_origin_protection: Whether to validate Host and Origin headers
            before requests reach the MCP endpoint.
        allowed_hosts: Additional hostnames that may appear in the Host header.
        allowed_origins: Additional browser origins trusted by the request guard.
            Configure CORS separately when browser JavaScript must read
            cross-origin responses.

    Returns:
        A Starlette application with StreamableHTTP support
    Nr   POSTDELETE)r   r   r   r   r   )r|   r   c           
    R  K   t        j                        _        j                         4 d {    j                  j	                         4 d {    	 d  j                  }t        |j                  j                               D ]  }	 |j                          d {     	 d d d       d {    d d d       d {    y 7 7 {7 ,# t        $ r t        j                  dd       Y hw xY w# j                  }t        |j                  j                               D ]B  }	 |j                          d {  7   # t        $ r t        j                  dd       Y @w xY w w xY w7 # 1 d {  7  sw Y   xY w7 # 1 d {  7  sw Y   y xY ww)N)r-   r.   r2   r/   r0   z7Error terminating streamable-HTTP transport on shutdownTrQ   )r+   r   rO   r   r   r   _server_instancesvalues	terminate	ExceptionrV   r   )	r-   sm	transportr.   r/   r2   r   stateless_httpstreamable_http_apps	      r8   r   z,create_streamable_http_app.<locals>.lifespanP  sk    .Q""#)'$/
+ $$&&//3355 )88 "&b&:&:&A&A&C!DI'11333 "E 65 '&&5  4$ U%) %  )88 "&b&:&:&A&A&C!DI'11333$ U%) %  "E 6555 '&&&s
  4F'CF'FCFE; D %2E;C+C
,C0E;3F>E9?FF'FF'FC C=	:E;<C=	=E; 3E64E
E
E
E6 E1.E60E11E66E;9F;F	FF		FF'F$FF$ F'r   zstreamable-httpr   )rM   r   r   r   r   r   r   r   r%   r   r   r   r   r   r   r   r   r   r   r   )r   streamable_http_pathr.   r2   r   r/   r  r   r   r   host_origin_protectionr|   r   r   r   r   r   r   r   http_methodsr   r-   r  s   ` `` ``               @r8   create_streamable_http_appr    s   P &(M*, 05 --/ oo/CoD[)  1 --.BC9E'54 	 #1VX6O 	 	$.'(()
 %
	
 .<)$,$	
 V$;;=>   )+ /	
   ,   D $	C  &CII)CIIN0CIIJr9   )rn   rU   rC   rU   )rn   rU   rC   rA   )rn   rU   r|   Sequence[str]rC   rA   )r   rU   rC   rU   )r   rU   r   rB   rC   rB   )rX   r"   rn   rU   rC   rU   )r   rU   r   r  rC   rA   )r   r   rC   zGenerator[Request, None, None])FN)
r   zlist[BaseRoute]r   zlist[Middleware]r   rA   r   zCallable | NonerC   r   )NFNN)r   FastMCP[LifespanResultT]r   rU   r   rU   r   AuthProvider | Noner   rA   r   list[BaseRoute] | Noner   list[Middleware] | NonerC   r   )NNNFFFNNTNN)r   r  r  rU   r.   r@   r2   rB   r   r  r/   rA   r  rA   r   rA   r   r  r   r  r	  rA   r|   r   r   r   rC   r   )Y
__future__r   collections.abcr   r   r   r   
contextlibr   r	   contextvarsr
   fnmatchr   	ipaddressr   typingr   r   urllib.parser   uuidr   mcp.server.auth.routesr   mcp.server.lowlevel.serverr   mcp.server.sser   mcp.server.streamable_httpr   "mcp.server.streamable_http_managerr   mcp.server.transport_securityr   starlette.applicationsr   starlette.datastructuresr   starlette.middlewarer   starlette.requestsr   starlette.responsesr   starlette.routingr   r   r   starlette.typesr   r    r!   r"   r#   fastmcp.server.authr$   fastmcp.server.auth.middlewarer%   fastmcp.server.event_storer&   fastmcp.utilities.loggingr'   fastmcp.server.serverr(   rE   rV   r   r+   rM   rp   ru   rx   r   r   r   r   r   r   r   r   r   __annotations__r   r   r   r   r   r  r`   r9   r8   <module>r-     sv   " I I : "    % !  > 6 - L C , , + & ( 5 5 C C , @ > 0-	H	1 /*F  /F! !H"!2.H8; 8;v 5?5 1 ,I , + +1 18  $	   	
 @ !%%)*.|$|| | 	|
 | #| (| |D &*!% $ %)*.#'*.,0[$[[ #[ 	[
 [ [ [ [ #[ ([ ![ ([ *[ [r9   