
    "<iZ                       U d dl mZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	m
Z
mZmZmZmZ d dlZd dlZd dlmZ d dlmZmZmZmZmZmZ d dlmZ d d	lmZmZ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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6 e	rd dl7m8Z8m9Z9  e-e:          Z; e!de          Z<e G d dee<                               Z= G d d          Z>eege?f         Z@deAd<   d4dZB G d d           ZC G d! d"e)          Z G d# d$e          ZDd5d(ZEe G d) d*                      ZF	 d6d7d.ZG	 d6d8d1ZH	 d6d9d3ZIdS ):    )annotationsN)Callable)	dataclass)TYPE_CHECKING	AnnotatedAnyGeneric	TypeAliasget_type_hints)validate_and_warn_tool_name)CallToolResultContentBlockIconTextContentToolAnnotationsToolExecution)Tool)FieldPydanticSchemaGenerationErrormodel_validator)TypeVar)get_contextwithout_injected_parameters
TaskConfig)FastMCPComponent)compress_schema)
get_logger)AudioFileImageNotSetNotSetTcreate_function_without_paramsget_cached_typeadapterreplace_type)ArgTransformTransformedToolT)defaultc                      e Zd ZU dZded<   dS )_WrappedResultz,Generic wrapper for non-object return types.r)   resultN)__name__
__module____qualname____doc____annotations__     /Users/kimhansen/Desktop/03 Workspace/ceo-agents/chl-effectiveness/mcp-servers/whoop/.venv/lib/python3.11/site-packages/fastmcp/tools/tool.pyr,   r,   8   s         66IIIIIr4   r,   c                      e Zd ZdS )_UnserializableTypeN)r.   r/   r0   r3   r4   r5   r7   r7   ?   s        Dr4   r7   r
   ToolResultSerializerTypedatar   returnstrc                \    t          j        | t                                                    S )N)fallback)pydantic_coreto_jsonr;   decode)r9   s    r5   default_serializerrA   F   s$     444;;===r4   c                  &    e Zd Z	 	 	 dddZddZdS )
ToolResultNcontentlist[ContentBlock] | Any | Nonestructured_contentdict[str, Any] | Any | Nonemetadict[str, Any] | Nonec                   ||t          d          ||}t          |          | _        || _        |	 t	          j        |          }n5# t          j        $ r#}t                              d|             d }~ww xY wt          |t                    s(t          dt          |          j         d|d          || _        d S )Nz5Either content or structured_content must be provided)r-   )valuezCould not serialize structured content. If this is unexpected, set your tool's output_schema to None to disable automatic serialization: z/structured_content must be a dict or None. Got z: zA. Tools should wrap non-dict values based on their output_schema.)
ValueError_convert_to_contentrD   rH   r>   to_jsonable_pythonPydanticSerializationErrorloggererror
isinstancedicttyper.   rF   )selfrD   rF   rH   es        r5   __init__zToolResult.__init__K   s0    ?19TUUU_(G+>g+N+N+N+/	)%2%E,& & &"" !;    d  ab  d  d   	
 0$77  V 233<V V@RV V V  
 :Ls   A A?A::A?r:   Olist[ContentBlock] | tuple[list[ContentBlock], dict[str, Any]] | CallToolResultc                    | j         !t          | j        | j        | j                   S | j        | j        S | j        | j        fS )N)structuredContentrD   _meta)rH   r   rF   rD   rU   s    r5   to_mcp_resultzToolResult.to_mcp_resultk   sV    
 9 !"&"9i   
 "*<|T444r4   )NNN)rD   rE   rF   rG   rH   rI   )r:   rX   )r.   r/   r0   rW   r]   r3   r4   r5   rC   rC   J   sR         48:>&*	L L L L L@5 5 5 5 5 5r4   rC   c                      e Zd ZU dZded<   dZded<   dZded<   dZd	ed
<   dZded<    e	d          d?d            Z
d@ fdZd@ fdZdddAdZedddddddeddddfdBd0            ZdCd4Zedeedeededddd5dDd>            Z xZS )Er   z Internal tool registration info.zOAnnotated[dict[str, Any], Field(description='JSON schema for tool parameters')]
parametersNzRAnnotated[dict[str, Any] | None, Field(description='JSON schema for tool output')]output_schemaz]Annotated[ToolAnnotations | None, Field(description='Additional annotations about the tool')]r   z]Annotated[ToolExecution | None, Field(description='Task execution configuration (SEP-1686)')]	executionzlAnnotated[ToolResultSerializerType | None, Field(description='Optional custom serializer for tool results')]
serializeraftermoder:   c                .    t          | j                   | S )z<Validate tool name according to MCP specification (SEP-986).)r   namer\   s    r5   _validate_tool_namezTool._validate_tool_name   s     	$DI...r4   Nonec                    t                                                       	 t                      }|                                 d S # t          $ r Y d S w xY wN)superenabler   _queue_tool_list_changedRuntimeErrorrU   context	__class__s     r5   rm   zTool.enable   s_    	!mmG,,..... 	 	 	DD	   "A 
AAc                    t                                                       	 t                      }|                                 d S # t          $ r Y d S w xY wrk   )rl   disabler   rn   ro   rp   s     r5   ru   zTool.disable   s_    	!mmG,,..... 	 	 	DD	rs   include_fastmcp_metarw   bool | None	overridesr   MCPToolc               h   d}| j         r| j         }n| j        r| j        j         r| j        j         }t          |                    d| j                  |                    d|          |                    d| j                  |                    d| j                  |                    d| j                  |                    d| j                  |                    d| j                  |                    d	| j	                  |                    d
| 
                    |                    	  	        S )z(Convert the FastMCP tool to an MCP tool.Nrg   titledescriptioninputSchemaoutputSchemaiconsr   ra   r[   rv   )	rg   r|   r}   r~   r   r   r   ra   r[   )r|   r   rz   getrg   r}   r_   r`   r   ra   get_meta)rU   rw   ry   r|   s       r5   to_mcp_toolzTool.to_mcp_tool   s    : 	+JEE 	+$"2"8 	+$*Evty11--//!mT5EFF!mT_EE"~t7IJJ--44!mT5EFFmmK@@--<PQQ 
 
 
 	
r4   fnCallable[..., Any]rg   
str | Noner|   r}   r   list[Icon] | Nonetagsset[str] | NoneToolAnnotations | Noneexclude_argslist[str] | Nonedict[str, Any] | NotSetT | NoneToolResultSerializerType | NonerH   rI   enabledtaskbool | TaskConfig | NoneFunctionToolc                P    t                               | |||||||||	|
||          S )Create a Tool from a function.r   rg   r|   r}   r   r   r   r   r`   rb   rH   r   r   )r   from_functionr   s                r5   r   zTool.from_function   sH    " ))##%'! * 
 
 	
r4   	argumentsdict[str, Any]rC   c                $   K   t          d          )a"  
        Run the tool with arguments.

        This method is not implemented in the base Tool class and must be
        implemented by subclasses.

        `run()` can EITHER return a list of ContentBlocks, or a tuple of
        (list of ContentBlocks, dict of structured output).
        zSubclasses must implement run())NotImplementedError)rU   r   s     r5   runzTool.run   s       ""CDDDr4   )rg   r|   r}   r   r   r`   rb   rH   transform_argsr   transform_fntoolstr | NotSetT | None ToolAnnotations | NotSetT | Noner   dict[str, ArgTransform] | Noner   Callable[..., Any] | Noner(   c               F    ddl m}  |j        |||||
||||||	|          S )Nr   )r(   )r   r   rg   r|   r   r}   r   r   r`   rb   rH   r   )fastmcp.tools.tool_transformr(   	from_tool)clsr   rg   r|   r}   r   r   r`   rb   rH   r   r   r   r(   s                 r5   r   zTool.from_tool   sW    " 	A@@@@@((%)##'!
 
 
 	
r4   )r:   r   )r:   ri   rw   rx   ry   r   r:   rz   r   r   rg   r   r|   r   r}   r   r   r   r   r   r   r   r   r   r`   r   rb   r   rH   rI   r   rx   r   r   r:   r   r   r   r:   rC   )r   r   rg   r   r|   r   r}   r   r   r   r   r   r`   r   rb   r   rH   r   r   r   r   rx   r   r   r:   r(   )r.   r/   r0   r1   r2   r`   r   ra   rb   r   rh   rm   ru   r   staticmethodr"   r   r   classmethodr   __classcell__rr   s   @r5   r   r   {   s        **   
 	      	      	      	     
 _'"""   #"
           -1
 
 
 
 
 
8    "&#' $.2)-9?6:&*#)-
 
 
 
 \
@
E 
E 
E 
E 
  &,,2 $8>9?6:069=#26
 
 
 
 
 [
 
 
 
 
r4   r   c                       e Zd ZU ded<    ed           Zded<   ddd* fdZedddddddeddddfd+d%            Z	d,d)Z
 xZS )-r   r   r   c                 "    t          d          S )N	forbiddenrd   r   r3   r4   r5   <lambda>zFunctionTool.<lambda>  s    jk&B&B&B r4   )default_factoryz_Annotated[TaskConfig, Field(description='Background task execution configuration (SEP-1686).')]task_configNrv   rw   rx   ry   r   r:   rz   c                    t                      j        dd|i|}| j        j        dk    r#d|vrt	          | j        j                  |_        |S )zConvert the FastMCP tool to an MCP tool.

        Extends the base implementation to add task execution mode if enabled.
        rw   r   ra   )taskSupportr3   )rl   r   r   re   r   ra   )rU   rw   ry   mcp_toolrr   s       r5   r   zFunctionTool.to_mcp_tool  sm     '577& 
 
!5
9B
 
  K//Ky4P4P!.4;K;P!Q!Q!QHr4   rg   r   r|   r}   r   r   r   r   r   r   r   r   r`   r   rb   r   rH   rI   r   r   r   c                   |r-t           j        j        rt          j        dt
          d           t                              ||          }|p|j        }|dk    rt          d          |t          d	          }n,t          |t                    rt          j        |          }n|}|                    ||           t          |	t                    r|j        }n|	}|6t          |t"                    r!t%          |          st          d
|           | |j        |p|j        ||p|j        ||j        |||pt-                      |
|||nd|          S )r   a/  The `exclude_args` parameter will be deprecated in FastMCP 2.14. We recommend using dependency injection with `Depends()` instead, which provides better lifecycle management and is more explicit. `exclude_args` will continue to work until then. See https://gofastmcp.com/docs/servers/tools for examples.   )
stacklevel)r   z<lambda>z,You must provide a name for lambda functionsNr   rd   zROutput schemas must represent object types due to MCP spec limitations. Received: T)r   rg   r|   r}   r   r_   r`   r   r   rb   rH   r   r   )fastmcpsettingsdeprecation_warningswarningswarnDeprecationWarningParsedFunctionr   rg   rL   r   rR   bool	from_boolvalidate_functionr#   r`   rS   _is_object_schemar   r}   input_schemaset)r   r   rg   r|   r}   r   r   r   r   r`   rb   rH   r   r   	parsed_fn	func_namer   final_output_schemas                     r5   r   zFunctionTool.from_function0  s   $  		G,A 		MM
 #    #00,0OO	*IN	
""KLLL <$+666KKd## 	$.t44KKK%%b)444mW-- 	0"+"9 #0
 *z:Mt/T/T*$%899   Ai|  A  A   s|'#<y'< --#!&2GG#
 
 
 	
r4   r   r   rC   c                   K   t          | j                  }t          |          }|                    |          }t	          j        |          r| d{V }t          |t                    r|S t          || j	                  }| j
        t          |t          t          z  t          z  t          z            s6t          |t          t           z            r)t#          d |D                       rt          |          S 	 t%          j        |          }t          |t(                    rt          ||          S n# t$          j        $ r Y nw xY wt          |          S | j
                            d          }t          ||rd|in|          S )zRun the tool with arguments.N)rb   c              3  @   K   | ]}t          |t                    V  d S rk   rR   r   .0items     r5   	<genexpr>z#FunctionTool.run.<locals>.<genexpr>  s,      JJ4
466JJJJJJr4   )rD   )rD   rF   x-fastmcp-wrap-resultr-   )r   r   r%   validate_pythoninspectisawaitablerR   rC   rM   rb   r`   r   r   r!   r    listtupleanyr>   rN   rS   rO   r   )rU   r   
wrapper_fntype_adapterr-   unstructured_resultrF   wrap_results           r5   r   zFunctionTool.run{  s     099
-j99--i88v&& 	"!\\\\\\Ffj)) 	M1&T_UUU%&,"6">"EFF ?64%<00?JJ6JJJJJ? "*=>>>>	%2%Ef%M%M"0$77 % 3+=    !;    &9::::(,,-DEE'5@L&11f
 
 
 	
s   ?9D: :EEr   r   r   )r.   r/   r0   r2   r   r   r   r   r"   r   r   r   r   s   @r5   r   r     s          	BBCCC  D D D D -1       ,    "&#' $.2)-9?6:&*#)-H
 H
 H
 H
 [H
T(
 (
 (
 (
 (
 (
 (
 (
r4   r   schemar   r   c                T    |                      d          dk    rdS d| v rdS d| v od| v S )z1Check if a JSON schema represents an object type.rT   objectT
propertiesz$refz$defs)r   )r   s    r5   r   r     sI     zz&X%%t vt V16 11r4   c                  b    e Zd ZU ded<   ded<   ded<   ded<   d	ed
<   e	 	 	 ddd            ZdS )r   r   r   r;   rg   r   r}   r   r   rI   r`   NTr   r   validater   wrap_non_object_output_schemar:   c                f   |rt          j        |          }|j                                        D ]T}|j        t           j        j        k    rt          d          |j        t           j        j        k    rt          d          U|r[|D ]X}||j        vrt          d| d          |j        |         }|j	        t           j        j
        k    rt          d| d          Yt          |dd           p|j        j        }t          j        |          }	t          j        |          s|j        }t#          |t$                    r|j        }t)          |          }
|rt+          |
t-          |                    }
t/          |
          }|                                }|rt-          |          nd }t3          ||d          }d }t          j        |          }|j        }t#          |t6                    r9	 t9          |d	          }|                    d
|          }n# t<          $ r Y nw xY w|t           j        d t@          dfvr^tC          |tD          #                    tH          tJ          tL          tN          tP          j)        j*        tP          j)        j+        tP          j)        j,        tP          j)        j-        tP          j)        j.        f	t^                              }	 t/          |          }|                    d          }|rGta          |          s8tb          |         }t/          |          }|                    d          }d|d<   n|}t3          |d          }nE# td          $ r8}dt7          |          vrtf          4                    d|           Y d }~nd }~ww xY w | |||	||pd           S )Nz/Functions with *args are not supported as toolsz2Functions with **kwargs are not supported as toolszParameter 'z-' in exclude_args does not exist in function.z,' in exclude_args must have a default value.r.   T)prune_paramsprune_titles)include_extrasr:   .serializationrd   r   )r   r7   z#Unable to generate schema for type )r   rg   r}   r   r`   )5r   	signaturer_   valueskind	ParameterVAR_POSITIONALrL   VAR_KEYWORDr*   emptygetattrrr   r.   getdoc	isroutine__call__rR   r   __func__r   r$   r   r%   json_schemar   return_annotationr;   r   r   	Exception_emptyr   r&   rS   fromkeysr!   r   r    rC   mcptypesr   ImageContentAudioContentResourceLinkEmbeddedResourcer7   r   r,   r   rP   debug)r   r   r   r   r   sigparamarg_namefn_namefn_docr   input_type_adapterr   r   r`   output_type
type_hintsclean_output_typer   base_schemawrapped_typewrapped_adapterrV   s                          r5   r   zParsedFunction.from_function  s     	#B''C..00  :!2!AAA$%VWWW:!2!>>>$L   ?  
 , 	 	Hs~55(a(aaa    N84E}(9(???(`(```   @ "j$//H2<3H##  $$ 	Bb,'' 	B 144
  	X7
DDVDVWWJ3J??)5577 .:CtL)))t&|$
 
 
 ##+ k3'' 	 ,BtDDD
(nnX{CC    w~tS#>>> !-"	-	.	.	.	2
 ( ! !$X56GHH*66O6LL 1 09J;9W9W 0#12C#DL&<\&J&JO$3$?$?_$?$U$UM=AM"9::$/M /D Q Q Q0 X X X(A66LL!V{!V!VWWWX s%'/4
 
 
 	
s+   3'H 
H('H(BM 
N&.NN)NTT)
r   r   r   r   r   r   r   r   r:   r   )r.   r/   r0   r2   r   r   r3   r4   r5   r   r     s         III    (((( *..2@
 @
 @
 @
 [@
 @
 @
r4   r   r-   rb   r   c                    |@	  ||           S # t           $ r'}t                              d|d           Y d }~nd }~ww xY wt          |           S )Nz!Error serializing tool result: %sT)exc_info)r   rP   warningrA   )r-   rb   rV   s      r5   _serialize_with_fallbackr  A  s     	:f%%% 	 	 	NN3         	 f%%%s   
 
A ;A r   r   c                   t          | t                    r| S t          | t                    r|                                 S t          | t                    r|                                 S t          | t                    r|                                 S t          | t                    rt          d|           S t          dt          | |                    S )NtextrT   r  )rR   r   r!   to_image_contentr   to_audio_contentr    to_resource_contentr;   r   r  )r   rb   s     r5    _convert_to_single_content_blockr  Q  s     $%% $ '$$&&&$ '$$&&&$ *'')))$ 3T2222F)A$
)S)STTTTr4   list[ContentBlock]c                ,   | g S t          | t          t          z            st          |           gS t	          d | D                       r| S t          d | D                       rfd| D             S t          dt          |                     gS )z2Convert a result to a sequence of content objects.Nc              3  @   K   | ]}t          |t                    V  d S rk   r   r   s     r5   r   z&_convert_to_content.<locals>.<genexpr>t  s,      
=
=d:dL))
=
=
=
=
=
=r4   c              3  p   K   | ]1}t          |t          t          z  t          z  t          z            V  2d S rk   )rR   r   r!   r   r    r   s     r5   r   z&_convert_to_content.<locals>.<genexpr>y  s;      
T
TT:dL50584?@@
T
T
T
T
T
Tr4   c                ^    g | ])}t          |t                    st          |          n|*S r3   )rR   r   r  )r   r   rb   s     r5   
<listcomp>z'_convert_to_content.<locals>.<listcomp>z  sM     
 
 
  dL11,T:>>>
 
 
r4   r  r  )rR   r   r   r  allr   r   r  )r-   rb   s    `r5   rM   rM   g  s     ~	fte|-- F0DDEE 
=
=f
=
=
===  
T
TV
T
T
TTT 

 
 
 
 	
 
 
 	
 V*B6:*V*VWWWXXr4   )r9   r   r:   r;   )r   r   r:   r   rk   )r-   r   rb   r   r:   r;   )r   r   rb   r   r:   r   )r-   r   rb   r   r:   r  )J
__future__r   r   r   collections.abcr   dataclassesr   typingr   r   r   r	   r
   r   	mcp.typesr   r>   mcp.shared.tool_name_validationr   r   r   r   r   r   r   r   rz   pydanticr   r   r   typing_extensionsr   r   fastmcp.server.dependenciesr   r   fastmcp.server.tasks.configr   fastmcp.utilities.componentsr   fastmcp.utilities.json_schemar   fastmcp.utilities.loggingr   fastmcp.utilities.typesr   r    r!   r"   r#   r$   r%   r&   r   r'   r(   r.   rP   r)   r,   r7   r;   r8   r2   rA   rC   r   r   r   r  r  rM   r3   r4   r5   <module>r,     s[   " " " " " " "   $ $ $ $ $ $ ! ! ! ! ! !                        G G G G G G                & % % % % % J J J J J J J J J J % % % % % %  P P P P P P P P 2 2 2 2 2 2 9 9 9 9 9 9 9 9 9 9 9 9 0 0 0 0 0 0	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	  KJJJJJJJJ	H		GC     WQZ   	 	 	 	 	 	 	 	 '/ucz&:  : : : :> > > >.5 .5 .5 .5 .5 .5 .5 .5bU
 U
 U
 U
 U
 U
 U
 U
pP
 P
 P
 P
 P
4 P
 P
 P
f2 2 2 2 H
 H
 H
 H
 H
 H
 H
 H
X @D& & & & &$ 37U U U U U0 37Y Y Y Y Y Y Yr4   