list_tools() method discovers what a server offers, and call_tool() executes a tool by name with arguments and returns structured results.
Discovering Tools
list_tools() returns every tool the server advertises as a list of mcp_types.Tool objects, each carrying the tool’s name, description, and JSON input_schema. It follows pagination automatically, so the result is the complete catalog.
notifications/tools/list_changed notification; a fresh list_tools() call reflects the new set. See Notifications for reacting to that notification.
For page-by-page control over large catalogs, list_tools_mcp() returns one raw ListToolsResult at a time and accepts the cursor from the previous page’s next_cursor.
cache_mode argument when the client was built with a response cache.
Basic Execution
weather_get_forecast for a tool named get_forecast on the weather server).
Execution Options
Thecall_tool() method supports timeout control and progress monitoring:
Structured Results
Tool execution returns aCallToolResult object. The .data property provides fully hydrated Python objects including complex types like datetimes and UUIDs, reconstructed from the server’s output schema.
CallToolResult Properties
Any
Fully hydrated Python objects with complex type support (datetimes, UUIDs, custom classes). FastMCP exclusive.
list[mcp_types.ContentBlock]
Standard MCP content blocks (
TextContent, ImageContent, AudioContent, etc.).dict[str, Any] | None
Standard MCP structured JSON data as sent by the server.
bool
Boolean indicating if the tool execution failed.
.data will be None. Fall back to content blocks in that case:
Error Handling
By default,call_tool() raises a ToolError if the tool execution fails:
Sending Metadata
Themeta parameter sends ancillary information alongside tool calls for observability, debugging, or client identification:
Raw Protocol Access
For complete control, usecall_tool_mcp() which returns the raw MCP protocol object:

