From d316f193a89964bf60ef2fbcae38913b0003f4e2 Mon Sep 17 00:00:00 2001 From: Jeremiah Lowin <153965+jlowin@users.noreply.github.com> Date: Sat, 7 Mar 2026 11:41:07 -0500 Subject: [PATCH] Fix transform arg collisions with passthrough params (#3431) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with GPT-5.2-Codex --- src/fastmcp/tools/tool_transform.py | 16 ++++++++++------ .../tools/tool_transform/test_tool_transform.py | 14 ++++++++++++++ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/fastmcp/tools/tool_transform.py b/src/fastmcp/tools/tool_transform.py index 9fc63e6e3..251bc9229 100644 --- a/src/fastmcp/tools/tool_transform.py +++ b/src/fastmcp/tools/tool_transform.py @@ -554,12 +554,16 @@ class TransformedTool(Tool): # Additional validation: check for naming conflicts after transformation if transform_args: new_names = [] - for old_name, transform in transform_args.items(): - if not transform.hide: - if transform.name is not NotSet: - new_names.append(transform.name) - else: - new_names.append(old_name) + for old_name in parent_params: + transform = transform_args.get(old_name, ArgTransform()) + + if transform.hide: + continue + + if transform.name is not NotSet: + new_names.append(transform.name) + else: + new_names.append(old_name) # Check for duplicate names after transformation name_counts = {} diff --git a/tests/tools/tool_transform/test_tool_transform.py b/tests/tools/tool_transform/test_tool_transform.py index f6167a8ec..bcf999ae6 100644 --- a/tests/tools/tool_transform/test_tool_transform.py +++ b/tests/tools/tool_transform/test_tool_transform.py @@ -482,6 +482,20 @@ def test_transform_args_creates_duplicate_names(add_tool): ) +def test_transform_args_collision_with_passthrough_name(add_tool): + """Test that renaming to a passthrough parameter name raises ValueError.""" + with pytest.raises( + ValueError, + match="Multiple arguments would be mapped to the same names: old_y", + ): + Tool.from_tool( + add_tool, + transform_args={ + "old_x": ArgTransform(name="old_y"), + }, + ) + + def test_function_without_kwargs_missing_params(add_tool): """Test that function missing required transformed parameters raises ValueError."""