--- title: function_tool sidebarTitle: function_tool --- # `fastmcp.tools.function_tool` Standalone @tool decorator for FastMCP. ## Functions ### `tool` ```python tool(name_or_fn: str | Callable[..., Any] | None = None) -> Any ``` Standalone decorator to mark a function as an MCP tool. Returns the original function with metadata attached. Register with a server using mcp.add_tool(). **Args:** - `run_in_thread`: Applies to sync tool functions only. When True (default), the sync function is dispatched to a worker thread so it does not block the event loop. Set to False to run the function inline on the event loop thread — useful for libraries with thread affinity (e.g. Windows COM via `uiautomation`/`comtypes`/`pywin32`, `tkinter`, some GPU/driver bindings). Ignored for async functions. Cannot be combined with `timeout` on a sync function\: inline calls have no cancellation checkpoints, so the timeout would be a silent no-op. ## Classes ### `DecoratedTool` Protocol for functions decorated with @tool. ### `ToolMeta` Metadata attached to functions by the @tool decorator. ### `FunctionTool` **Methods:** #### `from_function` ```python from_function(cls, fn: Callable[..., Any]) -> FunctionTool ``` Create a FunctionTool from a function. **Args:** - `fn`: The function to wrap - `metadata`: ToolMeta object with all configuration. If provided, individual parameters must not be passed. - `name, title, etc.`: Individual parameters for backwards compatibility. Cannot be used together with metadata parameter. #### `run` ```python run(self, arguments: dict[str, Any]) -> ToolResult ``` Run the tool with arguments. #### `register_with_docket` ```python register_with_docket(self, docket: Docket) -> None ``` Register this tool with docket for background execution. Registers the raw function so Docket sees and resolves ALL dependencies — both FastMCP's (CurrentContext, Progress) and Docket-native ones (Retry, Timeout, ConcurrencyLimit). #### `add_to_docket` ```python add_to_docket(self, docket: Docket, arguments: dict[str, Any], **kwargs: Any) -> Execution ``` Schedule this tool for background execution via docket. FunctionTool splats the arguments dict since .fn expects **kwargs. **Args:** - `docket`: The Docket instance - `arguments`: Tool arguments - `fn_key`: Function lookup key in Docket registry (defaults to self.key) - `task_key`: Redis storage key for the result - `**kwargs`: Additional kwargs passed to docket.add()