fast-mcp
Enables exposing FastAPI endpoints as MCP tools via route reflection, converting Pydantic models, docstrings, and parameters into MCP tool schemas, and supporting dependency injection and authentication bridging.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@fast-mcpwhat's the status of order 12345?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
fast-mcp
FastAPI-native Model Context Protocol (MCP) framework with automatic route reflection, ASGI scope bridging, dynamic progressive tool discovery, resilient error recovery, and interactive in-chat MCP Apps (SEP-1865).
Highlights
โก Hybrid Dual-Citizen ASGI Mount: Mounts directly onto any existing
FastAPIinstance in-process over standard ASGIโzero external proxying, zero hanging subprocesses.๐ Local stdio CLI Runner & Desktop AI Bridge: Run
fast-mcp stdio main:apporpython -m fast_mcp stdio main:appto connect desktop AI clients (Claude Desktop, Cursor) over standard I/O pipes with zero network setup.๐ Route Reflection: Opt-in tags (
tags=["mcp"]) automatically convert FastAPI endpoints, Pydantic models, docstrings, path/query/body parameters into MCP tools.๐ ๏ธ Custom AI Tools (
@mcp.tool): Define AI-tailored composite tools alongside reflected routes with automatic schema and docstring extraction.๐ ASGI Scope Bridging: Client authorization headers (
Authorization: Bearer <token>, cookies, API keys) captured during the MCP handshake are bridged into an in-memory ASGIRequest, natively resolving FastAPI'sDepends()andSecurity()providers without code changes.๐ง Dynamic Progressive Tool Discovery: Protect agent context windows via progressive discovery (
dynamic_discovery=True), thesearch_tools(query: str)meta-tool, and zero-dependencyKeywordTagRouter.๐ก๏ธ Resilient Error Recovery & Minified JSON: Traps route
HTTPExceptionand Pydantic validation errors into informativeCallToolResult(isError=True)responses so LLMs can self-correct without protocol failures. Output defaults to compact, token-conscious minified JSON with custom@mcp.serializerformatting hooks.๐ฅ๏ธ Dual UI & In-Chat MCP Apps (SEP-1865): Embedded browser inspector at
/mcp/docsplus native support for in-chat interactive iframes in desktop AI clients (Claude Desktop, Cursor, VS Code) via_meta.ui.resourceUri, the built-ininspect()tool, and the@mcp.app()decorator.
Related MCP server: FastAPI-MCP
Installation
pip install mcp-fastapiOr using uv:
uv add mcp-fastapiQuickstart
from fastapi import FastAPI, Depends, Header, HTTPException
from pydantic import BaseModel, Field
from fast_mcp import FastMCP
app = FastAPI(title="Store API")
mcp = FastMCP(app=app, name="store-mcp")
# 1. Existing FastAPI route reflected automatically via tags=["mcp"]
class Product(BaseModel):
id: int
name: str
price: float
@app.get("/products/{product_id}", tags=["mcp"])
async def get_product(product_id: int) -> Product:
"""Fetch product details by ID."""
if product_id == 404:
raise HTTPException(status_code=404, detail="Product not found")
return Product(id=product_id, name="Smart Widget", price=29.99)
# 2. Custom AI tool with native dependency injection
def verify_token(authorization: str = Header(...)) -> str:
if not authorization.startswith("Bearer "):
raise HTTPException(status_code=401, detail="Invalid token")
return authorization.split(" ")[1]
@mcp.tool(name="order_status", description="Check customer order status")
def check_order(order_id: str, user: str = Depends(verify_token)) -> dict:
return {"order_id": order_id, "customer": user, "status": "Shipped"}
# 3. Mount MCP endpoints (/mcp/sse, /mcp/messages, /mcp/docs)
mcp.mount()Run with standard ASGI servers:
uvicorn main:app --reloadCore Capabilities
1. Route Reflection
Routes tagged with tags=["mcp"] (configurable via route_tag) are automatically inspected upon mcp.mount():
Endpoint docstrings (Google, Sphinx, NumPy format) become tool descriptions and parameter docs.
Pydantic request models, query parameters, and path variables become MCP input schemas.
Untagged endpoints remain standard HTTP routes and are never leaked to LLMs.
@app.post("/items/create", tags=["mcp"])
async def create_item(item: ItemModel) -> ItemModel:
"""Create a new catalog item.
Args:
item: The catalog item specification.
"""
return item2. Custom AI Tools (@mcp.tool)
Register AI-specialized tools that don't need dedicated REST endpoints:
# Bare decorator
@mcp.tool
def calculate_quote(quantity: int, discount: float = 0.0) -> float:
return quantity * 100.0 * (1.0 - discount)
# Parameterized decorator
@mcp.tool(name="inventory_lookup", description="Lookup stock levels", tags=["inventory"])
async def check_inventory(sku: str) -> dict:
return {"sku": sku, "in_stock": True, "count": 42}3. ASGI Scope Bridging & Native Auth
Incoming headers (Authorization: Bearer ..., cookies, API keys) from the MCP client's SSE handshake or message posts are captured into an active request context:
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
security = HTTPBearer()
@mcp.tool
async def user_profile(creds: HTTPAuthorizationCredentials = Depends(security)) -> dict:
token = creds.credentials
return {"user": "alice", "token_verified": True}If authorization fails or headers are omitted, fast-mcp unwraps the resulting HTTPException(401) into CallToolResult(is_error=True) so the agent receives an actionable authentication error rather than crashing the transport.
4. Dynamic Progressive Tool Discovery
Prevent LLM context window bloat on large FastAPI applications with hundreds of endpoints:
mcp = FastMCP(
app=app,
dynamic_discovery=True, # Or set dynamic_discovery_threshold=20
baseline_tools=["search_tools", "get_system_status"],
baseline_tag="baseline",
)When active,
tools/listexposes only baseline tools plus thesearch_tools(query: str)meta-tool.Calling
search_tools(query="invoice")executes the pluggableToolRouter(defaults to zero-dependencyKeywordTagRouterwith tokenized name/tag/description ranking) and returns matching tool definitions with full JSON schemas.
5. Resilient Error Interception & Custom Serializers
Exception Traps:
HTTPException(400, 404, 422) and Pydantic validation errors return clean, concise messages withisError=True.Minified Output: Responses serialize to compact minified JSON (
{"id":1,"name":"widget"}) saving prompt tokens.Custom Serializers: Format return types into tailored markdown or summaries:
class Report(BaseModel):
title: str
metrics: dict[str, int]
@mcp.serializer(Report)
def format_report(report: Report) -> str:
md = f"### {report.title}\n"
for k, v in report.metrics.items():
md += f"- **{k}**: {v}\n"
return md6. Dual UI: Browser Inspector & In-Chat MCP Apps (SEP-1865)
Embedded Browser Inspector
Open http://localhost:8000/mcp/docs in any browser to inspect registered tools, view schemas, and execute test invocations interactively without external Node.js CLIs. (Disable with FastMCP(app, enable_ui=False)).
In-Chat MCP Apps (SEP-1865)
Render rich interactive HTML/JS widgets directly in modern desktop AI clients (Claude Desktop, Cursor, VS Code):
# Built-in server inspector tool
# Agent calling `inspect()` receives an interactive iframe pointed to ui://fast-mcp/inspector
# Authoring custom in-chat widgets:
@mcp.app(
name="dashboard",
resource_uri="ui://store/dashboard",
html="""
<div style="font-family: sans-serif; padding: 1rem; border-radius: 8px; background: #f0f4f8;">
<h2>Store Live Metrics</h2>
<p>Active Users: <strong>1,420</strong></p>
</div>
"""
)
def live_dashboard() -> str:
return '<iframe src="ui://store/dashboard" width="100%" height="400"></iframe>'7. Local stdio CLI Runner & Desktop AI Bridge
Connect desktop AI clients (Claude Desktop, Cursor) directly to your FastAPI backend or FastMCP instance over standard input/output (stdio) pipes with zero network setup, port conflicts, or external proxying.
Command-Line Usage
# Run stdio runner pointing to FastAPI app or FastMCP instance
fast-mcp stdio main:app
# Or via Python module invocation
python -m fast_mcp stdio main:app
# Target attribute defaults to 'app' or 'mcp' if omitted:
fast-mcp stdio main
# The 'stdio' subcommand can also be omitted as default:
fast-mcp main:appClaude Desktop Configuration (claude_desktop_config.json)
Configure Claude Desktop to launch your FastMCP server directly:
{
"mcpServers": {
"my-fast-mcp-app": {
"command": "fast-mcp",
"args": ["stdio", "main:app"]
}
}
}Or using uv to manage the virtual environment automatically:
{
"mcpServers": {
"my-fast-mcp-app": {
"command": "uv",
"args": ["run", "fast-mcp", "stdio", "main:app"]
}
}
}Programmatic Stdio Runner
You can also run stdio mode programmatically from Python:
import asyncio
from fast_mcp import FastMCP, run_stdio
mcp = FastMCP(name="my-stdio-server")
@mcp.tool()
def add(a: int, b: int) -> int:
return a + b
if __name__ == "__main__":
asyncio.run(run_stdio(mcp))Testing & Verification
fast-mcp exercises external behavior across the ASGI Protocol Seam using httpx.AsyncClient with ASGITransport:
# Run full test suite
pytest
# Run tests with coverage
pytest --cov=fast_mcp --cov-report=term-missingSpecification & Architectural Documents
License
MIT
This server cannot be deployed
Maintenance
Related MCP Connectors
Give any MCP-compatible AI assistant a builder for live, hosted web tools and workflows.
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
The OpenRouter for tools. One MCP connection gives any AI agent 254 hosted tools, pay per call.
Nifty's MCP server โ exposes tasks, projects, messages, and files as tools for AI agents.
Related MCP Servers
- FlicenseNot gradedqualityNot gradedmaintenanceAuto-converts FastAPI endpoints into MCP tools for semantic search, data ingestion (text, code, conversations), and knowledge graph operations. Provides dual access through MCP protocol and direct API calls with automatic tool generation from FastAPI routes.-
- AlicenseNot gradedqualityDmaintenanceExposes FastAPI endpoints as Model Context Protocol (MCP) tools while preserving existing authentication, schemas, and documentation. It enables seamless integration of FastAPI services into MCP ecosystems using a native ASGI transport layer.MIT
- AlicenseNot gradedqualityCmaintenanceEnables building agent-ready APIs that expose tools as both HTTP and MCP endpoints from a single server definition, with automatic OpenAPI, discovery docs, and interactive API reference.5Apache 2.0
- AlicenseNot gradedqualityDmaintenanceAutomatically converts Python web backends (FastAPI, Flask, Django) into MCP servers by exposing API routes as MCP tools with near-zero boilerplate.MIT