I have a confession to make.
FastMCP 2.0 hides a dark secret. For the last year, we have been scrambling. We were riding the adoption curve of one of the fastest-growing technologies on the planet, trying to keep up with a spec that seemed to change every week.
On the one hand, it worked. FastMCP 1.0 proved the concept so well that Anthropic made it the foundation of the official MCP SDK. FastMCP 2.0 introduced the features necessary to build a real server ecosystem, coinciding with the massive MCP hype wave. The community responded: Today, FastMCP is downloaded a million times a day, and some version of it powers 70% of all MCP servers.
But as someone who cares deeply about framework design, the way v2 evolved was frustrating. It was reactive. We were constantly bolting on new infrastructure to match the present, hacking in new features just to make sure you didnât have to build them yourself.
Over the last year, something shifted. We had enough data, from millions of downloads and countless conversations with teams building real servers, to see the patterns underneath all the ad-hoc features. We could finally see what a âdesignedâ framework would look like.
FastMCP 3.0 is that framework.
It is the platform MCP deserves in 2026, built to be as durable as it is future-proof.
We are moving beyond simple âtool servers.â We are entering the era of Context Applicationsârich, adaptive systems that manage the information flow to agents.
The real challenge was never implementing the protocol. Itâs delivering the right information at the right time. FastMCP 3 is built for that:
- Source components from anywhere.
- Compose and transform them freely.
- Personalize what each user sees.
- Track state across sessions.
- Control access at every level.
- Run long operations in the background.
- Version your APIs.
- Observe everything.
Itâs time to move fast and make things.
đ Get Started
FastMCP 3.0.0 beta 2 is available now.
For a deeper dive into all the new features, read the Whatâs New in FastMCP 3.0 post and the Beta 2 announcement.
The Architecture
FastMCP 2 was a collection of features. FastMCP 3 is a system built on three fundamental primitives. If you understand these, you understand the entire framework.
- Components define the logic.
- Providers source the components.
- Transforms shape the components.
A Component is the atom of MCPâspecifically, a Tool, Resource, or Prompt. While they often wrap Python functions or data sources to define their business logic, the Component itself is the standardized interface that the model interacts with.
A Provider answers the question: âWhere do the components come from?â They can come from Python decorators, a directory of files, an OpenAPI spec, a remote MCP server, or pretty much anything else. In fact, a FastMCP server is itself just a Provider that happens to speak the MCP protocol.
A Transform functions as middleware for Providers. It allows you to modify the behavior of a Provider without touching its code. This decouples the author from the consumer: Person A can source the tools (via a Provider), while Person B adapts them to their specific environment (via a Transform)ârenaming them, adding namespaces to prevent collisions, filtering versions, or applying security rules.
The real power lies in the composition of these primitives.
In v2, âmountingâ a sub-server was a massive, specialized subsystem. In v3 itâs just a Provider (sourcing the components) plus a Transform (adding a namespace prefix).
Proxying a remote server? Thatâs a Provider backed by a FastMCP client.
Hiding developer tools from read-only users? Thatâs a Transform applied to a specific session.
This architecture means features that used to require massive amounts of glue code now fall out naturally from the design. It allows us to ship a massive amount of new functionality without breaking the foundation.
Sourcing Context: Providers
Because the architecture is decoupled, we can now source components from anywhere.
LocalProvider
This workhorse powers the classic FastMCP experience you know and love. You define a function, decorate it with @tool, and it becomes a component. It is simple, explicit, and remains the best way to get started. But what if your tools arenât local?
FileSystemProvider
This is a fundamentally different way to organize MCP servers. Instead of importing a server instance and decorating functions, you point the provider at a directory. It scans the files, finds the components, and builds your interface. With reload=True, it watches those files and updates the server instantly on any change.
SkillsProvider
Skills are having a moment. Claude Code, Cursor, Copilotâthey all learn new capabilities from instruction files. SkillsProvider exposes these as MCP resources, which means any MCP client can discover and download skills from your server. Weâre delivering skills over MCP. Itâs a small example of what happens when âwhere do components come from?â becomes an open question: someone had a weird idea, wrote a provider, and now itâs a capability.
OpenAPIProvider
This feature was so popular in FastMCP 2 that people stopped designing servers and started regurgitating REST APIs, forcing me to write a blog post asking you to stop. But we know: itâs useful. In FastMCP 3, OpenAPI returns as a provider. It is available for responsible use, and when paired with ToolTransforms (to rename and curate the output), it finally becomes a tool for building good context rather than blindly accumulating more of it.
Production Realities
FastMCP 2 was great for scripts. FastMCP 3 is built for systems that need to survive in production.
Component Versioning
This was a massive request. You can now serve multiple versions of a tool side-by-side using the @tool(version="1.0") parameter. FastMCP automatically exposes the highest version to clients, while preserving older versions for legacy compatibility. You can even use a VersionFilter transform to run a âv1 Serverâ and a âv2 Serverâ from the exact same codebase.
Authorization & Security
We introduced OAuth in v2, but v3 gives you granular control. You can attach authorization logic to individual components using the auth parameter. You can also apply AuthMiddleware to gate entire groups of components (e.g., by tag) for defense-in-depth.
Native OpenTelemetry
Observability is no longer an afterthought. FastMCP 3 has native OpenTelemetry instrumentation. Drop in your OTEL configuration, and every tool call, resource read, and prompt render is traced with standardized attributes. You can finally see exactly where your latency is coming from.
Background Tasks
Weâve integrated support for SEP-1686, allowing tools to kick off long-running background tasks via Docket integration. This prevents tool timeouts on heavy workloads while keeping the agent responsive.
Developer Joy
We heard you. You wanted a framework that felt less like a hacked-together library and more like a modern Python toolchain.
- Hot Reload:
fastmcp dev server.pywatches your files and reloads instantly. No more kill-restart cycles. - Callable Functions: In v2, decorators turned your functions into objects. In v3, your functions stay functions. You can import them, call them, and unit test them just like normal Python code.
- Sync that Works: Synchronous tools are now automatically dispatched to a threadpool, meaning a slow calculation wonât block your serverâs event loop.
Playbooks
I want to close by showing you why this architecture actually matters.
A common problem in MCP is âcontext crowding.â If you dump 500 tools into a context window, the model gets confused. You want progressive disclosure: start with a few tools, and reveal more based on the userâs role or the conversation state.
In FastMCP 3, we donât need a special âProgressive Disclosureâ feature1. We just compose the primitives weâve already built:
- Providers to source the hidden tools.
- Visibility to hide them by default.
- Auth to act as the gatekeeper.
- Session State to remember who has unlocked what.
Here is what that looks like. We mount a directory of admin tools, hide them from the world, and then provide a secure, authenticated tool that unlocks them only for the current session.
from fastmcp import FastMCP, Contextfrom fastmcp.server.auth import require_scopesfrom fastmcp.server.providers import FileSystemProvider
mcp = FastMCP("Enterprise Server")
# 1. Source admin tools from a file systemadmin_provider = FileSystemProvider("./admin_tools")mcp.mount(admin_provider)
# 2. Hide them by default using the Visibility systemmcp.disable(tags={"admin"})
# 3. Create a gatekeeper tool with Authorization@mcp.tool(auth=require_scopes("super-user"))async def unlock_admin_mode(ctx: Context): """Unlock administrative tools for this session."""
# 4. Modify Session State to reveal the hidden tools await ctx.enable_components(tags={"admin"})
return "Admin mode unlocked. New tools are available."The agent connects, sees a safe environment, authenticates, and the server evolves to match the new trust level.
This composition creates a new primitive entirely. When you chain these stateful unlocks togetherârevealing context A, which unlocks context Bâyou get what we call playbooks. Playbooks are a way to build dynamic MCP-native workflows. More on them soon!
This is the future of Context Applications. Static lists of API wrappers are being replaced by dynamic systems that actively guide the agent through a process.
The Future
We know that as capabilities grow, context windows get crowded. The hundred tools that make your server powerful are the same hundred tools that overwhelm your agent.
Our next wave of features is focused on context optimization: search transforms, curator agents, and deeper skills integration. The architecture of FastMCP 3 is specifically designed to support these patterns.
Because what you donât show the agent matters just as much as what you do.
Today, organizations with a competitive advantage donât have access to smarter AI. They have access to smarter context. FastMCP 3 is the fastest to build it.
Itâs available in beta today.
Happy (context) engineering!
About This Beta
FastMCP is an extremely widely used framework. While 3.0 introduces almost no breaking changes, we want to make sure that users arenât caught off guard. Therefore, the beta period will last a few weeks to allow for feedback and testing.
Install: pip install fastmcp==3.0.0b2
- Beta 2 Announcement: FastMCP 3.0 Beta 2: The Toolkit
- Upgrade Guide: gofastmcp.com/development/upgrade-guide
- Full Documentation: gofastmcp.com
- GitHub: github.com/jlowin/fastmcp
Footnotes
-
Though of course weâll have an amazing DX for it as patterns emerge. ⤴ď¸
Subscribe
Comments
Join the conversation by posting on social media.
Has MCP already solved the context overflow problem? Like letting the agent decide when to know more about a tool?
It seems like that was the biggest limitation and why devs are switching over to skills instead.
Personally I think devs switched to skills because it's just more convenient to manage local context via files than through MCP. At least, that's why I did! But I'm not sure they're mutually exclusive, just appropriate for different jobs.
To your larger question, I think the protocol has many of the hooks this requires but there could be more (e.g. short and long descriptions), and ultimately many MCP client implementations are just frankly not great. So where we could dream up ways to progressively disclose details, it comes down to whether clients adopt it.
In 3.0 we're experimenting with skills-over-MCP which has been pretty fun.
I was really excited about the SkillsProvider. Serving skills over MCP to a large organization with many repos is very appealing.
Does it actually work though or is it just a proof-of-concept? I tried it with GitHub Copilot in VSCode but it didnât seem to pick up the skill I exposed in my MCP.
IMO it's not mcp or skills. It's MCP and skills.
What you describe is an agent context management problem. Not something inherent in the protocol. Skills are meant to solve this but they can do so while also utilizing mcp tools. The tools they refer can be used to filter and mcp server's entire toolset.
Also skills + cli tools are mostly feasible for coding agents that have something like bash access whereas skills + mcp is available for more locked down agents.
I don't think I agree.
I think in the short term, it will be: 1) Local: Skills, 2) Remote: MCP. But long term skills might replace it all together.
The pattern that will replace MCP is: Skill Prompt + CLI tool
That already works for existing CLI tools. For example Vercels agent-browser with their own skill fully replaces playwright MCP. It's leaps better. Why? Mostly because the agent has more flexibility.
It can learn about the CLI tools by simply doing --help and is not bound to the tool/param selection the user provides.
Based on the blogpost it's possible to enable more Tools during the session to optimize context. As far as I know the MCP Integrations generally work by adding the tool descriptions into the system prompt. But how would the llm discover those new enabled tools during an ongoing chat let's say inside a chat conversation in a jetbrains ide?
How would MCP consumers detect those changes in the tool list and implement the pass through to llms without breaking caching?
MCP-compliant clients support a tool change notification that the server issues to indicate the need for a refresh.
That's a non-technical answer for a pretty technical question. So you don't know too? Iam not aware of a "Notification" concept llm APIs understand. They have system prompts and mostly an array of messages. That's it.
Thank you for your work. The SuperMCP depends on FastMCP. Hereâs the link: https://github.com/dhanababum/supermcp. Does fastmcp3.0 support dynamic MCP servers now?
I think so -- providers can return new components on every call, so you can build some really dynamic stuff. For example the new filesystem provider can reload files to automatically pick up changes. If there's something you need that isn't easy let us know!
Very excited for this. I saw the docs earlier on the redis session store and I almost risked it all to install the beta in prod. Thanks for all the work you do!
This is a smart direction. Reducing everything to Providers and Transforms makes the framework easier to reason about and extend, and it shows in the feature list. Per-component auth and session state are especially welcome. The minimal breaking changes make upgrades practical too.Â
Whelp I know what I'm doing this weekend. My MCP for coding needs a refresh and this gives a good reason to get on it finally lol.
Factoring everything into providers and transforms is the move. 2.x had good ideas but the subsystems felt bolted together... mounting and proxying and filtering each doing their own thing. This cleanup should help devs who want to combine, say, an OpenAPI spec with custom auth transforms without hitting weird edge cases.
Session-scoped state is the one that'll matter most for agentic workflows. Multi-turn tool calls sharing context without external state stores simplifies a lot of orchestration code.
Hot reload was overdue. Debugging MCP servers without it meant restart loops that killed iteration speed.
Session state is the one I keep coming back to. The FAME paper from last month showed 13x latency reduction just by automating agent memory persistence instead of round-tripping to external stores. FastMCP baking this in at the framework level means fewer teams will roll their own half-broken session hacks.
Hot reload feels obvious in hindsight... the restart loop tax on debugging was real. Curious if the FileSystemProvider hot-reload plays nice with breakpoints or if you still need to detach/reattach.
Youâre absolutely correct! Itâs been a game changer!
Are but the start of the phrases I will use in my new MCP server called, human-to-ai-email-response-mcp.
Next time youâre sending a manual email using your own language embedded with your personality you can call upon my MCP to ensure it sounds like the rest of your team members.
why only python though? what did go and js ever do to you? personally i skip anything with py, thats why im still sticking with metamcp
Love fastmcp, thanks for your work.
đ