
    kKjS9                       d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	m
Z
 ddlZddlmZ ddlmZ ddlZddlmZ dd	lmZmZmZ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$ e	rddl%m&Z&  e'h d      Z(ddZ)g dZ* e e+      Z,dZ-ddZ.d dZ/ G d de      Z0 G d de      Z1d!dZ2 G d de      Z3y)"z@OpenAPI component classes: Tool, Resource, and ResourceTemplate.    )annotationsN)Callable)TYPE_CHECKINGAny)ToolAnnotations)AnyUrl)FastMCPDeprecationWarning)ResourceResourceContentResourceResultResourceTemplate)get_http_headers)
TaskConfig)Tool
ToolResult)
get_logger)	HTTPRoute)RequestDirector)Context>	   
user-agentcache-controlcontent-lengthaccept-encodingaccept-languagehostaccept
connectioncontent-typec                    | j                         D ci c]   \  }}||j                         t        v r|nd" c}}S c c}}w )Nz***)itemslower_SAFE_HEADERS)headerskvs      |/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/fastmcp/server/providers/openapi/components.py_redact_headersr'   0   s8    FMmmoVodaAAGGI.qE9oVVVs   %=)OpenAPIResourceOpenAPIResourceTemplateOpenAPITool_extract_mime_type_from_routeapplication/jsonc                   | j                   st        S g d}d}|D ]!  }|| j                   v s| j                   |   } n |7| j                   j                         D ]  \  }}|j                  d      s|} n ||j                  st        S t        |j                  j                               }t        |      dk(  r|d   S g d}|D ]  }||j                  v s|c S  |d   S )a,  Extract the primary MIME type from an HTTPRoute's response definitions.

    Looks for the first successful response (2xx) and returns its content type.
    Prefers JSON-compatible types when multiple are available.
    Falls back to "application/json" when no response content type is declared.
    )200201202204N2   r   )r,   zapplication/vnd.api+jsonzapplication/hal+jsonzapplication/ld+jsonz	text/json)	responses_DEFAULT_MIME_TYPEr    
startswithcontent_schemalistkeyslen)routesuccess_codesresponse_infostatus_code	resp_infocontent_typesjson_compatible_typescts           r&   r+   r+   A   s     ??!! 1MM$%//)!OOK8M % &+oo&;&;&="K%%c* ) '>
 M$@$@!! 55::<=M
=QQ $---I $
     c                    | syt        j                  dd|       }t        j                  dd|      }t        j                  dd|      }|j                  d      }|S )zConvert text to a URL-friendly slug format.

    Only contains lowercase letters, uppercase letters, numbers, and underscores.
     z	[\s\-\.]+_z[^a-zA-Z0-9_]z_+)resubstrip)textslugs     r&   _slugifyrL   s   s[    
  66,T*D 66"B-D 66%d#D ::c?DKrC   c                       e Zd ZU dZ ed      Zded<   	 	 	 	 d		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d
 fdZddZddZ	 xZ
S )r*   z*Tool implementation for OpenAPI endpoints.	forbiddenmoder   task_configc           	         |
6t         j                  j                  rt        j                  dt
        d       t        |   |||||xs
 t               |	|
       || _	        || _
        || _        y )NzThe `serializer` parameter is deprecated. Return ToolResult from your tools for full control over serialization. See https://gofastmcp.com/servers/tools#custom-serialization for migration examples.   )
stacklevel)namedescription
parametersoutput_schematagsr   
serializer)fastmcpsettingsdeprecation_warningswarningswarnr	   super__init__set_client_route	_director)selfclientr;   directorrU   rV   rW   rX   rY   r   rZ   	__class__s              r&   ra   zOpenAPITool.__init__   sy     !g&6&6&K&KMMg * 	#!'#! 	 	
 !rC   c                ~    d| j                   d| j                  j                   d| j                  j                   dS )NzOpenAPITool(name=z	, method=, path=))rU   rd   methodpathrf   s    r&   __repr__zOpenAPITool.__repr__   s;    "499-y9K9K8LGTXT_T_TdTdSeefggrC   c                V  K   	 t        | j                  j                        xs d}| j                  j	                  | j
                  ||      }| j                  j                  rJ| j                  j                  j                         D ]#  \  }}||j                  vs||j                  |<   % t               }|r6|j                         D ]#  \  }}||j                  vs||j                  |<   % 	 t         j#                  dt%        |j                                | j                  j'                  |       d{   }|j)                          	 |j+                         }	| j,                  #| j,                  j/                  d      rd|	i}
n|	}
nt1        |	t2              sd|	i}
n|	}
t1        |
t2              sd|
i}
t5        |
	      S # t        $ rf}t        d| j
                  j                  j                          d| j
                  j                   dt        |      j                   d|       |d}~ww xY w7 # t*        j6                  $ r t5        |j8                  
      cY S w xY w# t:        j<                  $ r}d|j>                  j@                   d|j>                  jB                   }	 |j>                  j+                         }|d| z  }nQ# t*        j6                  t        f$ r5 |j>                  j8                  r|d|j>                  j8                   z  }Y nw xY wt        |      |d}~wt:        jD                  $ r(}t        dt        |      j                   d      |d}~wt:        jF                  $ r*}t        dt        |      j                   d|      |d}~ww xY ww)z/Execute the HTTP request using RequestDirector.http://localhostzError building request for  : Nz run - sending request; headers: zx-fastmcp-wrap-resultresult)structured_content)contentHTTP error  - HTTP request timed out (rl   Request error (): )$strrc   base_urlre   buildrd   r#   r    r   	Exception
ValueErrorrm   upperrn   type__name__loggerdebugr'   sendraise_for_statusjsonrX   get
isinstancedictr   JSONDecodeErrorrJ   httpxHTTPStatusErrorresponser>   reason_phraseTimeoutExceptionRequestError)rf   	argumentsr~   requestkeyvaluemcp_headerser   ru   structured_outputerror_message
error_datas                r&   runzOpenAPITool.run   sO    	4<<001G5GHnn**4;;	8LG||##"&,,"6"6"<"<">JC'//1/4, #? +,K"-"3"3"5JC'//1/4, #61	RLL2?7??3S2TU "\\..w77H%%'9! %%1))--.EF-5v,>),2)#FD1)16(:%(.%
 ""3T:)13D(E%!5FGGI  	-dkk.@.@.F.F.H-I;;##$BtAw'7'7&81#? 	 82 '' 9!(--889 $$ 
	3ajj445R

8P8P7QR =ZZ__.
3zl!33((*5 =::??!s1::??*;%<<M= ]+2%% 	T7Q8H8H7IKLRSS!! 	RtAw/?/?.@A5IJPQQ	Rs   N)BG AG G 1A	I) :H8;I) A5H: N)	H5A!H00H55N)8I) :)I&#I) $N)%I&&I) )N&<0L--"KL-ALL-LL--N&#M&&N&<%N!!N&&N))NNNN)rg   httpx.AsyncClientr;   r   rh   r   rU   r}   rV   r}   rW   dict[str, Any]rX   dict[str, Any] | NonerY   set[str] | Noner   zToolAnnotations | NonerZ   zCallable[[Any], str] | Nonereturnr}   )r   r   r   r   )r   
__module____qualname____doc__r   rQ   __annotations__ra   rp   r   __classcell__ri   s   @r&   r*   r*      s    4(k:K: 04 $.226 "! "  " "	 "
  "  " # " - "  " , " 0 "DhJRrC   r*   c                  |     e Zd ZU dZ ed      Zded<   	 	 	 d		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d
 fdZddZddZ	 xZ
S )r(   z.Resource implementation for OpenAPI endpoints.rN   rO   r   rQ   c
                    t         
|   t        |      ||||xs
 t                      || _        || _        || _        t        |	xs i       | _        y )N)urirU   rV   	mime_typerY   )	r`   ra   r   rb   rc   rd   re   r   
_arguments)rf   rg   r;   rh   r   rU   rV   r   rY   r   ri   s             r&   ra   zOpenAPIResource.__init__  sW     	s# 	 	
 !yB/rC   c                j    d| j                   d| j                  d| j                  j                   dS )NzOpenAPIResource(name=z, uri=rk   rl   )rU   r   rd   rn   ro   s    r&   rp   zOpenAPIResource.__repr__  s1    &tyym6$((WT[[M]M]L^^_``rC   c                  
K   	 t        | j                  j                        xs d}| j                  j	                  | j
                  | j                  |      }| j                  j                  |j                  |j                  j                  d      |j                  j                  |j                  |j                  |j                        }t               }|r|j                  j!                  |       | j                  j#                  |       d{   }|j%                          |j                  j'                  dd      j)                         
d
v r;|j+                         }t-        t/        t+        j0                  |      d      g	      S t3        
fd
dD              r,t-        t/        |j4                  | j6                        g	      S t-        t/        |j                  | j6                        g	      S 7 # t8        j:                  $ r}d|j<                  j>                   d|j<                  j@                   }	 |j<                  j+                         }	|d|	 z  }nQ# t*        jB                  tD        f$ r5 |j<                  j4                  r|d|j<                  j4                   z  }Y nw xY wtE        |      |d}~wt8        jF                  $ r(}tE        dtI        |      jJ                   d      |d}~wt8        jL                  $ r*}tE        dtI        |      jJ                   d|      |d}~ww xY ww)z2Fetch the resource data by making an HTTP request.rr   N)query)rm   urlparamsr#   rw   
extensionsr   rE   r,   )rw   r   )contentsc              3  &   K   | ]  }|v  
 y wN ).0rB   content_types     r&   	<genexpr>z'OpenAPIResource.read.<locals>.<genexpr>B  s     O2NBR<'2Ns   )ztext/zapplication/xmlrx   rt   ry   rz   rl   r{   r|   )'r}   rc   r~   re   r   rd   r   build_requestrm   r   	copy_withr   r#   rw   r   r   updater   r   r   r!   r   r   r   dumpsanyrJ   r   r   r   r   r>   r   r   r   r   r   r   r   )rf   r~   directed_requestr   r   r   ru   r   r   r   r   s             @r&   readzOpenAPIResource.read!  s    >	R4<<001G5GH#~~33T__h  ll00'..$((222>'++22(00(00+66 1 G +,K&&{3!\\..w77H%%'#++//CIIKL!\1!%'$(JJv$6BT  O2NOO%'X  &'$,$4$4 + 8: $$ 
	3ajj445R

8P8P7QR =ZZ__.
3zl!33((*5 =::??!s1::??*;%<<M= ]+2%% 	T7Q8H8H7IKLRSS!! 	RtAw/?/?.@A5IJPQQ	Rs   MDH G?A<H M?H M+H >M?H L>0K"I('K(AJ63K5J66KL>#K>>L>%L99L>>M)r,   NN)rg   r   r;   r   rh   r   r   r}   rU   r}   rV   r}   r   r}   rY   r   r   r   r   )r   r   )r   r   r   r   r   rQ   r   ra   rp   r   r   r   s   @r&   r(   r(     s    8(k:K: , $+/0!0 0 "	0
 0 0 0 0 0 )00a@RrC   r(   c                t    | j                   j                         D ]  \  }}|d   dk(  s|d   |k(  s|c S  |S )Nlocationrn   openapi_name)parameter_mapr    )r;   parameter_nameargument_namemappings       r&   _path_argument_namer   d  sG    "'"5"5";";"=w:&(W^-D-V   #> rC   c                       e Zd ZU dZ ed      Zded<   def	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d
 fdZddZ		 d	 	 	 	 	 	 	 dd	Z
 xZS )r)   z7Resource template implementation for OpenAPI endpoints.rN   rO   r   rQ   Nc
                r    t         
|   |||||xs
 t               |	       || _        || _        || _        y )N)uri_templaterU   rV   rW   rY   r   )r`   ra   rb   rc   rd   re   )rf   rg   r;   rh   r   rU   rV   rW   rY   r   ri   s             r&   ra   z OpenAPIResourceTemplate.__init__p  sF     	%#! 	 	
 !rC   c                j    d| j                   d| j                  d| j                  j                   dS )NzOpenAPIResourceTemplate(name=z, uri_template=rk   rl   )rU   r   rd   rn   ro   s    r&   rp   z OpenAPIResourceTemplate.__repr__  s8    .tyym?4K\K\J__fgkgrgrgwgwfxxyzzrC   c                  K   |j                         D cg c]  \  }}| d|  }}}i }| j                  j                  D ]|  }|j                  dk7  rt	        | j                  |j
                        }	|j
                  |v r||j
                     ||	<   T|j
                  j                  dd      }
|
|v su||
   ||	<   ~ t        | j                  | j                  | j                  || j
                   ddj                  |       | j                  xs d| j                  j                   | j                  t        | j                  j                  xs g       |	      S c c}}w w)z,Create a resource with the given parameters.=rn   -rF   zResource for )	rg   r;   rh   r   rU   rV   r   rY   r   )r    rd   rW   r   r   rU   replacer(   rc   re   joinrV   rn   r   rb   rY   )rf   r   r   contextr   r   	uri_partsr   	parameterr   normalized_names              r&   create_resourcez'OpenAPIResourceTemplate.create_resource  sH     9?G*#uuAeW%	G	//I!!V+/Y^^LM~~'+1)..+A	-('nn44S#>O&(+1/+B	-( 0 <<++^^II;a 345((NmDKK<L<L;M,NnnT[[%%+,

 
	
 Hs   E'E!BE'7B0E')rg   r   r;   r   rh   r   r   r}   rU   r}   rV   r}   rW   r   rY   r   r   r}   r   r   )r   r}   r   r   r   zContext | Noner   r
   )r   r   r   r   r   rQ   r   r5   ra   rp   r   r   r   s   @r&   r)   r)   k  s    A(k:K: !%+"!" " "	"
 " " " #" " "0{ #'	

 
  	

 

rC   r)   )r#   zhttpx.Headersr   zdict[str, str])r;   r   r   r}   )rJ   r}   r   r}   )r;   r   r   r}   r   r}   )4r   
__future__r   r   rG   r^   collections.abcr   typingr   r   r   	mcp.typesr   pydantic.networksr   r[   fastmcp.exceptionsr	   fastmcp.resourcesr
   r   r   r   fastmcp.server.dependenciesr   fastmcp.server.tasks.configr   fastmcp.tools.baser   r   fastmcp.utilities.loggingr   fastmcp.utilities.openapir   "fastmcp.utilities.openapi.directorr   fastmcp.serverr   	frozensetr"   r'   __all__r   r   r5   r+   rL   r*   r(   r   r)   r   rC   r&   <module>r      s    F "  	  $ %  % $  8  9 2 / 0 / >&
W 
H	 ( /d.tR$ tRn`Rh `RF>
. >
rC   