Skip to content

Commit 6575768

Browse files
committed
Refactor TransformedTool
- Remove _find_referenced_defs method - Update merging of defs in _merge_schema_with_precedence. - Adjust tests in test_tool_transform.py to reflect these changes.
1 parent 68f264e commit 6575768

File tree

2 files changed

+10
-122
lines changed

2 files changed

+10
-122
lines changed

src/fastmcp/tools/tool_transform.py

Lines changed: 10 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -787,45 +787,6 @@ def _apply_single_transform(
787787

788788
return new_name, new_schema, is_required
789789

790-
@staticmethod
791-
def _find_referenced_defs(
792-
schema: dict[str, Any], available_defs: dict[str, Any]
793-
) -> dict[str, Any]:
794-
"""Find all $defs that are actually referenced in the schema.
795-
796-
Args:
797-
schema: The schema to search for references
798-
available_defs: All available definitions to check against
799-
800-
Returns:
801-
Dictionary containing only the referenced definitions
802-
"""
803-
referenced = set()
804-
visited = set() # Track visited definitions to prevent infinite recursion
805-
806-
def find_refs(obj):
807-
if isinstance(obj, dict):
808-
if "$ref" in obj:
809-
ref = obj["$ref"]
810-
if ref.startswith("#/$defs/"):
811-
def_name = ref[8:] # Remove "#/$defs/" prefix
812-
if def_name in available_defs and def_name not in visited:
813-
referenced.add(def_name)
814-
visited.add(def_name) # Mark as visited before recursing
815-
# Recursively check the referenced definition
816-
find_refs(available_defs[def_name])
817-
for value in obj.values():
818-
find_refs(value)
819-
elif isinstance(obj, list):
820-
for item in obj:
821-
find_refs(item)
822-
823-
find_refs(schema)
824-
825-
return {
826-
name: available_defs[name] for name in referenced if name in available_defs
827-
}
828-
829790
@staticmethod
830791
def _merge_schema_with_precedence(
831792
base_schema: dict[str, Any], override_schema: dict[str, Any]
@@ -883,19 +844,24 @@ def _merge_schema_with_precedence(
883844
# Merge $defs from both schemas, with override taking precedence
884845
merged_defs = base_schema.get("$defs", {}).copy()
885846
override_defs = override_schema.get("$defs", {})
886-
merged_defs.update(override_defs)
847+
848+
for def_name, def_schema in override_defs.items():
849+
if def_name in merged_defs:
850+
base_def = merged_defs[def_name].copy()
851+
base_def.update(def_schema)
852+
merged_defs[def_name] = base_def
853+
else:
854+
merged_defs[def_name] = def_schema.copy()
887855

888856
result = {
889857
"type": "object",
890858
"properties": merged_props,
891859
"required": list(final_required),
892860
}
893861

894-
# Only include $defs that are actually referenced in the schema
895862
if merged_defs:
896-
referenced_defs = TransformedTool._find_referenced_defs(result, merged_defs)
897-
if referenced_defs:
898-
result["$defs"] = referenced_defs
863+
result["$defs"] = merged_defs
864+
result = compress_schema(result, prune_defs=True)
899865

900866
return result
901867

tests/tools/test_tool_transform.py

Lines changed: 0 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1508,84 +1508,6 @@ def test_tool_transform_config_removes_meta(sample_tool):
15081508
class TestDefsAndReferences:
15091509
"""Test schema definition handling and reference finding."""
15101510

1511-
def test_find_referenced_defs_simple_reference(self):
1512-
"""Test _find_referenced_defs with a simple reference."""
1513-
schema = {"type": "object", "properties": {"field1": {"$ref": "#/$defs/TypeA"}}}
1514-
available_defs = {
1515-
"TypeA": {"type": "string"},
1516-
"TypeB": {"type": "integer"}, # Not referenced
1517-
}
1518-
1519-
result = TransformedTool._find_referenced_defs(schema, available_defs)
1520-
assert result == {"TypeA": {"type": "string"}}
1521-
assert "TypeB" not in result
1522-
1523-
def test_find_referenced_defs_nested_references(self):
1524-
"""Test _find_referenced_defs with nested references."""
1525-
schema = {"type": "object", "properties": {"field1": {"$ref": "#/$defs/TypeA"}}}
1526-
available_defs = {
1527-
"TypeA": {
1528-
"type": "object",
1529-
"properties": {"nested": {"$ref": "#/$defs/TypeB"}},
1530-
},
1531-
"TypeB": {"type": "string"},
1532-
"TypeC": {"type": "integer"}, # Not referenced
1533-
}
1534-
1535-
result = TransformedTool._find_referenced_defs(schema, available_defs)
1536-
assert result == {
1537-
"TypeA": {
1538-
"type": "object",
1539-
"properties": {"nested": {"$ref": "#/$defs/TypeB"}},
1540-
},
1541-
"TypeB": {"type": "string"},
1542-
}
1543-
assert "TypeC" not in result
1544-
1545-
def test_find_referenced_defs_circular_references(self):
1546-
"""Test _find_referenced_defs handles circular references."""
1547-
schema = {"type": "object", "properties": {"field1": {"$ref": "#/$defs/TypeA"}}}
1548-
available_defs = {
1549-
"TypeA": {
1550-
"type": "object",
1551-
"properties": {"circular": {"$ref": "#/$defs/TypeB"}},
1552-
},
1553-
"TypeB": {
1554-
"type": "object",
1555-
"properties": {"back_ref": {"$ref": "#/$defs/TypeA"}},
1556-
},
1557-
"TypeC": {"type": "string"}, # Not referenced
1558-
}
1559-
1560-
result = TransformedTool._find_referenced_defs(schema, available_defs)
1561-
assert "TypeA" in result
1562-
assert "TypeB" in result
1563-
assert "TypeC" not in result
1564-
1565-
def test_find_referenced_defs_array_references(self):
1566-
"""Test _find_referenced_defs with references in arrays."""
1567-
schema = {
1568-
"type": "object",
1569-
"properties": {
1570-
"field1": {"type": "array", "items": {"$ref": "#/$defs/TypeA"}}
1571-
},
1572-
}
1573-
available_defs = {
1574-
"TypeA": {"type": "string"},
1575-
"TypeB": {"type": "integer"}, # Not referenced
1576-
}
1577-
1578-
result = TransformedTool._find_referenced_defs(schema, available_defs)
1579-
assert result == {"TypeA": {"type": "string"}}
1580-
1581-
def test_find_referenced_defs_no_references(self):
1582-
"""Test _find_referenced_defs with no references."""
1583-
schema = {"type": "object", "properties": {"field1": {"type": "string"}}}
1584-
available_defs = {"TypeA": {"type": "string"}, "TypeB": {"type": "integer"}}
1585-
1586-
result = TransformedTool._find_referenced_defs(schema, available_defs)
1587-
assert result == {}
1588-
15891511
def test_merge_schema_with_defs_precedence(self):
15901512
"""Test _merge_schema_with_precedence merges $defs correctly."""
15911513
base_schema = {

0 commit comments

Comments
 (0)