def METHOD_NAME(*args: Union[str, Callable], return_direct: bool = False,
         args_schema: Optional[Type[BaseModel]] = None) -> Callable:
    def decorator(func: Callable) -> Callable:
        nonlocal args_schema
        tool_instance = FunctionalTool.from_function(func, args_schema)
        @wraps(func)
        def wrapper(*tool_args, **tool_kwargs):
            if return_direct:
                return tool_instance._exec(*tool_args, **tool_kwargs)
            else:
                return tool_instance
        return wrapper
    if len(args) == 1 and callable(args[0]):
        return decorator(args[0])
    else:
        return decorator