Releases: jlowin/fastmcp
v2.9.2: Safety Pin
This is a patch release to pin mcp
below 1.10, which includes changes related to the 6/18/2025 MCP spec update and could potentially break functionality for some FastMCP users. Those will be incorporated into FastMCP 2.10
What's Changed
Docs 📚
Dependencies 📦
Full Changelog: v2.9.1...v2.9.2
v2.9.1: Call Me Maybe
The headline of this release is the introduction of change notifications for tools/resources/prompts, as well as flexible client-side handling of arbitrary messages.
What's Changed
New Features 🎉
Enhancements 🔧
Fixes 🐞
Docs 📚
- Update changelog and updates for 2.9 release by @jlowin in #929
- run
just api-ref-all
to get new source links by @zzstoatzz in #935 - regen api ref by @zzstoatzz in #947
- fix a couple api-ref parsing issues by @zzstoatzz in #949
Examples & Contrib 💡
- add
create_thread
tool to bsky MCP server by @zzstoatzz in #927 - fix(examples): update mount_example.py to work with current fastmcp API by @rajephon in #957
Other Changes 🦾
- Fix parameter location enum handling in OpenAPI parser by @jlowin in #953
- Fix external schema reference handling in OpenAPI parser by @jlowin in #954
New Contributors
Full Changelog: v2.9.0...v2.9.1
v2.9.0: Stuck in the Middleware With You
FastMCP 2.9 introduces two important features that push beyond the basic MCP protocol. MCP Middleware brings a flexible middleware system for intercepting and controlling server operations - think authentication, logging, rate limiting, and custom business logic without touching core protocol code. Server-side type conversion solves a major developer pain point: while MCP requires string arguments, your functions can now work with native Python types like lists and dictionaries, with automatic conversion handling the complexity.
These features transform FastMCP from a simple protocol implementation into a powerful framework for building sophisticated MCP applications. Combined with the new File utility for binary data and improvements to authentication and serialization, this release makes FastMCP significantly more flexible and developer-friendly while maintaining full protocol compliance.
What's Changed
New Features 🎉
- Add File utility for wrapping binary data by @gorocode in #843
- Consolidate prefix logic into FastMCP methods by @jlowin in #861
- Add MCP Middleware by @jlowin in #870
- Implement server-side type conversion for prompt arguments by @jlowin in #908
Enhancements 🔧
- fix tool description indentation issue #844 https://github.com/jlowin… by @zfflxx in #845
- Add version parameter to FastMCP constructor by @mkyutani in #842
- Update version to not be positional by @jlowin in #848
- Add key to component by @jlowin in #869
- Add session_id property to Context for data sharing by @jlowin in #881
- Fix CORS documentation example to properly handle preflight requests by @jlowin in #895
- Simplify trailing slash handling for HTTP endpoints by @jlowin in #896
- Openapi recursive components by @owtaylor in #897
- Add httpx.Auth Support to RemoteMCPServer for Custom Authentication methods to multiple MCP Servers by @Jason-CKY in #906
- Add client-side prompt argument serialization by @jlowin in #910
Fixes 🐞
- fix: report_progress missing passing related_request_id causes notifications not working in streaming-http by @alexsee in #838
- Fix JWT issuer validation to support string values per RFC 7519 by @jlowin in #892
- Fix BearerAuthProvider audience type annotations by @jlowin in #894
Docs 📚
- Add CLAUDE.md development guidelines by @jlowin in #880
- Update context docs for session_id property by @jlowin in #882
- add api ref by @zzstoatzz in #893
- Fix api ref rendering by @zzstoatzz in #900
- Simplify docs nav by @jlowin in #902
- Add fastmcp inspect command by @jlowin in #904
- Update client docs by @jlowin in #912
- Update docs nav by @jlowin in #913
- Update integration documentation for Claude Desktop, ChatGPT, and Claude Code by @jlowin in #915
- Add http as an alias for streamable http by @jlowin in #917
- Clean up parameter documentation by @jlowin in #918
- use new
--exclude
flag by @zzstoatzz in #907 - Add middleware examples for timing, logging, rate limiting, and error handling by @jlowin in #919
- ControlFlow -> FastMCP 😅 by @jlowin in #922
Examples & Contrib 💡
- contrib.mcp_mixin: add support for enabled, mcp_tool: annotations, excl. parm, serializer by @rsp2k in #860
- Add ATProto (Bluesky) MCP Server Example by @zzstoatzz in #916
- fix path in atproto example pyproject by @zzstoatzz in #920
- remove uv source in example by @zzstoatzz in #921
New Contributors
- @alexsee made their first contribution in #838
- @zfflxx made their first contribution in #845
- @mkyutani made their first contribution in #842
- @gorocode made their first contribution in #843
- @rsp2k made their first contribution in #860
- @owtaylor made their first contribution in #897
- @Jason-CKY made their first contribution in #906
Full Changelog: v2.8.1...v2.9.0
v2.8.1: Sound Judgement
2.8.1 introduces audio support, as well as minor fixes and updates for deprecated features.
What's Changed
New Features 🎉
Enhancements 🔧
- Add flag for disabling deprecation warnings by @jlowin in #802
- Add examples to Tool Arg Param transformation by @strawgate in #806
Fixes 🐞
- Restore .settings access as deprecated by @jlowin in #800
- Ensure we handle false http kwargs correctly; removed unused kwarg by @jlowin in #804
- Bump mcp 1.9.4 by @jlowin in #835
Docs 📚
- Update changelog for 2.8.0 by @jlowin in #794
- Update welcome docs by @jlowin in #808
- Update headers in docs by @jlowin in #809
- add MCP group to tutorials by @jlowin in #810
- Add Community section to documentation by @zzstoatzz in #819
- Add 2.8 update by @jlowin in #821
- Embed YouTube videos in community showcase by @zzstoatzz in #820
Other Changes 🦾
- Ensure http args are passed through by @jlowin in #803
- Fix install link in readme by @jlowin in #836
Full Changelog: v2.8.0...v2.8.1
v2.8.0: Transform and Roll Out
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
v2.7.1: The Bearer Necessities
This release primarily contains a fix for parsing string tokens that are provided to FastMCP clients.
What's Changed
New Features 🎉
Fixes 🐞
- Ensure event store is properly typed by @jlowin in #753
- Fix passing token string to client auth & add auth to MCPConfig clients by @jlowin in #754
Docs 📚
- Docs : fix client to mcp_client in Gemini example by @yrangana in #734
- update add tool docstring by @strawgate in #739
- Fix contrib link by @richardkmichael in #749
Other Changes 🦾
- Switch Pydantic defaults to kwargs by @strawgate in #731
- Fix Typo in CLI module by @wfclark5 in #737
- chore: fix prompt docstring by @danb27 in #752
- Add accept to excluded headers by @jlowin in #751
New Contributors
- @wfclark5 made their first contribution in #737
- @richardkmichael made their first contribution in #749
- @danb27 made their first contribution in #752
Full Changelog: v2.7.0...v2.7.1
v2.7.0: Pare Programming
This is primarily a housekeeping release to remove or deprecate cruft that's accumulated since v1. Primarily, this release refactors FastMCP's internals in preparation for features planned in the next few major releases. However please note that as a result, this release has some minor breaking changes (which is why it's 2.7, not 2.6.2, in accordance with repo guidelines) though not to the core user-facing APIs. Examples include:
- decorators return the objects they create, not the decorated function
- websockets is an optional dependency
- methods on the server for automatically converting functions into tools/resources/prompts have been deprecated in favor of using the decorators directly
Happily, this release DOES permit the use of "naked" decorators to align with Pythonic practice:
@mcp.tool
def my_tool():
...
What's Changed
New Features 🎉
- allow passing flags to servers by @zzstoatzz in #690
- replace $ref pointing to
#/components/schemas/
with#/$defs/
by @phateffect in #697 - Split Tool into Tool and FunctionTool by @jlowin in #700
- Use strict basemodel for Prompt; relax from_function deprecation by @jlowin in #701
- Formalize resource/functionresource replationship by @jlowin in #702
- Formalize template/functiontemplate split by @jlowin in #703
- Support flexible @tool decorator call patterns by @jlowin in #706
- Ensure deprecation warnings have stacklevel=2 by @jlowin in #710
- Allow naked prompt decorator by @jlowin in #711
Fixes 🐞
- Updates / Fixes for Tool Content Conversion by @strawgate in #642
- Fix pr labeler permissions by @jlowin in #708
- remove -n auto by @jlowin in #709
- Fix links in README.md by @alainivars in #723
Breaking Changes 🛫
- Deprecate passing functions to the server in favor of core objects by @jlowin in #705
- Remove websockets dependency by @jlowin in #726
- Return objects from FastMCP decorators by @jlowin in #727
Docs 📚
- Add banner by @jlowin in #712
- Allow clicking on banner by @jlowin in #713
- Add empty parens to docs by @jlowin in #714
- Update banner link by @jlowin in #716
- Add updates by @jlowin in #718
- Add tags by @jlowin in #719
- Update docs.json by @jlowin in #720
- Remove empty parens from decorators in docs by @jlowin in #729
New Contributors
- @phateffect made their first contribution in #697
Full Changelog: v2.6.1...v2.7.0
v2.6.1: Blast Auth (second ignition)
This is a patch release to restore py.typed in #686.
What's Changed
Docs 📚
- Update readme by @jlowin in #679
- Add gemini tutorial by @jlowin in #680
- Fix : fix path error to CLI Documentation by @yrangana in #684
- Update auth docs by @jlowin in #687
Other Changes 🦾
- Remove deprecation notice by @jlowin in #677
- Delete server.py by @jlowin in #681
- Restore py.typed by @jlowin in #686
New Contributors
Full Changelog: v2.6.0...v2.6.1
v2.6.0: Blast Auth
What's Changed
New Features 🎉
- Introduce MCP client oauth flow by @jlowin in #478
- Support providing tools at init by @jlowin in #647
- Simplify code for running servers in processes during tests by @jlowin in #649
- Add basic bearer auth for server and client by @jlowin in #650
- Support configuring bearer auth from env vars by @jlowin in #652
- feat(tool): add support for excluding arguments from tool definition by @deepak-stratforge in #626
- Add docs for server + client auth by @jlowin in #655
Fixes 🐞
- fix: Support concurrency in FastMcpProxy (and Client) by @Sillocan in #635
- Ensure Client.close() cleans up client context appropriately by @jlowin in #643
- Update client.mdx: ClientError namespace by @mjkaye in #657
Docs 📚
- Make FastMCPTransport support simulated Streamable HTTP Transport (didn't work) by @jlowin in #645
- Document exclude_args by @jlowin in #653
- Update welcome by @jlowin in #673
- Add Anthropic + Claude desktop integration guides by @jlowin in #674
- Minor docs design updates by @jlowin in #676
Other Changes 🦾
New Contributors
- @Sillocan made their first contribution in #635
- @deepak-stratforge made their first contribution in #626
- @mjkaye made their first contribution in #657
Full Changelog: v2.5.2...v2.6.0
v2.5.2: Stayin' Alive
What's Changed
New Features 🎉
- Add graceful error handling for unreachable mounted servers by @davenpi in #605
- Improve type inference from client transport by @jlowin in #623
- Add keep_alive param to reuse subprocess by @jlowin in #624
Fixes 🐞
- Fix handling tools without descriptions by @jlowin in #610
- Don't print env vars to console when format is wrong by @jlowin in #615
- Ensure behavior-affecting headers are excluded when forwarding proxies/openapi by @jlowin in #620
Docs 📚
Other Changes 🦾
- add init_timeout for mcp client by @jfouret in #607
- Add init_timeout for mcp client (incl settings) by @jlowin in #609
- Support for uppercase letters at the log level by @ksawaray in #625
New Contributors
Full Changelog: v2.5.1...v2.5.2