FastMCP
server class. This class acts as the main container for your application’s tools, resources, and prompts, and manages communication with MCP clients.
Creating a Server
Instantiating a server is straightforward. You typically provide a name for your server, which helps identify it in client applications or logs.FastMCP
constructor accepts several arguments:
FastMCP Constructor Parameters
A human-readable name for your server
Description of how to interact with this server. These instructions help clients understand the server’s purpose and available functionality
Authentication provider for securing HTTP-based transports. See Authentication for configuration options
An async context manager function for server startup and shutdown logic
A list of tools (or functions to convert to tools) to add to the server. In some cases, providing tools programmatically may be more convenient than using the
@mcp.tool
decoratorOnly expose components with at least one matching tag
Hide components with any matching tag
How to handle duplicate tool registrations
How to handle duplicate resource registrations
How to handle duplicate prompt registrations
New in version: 2.11.0
Whether to include FastMCP metadata in component responses. When True
, component tags and other FastMCP-specific metadata are included in the _fastmcp
namespace within each component’s meta
field. When False
, this metadata is omitted, resulting in cleaner integration with external systems. Can be overridden globally via FASTMCP_INCLUDE_FASTMCP_META
environment variableComponents
FastMCP servers expose several types of components to the client:Tools
Tools are functions that the client can call to perform actions or access external systems.Resources
Resources expose data sources that the client can read.Resource Templates
Resource templates are parameterized resources that allow the client to request specific data.Prompts
Prompts are reusable message templates for guiding the LLM.Tag-Based Filtering
New in version: 2.8.0
FastMCP supports tag-based filtering to selectively expose components based on configurable include/exclude tag sets. This is useful for creating different views of your server for different environments or users.
Components can be tagged when defined using the tags
parameter:
- Include tags: If specified, only components with at least one matching tag are exposed
- Exclude tags: Components with any matching tag are filtered out
- Precedence: Exclude tags always take priority over include tags
To ensure a component is never exposed, you can set
enabled=False
on the component itself. To learn more, see the component-specific documentation.Running the Server
FastMCP servers need a transport mechanism to communicate with clients. You typically start your server by calling themcp.run()
method on your FastMCP
instance, often within an if __name__ == "__main__":
block in your main server script. This pattern ensures compatibility with various MCP clients.
- STDIO (default, for local tools)
- HTTP (recommended for web services, uses Streamable HTTP protocol)
- SSE (legacy web transport, deprecated)
Custom Routes
When running your server with HTTP transport, you can add custom web routes alongside your MCP endpoint using the@custom_route
decorator. This is useful for simple endpoints like health checks that need to be served alongside your MCP server:
- Health check endpoints for monitoring
- Simple status or info endpoints
- Basic webhooks or callbacks
Composing Servers
New in version: 2.2.0
FastMCP supports composing multiple servers together using import_server
(static copy) and mount
(live link). This allows you to organize large applications into modular components or reuse existing servers.
See the Server Composition guide for full details, best practices, and examples.
Proxying Servers
New in version: 2.0.0
FastMCP can act as a proxy for any MCP server (local or remote) using FastMCP.as_proxy
, letting you bridge transports or add a frontend to existing servers. For example, you can expose a remote SSE server locally via stdio, or vice versa.
Proxies automatically handle concurrent operations safely by creating fresh sessions for each request when using disconnected clients.
See the Proxying Servers guide for details and advanced usage.
OpenAPI Integration
New in version: 2.0.0
FastMCP can automatically generate servers from OpenAPI specifications or existing FastAPI applications using FastMCP.from_openapi()
and FastMCP.from_fastapi()
. This allows you to instantly convert existing APIs into MCP servers without manual tool creation.
See the FastAPI Integration and OpenAPI Integration guides for detailed examples and configuration options.
Server Configuration
Servers can be configured using a combination of initialization arguments, global settings, and transport-specific settings.Server-Specific Configuration
Server-specific settings are passed when creating theFastMCP
instance and control server behavior:
Global Settings
Global settings affect all FastMCP servers and can be configured via environment variables (prefixed withFASTMCP_
) or in a .env
file:
log_level
: Logging level (“DEBUG”, “INFO”, “WARNING”, “ERROR”, “CRITICAL”), set withFASTMCP_LOG_LEVEL
mask_error_details
: Whether to hide detailed error information from clients, set withFASTMCP_MASK_ERROR_DETAILS
resource_prefix_format
: How to format resource prefixes (“path” or “protocol”), set withFASTMCP_RESOURCE_PREFIX_FORMAT
include_fastmcp_meta
: Whether to include FastMCP metadata in component responses (default: True), set withFASTMCP_INCLUDE_FASTMCP_META
Transport-Specific Configuration
Transport settings are provided when running the server and control network behavior:Setting Global Configuration
Global FastMCP settings can be configured via environment variables (prefixed withFASTMCP_
):
Custom Tool Serialization
New in version: 2.2.7
By default, FastMCP serializes tool return values to JSON when they need to be converted to text. You can customize this behavior by providing a tool_serializer
function when creating your server:
- Format data in a specific way (like YAML or custom formats)
- Control specific serialization options (like indentation or sorting)
- Add metadata or transform data before sending it to clients
If the serializer function raises an exception, the tool will fall back to the default JSON serialization to avoid breaking the server.