
    Ki                        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 d d
lmZmZ d dlmZmZ d dlmZ  ee      Z G d d      Zy)    )annotationsN)CallableMapping)Any)ToolAnnotations)ValidationError)settings)FastMCPErrorNotFoundError	ToolError)DuplicateBehavior)Tool
ToolResult)ToolTransformConfigapply_transformations_to_tools)
get_loggerc                      e Zd ZdZ	 	 	 d	 	 	 	 	 ddZddZddZddZddZ	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	dd	Z
	 	 	 	 	 	 dd
ZddZddZddZddZy)ToolManagerzManages FastMCP tools.Nc                   i | _         |xs t        j                  | _        t        |xs i       | _        |d}|t
        j                  vr.t        d| ddj                  t
        j                               || _	        y )NwarnzInvalid duplicate_behavior: z. Must be one of: z, )
_toolsr	   mask_error_detailsdicttransformationsr   __args__
ValueErrorjoinduplicate_behavior)selfr   r   r   s       f/home/jay/workspace/scripts/.codegraph-venv/lib/python3.12/site-packages/fastmcp/tools/tool_manager.py__init__zToolManager.__init__   s     (*=("="= 	 @D!r@

 %!'%6%?%??./A.B C##'99->-G-G#H"IK 
 #5    c                P   K   t        | j                  | j                        }|S w)z?Return this manager's local tools with transformations applied.)toolsr   )r   r   r   )r   transformed_toolss     r    _load_toolszToolManager._load_tools4   s)     :++ 00
 ! s   $&c                F   K   | j                          d{   }||v S 7 w)zCheck if a tool exists.N)	get_toolsr   keyr$   s      r    has_toolzToolManager.has_tool<   s$     nn&&e| 's   !	!c                n   K   | j                          d{   }||v r||   S t        d|d      7 w)zGet tool by key.NTool 
 not found)r(   r   r)   s      r    get_toolzToolManager.get_toolA   s?     nn&&%<:eC7*566 's   535c                >   K   | j                          d{   S 7 w)zI
        Gets the complete, unfiltered inventory of local tools.
        N)r&   )r   s    r    r(   zToolManager.get_toolsH   s      %%''''s   c           	         t         j                  rt        j                  dt        d       t        j                  |||||||      }| j                  |      S )zAdd a tool to the server.zcToolManager.add_tool_from_fn() is deprecated. Use Tool.from_function() and call add_tool() instead.   )
stacklevel)namedescriptiontagsr   exclude_args
serializer)r	   deprecation_warningswarningsr   DeprecationWarningr   from_functionadd_tool)	r   fnr4   r5   r6   r   r8   r7   tools	            r    add_tool_from_fnzToolManager.add_tool_from_fnN   sZ     ((MMu"
 !!##%!
 }}T""r"   c                   | j                   j                  |j                        }|r| j                  dk(  r=t        j                  d|j                          || j                   |j                  <   |S | j                  dk(  r|| j                   |j                  <   |S | j                  dk(  rt        d|j                         | j                  dk(  r|S |S || j                   |j                  <   |S )z Register a tool with the server.r   zTool already exists: replaceerrorignore)r   getr*   r   loggerwarningr   )r   r?   existings      r    r=   zToolManager.add_toolk   s    ;;??488,&&&0!6txxjAB(,DHH%  ((I5(,DHH%  ((G3 #8
!CDD((H4  %)DKK!r"   c                "    || j                   |<   y)zAdd a tool transformation.Nr   )r   	tool_nametransformations      r    add_tool_transformationz#ToolManager.add_tool_transformation|   s     +9Y'r"   c                8    | j                   j                  |      S )zGet a tool transformation.)r   rE   r   rK   s     r    get_tool_transformationz#ToolManager.get_tool_transformation   s    ##''	22r"   c                <    || j                   v r| j                   |= yy)zRemove a tool transformation.NrJ   rO   s     r    remove_tool_transformationz&ToolManager.remove_tool_transformation   s#    ,,,$$Y/ -r"   c                X    || j                   v r| j                   |= yt        d|d      )zRemove a tool from the server.

        Args:
            key: The key of the tool to remove

        Raises:
            NotFoundError: If the tool is not found
        r-   r.   N)r   r   )r   r*   s     r    remove_toolzToolManager.remove_tool   s0     $++C %wj 9::r"   c                H  K   | j                  |       d{   }	 |j                  |       d{   S 7 7 # t        $ r  t        $ r  t        $ rJ}t
        j                  d|       | j                  rt        d|      |t        d|d|       |d}~ww xY ww)zr
        Internal API for servers: Finds and calls a tool, respecting the
        filtered protocol path.
        NzError calling tool z: )	r/   runr
   r   	ExceptionrF   	exceptionr   r   )r   r*   	argumentsr?   es        r    	call_toolzToolManager.call_tool   s     
 ]]3''	K),,, (, 	 	 	K23':;&&"5cW =>AE"5cWBqc BCJ	Ks;   B"6B": 8: B": BABBB")NNN)r   zDuplicateBehavior | Noner   zbool | Noner   z(Mapping[str, ToolTransformConfig] | None)returnzdict[str, Tool])r*   strr\   bool)r*   r]   r\   r   )NNNNNN)r>   zCallable[..., Any]r4   
str | Noner5   r_   r6   zset[str] | Noner   zToolAnnotations | Noner8   zCallable[[Any], str] | Noner7   zlist[str] | Noner\   r   )r?   r   r\   r   )rK   r]   rL   r   r\   None)rK   r]   r\   zToolTransformConfig | None)rK   r]   r\   r`   )r*   r]   r\   r`   )r*   r]   rY   zdict[str, Any]r\   r   )__name__
__module____qualname____doc__r!   r&   r+   r/   r(   r@   r=   rM   rP   rR   rT   r[    r"   r    r   r      s      8<*.DH	545 (5 B	54!
7(  "& $.226)-## #  	#
 # ,# 0# '# 
#:"99.A9	930
;Kr"   r   )
__future__r   r:   collections.abcr   r   typingr   	mcp.typesr   pydanticr   fastmcpr	   fastmcp.exceptionsr
   r   r   fastmcp.settingsr   fastmcp.tools.toolr   r   fastmcp.tools.tool_transformr   r   fastmcp.utilities.loggingr   ra   rF   r   re   r"   r    <module>rq      sH    "  -  % $  E E . / 1	H	SK SKr"   