diff --git a/docs/python-sdk/fastmcp-server-providers-local_provider-decorators-prompts.mdx b/docs/python-sdk/fastmcp-server-providers-local_provider-decorators-prompts.mdx index d070aacb7..e7d7d68f9 100644 --- a/docs/python-sdk/fastmcp-server-providers-local_provider-decorators-prompts.mdx +++ b/docs/python-sdk/fastmcp-server-providers-local_provider-decorators-prompts.mdx @@ -14,7 +14,7 @@ registration functionality to LocalProvider. ## Classes -### `PromptDecoratorMixin` +### `PromptDecoratorMixin` Mixin class providing prompt decorator functionality for LocalProvider. @@ -26,7 +26,7 @@ This mixin contains all methods related to: **Methods:** -#### `add_prompt` +#### `add_prompt` ```python add_prompt(self: LocalProvider, prompt: Prompt | Callable[..., Any]) -> Prompt @@ -37,19 +37,19 @@ Add a prompt to this provider's storage. Accepts either a Prompt object or a decorated function with __fastmcp__ metadata. -#### `prompt` +#### `prompt` ```python -prompt(self: LocalProvider, name_or_fn: AnyFunction) -> FunctionPrompt +prompt(self: LocalProvider, name_or_fn: F) -> F ``` -#### `prompt` +#### `prompt` ```python -prompt(self: LocalProvider, name_or_fn: str | None = None) -> Callable[[AnyFunction], FunctionPrompt] +prompt(self: LocalProvider, name_or_fn: str | None = None) -> Callable[[F], F] ``` -#### `prompt` +#### `prompt` ```python prompt(self: LocalProvider, name_or_fn: str | AnyFunction | None = None) -> Callable[[AnyFunction], FunctionPrompt] | FunctionPrompt | partial[Callable[[AnyFunction], FunctionPrompt] | FunctionPrompt] diff --git a/docs/python-sdk/fastmcp-server-providers-local_provider-decorators-resources.mdx b/docs/python-sdk/fastmcp-server-providers-local_provider-decorators-resources.mdx index fe1727e3c..70c67d91c 100644 --- a/docs/python-sdk/fastmcp-server-providers-local_provider-decorators-resources.mdx +++ b/docs/python-sdk/fastmcp-server-providers-local_provider-decorators-resources.mdx @@ -14,7 +14,7 @@ and template registration functionality to LocalProvider. ## Classes -### `ResourceDecoratorMixin` +### `ResourceDecoratorMixin` Mixin class providing resource decorator functionality for LocalProvider. @@ -27,7 +27,7 @@ This mixin contains all methods related to: **Methods:** -#### `add_resource` +#### `add_resource` ```python add_resource(self: LocalProvider, resource: Resource | ResourceTemplate | Callable[..., Any]) -> Resource | ResourceTemplate @@ -38,7 +38,7 @@ Add a resource to this provider's storage. Accepts either a Resource/ResourceTemplate object or a decorated function with __fastmcp__ metadata. -#### `add_template` +#### `add_template` ```python add_template(self: LocalProvider, template: ResourceTemplate) -> ResourceTemplate @@ -47,10 +47,10 @@ add_template(self: LocalProvider, template: ResourceTemplate) -> ResourceTemplat Add a resource template to this provider's storage. -#### `resource` +#### `resource` ```python -resource(self: LocalProvider, uri: str) -> Callable[[AnyFunction], Resource | ResourceTemplate | AnyFunction] +resource(self: LocalProvider, uri: str) -> Callable[[F], F] ``` Decorator to register a function as a resource. diff --git a/docs/python-sdk/fastmcp-server-providers-local_provider-decorators-tools.mdx b/docs/python-sdk/fastmcp-server-providers-local_provider-decorators-tools.mdx index 07c6219fa..d3cf4daa2 100644 --- a/docs/python-sdk/fastmcp-server-providers-local_provider-decorators-tools.mdx +++ b/docs/python-sdk/fastmcp-server-providers-local_provider-decorators-tools.mdx @@ -14,7 +14,7 @@ registration functionality to LocalProvider. ## Classes -### `ToolDecoratorMixin` +### `ToolDecoratorMixin` Mixin class providing tool decorator functionality for LocalProvider. @@ -26,7 +26,7 @@ This mixin contains all methods related to: **Methods:** -#### `add_tool` +#### `add_tool` ```python add_tool(self: LocalProvider, tool: Tool | Callable[..., Any]) -> Tool @@ -37,19 +37,19 @@ Add a tool to this provider's storage. Accepts either a Tool object or a decorated function with __fastmcp__ metadata. -#### `tool` +#### `tool` ```python -tool(self: LocalProvider, name_or_fn: AnyFunction) -> FunctionTool +tool(self: LocalProvider, name_or_fn: F) -> F ``` -#### `tool` +#### `tool` ```python -tool(self: LocalProvider, name_or_fn: str | None = None) -> Callable[[AnyFunction], FunctionTool] +tool(self: LocalProvider, name_or_fn: str | None = None) -> Callable[[F], F] ``` -#### `tool` +#### `tool` ```python tool(self: LocalProvider, name_or_fn: str | AnyFunction | None = None) -> Callable[[AnyFunction], FunctionTool] | FunctionTool | partial[Callable[[AnyFunction], FunctionTool] | FunctionTool] diff --git a/docs/python-sdk/fastmcp-server-server.mdx b/docs/python-sdk/fastmcp-server-server.mdx index be0129414..267f66d13 100644 --- a/docs/python-sdk/fastmcp-server-server.mdx +++ b/docs/python-sdk/fastmcp-server-server.mdx @@ -10,7 +10,7 @@ FastMCP - A more ergonomic interface for MCP servers. ## Functions -### `default_lifespan` +### `default_lifespan` ```python default_lifespan(server: FastMCP[LifespanResultT]) -> AsyncIterator[Any] @@ -26,7 +26,7 @@ Default lifespan context manager that does nothing. - An empty dictionary as the lifespan result. -### `create_proxy` +### `create_proxy` ```python create_proxy(target: Client[ClientTransportT] | ClientTransport | FastMCP[Any] | FastMCP1Server | AnyUrl | Path | MCPConfig | dict[str, Any] | str, **settings: Any) -> FastMCPProxy @@ -54,53 +54,53 @@ use `FastMCPProxy` or `ProxyProvider` directly from `fastmcp.server.providers.pr ## Classes -### `StateValue` +### `StateValue` Wrapper for stored context state values. -### `FastMCP` +### `FastMCP` **Methods:** -#### `name` +#### `name` ```python name(self) -> str ``` -#### `instructions` +#### `instructions` ```python instructions(self) -> str | None ``` -#### `instructions` +#### `instructions` ```python instructions(self, value: str | None) -> None ``` -#### `version` +#### `version` ```python version(self) -> str | None ``` -#### `website_url` +#### `website_url` ```python website_url(self) -> str | None ``` -#### `icons` +#### `icons` ```python icons(self) -> list[mcp.types.Icon] ``` -#### `local_provider` +#### `local_provider` ```python local_provider(self) -> LocalProvider @@ -115,13 +115,13 @@ Use this to remove components: mcp.local_provider.remove_prompt("my_prompt") -#### `add_middleware` +#### `add_middleware` ```python add_middleware(self, middleware: Middleware) -> None ``` -#### `add_provider` +#### `add_provider` ```python add_provider(self, provider: Provider) -> None @@ -141,7 +141,7 @@ always take precedence over providers. - Prompts become "namespace_promptname" -#### `get_tasks` +#### `get_tasks` ```python get_tasks(self) -> Sequence[FastMCPComponent] @@ -153,7 +153,7 @@ Overrides AggregateProvider.get_tasks() to apply server-level transforms after aggregation. AggregateProvider handles provider-level namespacing. -#### `add_transform` +#### `add_transform` ```python add_transform(self, transform: Transform) -> None @@ -168,7 +168,7 @@ They transform tools, resources, and prompts from ALL providers. - `transform`: The transform to add. -#### `add_tool_transformation` +#### `add_tool_transformation` ```python add_tool_transformation(self, tool_name: str, transformation: ToolTransformConfig) -> None @@ -180,7 +180,7 @@ Add a tool transformation. Use ``add_transform(ToolTransform({...}))`` instead. -#### `remove_tool_transformation` +#### `remove_tool_transformation` ```python remove_tool_transformation(self, _tool_name: str) -> None @@ -192,7 +192,7 @@ Remove a tool transformation. Tool transformations are now immutable. Use enable/disable controls instead. -#### `list_tools` +#### `list_tools` ```python list_tools(self) -> Sequence[Tool] @@ -205,7 +205,7 @@ and middleware execution. Returns all versions (no deduplication). Protocol handlers deduplicate for MCP wire format. -#### `get_tool` +#### `get_tool` ```python get_tool(self, name: str, version: VersionSpec | None = None) -> Tool | None @@ -225,7 +225,7 @@ session transforms can override provider-level disables. - The tool if found and enabled, None otherwise. -#### `list_resources` +#### `list_resources` ```python list_resources(self) -> Sequence[Resource] @@ -238,7 +238,7 @@ and middleware execution. Returns all versions (no deduplication). Protocol handlers deduplicate for MCP wire format. -#### `get_resource` +#### `get_resource` ```python get_resource(self, uri: str, version: VersionSpec | None = None) -> Resource | None @@ -257,7 +257,7 @@ transforms (including session-level) have been applied. - The resource if found and enabled, None otherwise. -#### `list_resource_templates` +#### `list_resource_templates` ```python list_resource_templates(self) -> Sequence[ResourceTemplate] @@ -270,7 +270,7 @@ auth filtering, and middleware execution. Returns all versions (no deduplication Protocol handlers deduplicate for MCP wire format. -#### `get_resource_template` +#### `get_resource_template` ```python get_resource_template(self, uri: str, version: VersionSpec | None = None) -> ResourceTemplate | None @@ -289,7 +289,7 @@ all transforms (including session-level) have been applied. - The template if found and enabled, None otherwise. -#### `list_prompts` +#### `list_prompts` ```python list_prompts(self) -> Sequence[Prompt] @@ -302,7 +302,7 @@ and middleware execution. Returns all versions (no deduplication). Protocol handlers deduplicate for MCP wire format. -#### `get_prompt` +#### `get_prompt` ```python get_prompt(self, name: str, version: VersionSpec | None = None) -> Prompt | None @@ -321,19 +321,19 @@ transforms (including session-level) have been applied. - The prompt if found and enabled, None otherwise. -#### `call_tool` +#### `call_tool` ```python call_tool(self, name: str, arguments: dict[str, Any] | None = None) -> ToolResult ``` -#### `call_tool` +#### `call_tool` ```python call_tool(self, name: str, arguments: dict[str, Any] | None = None) -> mcp.types.CreateTaskResult ``` -#### `call_tool` +#### `call_tool` ```python call_tool(self, name: str, arguments: dict[str, Any] | None = None) -> ToolResult | mcp.types.CreateTaskResult @@ -363,19 +363,19 @@ return ToolResult. - `ValidationError`: If arguments fail validation -#### `read_resource` +#### `read_resource` ```python read_resource(self, uri: str) -> ResourceResult ``` -#### `read_resource` +#### `read_resource` ```python read_resource(self, uri: str) -> mcp.types.CreateTaskResult ``` -#### `read_resource` +#### `read_resource` ```python read_resource(self, uri: str) -> ResourceResult | mcp.types.CreateTaskResult @@ -404,19 +404,19 @@ return ResourceResult. - `ResourceError`: If resource read fails -#### `render_prompt` +#### `render_prompt` ```python render_prompt(self, name: str, arguments: dict[str, Any] | None = None) -> PromptResult ``` -#### `render_prompt` +#### `render_prompt` ```python render_prompt(self, name: str, arguments: dict[str, Any] | None = None) -> mcp.types.CreateTaskResult ``` -#### `render_prompt` +#### `render_prompt` ```python render_prompt(self, name: str, arguments: dict[str, Any] | None = None) -> PromptResult | mcp.types.CreateTaskResult @@ -446,7 +446,7 @@ return PromptResult. - `PromptError`: If prompt rendering fails -#### `add_tool` +#### `add_tool` ```python add_tool(self, tool: Tool | Callable[..., Any]) -> Tool @@ -464,7 +464,7 @@ with the Context type annotation. See the @tool decorator for examples. - The tool instance that was added to the server. -#### `remove_tool` +#### `remove_tool` ```python remove_tool(self, name: str, version: str | None = None) -> None @@ -483,19 +483,19 @@ Remove tool(s) from the server. - `NotFoundError`: If no matching tool is found. -#### `tool` +#### `tool` ```python -tool(self, name_or_fn: AnyFunction) -> FunctionTool +tool(self, name_or_fn: F) -> F ``` -#### `tool` +#### `tool` ```python -tool(self, name_or_fn: str | None = None) -> Callable[[AnyFunction], FunctionTool] +tool(self, name_or_fn: str | None = None) -> Callable[[F], F] ``` -#### `tool` +#### `tool` ```python tool(self, name_or_fn: str | AnyFunction | None = None) -> Callable[[AnyFunction], FunctionTool] | FunctionTool | partial[Callable[[AnyFunction], FunctionTool] | FunctionTool] @@ -551,7 +551,7 @@ server.tool(my_function, name="custom_name") ``` -#### `add_resource` +#### `add_resource` ```python add_resource(self, resource: Resource | Callable[..., Any]) -> Resource | ResourceTemplate @@ -566,7 +566,7 @@ Add a resource to the server. - The resource instance that was added to the server. -#### `add_template` +#### `add_template` ```python add_template(self, template: ResourceTemplate) -> ResourceTemplate @@ -581,10 +581,10 @@ Add a resource template to the server. - The template instance that was added to the server. -#### `resource` +#### `resource` ```python -resource(self, uri: str) -> Callable[[AnyFunction], Resource | ResourceTemplate | AnyFunction] +resource(self, uri: str) -> Callable[[F], F] ``` Decorator to register a function as a resource. @@ -640,7 +640,7 @@ async def get_weather(city: str) -> str: ``` -#### `add_prompt` +#### `add_prompt` ```python add_prompt(self, prompt: Prompt | Callable[..., Any]) -> Prompt @@ -655,19 +655,19 @@ Add a prompt to the server. - The prompt instance that was added to the server. -#### `prompt` +#### `prompt` ```python -prompt(self, name_or_fn: AnyFunction) -> FunctionPrompt +prompt(self, name_or_fn: F) -> F ``` -#### `prompt` +#### `prompt` ```python -prompt(self, name_or_fn: str | None = None) -> Callable[[AnyFunction], FunctionPrompt] +prompt(self, name_or_fn: str | None = None) -> Callable[[F], F] ``` -#### `prompt` +#### `prompt` ```python prompt(self, name_or_fn: str | AnyFunction | None = None) -> Callable[[AnyFunction], FunctionPrompt] | FunctionPrompt | partial[Callable[[AnyFunction], FunctionPrompt] | FunctionPrompt] @@ -744,7 +744,7 @@ Decorator to register a prompt. ``` -#### `mount` +#### `mount` ```python mount(self, server: FastMCP[LifespanResultT], namespace: str | None = None, as_proxy: bool | None = None, tool_names: dict[str, str] | None = None, prefix: str | None = None) -> None @@ -791,7 +791,7 @@ mounted server. - `prefix`: Deprecated. Use namespace instead. -#### `import_server` +#### `import_server` ```python import_server(self, server: FastMCP[LifespanResultT], prefix: str | None = None) -> None @@ -832,7 +832,7 @@ templates, and prompts are imported with their original names. objects are imported with their original names. -#### `from_openapi` +#### `from_openapi` ```python from_openapi(cls, openapi_spec: dict[str, Any], client: httpx.AsyncClient | None = None, name: str = 'OpenAPI Server', route_maps: list[RouteMap] | None = None, route_map_fn: OpenAPIRouteMapFn | None = None, mcp_component_fn: OpenAPIComponentFn | None = None, mcp_names: dict[str, str] | None = None, tags: set[str] | None = None, validate_output: bool = True, **settings: Any) -> Self @@ -861,7 +861,7 @@ response structure while still returning structured JSON. - A FastMCP server with an OpenAPIProvider attached. -#### `from_fastapi` +#### `from_fastapi` ```python from_fastapi(cls, app: Any, name: str | None = None, route_maps: list[RouteMap] | None = None, route_map_fn: OpenAPIRouteMapFn | None = None, mcp_component_fn: OpenAPIComponentFn | None = None, mcp_names: dict[str, str] | None = None, httpx_client_kwargs: dict[str, Any] | None = None, tags: set[str] | None = None, **settings: Any) -> Self @@ -885,7 +885,7 @@ Use this to configure timeout and other client settings. - A FastMCP server with an OpenAPIProvider attached. -#### `as_proxy` +#### `as_proxy` ```python as_proxy(cls, backend: Client[ClientTransportT] | ClientTransport | FastMCP[Any] | FastMCP1Server | AnyUrl | Path | MCPConfig | dict[str, Any] | str, **settings: Any) -> FastMCPProxy @@ -903,7 +903,7 @@ instance or any value accepted as the `transport` argument of `fastmcp.client.Client` constructor. -#### `generate_name` +#### `generate_name` ```python generate_name(cls, name: str | None = None) -> str diff --git a/src/fastmcp/server/providers/local_provider/decorators/prompts.py b/src/fastmcp/server/providers/local_provider/decorators/prompts.py index 5e01b7a04..d36c7d2f4 100644 --- a/src/fastmcp/server/providers/local_provider/decorators/prompts.py +++ b/src/fastmcp/server/providers/local_provider/decorators/prompts.py @@ -9,7 +9,7 @@ from __future__ import annotations import inspect from collections.abc import Callable from functools import partial -from typing import TYPE_CHECKING, Any, overload +from typing import TYPE_CHECKING, Any, TypeVar, overload import mcp.types from mcp.types import AnyFunction @@ -23,6 +23,8 @@ from fastmcp.server.tasks.config import TaskConfig if TYPE_CHECKING: from fastmcp.server.providers.local_provider import LocalProvider +F = TypeVar("F", bound=Callable[..., Any]) + class PromptDecoratorMixin: """Mixin class providing prompt decorator functionality for LocalProvider. @@ -71,7 +73,7 @@ class PromptDecoratorMixin: @overload def prompt( self: LocalProvider, - name_or_fn: AnyFunction, + name_or_fn: F, *, name: str | None = None, version: str | int | None = None, @@ -83,7 +85,7 @@ class PromptDecoratorMixin: meta: dict[str, Any] | None = None, task: bool | TaskConfig | None = None, auth: AuthCheck | list[AuthCheck] | None = None, - ) -> FunctionPrompt: ... + ) -> F: ... @overload def prompt( @@ -100,7 +102,7 @@ class PromptDecoratorMixin: meta: dict[str, Any] | None = None, task: bool | TaskConfig | None = None, auth: AuthCheck | list[AuthCheck] | None = None, - ) -> Callable[[AnyFunction], FunctionPrompt]: ... + ) -> Callable[[F], F]: ... def prompt( self: LocalProvider, diff --git a/src/fastmcp/server/providers/local_provider/decorators/resources.py b/src/fastmcp/server/providers/local_provider/decorators/resources.py index 52314378e..80a3e9a5c 100644 --- a/src/fastmcp/server/providers/local_provider/decorators/resources.py +++ b/src/fastmcp/server/providers/local_provider/decorators/resources.py @@ -8,7 +8,7 @@ from __future__ import annotations import inspect from collections.abc import Callable -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING, Any, TypeVar import mcp.types from mcp.types import Annotations, AnyFunction @@ -23,6 +23,8 @@ from fastmcp.server.tasks.config import TaskConfig if TYPE_CHECKING: from fastmcp.server.providers.local_provider import LocalProvider +F = TypeVar("F", bound=Callable[..., Any]) + class ResourceDecoratorMixin: """Mixin class providing resource decorator functionality for LocalProvider. @@ -118,7 +120,7 @@ class ResourceDecoratorMixin: meta: dict[str, Any] | None = None, task: bool | TaskConfig | None = None, auth: AuthCheck | list[AuthCheck] | None = None, - ) -> Callable[[AnyFunction], Resource | ResourceTemplate | AnyFunction]: + ) -> Callable[[F], F]: """Decorator to register a function as a resource. If the URI contains parameters (e.g. "resource://{param}") or the function @@ -166,7 +168,7 @@ class ResourceDecoratorMixin: resolved_task: bool | TaskConfig = task if task is not None else False - def decorator(fn: AnyFunction) -> Resource | ResourceTemplate | AnyFunction: + def decorator(fn: AnyFunction) -> Any: # Check for unbound method try: params = list(inspect.signature(fn).parameters.keys()) diff --git a/src/fastmcp/server/providers/local_provider/decorators/tools.py b/src/fastmcp/server/providers/local_provider/decorators/tools.py index c59fa8a3f..93209eb21 100644 --- a/src/fastmcp/server/providers/local_provider/decorators/tools.py +++ b/src/fastmcp/server/providers/local_provider/decorators/tools.py @@ -10,7 +10,7 @@ import inspect import warnings from collections.abc import Callable from functools import partial -from typing import TYPE_CHECKING, Any, Literal, overload +from typing import TYPE_CHECKING, Any, Literal, TypeVar, overload import mcp.types from mcp.types import AnyFunction, ToolAnnotations @@ -26,6 +26,8 @@ if TYPE_CHECKING: from fastmcp.server.providers.local_provider import LocalProvider from fastmcp.tools.tool import ToolResultSerializerType +F = TypeVar("F", bound=Callable[..., Any]) + DuplicateBehavior = Literal["error", "warn", "replace", "ignore"] @@ -90,7 +92,7 @@ class ToolDecoratorMixin: @overload def tool( self: LocalProvider, - name_or_fn: AnyFunction, + name_or_fn: F, *, name: str | None = None, version: str | int | None = None, @@ -107,7 +109,7 @@ class ToolDecoratorMixin: serializer: ToolResultSerializerType | None = None, # Deprecated timeout: float | None = None, auth: AuthCheck | list[AuthCheck] | None = None, - ) -> FunctionTool: ... + ) -> F: ... @overload def tool( @@ -129,7 +131,7 @@ class ToolDecoratorMixin: serializer: ToolResultSerializerType | None = None, # Deprecated timeout: float | None = None, auth: AuthCheck | list[AuthCheck] | None = None, - ) -> Callable[[AnyFunction], FunctionTool]: ... + ) -> Callable[[F], F]: ... # NOTE: This method mirrors fastmcp.tools.tool() but adds registration, # the `enabled` param, and supports deprecated params (serializer, exclude_args). diff --git a/src/fastmcp/server/server.py b/src/fastmcp/server/server.py index 1900ee148..db558dca3 100644 --- a/src/fastmcp/server/server.py +++ b/src/fastmcp/server/server.py @@ -19,7 +19,7 @@ from contextlib import ( from dataclasses import replace from functools import partial from pathlib import Path -from typing import TYPE_CHECKING, Any, Generic, Literal, cast, overload +from typing import TYPE_CHECKING, Any, Generic, Literal, TypeVar, cast, overload import httpx import mcp.types @@ -99,6 +99,7 @@ if TYPE_CHECKING: logger = get_logger(__name__) +F = TypeVar("F", bound=Callable[..., Any]) DuplicateBehavior = Literal["warn", "error", "replace", "ignore"] @@ -1300,7 +1301,7 @@ class FastMCP( @overload def tool( self, - name_or_fn: AnyFunction, + name_or_fn: F, *, name: str | None = None, version: str | int | None = None, @@ -1316,7 +1317,7 @@ class FastMCP( task: bool | TaskConfig | None = None, timeout: float | None = None, auth: AuthCheck | list[AuthCheck] | None = None, - ) -> FunctionTool: ... + ) -> F: ... @overload def tool( @@ -1337,7 +1338,7 @@ class FastMCP( task: bool | TaskConfig | None = None, timeout: float | None = None, auth: AuthCheck | list[AuthCheck] | None = None, - ) -> Callable[[AnyFunction], FunctionTool]: ... + ) -> Callable[[F], F]: ... def tool( self, @@ -1478,7 +1479,7 @@ class FastMCP( app: AppConfig | dict[str, Any] | bool | None = None, task: bool | TaskConfig | None = None, auth: AuthCheck | list[AuthCheck] | None = None, - ) -> Callable[[AnyFunction], Resource | ResourceTemplate | AnyFunction]: + ) -> Callable[[F], F]: """Decorator to register a function as a resource. The function will be called when the resource is read to generate its content. @@ -1579,10 +1580,7 @@ class FastMCP( auth=auth, ) - def decorator(fn: AnyFunction) -> Resource | ResourceTemplate | AnyFunction: - return inner_decorator(fn) - - return decorator + return inner_decorator def add_prompt(self, prompt: Prompt | Callable[..., Any]) -> Prompt: """Add a prompt to the server. @@ -1598,7 +1596,7 @@ class FastMCP( @overload def prompt( self, - name_or_fn: AnyFunction, + name_or_fn: F, *, name: str | None = None, version: str | int | None = None, @@ -1609,7 +1607,7 @@ class FastMCP( meta: dict[str, Any] | None = None, task: bool | TaskConfig | None = None, auth: AuthCheck | list[AuthCheck] | None = None, - ) -> FunctionPrompt: ... + ) -> F: ... @overload def prompt( @@ -1625,7 +1623,7 @@ class FastMCP( meta: dict[str, Any] | None = None, task: bool | TaskConfig | None = None, auth: AuthCheck | list[AuthCheck] | None = None, - ) -> Callable[[AnyFunction], FunctionPrompt]: ... + ) -> Callable[[F], F]: ... def prompt( self,