
    Ki[                    r   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+m,Z, d dl-m.Z. d dl/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7 e	rd dl8m9Z9m:Z:  e.e;      Z< e!de      Z=e G d dee=                Z> G d d      Z?eege@f   ZAdeBd<   d'dZC G d d      ZD G d de)      Z G d d e      ZEd(d!ZFe G d" d#             ZG	 d)	 	 	 	 	 d*d$ZH	 d)	 	 	 	 	 d+d%ZI	 d)	 	 	 	 	 d,d&ZJy)-    )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resolve_root_ref)
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<   y)_WrappedResultz,Generic wrapper for non-object return types.r*   resultN)__name__
__module____qualname____doc____annotations__     ^/home/jay/workspace/scripts/.codegraph-venv/lib/python3.12/site-packages/fastmcp/tools/tool.pyr-   r-   8   s
    6Ir5   r-   c                      e Zd Zy)_UnserializableTypeN)r/   r0   r1   r4   r5   r6   r8   r8   ?   s    r5   r8   r
   ToolResultSerializerTypec                T    t        j                  | t              j                         S )N)fallback)pydantic_coreto_jsonstrdecode)datas    r6   default_serializerrA   F   s      4;;==r5   c                  2    e Zd Z	 	 	 d	 	 	 	 	 ddZ	 	 ddZy)
ToolResultNc                l   ||t        d      ||}t        |      | _        || _        |L	 t	        j
                  |      }t        |t              s%t        dt        |      j                   d|d      || _        y # t        j                  $ r}t        j                  d|         d }~ww xY w)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_contentcontentmetar<   to_jsonable_pythonPydanticSerializationErrorloggererror
isinstancedicttyper/   structured_content)selfrH   rQ   rI   es        r6   __init__zToolResult.__init__K   s     ?19TUU_(G+>g+N+/	)%2%E%E,&" 0$7  23<<=R@R?U VVV 
 :L !;;  `  ab  `c  d 	s   B B3B..B3c                    | j                   ,t        | j                  | j                  | j                         S | j                  | j                  S | j                  | j                  fS )N)structuredContentrH   _meta)rI   r   rQ   rH   rR   s    r6   to_mcp_resultzToolResult.to_mcp_resultk   s_    
 99 !"&"9"9ii 
 ""*<<||T4444r5   )NNN)rH   zlist[ContentBlock] | Any | NonerQ   zdict[str, Any] | Any | NonerI   dict[str, Any] | None)returnzOlist[ContentBlock] | tuple[list[ContentBlock], dict[str, Any]] | CallToolResult)r/   r0   r1   rT   rY   r4   r5   r6   rC   rC   J   sC     48:>&*	L0L 8L $	L@5 	X5r5   rC   c                  t    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	 	 	 	 	 ddZedddddddeddddf	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       ZddZedeedeededddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Z xZS )r   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modec                0    t        | j                         | S )z<Validate tool name according to MCP specification (SEP-986).)r   namerX   s    r6   _validate_tool_namezTool._validate_tool_name   s     	$DII.r5   c                v    t         |           	 t               }|j                          y # t        $ r Y y w xY wN)superenabler   _queue_tool_list_changedRuntimeErrorrR   context	__class__s     r6   rj   zTool.enable   s7    	!mG,,. 		   , 	88c                v    t         |           	 t               }|j                          y # t        $ r Y y w xY wrh   )ri   disabler   rk   rl   rm   s     r6   rr   zTool.disable   s7    	!mG,,. 		rp   include_fastmcp_metac                  d}| j                   r| j                   }n8| j                  r,| j                  j                   r| j                  j                   }t        |j                  d| j                        |j                  d|      |j                  d| j
                        |j                  d| j                        |j                  d| j                        |j                  d| j                        |j                  d| j                        |j                  d	| j                        |j                  d
| j                  |            	      S )z(Convert the FastMCP tool to an MCP tool.Nre   titledescriptioninputSchemaoutputSchemaiconsr   r_   rW   rs   )	re   rv   rw   rx   ry   rz   r   r_   rW   )rv   r   MCPToolgetre   rw   r]   r^   rz   r_   get_meta)rR   rt   	overridesrv   s       r6   to_mcp_toolzTool.to_mcp_tool   s     ::JJE$"2"2"8"8$$**Evtyy1--/!mT5E5EF!mT__E"~t7I7IJ--4!mT5E5EFmmK@--<PQ
 	
r5   c                F    t         j                  | |||||||||	|
||      S )Create a Tool from a function.fnre   rv   rw   rz   tagsr   exclude_argsr^   r`   rI   enabledtask)FunctionToolfrom_functionr   s                r6   r   zTool.from_function   sC    " ))##%'! * 
 	
r5   c                    K   t        d      w)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)rR   	argumentss     r6   runzTool.run   s      ""CDDs   )re   rv   rw   r   r   r^   r`   rI   transform_argsr   transform_fnc               J    ddl m}  |j                  |||||
||||||	|      S )Nr   )r)   )toolr   re   rv   r   rw   r   r   r^   r`   rI   r   )fastmcp.tools.tool_transformr)   	from_tool)clsr   re   rv   rw   r   r   r^   r`   rI   r   r   r   r)   s                 r6   r   zTool.from_tool   sA    " 	A(((%)##'!
 	
r5   )r[   r   )r[   Nonert   bool | Noner~   r   r[   r{   r   Callable[..., Any]re   
str | Nonerv   r   rw   r   rz   zlist[Icon] | Noner   set[str] | Noner   zToolAnnotations | Noner   list[str] | Noner^   dict[str, Any] | NotSetT | Noner`   ToolResultSerializerType | NonerI   rZ   r   r   r   zbool | TaskConfig | Noner[   r   r   dict[str, Any]r[   rC   )r   r   re   r   rv   str | NotSetT | Nonerw   r   r   r   r   z ToolAnnotations | NotSetT | Noner^   r   r`   r   rI   r   r   zdict[str, ArgTransform] | Noner   r   r   zCallable[..., Any] | Noner[   r)   )r/   r0   r1   r2   r3   r^   r   r_   r`   r   rf   rj   rr   r   staticmethodr#   r   r   classmethodr   __classcell__ro   s   @r6   r   r   {   s+   * 
 	    	    	    	   
 '" #
 -1
 *
 	

 

8    "&#' $.2)-9?6:&*#)-


 
  	

 !
 
 ,
 '
 7
 4
 $
 
 '
 

 
@
E 
  &,,2 $8>9?6:069=#26

 	

 $
 *
 
 6
 7
 4
 .
 7
 
 0
 

 
r5   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	forbiddenrb   r   r4   r5   r6   <lambda>zFunctionTool.<lambda>  s    jk&B r5   )default_factoryz_Annotated[TaskConfig, Field(description='Background task execution configuration (SEP-1686).')]task_configNrs   c                   t        |   dd|i|}| j                  j                  dk7  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.
        rt   r   r_   )taskSupportr4   )ri   r   r   rc   r   r_   )rR   rt   r~   mcp_toolro   s       r6   r   zFunctionTool.to_mcp_tool  s_     7& 
!5
9B
   K/Ky4P!.4;K;K;P;P!QHr5   c                   |r6t         j                  j                  rt        j                  dt
        d       t        j                  ||      }|xs |j                  }|dk(  rt        d      |t        d      }n(t        |t              rt        j                  |      }n|}|j                  ||       t        |	t              r|j                   }n|	}|)t        |t"              rt%        |      st        d	|       | |j&                  |xs |j                  ||xs |j(                  ||j*                  |||xs
 t-               |
||||      S d
|      S )r   zThe `exclude_args` parameter is deprecated as of FastMCP 2.14. Use dependency injection with `Depends()` instead for better lifecycle management. See https://gofastmcp.com/v2/servers/context#using-depends for examples.   )
stacklevel)r   z<lambda>z,You must provide a name for lambda functionsr   rb   zROutput schemas must represent object types due to MCP spec limitations. Received: T)r   re   rv   rw   rz   r]   r^   r   r   r`   rI   r   r   )fastmcpsettingsdeprecation_warningswarningswarnDeprecationWarningParsedFunctionr   re   rF   r   rN   bool	from_boolvalidate_functionr$   r^   rO   _is_object_schemar   rw   input_schemaset)r   r   re   rv   rw   rz   r   r   r   r^   r`   rI   r   r   	parsed_fn	func_namer   final_output_schemas                     r6   r   zFunctionTool.from_function0  sn   $ G,,AAMM[ # #00,0O	*INN	
"KLL <$+6Kd#$..t4KK%%b)4mW-"+"9"9 #0
 *z:Mt/T$%89 hi|h  A  ||'#<y'<'< ---#!&2G#
 	
 9=#
 	
r5   c                  K   t        | j                        }t        |      }|j                  |      }t	        j
                  |      r
| d{   }t        |t              r|S t        || j                        }| j                  t        |t        t        z  t        z  t        z        s)t        |t        t         z        rt#        d |D              rt        |      S 	 t%        j&                  |      }t        |t(              rt        ||      S 	 t        |      S | j                  j-                  d      }t        ||r	d|i      S |      S 7 # t$        j*                  $ r Y Ww xY ww)zRun the tool with arguments.N)r`   c              3  <   K   | ]  }t        |t                y wrh   rN   r   .0items     r6   	<genexpr>z#FunctionTool.run.<locals>.<genexpr>  s     J4
46J   )rH   )rH   rQ   x-fastmcp-wrap-resultr.   )r   r   r&   validate_pythoninspectisawaitablerN   rC   rG   r`   r^   r   r    r"   r!   listtupleanyr<   rJ   rO   rK   r|   )rR   r   
wrapper_fntype_adapterr.   unstructured_resultrQ   wrap_results           r6   r   zFunctionTool.runy  sS    09
-j9--i8v&!\Ffj)M1&T__U%&,"6">"EF64%<0J6JJ!*=>>	%2%E%Ef%M"0$7% 3+=  8 &9::((,,-DE'5@&1
 	
FL
 	
? "0 !;; s8   AE1EBE1#1E AE1E.+E1-E..E1r   r   r   )r/   r0   r1   r3   r   r   r   r   r#   r   r   r   r   s   @r6   r   r     s&    	BC   D -1 * 	
 
,    "&#' $.2)-9?6:&*#)-F
F
 F
 	F

  F
 !F
 F
 ,F
 'F
 7F
 4F
 $F
 F
 'F
 
F
 F
P(
r5   r   c                J    | j                  d      dk(  ryd| v ryd| v xr d| v S )z1Check if a JSON schema represents an object type.rP   objectT
propertiesz$refz$defs)r|   )schemas    r6   r   r     s<     zz&X% v V16 11r5   c                  l    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y)r   r   r   r>   re   r   rw   r   r   rZ   r^   Nc                   |rt        j                  |      }|j                  j                         D ]f  }|j                  t         j
                  j                  k(  rt        d      |j                  t         j
                  j                  k(  s]t        d       |ri|D ]d  }||j                  vrt        d| d      |j                  |   }|j                  t         j
                  j                  k(  sWt        d| d       t        |dd       xs |j                  j                  }t        j                  |      }	t        j                  |      s|j                   }t#        |t$              r|j&                  }t)        |      }
|rt+        |
t-        |            }
t/        |
      }|j1                         }|rt-        |      nd }t3        ||dd      }d }t        j                  |      }|j4                  }t#        |t6              r 	 t9        |d	      }|j;                  d
|      }|t         j>                  d t@        dfvr'tC        |tD        jG                  tH        tJ        tL        tN        tP        jR                  jT                  tP        jR                  jV                  tP        jR                  jX                  tP        jR                  jZ                  tP        jR                  j\                  f	t^                    }	 t/        |      }|j1                  d      }|r7ta        |      s,tb        |   }t/        |      }|j1                  d      }d|d<   n|}t3        |dd      }te        |      } | |||	||xs d       S # t<        $ r Y _w xY w# tf        $ r/}dt7        |      vrth        jk                  d|       Y d }~Td }~ww xY w)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dereference)include_extrasr[   .serializationrb   r   )r   r   r8   z#Unable to generate schema for type )r   re   rw   r   r^   )6r   	signaturer]   valueskind	ParameterVAR_POSITIONALrF   VAR_KEYWORDr+   emptygetattrro   r/   getdoc	isroutine__call__rN   r   __func__r   r%   r   r&   json_schemar   return_annotationr>   r   r|   	Exception_emptyr   r'   rO   fromkeysr"   r    r!   rC   mcptypesr   ImageContentAudioContentResourceLinkEmbeddedResourcer8   r   r-   r   r   rL   debug)r   r   r   validatewrap_non_object_output_schema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_adapterrS   s                          r6   r   zParsedFunction.from_function  s    ##B'C..0 ::!2!2!A!AA$%VWW::!2!2!>!>>$L 	  , 	Hs~~5()(3`a   NN84E}}(9(9(?(??()(3_` 	 "j$/H2<<3H3H#   $Bb,'B 14
 7
DDVWJ3J?)557 .:tL)t&%	
 #++ k3' ,BtD
(nnX{C
 w~~tS#>> !-"		--		..		..		..		22
 (!$X56GH*66O6L 19J;9W#12C#DL&<\&JO$3$?$?_$?$UM=AM"9:$/M /!$! !1 ? %'/4
 	
s  j 1 X(A6LL#F{o!VWXs+   M? =A1N ?	NN	O%OO)NTT)
r   r   r   r   r   r   r   r   r[   r   )r/   r0   r1   r3   r   r   r4   r5   r6   r   r     ss    
I  (( *..2I
I
 'I
 	I

 (,I
 
I
 I
r5   r   c                    |		  ||       S t        |       S # t         $ r,}t        j                  d|d       Y d }~t        |       S d }~ww xY w)Nz!Error serializing tool result: %sT)exc_info)r   rL   warningrA   )r.   r`   rS   s      r6   _serialize_with_fallbackr	  H  se     	f%% f%%  	NN3    f%%	s    	AAAc                N   t        | t              r| S t        | t              r| j                         S t        | t              r| j                         S t        | t              r| j                         S t        | t              rt        d|       S t        dt        | |            S )NtextrP   r  )rN   r   r"   to_image_contentr    to_audio_contentr!   to_resource_contentr>   r   r	  )r   r`   s     r6    _convert_to_single_content_blockr  X  s     $%$$$&&$$$&&$''))$T22F)A$
)STTr5   c                0   | g S t        | t        t        z        st        | |      gS t	        d | D              r| S t        d | D              r,| D cg c]   }t        |t              st        ||      n|" c}S t        dt        | |            gS c c}w )z2Convert a result to a sequence of content objects.c              3  <   K   | ]  }t        |t                y wrh   r   r   s     r6   r   z&_convert_to_content.<locals>.<genexpr>{  s     
=d:dL)
=r   c              3  f   K   | ])  }t        |t        t        z  t        z  t        z         + y wrh   )rN   r   r"   r    r!   r   s     r6   r   z&_convert_to_content.<locals>.<genexpr>  s&     
TT:dL50584?@
Ts   /1r  r  )	rN   r   r   r  allr   r   r   r	  )r.   r`   r   s      r6   rG   rG   n  s     ~	fte|-0DEE 
=f
== 
TV
TT
 	
  dL1 -T:>
 	
 V*B6:*VWXX
s   %B)r@   r   r[   r>   )r   r   r[   r   rh   )r.   r   r`   r   r[   r>   )r   r   r`   r   r[   r   )r.   r   r`   r   r[   zlist[ContentBlock])K
__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   r{   pydanticr   r   r   typing_extensionsr   r   fastmcp.server.dependenciesr   r   fastmcp.server.tasks.configr   fastmcp.utilities.componentsr   fastmcp.utilities.json_schemar   r   fastmcp.utilities.loggingr   fastmcp.utilities.typesr    r!   r"   r#   r$   r%   r&   r'   r   r(   r)   r/   rL   r*   r-   r8   r>   r9   r3   rA   rC   r   r   r   r	  r  rG   r4   r5   r6   <module>r#     s   "   $ !    G  & J J %  P 2 9 K 0	 	 	 J	H	C WQZ  	 	 '/ucz&: ) :>.5 .5bU
 U
pN
4 N
b2 Q
 Q
 Q
j @D&&<&&$ 37U
U/U U0 37YY/Y Yr5   