{"record":{"id":"3655936d3a3cd02d","repo":"PrefectHQ/fastmcp","slug":"discovery-tool-name-self-execute-tool-name-col","errorCode":null,"errorMessage":"Discovery tool name '{self.execute_tool_name}' collides with execute_tool_name.","messagePattern":"Discovery tool name '(.+?)' collides with execute_tool_name\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"fastmcp_slim/fastmcp/experimental/transforms/code_mode.py","lineNumber":540,"sourceCode":"        self.max_tool_calls = max_tool_calls\n        self.sandbox_provider = sandbox_provider or MontySandboxProvider()\n\n        self._discovery_factories = (\n            discovery_tools\n            if discovery_tools is not None\n            else _default_discovery_tools()\n        )\n        self._built_discovery_tools: list[Tool] | None = None\n        self._cached_execute_tool: Tool | None = None\n\n    def _build_discovery_tools(self) -> list[Tool]:\n        if self._built_discovery_tools is None:\n            tools = [\n                factory(self.get_tool_catalog) for factory in self._discovery_factories\n            ]\n            names = {t.name for t in tools}\n            if self.execute_tool_name in names:\n                raise ValueError(\n                    f\"Discovery tool name '{self.execute_tool_name}' \"\n                    f\"collides with execute_tool_name.\"\n                )\n            if len(names) != len(tools):\n                raise ValueError(\"Discovery tools must have unique names.\")\n            self._built_discovery_tools = tools\n        return self._built_discovery_tools\n\n    async def transform_tools(self, tools: Sequence[Tool]) -> Sequence[Tool]:\n        return [*self._build_discovery_tools(), self._get_execute_tool()]\n\n    async def get_tool(\n        self,\n        name: str,\n        call_next: GetToolNext,\n        *,\n        version: VersionSpec | None = None,\n    ) -> Tool | None:","sourceCodeStart":522,"sourceCodeEnd":558,"githubUrl":"https://github.com/PrefectHQ/fastmcp/blob/1f021142978e0861cd910c8df4e8074bc7cf3978/fastmcp_slim/fastmcp/experimental/transforms/code_mode.py#L522-L558","documentation":"When CodeMode builds its discovery tools it checks that none of them shares the reserved execute_tool_name used for the execute tool. A duplicate means two tools with the same name would be exposed, so a ValueError is raised at transform build time.","triggerScenarios":"Constructing CodeModeTransform with discovery tool factories (or an execute_tool_name) such that a discovery tool's generated name equals execute_tool_name; _build_discovery_tools is then invoked via transform_tools() or get_tool().","commonSituations":"Custom discovery factory returning a tool named 'execute' (the default execute name); explicitly setting execute_tool_name to a name a discovery factory already uses.","solutions":["Rename the discovery tool returned by your custom factory so it differs from execute_tool_name","Change CodeModeTransform's execute_tool_name to a non-colliding value","Review your discovery factories' naming scheme to avoid the reserved execute name"],"exampleFix":"// before\nCodeModeTransform(execute_tool_name=\"catalog\")  # factory also emits \"catalog\"\n\n// after\nCodeModeTransform(execute_tool_name=\"execute_tool\")  # no collision","handlingStrategy":"validation","validationCode":"names = [t.name for f in discovery_factories for t in [f(get_tool_catalog)]]\nif execute_tool_name in names:\n    raise ValueError(f\"Discovery tool '{execute_tool_name}' collides with execute_tool_name\")","typeGuard":"def discovery_names_valid(names: list[str], execute_tool_name: str) -> bool:\n    return execute_tool_name not in names","tryCatchPattern":"try:\n    tools = await transform.transform_tools(existing_tools)\nexcept ValueError as e:\n    if \"collides with execute_tool_name\" in str(e):\n        # rename your discovery tool or change execute_tool_name\n        ...\n    raise","preventionTips":["Never name a custom discovery tool the same as execute_tool_name (default 'execute')","Pick a distinct namespace prefix for all discovery tool names","Add a unit test building the transform with your factories before deploy"],"tags":["code-mode","naming-collision","value-error","fastmcp"],"backgroundTag":"tool-name-collision","analyzedSha":"1f021142978e0861cd910c8df4e8074bc7cf3978","analyzedAt":"2026-08-29T14:31:16.082Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}