FastMCP 2.8.0 introduces powerful new ways to customize and control your MCP servers!
Tool Transformation
The highlight of this release is first-class Tool Transformation, a new feature that lets you create enhanced variations of existing tools. You can now easily rename arguments, hide parameters, modify descriptions, and even wrap tools with custom validation or post-processing logic—all without rewriting the original code. This makes it easier than ever to adapt generic tools for specific LLM use cases or to simplify complex APIs. Huge thanks to @strawgate for partnering on this, starting with #591 and #599 and continuing offline.
Component Control
This release also gives you more granular control over which components are exposed to clients. With new tag-based filtering, you can selectively enable or disable tools, resources, and prompts based on tags, perfect for managing different environments or user permissions. Complementing this, every component now supports being programmatically enabled or disabled, offering dynamic control over your server's capabilities.
Tools-by-Default
Finally, to improve compatibility with a wider range of LLM clients, this release changes the default behavior for OpenAPI integration: all API endpoints are now converted to Tools by default. This is a breaking change but pragmatically necessitated by the fact that the majority of MCP clients available today are, sadly, only compatible with MCP tools. Therefore, this change significantly simplifies the out-of-the-box experience and ensures your entire API is immediately accessible to any tool-using agent.
What's Changed
New Features 🎉
- First-class tool transformation by @jlowin in #745
- Support enable/disable for all FastMCP components (tools, prompts, resources, templates) by @jlowin in #781
- Add support for tag-based component filtering by @jlowin in #748
- Allow tag assignments for OpenAPI by @jlowin in #791
Enhancements 🔧
- Create common base class for components by @jlowin in #776
- Move components to own file; add resource by @jlowin in #777
- Update FastMCP component with eq and repr by @jlowin in #779
- Remove open-ended and server-specific settings by @jlowin in #750
Fixes 🐞
- Ensure client is only initialized once by @jlowin in #758
- Fix field validator for resource by @jlowin in #778
- Ensure proxies can overwrite remote tools without falling back to the remote by @jlowin in #782
Breaking Changes 🛫
- Treat all openapi routes as tools by @jlowin in #788
- Fix issue with global OpenAPI tags by @jlowin in #792
Docs 📚
- Minor docs updates by @jlowin in #755
- Add 2.7 update by @jlowin in #756
- Reduce 2.7 image size by @jlowin in #757
- Update updates.mdx by @jlowin in #765
- Hide docs sidebar scrollbar by default by @jlowin in #766
- Add "stop vibe testing" to tutorials by @jlowin in #767
- Add docs links by @jlowin in #768
- Fix: updated variable name under Gemini remote client by @yrangana in #769
- Revert "Hide docs sidebar scrollbar by default" by @jlowin in #770
- Add updates by @jlowin in #773
- Add tutorials by @jlowin in #783
- Update LLM-friendly docs by @jlowin in #784
- Update oauth.mdx by @JeremyCraigMartinez in #787
- Add changelog by @jlowin in #789
- Add tutorials by @jlowin in #790
- Add docs for tag-based filtering by @jlowin in #793
Other Changes 🦾
- Create dependabot.yml by @jlowin in #759
- Bump astral-sh/setup-uv from 3 to 6 by @dependabot in #760
- Add dependencies section to release by @jlowin in #761
- Remove extra imports for MCPConfig by @Maanas-Verma in #763
- Split out enhancements in release notes by @jlowin in #764
New Contributors
- @dependabot made their first contribution in #760
- @Maanas-Verma made their first contribution in #763
- @JeremyCraigMartinez made their first contribution in #787
Full Changelog: v2.7.1...v2.8.0