FastMCP 3.0 is stable and generally available.
pip install fastmcp -UIt’s been about a month since the first beta. We shipped two betas and two release candidates, landed code from 21 new contributors, and saw over 100,000 opt-in pre-release installs — extraordinary for a beta that requires explicit version pinning. We wrote three complete upgrade guides and an LLM migration prompt you can paste into your coding assistant to automate the transition. The architecture held up. The upgrade path is smooth. We’re ready.
This is also the release where FastMCP moves from jlowin/fastmcp to PrefectHQ/fastmcp. When I built this over a weekend in late 2024, it lived under my personal account because it was a side project. That stopped being accurate a long time ago. FastMCP has the full engineering support of the Prefect team and is a core pillar of our Horizon platform. Special thanks to Bill Easton, FastMCP’s first external maintainer, whose fingerprints are all over the transform architecture that makes 3.0 tick. For you, nothing changes — GitHub forwards all links, PyPI is the same, imports are the same. A major version felt like the right moment to make the move official.
We also built three separate upgrade guides, because people are coming from different places: from FastMCP 2, from the MCP SDK, and from the low-level SDK. All three include a copyable LLM prompt to help you automate your migration. Early feedback from the community suggests most upgrades are straightforward, and for many users it should just work.
What’s New
This is, by a wide margin, the largest release in FastMCP’s history. Several of the features below could have shipped as standalone packages. They didn’t, because they all flow from a single architectural redesign that makes FastMCP ready for the next generation of MCP.
The surface API is largely unchanged — @mcp.tool() still works exactly as before. What changed is everything underneath. So much effort went into making FastMCP 3 extensible, observable, debuggable, and performant that if we did our jobs right, you’ll barely notice the architecture. You’ll just notice that everything works better and a lot more is possible.
Here’s what you can do now.
Build servers from anything
Your components no longer have to live in one file with one server. Point a FileSystemProvider at a directory and it discovers your tools automatically, with hot reload. Wrap a REST API with OpenAPIProvider. Proxy a remote MCP server. Deliver agent skills as MCP resources. Write your own provider for whatever source makes sense. Compose multiple providers into one server, share one across many, or chain them with transforms that rename, namespace, filter, version, and secure components as they flow to clients. ResourcesAsTools and PromptsAsTools expose non-tool components to tool-only clients.
Use FastMCP as a CLI
FastMCP is now a developer tool, not just a framework. fastmcp list and fastmcp call let you query and invoke tools on any MCP server from your terminal — remote URLs, local files, stdio commands. fastmcp discover scans your editor configs (Claude Desktop, Cursor, Goose, Gemini CLI) and finds all your configured servers by name. fastmcp generate-cli reads a server’s schemas and writes a standalone typed CLI where every tool is a subcommand with flags and help text. fastmcp install registers your server with Claude Desktop, Cursor, or Goose in one command.
Ship to production
Component versioning: serve @tool(version="2.0") alongside older versions from one codebase. Granular authorization on individual components, async auth checks that can hit databases or external services, and server-wide policies via AuthMiddleware. OAuth gets CIMD, Static Client Registration, Azure OBO via dependency injection, JWT audience validation, and confused-deputy protections. Native OpenTelemetry tracing with MCP semantic conventions. Response size limiting. Background tasks via Docket with distributed Redis notification and ctx.elicit() relay. Security fixes include dropping diskcache (CVE-2025-69872) and upgrading python-multipart and protobuf for additional CVEs.
Develop faster
--reload auto-restarts on file changes. Decorated functions stay callable — import them, call them, unit test them like normal Python. Sync tools auto-dispatch to a threadpool so they don’t block the event loop. Tool timeouts. MCP-compliant pagination. Composable lifespans. PingMiddleware for keepalive. Concurrent tool execution when the LLM returns multiple calls in one response.
Adapt per session
Session state persists across requests via ctx.set_state() / ctx.get_state(). ctx.enable_components() and ctx.disable_components() let servers adapt dynamically per client — show admin tools only after authentication, progressively reveal capabilities, or scope access by role. Chain these together and you get playbooks: dynamic MCP-native workflows that guide agents through processes instead of dumping everything into the context window at once.
Build apps (3.1 preview)
Spec-level support for MCP Apps is already in: ui:// resource scheme, typed UI metadata, extension negotiation, and runtime detection. Full apps support — including a Python DSL for building generative UIs without writing JavaScript — lands in 3.1.
For the complete feature guide: Introducing FastMCP 3.0 and Beta 2.
One Honest Disclaimer
We know a lot of people are about to encounter FastMCP 3 for the first time — not because they chose to upgrade, but because they didn’t pin their dependencies. If that’s you, and something breaks: we’re sorry, and the upgrade guides will get you sorted quickly. We did everything we could to minimize breaking changes, but a major version is a major version. If you encounter any bugs, please open an issue.
If you maintain a framework that depends on FastMCP 2.x, please pin your dependency. We want everyone on 3.0 as fast as possible, but we want them there on purpose.
Get Started
pip install fastmcp -U- What’s New in FastMCP 3.0 — the complete feature guide
- Upgrade Guides — from FastMCP 2, the MCP SDK, or the low-level SDK
- GitHub — the new home
- Documentation