Add meta support to tool transformation utilities (#1295)

This commit is contained in:
Jeremiah Lowin 2025-07-29 14:34:07 -07:00 committed by GitHub
commit 3e53e62f24
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 129 additions and 1 deletions

View file

@ -13,7 +13,11 @@ from fastmcp.client.client import Client
from fastmcp.exceptions import ToolError
from fastmcp.tools import Tool, forward, forward_raw
from fastmcp.tools.tool import FunctionTool, ToolResult
from fastmcp.tools.tool_transform import ArgTransform, TransformedTool
from fastmcp.tools.tool_transform import (
ArgTransform,
ToolTransformConfig,
TransformedTool,
)
def get_property(tool: Tool, name: str) -> dict[str, Any]:
@ -1428,3 +1432,65 @@ def test_transform_adds_description_to_none(sample_tool_no_title):
"""Test that transformed tools can add description when parent has None."""
transformed = Tool.from_tool(sample_tool_no_title, description="Added description")
assert transformed.description == "Added description"
# Meta transformation tests
def test_transform_inherits_meta(sample_tool):
"""Test that transformed tools inherit meta when none specified."""
sample_tool.meta = {"original": True, "version": "1.0"}
transformed = Tool.from_tool(sample_tool)
assert transformed.meta == {"original": True, "version": "1.0"}
def test_transform_overrides_meta(sample_tool):
"""Test that transformed tools can override meta."""
sample_tool.meta = {"original": True, "version": "1.0"}
transformed = Tool.from_tool(sample_tool, meta={"custom": True, "priority": "high"})
assert transformed.meta == {"custom": True, "priority": "high"}
def test_transform_sets_meta_to_none(sample_tool):
"""Test that transformed tools can explicitly set meta to None."""
sample_tool.meta = {"original": True, "version": "1.0"}
transformed = Tool.from_tool(sample_tool, meta=None)
assert transformed.meta is None
def test_transform_inherits_none_meta(sample_tool_no_title):
"""Test that transformed tools inherit None meta."""
sample_tool_no_title.meta = None
transformed = Tool.from_tool(sample_tool_no_title)
assert transformed.meta is None
def test_transform_adds_meta_to_none(sample_tool_no_title):
"""Test that transformed tools can add meta when parent has None."""
sample_tool_no_title.meta = None
transformed = Tool.from_tool(sample_tool_no_title, meta={"added": True})
assert transformed.meta == {"added": True}
def test_tool_transform_config_inherits_meta(sample_tool):
"""Test that ToolTransformConfig inherits meta when unset."""
sample_tool.meta = {"original": True, "version": "1.0"}
config = ToolTransformConfig(name="config_tool")
transformed = config.apply(sample_tool)
assert transformed.meta == {"original": True, "version": "1.0"}
def test_tool_transform_config_overrides_meta(sample_tool):
"""Test that ToolTransformConfig can override meta."""
sample_tool.meta = {"original": True, "version": "1.0"}
config = ToolTransformConfig(
name="config_tool", meta={"config": True, "priority": "high"}
)
transformed = config.apply(sample_tool)
assert transformed.meta == {"config": True, "priority": "high"}
def test_tool_transform_config_removes_meta(sample_tool):
"""Test that ToolTransformConfig can remove meta with None."""
sample_tool.meta = {"original": True, "version": "1.0"}
config = ToolTransformConfig(name="config_tool", meta=None)
transformed = config.apply(sample_tool)
assert transformed.meta is None