- 
                Notifications
    You must be signed in to change notification settings 
- Fork 2.7k
Closed
Description
There appears to be no clear cut way to add an input_schema into a tool when declaring an MCP server using the FastMCP initiator.
the tool decorator within the FastMCP class has no way to initialize an input schema.
      def tool(
          self, name: str | None = None, description: str | None = None
      ) -> Callable[[AnyFunction], AnyFunction]:
        # Check if user passed function directly instead of calling decorator
        if callable(name):
            raise TypeError(
                "The @tool decorator was used incorrectly. "
                "Did you forget to call it? Use @tool() instead of @tool"
            )
        def decorator(fn: AnyFunction) -> AnyFunction:
            self.add_tool(fn, name=name, description=description)
            return fn
        return decorator
while the tool object its self has a input schema attribute
class Tool(BaseModel):
    name: str
    """The name of the tool."""
    description: str | None = None
    """A human-readable description of the tool."""
    inputSchema: dict[str, Any]
    """A JSON Schema object defining the expected parameters for the tool."""
    model_config = ConfigDict(extra="allow")
the tool manager within fastMCP also has no way of inputting a schema when using add_tool
  class ToolManager:
    def __init__(self, warn_on_duplicate_tools: bool = True):
        self._tools: dict[str, Tool] = {}
        self.warn_on_duplicate_tools = warn_on_duplicate_tools
    def get_tool(self, name: str) -> Tool | None:
        """Get tool by name."""
        return self._tools.get(name)
    def list_tools(self) -> list[Tool]:
        """List all registered tools."""
        return list(self._tools.values())
    def add_tool(
        self,
        fn: Callable,
        name: str | None = None,
        description: str | None = None,
    ) -> Tool:
        """Add a tool to the server."""
        tool = Tool.from_function(fn, name=name, description=description)
        existing = self._tools.get(tool.name)
        if existing:
            if self.warn_on_duplicate_tools:
                logger.warning(f"Tool already exists: {tool.name}")
            return existing
        self._tools[tool.name] = tool
        return tool
    async def call_tool(
        self,
        name: str,
        arguments: dict[str, Any],
        context: Context[ServerSessionT, LifespanContextT] | None = None,
    ) -> Any:
        """Call a tool by name with arguments."""
        tool = self.get_tool(name)
        if not tool:
            raise ToolError(f"Unknown tool: {name}")
        return await tool.run(arguments, context=context)
would it be possible to input the schema within the tool decorator so it would look something like this
@mcp.tool(input_schema=(json string of schema))
def check_availability(state: str, token: str, user: str, timeZone: str = None) -> str:
   #rest of the code
Difocd
Metadata
Metadata
Assignees
Labels
No labels