@@ -605,10 +605,13 @@ def _tool_schema_view(
605605 return None , None , None
606606 schema = getattr (tool , "parameters" , None )
607607 if isinstance (schema , dict ):
608- declared , injectable = _schema_view (
609- schema , dereferenced = _server_dereferences (high_level )
608+ dereferenced = _server_dereferences (high_level )
609+ declared , injectable = _schema_view (schema , dereferenced = dereferenced )
610+ return (
611+ declared ,
612+ injectable ,
613+ _input_schema_view (schema , dereferenced = dereferenced ),
610614 )
611- return declared , injectable , schema
612615 fn = getattr (tool , "fn" , None )
613616 if fn is None :
614617 return set (), True , None
@@ -703,6 +706,26 @@ def _schema_view(schema: Dict[str, Any], *, dereferenced: bool) -> Tuple[set, bo
703706 return declared , injectable
704707
705708
709+ def _input_schema_view (
710+ schema : Dict [str , Any ], * , dereferenced : bool
711+ ) -> Optional [Dict [str , Any ]]:
712+ """Return the declared fields that the client sees for input analytics."""
713+ if not dereferenced :
714+ return schema
715+ nodes = _reference_chain (schema )
716+ if nodes is None :
717+ return None
718+ if len (nodes ) == 1 :
719+ return schema
720+ properties = {
721+ key : value
722+ for node in nodes
723+ if isinstance (node .get ("properties" ), dict )
724+ for key , value in node ["properties" ].items ()
725+ }
726+ return {"type" : "object" , "properties" : properties }
727+
728+
706729def _server_dereferences (server : Any ) -> bool :
707730 """Whether this FastMCP dereferences schemas before advertising them (its
708731 built-in middleware, on by default from 3.x; absent on 2.x)."""
0 commit comments