FastMCP
High-level framework for building Model Context Protocol servers and clients in Python and TypeScript, providing a simplified, Pythonic interface that handles protocol complexities automatically.
FastMCP
FastMCP is a high-level framework for building Model Context Protocol servers and clients that abstracts away protocol complexities and provides a clean, intuitive API. Originally developed as FastMCP 1.0 and later incorporated into the official MCP Python SDK, FastMCP 2.0 continues as an actively maintained, comprehensive toolkit for MCP development.
Key Features
Feature | Purpose |
---|---|
High-Level API | Decorator-based interface for tools, resources, and prompts |
Multiple Transports | Support for stdio, HTTP, SSE, and in-memory connections |
Client Libraries | Full-featured clients for connecting to any MCP server |
Testing Framework | In-memory testing without external processes |
Production Ready | Authentication, deployment tools, and monitoring |
Python Implementation
FastMCP provides a Pythonic interface for building MCP servers with minimal boilerplate:
Basic Server Example
from fastmcp import FastMCP
# Create server instance
mcp = FastMCP("Demo Server")
@mcp.tool
def add(a: int, b: int) -> int:
"""Add two numbers together."""
return a + b
@mcp.resource("config://settings")
def get_config() -> dict:
"""Get application configuration."""
return {"version": "1.0", "debug": True}
@mcp.resource("user://{user_id}")
def get_user(user_id: str) -> dict:
"""Get user information by ID."""
return {"id": user_id, "name": f"User {user_id}"}
# Run the server
if __name__ == "__main__":
mcp.run() # Default: stdio transport
Client Usage
from fastmcp import Client
async def test_server():
# In-memory testing
async with Client(mcp) as client:
result = await client.call_tool("add", {"a": 5, "b": 3})
print(f"Result: {result.text}")
# Connect to remote server
async with Client("http://localhost:8000/mcp") as client:
tools = await client.list_tools()
resources = await client.list_resources()
Advanced Features
from fastmcp import FastMCP, Context
mcp = FastMCP("Advanced Server")
@mcp.tool
async def process_with_progress(data: str, ctx: Context) -> str:
"""Process data with progress reporting."""
await ctx.report_progress(0.5, "Processing...")
# Simulate work
await ctx.report_progress(1.0, "Complete!")
return f"Processed: {data}"
# Multiple transport support
mcp.run(transport="http", host="0.0.0.0", port=8000)
mcp.run(transport="sse", host="127.0.0.1", port=8001)
TypeScript Implementation
The official MCP TypeScript SDK provides similar high-level abstractions:
Server Example
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
const server = new McpServer({
name: "demo-server",
version: "1.0.0"
});
// Register a tool
server.registerTool(
"add",
{
description: "Add two numbers",
inputSchema: {
a: z.number(),
b: z.number()
}
},
async ({ a, b }) => ({
content: [{
type: "text",
text: String(a + b)
}]
})
);
// Register a resource
server.registerResource(
"config",
"config://settings",
{
description: "Application configuration"
},
async () => ({
contents: [{
uri: "config://settings",
text: JSON.stringify({ version: "1.0", debug: true })
}]
})
);
// Connect and run
const transport = new StdioServerTransport();
await server.connect(transport);
Client Example
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
const transport = new StdioClientTransport({
command: "node",
args: ["server.js"]
});
const client = new Client({
name: "demo-client",
version: "1.0.0"
});
await client.connect(transport);
// List and call tools
const tools = await client.listTools();
const result = await client.callTool({
name: "add",
arguments: { a: 5, b: 3 }
});
Transport Protocols
FastMCP supports multiple transport methods:
STDIO Transport
Best for command-line tools and local development:
# Python
mcp.run(transport="stdio")
// TypeScript
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
const transport = new StdioServerTransport();
HTTP Transport
Ideal for web deployments and remote access:
# Python
mcp.run(transport="http", host="0.0.0.0", port=8000, path="/mcp")
// TypeScript
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
SSE Transport
For Server-Sent Events compatibility:
# Python
mcp.run(transport="sse", host="127.0.0.1", port=8001)
Testing and Development
FastMCP provides powerful testing capabilities:
In-Memory Testing
import pytest
from fastmcp import FastMCP, Client
@pytest.fixture
def mcp_server():
server = FastMCP("TestServer")
@server.tool
def greet(name: str) -> str:
return f"Hello, {name}!"
return server
async def test_tool_functionality(mcp_server):
async with Client(mcp_server) as client:
result = await client.call_tool("greet", {"name": "World"})
assert "Hello, World!" in result.text
Integration Testing
from fastmcp.utilities.tests import run_server_in_process
async def test_http_server():
async with run_server_in_process(mcp, transport="http") as url:
async with Client(url) as client:
tools = await client.list_tools()
assert len(tools) > 0
Advanced Patterns
Server Composition
# Mount multiple servers
weather_server = FastMCP("Weather")
calendar_server = FastMCP("Calendar")
main_server = FastMCP("Main")
main_server.mount(weather_server, prefix="weather")
main_server.mount(calendar_server, prefix="calendar")
Proxy Servers
# Create proxy to remote server
proxy = FastMCP.as_proxy("http://remote-server.com/mcp")
# Add authentication layer
@proxy.middleware
async def add_auth(request, call_next):
request.headers["Authorization"] = "Bearer token"
return await call_next(request)
OpenAPI Integration
from fastapi import FastAPI
app = FastAPI()
# Convert FastAPI to MCP server
mcp_server = FastMCP.from_fastapi(app, name="API Server")
# Or generate from OpenAPI spec
mcp_server = FastMCP.from_openapi("https://api.example.com/openapi.json")
Production Deployment
FastMCP provides production-ready features:
Authentication
from fastmcp.auth import EnvBearerAuthProvider
mcp = FastMCP(
"Secure Server",
auth=EnvBearerAuthProvider() # Uses BEARER_TOKEN env var
)
Monitoring and Logging
import logging
from fastmcp.utilities.logging import get_logger
logger = get_logger(__name__)
@mcp.tool
def monitored_operation(data: str) -> str:
logger.info(f"Processing: {data}")
return f"Processed: {data}"
CLI Tools
# Run server with CLI
fastmcp run server.py:mcp
# With custom transport
fastmcp run server.py:mcp --transport http --port 8000
# Development mode with auto-reload
fastmcp dev server.py:mcp
Comparison with Standard MCP
Aspect | Standard MCP | FastMCP |
---|---|---|
Setup Complexity | Manual protocol handling | Decorator-based |
Boilerplate | Extensive | Minimal |
Testing | External processes | In-memory |
Type Safety | Manual validation | Automatic with Pydantic/Zod |
Development Speed | Slower | Faster |
Production Features | Basic | Comprehensive |
Getting Started
Installation
# Python
pip install fastmcp
# TypeScript
npm install @modelcontextprotocol/sdk
Quick Start
from fastmcp import FastMCP
mcp = FastMCP("My Server")
@mcp.tool
def hello(name: str) -> str:
return f"Hello, {name}!"
if __name__ == "__main__":
mcp.run()
Installation in MCP Clients
Once you've built your FastMCP server, you can easily integrate it with various MCP clients. Here's how to install your server across different development environments:
Common Installation Pattern
Most MCP clients follow a similar configuration pattern. Add your server to the client's configuration file:
{
"mcpServers": {
"my-fastmcp-server": {
"command": "python",
"args": ["/path/to/your/server.py"],
"env": {
"API_KEY": "your-api-key-here"
}
}
}
}
For packaged servers distributed via NPM:
{
"mcpServers": {
"my-fastmcp-server": {
"command": "npx",
"args": ["-y", "@mycompany/my-fastmcp-server"]
}
}
}
FastMCP transforms MCP development from a protocol-focused exercise into an intuitive, high-level programming experience, making it the preferred choice for developers building production MCP applications.