fix: resolve Pyright "Module is not callable" on @tool, @resource, @prompt decorators (#3540)

* pin pydantic-monty to 0.0.8

* rename tool/prompt/resource base modules to avoid decorator name shadow

* add sys.modules shims for old submodule import paths

* preserve original module paths in deprecation warnings

* clarify when sys.modules shims can be removed
This commit is contained in:
Jeremiah Lowin 2026-03-17 18:11:42 -04:00 committed by GitHub
commit 360c9c31e5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
107 changed files with 202 additions and 178 deletions

View file

@ -6,9 +6,9 @@ from collections.abc import Callable
from typing import TYPE_CHECKING, Any from typing import TYPE_CHECKING, Any
import fastmcp import fastmcp
from fastmcp.prompts.prompt import Prompt from fastmcp.prompts.base import Prompt
from fastmcp.resources.resource import Resource from fastmcp.resources.base import Resource
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
from fastmcp.utilities.types import get_fn_name from fastmcp.utilities.types import get_fn_name
if TYPE_CHECKING: if TYPE_CHECKING:

View file

@ -14,7 +14,7 @@ from fastmcp.server.transforms.search.base import (
serialize_tools_for_output_json, serialize_tools_for_output_json,
serialize_tools_for_output_markdown, serialize_tools_for_output_markdown,
) )
from fastmcp.tools.tool import Tool, ToolResult from fastmcp.tools.base import Tool, ToolResult
from fastmcp.utilities.async_utils import is_coroutine_function from fastmcp.utilities.async_utils import is_coroutine_function
from fastmcp.utilities.versions import VersionSpec from fastmcp.utilities.versions import VersionSpec

View file

@ -1,5 +1,13 @@
import sys
from .function_prompt import FunctionPrompt, prompt from .function_prompt import FunctionPrompt, prompt
from .prompt import Message, Prompt, PromptArgument, PromptMessage, PromptResult from .base import Message, Prompt, PromptArgument, PromptMessage, PromptResult
# Backward compat: prompt.py was renamed to base.py to stop Pyright from resolving
# `from fastmcp.prompts import prompt` as the submodule instead of the decorator function.
# This shim keeps `from fastmcp.prompts.prompt import Prompt` working at runtime.
# Safe to remove once we're confident no external code imports from the old path.
sys.modules[f"{__name__}.prompt"] = sys.modules[f"{__name__}.base"]
__all__ = [ __all__ = [
"FunctionPrompt", "FunctionPrompt",

View file

@ -25,7 +25,7 @@ from pydantic.json_schema import SkipJsonSchema
import fastmcp import fastmcp
from fastmcp.decorators import resolve_task_config from fastmcp.decorators import resolve_task_config
from fastmcp.exceptions import PromptError from fastmcp.exceptions import PromptError
from fastmcp.prompts.prompt import Prompt, PromptArgument, PromptResult from fastmcp.prompts.base import Prompt, PromptArgument, PromptResult
from fastmcp.server.auth.authorization import AuthCheck from fastmcp.server.auth.authorization import AuthCheck
from fastmcp.server.dependencies import ( from fastmcp.server.dependencies import (
transform_context_annotations, transform_context_annotations,

View file

@ -1,5 +1,7 @@
import sys
from .function_resource import FunctionResource, resource from .function_resource import FunctionResource, resource
from .resource import Resource, ResourceContent, ResourceResult from .base import Resource, ResourceContent, ResourceResult
from .template import ResourceTemplate from .template import ResourceTemplate
from .types import ( from .types import (
BinaryResource, BinaryResource,
@ -22,3 +24,9 @@ __all__ = [
"TextResource", "TextResource",
"resource", "resource",
] ]
# Backward compat: resource.py was renamed to base.py to stop Pyright from resolving
# `from fastmcp.resources import resource` as the submodule instead of the decorator function.
# This shim keeps `from fastmcp.resources.resource import Resource` working at runtime.
# Safe to remove once we're confident no external code imports from the old path.
sys.modules[f"{__name__}.resource"] = sys.modules[f"{__name__}.base"]

View file

@ -15,7 +15,7 @@ from pydantic.json_schema import SkipJsonSchema
import fastmcp import fastmcp
from fastmcp.decorators import resolve_task_config from fastmcp.decorators import resolve_task_config
from fastmcp.resources.resource import Resource, ResourceResult from fastmcp.resources.base import Resource, ResourceResult
from fastmcp.server.apps import resolve_ui_mime_type from fastmcp.server.apps import resolve_ui_mime_type
from fastmcp.server.auth.authorization import AuthCheck from fastmcp.server.auth.authorization import AuthCheck
from fastmcp.server.dependencies import ( from fastmcp.server.dependencies import (

View file

@ -23,7 +23,7 @@ from pydantic import (
validate_call, validate_call,
) )
from fastmcp.resources.resource import Resource, ResourceResult from fastmcp.resources.base import Resource, ResourceResult
from fastmcp.server.apps import resolve_ui_mime_type from fastmcp.server.apps import resolve_ui_mime_type
from fastmcp.server.auth.authorization import AuthCheck from fastmcp.server.auth.authorization import AuthCheck
from fastmcp.server.dependencies import ( from fastmcp.server.dependencies import (

View file

@ -12,7 +12,7 @@ from pydantic import Field, ValidationInfo
from typing_extensions import override from typing_extensions import override
from fastmcp.exceptions import ResourceError from fastmcp.exceptions import ResourceError
from fastmcp.resources.resource import Resource, ResourceContent, ResourceResult from fastmcp.resources.base import Resource, ResourceContent, ResourceResult
from fastmcp.utilities.logging import get_logger from fastmcp.utilities.logging import get_logger
logger = get_logger(__name__) logger = get_logger(__name__)

View file

@ -38,7 +38,7 @@ from fastmcp.decorators import get_fastmcp_meta
from fastmcp.server.auth.authorization import AuthCheck from fastmcp.server.auth.authorization import AuthCheck
from fastmcp.server.providers.base import Provider from fastmcp.server.providers.base import Provider
from fastmcp.server.providers.local_provider import LocalProvider from fastmcp.server.providers.local_provider import LocalProvider
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
from fastmcp.utilities.logging import get_logger from fastmcp.utilities.logging import get_logger
logger = get_logger(__name__) logger = get_logger(__name__)

View file

@ -40,7 +40,7 @@ logger = logging.getLogger(__name__)
if TYPE_CHECKING: if TYPE_CHECKING:
from fastmcp.server.auth import AccessToken from fastmcp.server.auth import AccessToken
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
from fastmcp.utilities.components import FastMCPComponent from fastmcp.utilities.components import FastMCPComponent
@ -66,7 +66,7 @@ class AuthContext:
Returns the component if it's a Tool, None otherwise. Returns the component if it's a Tool, None otherwise.
""" """
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
return self.component if isinstance(self.component, Tool) else None return self.component if isinstance(self.component, Tool) else None

View file

@ -26,7 +26,7 @@ from starlette.requests import Request
from typing_extensions import TypeVar from typing_extensions import TypeVar
from uncalled_for import SharedContext from uncalled_for import SharedContext
from fastmcp.resources.resource import ResourceResult from fastmcp.resources.base import ResourceResult
from fastmcp.server.elicitation import ( from fastmcp.server.elicitation import (
AcceptedElicitation, AcceptedElicitation,
CancelledElicitation, CancelledElicitation,

View file

@ -29,8 +29,8 @@ from collections.abc import Sequence
import mcp.types as mt import mcp.types as mt
from fastmcp.exceptions import AuthorizationError from fastmcp.exceptions import AuthorizationError
from fastmcp.prompts.prompt import Prompt, PromptResult from fastmcp.prompts.base import Prompt, PromptResult
from fastmcp.resources.resource import Resource, ResourceResult from fastmcp.resources.base import Resource, ResourceResult
from fastmcp.resources.template import ResourceTemplate from fastmcp.resources.template import ResourceTemplate
from fastmcp.server.auth.authorization import ( from fastmcp.server.auth.authorization import (
AuthCheck, AuthCheck,
@ -43,7 +43,7 @@ from fastmcp.server.middleware.middleware import (
Middleware, Middleware,
MiddlewareContext, MiddlewareContext,
) )
from fastmcp.tools.tool import Tool, ToolResult from fastmcp.tools.base import Tool, ToolResult
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View file

@ -18,10 +18,10 @@ from key_value.aio.wrappers.statistics.wrapper import (
from pydantic import Field from pydantic import Field
from typing_extensions import NotRequired, Self, override from typing_extensions import NotRequired, Self, override
from fastmcp.prompts.prompt import Message, Prompt, PromptResult from fastmcp.prompts.base import Message, Prompt, PromptResult
from fastmcp.resources.resource import Resource, ResourceContent, ResourceResult from fastmcp.resources.base import Resource, ResourceContent, ResourceResult
from fastmcp.server.middleware.middleware import CallNext, Middleware, MiddlewareContext from fastmcp.server.middleware.middleware import CallNext, Middleware, MiddlewareContext
from fastmcp.tools.tool import Tool, ToolResult from fastmcp.tools.base import Tool, ToolResult
from fastmcp.utilities.logging import get_logger from fastmcp.utilities.logging import get_logger
from fastmcp.utilities.types import FastMCPBaseModel from fastmcp.utilities.types import FastMCPBaseModel

View file

@ -8,7 +8,7 @@ from typing_extensions import override
from fastmcp.resources.template import ResourceTemplate from fastmcp.resources.template import ResourceTemplate
from fastmcp.server.middleware.middleware import CallNext, Middleware, MiddlewareContext from fastmcp.server.middleware.middleware import CallNext, Middleware, MiddlewareContext
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
from fastmcp.utilities.json_schema import dereference_refs from fastmcp.utilities.json_schema import dereference_refs

View file

@ -17,10 +17,10 @@ from typing import (
import mcp.types as mt import mcp.types as mt
from typing_extensions import TypeVar from typing_extensions import TypeVar
from fastmcp.prompts.prompt import Prompt, PromptResult from fastmcp.prompts.base import Prompt, PromptResult
from fastmcp.resources.resource import Resource, ResourceResult from fastmcp.resources.base import Resource, ResourceResult
from fastmcp.resources.template import ResourceTemplate from fastmcp.resources.template import ResourceTemplate
from fastmcp.tools.tool import Tool, ToolResult from fastmcp.tools.base import Tool, ToolResult
if TYPE_CHECKING: if TYPE_CHECKING:
from fastmcp.server.context import Context from fastmcp.server.context import Context

View file

@ -8,7 +8,7 @@ import mcp.types as mt
import pydantic_core import pydantic_core
from mcp.types import TextContent from mcp.types import TextContent
from fastmcp.tools.tool import ToolResult from fastmcp.tools.base import ToolResult
from .middleware import CallNext, Middleware, MiddlewareContext from .middleware import CallNext, Middleware, MiddlewareContext

View file

@ -11,10 +11,10 @@ from pydantic import AnyUrl
from typing_extensions import override from typing_extensions import override
import fastmcp import fastmcp
from fastmcp.resources.resource import ResourceResult from fastmcp.resources.base import ResourceResult
from fastmcp.server.context import Context from fastmcp.server.context import Context
from fastmcp.server.middleware.middleware import CallNext, Middleware, MiddlewareContext from fastmcp.server.middleware.middleware import CallNext, Middleware, MiddlewareContext
from fastmcp.tools.tool import Tool, ToolResult from fastmcp.tools.base import Tool, ToolResult
from fastmcp.utilities.logging import get_logger from fastmcp.utilities.logging import get_logger
logger: Logger = get_logger(name=__name__) logger: Logger = get_logger(name=__name__)

View file

@ -33,10 +33,10 @@ from fastmcp.utilities.components import FastMCPComponent
from fastmcp.utilities.versions import VersionSpec, version_sort_key from fastmcp.utilities.versions import VersionSpec, version_sort_key
if TYPE_CHECKING: if TYPE_CHECKING:
from fastmcp.prompts.prompt import Prompt from fastmcp.prompts.base import Prompt
from fastmcp.resources.resource import Resource from fastmcp.resources.base import Resource
from fastmcp.resources.template import ResourceTemplate from fastmcp.resources.template import ResourceTemplate
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View file

@ -35,11 +35,11 @@ from typing import TYPE_CHECKING, Literal, cast
from typing_extensions import Self from typing_extensions import Self
from fastmcp.prompts.prompt import Prompt from fastmcp.prompts.base import Prompt
from fastmcp.resources.resource import Resource from fastmcp.resources.base import Resource
from fastmcp.resources.template import ResourceTemplate from fastmcp.resources.template import ResourceTemplate
from fastmcp.server.transforms.visibility import Visibility from fastmcp.server.transforms.visibility import Visibility
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
from fastmcp.utilities.async_utils import gather from fastmcp.utilities.async_utils import gather
from fastmcp.utilities.components import FastMCPComponent from fastmcp.utilities.components import FastMCPComponent
from fastmcp.utilities.versions import VersionSpec, version_sort_key from fastmcp.utilities.versions import VersionSpec, version_sort_key

View file

@ -19,13 +19,13 @@ from urllib.parse import quote
import mcp.types import mcp.types
from mcp.types import AnyUrl from mcp.types import AnyUrl
from fastmcp.prompts.prompt import Prompt, PromptResult from fastmcp.prompts.base import Prompt, PromptResult
from fastmcp.resources.resource import Resource, ResourceResult from fastmcp.resources.base import Resource, ResourceResult
from fastmcp.resources.template import ResourceTemplate from fastmcp.resources.template import ResourceTemplate
from fastmcp.server.providers.base import Provider from fastmcp.server.providers.base import Provider
from fastmcp.server.tasks.config import TaskMeta from fastmcp.server.tasks.config import TaskMeta
from fastmcp.server.telemetry import delegate_span from fastmcp.server.telemetry import delegate_span
from fastmcp.tools.tool import Tool, ToolResult from fastmcp.tools.base import Tool, ToolResult
from fastmcp.utilities.components import FastMCPComponent from fastmcp.utilities.components import FastMCPComponent
from fastmcp.utilities.versions import VersionSpec from fastmcp.utilities.versions import VersionSpec

View file

@ -31,12 +31,12 @@ import asyncio
from collections.abc import Sequence from collections.abc import Sequence
from pathlib import Path from pathlib import Path
from fastmcp.prompts.prompt import Prompt from fastmcp.prompts.base import Prompt
from fastmcp.resources.resource import Resource from fastmcp.resources.base import Resource
from fastmcp.resources.template import ResourceTemplate from fastmcp.resources.template import ResourceTemplate
from fastmcp.server.providers.filesystem_discovery import discover_and_import from fastmcp.server.providers.filesystem_discovery import discover_and_import
from fastmcp.server.providers.local_provider import LocalProvider from fastmcp.server.providers.local_provider import LocalProvider
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
from fastmcp.utilities.components import FastMCPComponent from fastmcp.utilities.components import FastMCPComponent
from fastmcp.utilities.logging import get_logger from fastmcp.utilities.logging import get_logger
from fastmcp.utilities.versions import VersionSpec from fastmcp.utilities.versions import VersionSpec

View file

@ -189,14 +189,14 @@ def extract_components(module: ModuleType) -> list[FastMCPComponent]:
import inspect import inspect
from fastmcp.decorators import get_fastmcp_meta from fastmcp.decorators import get_fastmcp_meta
from fastmcp.prompts.base import Prompt
from fastmcp.prompts.function_prompt import PromptMeta from fastmcp.prompts.function_prompt import PromptMeta
from fastmcp.prompts.prompt import Prompt from fastmcp.resources.base import Resource
from fastmcp.resources.function_resource import ResourceMeta from fastmcp.resources.function_resource import ResourceMeta
from fastmcp.resources.resource import Resource
from fastmcp.resources.template import ResourceTemplate from fastmcp.resources.template import ResourceTemplate
from fastmcp.server.dependencies import without_injected_parameters from fastmcp.server.dependencies import without_injected_parameters
from fastmcp.tools.base import Tool
from fastmcp.tools.function_tool import ToolMeta from fastmcp.tools.function_tool import ToolMeta
from fastmcp.tools.tool import Tool
component_types = (Tool, Resource, ResourceTemplate, Prompt) component_types = (Tool, Resource, ResourceTemplate, Prompt)
components: list[FastMCPComponent] = [] components: list[FastMCPComponent] = []

View file

@ -15,8 +15,8 @@ import mcp.types
from mcp.types import AnyFunction from mcp.types import AnyFunction
import fastmcp import fastmcp
from fastmcp.prompts.base import Prompt
from fastmcp.prompts.function_prompt import FunctionPrompt from fastmcp.prompts.function_prompt import FunctionPrompt
from fastmcp.prompts.prompt import Prompt
from fastmcp.server.auth.authorization import AuthCheck from fastmcp.server.auth.authorization import AuthCheck
from fastmcp.server.tasks.config import TaskConfig from fastmcp.server.tasks.config import TaskConfig

View file

@ -14,8 +14,8 @@ import mcp.types
from mcp.types import Annotations, AnyFunction from mcp.types import Annotations, AnyFunction
import fastmcp import fastmcp
from fastmcp.resources.base import Resource
from fastmcp.resources.function_resource import resource as standalone_resource from fastmcp.resources.function_resource import resource as standalone_resource
from fastmcp.resources.resource import Resource
from fastmcp.resources.template import ResourceTemplate from fastmcp.resources.template import ResourceTemplate
from fastmcp.server.auth.authorization import AuthCheck from fastmcp.server.auth.authorization import AuthCheck
from fastmcp.server.tasks.config import TaskConfig from fastmcp.server.tasks.config import TaskConfig

View file

@ -29,8 +29,8 @@ from mcp.types import AnyFunction, ToolAnnotations
import fastmcp import fastmcp
from fastmcp.server.auth.authorization import AuthCheck from fastmcp.server.auth.authorization import AuthCheck
from fastmcp.server.tasks.config import TaskConfig from fastmcp.server.tasks.config import TaskConfig
from fastmcp.tools.base import Tool
from fastmcp.tools.function_tool import FunctionTool from fastmcp.tools.function_tool import FunctionTool
from fastmcp.tools.tool import Tool
from fastmcp.utilities.types import NotSet, NotSetT from fastmcp.utilities.types import NotSet, NotSetT
try: try:
@ -43,7 +43,7 @@ except ImportError:
if TYPE_CHECKING: if TYPE_CHECKING:
from fastmcp.server.providers.local_provider import LocalProvider from fastmcp.server.providers.local_provider import LocalProvider
from fastmcp.tools.tool import ToolResultSerializerType from fastmcp.tools.base import ToolResultSerializerType
F = TypeVar("F", bound=Callable[..., Any]) F = TypeVar("F", bound=Callable[..., Any])

View file

@ -27,8 +27,8 @@ from __future__ import annotations
from collections.abc import Sequence from collections.abc import Sequence
from typing import Literal, TypeVar from typing import Literal, TypeVar
from fastmcp.prompts.prompt import Prompt from fastmcp.prompts.base import Prompt
from fastmcp.resources.resource import Resource from fastmcp.resources.base import Resource
from fastmcp.resources.template import ResourceTemplate from fastmcp.resources.template import ResourceTemplate
from fastmcp.server.providers.base import Provider from fastmcp.server.providers.base import Provider
from fastmcp.server.providers.local_provider.decorators import ( from fastmcp.server.providers.local_provider.decorators import (
@ -36,7 +36,7 @@ from fastmcp.server.providers.local_provider.decorators import (
ResourceDecoratorMixin, ResourceDecoratorMixin,
ToolDecoratorMixin, ToolDecoratorMixin,
) )
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
from fastmcp.utilities.components import FastMCPComponent from fastmcp.utilities.components import FastMCPComponent
from fastmcp.utilities.logging import get_logger from fastmcp.utilities.logging import get_logger
from fastmcp.utilities.versions import VersionSpec, version_sort_key from fastmcp.utilities.versions import VersionSpec, version_sort_key

View file

@ -21,7 +21,7 @@ from fastmcp.resources import (
) )
from fastmcp.server.dependencies import get_http_headers from fastmcp.server.dependencies import get_http_headers
from fastmcp.server.tasks.config import TaskConfig from fastmcp.server.tasks.config import TaskConfig
from fastmcp.tools.tool import Tool, ToolResult from fastmcp.tools.base import Tool, ToolResult
from fastmcp.utilities.logging import get_logger from fastmcp.utilities.logging import get_logger
from fastmcp.utilities.openapi import HTTPRoute from fastmcp.utilities.openapi import HTTPRoute
from fastmcp.utilities.openapi.director import RequestDirector from fastmcp.utilities.openapi.director import RequestDirector

View file

@ -28,7 +28,7 @@ from fastmcp.server.providers.openapi.routing import (
RouteMapFn, RouteMapFn,
_determine_route_type, _determine_route_type,
) )
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
from fastmcp.utilities.components import FastMCPComponent from fastmcp.utilities.components import FastMCPComponent
from fastmcp.utilities.logging import get_logger from fastmcp.utilities.logging import get_logger
from fastmcp.utilities.openapi import ( from fastmcp.utilities.openapi import (

View file

@ -37,15 +37,15 @@ from fastmcp.client.transports import ClientTransportT
from fastmcp.exceptions import ResourceError, ToolError from fastmcp.exceptions import ResourceError, ToolError
from fastmcp.mcp_config import MCPConfig from fastmcp.mcp_config import MCPConfig
from fastmcp.prompts import Message, Prompt, PromptResult from fastmcp.prompts import Message, Prompt, PromptResult
from fastmcp.prompts.prompt import PromptArgument from fastmcp.prompts.base import PromptArgument
from fastmcp.resources import Resource, ResourceTemplate from fastmcp.resources import Resource, ResourceTemplate
from fastmcp.resources.resource import ResourceContent, ResourceResult from fastmcp.resources.base import ResourceContent, ResourceResult
from fastmcp.server.context import Context from fastmcp.server.context import Context
from fastmcp.server.dependencies import get_context from fastmcp.server.dependencies import get_context
from fastmcp.server.providers.base import Provider from fastmcp.server.providers.base import Provider
from fastmcp.server.server import FastMCP from fastmcp.server.server import FastMCP
from fastmcp.server.tasks.config import TaskConfig from fastmcp.server.tasks.config import TaskConfig
from fastmcp.tools.tool import Tool, ToolResult from fastmcp.tools.base import Tool, ToolResult
from fastmcp.utilities.components import FastMCPComponent, get_fastmcp_metadata from fastmcp.utilities.components import FastMCPComponent, get_fastmcp_metadata
from fastmcp.utilities.logging import get_logger from fastmcp.utilities.logging import get_logger
from fastmcp.utilities.versions import VersionSpec, version_sort_key from fastmcp.utilities.versions import VersionSpec, version_sort_key

View file

@ -6,7 +6,7 @@ from collections.abc import Sequence
from pathlib import Path from pathlib import Path
from typing import Literal from typing import Literal
from fastmcp.resources.resource import Resource from fastmcp.resources.base import Resource
from fastmcp.resources.template import ResourceTemplate from fastmcp.resources.template import ResourceTemplate
from fastmcp.server.providers.aggregate import AggregateProvider from fastmcp.server.providers.aggregate import AggregateProvider
from fastmcp.server.providers.skills.skill_provider import SkillProvider from fastmcp.server.providers.skills.skill_provider import SkillProvider

View file

@ -10,7 +10,7 @@ from typing import Any, Literal, cast
from pydantic import AnyUrl from pydantic import AnyUrl
from fastmcp.resources.resource import Resource, ResourceResult from fastmcp.resources.base import Resource, ResourceResult
from fastmcp.resources.template import ResourceTemplate from fastmcp.resources.template import ResourceTemplate
from fastmcp.server.providers.base import Provider from fastmcp.server.providers.base import Provider
from fastmcp.server.providers.skills._common import ( from fastmcp.server.providers.skills._common import (

View file

@ -14,11 +14,11 @@ from fastmcp.server.providers.base import Provider
from fastmcp.utilities.versions import VersionSpec from fastmcp.utilities.versions import VersionSpec
if TYPE_CHECKING: if TYPE_CHECKING:
from fastmcp.prompts.prompt import Prompt from fastmcp.prompts.base import Prompt
from fastmcp.resources.resource import Resource from fastmcp.resources.base import Resource
from fastmcp.resources.template import ResourceTemplate from fastmcp.resources.template import ResourceTemplate
from fastmcp.server.transforms import Transform from fastmcp.server.transforms import Transform
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
from fastmcp.utilities.components import FastMCPComponent from fastmcp.utilities.components import FastMCPComponent
@ -96,10 +96,10 @@ class _WrappedProvider(Provider):
async def get_tasks(self) -> Sequence[FastMCPComponent]: async def get_tasks(self) -> Sequence[FastMCPComponent]:
"""Delegate to inner's get_tasks and apply wrapper's transforms.""" """Delegate to inner's get_tasks and apply wrapper's transforms."""
# Import here to avoid circular imports # Import here to avoid circular imports
from fastmcp.prompts.prompt import Prompt from fastmcp.prompts.base import Prompt
from fastmcp.resources.resource import Resource from fastmcp.resources.base import Resource
from fastmcp.resources.template import ResourceTemplate from fastmcp.resources.template import ResourceTemplate
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
# Get tasks from inner (already has inner's transforms) # Get tasks from inner (already has inner's transforms)
components = list(await self._inner.get_tasks()) components = list(await self._inner.get_tasks())

View file

@ -13,9 +13,9 @@ from pydantic import ConfigDict
from fastmcp.exceptions import AuthorizationError from fastmcp.exceptions import AuthorizationError
from fastmcp.server.auth.authorization import AuthContext, run_auth_checks from fastmcp.server.auth.authorization import AuthContext, run_auth_checks
from fastmcp.server.dependencies import get_access_token from fastmcp.server.dependencies import get_access_token
from fastmcp.tools.base import ToolResult
from fastmcp.tools.function_parsing import ParsedFunction from fastmcp.tools.function_parsing import ParsedFunction
from fastmcp.tools.function_tool import FunctionTool from fastmcp.tools.function_tool import FunctionTool
from fastmcp.tools.tool import ToolResult
from fastmcp.tools.tool_transform import TransformedTool from fastmcp.tools.tool_transform import TransformedTool
from fastmcp.utilities.types import FastMCPBaseModel from fastmcp.utilities.types import FastMCPBaseModel

View file

@ -52,9 +52,9 @@ from fastmcp.exceptions import (
) )
from fastmcp.mcp_config import MCPConfig from fastmcp.mcp_config import MCPConfig
from fastmcp.prompts import Prompt from fastmcp.prompts import Prompt
from fastmcp.prompts.base import PromptResult
from fastmcp.prompts.function_prompt import FunctionPrompt from fastmcp.prompts.function_prompt import FunctionPrompt
from fastmcp.prompts.prompt import PromptResult from fastmcp.resources.base import Resource, ResourceResult
from fastmcp.resources.resource import Resource, ResourceResult
from fastmcp.resources.template import ResourceTemplate from fastmcp.resources.template import ResourceTemplate
from fastmcp.server.apps import ( from fastmcp.server.apps import (
AppConfig, AppConfig,
@ -76,8 +76,8 @@ from fastmcp.server.transforms import (
) )
from fastmcp.server.transforms.visibility import apply_session_transforms, is_enabled from fastmcp.server.transforms.visibility import apply_session_transforms, is_enabled
from fastmcp.settings import DuplicateBehavior as DuplicateBehaviorSetting from fastmcp.settings import DuplicateBehavior as DuplicateBehaviorSetting
from fastmcp.tools.base import Tool, ToolResult
from fastmcp.tools.function_tool import FunctionTool from fastmcp.tools.function_tool import FunctionTool
from fastmcp.tools.tool import Tool, ToolResult
from fastmcp.tools.tool_transform import ToolTransformConfig from fastmcp.tools.tool_transform import ToolTransformConfig
from fastmcp.utilities.components import FastMCPComponent, _coerce_version from fastmcp.utilities.components import FastMCPComponent, _coerce_version
from fastmcp.utilities.logging import get_logger from fastmcp.utilities.logging import get_logger

View file

@ -20,10 +20,10 @@ from fastmcp.server.tasks.keys import build_task_key
from fastmcp.utilities.logging import get_logger from fastmcp.utilities.logging import get_logger
if TYPE_CHECKING: if TYPE_CHECKING:
from fastmcp.prompts.prompt import Prompt from fastmcp.prompts.base import Prompt
from fastmcp.resources.resource import Resource from fastmcp.resources.base import Resource
from fastmcp.resources.template import ResourceTemplate from fastmcp.resources.template import ResourceTemplate
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
logger = get_logger(__name__) logger = get_logger(__name__)

View file

@ -25,12 +25,12 @@ from mcp.types import (
import fastmcp.server.context import fastmcp.server.context
from fastmcp.exceptions import NotFoundError from fastmcp.exceptions import NotFoundError
from fastmcp.prompts.prompt import Prompt from fastmcp.prompts.base import Prompt
from fastmcp.resources.resource import Resource from fastmcp.resources.base import Resource
from fastmcp.resources.template import ResourceTemplate from fastmcp.resources.template import ResourceTemplate
from fastmcp.server.tasks.config import DEFAULT_POLL_INTERVAL_MS, DEFAULT_TTL_MS from fastmcp.server.tasks.config import DEFAULT_POLL_INTERVAL_MS, DEFAULT_TTL_MS
from fastmcp.server.tasks.keys import parse_task_key from fastmcp.server.tasks.keys import parse_task_key
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
from fastmcp.utilities.versions import VersionSpec from fastmcp.utilities.versions import VersionSpec
if TYPE_CHECKING: if TYPE_CHECKING:

View file

@ -15,10 +15,10 @@ from fastmcp.server.tasks.config import TaskMeta
from fastmcp.server.tasks.handlers import submit_to_docket from fastmcp.server.tasks.handlers import submit_to_docket
if TYPE_CHECKING: if TYPE_CHECKING:
from fastmcp.prompts.prompt import Prompt from fastmcp.prompts.base import Prompt
from fastmcp.resources.resource import Resource from fastmcp.resources.base import Resource
from fastmcp.resources.template import ResourceTemplate from fastmcp.resources.template import ResourceTemplate
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
TaskType = Literal["tool", "resource", "template", "prompt"] TaskType = Literal["tool", "resource", "template", "prompt"]

View file

@ -26,10 +26,10 @@ from typing import TYPE_CHECKING, Protocol
from fastmcp.utilities.versions import VersionSpec from fastmcp.utilities.versions import VersionSpec
if TYPE_CHECKING: if TYPE_CHECKING:
from fastmcp.prompts.prompt import Prompt from fastmcp.prompts.base import Prompt
from fastmcp.resources.resource import Resource from fastmcp.resources.base import Resource
from fastmcp.resources.template import ResourceTemplate from fastmcp.resources.template import ResourceTemplate
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
# Get methods use Protocol to express keyword-only version parameter # Get methods use Protocol to express keyword-only version parameter

View file

@ -53,11 +53,11 @@ from fastmcp.server.transforms import Transform
from fastmcp.utilities.versions import dedupe_with_versions from fastmcp.utilities.versions import dedupe_with_versions
if TYPE_CHECKING: if TYPE_CHECKING:
from fastmcp.prompts.prompt import Prompt from fastmcp.prompts.base import Prompt
from fastmcp.resources.resource import Resource from fastmcp.resources.base import Resource
from fastmcp.resources.template import ResourceTemplate from fastmcp.resources.template import ResourceTemplate
from fastmcp.server.context import Context from fastmcp.server.context import Context
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
_instance_counter = itertools.count() _instance_counter = itertools.count()

View file

@ -16,10 +16,10 @@ from fastmcp.server.transforms import (
from fastmcp.utilities.versions import VersionSpec from fastmcp.utilities.versions import VersionSpec
if TYPE_CHECKING: if TYPE_CHECKING:
from fastmcp.prompts.prompt import Prompt from fastmcp.prompts.base import Prompt
from fastmcp.resources.resource import Resource from fastmcp.resources.base import Resource
from fastmcp.resources.template import ResourceTemplate from fastmcp.resources.template import ResourceTemplate
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
# Pattern for matching URIs: protocol://path # Pattern for matching URIs: protocol://path
_URI_PATTERN = re.compile(r"^([^:]+://)(.*?)$") _URI_PATTERN = re.compile(r"^([^:]+://)(.*?)$")

View file

@ -28,7 +28,7 @@ from mcp.types import TextContent
from fastmcp.server.dependencies import get_context from fastmcp.server.dependencies import get_context
from fastmcp.server.transforms import GetToolNext, Transform from fastmcp.server.transforms import GetToolNext, Transform
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
from fastmcp.utilities.versions import VersionSpec from fastmcp.utilities.versions import VersionSpec
if TYPE_CHECKING: if TYPE_CHECKING:

View file

@ -29,7 +29,7 @@ from mcp.types import ToolAnnotations
from fastmcp.server.dependencies import get_context from fastmcp.server.dependencies import get_context
from fastmcp.server.transforms import GetToolNext, Transform from fastmcp.server.transforms import GetToolNext, Transform
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
from fastmcp.utilities.versions import VersionSpec from fastmcp.utilities.versions import VersionSpec
_DEFAULT_ANNOTATIONS = ToolAnnotations(readOnlyHint=True) _DEFAULT_ANNOTATIONS = ToolAnnotations(readOnlyHint=True)

View file

@ -34,7 +34,7 @@ from typing import Annotated, Any
from fastmcp.server.context import Context from fastmcp.server.context import Context
from fastmcp.server.transforms import GetToolNext from fastmcp.server.transforms import GetToolNext
from fastmcp.server.transforms.catalog import CatalogTransform from fastmcp.server.transforms.catalog import CatalogTransform
from fastmcp.tools.tool import Tool, ToolResult from fastmcp.tools.base import Tool, ToolResult
from fastmcp.utilities.versions import VersionSpec from fastmcp.utilities.versions import VersionSpec

View file

@ -12,7 +12,7 @@ from fastmcp.server.transforms.search.base import (
SearchResultSerializer, SearchResultSerializer,
_extract_searchable_text, _extract_searchable_text,
) )
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
def _tokenize(text: str) -> list[str]: def _tokenize(text: str) -> list[str]:

View file

@ -9,7 +9,7 @@ from fastmcp.server.transforms.search.base import (
BaseSearchTransform, BaseSearchTransform,
_extract_searchable_text, _extract_searchable_text,
) )
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
class RegexSearchTransform(BaseSearchTransform): class RegexSearchTransform(BaseSearchTransform):

View file

@ -10,7 +10,7 @@ from fastmcp.tools.tool_transform import ToolTransformConfig
from fastmcp.utilities.versions import VersionSpec from fastmcp.utilities.versions import VersionSpec
if TYPE_CHECKING: if TYPE_CHECKING:
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
class ToolTransform(Transform): class ToolTransform(Transform):

View file

@ -15,10 +15,10 @@ from fastmcp.server.transforms import (
from fastmcp.utilities.versions import VersionSpec from fastmcp.utilities.versions import VersionSpec
if TYPE_CHECKING: if TYPE_CHECKING:
from fastmcp.prompts.prompt import Prompt from fastmcp.prompts.base import Prompt
from fastmcp.resources.resource import Resource from fastmcp.resources.base import Resource
from fastmcp.resources.template import ResourceTemplate from fastmcp.resources.template import ResourceTemplate
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
class VersionFilter(Transform): class VersionFilter(Transform):

View file

@ -12,7 +12,7 @@ from typing import TYPE_CHECKING, Any, Literal, TypeVar
import mcp.types import mcp.types
from fastmcp.resources.resource import Resource from fastmcp.resources.base import Resource
from fastmcp.resources.template import ResourceTemplate from fastmcp.resources.template import ResourceTemplate
from fastmcp.server.transforms import ( from fastmcp.server.transforms import (
GetPromptNext, GetPromptNext,
@ -24,9 +24,9 @@ from fastmcp.server.transforms import (
from fastmcp.utilities.versions import VersionSpec from fastmcp.utilities.versions import VersionSpec
if TYPE_CHECKING: if TYPE_CHECKING:
from fastmcp.prompts.prompt import Prompt from fastmcp.prompts.base import Prompt
from fastmcp.server.context import Context from fastmcp.server.context import Context
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
from fastmcp.utilities.components import FastMCPComponent from fastmcp.utilities.components import FastMCPComponent
T = TypeVar("T", bound="FastMCPComponent") T = TypeVar("T", bound="FastMCPComponent")

View file

@ -1,7 +1,15 @@
import sys
from .function_tool import FunctionTool, tool from .function_tool import FunctionTool, tool
from .tool import Tool, ToolResult from .base import Tool, ToolResult
from .tool_transform import forward, forward_raw from .tool_transform import forward, forward_raw
# Backward compat: tool.py was renamed to base.py to stop Pyright from resolving
# `from fastmcp.tools import tool` as the submodule instead of the decorator function.
# This shim keeps `from fastmcp.tools.tool import Tool` working at runtime.
# Safe to remove once we're confident no external code imports from the old path.
sys.modules[f"{__name__}.tool"] = sys.modules[f"{__name__}.base"]
__all__ = [ __all__ = [
"FunctionTool", "FunctionTool",
"Tool", "Tool",

View file

@ -17,7 +17,7 @@ from fastmcp.server.dependencies import (
transform_context_annotations, transform_context_annotations,
without_injected_parameters, without_injected_parameters,
) )
from fastmcp.tools.tool import ToolResult from fastmcp.tools.base import ToolResult
from fastmcp.utilities.json_schema import compress_schema from fastmcp.utilities.json_schema import compress_schema
from fastmcp.utilities.logging import get_logger from fastmcp.utilities.logging import get_logger
from fastmcp.utilities.types import ( from fastmcp.utilities.types import (

View file

@ -29,12 +29,12 @@ from fastmcp.decorators import resolve_task_config
from fastmcp.server.auth.authorization import AuthCheck from fastmcp.server.auth.authorization import AuthCheck
from fastmcp.server.dependencies import without_injected_parameters from fastmcp.server.dependencies import without_injected_parameters
from fastmcp.server.tasks.config import TaskConfig from fastmcp.server.tasks.config import TaskConfig
from fastmcp.tools.function_parsing import ParsedFunction, _is_object_schema from fastmcp.tools.base import (
from fastmcp.tools.tool import (
Tool, Tool,
ToolResult, ToolResult,
ToolResultSerializerType, ToolResultSerializerType,
) )
from fastmcp.tools.function_parsing import ParsedFunction, _is_object_schema
from fastmcp.utilities.async_utils import ( from fastmcp.utilities.async_utils import (
call_sync_fn_in_threadpool, call_sync_fn_in_threadpool,
is_coroutine_function, is_coroutine_function,

View file

@ -16,8 +16,8 @@ from pydantic.functional_validators import BeforeValidator
from pydantic.json_schema import SkipJsonSchema from pydantic.json_schema import SkipJsonSchema
import fastmcp import fastmcp
from fastmcp.tools.base import Tool, ToolResult, _convert_to_content
from fastmcp.tools.function_parsing import ParsedFunction from fastmcp.tools.function_parsing import ParsedFunction
from fastmcp.tools.tool import Tool, ToolResult, _convert_to_content
from fastmcp.utilities.components import _convert_set_default_none from fastmcp.utilities.components import _convert_set_default_none
from fastmcp.utilities.json_schema import compress_schema from fastmcp.utilities.json_schema import compress_schema
from fastmcp.utilities.logging import get_logger from fastmcp.utilities.logging import get_logger

View file

@ -10,7 +10,7 @@ from fastmcp.contrib.bulk_tool_caller.bulk_tool_caller import (
CallToolRequest, CallToolRequest,
CallToolRequestResult, CallToolRequestResult,
) )
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
class ToolException(Exception): class ToolException(Exception):

View file

@ -348,7 +348,7 @@ class TestMCPMixinKwargsSync:
"""Verify that the valid-kwarg sets stay in sync with from_function signatures.""" """Verify that the valid-kwarg sets stay in sync with from_function signatures."""
def test_tool_valid_kwargs_match_from_function(self): def test_tool_valid_kwargs_match_from_function(self):
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
expected = frozenset( expected = frozenset(
p for p in inspect.signature(Tool.from_function).parameters if p != "fn" p for p in inspect.signature(Tool.from_function).parameters if p != "fn"
@ -356,7 +356,7 @@ class TestMCPMixinKwargsSync:
assert _TOOL_VALID_KWARGS == expected assert _TOOL_VALID_KWARGS == expected
def test_resource_valid_kwargs_match_from_function(self): def test_resource_valid_kwargs_match_from_function(self):
from fastmcp.resources.resource import Resource from fastmcp.resources.base import Resource
expected = frozenset( expected = frozenset(
p p
@ -366,7 +366,7 @@ class TestMCPMixinKwargsSync:
assert _RESOURCE_VALID_KWARGS == expected assert _RESOURCE_VALID_KWARGS == expected
def test_prompt_valid_kwargs_match_from_function(self): def test_prompt_valid_kwargs_match_from_function(self):
from fastmcp.prompts.prompt import Prompt from fastmcp.prompts.base import Prompt
expected = frozenset( expected = frozenset(
p for p in inspect.signature(Prompt.from_function).parameters if p != "fn" p for p in inspect.signature(Prompt.from_function).parameters if p != "fn"

View file

@ -4,7 +4,7 @@ import pytest
from mcp.server.session import ServerSession from mcp.server.session import ServerSession
from fastmcp import Client, FastMCP from fastmcp import Client, FastMCP
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
async def test_tool_exclude_args(): async def test_tool_exclude_args():

View file

@ -13,7 +13,7 @@ class TestDeprecatedFunctionToolImports:
with pytest.warns( with pytest.warns(
DeprecationWarning, match="Import from fastmcp.tools.function_tool" DeprecationWarning, match="Import from fastmcp.tools.function_tool"
): ):
from fastmcp.tools.tool import FunctionTool from fastmcp.tools.base import FunctionTool
# Verify it's the real class # Verify it's the real class
from fastmcp.tools.function_tool import ( from fastmcp.tools.function_tool import (
@ -27,7 +27,7 @@ class TestDeprecatedFunctionToolImports:
with pytest.warns( with pytest.warns(
DeprecationWarning, match="Import from fastmcp.tools.function_tool" DeprecationWarning, match="Import from fastmcp.tools.function_tool"
): ):
from fastmcp.tools.tool import ParsedFunction from fastmcp.tools.base import ParsedFunction
from fastmcp.tools.function_tool import ( from fastmcp.tools.function_tool import (
ParsedFunction as CanonicalParsedFunction, ParsedFunction as CanonicalParsedFunction,
@ -40,7 +40,7 @@ class TestDeprecatedFunctionToolImports:
with pytest.warns( with pytest.warns(
DeprecationWarning, match="Import from fastmcp.tools.function_tool" DeprecationWarning, match="Import from fastmcp.tools.function_tool"
): ):
from fastmcp.tools.tool import tool from fastmcp.tools.base import tool
from fastmcp.tools.function_tool import tool as canonical_tool from fastmcp.tools.function_tool import tool as canonical_tool
@ -50,7 +50,7 @@ class TestDeprecatedFunctionToolImports:
with temporary_settings(deprecation_warnings=False): with temporary_settings(deprecation_warnings=False):
with warnings.catch_warnings(): with warnings.catch_warnings():
warnings.simplefilter("error") warnings.simplefilter("error")
from fastmcp.tools.tool import FunctionTool # noqa: F401 from fastmcp.tools.base import FunctionTool # noqa: F401
class TestDeprecatedFunctionResourceImports: class TestDeprecatedFunctionResourceImports:
@ -60,7 +60,7 @@ class TestDeprecatedFunctionResourceImports:
DeprecationWarning, DeprecationWarning,
match="Import from fastmcp.resources.function_resource", match="Import from fastmcp.resources.function_resource",
): ):
from fastmcp.resources.resource import FunctionResource from fastmcp.resources.base import FunctionResource
from fastmcp.resources.function_resource import ( from fastmcp.resources.function_resource import (
FunctionResource as CanonicalFunctionResource, FunctionResource as CanonicalFunctionResource,
@ -74,7 +74,7 @@ class TestDeprecatedFunctionResourceImports:
DeprecationWarning, DeprecationWarning,
match="Import from fastmcp.resources.function_resource", match="Import from fastmcp.resources.function_resource",
): ):
from fastmcp.resources.resource import resource from fastmcp.resources.base import resource
from fastmcp.resources.function_resource import ( from fastmcp.resources.function_resource import (
resource as canonical_resource, resource as canonical_resource,
@ -86,7 +86,7 @@ class TestDeprecatedFunctionResourceImports:
with temporary_settings(deprecation_warnings=False): with temporary_settings(deprecation_warnings=False):
with warnings.catch_warnings(): with warnings.catch_warnings():
warnings.simplefilter("error") warnings.simplefilter("error")
from fastmcp.resources.resource import FunctionResource # noqa: F401 from fastmcp.resources.base import FunctionResource # noqa: F401
class TestDeprecatedFunctionPromptImports: class TestDeprecatedFunctionPromptImports:
@ -95,7 +95,7 @@ class TestDeprecatedFunctionPromptImports:
with pytest.warns( with pytest.warns(
DeprecationWarning, match="Import from fastmcp.prompts.function_prompt" DeprecationWarning, match="Import from fastmcp.prompts.function_prompt"
): ):
from fastmcp.prompts.prompt import FunctionPrompt from fastmcp.prompts.base import FunctionPrompt
from fastmcp.prompts.function_prompt import ( from fastmcp.prompts.function_prompt import (
FunctionPrompt as CanonicalFunctionPrompt, FunctionPrompt as CanonicalFunctionPrompt,
@ -108,7 +108,7 @@ class TestDeprecatedFunctionPromptImports:
with pytest.warns( with pytest.warns(
DeprecationWarning, match="Import from fastmcp.prompts.function_prompt" DeprecationWarning, match="Import from fastmcp.prompts.function_prompt"
): ):
from fastmcp.prompts.prompt import prompt from fastmcp.prompts.base import prompt
from fastmcp.prompts.function_prompt import prompt as canonical_prompt from fastmcp.prompts.function_prompt import prompt as canonical_prompt
@ -118,4 +118,4 @@ class TestDeprecatedFunctionPromptImports:
with temporary_settings(deprecation_warnings=False): with temporary_settings(deprecation_warnings=False):
with warnings.catch_warnings(): with warnings.catch_warnings():
warnings.simplefilter("error") warnings.simplefilter("error")
from fastmcp.prompts.prompt import FunctionPrompt # noqa: F401 from fastmcp.prompts.base import FunctionPrompt # noqa: F401

View file

@ -5,8 +5,8 @@ from mcp.types import TextContent, TextResourceContents
from fastmcp.client.client import Client from fastmcp.client.client import Client
from fastmcp.server.server import FastMCP from fastmcp.server.server import FastMCP
from fastmcp.tools.base import Tool
from fastmcp.tools.function_tool import FunctionTool from fastmcp.tools.function_tool import FunctionTool
from fastmcp.tools.tool import Tool
from tests.conftest import get_fn_name from tests.conftest import get_fn_name

View file

@ -13,7 +13,7 @@ from mcp.types import TextContent
from fastmcp import FastMCP from fastmcp import FastMCP
from fastmcp.contrib.mcp_mixin import mcp_tool from fastmcp.contrib.mcp_mixin import mcp_tool
from fastmcp.server.providers import LocalProvider from fastmcp.server.providers import LocalProvider
from fastmcp.tools.tool import Tool, _convert_to_content from fastmcp.tools.base import Tool, _convert_to_content
from fastmcp.tools.tool_transform import TransformedTool from fastmcp.tools.tool_transform import TransformedTool
from fastmcp.utilities.tests import temporary_settings from fastmcp.utilities.tests import temporary_settings

View file

@ -16,7 +16,7 @@ from fastmcp.experimental.transforms.code_mode import (
_ensure_async, _ensure_async,
) )
from fastmcp.server.context import Context from fastmcp.server.context import Context
from fastmcp.tools.tool import Tool, ToolResult from fastmcp.tools.base import Tool, ToolResult
def _unwrap_result(result: ToolResult) -> Any: def _unwrap_result(result: ToolResult) -> Any:

View file

@ -11,7 +11,7 @@ from fastmcp.experimental.transforms.code_mode import (
Search, Search,
_ensure_async, _ensure_async,
) )
from fastmcp.tools.tool import ToolResult from fastmcp.tools.base import ToolResult
def _unwrap_result(result: ToolResult) -> Any: def _unwrap_result(result: ToolResult) -> Any:

View file

@ -2,8 +2,8 @@
from pathlib import Path from pathlib import Path
from fastmcp.prompts.prompt import Prompt from fastmcp.prompts.base import Prompt
from fastmcp.resources.resource import Resource from fastmcp.resources.base import Resource
from fastmcp.resources.template import FunctionResourceTemplate, ResourceTemplate from fastmcp.resources.template import FunctionResourceTemplate, ResourceTemplate
from fastmcp.server.providers.filesystem_discovery import ( from fastmcp.server.providers.filesystem_discovery import (
discover_and_import, discover_and_import,
@ -12,7 +12,7 @@ from fastmcp.server.providers.filesystem_discovery import (
import_module_from_file, import_module_from_file,
) )
from fastmcp.tools import FunctionTool from fastmcp.tools import FunctionTool
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
class TestDiscoverFiles: class TestDiscoverFiles:

View file

@ -2,7 +2,7 @@ import pytest
from mcp.types import EmbeddedResource, TextResourceContents from mcp.types import EmbeddedResource, TextResourceContents
from pydantic import FileUrl from pydantic import FileUrl
from fastmcp.prompts.prompt import ( from fastmcp.prompts.base import (
Message, Message,
Prompt, Prompt,
PromptResult, PromptResult,

View file

@ -7,7 +7,7 @@ from pydantic import FileUrl
from fastmcp.exceptions import ResourceError from fastmcp.exceptions import ResourceError
from fastmcp.resources import FileResource from fastmcp.resources import FileResource
from fastmcp.resources.resource import ResourceResult from fastmcp.resources.base import ResourceResult
@pytest.fixture @pytest.fixture

View file

@ -1,8 +1,8 @@
import pytest import pytest
from pydantic import AnyUrl, BaseModel from pydantic import AnyUrl, BaseModel
from fastmcp.resources.base import ResourceContent
from fastmcp.resources.function_resource import FunctionResource from fastmcp.resources.function_resource import FunctionResource
from fastmcp.resources.resource import ResourceContent
class TestFunctionResource: class TestFunctionResource:

View file

@ -27,9 +27,9 @@ from pydantic import AnyUrl, BaseModel
from fastmcp import Context, FastMCP from fastmcp import Context, FastMCP
from fastmcp.client.client import CallToolResult, Client from fastmcp.client.client import CallToolResult, Client
from fastmcp.client.transports import FastMCPTransport from fastmcp.client.transports import FastMCPTransport
from fastmcp.prompts.base import Message, Prompt
from fastmcp.prompts.function_prompt import FunctionPrompt from fastmcp.prompts.function_prompt import FunctionPrompt
from fastmcp.prompts.prompt import Message, Prompt from fastmcp.resources.base import Resource
from fastmcp.resources.resource import Resource
from fastmcp.server.middleware.caching import ( from fastmcp.server.middleware.caching import (
CachableToolResult, CachableToolResult,
CallToolSettings, CallToolSettings,
@ -40,7 +40,7 @@ from fastmcp.server.middleware.caching import (
_make_read_resource_cache_key, _make_read_resource_cache_key,
) )
from fastmcp.server.middleware.middleware import CallNext, MiddlewareContext from fastmcp.server.middleware.middleware import CallNext, MiddlewareContext
from fastmcp.tools.tool import Tool, ToolResult from fastmcp.tools.base import Tool, ToolResult
TEST_URI = AnyUrl("https://test_uri") TEST_URI = AnyUrl("https://test_uri")

View file

@ -10,7 +10,7 @@ from mcp.types import ErrorData, TextContent
from fastmcp import Client, FastMCP from fastmcp import Client, FastMCP
from fastmcp.server.middleware import CallNext, Middleware, MiddlewareContext from fastmcp.server.middleware import CallNext, Middleware, MiddlewareContext
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
class InitializationMiddleware(Middleware): class InitializationMiddleware(Middleware):

View file

@ -8,7 +8,7 @@ import pytest
from fastmcp import Client, FastMCP from fastmcp import Client, FastMCP
from fastmcp.server.context import Context from fastmcp.server.context import Context
from fastmcp.server.middleware import CallNext, Middleware, MiddlewareContext from fastmcp.server.middleware import CallNext, Middleware, MiddlewareContext
from fastmcp.tools.tool import ToolResult from fastmcp.tools.base import ToolResult
@dataclass @dataclass

View file

@ -9,7 +9,7 @@ from fastmcp import Client, FastMCP
from fastmcp.exceptions import ToolError from fastmcp.exceptions import ToolError
from fastmcp.server.context import Context from fastmcp.server.context import Context
from fastmcp.server.middleware import CallNext, Middleware, MiddlewareContext from fastmcp.server.middleware import CallNext, Middleware, MiddlewareContext
from fastmcp.tools.tool import ToolResult from fastmcp.tools.base import ToolResult
@dataclass @dataclass

View file

@ -5,7 +5,7 @@ from mcp.types import ImageContent, TextContent
from fastmcp import Client, FastMCP from fastmcp import Client, FastMCP
from fastmcp.server.middleware.response_limiting import ResponseLimitingMiddleware from fastmcp.server.middleware.response_limiting import ResponseLimitingMiddleware
from fastmcp.tools.tool import ToolResult from fastmcp.tools.base import ToolResult
class TestResponseLimitingMiddleware: class TestResponseLimitingMiddleware:

View file

@ -13,8 +13,8 @@ from fastmcp.client.transports import FastMCPTransport
from fastmcp.server.middleware.tool_injection import ( from fastmcp.server.middleware.tool_injection import (
ToolInjectionMiddleware, ToolInjectionMiddleware,
) )
from fastmcp.tools.base import Tool
from fastmcp.tools.function_tool import FunctionTool from fastmcp.tools.function_tool import FunctionTool
from fastmcp.tools.tool import Tool
def multiply_fn(a: int, b: int) -> int: def multiply_fn(a: int, b: int) -> int:

View file

@ -9,7 +9,7 @@ from mcp.types import TextContent
from fastmcp import FastMCP from fastmcp import FastMCP
from fastmcp.client import Client from fastmcp.client import Client
from fastmcp.client.transports import SSETransport from fastmcp.client.transports import SSETransport
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
from fastmcp.tools.tool_transform import TransformedTool from fastmcp.tools.tool_transform import TransformedTool

View file

@ -7,7 +7,7 @@ from pydantic import BaseModel
from typing_extensions import TypedDict from typing_extensions import TypedDict
from fastmcp import Context, FastMCP from fastmcp import Context, FastMCP
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
def _normalize_anyof_order(schema): def _normalize_anyof_order(schema):

View file

@ -9,7 +9,7 @@ from typing_extensions import TypedDict
from fastmcp import FastMCP from fastmcp import FastMCP
from fastmcp.exceptions import NotFoundError from fastmcp.exceptions import NotFoundError
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
def _normalize_anyof_order(schema): def _normalize_anyof_order(schema):

View file

@ -11,8 +11,8 @@ from pydantic import AnyUrl, BaseModel, TypeAdapter
from typing_extensions import TypeAliasType, TypedDict from typing_extensions import TypeAliasType, TypedDict
from fastmcp import FastMCP from fastmcp import FastMCP
from fastmcp.tools.base import ToolResult
from fastmcp.tools.function_parsing import _is_object_schema from fastmcp.tools.function_parsing import _is_object_schema
from fastmcp.tools.tool import ToolResult
from fastmcp.utilities.json_schema import compress_schema from fastmcp.utilities.json_schema import compress_schema

View file

@ -23,7 +23,7 @@ from fastmcp.server.providers.proxy import (
ProxyClient, ProxyClient,
ProxyProvider, ProxyProvider,
) )
from fastmcp.tools.tool import ToolResult from fastmcp.tools.base import ToolResult
from fastmcp.tools.tool_transform import ( from fastmcp.tools.tool_transform import (
ToolTransformConfig, ToolTransformConfig,
) )
@ -136,7 +136,7 @@ def fastmcp_server():
@server.prompt @server.prompt
def image_prompt(): def image_prompt():
"""A prompt that returns an image.""" """A prompt that returns an image."""
from fastmcp.prompts.prompt import Message, PromptResult from fastmcp.prompts.base import Message, PromptResult
return PromptResult( return PromptResult(
messages=[ messages=[

View file

@ -5,7 +5,7 @@ from typing import Any
from fastmcp.server.providers.base import Provider from fastmcp.server.providers.base import Provider
from fastmcp.server.tasks.config import TaskConfig from fastmcp.server.tasks.config import TaskConfig
from fastmcp.server.transforms import Namespace from fastmcp.server.transforms import Namespace
from fastmcp.tools.tool import Tool, ToolResult from fastmcp.tools.base import Tool, ToolResult
class CustomTool(Tool): class CustomTool(Tool):

View file

@ -4,11 +4,11 @@ import mcp.types as mt
from fastmcp import FastMCP from fastmcp import FastMCP
from fastmcp.client import Client from fastmcp.client import Client
from fastmcp.prompts.prompt import PromptResult from fastmcp.prompts.base import PromptResult
from fastmcp.resources.resource import ResourceResult from fastmcp.resources.base import ResourceResult
from fastmcp.server.middleware import CallNext, Middleware, MiddlewareContext from fastmcp.server.middleware import CallNext, Middleware, MiddlewareContext
from fastmcp.server.providers import FastMCPProvider from fastmcp.server.providers import FastMCPProvider
from fastmcp.tools.tool import ToolResult from fastmcp.tools.base import ToolResult
class ToolTracingMiddleware(Middleware): class ToolTracingMiddleware(Middleware):

View file

@ -15,10 +15,10 @@ import pytest
from fastmcp import FastMCP from fastmcp import FastMCP
from fastmcp.client import Client from fastmcp.client import Client
from fastmcp.prompts.prompt import Prompt from fastmcp.prompts.base import Prompt
from fastmcp.server.providers.local_provider import LocalProvider from fastmcp.server.providers.local_provider import LocalProvider
from fastmcp.server.tasks import TaskConfig from fastmcp.server.tasks import TaskConfig
from fastmcp.tools.tool import Tool, ToolResult from fastmcp.tools.base import Tool, ToolResult
class TestLocalProviderStorage: class TestLocalProviderStorage:

View file

@ -9,7 +9,7 @@ import pytest
from mcp.types import TextContent from mcp.types import TextContent
from fastmcp import Client, Context, FastMCP from fastmcp import Client, Context, FastMCP
from fastmcp.prompts.prompt import Prompt, PromptResult from fastmcp.prompts.base import Prompt, PromptResult
class TestPromptContext: class TestPromptContext:

View file

@ -13,7 +13,7 @@ import pytest
from fastmcp import FastMCP from fastmcp import FastMCP
from fastmcp.client import Client from fastmcp.client import Client
from fastmcp.server.tasks import TaskConfig from fastmcp.server.tasks import TaskConfig
from fastmcp.tools.tool import Tool, ToolResult from fastmcp.tools.base import Tool, ToolResult
from fastmcp.utilities.components import FastMCPComponent from fastmcp.utilities.components import FastMCPComponent

View file

@ -10,7 +10,7 @@ from mcp.shared.exceptions import McpError
from fastmcp import FastMCP from fastmcp import FastMCP
from fastmcp.client import Client from fastmcp.client import Client
from fastmcp.resources.resource import Resource from fastmcp.resources.base import Resource
from fastmcp.resources.template import ResourceTemplate from fastmcp.resources.template import ResourceTemplate
from fastmcp.server.tasks.config import TaskMeta from fastmcp.server.tasks.config import TaskMeta

View file

@ -16,7 +16,7 @@ from fastmcp import FastMCP
from fastmcp.client import Client from fastmcp.client import Client
from fastmcp.exceptions import ToolError from fastmcp.exceptions import ToolError
from fastmcp.server.tasks import TaskConfig from fastmcp.server.tasks import TaskConfig
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
class TestTaskConfigNormalization: class TestTaskConfigNormalization:

View file

@ -13,7 +13,7 @@ from fastmcp.client import Client
from fastmcp.exceptions import ToolError from fastmcp.exceptions import ToolError
from fastmcp.server.middleware import CallNext, Middleware, MiddlewareContext from fastmcp.server.middleware import CallNext, Middleware, MiddlewareContext
from fastmcp.server.tasks.config import TaskMeta from fastmcp.server.tasks.config import TaskMeta
from fastmcp.tools.tool import Tool, ToolResult from fastmcp.tools.base import Tool, ToolResult
class TestTaskMetaParameter: class TestTaskMetaParameter:

View file

@ -13,12 +13,12 @@ from docket import Docket
from fastmcp import FastMCP from fastmcp import FastMCP
from fastmcp.client import Client from fastmcp.client import Client
from fastmcp.prompts.prompt import PromptResult from fastmcp.prompts.base import PromptResult
from fastmcp.resources.resource import ResourceResult from fastmcp.resources.base import ResourceResult
from fastmcp.server.dependencies import CurrentDocket, CurrentFastMCP from fastmcp.server.dependencies import CurrentDocket, CurrentFastMCP
from fastmcp.server.middleware import CallNext, Middleware, MiddlewareContext from fastmcp.server.middleware import CallNext, Middleware, MiddlewareContext
from fastmcp.server.tasks import TaskConfig from fastmcp.server.tasks import TaskConfig
from fastmcp.tools.tool import ToolResult from fastmcp.tools.base import ToolResult
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)

View file

@ -7,13 +7,13 @@ import pytest
from mcp.types import AnyUrl, TextContent from mcp.types import AnyUrl, TextContent
from fastmcp import FastMCP from fastmcp import FastMCP
from fastmcp.prompts.base import Prompt
from fastmcp.prompts.function_prompt import FunctionPrompt from fastmcp.prompts.function_prompt import FunctionPrompt
from fastmcp.prompts.prompt import Prompt from fastmcp.resources.base import Resource
from fastmcp.resources.function_resource import FunctionResource from fastmcp.resources.function_resource import FunctionResource
from fastmcp.resources.resource import Resource
from fastmcp.resources.template import FunctionResourceTemplate, ResourceTemplate from fastmcp.resources.template import FunctionResourceTemplate, ResourceTemplate
from fastmcp.server.providers import Provider from fastmcp.server.providers import Provider
from fastmcp.tools.tool import Tool, ToolResult from fastmcp.tools.base import Tool, ToolResult
from fastmcp.utilities.versions import VersionSpec from fastmcp.utilities.versions import VersionSpec

View file

@ -10,7 +10,7 @@ from mcp.types import TextContent, TextResourceContents
from fastmcp import Client, FastMCP from fastmcp import Client, FastMCP
from fastmcp.server.providers import LocalProvider from fastmcp.server.providers import LocalProvider
from fastmcp.tools import FunctionTool from fastmcp.tools import FunctionTool
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
from fastmcp.utilities.tests import temporary_settings from fastmcp.utilities.tests import temporary_settings

View file

@ -5,7 +5,7 @@ from mcp.types import Tool as MCPTool
from mcp.types import ToolAnnotations, ToolExecution from mcp.types import ToolAnnotations, ToolExecution
from fastmcp import Client, FastMCP from fastmcp import Client, FastMCP
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
async def test_tool_annotations_in_tool_manager(): async def test_tool_annotations_in_tool_manager():

View file

@ -12,7 +12,7 @@ from fastmcp.server.context import Context
from fastmcp.server.transforms import GetToolNext from fastmcp.server.transforms import GetToolNext
from fastmcp.server.transforms.catalog import CatalogTransform from fastmcp.server.transforms.catalog import CatalogTransform
from fastmcp.server.transforms.version_filter import VersionFilter from fastmcp.server.transforms.version_filter import VersionFilter
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
from fastmcp.utilities.versions import VersionSpec from fastmcp.utilities.versions import VersionSpec
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------

View file

@ -20,7 +20,7 @@ from fastmcp.server.transforms.search.bm25 import (
_catalog_hash, _catalog_hash,
) )
from fastmcp.server.transforms.search.regex import RegexSearchTransform from fastmcp.server.transforms.search.regex import RegexSearchTransform
from fastmcp.tools.tool import Tool, ToolResult from fastmcp.tools.base import Tool, ToolResult
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Helpers # Helpers

View file

@ -3,7 +3,7 @@
import pytest import pytest
from fastmcp.server.transforms.visibility import Visibility, is_enabled from fastmcp.server.transforms.visibility import Visibility, is_enabled
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
from fastmcp.utilities.versions import VersionSpec from fastmcp.utilities.versions import VersionSpec

View file

@ -19,7 +19,7 @@ from fastmcp.server.apps import UI_MIME_TYPE, AppConfig
from fastmcp.server.providers.local_provider.decorators.tools import ( from fastmcp.server.providers.local_provider.decorators.tools import (
PREFAB_RENDERER_URI, PREFAB_RENDERER_URI,
) )
from fastmcp.tools.tool import Tool, ToolResult from fastmcp.tools.base import Tool, ToolResult
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# convert_result # convert_result

View file

@ -25,7 +25,7 @@ from fastmcp.server.app import (
_make_global_key, _make_global_key,
_resolve_tool_ref, _resolve_tool_ref,
) )
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Fixtures / helpers # Fixtures / helpers

View file

@ -7,8 +7,8 @@ using SkipJsonSchema annotations.
from fastmcp.prompts.function_prompt import FunctionPrompt from fastmcp.prompts.function_prompt import FunctionPrompt
from fastmcp.resources.function_resource import FunctionResource from fastmcp.resources.function_resource import FunctionResource
from fastmcp.resources.template import FunctionResourceTemplate from fastmcp.resources.template import FunctionResourceTemplate
from fastmcp.tools.base import Tool
from fastmcp.tools.function_tool import FunctionTool from fastmcp.tools.function_tool import FunctionTool
from fastmcp.tools.tool import Tool
from fastmcp.tools.tool_transform import TransformedTool from fastmcp.tools.tool_transform import TransformedTool

View file

@ -36,7 +36,7 @@ from fastmcp.mcp_config import (
StdioMCPServer, StdioMCPServer,
TransformingStdioMCPServer, TransformingStdioMCPServer,
) )
from fastmcp.tools.tool import Tool as FastMCPTool from fastmcp.tools.base import Tool as FastMCPTool
# These tests spawn subprocess servers via stdio which can be slow under # These tests spawn subprocess servers via stdio which can be slow under
# parallel CI load. Give them more headroom than the 5s default, and skip # parallel CI load. Give them more headroom than the 5s default, and skip

View file

@ -7,7 +7,7 @@ from pydantic import Field
from fastmcp import Context, FastMCP from fastmcp import Context, FastMCP
from fastmcp.client import Client from fastmcp.client import Client
from fastmcp.tools.tool import ToolResult from fastmcp.tools.base import ToolResult
from fastmcp.utilities.types import Image from fastmcp.utilities.types import Image
fastmcp_server = FastMCP() fastmcp_server = FastMCP()

View file

@ -4,7 +4,7 @@ import threading
from mcp.types import TextContent from mcp.types import TextContent
from fastmcp import Context, FastMCP from fastmcp import Context, FastMCP
from fastmcp.tools.tool import Tool from fastmcp.tools.base import Tool
class TestToolCallable: class TestToolCallable:

View file

@ -13,7 +13,7 @@ from mcp.types import (
) )
from pydantic import AnyUrl, BaseModel from pydantic import AnyUrl, BaseModel
from fastmcp.tools.tool import Tool, _convert_to_content from fastmcp.tools.base import Tool, _convert_to_content
from fastmcp.utilities.types import Audio, File, Image from fastmcp.utilities.types import Audio, File, Image

Some files were not shown because too many files have changed in this diff Show more