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
import fastmcp
from fastmcp.prompts.prompt import Prompt
from fastmcp.resources.resource import Resource
from fastmcp.tools.tool import Tool
from fastmcp.prompts.base import Prompt
from fastmcp.resources.base import Resource
from fastmcp.tools.base import Tool
from fastmcp.utilities.types import get_fn_name
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_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.versions import VersionSpec

View file

@ -1,5 +1,13 @@
import sys
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__ = [
"FunctionPrompt",

View file

@ -25,7 +25,7 @@ from pydantic.json_schema import SkipJsonSchema
import fastmcp
from fastmcp.decorators import resolve_task_config
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.dependencies import (
transform_context_annotations,

View file

@ -1,5 +1,7 @@
import sys
from .function_resource import FunctionResource, resource
from .resource import Resource, ResourceContent, ResourceResult
from .base import Resource, ResourceContent, ResourceResult
from .template import ResourceTemplate
from .types import (
BinaryResource,
@ -22,3 +24,9 @@ __all__ = [
"TextResource",
"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
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.auth.authorization import AuthCheck
from fastmcp.server.dependencies import (

View file

@ -23,7 +23,7 @@ from pydantic import (
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.auth.authorization import AuthCheck
from fastmcp.server.dependencies import (

View file

@ -12,7 +12,7 @@ from pydantic import Field, ValidationInfo
from typing_extensions import override
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
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.providers.base import Provider
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
logger = get_logger(__name__)

View file

@ -40,7 +40,7 @@ logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from fastmcp.server.auth import AccessToken
from fastmcp.tools.tool import Tool
from fastmcp.tools.base import Tool
from fastmcp.utilities.components import FastMCPComponent
@ -66,7 +66,7 @@ class AuthContext:
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

View file

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

View file

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

View file

@ -18,10 +18,10 @@ from key_value.aio.wrappers.statistics.wrapper import (
from pydantic import Field
from typing_extensions import NotRequired, Self, override
from fastmcp.prompts.prompt import Message, Prompt, PromptResult
from fastmcp.resources.resource import Resource, ResourceContent, ResourceResult
from fastmcp.prompts.base import Message, Prompt, PromptResult
from fastmcp.resources.base import Resource, ResourceContent, ResourceResult
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.types import FastMCPBaseModel

View file

@ -8,7 +8,7 @@ from typing_extensions import override
from fastmcp.resources.template import ResourceTemplate
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

View file

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

View file

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

View file

@ -11,10 +11,10 @@ from pydantic import AnyUrl
from typing_extensions import override
import fastmcp
from fastmcp.resources.resource import ResourceResult
from fastmcp.resources.base import ResourceResult
from fastmcp.server.context import Context
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
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
if TYPE_CHECKING:
from fastmcp.prompts.prompt import Prompt
from fastmcp.resources.resource import Resource
from fastmcp.prompts.base import Prompt
from fastmcp.resources.base import Resource
from fastmcp.resources.template import ResourceTemplate
from fastmcp.tools.tool import Tool
from fastmcp.tools.base import Tool
logger = logging.getLogger(__name__)

View file

@ -35,11 +35,11 @@ from typing import TYPE_CHECKING, Literal, cast
from typing_extensions import Self
from fastmcp.prompts.prompt import Prompt
from fastmcp.resources.resource import Resource
from fastmcp.prompts.base import Prompt
from fastmcp.resources.base import Resource
from fastmcp.resources.template import ResourceTemplate
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.components import FastMCPComponent
from fastmcp.utilities.versions import VersionSpec, version_sort_key

View file

@ -19,13 +19,13 @@ from urllib.parse import quote
import mcp.types
from mcp.types import AnyUrl
from fastmcp.prompts.prompt import Prompt, PromptResult
from fastmcp.resources.resource import Resource, ResourceResult
from fastmcp.prompts.base import Prompt, PromptResult
from fastmcp.resources.base import Resource, ResourceResult
from fastmcp.resources.template import ResourceTemplate
from fastmcp.server.providers.base import Provider
from fastmcp.server.tasks.config import TaskMeta
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.versions import VersionSpec

View file

@ -31,12 +31,12 @@ import asyncio
from collections.abc import Sequence
from pathlib import Path
from fastmcp.prompts.prompt import Prompt
from fastmcp.resources.resource import Resource
from fastmcp.prompts.base import Prompt
from fastmcp.resources.base import Resource
from fastmcp.resources.template import ResourceTemplate
from fastmcp.server.providers.filesystem_discovery import discover_and_import
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.logging import get_logger
from fastmcp.utilities.versions import VersionSpec

View file

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

View file

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

View file

@ -14,8 +14,8 @@ import mcp.types
from mcp.types import Annotations, AnyFunction
import fastmcp
from fastmcp.resources.base import 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.server.auth.authorization import AuthCheck
from fastmcp.server.tasks.config import TaskConfig

View file

@ -29,8 +29,8 @@ from mcp.types import AnyFunction, ToolAnnotations
import fastmcp
from fastmcp.server.auth.authorization import AuthCheck
from fastmcp.server.tasks.config import TaskConfig
from fastmcp.tools.base import Tool
from fastmcp.tools.function_tool import FunctionTool
from fastmcp.tools.tool import Tool
from fastmcp.utilities.types import NotSet, NotSetT
try:
@ -43,7 +43,7 @@ except ImportError:
if TYPE_CHECKING:
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])

View file

@ -27,8 +27,8 @@ from __future__ import annotations
from collections.abc import Sequence
from typing import Literal, TypeVar
from fastmcp.prompts.prompt import Prompt
from fastmcp.resources.resource import Resource
from fastmcp.prompts.base import Prompt
from fastmcp.resources.base import Resource
from fastmcp.resources.template import ResourceTemplate
from fastmcp.server.providers.base import Provider
from fastmcp.server.providers.local_provider.decorators import (
@ -36,7 +36,7 @@ from fastmcp.server.providers.local_provider.decorators import (
ResourceDecoratorMixin,
ToolDecoratorMixin,
)
from fastmcp.tools.tool import Tool
from fastmcp.tools.base import Tool
from fastmcp.utilities.components import FastMCPComponent
from fastmcp.utilities.logging import get_logger
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.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.openapi import HTTPRoute
from fastmcp.utilities.openapi.director import RequestDirector

View file

@ -28,7 +28,7 @@ from fastmcp.server.providers.openapi.routing import (
RouteMapFn,
_determine_route_type,
)
from fastmcp.tools.tool import Tool
from fastmcp.tools.base import Tool
from fastmcp.utilities.components import FastMCPComponent
from fastmcp.utilities.logging import get_logger
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.mcp_config import MCPConfig
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.resource import ResourceContent, ResourceResult
from fastmcp.resources.base import ResourceContent, ResourceResult
from fastmcp.server.context import Context
from fastmcp.server.dependencies import get_context
from fastmcp.server.providers.base import Provider
from fastmcp.server.server import FastMCP
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.logging import get_logger
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 typing import Literal
from fastmcp.resources.resource import Resource
from fastmcp.resources.base import Resource
from fastmcp.resources.template import ResourceTemplate
from fastmcp.server.providers.aggregate import AggregateProvider
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 fastmcp.resources.resource import Resource, ResourceResult
from fastmcp.resources.base import Resource, ResourceResult
from fastmcp.resources.template import ResourceTemplate
from fastmcp.server.providers.base import Provider
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
if TYPE_CHECKING:
from fastmcp.prompts.prompt import Prompt
from fastmcp.resources.resource import Resource
from fastmcp.prompts.base import Prompt
from fastmcp.resources.base import Resource
from fastmcp.resources.template import ResourceTemplate
from fastmcp.server.transforms import Transform
from fastmcp.tools.tool import Tool
from fastmcp.tools.base import Tool
from fastmcp.utilities.components import FastMCPComponent
@ -96,10 +96,10 @@ class _WrappedProvider(Provider):
async def get_tasks(self) -> Sequence[FastMCPComponent]:
"""Delegate to inner's get_tasks and apply wrapper's transforms."""
# Import here to avoid circular imports
from fastmcp.prompts.prompt import Prompt
from fastmcp.resources.resource import Resource
from fastmcp.prompts.base import Prompt
from fastmcp.resources.base import Resource
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)
components = list(await self._inner.get_tasks())

View file

@ -13,9 +13,9 @@ from pydantic import ConfigDict
from fastmcp.exceptions import AuthorizationError
from fastmcp.server.auth.authorization import AuthContext, run_auth_checks
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_tool import FunctionTool
from fastmcp.tools.tool import ToolResult
from fastmcp.tools.tool_transform import TransformedTool
from fastmcp.utilities.types import FastMCPBaseModel

View file

@ -52,9 +52,9 @@ from fastmcp.exceptions import (
)
from fastmcp.mcp_config import MCPConfig
from fastmcp.prompts import Prompt
from fastmcp.prompts.base import PromptResult
from fastmcp.prompts.function_prompt import FunctionPrompt
from fastmcp.prompts.prompt import PromptResult
from fastmcp.resources.resource import Resource, ResourceResult
from fastmcp.resources.base import Resource, ResourceResult
from fastmcp.resources.template import ResourceTemplate
from fastmcp.server.apps import (
AppConfig,
@ -76,8 +76,8 @@ from fastmcp.server.transforms import (
)
from fastmcp.server.transforms.visibility import apply_session_transforms, is_enabled
from fastmcp.settings import DuplicateBehavior as DuplicateBehaviorSetting
from fastmcp.tools.base import Tool, ToolResult
from fastmcp.tools.function_tool import FunctionTool
from fastmcp.tools.tool import Tool, ToolResult
from fastmcp.tools.tool_transform import ToolTransformConfig
from fastmcp.utilities.components import FastMCPComponent, _coerce_version
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
if TYPE_CHECKING:
from fastmcp.prompts.prompt import Prompt
from fastmcp.resources.resource import Resource
from fastmcp.prompts.base import Prompt
from fastmcp.resources.base import Resource
from fastmcp.resources.template import ResourceTemplate
from fastmcp.tools.tool import Tool
from fastmcp.tools.base import Tool
logger = get_logger(__name__)

View file

@ -25,12 +25,12 @@ from mcp.types import (
import fastmcp.server.context
from fastmcp.exceptions import NotFoundError
from fastmcp.prompts.prompt import Prompt
from fastmcp.resources.resource import Resource
from fastmcp.prompts.base import Prompt
from fastmcp.resources.base import Resource
from fastmcp.resources.template import ResourceTemplate
from fastmcp.server.tasks.config import DEFAULT_POLL_INTERVAL_MS, DEFAULT_TTL_MS
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
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
if TYPE_CHECKING:
from fastmcp.prompts.prompt import Prompt
from fastmcp.resources.resource import Resource
from fastmcp.prompts.base import Prompt
from fastmcp.resources.base import Resource
from fastmcp.resources.template import ResourceTemplate
from fastmcp.tools.tool import Tool
from fastmcp.tools.base import Tool
TaskType = Literal["tool", "resource", "template", "prompt"]

View file

@ -26,10 +26,10 @@ from typing import TYPE_CHECKING, Protocol
from fastmcp.utilities.versions import VersionSpec
if TYPE_CHECKING:
from fastmcp.prompts.prompt import Prompt
from fastmcp.resources.resource import Resource
from fastmcp.prompts.base import Prompt
from fastmcp.resources.base import Resource
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

View file

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

View file

@ -16,10 +16,10 @@ from fastmcp.server.transforms import (
from fastmcp.utilities.versions import VersionSpec
if TYPE_CHECKING:
from fastmcp.prompts.prompt import Prompt
from fastmcp.resources.resource import Resource
from fastmcp.prompts.base import Prompt
from fastmcp.resources.base import Resource
from fastmcp.resources.template import ResourceTemplate
from fastmcp.tools.tool import Tool
from fastmcp.tools.base import Tool
# Pattern for matching URIs: protocol://path
_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.transforms import GetToolNext, Transform
from fastmcp.tools.tool import Tool
from fastmcp.tools.base import Tool
from fastmcp.utilities.versions import VersionSpec
if TYPE_CHECKING:

View file

@ -29,7 +29,7 @@ from mcp.types import ToolAnnotations
from fastmcp.server.dependencies import get_context
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
_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.transforms import GetToolNext
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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,7 +1,15 @@
import sys
from .function_tool import FunctionTool, tool
from .tool import Tool, ToolResult
from .base import Tool, ToolResult
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__ = [
"FunctionTool",
"Tool",

View file

@ -17,7 +17,7 @@ from fastmcp.server.dependencies import (
transform_context_annotations,
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.logging import get_logger
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.dependencies import without_injected_parameters
from fastmcp.server.tasks.config import TaskConfig
from fastmcp.tools.function_parsing import ParsedFunction, _is_object_schema
from fastmcp.tools.tool import (
from fastmcp.tools.base import (
Tool,
ToolResult,
ToolResultSerializerType,
)
from fastmcp.tools.function_parsing import ParsedFunction, _is_object_schema
from fastmcp.utilities.async_utils import (
call_sync_fn_in_threadpool,
is_coroutine_function,

View file

@ -16,8 +16,8 @@ from pydantic.functional_validators import BeforeValidator
from pydantic.json_schema import SkipJsonSchema
import fastmcp
from fastmcp.tools.base import Tool, ToolResult, _convert_to_content
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.json_schema import compress_schema
from fastmcp.utilities.logging import get_logger

View file

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

View file

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

View file

@ -13,7 +13,7 @@ class TestDeprecatedFunctionToolImports:
with pytest.warns(
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
from fastmcp.tools.function_tool import (
@ -27,7 +27,7 @@ class TestDeprecatedFunctionToolImports:
with pytest.warns(
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 (
ParsedFunction as CanonicalParsedFunction,
@ -40,7 +40,7 @@ class TestDeprecatedFunctionToolImports:
with pytest.warns(
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
@ -50,7 +50,7 @@ class TestDeprecatedFunctionToolImports:
with temporary_settings(deprecation_warnings=False):
with warnings.catch_warnings():
warnings.simplefilter("error")
from fastmcp.tools.tool import FunctionTool # noqa: F401
from fastmcp.tools.base import FunctionTool # noqa: F401
class TestDeprecatedFunctionResourceImports:
@ -60,7 +60,7 @@ class TestDeprecatedFunctionResourceImports:
DeprecationWarning,
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 (
FunctionResource as CanonicalFunctionResource,
@ -74,7 +74,7 @@ class TestDeprecatedFunctionResourceImports:
DeprecationWarning,
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 (
resource as canonical_resource,
@ -86,7 +86,7 @@ class TestDeprecatedFunctionResourceImports:
with temporary_settings(deprecation_warnings=False):
with warnings.catch_warnings():
warnings.simplefilter("error")
from fastmcp.resources.resource import FunctionResource # noqa: F401
from fastmcp.resources.base import FunctionResource # noqa: F401
class TestDeprecatedFunctionPromptImports:
@ -95,7 +95,7 @@ class TestDeprecatedFunctionPromptImports:
with pytest.warns(
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 (
FunctionPrompt as CanonicalFunctionPrompt,
@ -108,7 +108,7 @@ class TestDeprecatedFunctionPromptImports:
with pytest.warns(
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
@ -118,4 +118,4 @@ class TestDeprecatedFunctionPromptImports:
with temporary_settings(deprecation_warnings=False):
with warnings.catch_warnings():
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.server.server import FastMCP
from fastmcp.tools.base import Tool
from fastmcp.tools.function_tool import FunctionTool
from fastmcp.tools.tool import Tool
from tests.conftest import get_fn_name

View file

@ -13,7 +13,7 @@ from mcp.types import TextContent
from fastmcp import FastMCP
from fastmcp.contrib.mcp_mixin import mcp_tool
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.utilities.tests import temporary_settings

View file

@ -16,7 +16,7 @@ from fastmcp.experimental.transforms.code_mode import (
_ensure_async,
)
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:

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -27,9 +27,9 @@ from pydantic import AnyUrl, BaseModel
from fastmcp import Context, FastMCP
from fastmcp.client.client import CallToolResult, Client
from fastmcp.client.transports import FastMCPTransport
from fastmcp.prompts.base import Message, Prompt
from fastmcp.prompts.function_prompt import FunctionPrompt
from fastmcp.prompts.prompt import Message, Prompt
from fastmcp.resources.resource import Resource
from fastmcp.resources.base import Resource
from fastmcp.server.middleware.caching import (
CachableToolResult,
CallToolSettings,
@ -40,7 +40,7 @@ from fastmcp.server.middleware.caching import (
_make_read_resource_cache_key,
)
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")

View file

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

View file

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

View file

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

View file

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

View file

@ -13,8 +13,8 @@ from fastmcp.client.transports import FastMCPTransport
from fastmcp.server.middleware.tool_injection import (
ToolInjectionMiddleware,
)
from fastmcp.tools.base import Tool
from fastmcp.tools.function_tool import FunctionTool
from fastmcp.tools.tool import Tool
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.client import Client
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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -15,10 +15,10 @@ import pytest
from fastmcp import FastMCP
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.tasks import TaskConfig
from fastmcp.tools.tool import Tool, ToolResult
from fastmcp.tools.base import Tool, ToolResult
class TestLocalProviderStorage:

View file

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

View file

@ -13,7 +13,7 @@ import pytest
from fastmcp import FastMCP
from fastmcp.client import Client
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

View file

@ -10,7 +10,7 @@ from mcp.shared.exceptions import McpError
from fastmcp import FastMCP
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.server.tasks.config import TaskMeta

View file

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

View file

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

View file

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

View file

@ -7,13 +7,13 @@ import pytest
from mcp.types import AnyUrl, TextContent
from fastmcp import FastMCP
from fastmcp.prompts.base import Prompt
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.resource import Resource
from fastmcp.resources.template import FunctionResourceTemplate, ResourceTemplate
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

View file

@ -10,7 +10,7 @@ from mcp.types import TextContent, TextResourceContents
from fastmcp import Client, FastMCP
from fastmcp.server.providers import LocalProvider
from fastmcp.tools import FunctionTool
from fastmcp.tools.tool import Tool
from fastmcp.tools.base import Tool
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 fastmcp import Client, FastMCP
from fastmcp.tools.tool import Tool
from fastmcp.tools.base import Tool
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.catalog import CatalogTransform
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
# ---------------------------------------------------------------------------

View file

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

View file

@ -3,7 +3,7 @@
import pytest
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

View file

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

View file

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

View file

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

View file

@ -36,7 +36,7 @@ from fastmcp.mcp_config import (
StdioMCPServer,
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
# 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.client import Client
from fastmcp.tools.tool import ToolResult
from fastmcp.tools.base import ToolResult
from fastmcp.utilities.types import Image
fastmcp_server = FastMCP()

View file

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

View file

@ -13,7 +13,7 @@ from mcp.types import (
)
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

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