
    kKj,                         d 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mZ ddlmZ dd	lmZ  G d
 de      ZdedefdZdedefdZdeeef   defdZy)zLMiddleware that dereferences $ref in JSON schemas before sending to clients.    )Sequence)AnyN)override)ResourceTemplate)CallNext
MiddlewareMiddlewareContext)Tool)dereference_refsc                       e Zd ZdZedeej                     deej                  e	e
   f   de	e
   fd       Zedeej                     deej                  e	e   f   de	e   fd       Zy)DereferenceRefsMiddlewarea.  Dereferences $ref in component schemas before sending to clients.

    Some MCP clients (e.g., VS Code Copilot) don't handle JSON Schema $ref
    properly. This middleware inlines all $ref definitions so schemas are
    self-contained. Enabled by default via ``FastMCP(dereference_schemas=True)``.
    context	call_nextreturnc                 j   K    ||       d {   }|D cg c]  }t        |       c}S 7 c c}w wN)_dereference_tool)selfr   r   toolstools        v/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/fastmcp/server/middleware/dereference.pyon_list_toolsz'DereferenceRefsMiddleware.on_list_tools   s8       ((49:ED!$'E:: ):   3,3.33c                 j   K    ||       d {   }|D cg c]  }t        |       c}S 7 c c}w wr   )_dereference_resource_template)r   r   r   	templatests        r   on_list_resource_templatesz4DereferenceRefsMiddleware.on_list_resource_templates    s8      $G,,	;DE9a.q19EE -Er   N)__name__
__module____qualname____doc__r   r	   mtListToolsRequestr   r   r
   r   ListResourceTemplatesRequestr   r        r   r   r      s     ;"2#6#67; B//$?@; 
$	; ; F"2#B#BCF ++X6F-GG
F 
"	#F Fr'   r   r   r   c                 6   i }d| j                   v st        | j                         rt        | j                         |d<   | j                  ;d| j                  v st        | j                        rt        | j                        |d<   |r| j	                  |      S | S )z4Return a copy of the tool with dereferenced schemas.$defs
parametersoutput_schemaupdate)r*   _has_refr   r+   
model_copy)r   updatess     r   r   r   ,   s    !#G$//!Xdoo%> 0 A%4%%%$2D2D)E#3D4F4F#G g..Kr'   templatec                     d| j                   v st        | j                         r'| j                  dt        | j                         i      S | S )z8Return a copy of the template with dereferenced schemas.r)   r*   r,   )r*   r.   r/   r   )r1   s    r   r   r   :   sP    (%%%(2E2E)F"" "283F3F"GH # 
 	
 Or'   schemac                     d| v ry| j                         D ]V  }t        |t              rt        |      r yt        |t              s1|D ]!  }t        |t              st        |      s   y X y)z$Check if a schema contains any $ref.z$refTF)values
isinstancedictr.   list)r3   valueitems      r   r.   r.   C   s\    eT"xeT"dD)htn 	 ! r'   )r"   collections.abcr   typingr   	mcp.typestypesr#   typing_extensionsr   fastmcp.resources.templater   $fastmcp.server.middleware.middlewarer   r   r	   fastmcp.tools.baser
   fastmcp.utilities.json_schemar   r   r   r   r7   strboolr.   r&   r'   r   <module>rF      st    R $   & 7 X X # :F
 F:D T -= BR T#s(^  r'   