URL: https://gofastmcp.com/changelog
Title: Changelog - FastMCP

Documentation Index
Fetch the complete documentation index at:
/llms.txt
Use this file to discover all available pages before exploring further.
Skip to main content
Meet
Prefect Horizon
, the enterprise MCP gateway built by the team behind FastMCP
FastMCP
home page
v3
Prefect Horizon
PrefectHQ/fastmcp
25,596
PrefectHQ/fastmcp
25,596
Search...
Navigation
What's New
Changelog
Search the docs...
Ctrl
K
Documentation
Get Started
Welcome!
Installation
Quickstart
Servers
Overview
Core Components
Working with Tools
MCP Providers
Interactivity
Extensibility
Auth
Deployment
Apps
Overview
Quickstart
NEW
FastMCPApp
NEW
Interactive Tools
NEW
Generative UI
NEW
Custom HTML
Reference
Clients
Overview
Client-Only Package
Transports
fastmcp-remote
Operations
UPDATED
Authentication
UPDATED
Integrations
Auth
Web Frameworks
AI Assistants
AI SDKs
MCP.json
More
Settings
CLI
Upgrading
Development
What's New
Updates
NEW
Changelog
NEW
FAQ
On this page
v3.4.1
v3.4.0
v3.3.1
v3.3.0
v3.2.4
v3.2.3
v3.2.2
v3.2.1
v3.2.0
v3.1.1
v3.1.0
v3.0.2
v3.0.1
v3.0.0
v3.0.0rc1
v3.0.0b2
v3.0.0b1
v2.14.7
v2.14.6
v2.14.5
v2.14.4
v2.14.3
v2.14.2
v2.14.1
v2.14.0
v2.13.3
v2.13.2
v2.13.1
v2.13.0
v2.12.5
v2.12.4
v2.12.3
v2.12.2
v2.12.1
v2.12.0
v2.11.3
v2.11.2
v2.11.1
v2.11.0
v2.10.6
v2.10.5
v2.10.4
v2.10.3
v2.10.2
v2.10.1
v2.10.0
v2.9.2
v2.9.1
v2.9.0
v2.8.1
v2.8.0
v2.7.1
v2.7.0
v2.6.1
v2.6.0
v2.5.2
v2.5.1
v2.5.0
v2.4.0
v2.3.5
v2.3.4
v2.3.3
v2.3.2
v2.3.1
v2.3.0
v2.2.10
v2.2.9
v2.2.8
v2.2.7
v2.2.6
v2.2.5
v2.2.4
v2.2.3
v2.2.2
v2.2.1
v2.2.0
v2.1.2
v2.1.1
v2.1.0
v2.0.0
v1.0
v0.4.1
v0.4.0
v0.3.5
v0.3.4
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.0
v0.1.0
What's New
Changelog
Copy page
Copy page
​
v3.4.1
2026-06-05
v3.4.1: Floor It
FastMCP 3.4.1 floors Starlette at
>=1.0.1
so installs can no longer resolve to a version affected by CVE-2026-48710, which was previously only constrained transitively through
mcp
. It also makes OAuthProxy log refresh-token cache misses instead of failing silently.
​
Enhancements ✨
Log refresh-token misses in OAuthProxy instead of failing silently by
@jlowin
in
#4276
​
Security 🔒
Add explicit starlette>=1.0.1 floor (CVE-2026-48710) by
@jlowin
in
#4286
​
Docs 📚
Document —notes-start-tag in release instructions by
@jlowin
in
#4275
Full Changelog
:
v3.4.0…v3.4.1
​
v3.4.0
2026-06-02
v3.4.0: Remote Control
FastMCP 3.4 is about reaching servers that live somewhere else. The headline is
fastmcp-remote
, a standalone bridge that connects stdio-only MCP hosts to servers hosted over HTTP. Around it, the proxy layer those connections depend on is hardened: a proxy now forwards
initialize
upstream and fails loudly when the backend is missing or misconfigured, instead of reporting a connected-but-empty proxy. And FastMCP-issued access tokens can now outlive short-lived upstream tokens, so authenticated sessions survive the long idle periods remote clients are prone to.
​
New Features 🎉
Add fastmcp-remote bridge package by
@jlowin
in
#4208
​
Breaking Changes ⚠️
Forward proxy initialize as bridge behavior by
@jlowin
in
#4228
​
Enhancements ✨
ci: require external PRs to link a tracked issue by
@strawgate
in
#4173
feat: new options —host and —no-log-panel | —log-panel to cli dev apps by
@itaru2622
in
#4123
Add valid_scopes and extra_authorize_params to WorkOSProvider by
@tiagoskaneta
in
#4135
Add token_expiry_threshold_seconds for proactive token refresh by
@mohankumarelec
in
#4142
Add review-issue skill for triaging gated external contributions by
@jlowin
in
#4212
Add contract gate to review-issue skill by
@jlowin
in
#4214
Let ToolResult return an error result via is_error by
@jlowin
in
#4217
Update published docs after PyPI release by
@jlowin
in
#4211
Allow pre-bound HTTP sockets by
@jlowin
in
#4222
Add targeted coverage tests by
@strawgate
in
#4230
Upgrade ty to 0.0.39 by
@jlowin
in
#4225
Decouple FastMCP access token lifetime from upstream expires_in by
@jlowin
in
#4254
​
Security 🔒
feat(code-mode): default sandbox limits and per-execution tool-call cap by
@strawgate
in
#4170
Security: Fix 3 findings in GitHub Actions workflows by
@jpr5
in
#4183
Add outbound comment guardrails by
@jlowin
in
#4196
Add uv dependency cooldown by
@jlowin
in
#4213
​
Fixes 🐞
fix: VersionSpec eq matching normalizes versions and selects deterministically by
@strawgate
in
#4058
fix(tests): hoist azure-identity import out of the OBO test timeout window by
@strawgate
in
#4176
fix(auth): disambiguate auth-denied vs missing component messages by
@strawgate
in
#4165
fix: preserve annotations, meta, title, icons when creating resources from templates by
@strawgate
in
#4061
fix: add OTEL spans to sampling step and tool execution by
@strawgate
in
#4059
fix(config): read MCP config files as UTF-8 by
@pragnyanramtha
in
#4164
fix(schema): preserve root metadata on fallback by
@yuyua9
in
#4178
fix(proxy): restore _current_server in _restore_request_context by
@strawgate
in
#4168
fix(auth): add /.well-known/openid-configuration alias for OAuth server metadata by
@shigechika
in
#4167
fix(code-mode): cancel Monty sandbox future on task cancellation by
@strawgate
in
#4169
fix(auth): unprefix Azure scopes echoed back to MCP clients by
@rgillinlz
in
#4130
fix(cli): forward stateless flag in uv run path by
@yuyua9
in
#4177
fix(ci): scope minimize-reviews concurrency by event name by
@strawgate
in
#4174
Fix docs app demo iframe assets by
@jlowin
in
#4194
Guard require-issue-link check job to pull_request_target events by
@jlowin
in
#4209
Migrate auth JWTs to joserfc by
@jlowin
in
#4221
Skip published docs update for prereleases by
@jlowin
in
#4224
Surface proxy upstream failures by
@jlowin
in
#4227
Close upstream OAuth clients by
@jlowin
in
#4248
Fix GitHub MCP resource integration test by
@jlowin
in
#4253
Fix resource templates with query params on proxied servers by
@rene84
in
#4251
​
Docs 📚
Document pip upgrade recovery for the fastmcp-slim package split by
@jlowin
in
#4215
Move pip upgrade recovery into a Troubleshooting section by
@jlowin
in
#4219
Restore Horizon docs banner by
@jlowin
in
#4240
fix: Trendshift link and badge in README.md by
@bhantos
in
#4236
docs: add tool fingerprinting recipe by
@dgenio
in
#4233
​
Dependencies 📦
chore(deps): bump the uv group across 2 directories with 1 update by
@dependabot
in
#4113
chore(deps-dev): bump pydantic-monty from 0.0.16 to 0.0.17 by
@dependabot
in
#4023
​
Other Changes 🦾
Exempt maintainers from MRE auto-close by
@jlowin
in
#4220
​
New Contributors
@pragnyanramtha made their first contribution in
#4164
@yuyua9 made their first contribution in
#4178
@tiagoskaneta made their first contribution in
#4135
@mohankumarelec made their first contribution in
#4142
@rgillinlz made their first contribution in
#4130
@jpr5 made their first contribution in
#4183
@bhantos made their first contribution in
#4236
@rene84 made their first contribution in
#4251
Full Changelog
:
v3.3.1…v3.4.0
​
v3.3.1
2026-05-15
v3.3.1: Loop There It Is
A hotfix for the 3.3 packaging split. Clean installs could fail on standalone component imports like
from fastmcp.tools import tool
, because component modules reached auth and task primitives through
fastmcp.server
and pulled in the full server/provider stack. Those primitives now live in lightweight utility modules, with the old server import paths preserved as compatibility re-exports.
​
Fixes 🐞
fix(docs): use valid FA icon on client-only package page by
@jlowin
in
#4139
Decouple component imports from server by
@jlowin
in
#4150
Full Changelog
:
v3.3.0…v3.3.1
​
v3.3.0
2026-05-15
v3.3.0: Slim Reaper
FastMCP 3.3 ships
fastmcp-slim
, a dependency-light distribution that separates the client from the server stack — install FastMCP’s client and transport layer without Starlette, Uvicorn, or the rest of the server machinery. The import namespace is unchanged. It also closes out a backlog of OAuth proxy security hardening, MCP-compliant OTEL instrumentation, and auth additions that accumulated through the 3.2 cycle.
​
New Features 🎉
Add fastmcp-slim for client-only installs by
@jlowin
in
#4122
​
Enhancements ✨
Add default prefill to FormInput.collect_input by
@jlowin
in
#3937
OTEL: Fix attribute compliance with MCP semantic conventions by
@strawgate
in
#3889
OTEL: Instrument all MCP list operations and enrich delegate spans by
@strawgate
in
#3890
Improve real-world schema crash test: failure dump, cluster analysis, TypeErrors baseline ratchet by
@jlowin
in
#3958
feat: add AzureB2CProvider for Azure AD B2C user flows by
@carlos-rian
in
#3995
Add run_in_thread opt-out for sync tools with thread affinity by
@jlowin
in
#4010
Add missing return type annotation to
getattr
by
@ZLeventer
in
#4026
Add experimental_capabilities kwarg to FastMCP constructor by
@jlowin
in
#4042
Add log_level parameter to FastMCP errors by
@daniel-tsiang
in
#4036
Bump pydocket to 0.20.0 by
@chrisguidry
in
#4031
enh: Add public API for updating OAuthProxy scopes after initialization by
@taylorwilsdon
in
#4091
Refine fastmcp-slim packaging by
@jlowin
in
#4125
​
Security 🔒
Harden OAuth Proxy silent consent against AS-in-the-middle by
@jlowin
in
#3960
Reject dot-segments in redirect URI allowlist matching by
@jlowin
in
#3963
Bump deps with open dependabot alerts by
@jlowin
in
#3965
Partition ResponseCachingMiddleware cache by access token by
@jlowin
in
#4041
​
Fixes 🐞
fix: reject self-mount to prevent infinite recursion by
@strawgate
in
#3925
fix: ProxyTool crashes on non-TextContent error responses by
@strawgate
in
#3926
fix: _prune_param and _convert_nullable_field mutate input schemas by
@strawgate
in
#3927
fix: narrow OpenAI audio format dict to Literal for ty by
@jlowin
in
#3936
fix: allow hyphens in resource template parameter names by
@strawgate
in
#3929
fix: OpenAPI request director sends multipart and form-urlencoded as JSON by
@strawgate
in
#3932
Fix raise_on_error handling for tool tasks by
@gnanirahulnutakki
in
#3946
fix: FileSystemProvider reload race condition by
@strawgate
in
#3938
fix tests that relied on task=True returning error results by
@jlowin
in
#3954
Restore task snapshot via a worker-level dependency by
@chrisguidry
in
#3945
Forward backend capabilities in ProxyProvider by
@jlowin
in
#3956
Allow upstream client_id to be used directly without DCR by
@jlowin
in
#3957
Graceful fallback for unsupported regex patterns in json_schema_to_type by
@jlowin
in
#3959
Revert “Forward backend capabilities in ProxyProvider (#3956)” by
@jlowin
in
#3964
fix: skip stdio subprocess test on Windows CI by
@jlowin
in
#3966
fix: bound _refresh_locks with LRU eviction to prevent memory leak by
@jlowin
in
#3968
fix: handle circular JSON Pointer $ref in dereference_refs by
@lawrence3699
in
#3896
fix: honor upstream refresh token expiry in OAuthProxy by
@jlowin
in
#3990
fix: narrow _token_validator with isinstance for ty in AzureProvider.from_b2c by
@jlowin
in
#4007
fix: cancel orphaned session_task when Client._disconnect times out by
@jlowin
in
#4011
fix: preserve @tool metadata in from_function by
@lawrence3699
in
#4072
fix(openapi): keep blank values in parse_qs (refs #4056) by
@MukundaKatta
in
#4076
Fix #4056: keep blank query values, add token bucket regression test by
@MukundaKatta
in
#4069
fix(ping): exit ping loop cleanly when session stream is closed by
@ashwin153
in
#4087
Fix sampling from background tasks by
@cuyua9
in
#4068
Make Docket reentrant; mounted servers enter their own lifespan by
@jlowin
in
#4095
fix(tool_transform): hoist $defs to schema root when ArgTransform introduces them by
@SarthakB11
in
#4101
fix(auth): silence authlib.jose DeprecationWarning at JWT import by
@SarthakB11
in
#4100
fix: don’t cache import map in dev apps bundle by
@jlowin
in
#4106
#4084 [Issues] Windows startup crash due to UnicodeDecodeError when l… by
@doneman536
in
#4092
fix: drop exc_info for expected tool failures, remove unreachable ValidationError by
@sergeykad
in
#4029
fix: cli option —no-banner is NOT passed to cli but server-spec in-correctly when cli —reload option is specified. by
@itaru2622
in
#4083
Fix None backend_* span attributes on un-renamed proxy components by
@ringerc
in
#4109
Fix OCI Provider issue in 3.x version. Add OCI auth provider example … by
@kiranthakkar
in
#4116
fix(http): terminate active streamable-HTTP transports before lifespan shutdown by
@SarthakB11
in
#4118
​
Docs 📚
Restructure docs navigation by
@jlowin
in
#3951
docs: standardize ToolAnnotations examples by
@gnanirahulnutakki
in
#3952
Be constructively skeptical of bot reviews on own PRs by
@jlowin
in
#3971
Add UTM params to Horizon docs links by
@aaazzam
in
#4018
Add a sandboxed-agents deployment guide by
@strawgate
in
#4027
docs: add best practices for custom telemetry spans by
@MukundaKatta
in
#4001
Refresh landing page copy by
@jlowin
in
#4043
Refresh landing page copy by
@jlowin
in
#4047
Add UTM tracking to Horizon links by
@jlowin
in
#4064
docs(integrations): add Pydantic AI FastMCP toolset guide by
@MukundaKatta
in
#4070
docs: fix broken links in Pydantic AI guide by
@jlowin
in
#4094
​
Dependencies 📦
chore(deps-dev): bump pydantic-monty from 0.0.11 to 0.0.12 by
@dependabot
in
#3940
chore(deps-dev): bump pydantic-monty from 0.0.14 to 0.0.16 by
@dependabot
in
#3984
​
Other Changes 🦾
fix: Don’t completely hide plain mcp.tool app-only tools by
@owtaylor
in
#4112
​
New Contributors
@gnanirahulnutakki made their first contribution in
#3946
@lawrence3699 made their first contribution in
#3896
@carlos-rian made their first contribution in
#3995
@ZLeventer made their first contribution in
#4026
@MukundaKatta made their first contribution in
#4001
@daniel-tsiang made their first contribution in
#4036
@ashwin153 made their first contribution in
#4087
@cuyua9 made their first contribution in
#4068
@taylorwilsdon made their first contribution in
#4091
@SarthakB11 made their first contribution in
#4101
@doneman536 made their first contribution in
#4092
@sergeykad made their first contribution in
#4029
@ringerc made their first contribution in
#4109
Full Changelog
:
v3.2.4…v3.3.0
​
v3.2.4
2026-04-14
v3.2.4: Patch Me If You Can
A grab bag of fixes, hardening, and polish. The headline behavior change: background tasks are now scoped to the authorization context rather than the MCP session, so a task survives session churn and stays tied to who started it — a breaking change for anyone relying on the old session-scoped semantics. Plus actual-size validation in
FileUpload
, a Keycloak OAuth provider, automatic parameter descriptions from docstrings, and dozens of schema and sampling fixes.
​
Breaking Changes ⚠️
Scope tasks to authorization context, not session by
@chrisguidry
in
#3800
​
Enhancements ✨
Bump pydocket>=0.19.0, drop fakeredis pin by
@chrisguidry
in
#3822
Add real-world schema crash test (232K schemas from APIs.guru) by
@strawgate
in
#3826
Enable 7 zero-violation ruff rules by
@strawgate
in
#3841
Promote 7 ty rules from ignore to warn by
@strawgate
in
#3852
Replace ___ with hash-based backend tool routing and per-tool prefab resources by
@jlowin
in
#3824
Enable 4 ruff rules (DTZ, ERA, ISC, INP) and fix 9 violations by
@strawgate
in
#3842
Extract parameter descriptions from docstrings by
@jlowin
in
#3872
ci: speed up schema crash test (CSafeLoader + xdist-safe aggregation) by
@jlowin
in
#3873
test: bump OpenAPI init perf threshold to 200ms for Windows CI by
@jlowin
in
#3879
refactor: unify object-schema conversion through _object_schema_to_type by
@jlowin
in
#3884
Add Keycloak OAuth Provider for Enterprise Authentication and local dev by
@stephaneberle9
in
#1937
Allow auth providers to override protected resource base URLs by
@aaazzam
in
#3900
Enable PERF and T20 ruff rules by
@strawgate
in
#3845
Add response_title and response_description to ctx.elicit() by
@jlowin
in
#3912
Deprecate ctx.elicit() without response_type by
@jlowin
in
#3916
​
Security 🔒
Validate actual base64 data size in FileUpload, not client-reported size by
@strawgate
in
#3816
Stop forwarding inbound HTTP headers to unrelated remote servers by
@jlowin
in
#3837
AuthKit: auto-bind token audience to resource URL (RFC 8707) by
@jlowin
in
#3905
​
Fixes 🐞
Version-check is_docket_available() to avoid transitive pydocket crash by
@jlowin
in
#3807
fix: materialize generators before result conversion, handle bytes gracefully by
@strawgate
in
#3830
Fix json_schema_to_type crashes on keywords, boolean schemas, empty enums, and name collisions by
@strawgate
in
#3818
fix: replace
or
with
is not None
checks for config/override merging by
@strawgate
in
#3833
fix: TransformedTool sync fn crash and schema mutation by
@strawgate
in
#3823
fix: cross-provider duplicate detection, error visibility, mask propagation by
@strawgate
in
#3827
fix: don’t pass HTTP kwargs when transport is unspecified by
@strawgate
in
#3838
fix: strip title fields from tool schemas for Gemini 2.5 Flash compatibility by
@strawgate
in
#3861
fix: retry when LLM returns text instead of calling final_response by
@strawgate
in
#3850
Raise on unhandled content types in sampling handler dispatch chains by
@strawgate
in
#3857
Fix broken code examples in docs by
@strawgate
in
#3869
fix: GoogleGenaiSamplingHandler leaks thought parts and gives unhelpful errors on empty responses by
@strawgate
in
#3849
fix: cap consecutive final_response validation retries by
@strawgate
in
#3851
Fix test quality issues by
@strawgate
in
#3854
Fix MCP tool on docs welcome page by
@lkiesow
in
#3874
Fix CIMD clients getting required_scopes instead of valid_scopes by
@jlowin
in
#3836
Rename filesystem-provider example dir to avoid mcp/ collision by
@jlowin
in
#3878
fix: drop configurable dedupe from AggregateProvider, always warn by
@jlowin
in
#3877
fix: resolve list[dict] return type producing Root() instead of dicts by
@KeWang0622
in
#3880
fix: strip titles from bare-metadata nodes (Gemini 2.5 Flash) by
@jlowin
in
#3881
Fix wildcard resource template params in mounted servers by
@jlowin
in
#3899
Harden forced client disconnect cleanup by
@vonbai
in
#3885
fix: elicitation scalar return, resource auto-serialization, Client.new() state, prompt errors by
@strawgate
in
#3859
fix: task.wait() hangs indefinitely when task enters input_required by
@mrishav
in
#3798
Fix RetryMiddleware not retrying tool errors by
@strawgate
in
#3858
Stop pydantic 2.13 from leaking _WrappedResult docstring into tool output schemas by
@jlowin
in
#3918
​
Docs 📚
Note generate-notes API in release workflow docs by
@jlowin
in
#3806
docs: require agents to respect DNM markers on PRs by
@jlowin
in
#3871
docs: add uv-managed dependencies and uvx examples to mcp-json configuration by
@vincent067
in
#3843
docs: link fastmcp-keycloak-local companion project from Keycloak integration page by
@stephaneberle9
in
#3904
Overhaul apps docs by
@jlowin
in
#3915
​
Dependencies 📦
chore(deps): bump extractions/setup-just from 3 to 4 by
@dependabot
in
#3863
chore(deps): bump astral-sh/setup-uv from 6 to 7 by
@dependabot
in
#3865
chore(deps): bump actions/checkout from 4 to 6 by
@dependabot
in
#3864
chore(deps-dev): bump pydantic-monty from 0.0.9 to 0.0.10 by
@dependabot
in
#3809
chore(deps): bump the uv group across 2 directories with 1 update by
@dependabot
in
#3913
​
New Contributors
@lkiesow made their first contribution in
#3874
@KeWang0622 made their first contribution in
#3880
@vonbai made their first contribution in
#3885
Full Changelog
:
v3.2.3…v3.2.4
​
v3.2.3
2026-04-09
v3.2.3: Redis or Not
A stopgap pin: fakeredis 2.35.0 shipped an undocumented rename that broke pydocket’s
memory://
backend, causing
fastmcp[tasks]
installs to fail at startup with an
ImportError
. This pins
fakeredis<2.35.0
in the
tasks
extra until a fixed pydocket ships.
​
Fixes 🐞
Pin
fakeredis<2.35.0
in tasks extra by
@jlowin
in
#3804
​
Docs 📚
Document session state isolation across mount boundaries by
@jlowin
in
#3801
Full Changelog
:
v3.2.2…v3.2.3
​
v3.2.2
2026-04-09
v3.2.2: Audience Appreciation
Fixes the Azure audience regression from 3.2.1: validation switched from
client_id
to
identifier_uri
, which fixed custom Application ID URIs but broke the default case where Azure AD v2 tokens set
aud
to the bare client ID GUID. Both formats are now accepted.
​
Fixes 🐞
fix: accept both client_id and identifier_uri as Azure audience by
@jlowin
in
#3797
​
Dependencies 📦
chore(deps): bump the uv group across 2 directories with 1 update by
@dependabot
in
#3795
Full Changelog
:
v3.2.1…v3.2.2
​
v3.2.1
2026-04-08
v3.2.1: Audience Participation
A patch focused on auth-provider audience validation. Cognito tokens now validate on
client_id
(they carry no
aud
), Azure honors the
identifier_uri
parameter for Entra v2.0 tokens, and consent cookies are LRU-capped to prevent unbounded growth past reverse proxy header limits. Also fixes OpenAPI 3.0
nullable
fields leaking into tool input schemas and server-variable substitution in base URLs.
​
Breaking Changes ⚠️
fix(google): use sub (user ID) for client_id instead of aud (app ID) by
@shigechika
in
#3722
fix: remove CSP from tool metadata, keep on resource only by
@jlowin
in
#3754
​
Enhancements ✨
[codex] Add FastMCP docs telemetry by
@aaazzam
in
#3727
chore: split SDK navigation into standalone $ref file by
@jlowin
in
#3773
fix: bump ty to >=0.0.29 and suppress new false positives by
@jlowin
in
#3790
​
Fixes 🐞
fix: use explicit None checks for JWT exp validation by
@jlowin
in
#3724
Unify background task context forwarding, fix concurrent dependency bugs by
@chrisguidry
in
#3710
fix: add proxy timeouts and modernize networking in apps dev by
@mateeaaa
in
#3741
fix: ResponseLimitingMiddleware no longer breaks outputSchema tools by
@jlowin
in
#3756
fix: substitute server variable defaults when building base URL from OpenAPI spec by
@mrishav
in
#3770
fix: FastAPI TestClient compatibility and lifespan re-initialization by
@kvdhanush06
in
#3736
fix: propagate upstream_claims in load_access_token by
@kvdhanush06
in
#3750
Remove deprecated asyncio.iscoroutinefunction fallback by
@kaiisfree
in
#3767
fix: changeable allowed_client_redirect_uris on OAuthProxy by
@fengarix
in
#3772
fix: broken link in changelog by
@jlowin
in
#3775
fix(docs): correct FastMCP tool name in welcome docs by
@buyua9
in
#3781
fix: cap consent cookie size to prevent header overflow by
@jlowin
in
#3784
Fix boolean property schemas in JSON Schema parsing by
@jlowin
in
#3785
Fix OpenAPI 3.0 nullable fields in tool input schemas by
@kvdhanush06
in
#3768
fix: Cognito token verification checks client_id instead of aud by
@jlowin
in
#3786
fix: use identifier_uri as audience for Azure token validation by
@jlowin
in
#3787
Harden client tool result error handling by
@aimable100
in
#3778
​
Docs 📚
Github integraiton documentation fix: use result.data otherwise CallToolResult not scriptable by
@c4jquick
in
#3753
chore: split v2 docs navigation into separate file by
@jlowin
in
#3762
docs: document forward_resource parameter on OAuthProxy by
@jlowin
in
#3788
​
Examples & Contrib 💡
fix: boolean false values dropped in form submissions by
@jlowin
in
#3776
​
Dependencies 📦
chore(deps): bump fastmcp from 3.1.1 to 3.2.0 in /examples/testing_demo in the uv group across 1 directory by
@dependabot
in
#3728
chore(deps): bump anthropic from 0.86.0 to 0.87.0 in the uv group across 1 directory by
@dependabot
in
#3742
​
New Contributors
@c4jquick made their first contribution in
#3753
@mateeaaa made their first contribution in
#3741
@mrishav made their first contribution in
#3770
@kvdhanush06 made their first contribution in
#3736
@kaiisfree made their first contribution in
#3767
@fengarix made their first contribution in
#3772
@buyua9 made their first contribution in
#3781
@aimable100 made their first contribution in
#3778
Full Changelog
:
v3.2.0…v3.2.1
​
v3.2.0
2026-03-30
v3.2.0: Show Don’t Tool
FastMCP 3.2 is the Apps release: your tools can now return interactive UIs — charts, dashboards, forms, maps — rendered right inside the conversation.
FastMCPApp
separates the tools the LLM sees from the backend tools the UI calls, five built-in providers (FileUpload, Approval, Choice, FormInput, GenerativeUI) cover common interaction patterns, and
fastmcp dev apps
gives you a browser preview. The release also lands a significant security hardening pass across SSRF/path-traversal, JWT algorithm restrictions, OAuth scope enforcement, and CSRF.
​
New Features 🎉
Add FastMCPApp — a Provider for composable MCP applications by
@jlowin
in
#3385
Add fastmcp dev apps command with browser UI preview by
@jlowin
in
#3489
Add GenerativeUI provider, bump prefab-ui 0.14.0 by
@jlowin
in
#3647
Add FileUpload provider by
@jlowin
in
#3669
Add Approval and Choice providers by
@jlowin
in
#3686
Add FormInput provider, bump prefab-ui to 0.15.0 by
@jlowin
in
#3687
​
Breaking Changes ⚠️
Route app tool calls via ___-prefixed names by
@jlowin
in
#3667
​
Enhancements ✨
feat: add
--config-path
flag to claude-desktop install command by
@Sumanshu-Nankana
in
#3380
Support ImageContent and AudioContent in Message class by
@ericrobinson-indeed
in
#3396
Deprecate PromptToolMiddleware and ResourceToolMiddleware by
@jlowin
in
#3389
Block HS* algorithms when JWTVerifier is configured with JWKS by
@jlowin
in
#3419
Remove prek from Marvin workflows by
@jlowin
in
#3444
Add dependency version compatibility guidance to code-review skill by
@jlowin
in
#3475
Remove “good first issue” label by
@jlowin
in
#3482
Cache component lists in ProxyProvider by
@jlowin
in
#3479
Support logging/setLevel and add client_log_level by
@jlowin
in
#3491
Propagate x-fastmcp-wrap-result in tool result _meta by
@jlowin
in
#3490
feat(auth): add external_consent param to suppress misleading warning by
@mtthidoteu
in
#3473
Add
verify
parameter for SSL certificate configuration by
@jlowin
in
#3487
Expose minimum_check_interval, reduce task pickup latency by
@jlowin
in
#3500
Fix test timeouts, suppress deprecation warnings, speed up auth tests by
@jlowin
in
#3504
Auto-close upgrade check issue when build passes by
@jlowin
in
#3505
feat: make upstream_client_secret optional in OAuthProxy by
@jlowin
in
#3486
Add security label to triage workflow and release notes by
@jlowin
in
#3516
Claude/review contributor guidelines by
@jlowin
in
#3517
pin pydantic-monty to 0.0.8 by
@jlowin
in
#3539
Support ImageContent and AudioContent in sampling handlers by
@jlowin
in
#3550
Graceful degradation for multi-server proxy setup by
@jlowin
in
#3546
Extract TokenCache utility, add caching to GitHubTokenVerifier by
@jlowin
in
#3547
Add review-pr skill for Codex bot workflow by
@jlowin
in
#3552
Add MCP message inspector to dev apps UI by
@jlowin
in
#3570
Comprehensive MCP Apps docs, string CallTool resolution by
@jlowin
in
#3575
Replace UUID global keys with (app_name, tool_name) registry by
@jlowin
in
#3585
Route app tool calls through provider chain by
@jlowin
in
#3587
Dev apps: show more/less for long tool descriptions by
@jlowin
in
#3600
Apps Phase 1: docs, examples, app-only tool filtering by
@jlowin
in
#3593
Forward enable_cimd to OAuthProxy in all provider subclasses by
@jlowin
in
#3608
Tune too-long triage heuristic by
@jlowin
in
#3610
Update ty ignore comments for 0.0.25 compatibility by
@jlowin
in
#3614
Move app modules to fastmcp.apps package by
@jlowin
in
#3616
Tighten too-long heuristic for design-document issues by
@jlowin
in
#3620
Run MCP conformance tests by
@strawgate
in
#3628
Add PrefabAppConfig for customizable Prefab tool setup by
@jlowin
in
#3648
Clean error when dev apps ports are in use by
@jlowin
in
#3658
Add Clerk OAuth provider by
@mostafa6765
in
#3677
Add interactive map example with geocoding by
@jlowin
in
#3702
Bump pydantic-monty to 0.0.9 by
@jlowin
in
#3707
Add forward_resource flag to OAuthProxy by
@jlowin
in
#3711
​
Security 🔒
fix: enforce per-tool auth checks in sampling tool wrapper by
@jlowin
in
#3494
fix: handle re.error from malformed URI templates by
@jlowin
in
#3501
fix: reject empty/OIDC-only required_scopes in AzureProvider by
@jlowin
in
#3503
fix: restrict $ref resolution to local refs only (SSRF/LFI) by
@jlowin
in
#3502
fix: URL-encode path params to prevent SSRF/path traversal (GHSA-vv7q-7jx5-f767) by
@jlowin
in
#3507
fix: prevent path traversal in skill download by
@jlowin
in
#3493
fix: prefer IdP-granted scopes over client-requested scopes in OAuthProxy by
@jlowin
in
#3492
fix: remove forced follow_redirects from httpx_client_factory calls by
@jlowin
in
#3496
Bump PyJWT >= 2.12.0 (CVE-2026-32597) by
@jlowin
in
#3515
Drop diskcache from examples/testing_demo lockfile (CVE-2025-69872) by
@jlowin
in
#3518
fix: CSRF double-submit cookie check in consent flow by
@jlowin
in
#3519
fix: validate server names in install commands by
@jlowin
in
#3522
fix: reject refresh tokens used as Bearer access tokens by
@jlowin
in
#3524
fix: route ResourcesAsTools/PromptsAsTools through server middleware by
@jlowin
in
#3495
​
Fixes 🐞
Update docs banner and fix mobile layout by
@jlowin
in
#3370
Remove form-action from consent CSP, forward consent_csp_policy in providers by
@jlowin
in
#3372
Fix resource templates with query params on mounted servers by
@jlowin
in
#3373
Increase uv transport test timeout for CI cold starts by
@jlowin
in
#3376
Fix stale catalog in CodeMode execute by
@jlowin
in
#3375
Deduplicate versioned tools in CatalogTransform catalog by
@jlowin
in
#3374
Fix ty 0.0.20 compatibility by
@jlowin
in
#3377
Forward scopes_supported through RemoteAuthProvider subclasses by
@jlowin
in
#3388
Enforce token scopes in WorkOS verifier to prevent scope bypass by
@jlowin
in
#3407
Bind Discord token verification to configured client_id by
@jlowin
in
#3405
Return after
McpError
in initialization middleware to prevent fallthrough by
@jlowin
in
#3413
Escape client_id in OAuth consent advanced details by
@jlowin
in
#3418
Bound client auto-pagination loops to prevent unbounded list fetches by
@jlowin
in
#3411
Raise ValueError for invalid boolean query params in resource templates by
@jlowin
in
#3434
Validate workspace path is a directory in cursor install by
@jlowin
in
#3435
Validate version metadata to reject non-scalar types by
@jlowin
in
#3437
Bind AWS Cognito token verification to configured app client by
@jlowin
in
#3406
Avoid stale context leakage when proxying with an already‑connected ProxyClient by
@jlowin
in
#3408
Prevent skills manifests from hashing files outside the skill directory by
@jlowin
in
#3410
Harden fastmcp metadata parsing in proxy paths by
@jlowin
in
#3412
Re-hash response caching keys to avoid persisting raw request input by
@jlowin
in
#3414
Handle Windows npx detection when npx.cmd is missing by
@jlowin
in
#3416
Guard OAuth callback result from post-completion overwrites by
@jlowin
in
#3417
Fix tool argument rename collisions with passthrough params by
@jlowin
in
#3431
Guard default progress handler against total=0 notifications by
@jlowin
in
#3432
Fix get_* returning None when latest version is disabled by
@jlowin
in
#3439
Fix server lifespan overlap teardown by
@jlowin
in
#3415
Fix $ref output schema object detection regression by
@jlowin
in
#3420
Preserve kw-only defaults when rebuilding functions for resolved annotations by
@jlowin
in
#3429
Redact sensitive headers in OpenAPI provider debug logging by
@jlowin
in
#3436
Fix async partial callables rejected by iscoroutinefunction by
@jlowin
in
#3438
Block insecure HS* JWT verification with JWKS/public keys by
@jlowin
in
#3430
Sanitize untrusted output in
fastmcp list
and
fastmcp call
by
@jlowin
in
#3409
fix: propagate
version
to components in FileSystemProvider by
@martimfasantos
in
#3458
fix: use intent-based flag for OIDC scope patch in load_access_token by
@voidborne-d
in
#3465
Set readOnlyHint=True on ResourcesAsTools generated tools by
@jlowin
in
#3476
fix: normalize Google scope shorthands and surface valid_scopes by
@jlowin
in
#3477
fix: resolve ty 0.0.23 type-checking errors by
@jlowin
in
#3481
fix: shield lifespan teardown from cancellation by
@jlowin
in
#3480
fix: forward custom_route endpoints from mounted servers by
@voidborne-d
in
#3462
fix: use dynamic version in CLI help text instead of hardcoded 2.0 by
@saschabuehrle
in
#3456
Fix Monty 0.0.8 compatibility by
@hkc5
in
#3468
Fix task test teardown hanging 5s per test by
@jlowin
in
#3499
fix: validate workspace path is a directory before cursor install by
@nightcityblade
in
#3440
Treat
refresh_expires_in=0
as missing, fall back to 30-day default by
@jlowin
in
#3514
fix: use raw strings for regex in pytest.raises match by
@jlowin
in
#3523
fix: resolve Pyright “Module is not callable” on @tool, @resource, @prompt decorators by
@jlowin
in
#3540
fix: flaky KEY_PREFIX warning test in lowest-direct deps by
@jlowin
in
#3549
fix: suppress output schema for ToolResult subclass annotations by
@jlowin
in
#3548
Bump anthropic minimum to 0.48.0 by
@jlowin
in
#3553
Update startup banner deploy URL to Prefect Horizon by
@zzstoatzz
in
#3557
fix: increase sleep duration in proxy cache tests by
@strawgate
in
#3567
fix: store absolute token expiry to prevent stale expires_in on reload by
@jlowin
in
#3572
fix: preserve tool properties named ‘title’ during schema compression by
@jlowin
in
#3582
Add
encoding
parameter to
FileResource
by
@shulkx
in
#3580
Transparently refresh upstream token in OAuthProxy.load_access_token() by
@jlowin
in
#3584
Fix loopback redirect URI port matching per RFC 8252 §7.3 by
@radoshi
in
#3589
Fix app tool routing: visibility check and middleware propagation by
@jlowin
in
#3591
Fix query parameter serialization to respect OpenAPI explode setting by
@jlowin
in
#3595
Fix dev apps form: union types, textarea support, JSON parsing by
@jlowin
in
#3597
Respect OpenAPI content type in request body serialization by
@jlowin
in
#3611
fix(google): replace deprecated /oauth2/v1/tokeninfo with /oauth2/v3/userinfo by
@shigechika
in
#3603
fix: resolve EntraOBOToken dependency injection through MultiAuth by
@jer805
in
#3609
fix: filesystem provider import machinery by
@strawgate
in
#3626
fix: recover StdioTransport after subprocess exits by
@strawgate
in
#3630
fix(server): preserve mounted tool task metadata by
@pandego
in
#3632
fix: scope deprecation warning filter to FastMCPDeprecationWarning by
@jlowin
in
#3649
fix: resolve CurrentFastMCP/ctx.fastmcp to child server in mounted background tasks by
@jlowin
in
#3651
Fix blocking docs issues: chart imports, Select API, Rx consistency by
@jlowin
in
#3652
Fix prompt caching round-trip on cache miss by
@strawgate
in
#3666
fix: serialize object query params per OpenAPI style/explode rules by
@4444J99
in
#3662
fix: HTTP request headers not accessible in background task workers by
@pandego
in
#3631
fix: restore HTTP headers in worker execution path for background tasks by
@jlowin
in
#3681
fix: strip discriminator after dereferencing schemas by
@jlowin
in
#3682
fix: remove stale ty:ignore directives for ty 0.0.26 by
@jlowin
in
#3684
fix: dev apps log panel UX improvements by
@jlowin
in
#3698
Add quiz example app, fix dev server empty string args by
@jlowin
in
#3700
​
Docs 📚
Add early-development warning to Prefab docs by
@jlowin
in
#3362
Add tag to docs by
@jlowin
in
#3382
Add settings and environment variables reference by
@jlowin
in
#3384
Add contributing guidelines and update issue/PR templates by
@jlowin
in
#3485
[Documentation] Move stateless_http transport kwarg to http_app as FastMCP constructo… by
@mhallo
in
#3510
Update security policy by
@jlowin
in
#3521
Add release instructions to CLAUDE.md by
@jlowin
in
#3583
fix(docs): correct misleading stateless_http header by
@jlowin
in
#3622
Add tag to deployment pages by
@jlowin
in
#3624
Docs: generative UI page, fix imports, add PrefabAppConfig by
@jlowin
in
#3650
docs: improve contributor guidelines for framework contributions by
@jlowin
in
#3653
Add release notes for v3.1.0, v3.1.1, and v2.14.6 by
@jlowin
in
#3659
Docs: showcase hero, narrative improvements, panel closed by default by
@jlowin
in
#3657
Docs: add FileTreeStore sanitization warnings and update examples by
@strawgate
in
#3661
Add prefab-ui version pinning warning to docs by
@jlowin
in
#3688
Reorganize apps overview TOC by
@jlowin
in
#3689
Fix docs gaps in app provider pages by
@jlowin
in
#3690
Polish apps docs for 3.2 release by
@jlowin
in
#3693
Add apps quickstart tutorial by
@jlowin
in
#3695
Improve quickstart: pie chart, interactive row selection, screenshots by
@jlowin
in
#3699
Add sales dashboard and live system monitor examples, bump prefab-ui to 0.17 by
@jlowin
in
#3696
Add examples gallery page by
@jlowin
in
#3705
docs: note that custom routes are unauthenticated by
@jlowin
in
#3706
Remove hardcoded prefab-ui version from pinning warnings by
@jlowin
in
#3708
​
Examples & Contrib 💡
Block recursive self-invocation in BulkToolCaller by
@jlowin
in
#3433
​
Dependencies 📦
Bump authlib from 1.6.6 to 1.6.7 in /examples/testing_demo in the uv group across 1 directory by
@dependabot
in
#3390
Bump actions/create-github-app-token from 2 to 3 by
@dependabot
in
#3511
chore(deps): bump pyasn1 from 0.6.2 to 0.6.3 in the uv group across 1 directory by
@dependabot
in
#3538
chore(deps): bump j178/prek-action from 1 to 2 by
@dependabot
in
#3578
chore(deps): bump requests from 2.32.5 to 2.33.0 in the uv group across 1 directory by
@dependabot
in
#3638
chore(deps): bump cryptography from 46.0.5 to 46.0.6 in /examples/testing_demo in the uv group across 1 directory by
@dependabot
in
#3685
chore(deps): bump actions/setup-node from 4 to 6 by
@dependabot
in
#3691
​
New Contributors
@Sumanshu-Nankana made their first contribution in
#3380
@ericrobinson-indeed made their first contribution in
#3396
@voidborne-d made their first contribution in
#3465
@mtthidoteu made their first contribution in
#3473
@saschabuehrle made their first contribution in
#3456
@hkc5 made their first contribution in
#3468
@nightcityblade made their first contribution in
#3440
@mhallo made their first contribution in
#3510
@radoshi made their first contribution in
#3589
@shigechika made their first contribution in
#3603
@pandego made their first contribution in
#3632
@4444J99 made their first contribution in
#3662
@mostafa6765 made their first contribution in
#3677
Full Changelog
:
v3.1.0…v3.2.0
​
v3.1.1
2026-03-14
v3.1.1: ‘Tis But a Patch
Pins
pydantic-monty
below 0.0.8 to fix a breaking change in Monty that affects code mode. Monty 0.0.8 removed the
external_functions
constructor parameter, causing
MontySandboxProvider
to fail. This patch caps the version so existing installs work correctly.
​
Fixes 🐞
Pin pydantic-monty below 0.0.8 to fix code mode by
@jlowin
in
#3497
Full Changelog
:
v3.1.0…v3.1.1
​
v3.1.0
2026-03-03
v3.1.0: Code to Joy
FastMCP 3.1 is the Code Mode release. The 3.0 architecture introduced providers and transforms as the extensibility layer — 3.1 puts that architecture to work, shipping the most requested capability since launch: servers that can find and execute code on behalf of agents, without requiring clients to know what tools exist.
​
New Features 🎉
feat: Search transforms for tool discovery by
@jlowin
in
#3154
Add experimental CodeMode transform by
@aaazzam
in
#3297
Add Prefab Apps integration for MCP tool UIs by
@jlowin
in
#3316
​
Enhancements 🔧
Lazy-load heavy imports to reduce import time by
@jlowin
in
#3295
Add http_client parameter to all token verifiers for connection pooling by
@jlowin
in
#3300
Add in-memory caching for token introspection results by
@jlowin
in
#3298
Add SessionStart hook to install gh CLI in cloud sessions by
@jlowin
in
#3308
Fix ty 0.0.19 type errors by
@jlowin
in
#3310
Code Mode: Add resource limits to MontySandboxProvider by
@jlowin
in
#3326
Accept transforms as FastMCP init kwarg by
@jlowin
in
#3324
Split large test files to comply with loq line limit by
@jlowin
in
#3328
Add -m/—module flag to
fastmcp run
and
dev inspector
by
@dgenio
in
#3331
Add search_result_serializer hook and serialize_tools_for_output_markdown by
@MagnusS0
in
#3337
Add MultiAuth for composing multiple token verification sources by
@jlowin
in
#3335
Adds PropelAuth as an AuthProvider by
@andrew-propelauth
in
#3358
Replace vendored DI with uncalled-for by
@chrisguidry
in
#3301
Decompose CodeMode into composable discovery tools by
@jlowin
in
#3354
feat(contrib): auto-sync MCPMixin decorators with from_function signatures by
@AnkeshThakur
in
#3323
Add Google GenAI Sampling Handler by
@strawgate
in
#2977
Add ListTools, search limit, and catalog size annotation to CodeMode by
@jlowin
in
#3359
Allow configuring FastMCP transport setting in the same way as other configuration by
@jvdmr
in
#1796
Add include_unversioned option to VersionFilter by
@yangbaechu
in
#3349
​
Fixes 🐞
Fix docs banner pushing nav down by
@jlowin
in
#3282
fix: Replace hardcoded TTL with DEFAULT_TTL_MS - issue #3279 by
@cedric57
in
#3280
fix: stop suppressing server stderr in fastmcp call by
@jlowin
in
#3283
fix: skip max_completion_tokens when maxTokens is None by
@eon01
in
#3284
OpenAPI: rewrite $ref under propertyNames and patternProperties in _replace_ref_with_defs; add regression test for dict[StrEnum, Model] by
@manojPal23234
in
#3306
Remove stale add_resource() key parameter from docs by
@jlowin
in
#3309
Handle AuthorizationError as exclusion in AuthMiddleware list hooks by
@yangbaechu
in
#3338
Fix flaky OpenAPI performance test threshold by
@jlowin
in
#3355
Fix flaky SSE timeout test by
@jlowin
in
#3343
Remove system role references from docs by
@jlowin
in
#3356
Fix session persistence across tool calls in multi-server MCPConfigTransport by
@jer805
in
#3330
​
Docs 📚
Add v3.0.2 release notes by
@jlowin
in
#3276
Fix “FastMCP Constructor Parameters” in documentation server.mdx (Remove old parameters & Add new parameter) by
@wangyy04
in
#3317
Fix stale docs: tag filtering API and missing output_schema param by
@jlowin
in
#3322
Narrate search example clients by
@jlowin
in
#3321
Code Mode: Document resource limits and fix docs formatting by
@jlowin
in
#3327
Add reverse proxy (nginx) section to HTTP deployment docs by
@dgenio
in
#3344
Restructure docs navigation: CLI section, Composition, More by
@jlowin
in
#3361
​
Other Changes 🦾
Don’t advertise sampling.tools capability by default by
@jlowin
in
#3334
​
New Contributors
@cedric57 made their first contribution in
#3280
@eon01 made their first contribution in
#3284
@manojPal23234 made their first contribution in
#3306
@wangyy04 made their first contribution in
#3317
@yangbaechu made their first contribution in
#3338
@andrew-propelauth made their first contribution in
#3358
@jer805 made their first contribution in
#3330
@jvdmr made their first contribution in
#1796
Full Changelog
:
v3.0.2…v3.1.0
​
v3.0.2
2026-02-22
v3.0.2: Threecovery Mode II
Two community-contributed fixes: auth headers from MCP transport no longer leak through to downstream OpenAPI APIs, and background task workers now correctly receive the originating request ID. Plus a new docs example for context-aware tool factories.
​
Fixes 🐞
fix: prevent MCP transport auth header from leaking to downstream OpenAPI APIs by
@stakeswky
in
#3262
fix: propagate origin_request_id to background task workers by
@gfortaine
in
#3175
​
Docs 📚
Add v3.0.1 release notes by
@jlowin
in
#3259
docs: add context-aware tool factory example by
@machov
in
#3264
Full Changelog
:
v3.0.1…v3.0.2
​
v3.0.1
2026-02-20
v3.0.1: Three-covery Mode
First patch after 3.0 — mostly smoothing out rough edges discovered in the wild. The big ones: middleware state that wasn’t surviving the trip to tool handlers now does,
Tool.from_tool()
accepts callables again, OpenAPI schemas with circular references no longer crash discovery, and decorator overloads now return the correct types in function mode. Also adds
verify_id_token
to OIDCProxy for providers (like some Azure AD configs) that issue opaque access tokens but standard JWT id_tokens.
​
Enhancements 🔧
Add verify_id_token option to OIDCProxy by
@jlowin
in
#3248
​
Fixes 🐞
Fix v3.0.0 changelog compare link by
@jlowin
in
#3223
Fix MDX parse error in upgrade guide prompts by
@jlowin
in
#3227
Fix non-serializable state lost between middleware and tools by
@jlowin
in
#3234
Accept callables in Tool.from_tool() by
@jlowin
in
#3235
Preserve skill metadata through provider wrapping by
@jlowin
in
#3237
Fix circular reference crash in OpenAPI schemas by
@jlowin
in
#3245
Fix NameError with future annotations and Context/Depends parameters by
@jlowin
in
#3243
Fix ty ignore syntax in OpenAPI provider by
@jlowin
in
#3253
Use max_completion_tokens instead of deprecated max_tokens in OpenAI handler by
@jlowin
in
#3254
Fix ty compatibility with upgraded deps by
@jlowin
in
#3257
Fix decorator overload return types for function mode by
@jlowin
in
#3258
​
Docs 📚
Sync README with welcome.mdx, fix install count by
@jlowin
in
#3224
Document dict-to-Message prompt migration in upgrade guides by
@jlowin
in
#3225
Fix v2 upgrade guide: remove incorrect v1 import advice by
@jlowin
in
#3226
Animated banner by
@jlowin
in
#3231
Document mounted server state store isolation in upgrade guide by
@jlowin
in
#3236
Full Changelog
:
v3.0.0…v3.0.1
​
v3.0.0
2026-02-18
v3.0.0: Three at Last
FastMCP 3.0 is stable. Two betas, two release candidates, 21 new contributors, and more than 100,000 pre-release installs later — the architecture held up, the upgrade path was smooth, and we’re shipping it.
The surface API is largely unchanged —
@mcp.tool()
still works exactly as before. What changed is everything underneath: a provider/transform architecture that makes FastMCP extensible, observable, and composable in ways v2 couldn’t support. If we did our jobs right, you’ll barely notice the redesign. You’ll just notice that more is possible.
This is also the release where FastMCP moves from
jlowin/fastmcp
to
PrefectHQ/fastmcp
. GitHub forwards all links, PyPI is the same, imports are the same. A major version felt like the right moment to make it official.
​
Build servers from anything
🔌 Components no longer have to live in one file with one server.
FileSystemProvider
discovers tools from directories with hot-reload.
OpenAPIProvider
wraps REST APIs.
ProxyProvider
proxies remote MCP servers.
SkillsProvider
delivers agent skills as 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.
​
Ship to production
🔐 Component versioning: serve
@tool(version="2.0")
alongside older versions from one codebase. Granular authorization on individual components with async auth checks, server-wide policies via
AuthMiddleware
, and scope-based access control. OAuth gets CIMD, Static Client Registration, Azure OBO via dependency injection, JWT audience validation, and confused-deputy protections. OpenTelemetry tracing with MCP semantic conventions. Response size limiting. Background tasks 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.
​
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 after authentication, progressively reveal capabilities, or scope access by role.
​
Develop faster
⚡
--reload
auto-restarts on file changes. Standalone decorators return the original function, so decorated tools stay callable in tests and non-MCP contexts. Sync functions auto-dispatch to a threadpool. Tool timeouts, MCP-compliant pagination, composable lifespans,
PingMiddleware
for keepalive, and concurrent tool execution when the LLM returns multiple calls in one response.
​
Use FastMCP as a CLI
🖥️
fastmcp list
and
fastmcp call
query and invoke tools on any server from a terminal.
fastmcp discover
scans your editor configs (Claude Desktop, Cursor, Goose, Gemini CLI) and finds configured servers by name.
fastmcp generate-cli
writes a standalone typed CLI where every tool is a subcommand.
fastmcp install
registers your server with Claude Desktop, Cursor, or Goose in one command.
​
Build apps (3.1 preview)
📱 Spec-level support for MCP Apps is in:
ui://
resource scheme, typed UI metadata via
AppConfig
, extension negotiation, and runtime detection. The full Apps experience lands in 3.1.
If you hit 3.0 because you didn’t pin your dependencies and something breaks — the
upgrade guides
will get you sorted. We minimized breaking changes, but a major version is a major version.
pip
install
fastmcp
-U
📖
Documentation
🚀
Upgrade from FastMCP v2
🔀
Upgrade from MCP Python SDK
​
What’s Changed
​
New Features 🎉
Refactor resource behavior and add meta support by
@jlowin
in
#2611
Refactor prompt behavior and add meta support by
@jlowin
in
#2610
feat: Provider abstraction for dynamic MCP components by
@jlowin
in
#2622
Unify component storage in LocalProvider by
@jlowin
in
#2680
Introduce ResourceResult as canonical resource return type by
@jlowin
in
#2734
Introduce Message and PromptResult as canonical prompt types by
@jlowin
in
#2738
Add —reload flag for auto-restart on file changes by
@jlowin
in
#2816
Add FileSystemProvider for filesystem-based component discovery by
@jlowin
in
#2823
Add standalone decorators and eliminate fastmcp.fs module by
@jlowin
in
#2832
Add authorization checks to components and servers by
@jlowin
in
#2855
Decorators return functions instead of component objects by
@jlowin
in
#2856
Add transform system for modifying components in provider chains by
@jlowin
in
#2836
Add OpenTelemetry tracing support by
@chrisguidry
in
#2869
Add component versioning and VersionFilter transform by
@jlowin
in
#2894
Add version discovery and calling a certain version for components by
@jlowin
in
#2897
Refactor visibility to mark-based enabled system by
@jlowin
in
#2912
Add session-specific visibility control via Context by
@jlowin
in
#2917
Add Skills Provider for exposing agent skills as MCP resources by
@jlowin
in
#2944
Add MCP Apps Phase 1 — SDK compatibility (SEP-1865) by
@jlowin
in
#3009
Add
fastmcp list
and
fastmcp call
CLI commands by
@jlowin
in
#3054
Add
fastmcp generate-cli
command by
@jlowin
in
#3065
Add CIMD (Client ID Metadata Document) support for OAuth by
@jlowin
in
#2871
​
Enhancements 🔧
Convert mounted servers to MountedProvider by
@jlowin
in
#2635
Simplify .key as computed property by
@jlowin
in
#2648
Refactor MountedProvider into FastMCPProvider + TransformingProvider by
@jlowin
in
#2653
Enable background task support for custom component subclasses by
@jlowin
in
#2657
Use CreateTaskResult for background task creation by
@jlowin
in
#2660
Refactor provider execution: components own their execution by
@jlowin
in
#2663
Add supports_tasks() method to replace string mode checks by
@jlowin
in
#2664
Replace type: ignore[attr-defined] with isinstance assertions in tests by
@jlowin
in
#2665
Add poll_interval to TaskConfig by
@jlowin
in
#2666
Refactor task module: rename protocol.py to requests.py and reduce redundancy by
@jlowin
in
#2667
Refactor FastMCPProxy into ProxyProvider by
@jlowin
in
#2669
Move OpenAPI to providers/openapi submodule by
@jlowin
in
#2672
Use ergonomic provider initialization pattern by
@jlowin
in
#2675
Fix ty 0.0.5 type errors by
@jlowin
in
#2676
Remove execution methods from Provider base class by
@jlowin
in
#2681
Add type-prefixed keys for globally unique component identification by
@jlowin
in
#2704
Consolidate notification system with unified API by
@jlowin
in
#2710
Parallelize provider operations by
@jlowin
in
#2716
Consolidate get_* and
list
* methods into single API by
@jlowin
in
#2719
Consolidate execution method chains into single public API by
@jlowin
in
#2728
Parallelize list_* calls in Provider.get_tasks() by
@jlowin
in
#2731
Consistent decorator-based MCP handler registration by
@jlowin
in
#2732
Make ToolResult a BaseModel for serialization support by
@jlowin
in
#2736
Align prompt handler with resource pattern by
@jlowin
in
#2740
Update classes to inherit from FastMCPBaseModel instead of BaseModel by
@jlowin
in
#2739
Add explicit task_meta parameter to FastMCP.call_tool() by
@jlowin
in
#2749
Add task_meta parameter to read_resource() for explicit task control by
@jlowin
in
#2750
Add task_meta to prompts and centralize fn_key enrichment by
@jlowin
in
#2751
Remove unused include_tags/exclude_tags settings by
@jlowin
in
#2756
Parallelize provider access when executing components by
@jlowin
in
#2744
Deprecate tool_serializer parameter by
@jlowin
in
#2753
Feature/supabase custom auth route by
@EloiZalczer
in
#2632
Remove deprecated WSTransport by
@jlowin
in
#2826
Add composable lifespans by
@jlowin
in
#2828
Replace FastMCP.as_proxy() with create_proxy() function by
@jlowin
in
#2829
Add PingMiddleware for keepalive connections by
@jlowin
in
#2838
Run sync tools/resources/prompts in threadpool automatically by
@jlowin
in
#2865
Add timeout parameter for tool foreground execution by
@jlowin
in
#2872
Adopt OpenTelemetry MCP semantic conventions by
@chrisguidry
in
#2886
Add client_secret_post authentication to IntrospectionTokenVerifier by
@shulkx
in
#2884
Add enable_rich_logging setting to disable rich formatting by
@strawgate
in
#2893
Rename _fastmcp metadata namespace to fastmcp and make non-optional by
@jlowin
in
#2895
Refactor FastMCP to inherit from Provider by
@jlowin
in
#2901
Swap public/private method naming in Provider by
@jlowin
in
#2902
Add MCP-compliant pagination support by
@jlowin
in
#2903
Support VersionSpec in enable/disable for range-based filtering by
@jlowin
in
#2914
Immutable transform wrapping for providers by
@jlowin
in
#2913
Unify discovery API: deduplicate at protocol layer only by
@jlowin
in
#2919
Add ResourcesAsTools transform by
@jlowin
in
#2943
Add PromptsAsTools transform by
@jlowin
in
#2946
Rename Enabled transform to Visibility by
@jlowin
in
#2950
feat: option to add upstream claims to the FastMCP proxy JWT by
@JonasKs
in
#2997
fix: automatically include offline_access as a scope in the Azure provider by
@JonasKs
in
#3001
feat: expand —reload to watch frontend file types by
@jlowin
in
#3028
Add
fastmcp install stdio
command by
@jlowin
in
#3032
feat: Goose integration + dedicated install command by
@jlowin
in
#3040
Add
fastmcp discover
and name-based server resolution by
@jlowin
in
#3055
feat(context): Add background task support for Context by
@gfortaine
in
#2905
Add server version to banner by
@richardkmichael
in
#3076
Add @handle_tool_errors decorator for standardized error handling by
@dgenio
in
#2885
Add ResponseLimitingMiddleware for tool response size control by
@dgenio
in
#3072
Infer MIME types from OpenAPI response definitions by
@jlowin
in
#3101
Remove require_auth in favor of scope-based authorization by
@jlowin
in
#3103
generate-cli: auto-generate SKILL.md agent skill by
@jlowin
in
#3115
Add Azure OBO dependencies, auth token injection, and documentation by
@jlowin
in
#2918
feat: add Static Client Registration by
@martimfasantos
in
#3086
Add concurrent tool execution with sequential flag by
@strawgate
in
#3022
Add validate_output option for OpenAPI tools by
@jlowin
in
#3134
Relay task elicitation through standard MCP protocol by
@chrisguidry
in
#3136
Support async auth checks by
@jlowin
in
#3152
Make $ref dereferencing optional via FastMCP(dereference_refs=…) by
@jlowin
in
#3151
Expose local_provider property, deprecate FastMCP.remove_tool() by
@jlowin
in
#3155
Add helpers for converting FunctionTool and TransformedTool to SamplingTool by
@strawgate
in
#3062
​
Fixes 🐞
Let FastMCPError propagate from dependencies by
@chrisguidry
in
#2646
Fix task execution for tools with custom names by
@chrisguidry
in
#2645
fix: check the cause of the tool error by
@rjolaverria
in
#2674
Fix uvicorn 0.39+ test timeouts and FastMCPError propagation by
@jlowin
in
#2699
Fix: resolve root-level $ref in outputSchema for MCP spec compliance by
@majiayu000
in
#2720
Fix Proxy provider to return all resource contents by
@jlowin
in
#2742
fix: Client OAuth async_auth_flow() method causing MCP-SDK lock error by
@lgndluke
in
#2644
Fix rate limit detection during teardown phase by
@jlowin
in
#2757
Fix OAuth Proxy resource parameter validation by
@jlowin
in
#2764
Fix
openapi_version
check so 3.1 is included by
@deeleeramone
in
#2768
Fix base_url fallback when url is not set by
@bhbs
in
#2776
Lazy import DiskStore to avoid sqlite3 dependency on import by
@jlowin
in
#2784
Fix OAuth token storage TTL calculation by
@jlowin
in
#2796
Fix client hanging on HTTP 4xx/5xx errors by
@jlowin
in
#2803
Fix keep_alive passthrough in StdioMCPServer.to_transport() by
@jlowin
in
#2791
Dereference $ref in tool schemas for MCP client compatibility by
@jlowin
in
#2808
Fix timeout not propagating to proxy clients in multi-server MCPConfig by
@jlowin
in
#2809
Fix ContextVar propagation for ASGI-mounted servers with tasks by
@chrisguidry
in
#2844
Fix HTTP transport timeout defaulting to 5 seconds by
@jlowin
in
#2849
Fix task capabilities location (issue #2870) by
@jlowin
in
#2875
fix: broaden combine_lifespans type to accept Mapping return types by
@aminsamir45
in
#3005
fix: correctly send resource when exchanging code for upstream by
@JonasKs
in
#3013
chore: upgrade python-multipart to 0.0.22 (CVE-2026-24486) by
@jlowin
in
#3042
chore: upgrade protobuf to 6.33.5 (CVE-2026-0994) by
@jlowin
in
#3043
fix: use MCP spec error code -32002 for resource not found by
@jlowin
in
#3041
Fix tool_choice reset for structured output sampling by
@strawgate
in
#3014
fix: Preserve metadata in FastMCPProvider component wrappers by
@NeelayS
in
#3057
fix: enforce redirect URI validation when allowed_client_redirect_uris is supplied by
@nathanwelsh8
in
#3066
Fix —reload port conflict when using explicit port by
@jlowin
in
#3070
Fix compress_schema to preserve additionalProperties: false by
@jlowin
in
#3102
Fix CIMD redirect allowlist bypass and cache revalidation by
@jlowin
in
#3098
Fix session visibility marks leaking across sessions by
@jlowin
in
#3132
Fix unhandled exceptions in OpenAPI POST tool calls by
@jlowin
in
#3133
feat: distributed notification queue + BLPOP elicitation for background tasks by
@gfortaine
in
#2906
fix: snapshot access token for background tasks by
@gfortaine
in
#3138
fix: guard client pagination loops against misbehaving servers by
@jlowin
in
#3167
Support non-serializable values in Context.set_state by
@jlowin
in
#3171
Fix stale request context in StatefulProxyClient handlers by
@jlowin
in
#3172
Drop diskcache dependency (CVE-2025-69872) by
@jlowin
in
#3185
Fix confused deputy attack via consent binding cookie by
@jlowin
in
#3201
Add JWT audience validation and RFC 8707 warnings to auth providers by
@jlowin
in
#3204
Cache OBO credentials on AzureProvider for token reuse by
@jlowin
in
#3212
Fix invalid uv add command in upgrade guide by
@jlowin
in
#3217
Use standard traceparent/tracestate keys per OTel MCP semconv by
@chrisguidry
in
#3221
​
Breaking Changes 🛫
Add VisibilityFilter for hierarchical enable/disable by
@jlowin
in
#2708
Remove automatic environment variable loading from auth providers by
@jlowin
in
#2752
Make pydocket optional and unify DI systems by
@jlowin
in
#2835
Add session-scoped state persistence by
@jlowin
in
#2873
Rename ui= to app= and consolidate ToolUI/ResourceUI into AppConfig by
@jlowin
in
#3117
Remove deprecated FastMCP() constructor kwargs by
@jlowin
in
#3148
Move
fastmcp dev
to
fastmcp dev inspector
by
@jlowin
in
#3188
​
New Contributors
@ivanbelenky
made their first contribution in
#2656
@rjolaverria
made their first contribution in
#2674
@mgoldsborough
made their first contribution in
#2701
@Ashif4354
made their first contribution in
#2707
@majiayu000
made their first contribution in
#2720
@lgndluke
made their first contribution in
#2644
@EloiZalczer
made their first contribution in
#2632
@deeleeramone
made their first contribution in
#2768
@shea-parkes
made their first contribution in
#2781
@bryankthompson
made their first contribution in
#2777
@bhbs
made their first contribution in
#2776
@shulkx
made their first contribution in
#2884
@abhijeethp
made their first contribution in
#2967
@aminsamir45
made their first contribution in
#3005
@JonasKs
made their first contribution in
#2997
@NeelayS
made their first contribution in
#3057
@gfortaine
made their first contribution in
#2905
@nathanwelsh8
made their first contribution in
#3066
@dgenio
made their first contribution in
#2885
@martimfasantos
made their first contribution in
#3086
@jfBiswajit
made their first contribution in
#3193
Full Changelog
:
https://github.com/PrefectHQ/fastmcp/compare/v2.14.5…v3.0.0
​
v3.0.0rc1
2026-02-12
v3.0.0rc1: RC-ing is Believing
FastMCP 3 RC1 means we believe the API is stable. Beta 2 drew a wave of real-world adoption — production deployments, migration reports, integration testing — and the feedback overwhelmingly confirmed that the architecture works. This release closes gaps that surfaced under load: auth flows that needed to be async, background tasks that needed reliable notification delivery, and APIs still carrying beta-era naming. If nothing unexpected surfaces, this is what 3.0.0 looks like.
🚨
Breaking Changes
— The
ui=
parameter is now
app=
with a unified
AppConfig
class (matching the feature’s actual name), and 16
FastMCP()
constructor kwargs have finally been removed. If you’ve been ignoring months of deprecation warnings, you’ll get a
TypeError
with specific migration instructions.
🔐
Auth Improvements
— Three changes that together round out FastMCP’s auth story for production.
auth=
checks can now be
async
, so you can hit databases or external services during authorization — previously, passing an async function silently passed because the unawaited coroutine was truthy. Static Client Registration lets clients provide a pre-registered
client_id
/
client_secret
directly, bypassing DCR for servers that don’t support it. And Azure OBO flows are now declarative via dependency injection:
from
fastmcp
.
server
.
auth
.
providers
.
azure
import
EntraOBOToken
@
mcp
.
tool
()
async
def
get_emails
(
graph_token
:
str
=
EntraOBOToken
([
"
https://graph.microsoft.com/Mail.Read
"
]),
):
# OBO exchange already happened — just use the token
...
⚡
Concurrent Sampling
— When an LLM returns multiple tool calls in a single response,
context.sample()
can now execute them in parallel. Opt in with
tool_concurrency=0
for unlimited parallelism, or set a bound. Tools that aren’t safe to parallelize can declare
sequential=True
.
📡
Background Task Notifications
— Background tasks now reliably push progress updates and elicit user input through the standard MCP protocol. A distributed Redis queue replaces polling (7,200 round-trips/hour → one blocking call), and
ctx.elicit()
in background tasks automatically relays through the client’s standard
elicitation_handler
.
✅
OpenAPI Output Validation
— When backends don’t conform to their own OpenAPI schemas, the MCP SDK rejects the response and the tool fails.
validate_output=False
disables strict schema checking while still passing structured JSON to clients — a necessary escape hatch for imperfect APIs.
​
What’s Changed
​
Enhancements 🔧
generate-cli: auto-generate SKILL.md agent skill by
@jlowin
in
#3115
Scope Martian triage to bug-labeled issues for jlowin by
@jlowin
in
#3124
Add Azure OBO dependencies, auth token injection, and documentation by
@jlowin
in
#2918
feat: add Static Client Registration (#3085) by
@martimfasantos
in
#3086
Add concurrent tool execution with sequential flag by
@strawgate
in
#3022
Add validate_output option for OpenAPI tools by
@jlowin
in
#3134
Relay task elicitation through standard MCP protocol by
@chrisguidry
in
#3136
Bump py-key-value-aio to
>=0.4.0,<0.5.0
by
@strawgate
in
#3143
Support async auth checks by
@jlowin
in
#3152
Make $ref dereferencing optional via FastMCP(dereference_refs=…) by
@jlowin
in
#3151
Expose local_provider property, deprecate FastMCP.remove_tool() by
@jlowin
in
#3155
Add helpers for converting FunctionTool and TransformedTool to SamplingTool by
@strawgate
in
#3062
Updates to github actions / workflows for claude by
@strawgate
in
#3157
​
Fixes 🐞
Updated deprecation URL for V3 by
@SrzStephen
in
#3108
Fix Windows test timeouts in OAuth proxy provider tests by
@strawgate
in
#3123
Fix session visibility marks leaking across sessions by
@jlowin
in
#3132
Fix unhandled exceptions in OpenAPI POST tool calls by
@jlowin
in
#3133
feat: distributed notification queue + BLPOP elicitation for background tasks by
@gfortaine
in
#2906
fix: snapshot access token for background tasks (#3095) by
@gfortaine
in
#3138
Stop duplicating path parameter descriptions into tool prose by
@jlowin
in
#3149
fix: guard client pagination loops against misbehaving servers by
@jlowin
in
#3167
Fix stale get_* references in docs and examples by
@jlowin
in
#3168
Support non-serializable values in Context.set_state by
@jlowin
in
#3171
Fix stale request context in StatefulProxyClient handlers by
@jlowin
in
#3172
​
Breaking Changes 🛫
Rename ui= to app= and consolidate ToolUI/ResourceUI into AppConfig by
@jlowin
in
#3117
Remove deprecated FastMCP() constructor kwargs by
@jlowin
in
#3148
​
Docs 📚
Update docs to reference beta 2 by
@jlowin
in
#3112
docs: add pre-registered OAuth clients to v3-features by
@jlowin
in
#3129
​
Dependencies 📦
chore(deps): bump cryptography from 46.0.3 to 46.0.5 in /examples/testing_demo in the uv group across 1 directory by @dependabot in
#3140
​
Other Changes 🦾
docs: add v3.0.0rc1 features to v3-features tracking by
@jlowin
in
#3145
docs: remove nonexistent MSALApp from rc1 notes by
@jlowin
in
#3146
​
New Contributors
@martimfasantos
made their first contribution in
#3086
Full Changelog
:
https://github.com/PrefectHQ/fastmcp/compare/v3.0.0b2…v3.0.0rc1
​
v3.0.0b2
2026-02-07
v3.0.0b2: 2 Fast 2 Beta
FastMCP 3 Beta 2 reflects the huge number of people that kicked the tires on Beta 1. Seven new contributors landed changes in this release, and early migration reports went smoother than expected, including teams on Prefect Horizon upgrading from v2. Most of Beta 2 is refinement: fixing what people found, filling gaps from real usage, hardening edges. But a few new features did land along the way.
🖥️
Client CLI
—
fastmcp list
,
fastmcp call
,
fastmcp discover
, and
fastmcp generate-cli
turn any MCP server into something you can poke at from a terminal. Discover servers configured in Claude Desktop, Cursor, Goose, or project-level
mcp.json
files and reference them by name.
generate-cli
reads a server’s schemas and writes a standalone typed CLI script where every tool is a proper subcommand with flags and help text.
🔐
CIMD
(Client ID Metadata Documents) adds an alternative to Dynamic Client Registration for OAuth. Clients host a static JSON document at an HTTPS URL; that URL becomes the
client_id
. Server-side support includes SSRF-hardened fetching, cache-aware revalidation, and
private_key_jwt
validation. Enabled by default on
OAuthProxy
.
📱
MCP Apps
— Spec-level compliance for the MCP Apps extension:
ui://
resource scheme, typed UI metadata on tools and resources, extension negotiation, and
ctx.client_supports_extension()
for runtime detection.
⏳
Background Task Context
—
Context
now works transparently in Docket workers.
ctx.elicit()
routes through Redis-based coordination so background tasks can pause for user input without any code changes.
🛡️
ResponseLimitingMiddleware
caps tool response sizes with UTF-8-safe truncation for text and schema-aware error handling for structured outputs.
🪿
Goose Integration
—
fastmcp install goose
generates deeplink URLs for one-command server installation into Goose.
​
What’s Changed
​
New Features 🎉
Add MCP Apps Phase 1 — SDK compatibility (SEP-1865) by
@jlowin
in
#3009
Add
fastmcp list
and
fastmcp call
CLI commands by
@jlowin
in
#3054
Add
fastmcp generate-cli
command by
@jlowin
in
#3065
Add CIMD (Client ID Metadata Document) support for OAuth by
@jlowin
in
#2871
​
Enhancements 🔧
Make duplicate bot less aggressive by
@jlowin
in
#2981
Remove uv lockfile monitoring from Dependabot by
@jlowin
in
#2986
Run static checks with —upgrade, remove lockfile check by
@jlowin
in
#2988
Adjust workflow triggers for Marvin by
@strawgate
in
#3010
Move tests to a reusable action and enable nightly checks by
@strawgate
in
#3017
feat: option to add upstream claims to the FastMCP proxy JWT by
@JonasKs
in
#2997
Fix ty 0.0.14 compatibility and upgrade dependencies by
@jlowin
in
#3027
fix: automatically include offline_access as a scope in the Azure provider to enable automatic token refreshing by
@JonasKs
in
#3001
feat: expand —reload to watch frontend file types by
@jlowin
in
#3028
Add
fastmcp install stdio
command by
@jlowin
in
#3032
Update martian-issue-triage.yml for Workflow editing guidance by
@strawgate
in
#3033
feat: Goose integration + dedicated install command by
@jlowin
in
#3040
Fixing spelling issues in multiple files by
@didier-durand
in
#2996
Add
fastmcp discover
and name-based server resolution by
@jlowin
in
#3055
feat(context): Add background task support for Context (SEP-1686) by
@gfortaine
in
#2905
Add server version to banner by
@richardkmichael
in
#3076
Add @handle_tool_errors decorator for standardized error handling by
@dgenio
in
#2885
Update Anthropic and OpenAI clients to use Omit instead of NotGiven by
@jlowin
in
#3088
Add ResponseLimitingMiddleware for tool response size control by
@dgenio
in
#3072
Infer MIME types from OpenAPI response definitions by
@jlowin
in
#3101
Remove require_auth in favor of scope-based authorization by
@jlowin
in
#3103
​
Fixes 🐞
Fix FastAPI mounting examples in docs by
@jlowin
in
#2962
Remove outdated ‘FastMCP 3.0 is coming!’ CLI banner by
@jlowin
in
#2974
Pin httpx
< 1.0
and simplify beta install docs by
@jlowin
in
#2975
Add enabled field to ToolTransformConfig by
@jlowin
in
#2991
fix phue2 import in smart_home example by
@zzstoatzz
in
#2999
fix: broaden combine_lifespans type to accept Mapping return types by
@aminsamir45
in
#3005
fix: type narrowing for skills resource contents by
@strawgate
in
#3023
fix: correctly send resource when exchanging code for the upstream by
@JonasKs
in
#3013
MCP Apps: structured CSP/permissions types, resource meta propagation fix, QR example by
@jlowin
in
#3031
chore: upgrade python-multipart to 0.0.22 (CVE-2026-24486) by
@jlowin
in
#3042
chore: upgrade protobuf to 6.33.5 (CVE-2026-0994) by
@jlowin
in
#3043
fix: use MCP spec error code -32002 for resource not found by
@jlowin
in
#3041
Fix tool_choice reset for structured output sampling by
@strawgate
in
#3014
Fix workflow notification URL formatting in upgrade checks by
@strawgate
in
#3047
Fix Field() handling in prompts by
@strawgate
in
#3050
fix: use SkipJsonSchema to exclude callable fields from JSON schema generation by
@strawgate
in
#3048
fix: Preserve metadata in FastMCPProvider component wrappers by
@NeelayS
in
#3057
Mock network calls in CLI tests and use MemoryStore for OAuth tests by
@strawgate
in
#3051
Remove OpenAPI timeout parameter, make client optional, surface timeout errors by
@jlowin
in
#3067
fix: enforce redirect URI validation when allowed_client_redirect_uris is supplied by
@nathanwelsh8
in
#3066
Fix —reload port conflict when using explicit port by
@jlowin
in
#3070
Fix compress_schema to preserve additionalProperties: false for MCP compatibility by
@jlowin
in
#3102
Fix CIMD redirect allowlist bypass and cache revalidation by
@jlowin
in
#3098
Exclude content-type from get_http_headers() to prevent HTTP 415 errors by
@jlowin
in
#3104
​
Docs 📚
Prepare docs for v3.0 beta release by
@jlowin
in
#2954
Restructure docs: move transforms to dedicated section by
@jlowin
in
#2956
Remove unnecessary pip warning by
@jlowin
in
#2958
Update example MCP version in installation docs by
@jlowin
in
#2959
Update brand images by
@jlowin
in
#2960
Restructure README and welcome page with motivated narrative by
@jlowin
in
#2963
Restructure README and docs with motivated narrative by
@jlowin
in
#2964
Favicon update and Prefect Horizon docs by
@jlowin
in
#2978
Add dependency injection documentation and DI-style dependencies by
@jlowin
in
#2980
docs: document expanded reload behavior and restructure beta sections by
@jlowin
in
#3039
Add output_schema caveat to response limiting docs by
@jlowin
in
#3099
Document token passthrough security in OAuth Proxy docs by
@jlowin
in
#3100
​
Dependencies 📦
Bump ty from 0.0.12 to 0.0.13 by @dependabot in
#2984
Bump prek from 0.2.30 to 0.3.0 by @dependabot in
#2982
​
Other Changes 🦾
Normalize resource URLs before comparison to support RFC 8707 query parameters by
@abhijeethp
in
#2967
Bump pydocket to 0.17.2 (memory leak fix) by
@chrisguidry
in
#2998
Add AzureJWTVerifier for Managed Identity token verification by
@jlowin
in
#3058
Add release notes for v2.14.4 and v2.14.5 by
@jlowin
in
#3064
Add missing beta2 features to v3 release tracking by
@jlowin
in
#3105
​
New Contributors
@abhijeethp
made their first contribution in
#2967
@aminsamir45
made their first contribution in
#3005
@JonasKs
made their first contribution in
#2997
@NeelayS
made their first contribution in
#3057
@gfortaine
made their first contribution in
#2905
@nathanwelsh8
made their first contribution in
#3066
@dgenio
made their first contribution in
#2885
Full Changelog
:
https://github.com/PrefectHQ/fastmcp/compare/v3.0.0b1…v3.0.0b2
​
v3.0.0b1
2026-01-20
v3.0.0b1: This Beta Work
FastMCP 3.0 rebuilds the framework around three primitives: components, providers, and transforms. Providers source components dynamically—from decorators, filesystems, OpenAPI specs, remote servers, or anywhere else. Transforms modify components as they flow to clients—renaming, namespacing, filtering, securing. The features that required specialized subsystems in v2 now compose naturally from these building blocks.
🔌
Provider Architecture
unifies how components are sourced.
FileSystemProvider
discovers decorated functions from directories with optional hot-reload.
SkillsProvider
exposes agent skill files as MCP resources.
OpenAPIProvider
and
ProxyProvider
get cleaner integrations. Providers are composable—share one across servers, or attach many to one server.
🔄
Transforms
add middleware for components. Namespace mounted servers, rename verbose tools, filter by version, control visibility—all without touching source code.
ResourcesAsTools
and
PromptsAsTools
expose non-tool components to tool-only clients.
📋
Component Versioning
lets you register
@tool(version="2.0")
alongside older versions. Clients see the highest version by default but can request specific versions.
VersionFilter
serves different API versions from one codebase.
💾
Session-Scoped State
persists across requests.
await ctx.set_state()
and
await ctx.get_state()
now survive the full session. Per-session visibility via
ctx.enable_components()
lets servers adapt dynamically to each client.
⚡
DX Improvements
include
--reload
for auto-restart during development, automatic threadpool dispatch for sync functions, tool timeouts, pagination for large component lists, and OpenTelemetry tracing.
🔐
Component Authorization
via
@tool(auth=require_scopes("admin"))
and
AuthMiddleware
for server-wide policies.
Breaking changes are minimal: for most servers, updating the import statement is all you need. See the
migration guide
for details.
​
What’s Changed
​
New Features 🎉
Refactor resource behavior and add meta support by
@jlowin
in
#2611
Refactor prompt behavior and add meta support by
@jlowin
in
#2610
feat: Provider abstraction for dynamic MCP components by
@jlowin
in
#2622
Unify component storage in LocalProvider by
@jlowin
in
#2680
Introduce ResourceResult as canonical resource return type by
@jlowin
in
#2734
Introduce Message and PromptResult as canonical prompt types by
@jlowin
in
#2738
Add —reload flag for auto-restart on file changes by
@jlowin
in
#2816
Add FileSystemProvider for filesystem-based component discovery by
@jlowin
in
#2823
Add standalone decorators and eliminate fastmcp.fs module by
@jlowin
in
#2832
Add authorization checks to components and servers by
@jlowin
in
#2855
Decorators return functions instead of component objects by
@jlowin
in
#2856
Add transform system for modifying components in provider chains by
@jlowin
in
#2836
Add OpenTelemetry tracing support by
@chrisguidry
in
#2869
Add component versioning and VersionFilter transform by
@jlowin
in
#2894
Add version discovery and calling a certain version for components by
@jlowin
in
#2897
Refactor visibility to mark-based enabled system by
@jlowin
in
#2912
Add session-specific visibility control via Context by
@jlowin
in
#2917
Add Skills Provider for exposing agent skills as MCP resources by
@jlowin
in
#2944
​
Enhancements 🔧
Convert mounted servers to MountedProvider by
@jlowin
in
#2635
Simplify .key as computed property by
@jlowin
in
#2648
Refactor MountedProvider into FastMCPProvider + TransformingProvider by
@jlowin
in
#2653
Enable background task support for custom component subclasses by
@jlowin
in
#2657
Use CreateTaskResult for background task creation by
@jlowin
in
#2660
Refactor provider execution: components own their execution by
@jlowin
in
#2663
Add supports_tasks() method to replace string mode checks by
@jlowin
in
#2664
Replace type: ignore[attr-defined] with isinstance assertions in tests by
@jlowin
in
#2665
Add poll_interval to TaskConfig by
@jlowin
in
#2666
Refactor task module: rename protocol.py to requests.py and reduce redundancy by
@jlowin
in
#2667
Refactor FastMCPProxy into ProxyProvider by
@jlowin
in
#2669
Move OpenAPI to providers/openapi submodule by
@jlowin
in
#2672
Use ergonomic provider initialization pattern by
@jlowin
in
#2675
Fix ty 0.0.5 type errors by
@jlowin
in
#2676
Remove execution methods from Provider base class by
@jlowin
in
#2681
Add type-prefixed keys for globally unique component identification by
@jlowin
in
#2704
Skip parallel MCP config test on Windows by
@jlowin
in
#2711
Consolidate notification system with unified API by
@jlowin
in
#2710
Skip test_multi_client on Windows by
@jlowin
in
#2714
Parallelize provider operations by
@jlowin
in
#2716
Consolidate get_* and
list
* methods into single API by
@jlowin
in
#2719
Consolidate execution method chains into single public API by
@jlowin
in
#2728
Add documentation check to required PR workflow by
@jlowin
in
#2730
Parallelize list_* calls in Provider.get_tasks() by
@jlowin
in
#2731
Consistent decorator-based MCP handler registration by
@jlowin
in
#2732
Make ToolResult a BaseModel for serialization support by
@jlowin
in
#2736
Align prompt handler with resource pattern by
@jlowin
in
#2740
Update classes to inherit from FastMCPBaseModel instead of BaseModel by
@jlowin
in
#2739
Convert provider tests to use direct server calls by
@jlowin
in
#2748
Add explicit task_meta parameter to FastMCP.call_tool() by
@jlowin
in
#2749
Add task_meta parameter to read_resource() for explicit task control by
@jlowin
in
#2750
Add task_meta to prompts and centralize fn_key enrichment by
@jlowin
in
#2751
Remove unused include_tags/exclude_tags settings by
@jlowin
in
#2756
Parallelize provider access when executing components by
@jlowin
in
#2744
Add tests for OAuth generator cleanup and use aclosing by
@jlowin
in
#2759
Deprecate tool_serializer parameter by
@jlowin
in
#2753
Feature/supabase custom auth route by
@EloiZalczer
in
#2632
Add regression tests for caching with mounted server prefixes by
@jlowin
in
#2762
Update CLI banner with FastMCP 3.0 notice by
@jlowin
in
#2766
Make FASTMCP_SHOW_SERVER_BANNER apply to all server startup methods by
@jlowin
in
#2771
Add MCP tool annotations to smart_home example by
@triepod-ai
in
#2777
Cherry-pick debug logging for OAuth token expiry to main by
@jlowin
in
#2797
Turn off negative CLI flags by default by
@jlowin
in
#2801
Configure ty to fail on warnings by
@jlowin
in
#2804
Dereference $ref in tool schemas for MCP client compatibility by
@jlowin
in
#2814
Add v3.0 feature tracking document by
@jlowin
in
#2822
Remove deprecated WSTransport by
@jlowin
in
#2826
Add composable lifespans by
@jlowin
in
#2828
Replace FastMCP.as_proxy() with create_proxy() function by
@jlowin
in
#2829
Add docs-broken-links command and fix docstring markdown parsing by
@jlowin
in
#2830
Add PingMiddleware for keepalive connections by
@jlowin
in
#2838
Add CLI update notifications by
@jlowin
in
#2840
Add agent skills for testing and code review by
@jlowin
in
#2846
Add loq pre-commit hook for file size enforcement by
@jlowin
in
#2847
Add transport property to Context by
@jlowin
in
#2850
Add loq file size limits and clean up type ignores by
@jlowin
in
#2859
Run sync tools/resources/prompts in threadpool automatically by
@jlowin
in
#2865
Add timeout parameter for tool foreground execution by
@jlowin
in
#2872
Adopt OpenTelemetry MCP semantic conventions by
@chrisguidry
in
#2886
Add client_secret_post authentication to IntrospectionTokenVerifier by
@shulkx
in
#2884
Add enable_rich_logging setting to disable rich formatting by
@strawgate
in
#2893
Rename _fastmcp metadata namespace to fastmcp and make non-optional by
@jlowin
in
#2895
Refactor FastMCP to inherit from Provider by
@jlowin
in
#2901
Swap public/private method naming in Provider by
@jlowin
in
#2902
Add MCP-compliant pagination support by
@jlowin
in
#2903
Support VersionSpec in enable/disable for range-based filtering by
@jlowin
in
#2914
Remove sync notification infrastructure by
@jlowin
in
#2915
Immutable transform wrapping for providers by
@jlowin
in
#2913
Unify discovery API: deduplicate at protocol layer only by
@jlowin
in
#2919
Split transports.py into modular structure by
@jlowin
in
#2921
Move session visibility logic to enabled.py by
@jlowin
in
#2924
Refactor Client class into mixins and add timeout utilities by
@jlowin
in
#2933
Refactor OAuthProxy into focused modules by
@jlowin
in
#2935
Refactor LocalProvider into mixin modules by
@jlowin
in
#2936
Refactor server.py into mixins by
@jlowin
in
#2939
Consolidate test fixtures and refactor large test files by
@jlowin
in
#2941
Refactor transform list methods to pure function pattern by
@jlowin
in
#2942
Add ResourcesAsTools transform by
@jlowin
in
#2943
Add PromptsAsTools transform by
@jlowin
in
#2946
Add client utilities for downloading skills by
@jlowin
in
#2948
Rename Enabled transform to Visibility by
@jlowin
in
#2950
​
Fixes 🐞
Let FastMCPError propagate from dependencies by
@chrisguidry
in
#2646
Fix task execution for tools with custom names by
@chrisguidry
in
#2645
fix: check the cause of the tool error by
@rjolaverria
in
#2674
Bump pydocket to 0.16.3 for task cancellation support by
@chrisguidry
in
#2683
Fix uvicorn 0.39+ test timeouts and FastMCPError propagation by
@jlowin
in
#2699
Fix Prefect website URL in docs footer by
@mgoldsborough
in
#2701
Fix: resolve root-level $ref in outputSchema for MCP spec compliance by
@majiayu000
in
#2720
Fix Provider.get_tasks() to include custom component subclasses by
@jlowin
in
#2729
Fix Proxy provider to return all resource contents by
@jlowin
in
#2742
Fix prompt return type documentation by
@jlowin
in
#2741
fix: Client OAuth async_auth_flow() method causing MCP-SDK self.context.lock error. by
@lgndluke
in
#2644
Fix rate limit detection during teardown phase by
@jlowin
in
#2757
fix: set pytest-asyncio default fixture loop scope to function by
@jlowin
in
#2758
Fix OAuth Proxy resource parameter validation by
@jlowin
in
#2764
[BugFix] Fix
openapi_version
Check So 3.1 Is Included by
@deeleeramone
in
#2768
Fix titled enum elicitation schema to comply with MCP spec by
@jlowin
in
#2773
Fix base_url fallback when url is not set by
@bhbs
in
#2776
Lazy import DiskStore to avoid sqlite3 dependency on import by
@jlowin
in
#2784
Fix OAuth token storage TTL calculation by
@jlowin
in
#2796
Use consistent refresh_ttl for JTI mapping store by
@jlowin
in
#2799
Return 401 for invalid_grant token errors per MCP spec by
@jlowin
in
#2800
Fix client hanging on HTTP 4xx/5xx errors by
@jlowin
in
#2803
Fix unawaited coroutine warning and treat as test error by
@jlowin
in
#2806
Fix keep_alive passthrough in StdioMCPServer.to_transport() by
@jlowin
in
#2791
Dereference $ref in tool schemas for MCP client compatibility by
@jlowin
in
#2808
Prefix Redis keys with docket name for ACL isolation by
@chrisguidry
in
#2811
fix smart_home example: HueAttributes schema and deprecated prefix by
@zzstoatzz
in
#2818
Fix redirect URI validation docs to match implementation by
@jlowin
in
#2824
Fix timeout not propagating to proxy clients in multi-server MCPConfig by
@jlowin
in
#2809
Fix ContextVar propagation for ASGI-mounted servers with tasks by
@chrisguidry
in
#2844
Fix HTTP transport timeout defaulting to 5 seconds by
@jlowin
in
#2849
Fix decorator error messages to link to correct doc pages by
@jlowin
in
#2858
Fix task capabilities location (issue #2870) by
@jlowin
in
#2875
Bump the uv group across 1 directory with 2 updates by
@dependabot
[bot] in
#2890
​
Breaking Changes 🛫
Add VisibilityFilter for hierarchical enable/disable by
@jlowin
in
#2708
Remove automatic environment variable loading from auth providers by
@jlowin
in
#2752
Make pydocket optional and unify DI systems by
@jlowin
in
#2835
Add session-scoped state persistence by
@jlowin
in
#2873
​
Docs 📚
Undocumented
McpError
exceptions by
@ivanbelenky
in
#2656
docs(server): add http to transport options in run() method docstring by
@Ashif4354
in
#2707
Add v3 breaking changes notice to README by
@jlowin
in
#2712
Add changelog entries for v2.13.1 through v2.14.1 by
@jlowin
in
#2725
Reorganize docs around provider architecture by
@jlowin
in
#2723
Fix documentation to use ‘meta’ instead of ‘_meta’ for MCP spec field by
@jlowin
in
#2735
Enhance documentation on tool transformation by
@shea-parkes
in
#2781
Add FastMCP 4.0 preview to documentation by
@jlowin
in
#2831
Add release notes for v2.14.2 and v2.14.3 by
@jlowin
in
#2852
Add missing 3.0.0 version badges and document tasks extra by
@jlowin
in
#2866
Fix custom provider docs to show correct interface by
@jlowin
in
#2920
Update v3 features that were missed in PRs by
@jlowin
in
#2947
Restructure documentation for FastMCP 3.0 by
@jlowin
in
#2951
Fix broken documentation links by
@jlowin
in
#2952
Clarify installation for FastMCP 3.0 beta by
@jlowin
in
#2953
​
Dependencies 📦
Bump peter-evans/create-pull-request from 7 to 8 by
@dependabot
[bot] in
#2623
Bump ty to 0.0.7+ by
@jlowin
in
#2737
Bump the uv group across 1 directory with 4 updates by
@dependabot
[bot] in
#2891
​
New Contributors
@ivanbelenky
made their first contribution in
#2656
@rjolaverria
made their first contribution in
#2674
@mgoldsborough
made their first contribution in
#2701
@Ashif4354
made their first contribution in
#2707
@majiayu000
made their first contribution in
#2720
@lgndluke
made their first contribution in
#2644
@EloiZalczer
made their first contribution in
#2632
@deeleeramone
made their first contribution in
#2768
@shea-parkes
made their first contribution in
#2781
@triepod-ai
made their first contribution in
#2777
@bhbs
made their first contribution in
#2776
@shulkx
made their first contribution in
#2884
Full Changelog
:
v2.14.1…v3.0.0b1
​
v2.14.7
2026-04-13
v2.14.7: Fake It Till You Break It
A 2.x backport of the fakeredis pin: fakeredis 2.35.0 renamed a connection class that pydocket’s
memory://
backend depended on, crashing
fastmcp[tasks]
installs at startup. This caps
fakeredis<2.35.0
on the 2.x line.
​
Fixes 🐞
fix(deps): cap fakeredis to
<2.35.0
to prevent startup crash on 2.x by
@vincent067
in
#3883
Full Changelog
:
v2.14.6…v2.14.7
​
v2.14.6
2026-03-27
v2.14.6: $Ref Dead Redemption
v2.14.4 backported
dereference_refs()
but never wired it into the tool schema pipeline —
$ref
and
$defs
were still sent to MCP clients. Now fixed:
compress_schema()
dereferences at both tool schema creation sites, so schemas are fully inlined before reaching clients.
​
Fixes 🐞
Updated deprecation URL for V2 by
@SrzStephen
in
#3109
Use MemoryStore for OAuth proxy tests by
@SrzStephen
in
#3111
fix: wire up dereference_refs() in tool schema pipeline by
@jlowin
in
#3170
Full Changelog
:
v2.14.5…v2.14.6
​
v2.14.5
2026-02-03
v2.14.5: Sealed Docket
Fixes a memory leak in the memory:// docket broker where cancelled tasks accumulated instead of being cleaned up. Bumps pydocket to ≥0.17.2.
​
What’s Changed
​
Enhancements 🔧
Bump pydocket to 0.17.2 (memory leak fix) by
@chrisguidry
in
#2992
Full Changelog
:
v2.14.4…v2.14.5
​
v2.14.4
2026-01-22
v2.14.4: Package Deal
Fixes a fresh install bug where the packaging library was missing as a direct dependency, plus backports from 3.x for $ref dereferencing in tool schemas and a task capabilities location fix.
​
What’s Changed
​
Enhancements 🔧
Add release notes for v2.14.2 and v2.14.3 by
@jlowin
in
#2851
​
Fixes 🐞
Backport: Dereference $ref in tool schemas for MCP client compatibility by
@jlowin
in
#2861
Fix task capabilities location (issue #2870) by
@jlowin
in
#2874
Add missing packaging dependency by
@jlowin
in
#2989
Full Changelog
:
v2.14.3…v2.14.4
​
v2.14.3
2026-01-12
v2.14.3: Time After Timeout
Sometimes five seconds just isn’t enough. This release fixes an HTTP transport bug that was cutting connections short, along with OAuth and Redis fixes, better ASGI support, and CLI update notifications so you never miss a beat.
​
What’s Changed
​
Enhancements 🔧
Add debug logging for OAuth token expiry diagnostics by
@jlowin
in
#2789
Add CLI update notifications by
@jlowin
in
#2839
Use pip instead of uv pip in upgrade instructions by
@jlowin
in
#2841
​
Fixes 🐞
Backport OAuth token storage TTL fix to release/2.x by
@jlowin
in
#2798
Prefix Redis keys with docket name for ACL isolation (2.x backport) by
@chrisguidry
in
#2812
Fix ContextVar propagation for ASGI-mounted servers with tasks by
@chrisguidry
in
#2843
Fix HTTP transport timeout defaulting to 5 seconds by
@jlowin
in
#2848
Full Changelog
:
v2.14.2…v2.14.3
​
v2.14.2
2025-12-31
v2.14.2: Port Authority
FastMCP 2.14.2 brings a wave of community contributions safely into the 2.x line. A variety of important fixes backported from 3.0 work improve OpenAPI 3.1 compatibility, MCP spec compliance for output schemas and elicitation, and correct a subtle base_url fallback issue. The CLI now gently reminds you that FastMCP 3.0 is on the horizon.
​
What’s Changed
​
Enhancements 🔧
Pin MCP under 2.x by
@jlowin
in
#2709
Add auth_route parameter to SupabaseProvider by
@EloiZalczer
in
#2760
Update CLI banner with FastMCP 3.0 notice by
@jlowin
in
#2765
​
Fixes 🐞
Let FastMCPError propagate unchanged from managers by
@jlowin
in
#2697
Fix test cleanup for uvicorn 0.39+ context isolation by
@jlowin
in
#2696
Bump pydocket to 0.16.3 to fix worker cleanup race condition by
@chrisguidry
in
#2700
Fix Prefect website URL in docs footer by
@mgoldsborough
in
#2705
Fix: resolve root-level $ref in outputSchema for MCP spec compliance by
@majiayu000
in
#2727
Fix OAuth Proxy resource parameter validation by
@jlowin
in
#2763
Fix openapi_version check to include 3.1 by
@deeleeramone
in
#2769
Fix titled enum elicitation schema to comply with MCP spec by
@jlowin
in
#2774
Fix base_url fallback when url is not set by
@bhbs
in
#2782
Lazy import DiskStore to avoid sqlite3 dependency on import by
@jlowin
in
#2785
​
Docs 📚
Add v3 breaking changes notice to README and docs by
@jlowin
in
#2713
Add changelog entries for v2.13.1 through v2.14.1 by
@jlowin
in
#2724
conference to 2.x branch by
@aaazzam
in
#2787
Full Changelog
:
v2.14.1…v2.14.2
​
v2.14.1
2025-12-15
v2.14.1: ‘Tis a Gift to Be Sample
FastMCP 2.14.1 introduces sampling with tools (SEP-1577), enabling servers to pass tools to
ctx.sample()
for agentic workflows where the LLM can automatically execute tool calls in a loop. The new
ctx.sample_step()
method provides single LLM calls that return
SampleStep
objects for custom control flow, while
result_type
enables structured outputs via validated Pydantic models.
🤖
AnthropicSamplingHandler
joins the existing OpenAI handler, providing multi-provider sampling support out of the box.
⚡
OpenAISamplingHandler promoted
from experimental status—sampling handlers are now production-ready with a unified API.
​
What’s Changed
​
New Features 🎉
Sampling with tools by
@jlowin
in
#2538
Add AnthropicSamplingHandler by
@jlowin
in
#2677
​
Enhancements 🔧
Add Python 3.13 to ubuntu CI by
@jlowin
in
#2648
Remove legacy task initialization workaround by
@jlowin
in
#2649
Consolidate session state reset logic by
@jlowin
in
#2651
Unify SamplingHandler; promote OpenAI from experimental by
@jlowin
in
#2656
Add
tool_names
parameter to mount() for name customization by
@jlowin
in
#2660
Use streamable HTTP client API from MCP SDK by
@jlowin
in
#2678
Deprecate
exclude_args
in favor of Depends() by
@jlowin
in
#2693
​
Fixes 🐞
Fix prompt tasks to return mcp.types.PromptMessage by
@jlowin
in
#2650
Fix Windows test warnings by
@jlowin
in
#2653
Cleanup cancelled connection startup by
@jlowin
in
#2679
Fix tool choice bug in sampling examples by
@shawnthapa
in
#2686
​
Docs 📚
Simplify Docket tip wording by
@chrisguidry
in
#2662
​
Other Changes 🦾
Bump pydocket to ≥0.15.5 by
@jlowin
in
#2694
​
New Contributors
@shawnthapa
made their first contribution in
#2686
Full Changelog
:
v2.14.0…v2.14.1
​
v2.14.0
2025-12-11
v2.14.0: Task and You Shall Receive
FastMCP 2.14 begins adopting the MCP 2025-11-25 specification, introducing protocol-native background tasks (SEP-1686) that enable long-running operations to report progress without blocking clients. The experimental OpenAPI parser graduates to standard, the
OpenAISamplingHandler
is promoted from experimental, and deprecated APIs accumulated across the 2.x series are removed.
⏳
Background Tasks
let you add
task=True
to any async tool decorator to run operations in the background with progress tracking. Powered by
Docket
, an enterprise task scheduler handling millions of concurrent tasks daily—in-memory backends work out-of-the-box, and Redis URLs enable persistence and horizontal scaling.
🔧
OpenAPI Parser Promoted
from experimental to standard with improved performance through single-pass schema processing and cleaner abstractions.
📋
MCP 2025-11-25 Specification Support
including SSE polling and event resumability (SEP-1699), multi-select enum elicitation schemas (SEP-1330), default values for elicitation (SEP-1034), and tool name validation at registration time (SEP-986).
​
Breaking Changes
Docket is always enabled; task execution is forbidden through proxies
Task protocol enabled by default
Removed deprecated settings, imports, and methods accumulated across 2.x series
​
What’s Changed
​
New Features 🎉
OpenAPI parser is now the default by
@jlowin
in
#2583
Implement SEP-1686: Background Tasks by
@jlowin
in
#2550
​
Enhancements 🔧
Expose InitializeResult in middleware by
@jlowin
in
#2562
Update MCP SDK auth compatibility by
@jlowin
in
#2574
Validate tool names at registration (SEP-986) by
@jlowin
in
#2588
Support SEP-1034 and SEP-1330 for elicitation by
@jlowin
in
#2595
Implement SSE polling (SEP-1699) by
@jlowin
in
#2612
Expose session ID callback by
@jlowin
in
#2628
​
Fixes 🐞
Fix OAuth metadata discovery by
@jlowin
in
#2565
Fix fastapi.cli package structure by
@jlowin
in
#2570
Correct OAuth error codes by
@jlowin
in
#2578
Prevent function signature modification by
@jlowin
in
#2590
Fix proxy client kwargs by
@jlowin
in
#2605
Fix nested server routing by
@jlowin
in
#2618
Use access token expiry fallback by
@jlowin
in
#2635
Handle transport cleanup exceptions by
@jlowin
in
#2642
​
Docs 📚
Add OCI and Supabase integration docs by
@jlowin
in
#2580
Add v2.14.0 upgrade guide by
@jlowin
in
#2598
Rewrite background tasks documentation by
@jlowin
in
#2620
Document read-only tool patterns by
@jlowin
in
#2632
​
New Contributors
11 total contributors including 7 first-time participants.
Full Changelog
:
v2.13.3…v2.14.0
​
v2.13.3
2025-12-03
v2.13.3: Pin-ish Line
FastMCP 2.13.3 pins
mcp<1.23
as a precautionary measure. MCP SDK 1.23 introduced changes related to the November 25, 2025 MCP protocol update that break certain FastMCP patches and workarounds, particularly around OAuth implementation details. FastMCP 2.14 introduces proper support for the updated protocol and requires
mcp>=1.23
.
​
What’s Changed
​
Fixes 🐞
Pin MCP SDK below 1.23 by
@jlowin
in
#2545
Full Changelog
:
v2.13.2…v2.13.3
​
v2.13.2
2025-12-01
v2.13.2: Refreshing Changes
FastMCP 2.13.2 polishes the authentication stack with improvements to token refresh, scope handling, and multi-instance deployments. Discord was added as a built-in OAuth provider, Azure and Google token handling became more reliable, and proxy classes now properly forward icons and titles.
​
What’s Changed
​
New Features 🎉
Add Discord OAuth provider by
@jlowin
in
#2480
​
Enhancements 🔧
Descope Provider updates for new well-known URLs by
@anvibanga
in
#2465
Scalekit provider improvements by
@jlowin
in
#2472
Add CSP customization for consent screens by
@jlowin
in
#2488
Add icon support to proxy classes by
@jlowin
in
#2495
​
Fixes 🐞
Google Provider now defaults to refresh token support by
@jlowin
in
#2468
Fix Azure OAuth token refresh with unprefixed scopes by
@jlowin
in
#2475
Prevent
$defs
mutation during tool transforms by
@jlowin
in
#2482
Fix OAuth proxy refresh token storage for multi-instance deployments by
@jlowin
in
#2490
Fix stale token issue after OAuth refresh by
@jlowin
in
#2498
Fix Azure provider OIDC scope handling by
@jlowin
in
#2505
​
New Contributors
7 new contributors made their first FastMCP contributions in this release.
Full Changelog
:
v2.13.1…v2.13.2
​
v2.13.1
2025-11-15
v2.13.1: Heavy Meta
FastMCP 2.13.1 introduces meta parameter support for
ToolResult
, enabling tools to return supplementary metadata alongside results. This supports emerging use cases like OpenAI’s Apps SDK. The release also brings improved OAuth functionality with custom token verifiers including a new DebugTokenVerifier, and adds OCI and Supabase authentication providers.
🏷️
Meta parameters for ToolResult
enable tools to return supplementary metadata alongside results, supporting patterns like OpenAI’s Apps SDK integration.
🔐
Custom token verifiers
with DebugTokenVerifier for development, plus Azure Government support through a
base_authority
parameter and Supabase authentication algorithm configuration.
🔒
Security fixes
address CVE-2025-61920 through authlib updates and validate Cursor deeplink URLs using safer Windows APIs.
​
What’s Changed
​
New Features 🎉
Add meta parameter support for ToolResult by
@jlowin
in
#2350
Add OCI authentication provider by
@jlowin
in
#2365
Add Supabase authentication provider by
@jlowin
in
#2378
​
Enhancements 🔧
Add custom token verifier support to OIDCProxy by
@jlowin
in
#2355
Add DebugTokenVerifier for development by
@jlowin
in
#2362
Add Azure Government support via base_authority parameter by
@jlowin
in
#2385
Add Supabase authentication algorithm configuration by
@jlowin
in
#2392
​
Fixes 🐞
Security: Update authlib for CVE-2025-61920 by
@jlowin
in
#2398
Validate Cursor deeplink URLs using safer Windows APIs by
@jlowin
in
#2405
Exclude MCP SDK 1.21.1 due to integration test failures by
@jlowin
in
#2422
​
New Contributors
18 new contributors joined in this release across 70+ pull requests.
Full Changelog
:
v2.13.0…v2.13.1
​
v2.13.0
2025-10-25
v2.13.0: Cache Me If You Can
FastMCP 2.13 “Cache Me If You Can” represents a fundamental maturation of the framework. After months of community feedback on authentication and state management, this release delivers the infrastructure FastMCP needs to handle production workloads: persistent storage, response caching, and pragmatic OAuth improvements that reflect real-world deployment challenges.
💾
Pluggable storage backends
bring persistent state to FastMCP servers. Built on
py-key-value-aio
, a new library from FastMCP maintainer Bill Easton (
@strawgate
), the storage layer provides encrypted disk storage by default, platform-aware token management, and a simple key-value interface for application state. We’re excited to bring this elegantly designed library into the FastMCP ecosystem - it’s both powerful and remarkably easy to use, including wrappers to add encryption, TTLs, caching, and more to backends ranging from Elasticsearch, Redis, DynamoDB, filesystem, in-memory, and more! OAuth providers now automatically persist tokens across restarts, and developers can store arbitrary state without reaching for external databases. This foundation enables long-running sessions, cached credentials, and stateful applications built on MCP.
🔐
OAuth maturity
brings months of production learnings into the framework. The new consent screen prevents confused deputy and authorization bypass attacks discovered in earlier versions while providing a clean UX with customizable branding. The OAuth proxy now issues its own tokens with automatic key derivation from client secrets, and RFC 7662 token introspection support enables enterprise auth flows. Path prefix mounting enables OAuth-protected servers to integrate into existing web applications under custom paths like
/api
, and MCP 1.17+ compliance with RFC 9728 ensures protocol compatibility. Combined with improved error handling and platform-aware token storage, OAuth is now production-ready and security-hardened for serious applications.
FastMCP now supports out-of-the-box authentication with:
WorkOS
and
AuthKit
GitHub
Google
Azure
(Entra ID)
AWS Cognito
Auth0
Descope
Scalekit
JWTs
RFC 7662 token introspection
⚡
Response Caching Middleware
dramatically improves performance for expensive operations. Cache tool and resource responses with configurable TTLs, reducing redundant API calls and speeding up repeated queries.
🔄
Server lifespans
provide proper initialization and cleanup hooks that run once per server instance instead of per client session. This fixes a long-standing source of confusion in the MCP SDK and enables proper resource management for database connections, background tasks, and other server-level state. Note: this is a breaking behavioral change if you were using the
lifespan
parameter.
✨
Developer experience improvements
include Pydantic input validation for better type safety, icon support for richer UX, RFC 6570 query parameters for resource templates, improved Context API methods (list_resources, list_prompts, get_prompt), and async file/directory resources.
This release includes contributions from
20
new contributors and represents the largest feature set in a while. Thank you to everyone who tested preview builds and filed issues - your feedback shaped these improvements!
Full Changelog
:
v2.12.5…v2.13.0
​
v2.12.5
2025-10-17
v2.12.5: Safety Pin
FastMCP 2.12.5 is a point release that pins the MCP SDK version below 1.17, which introduced a change affecting FastMCP users with auth providers mounted as part of a larger application. This ensures the
.well-known
payload appears in the expected location when using FastMCP authentication providers with composite applications.
​
What’s Changed
​
Fixes 🐞
Pin MCP SDK version below 1.17 by
@jlowin
in
a1b2c3d
Full Changelog
:
v2.12.4…v2.12.5
​
v2.12.4
2025-09-26
v2.12.4: OIDC What You Did There
FastMCP 2.12.4 adds comprehensive OIDC support and expands authentication options with AWS Cognito and Descope providers. The release also includes improvements to logging middleware, URL handling for nested resources, persistent OAuth client registration storage, and various fixes to the experimental OpenAPI parser.
​
What’s Changed
​
New Features 🎉
feat: Add support for OIDC configuration by
@ruhulio
in
#1817
​
Enhancements 🔧
feat: Move the Starlette context middleware to the front by
@akkuman
in
#1812
Refactor Logging and Structured Logging Middleware by
@strawgate
in
#1805
Update pull_request_template.md by
@jlowin
in
#1824
chore: Set redirect_path default in function by
@ruhulio
in
#1833
feat: Set instructions in code by
@attiks
in
#1838
Automatically Create inline Snapshots by
@strawgate
in
#1779
chore: Cleanup Auth0 redirect_path initialization by
@ruhulio
in
#1842
feat: Add support for Descope Authentication by
@anvibanga
in
#1853
Update descope version badges by
@jlowin
in
#1870
Update welcome images by
@jlowin
in
#1884
Fix rounded edges of image by
@jlowin
in
#1886
optimize test suite by
@zzstoatzz
in
#1893
Enhancement: client completions support context_arguments by
@isijoe
in
#1906
Update Descope icon by
@anvibanga
in
#1912
Add AWS Cognito OAuth Provider for Enterprise Authentication by
@stephaneberle9
in
#1873
Fix typos discovered by codespell by
@cclauss
in
#1922
Use lowercase namespace for fastmcp logger by
@jlowin
in
#1791
​
Fixes 🐞
Update quickstart.mdx by
@radi-dev
in
#1821
Remove extraneous union import by
@jlowin
in
#1823
Delay import of Provider classes until FastMCP Server Creation by
@strawgate
in
#1820
fix: correct documentation link in deprecation warning by
@strawgate
in
#1828
fix: Increase default 3s timeout on Pytest by
@dacamposol
in
#1866
fix: Improve URL handling in OIDCConfiguration by
@ruhulio
in
#1850
fix: correct typing for on_read_resource middleware method by
@strawgate
in
#1858
feat(experimental/openapi): replace $ref in additionalProperties; add tests by
@jlowin
in
#1735
Honor client supplied scopes during registration by
@dmikusa
in
#1860
Fix: FastAPI list parameter parsing in experimental OpenAPI parser by
@jlowin
in
#1834
Add log level support for stdio and HTTP transports by
@jlowin
in
#1840
Fix OAuth pre-flight check to accept HTTP 200 responses by
@jlowin
in
#1874
Fix: Preserve OpenAPI parameter descriptions in experimental parser by
@shlomo666
in
#1877
Add persistent storage for OAuth client registrations by
@jlowin
in
#1879
docs: update release dates based on github releases by
@lodu
in
#1890
Small updates to Sampling types by
@strawgate
in
#1882
remove lockfile smart_home example by
@zzstoatzz
in
#1892
Fix: Remove JSON schema title metadata while preserving parameters named ‘title’ by
@jlowin
in
#1872
Fix: get_resource_url nested URL handling by
@raphael-linx
in
#1914
Clean up code for creating the resource url by
@jlowin
in
#1916
Fix route count logging in OpenAPI server by
@zzstoatzz
in
#1928
​
Docs 📚
docs: make Gemini CLI integration discoverable by
@jackwotherspoon
in
#1827
docs: update NEW tags for AI assistant integrations by
@jackwotherspoon
in
#1829
Update wordmark by
@jlowin
in
#1832
docs: improve OAuth and OIDC Proxy documentation by
@jlowin
in
#1880
Update readme + welcome docs by
@jlowin
in
#1883
Update dark mode image in README by
@jlowin
in
#1885
​
New Contributors
@radi-dev
made their first contribution in
#1821
@akkuman
made their first contribution in
#1812
@ruhulio
made their first contribution in
#1817
@attiks
made their first contribution in
#1838
@anvibanga
made their first contribution in
#1853
@shlomo666
made their first contribution in
#1877
@lodu
made their first contribution in
#1890
@isijoe
made their first contribution in
#1906
@raphael-linx
made their first contribution in
#1914
@stephaneberle9
made their first contribution in
#1873
@cclauss
made their first contribution in
#1922
Full Changelog
:
v2.12.3…v2.12.4
​
v2.12.3
2025-09-17
v2.12.3: Double Time
FastMCP 2.12.3 focuses on performance and developer experience improvements based on community feedback. This release includes optimized auth provider imports that reduce server startup time, enhanced OIDC authentication flows with proper token management, and several reliability fixes for OAuth proxy configurations. The addition of automatic inline snapshot creation significantly improves the testing experience for contributors.
​
What’s Changed
​
New Features 🎉
feat: Support setting MCP log level via transport configuration by
@jlowin
in
#1756
​
Enhancements 🔧
Add client-side auth support for mcp install cursor command by
@jlowin
in
#1747
Automatically Create inline Snapshots by
@strawgate
in
#1779
Use lowercase namespace for fastmcp logger by
@jlowin
in
#1791
​
Fixes 🐞
fix: correct merge mistake during auth0 refactor by
@strawgate
in
#1742
Remove extraneous union import by
@jlowin
in
#1823
Delay import of Provider classes until FastMCP Server Creation by
@strawgate
in
#1820
fix: refactor OIDC configuration provider for proper token management by
@strawgate
in
#1751
Fix smart_home example imports by
@strawgate
in
#1753
fix: correct oauth proxy initialization of client by
@strawgate
in
#1759
Fix: return empty string when prompts have no arguments by
@jlowin
in
#1766
Fix async server callbacks by
@strawgate
in
#1774
Fix error when retrieving Completion API errors by
@strawgate
in
#1785
fix: correct documentation link in deprecation warning by
@strawgate
in
#1828
​
Docs 📚
Add migration docs for 2.12 by
@jlowin
in
#1745
Update docs for default sampling implementation to mention OpenAI API Key by
@strawgate
in
#1763
Add tip about sampling prompts and user_context to sampling documentation by
@jlowin
in
#1764
Update quickstart.mdx by
@radi-dev
in
#1821
​
Other Changes 🦾
Replace Marvin with Claude Code in CI by
@jlowin
in
#1800
Refactor logging and structured logging middleware by
@strawgate
in
#1805
feat: Move the Starlette context middleware to the front by
@akkuman
in
#1812
feat: Add support for OIDC configuration by
@ruhulio
in
#1817
​
New Contributors
@radi-dev
made their first contribution in
#1821
@akkuman
made their first contribution in
#1812
@ruhulio
made their first contribution in
#1817
Full Changelog
:
v2.12.2…v2.12.3
​
v2.12.2
2025-09-03
v2.12.2: Perchance to Stream
This is a hotfix for a bug where the
streamable-http
transport was not recognized as a valid option in
fastmcp.json
configuration files, despite being supported by the CLI. This resulted in a parsing error when the CLI arguments were merged against the configuration spec.
​
What’s Changed
​
Fixes 🐞
Fix streamable-http transport validation in fastmcp.json config by
@jlowin
in
#1739
Full Changelog
:
v2.12.1…v2.12.2
​
v2.12.1
2025-09-03
v2.12.1: OAuth to Joy
FastMCP 2.12.1 strengthens the OAuth proxy implementation based on extensive community testing and feedback. This release improves client storage reliability, adds PKCE forwarding for enhanced security, introduces configurable token endpoint authentication methods, and expands scope handling—all addressing real-world integration challenges discovered since 2.12.0. The enhanced test suite with mock providers ensures these improvements are robust and maintainable.
​
Breaking Changes
OAuth Proxy
: Users of built-in IDP integrations should note that
resource_server_url
has been renamed to
base_url
for clarity and consistency
​
What’s Changed
​
Enhancements 🔧
Make openai dependency optional by
@jlowin
in
#1701
Remove orphaned OAuth proxy code by
@jlowin
in
#1722
Expose valid scopes from OAuthProxy metadata by
@dmikusa
in
#1717
OAuth proxy PKCE forwarding by
@jlowin
in
#1733
Add token_endpoint_auth_method parameter to OAuthProxy by
@jlowin
in
#1736
Clean up and enhance OAuth proxy tests with mock provider by
@jlowin
in
#1738
​
Fixes 🐞
refactor: replace auth provider registry with ImportString by
@jlowin
in
#1710
Fix OAuth resource URL handling and WWW-Authenticate header by
@jlowin
in
#1706
Fix OAuth proxy client storage and add retry logic by
@jlowin
in
#1732
​
Docs 📚
Fix documentation: use StreamableHttpTransport for headers in testing by
@jlowin
in
#1702
docs: add performance warnings for mounted servers and proxies by
@strawgate
in
#1669
Update documentation around scopes for google by
@jlowin
in
#1703
Add deployment information to quickstart by
@seanpwlms
in
#1433
Update quickstart by
@jlowin
in
#1728
Add development docs for FastMCP by
@jlowin
in
#1719
​
Other Changes 🦾
Set generics without bounds to default=Any by
@strawgate
in
#1648
​
New Contributors
@dmikusa
made their first contribution in
#1717
@seanpwlms
made their first contribution in
#1433
Full Changelog
:
v2.12.0…v2.12.1
​
v2.12.0
2025-08-31
v2.12.0: Auth to the Races
FastMCP 2.12 represents one of our most significant releases to date, both in scope and community involvement. After extensive testing and iteration with the community, we’re shipping major improvements to authentication, configuration, and MCP feature adoption.
🔐
OAuth Proxy for Broader Provider Support
addresses a fundamental challenge: while MCP requires Dynamic Client Registration (DCR), many popular OAuth providers don’t support it. The new OAuth proxy bridges this gap, enabling FastMCP servers to authenticate with providers like GitHub, Google, WorkOS, and Azure through minimal configuration. These native integrations ship today, with more providers planned based on community needs.
📋
Declarative JSON Configuration
introduces a standardized, portable way to describe and deploy MCP servers. The
fastmcp.json
configuration file becomes the single source of truth for dependencies, transport settings, entrypoints, and server metadata. This foundation sets the stage for future capabilities like transformations and remote sources, moving toward a world where MCP servers are as portable and shareable as container images.
🧠
Sampling API Fallback
tackles the chicken-and-egg problem limiting adoption of advanced MCP features. Sampling—where servers request LLM completions from clients—is powerful but underutilized due to limited client support. FastMCP now lets server authors define fallback handlers that generate sampling completions server-side when clients don’t support the feature, encouraging adoption while maintaining compatibility.
This release took longer than usual to ship, and for good reason: the community’s aggressive testing and feedback on the authentication system helped us reach a level of stability we’re confident in. There’s certainly more work ahead, but these foundations position FastMCP to handle increasingly complex use cases while remaining approachable for developers.
Thank you to our new contributors and everyone who tested preview builds. Your feedback directly shaped these features.
​
What’s Changed
​
New Features 🎉
Add OAuth proxy that allows authentication with social IDPs without DCR support by
@jlowin
in
#1434
feat: introduce declarative JSON configuration system by
@jlowin
in
#1517
✨ Fallback to a Completions API when Sampling is not available by
@strawgate
in
#1145
Implement typed source system for FastMCP declarative configuration by
@jlowin
in
#1607
​
Enhancements 🔧
Support importing custom_route endpoints when mounting servers by
@jlowin
in
#1470
Remove unnecessary asserts by
@jlowin
in
#1484
Add Claude issue triage by
@jlowin
in
#1510
Inline dedupe prompt by
@jlowin
in
#1512
Improve stdio and mcp_config clean-up by
@strawgate
in
#1444
involve kwargs to pass parameters on creating RichHandler for logging customization. by
@itaru2622
in
#1504
Move SDK docs generation to post-merge workflow by
@jlowin
in
#1513
Improve label triage guidance by
@jlowin
in
#1516
Add code review guidelines for agents by
@jlowin
in
#1520
Remove trailing slash in unit tests by
@jlowin
in
#1535
Update OAuth callback UI branding by
@jlowin
in
#1536
Fix Marvin workflow to support development tools by
@jlowin
in
#1537
Add mounted_components_raise_on_load_error setting for debugging by
@jlowin
in
#1534
feat: Add —workspace flag to fastmcp install cursor by
@jlowin
in
#1522
switch from
pyright
to
ty
by
@zzstoatzz
in
#1545
feat: trigger Marvin workflow on PR body content by
@jlowin
in
#1549
Add WorkOS and Azure OAuth providers by
@jlowin
in
#1550
Adjust timeout for slow MCP Server shutdown test by
@strawgate
in
#1561
Update banner by
@jlowin
in
#1567
Added import of AuthProxy to auth
init
by
@KaliszS
in
#1568
Add configurable redirect URI validation for OAuth providers by
@jlowin
in
#1582
Remove invalid-argument-type ignore and fix type errors by
@jlowin
in
#1588
Remove generate-schema from public CLI by
@jlowin
in
#1591
Skip flaky windows test / mulit-client garbage collection by
@jlowin
in
#1592
Add setting to disable logging configuration by
@isra17
in
#1575
Improve debug logging for nested Servers / Clients by
@strawgate
in
#1604
Add GitHub pull request template by
@strawgate
in
#1581
chore: Automate docs and schema updates via PRs by
@jlowin
in
#1611
Experiment with haiku for limited workflows by
@jlowin
in
#1613
feat: Improve GitHub workflow automation for schema and SDK docs by
@jlowin
in
#1615
Consolidate server loading logic into FileSystemSource by
@jlowin
in
#1614
Prevent Haiku Marvin from commenting when there are no duplicates by
@jlowin
in
#1622
chore: Add clarifying note to automated PR bodies by
@jlowin
in
#1623
feat: introduce inline snapshots by
@strawgate
in
#1605
Improve fastmcp.json environment configuration and project-based deployments by
@jlowin
in
#1631
fix: allow passing query params in OAuthProxy upstream authorization url by
@danb27
in
#1630
Support multiple —with-editable flags in CLI commands by
@jlowin
in
#1634
feat: support comma separated oauth scopes by
@jlowin
in
#1642
Add allowed_client_redirect_uris to OAuth provider subclasses by
@jlowin
in
#1662
Consolidate CLI config parsing and prevent infinite loops by
@jlowin
in
#1660
Internal refactor: mcp server config by
@jlowin
in
#1672
Refactor Environment to support multiple runtime types by
@jlowin
in
#1673
Add type field to Environment base class by
@jlowin
in
#1676
​
Fixes 🐞
Fix breaking change: restore output_schema=False compatibility by
@jlowin
in
#1482
Fix #1506: Update tool filtering documentation from _meta to meta by
@maybenotconnor
in
#1511
Fix pytest warnings by
@jlowin
in
#1559
nest schemas under assets by
@jlowin
in
#1593
Skip flaky windows test by
@jlowin
in
#1596
ACTUALLY move schemas to fastmcp.json by
@jlowin
in
#1597
Fix and centralize CLI path resolution by
@jlowin
in
#1590
Remove client info modifications by
@jlowin
in
#1620
Fix $defs being discarded in input schema of transformed tool by
@pldesch-chift
in
#1578
Fix enum elicitation to use inline schemas for MCP compatibility by
@jlowin
in
#1632
Reuse session for
StdioTransport
in
Client.new
by
@strawgate
in
#1635
Feat: Configurable LoggingMiddleware payload serialization by
@vl-kp
in
#1636
Fix OAuth redirect URI validation for DCR compatibility by
@jlowin
in
#1661
Add default scope handling in OAuth proxy by
@romanusyk
in
#1667
Fix OAuth token expiry handling by
@jlowin
in
#1671
Add resource_server_url parameter to OAuth proxy providers by
@jlowin
in
#1682
​
Breaking Changes 🛫
Enhance inspect command with structured output and format options by
@jlowin
in
#1481
​
Docs 📚
Update changelog by
@jlowin
in
#1453
Update banner by
@jlowin
in
#1472
Update logo files by
@jlowin
in
#1473
Update deployment docs by
@jlowin
in
#1486
Update FastMCP Cloud screenshot by
@jlowin
in
#1487
Update authentication note in docs by
@jlowin
in
#1488
chore: Update installation.mdx version snippet by
@thomas-te
in
#1496
Update fastmcp cloud server requirements by
@jlowin
in
#1497
Fix oauth pyright type checking by
@strawgate
in
#1498
docs: Fix type annotation in return value documentation by
@MaikelVeen
in
#1499
Fix PromptMessage usage in docs example by
@jlowin
in
#1515
Create CODE_OF_CONDUCT.md by
@jlowin
in
#1523
Fixed wrong import path in new docs page by
@KaliszS
in
#1538
Document symmetric key JWT verification support by
@jlowin
in
#1586
Update fastmcp.json schema path by
@jlowin
in
#1595
​
Dependencies 📦
Bump actions/create-github-app-token from 1 to 2 by
@dependabot
[bot] in
#1436
Bump astral-sh/setup-uv from 4 to 6 by
@dependabot
[bot] in
#1532
Bump actions/checkout from 4 to 5 by
@dependabot
[bot] in
#1533
​
Other Changes 🦾
Add dedupe workflow by
@jlowin
in
#1454
Update AGENTS.md by
@jlowin
in
#1471
Give Marvin the power of the Internet by
@strawgate
in
#1475
Update
just
error message for static checks by
@jlowin
in
#1483
Remove labeler by
@jlowin
in
#1509
update aproto server to handle rich links by
@zzstoatzz
in
#1556
fix: enable triage bot for fork PRs using pull_request_target by
@jlowin
in
#1557
​
New Contributors
@thomas-te
made their first contribution in
#1496
@maybenotconnor
made their first contribution in
#1511
@MaikelVeen
made their first contribution in
#1499
@KaliszS
made their first contribution in
#1538
@isra17
made their first contribution in
#1575
@marvin-context-protocol
[bot] made their first contribution in
#1616
@pldesch-chift
made their first contribution in
#1578
@vl-kp
made their first contribution in
#1636
@romanusyk
made their first contribution in
#1667
Full Changelog
:
v2.11.3…v2.12.0
​
v2.11.3
2025-08-11
v2.11.3: API-tite for Change
This release includes significant enhancements to the experimental OpenAPI parser and fixes a significant bug that led schemas not to be included in input/output schemas if they were transitive dependencies (e.g. A → B → C implies A depends on C). For users naively transforming large OpenAPI specs into MCP servers, this may result in ballooning payload sizes and necessitate curation.
​
What’s Changed
​
Enhancements 🔧
Improve redirect handling to address 307’s by
@jlowin
in
#1387
Ensure resource + template names are properly prefixed when importing/mounting by
@jlowin
in
#1423
fixes #1398: Add JWT claims to AccessToken by
@panargirakis
in
#1399
Enable Protected Resource Metadata to provide resource_name and resou… by
@yannj-fr
in
#1371
Pin mcp SDK under 2.0 to avoid breaking changes by
@jlowin
in
#1428
Clean up complexity from PR #1426 by
@jlowin
in
#1435
Optimize OpenAPI payload size by 46% by
@jlowin
in
#1452
Update static checks by
@jlowin
in
#1448
​
Fixes 🐞
Fix client-side logging bug #1394 by
@chi2liu
in
#1397
fix: Fix httpx_client_factory type annotation to match MCP SDK (#1402) by
@chi2liu
in
#1405
Fix OpenAPI allOf handling at requestBody top level (#1378) by
@chi2liu
in
#1425
Fix OpenAPI transitive references and performance (#1372) by
@jlowin
in
#1426
fix(type): lifespan is partially unknown by
@ykun9
in
#1389
Ensure transformed tools generate structured content by
@jlowin
in
#1443
​
Docs 📚
docs(client/logging): reflect corrected default log level mapping by
@jlowin
in
#1403
Add documentation for get_access_token() dependency function by
@jlowin
in
#1446
​
Other Changes 🦾
Add comprehensive tests for utilities.components module by
@chi2liu
in
#1395
Consolidate agent instructions into AGENTS.md by
@jlowin
in
#1404
Fix performance test threshold to prevent flaky failures by
@jlowin
in
#1406
Update agents.md; add github instructions by
@jlowin
in
#1410
Add Marvin assistant by
@jlowin
in
#1412
Marvin: fix deprecated variable names by
@jlowin
in
#1417
Simplify action setup and add github tools for Marvin by
@jlowin
in
#1419
Update marvin workflow name by
@jlowin
in
#1421
Improve GitHub templates by
@jlowin
in
#1422
​
New Contributors
@panargirakis
made their first contribution in
#1399
@ykun9
made their first contribution in
#1389
@yannj-fr
made their first contribution in
#1371
Full Changelog
:
v2.11.2…v2.11.3
​
v2.11.2
2025-08-06
​
v2.11.2: Satis-factory
​
What’s Changed
​
Enhancements 🔧
Support factory functions in fastmcp run by
@jlowin
in
#1384
Add async support to client_factory in FastMCPProxy (#1286) by
@bianning
in
#1375
​
Fixes 🐞
Fix server_version field in inspect manifest by
@jlowin
in
#1383
Fix Settings field with both default and default_factory by
@jlowin
in
#1380
​
Other Changes 🦾
Remove unused arg by
@jlowin
in
#1382
Add remote auth provider tests by
@jlowin
in
#1351
​
New Contributors
@bianning
made their first contribution in
#1375
Full Changelog
:
v2.11.1…v2.11.2
​
v2.11.1
2025-08-04
​
v2.11.1: You’re Better Auth Now
​
What’s Changed
​
New Features 🎉
Introduce
RemoteAuthProvider
for cleaner external identity provider integration, update docs by
@jlowin
in
#1346
​
Enhancements 🔧
perf: optimize string operations in OpenAPI parameter processing by
@chi2liu
in
#1342
​
Fixes 🐞
Fix method-bound FunctionTool schemas by
@strawgate
in
#1360
Manually set
_key
after
model_copy()
to enable prefixing Transformed Tools by
@strawgate
in
#1357
​
Docs 📚
Docs updates by
@jlowin
in
#1336
Add 2.11 to changelog by
@jlowin
in
#1337
Update AuthKit vocab by
@jlowin
in
#1338
Fix typo in decorating-methods.mdx by
@Ozzuke
in
#1344
​
New Contributors
@Ozzuke
made their first contribution in
#1344
Full Changelog
:
v2.11.0…v2.11.1
​
v2.11.0
2025-08-01
​
v2.11.0: Auth to a Good Start
FastMCP 2.11 doubles down on what developers need most: speed and simplicity. This massive release delivers significant performance improvements and a dramatically better developer experience.
🔐
Enterprise-Ready Authentication
brings comprehensive OAuth 2.1 support with WorkOS’s AuthKit integration. The new AuthProvider interface leverages MCP’s support for separate resource and authorization servers, handling API keys and remote authentication with Dynamic Client Registration. AuthKit integration means you can plug into existing enterprise identity systems without rebuilding your auth stack, setting the stage for plug-and-play auth that doesn’t require users to become security experts overnight.
⚡ The
Experimental OpenAPI Parser
delivers dramatic performance improvements through single-pass schema processing and optimized memory usage. OpenAPI integrations are now significantly faster, with cleaner, more maintainable code.
(Note: the experimental parser is disabled by default, set
FASTMCPEXPERIMENTALENABLENEWOPENAPIPARSER=1
to enable it. A message will be shown to all users on the legacy parser encouraging them to try the new one before it becomes the default.)
🧠
Context State Management
finally gives you persistent state across tool calls with a simple dict interface, while enhanced meta support lets you expose rich component metadata to clients. Combined with improved type annotations, string-based argument descriptions, and UV transport support, this release makes FastMCP feel more intuitive than ever.
This release represents a TON of community contributions and sets the foundation for even more ambitious features ahead.
​
What’s Changed
​
New Features 🎉
Introduce experimental OpenAPI parser with improved performance and maintainability by
@jlowin
in
#1209
Add state dict to Context (#1118) by
@mukulmurthy
in
#1160
Expose FastMCP tags to clients via component
meta
dict by
@jlowin
in
#1281
Add _fastmcp meta namespace by
@jlowin
in
#1290
Add TokenVerifier protocol support alongside existing OAuthProvider authentication by
@jlowin
in
#1297
Add comprehensive OAuth 2.1 authentication system with WorkOS integration by
@jlowin
in
#1327
​
Enhancements 🔧
[🐶] Transform MCP Server Tools by
@strawgate
in
#1132
Add —python, —project, and —with-requirements options to CLI commands by
@jlowin
in
#1190
Support
fastmcp run mcp.json
by
@strawgate
in
#1138
Support from
future
import annotations by
@jlowin
in
#1199
Optimize OpenAPI parser performance with single-pass schema processing by
@jlowin
in
#1214
Log tool name on transform validation error by
@strawgate
in
#1238
Refactor
get_http_request
and
context.session_id
by
@hopeful0
in
#1242
Support creating tool argument descriptions from string annotations by
@jlowin
in
#1255
feat: Add Annotations support for resources and resource templates by
@chughtapan
in
#1260
Add UV Transport by
@strawgate
in
#1270
Improve OpenAPI-to-JSONSchema conversion utilities by
@jlowin
in
#1283
Ensure proxy components forward meta dicts by
@jlowin
in
#1282
fix: server argument passing in CLI run command by
@chughtapan
in
#1293
Add meta support to tool transformation utilities by
@jlowin
in
#1295
feat: Allow Resource Metadata URL as field in OAuthProvider by
@dacamposol
in
#1287
Use a simple overwrite instead of a merge for meta by
@jlowin
in
#1296
Remove unused TimedCache by
@strawgate
in
#1303
refactor: standardize logging usage across OpenAPI utilities by
@chi2liu
in
#1322
perf: optimize OpenAPI parsing by reducing dict copy operations by
@chi2liu
in
#1321
Structured client-side logging by
@cjermain
in
#1326
​
Fixes 🐞
fix: preserve def reference when referenced in allOf / oneOf / anyOf by
@algirdasci
in
#1208
fix: add type hint to custom_route decorator by
@zzstoatzz
in
#1210
chore: typo by
@richardkmichael
in
#1216
fix: handle non-string $ref values in experimental OpenAPI parser by
@jlowin
in
#1217
Skip repeated type conversion and validation in proxy client elicitation handler by
@chughtapan
in
#1222
Ensure default fields are not marked nullable by
@jlowin
in
#1224
Fix stateful proxy client mixing in multi-proxies sessions by
@hopeful0
in
#1245
Fix invalid async context manager usage in proxy documentation by
@zzstoatzz
in
#1246
fix: experimental FastMCPOpenAPI server lost headers in request when
init
(client with headers) by
@itaru2622
in
#1254
Fix typing, add tests for tool call middleware by
@jlowin
in
#1269
Fix: prune hidden parameter defs by
@muhammadkhalid-03
in
#1257
Fix nullable field handling in OpenAPI to JSON Schema conversion by
@jlowin
in
#1279
Ensure fastmcp run supports v1 servers by
@jlowin
in
#1332
​
Breaking Changes 🛫
Change server flag to —name by
@jlowin
in
#1248
​
Docs 📚
Remove unused import from FastAPI integration documentation by
@mariotaddeucci
in
#1194
Update fastapi docs by
@jlowin
in
#1198
Add docs for context state management by
@jlowin
in
#1227
Permit.io integration docs by
@orweis
in
#1226
Update docs to reflect sync tools by
@jlowin
in
#1234
Update changelog.mdx by
@jlowin
in
#1235
Update SDK docs by
@jlowin
in
#1236
Update —name flag documentation for Cursor/Claude by
@adam-conway
in
#1239
Add annotations docs by
@jlowin
in
#1268
Update openapi/fastapi URLs README.md by
@jbn
in
#1278
Add 2.11 version badge for state management by
@jlowin
in
#1289
Add meta parameter support to tools, resources, templates, and prompts decorators by
@jlowin
in
#1294
docs: update get_state and set_state references by
@Maxi91f
in
#1306
Add unit tests and docs for denying tool calls with middleware by
@jlowin
in
#1333
Remove reference to stacked decorators by
@jlowin
in
#1334
Eunomia authorization server can run embedded within the MCP server by
@tommitt
in
#1317
​
Other Changes 🦾
Update README.md by
@jlowin
in
#1230
Logcapture addition to test_server file by
@Sourav-Tripathy
in
#1229
Add tests for headers with both legacy and experimental openapi parser by
@jlowin
in
#1259
Small clean-up from MCP Tool Transform PR by
@strawgate
in
#1267
Add test for proxy tags visibility by
@jlowin
in
#1302
Add unit test for sampling with image messages by
@jlowin
in
#1329
Remove redundant resource_metadata_url assignment by
@jlowin
in
#1328
Update bug.yml by
@jlowin
in
#1331
Ensure validation errors are raised when masked by
@jlowin
in
#1330
​
New Contributors
@mariotaddeucci
made their first contribution in
#1194
@algirdasci
made their first contribution in
#1208
@chughtapan
made their first contribution in
#1222
@mukulmurthy
made their first contribution in
#1160
@orweis
made their first contribution in
#1226
@Sourav-Tripathy
made their first contribution in
#1229
@adam-conway
made their first contribution in
#1239
@muhammadkhalid-03
made their first contribution in
#1257
@jbn
made their first contribution in
#1278
@dacamposol
made their first contribution in
#1287
@chi2liu
made their first contribution in
#1322
@cjermain
made their first contribution in
#1326
Full Changelog
:
v2.10.6…v2.11.0
​
v2.10.6
2025-07-19
​
v2.10.6: Hymn for the Weekend
A special Saturday release with many fixes.
​
What’s Changed
​
Enhancements 🔧
Resolve #1139 — Implement include_context argument in Context.sample by
@codingjoe
in
#1141
feat(settings): add log level normalization by
@ka2048
in
#1171
add server name to mounted server warnings by
@artificial-aidan
in
#1147
Add StatefulProxyClient by
@hopeful0
in
#1109
​
Fixes 🐞
Fix OpenAPI empty parameters by
@FabrizioSandri
in
#1128
Fix title field preservation in tool transformations by
@jlowin
in
#1131
Fix optional parameter validation in OpenAPI integration by
@jlowin
in
#1135
Do not silently exclude the “context” key from JSON body by
@melkamar
in
#1153
Fix tool output schema generation to respect Pydantic serialization aliases by
@zzstoatzz
in
#1148
fix: _replace_ref_with_defs; ensure ref_path is string by
@itaru2622
in
#1164
Fix nesting when making OpenAPI arrays and objects optional by
@melkamar
in
#1178
Fix
mcp-json
output format to include server name by
@jlowin
in
#1185
Only configure logging one time by
@jlowin
in
#1187
​
Docs 📚
Update changelog.mdx by
@jlowin
in
#1127
Eunomia Authorization with native FastMCP’s Middleware by
@tommitt
in
#1144
update api ref for new
mdxify
version by
@zzstoatzz
in
#1182
​
Other Changes 🦾
Expand empty parameter filtering and add comprehensive tests by
@jlowin
in
#1129
Add no-commit-to-branch hook by
@zzstoatzz
in
#1149
Update README.md by
@jlowin
in
#1165
skip on rate limit by
@zzstoatzz
in
#1183
Remove deprecated proxy creation by
@jlowin
in
#1186
Separate integration tests from unit tests in CI by
@jlowin
in
#1188
​
New Contributors
@FabrizioSandri
made their first contribution in
#1128
@melkamar
made their first contribution in
#1153
@codingjoe
made their first contribution in
#1141
@itaru2622
made their first contribution in
#1164
@ka2048
made their first contribution in
#1171
@artificial-aidan
made their first contribution in
#1147
Full Changelog
:
v2.10.5…v2.10.6
​
v2.10.5
2025-07-11
​
v2.10.5: Middle Management
A maintenance release focused on OpenAPI refinements and middleware fixes, plus console improvements.
​
What’s Changed
​
Enhancements 🔧
Fix Claude Code CLI detection for npm global installations by
@jlowin
in
#1106
Fix OpenAPI parameter name collisions with location suffixing by
@jlowin
in
#1107
Add mirrored component support for proxy servers by
@jlowin
in
#1105
​
Fixes 🐞
Fix OpenAPI deepObject style parameter encoding by
@jlowin
in
#1122
xfail when github token is not set (” or None) by
@jlowin
in
#1123
fix: replace oneOf with anyOf in OpenAPI output schemas by
@MagnusS0
in
#1119
Fix middleware list result types by
@jlowin
in
#1125
Improve console width for logo by
@jlowin
in
#1126
​
Docs 📚
Improve transport + integration docs by
@jlowin
in
#1103
Update proxy.mdx by
@coldfire-x
in
#1108
​
Other Changes 🦾
Update github remote server tests with secret by
@jlowin
in
#1112
​
New Contributors
@coldfire-x
made their first contribution in
#1108
@MagnusS0
made their first contribution in
#1119
Full Changelog
:
v2.10.4…v2.10.5
​
v2.10.4
2025-07-09
​
v2.10.4: Transport-ation
A quick fix to ensure the CLI accepts “streamable-http” as a valid transport option.
​
What’s Changed
​
Fixes 🐞
Ensure the CLI accepts “streamable-http” as a valid transport by
@jlowin
in
#1099
Full Changelog
:
v2.10.3…v2.10.4
​
v2.10.3
2025-07-09
​
v2.10.3: CLI Me a River
A major CLI overhaul featuring a complete refactor from typer to cyclopts, new IDE integrations, and comprehensive OpenAPI improvements.
​
What’s Changed
​
New Features 🎉
Refactor CLI from typer to cyclopts and add comprehensive tests by
@jlowin
in
#1062
Add output schema support for OpenAPI tools by
@jlowin
in
#1073
​
Enhancements 🔧
Add Cursor support via CLI integration by
@jlowin
in
#1052
Add Claude Code install integration by
@jlowin
in
#1053
Generate MCP JSON config output from CLI as new
fastmcp install
command by
@jlowin
in
#1056
Use isawaitable instead of iscoroutine by
@jlowin
in
#1059
feat: Add
--path
Option to CLI for HTTP/SSE Route by
@davidbk-legit
in
#1087
Fix concurrent proxy client operations with session isolation by
@jlowin
in
#1083
​
Fixes 🐞
Refactor Client context management to avoid concurrency issue by
@hopeful0
in
#1054
Keep json schema $defs on transform by
@strawgate
in
#1066
Ensure fastmcp version copy is plaintext by
@jlowin
in
#1071
Fix single-element list unwrapping in tool content by
@jlowin
in
#1074
Fix max recursion error when pruning OpenAPI definitions by
@dimitribarbot
in
#1092
Fix OpenAPI tool name registration when modified by mcp_component_fn by
@jlowin
in
#1096
​
Docs 📚
Docs: add example of more concise way to use bearer auth by
@neilconway
in
#1055
Update favicon by
@jlowin
in
#1058
Update environment note by
@jlowin
in
#1075
Add fastmcp version —copy documentation by
@jlowin
in
#1076
​
Other Changes 🦾
Remove asserts and add documentation following #1054 by
@jlowin
in
#1057
Add —copy flag for fastmcp version by
@jlowin
in
#1063
Fix docstring format for fastmcp.client.Client by
@neilconway
in
#1094
​
New Contributors
@neilconway
made their first contribution in
#1055
@davidbk-legit
made their first contribution in
#1087
@dimitribarbot
made their first contribution in
#1092
Full Changelog
:
v2.10.2…v2.10.3
​
v2.10.2
2025-07-05
​
v2.10.2: Forward March
The headline feature of this release is the ability to “forward” advanced MCP interactions like logging, progress, and elicitation through proxy servers. If the remote server requests an elicitation, the proxy client will pass that request to the new, “ultimate” client.
​
What’s Changed
​
New Features 🎉
Proxy support advanced MCP features by
@hopeful0
in
#1022
​
Enhancements 🔧
Re-add splash screen by
@jlowin
in
#1027
Reduce banner padding by
@jlowin
in
#1030
Allow per-server timeouts in MCPConfig by
@cegersdoerfer
in
#1031
Support ‘scp’ claim for OAuth scopes in BearerAuthProvider by
@jlowin
in
#1033
Add path expansion to image/audio/file by
@jlowin
in
#1038
Ensure multi-client configurations use new ProxyClient by
@jlowin
in
#1045
​
Fixes 🐞
Expose stateless_http kwarg for mcp.run() by
@jlowin
in
#1018
Avoid propagating logs by
@jlowin
in
#1042
​
Docs 📚
Clean up docs by
@jlowin
in
#1028
Docs: clarify server URL paths for ChatGPT integration by
@thap2331
in
#1017
​
Other Changes 🦾
Split giant openapi test file into smaller files by
@jlowin
in
#1034
Add comprehensive OpenAPI 3.0 vs 3.1 compatibility tests by
@jlowin
in
#1035
Update banner and use console.log by
@jlowin
in
#1041
​
New Contributors
@cegersdoerfer
made their first contribution in
#1031
@hopeful0
made their first contribution in
#1022
@thap2331
made their first contribution in
#1017
Full Changelog
:
v2.10.1…v2.10.2
​
v2.10.1
2025-07-02
​
v2.10.1: Revert to Sender
A quick patch to revert the CLI banner that was added in v2.10.0.
​
What’s Changed
​
Docs 📚
Update changelog.mdx by
@jlowin
in
#1009
Revert “Add CLI banner” by
@jlowin
in
#1011
Full Changelog
:
v2.10.0…v2.10.1
​
v2.10.0
2024-07-01
​
v2.10.0: Great Spec-tations
FastMCP 2.10 brings full compliance with the 6/18/2025 MCP spec update, introducing elicitation support for dynamic server-client communication and output schemas for structured tool responses. Please note that due to these changes, this release also includes a breaking change to the return signature of
client.call_tool()
.
​
Elicitation Support
Elicitation allows MCP servers to request additional information from clients during tool execution, enabling more interactive and dynamic server behavior. This opens up new possibilities for tools that need user input or confirmation during execution.
​
Output Schemas
Tools can now define structured output schemas, ensuring that responses conform to expected formats and making tool integration more predictable and type-safe.
​
What’s Changed
​
New Features 🎉
MCP 6/18/25: Add output schema to tools by
@jlowin
in
#901
MCP 6/18/25: Elicitation support by
@jlowin
in
#889
​
Enhancements 🔧
Update types + tests for SDK changes by
@jlowin
in
#888
MCP 6/18/25: Update auth primitives by
@jlowin
in
#966
Add OpenAPI extensions support to HTTPRoute by
@maddymanu
in
#977
Add title field support to FastMCP components by
@jlowin
in
#982
Support implicit Elicitation acceptance by
@jlowin
in
#983
Support ‘no response’ elicitation requests by
@jlowin
in
#992
Add Support for Configurable Algorithms by
@sstene1
in
#997
​
Fixes 🐞
Improve stdio error handling to raise connection failures immediately by
@jlowin
in
#984
Fix type hints for FunctionResource:fn by
@CfirTsabari
in
#986
Update link to OpenAI MCP example by
@mossbanay
in
#985
Fix output schema generation edge case by
@jlowin
in
#995
Refactor array parameter formatting to reduce code duplication by
@jlowin
in
#1007
Fix OpenAPI array parameter explode handling by
@jlowin
in
#1008
​
Breaking Changes 🛫
MCP 6/18/25: Upgrade to mcp 1.10 by
@jlowin
in
#887
​
Docs 📚
Update middleware imports and documentation by
@jlowin
in
#999
Update OpenAI docs by
@jlowin
in
#1001
Add CLI banner by
@jlowin
in
#1005
​
Examples & Contrib 💡
Component Manager by
@gorocode
in
#976
​
Other Changes 🦾
Minor auth improvements by
@jlowin
in
#967
Add .ccignore for copychat by
@jlowin
in
#1000
​
New Contributors
@maddymanu
made their first contribution in
#977
@github0hello
made their first contribution in
#979
@tommitt
made their first contribution in
#975
@CfirTsabari
made their first contribution in
#986
@mossbanay
made their first contribution in
#985
@sstene1
made their first contribution in
#997
Full Changelog
:
v2.9.2…v2.10.0
​
v2.9.2
2024-06-26
​
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.
​
What’s Changed
​
Docs 📚
Fix version badge for messages by
@jlowin
in
#960
​
Dependencies 📦
Pin mcp dependency by
@jlowin
in
#962
Full Changelog
:
v2.9.1…v2.9.2
​
v2.9.1
2024-06-26
​
v2.9.1: Call Me Maybe
FastMCP 2.9.1 introduces automatic MCP list change notifications, allowing servers to notify clients when tools, resources, or prompts are dynamically updated. This enables more responsive and adaptive MCP integrations.
​
What’s Changed
​
New Features 🎉
Add automatic MCP list change notifications and client message handling by
@jlowin
in
#939
​
Enhancements 🔧
Add debug logging to bearer token authentication by
@jlowin
in
#952
​
Fixes 🐞
Fix duplicate error logging in exception handlers by
@jlowin
in
#938
Fix parameter location enum handling in OpenAPI parser by
@jlowin
in
#953
Fix external schema reference handling in OpenAPI parser by
@jlowin
in
#954
​
Docs 📚
Update changelog for 2.9 release by
@jlowin
in
#929
Regenerate API references by
@zzstoatzz
in
#935
Regenerate API references by
@zzstoatzz
in
#947
Regenerate API references by
@zzstoatzz
in
#949
​
Examples & Contrib 💡
Add
create_thread
tool to bsky MCP server by
@zzstoatzz
in
#927
Update
mount_example.py
to work with current fastmcp API by
@rajephon
in
#957
​
New Contributors
@rajephon
made their first contribution in
#957
Full Changelog
:
v2.9.0…v2.9.1
​
v2.9.0
2024-06-23
​
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 and server-side type conversion.
​
MCP Middleware
MCP middleware lets you intercept and modify requests and responses at the protocol level, giving you powerful capabilities for logging, authentication, validation, and more. This is particularly useful for building production-ready MCP servers that need sophisticated request handling.
​
Server-side Type Conversion
This release also introduces server-side type conversion for prompt arguments, ensuring that data is properly formatted before being passed to your functions. This reduces the burden on individual tools and prompts to handle type validation and conversion.
​
What’s Changed
​
New Features 🎉
Add File utility for 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 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 by
@jlowin
in
#895
​
Fixes 🐞
“report_progress missing passing related_request_id causes notifications not working” 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 reference 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
Add middleware examples for timing, logging, rate limiting, and error handling by
@jlowin
in
#919
ControlFlow → FastMCP rename by
@jlowin
in
#922
​
Examples & Contrib 💡
Add contrib.mcp_mixin support for annotations 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
2024-06-15
​
v2.8.1: Sound Judgement
2.8.1 introduces audio support, as well as minor fixes and updates for deprecated features.
​
Audio Support
This release adds support for audio content in MCP tools and resources, expanding FastMCP’s multimedia capabilities beyond text and images.
​
What’s Changed
​
New Features 🎉
Add audio support by
@jlowin
in
#833
​
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 handling of 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
2024-06-10
​
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
2024-06-08
​
v2.7.1: The Bearer Necessities
This release primarily contains a fix for parsing string tokens that are provided to FastMCP clients.
​
New Features 🎉
Respect cache setting, set default to 1 second by
@jlowin
in
#747
​
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
2024-06-05
​
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.
​
Breaking Changes 🛫
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
​
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
Happily, this release DOES permit the use of “naked” decorators to align with Pythonic practice:
@
mcp
.
tool
def
my_tool
():
...
Full Changelog
:
v2.6.2…v2.7.0
​
v2.6.1
2024-06-03
​
v2.6.1: Blast Auth (second ignition)
This is a patch release to restore py.typed in #686.
​
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
@yrangana
made their first contribution in
#684
Full Changelog
:
v2.6.0…v2.6.1
​
v2.6.0
2024-06-02
​
v2.6.0: Blast Auth
​
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 🦾
Update test typing by
@jlowin
in
#646
Add OpenAI integration docs by
@jlowin
in
#660
​
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
2024-05-29
​
v2.5.2: Stayin’ Alive
​
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 📚
Add notes about uv and claude desktop by
@jlowin
in
#597
​
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
@jfouret
made their first contribution in
#607
@ksawaray
made their first contribution in
#625
Full Changelog
:
v2.5.1…v2.5.2
​
v2.5.1
2024-05-24
​
v2.5.1: Route Awakening (Part 2)
​
Fixes 🐞
Ensure content-length is always stripped from client headers by
@jlowin
in
#589
​
Docs 📚
Fix redundant section of docs by
@jlowin
in
#583
Full Changelog
:
v2.5.0…v2.5.1
​
v2.5.0
2024-05-24
​
v2.5.0: Route Awakening
This release introduces completely new tools for generating and customizing MCP servers from OpenAPI specs and FastAPI apps, including popular requests like mechanisms for determining what routes map to what MCP components; renaming routes; and customizing the generated MCP components.
​
New Features 🎉
Add FastMCP 1.0 server support for in-memory Client / Testing by
@jlowin
in
#539
Minor addition: add transport to stdio server in mcpconfig, with default by
@jlowin
in
#555
Raise an error if a Client is created with no servers in config by
@jlowin
in
#554
Expose model preferences in
Context.sample
for flexible model selection. by
@davenpi
in
#542
Ensure custom routes are respected by
@jlowin
in
#558
Add client method to send cancellation notifications by
@davenpi
in
#563
Enhance route map logic for include/exclude OpenAPI routes by
@jlowin
in
#564
Add tag-based route maps by
@jlowin
in
#565
Add advanced control of openAPI route creation by
@jlowin
in
#566
Make error masking configurable by
@jlowin
in
#550
Ensure client headers are passed through to remote servers by
@jlowin
in
#575
Use lowercase name for headers when comparing by
@jlowin
in
#576
Permit more flexible name generation for OpenAPI servers by
@jlowin
in
#578
Ensure that tools/templates/prompts are compatible with callable objects by
@jlowin
in
#579
​
Docs 📚
Add version badge for prefix formats by
@jlowin
in
#537
Add versioning note to docs by
@jlowin
in
#551
Bump 2.3.6 references to 2.4.0 by
@jlowin
in
#567
Full Changelog
:
v2.4.0…v2.5.0
​
v2.4.0
2024-05-21
​
v2.4.0: Config and Conquer
Note
: this release includes a backwards-incompatible change to how resources are prefixed when mounted in composed servers. However, it is only backwards-incompatible if users were running tests or manually loading resources by prefixed key; LLMs should not have any issue discovering the new route.
​
New Features 🎉
Allow * Methods and all routes as tools shortcuts by
@jlowin
in
#520
Improved support for config dicts by
@jlowin
in
#522
Support creating clients from MCP config dicts, including multi-server clients by
@jlowin
in
#527
Make resource prefix format configurable by
@jlowin
in
#534
​
Fixes 🐞
Avoid hanging on initializing server session by
@jlowin
in
#523
​
Breaking Changes 🛫
Remove customizable separators; improve resource separator by
@jlowin
in
#526
​
Docs 📚
Improve client documentation by
@jlowin
in
#517
​
Other Changes 🦾
Ensure openapi path params are handled properly by
@jlowin
in
#519
better error when missing lifespan by
@zzstoatzz
in
#521
Full Changelog
:
v2.3.5…v2.4.0
​
v2.3.5
2024-05-20
​
v2.3.5: Making Progress
​
New Features 🎉
support messages in progress notifications by
@rickygenhealth
in
#471
feat: Add middleware option in server.run by
@Maxi91f
in
#475
Add lifespan property to app by
@jlowin
in
#483
Update
fastmcp run
to work with remote servers by
@jlowin
in
#491
Add FastMCP.as_proxy() by
@jlowin
in
#490
Infer sse transport from urls containing /sse by
@jlowin
in
#512
Add progress handler to client by
@jlowin
in
#513
Store the initialize result on the client by
@jlowin
in
#509
​
Fixes 🐞
Remove patch and use upstream SSEServerTransport by
@jlowin
in
#425
​
Docs 📚
Update transport docs by
@jlowin
in
#458
update proxy docs + example by
@zzstoatzz
in
#460
doc(asgi): Change custom route example to PlainTextResponse by
@mcw0933
in
#477
Store FastMCP instance on app.state.fastmcp_server by
@jlowin
in
#489
Improve AGENTS.md overview by
@jlowin
in
#492
Update release numbers for anticipated version by
@jlowin
in
#516
​
Other Changes 🦾
run tests on all PRs by
@jlowin
in
#468
add null check by
@zzstoatzz
in
#473
strict typing for
server.py
by
@zzstoatzz
in
#476
Doc(quickstart): Fix import statements by
@mai-nakagawa
in
#479
Add labeler by
@jlowin
in
#484
Fix flaky timeout test by increasing timeout (#474) by
@davenpi
in
#486
Skipping
test_permission_error
if runner is root. by
@ZiadAmerr
in
#502
allow passing full uvicorn config by
@zzstoatzz
in
#504
Skip timeout tests on windows by
@jlowin
in
#514
​
New Contributors
@rickygenhealth
made their first contribution in
#471
@Maxi91f
made their first contribution in
#475
@mcw0933
made their first contribution in
#477
@mai-nakagawa
made their first contribution in
#479
@ZiadAmerr
made their first contribution in
#502
Full Changelog
:
v2.3.4…v2.3.5
​
v2.3.4
2024-05-15
​
v2.3.4: Error Today, Gone Tomorrow
​
New Features 🎉
logging stack trace for easier debugging by
@jbkoh
in
#413
add missing StreamableHttpTransport in client exports by
@yihuang
in
#408
Improve error handling for tools and resources by
@jlowin
in
#434
feat: add support for removing tools from server by
@davenpi
in
#437
Prune titles from JSONSchemas by
@jlowin
in
#449
Declare toolsChanged capability for stdio server. by
@davenpi
in
#450
Improve handling of exceptiongroups when raised in clients by
@jlowin
in
#452
Add timeout support to client by
@jlowin
in
#455
​
Fixes 🐞
Pin to mcp 1.8.1 to resolve callback deadlocks with SHTTP by
@jlowin
in
#427
Add reprs for OpenAPI objects by
@jlowin
in
#447
Ensure openapi defs for structured objects are loaded properly by
@jlowin
in
#448
Ensure tests run against correct python version by
@jlowin
in
#454
Ensure result is only returned if a new key was found by
@jlowin
in
#456
​
Docs 📚
Add documentation for tool removal by
@jlowin
in
#440
​
Other Changes 🦾
Deprecate passing settings to the FastMCP instance by
@jlowin
in
#424
Add path prefix to test by
@jlowin
in
#432
​
New Contributors
@jbkoh
made their first contribution in
#413
@davenpi
made their first contribution in
#437
Full Changelog
:
v2.3.3…v2.3.4
​
v2.3.3
2024-05-10
​
v2.3.3: SSE you later
This is a hotfix for a bug introduced in 2.3.2 that broke SSE servers
​
Fixes 🐞
Fix bug that sets message path and sse path to same value by
@jlowin
in
#405
​
Docs 📚
Update composition docs by
@jlowin
in
#403
​
Other Changes 🦾
Add test for no prefix when importing by
@jlowin
in
#404
Full Changelog
:
v2.3.2…v2.3.3
​
v2.3.2
2024-05-10
​
v2.3.2: Stuck in the Middleware With You
​
New Features 🎉
Allow users to pass middleware to starlette app constructors by
@jlowin
in
#398
Deprecate transport-specific methods on FastMCP server by
@jlowin
in
#401
​
Docs 📚
Update CLI docs by
@jlowin
in
#402
​
Other Changes 🦾
Adding 23 tests for CLI by
@didier-durand
in
#394
Full Changelog
:
v2.3.1…v2.3.2
​
v2.3.1
2024-05-09
​
v2.3.1: For Good-nests Sake
This release primarily patches a long-standing bug with nested ASGI SSE servers.
​
Fixes 🐞
Fix tool result serialization when the tool returns a list by
@strawgate
in
#379
Ensure FastMCP handles nested SSE and SHTTP apps properly in ASGI frameworks by
@jlowin
in
#390
​
Docs 📚
Update transport docs by
@jlowin
in
#377
Add llms.txt to docs by
@jlowin
in
#384
Fixing various text typos by
@didier-durand
in
#385
​
Other Changes 🦾
Adding a few tests to Image type by
@didier-durand
in
#387
Adding tests for TimedCache by
@didier-durand
in
#388
​
New Contributors
@didier-durand
made their first contribution in
#385
Full Changelog
:
v2.3.0…v2.3.1
​
v2.3.0
2024-05-08
​
v2.3.0: Stream Me Up, Scotty
​
New Features 🎉
Add streaming support for HTTP transport by
@jlowin
in
#365
Support streaming HTTP transport in clients by
@jlowin
in
#366
Add streaming support to CLI by
@jlowin
in
#367
​
Fixes 🐞
Fix streaming transport initialization by
@jlowin
in
#368
​
Docs 📚
Update transport documentation for streaming support by
@jlowin
in
#369
Full Changelog
:
v2.2.10…v2.3.0
​
v2.2.10
2024-05-06
​
v2.2.10: That’s JSON Bourne
​
Fixes 🐞
Disable automatic JSON parsing of tool args by
@jlowin
in
#341
Fix prompt test by
@jlowin
in
#342
​
Other Changes 🦾
Update docs.json by
@jlowin
in
#338
Add test coverage + tests on 4 examples by
@alainivars
in
#306
​
New Contributors
@alainivars
made their first contribution in
#306
Full Changelog
:
v2.2.9…v2.2.10
​
v2.2.9
2024-05-06
​
v2.2.9: Str-ing the Pot (Hotfix)
This release is a hotfix for the issue detailed in #330
​
Fixes 🐞
Prevent invalid resource URIs by
@jlowin
in
#336
Coerce numbers to str by
@jlowin
in
#337
​
Docs 📚
Add client badge by
@jlowin
in
#327
Update bug.yml by
@jlowin
in
#328
​
Other Changes 🦾
Update quickstart.mdx example to include import by
@discdiver
in
#329
​
New Contributors
@discdiver
made their first contribution in
#329
Full Changelog
:
v2.2.8…v2.2.9
​
v2.2.8
2024-05-05
​
v2.2.8: Parse and Recreation
​
New Features 🎉
Replace custom parsing with TypeAdapter by
@jlowin
in
#314
Handle *args/**kwargs appropriately for various components by
@jlowin
in
#317
Add timeout-graceful-shutdown as a default config for SSE app by
@jlowin
in
#323
Ensure prompts return descriptions by
@jlowin
in
#325
​
Fixes 🐞
Ensure that tool serialization has a graceful fallback by
@jlowin
in
#310
​
Docs 📚
Update docs for clarity by
@jlowin
in
#312
​
Other Changes 🦾
Remove is_async attribute by
@jlowin
in
#315
Dry out retrieving context kwarg by
@jlowin
in
#316
Full Changelog
:
v2.2.7…v2.2.8
​
v2.2.7
2024-05-03
​
v2.2.7: You Auth to Know Better
​
New Features 🎉
use pydantic_core.to_json by
@jlowin
in
#290
Ensure openapi descriptions are included in tool details by
@jlowin
in
#293
Bump mcp to 1.7.1 by
@jlowin
in
#298
Add support for tool annotations by
@jlowin
in
#299
Add auth support by
@jlowin
in
#300
Add low-level methods to client by
@jlowin
in
#301
Add method for retrieving current starlette request to FastMCP context by
@jlowin
in
#302
get_starlette_request → get_http_request by
@jlowin
in
#303
Support custom Serializer for Tools by
@strawgate
in
#308
Support proxy mount by
@jlowin
in
#309
​
Other Changes 🦾
Improve context injection type checks by
@jlowin
in
#291
add readme to smarthome example by
@zzstoatzz
in
#294
Full Changelog
:
v2.2.6…v2.2.7
​
v2.2.6
2024-04-30
​
v2.2.6: The REST is History
​
New Features 🎉
Added feature : Load MCP server using config by
@sandipan1
in
#260
small typing fixes by
@zzstoatzz
in
#237
Expose configurable timeout for OpenAPI by
@jlowin
in
#279
Lower websockets pin for compatibility by
@jlowin
in
#286
Improve OpenAPI param handling by
@jlowin
in
#287
​
Fixes 🐞
Ensure openapi tool responses are properly converted by
@jlowin
in
#283
Fix OpenAPI examples by
@jlowin
in
#285
Fix client docs for advanced features, add tests for logging by
@jlowin
in
#284
​
Other Changes 🦾
add testing doc by
@jlowin
in
#264
#267 Fix openapi template resource to support multiple path parameters by
@jeger-at
in
#278
​
New Contributors
@sandipan1
made their first contribution in
#260
@jeger-at
made their first contribution in
#278
Full Changelog
:
v2.2.5…v2.2.6
​
v2.2.5
2024-04-26
​
v2.2.5: Context Switching
​
New Features 🎉
Add tests for tool return types; improve serialization behavior by
@jlowin
in
#262
Support context injection in resources, templates, and prompts (like tools) by
@jlowin
in
#263
​
Docs 📚
Update wildcards to 2.2.4 by
@jlowin
in
#257
Update note in templates docs by
@jlowin
in
#258
Significant documentation and test expansion for tool input types by
@jlowin
in
#261
Full Changelog
:
v2.2.4…v2.2.5
​
v2.2.4
2024-04-25
​
v2.2.4: The Wild Side, Actually
The wildcard URI templates exposed in v2.2.3 were blocked by a server-level check which is removed in this release.
​
New Features 🎉
Allow customization of inspector proxy port, ui port, and version by
@jlowin
in
#253
​
Fixes 🐞
fix: unintended type convert by
@cutekibry
in
#252
Ensure openapi resources return valid responses by
@jlowin
in
#254
Ensure servers expose template wildcards by
@jlowin
in
#256
​
Docs 📚
Update README.md Grammar error by
@TechWithTy
in
#249
​
Other Changes 🦾
Add resource template tests by
@jlowin
in
#255
​
New Contributors
@TechWithTy
made their first contribution in
#249
@cutekibry
made their first contribution in
#252
Full Changelog
:
v2.2.3…v2.2.4
​
v2.2.3
2024-04-25
​
v2.2.3: The Wild Side
​
New Features 🎉
Add wildcard params for resource templates by
@jlowin
in
#246
​
Docs 📚
Indicate that Image class is for returns by
@jlowin
in
#242
Update mermaid diagram by
@jlowin
in
#243
​
Other Changes 🦾
update version badges by
@jlowin
in
#248
Full Changelog
:
v2.2.2…v2.2.3
​
v2.2.2
2024-04-24
​
v2.2.2: Prompt and Circumstance
​
New Features 🎉
Add prompt support by
@jlowin
in
#235
​
Fixes 🐞
Ensure that resource templates are properly exposed by
@jlowin
in
#238
​
Docs 📚
Update docs for prompts by
@jlowin
in
#236
​
Other Changes 🦾
Add prompt tests by
@jlowin
in
#239
Full Changelog
:
v2.2.1…v2.2.2
​
v2.2.1
2024-04-23
​
v2.2.1: Template for Success
​
New Features 🎉
Add resource templates by
@jlowin
in
#230
​
Fixes 🐞
Ensure that resource templates are properly exposed by
@jlowin
in
#231
​
Docs 📚
Update docs for resource templates by
@jlowin
in
#232
​
Other Changes 🦾
Add resource template tests by
@jlowin
in
#233
Full Changelog
:
v2.2.0…v2.2.1
​
v2.2.0
2024-04-22
​
v2.2.0: Compose Yourself
​
New Features 🎉
Add support for mounting FastMCP servers by
@jlowin
in
#175
Add support for duplicate behavior == ignore by
@jlowin
in
#169
​
Breaking Changes 🛫
Refactor MCP composition by
@jlowin
in
#176
​
Docs 📚
Improve integration documentation by
@jlowin
in
#184
Improve documentation by
@jlowin
in
#185
​
Other Changes 🦾
Add transport kwargs for mcp.run() and fastmcp run by
@jlowin
in
#161
Allow resource templates to have optional / excluded arguments by
@jlowin
in
#164
Update resources.mdx by
@jlowin
in
#165
​
New Contributors
@kongqi404
made their first contribution in
#181
Full Changelog
:
v2.1.2…v2.2.0
​
v2.1.2
2024-04-14
​
v2.1.2: Copy That, Good Buddy
The main improvement in this release is a fix that allows FastAPI / OpenAPI-generated servers to be mounted as sub-servers.
​
Fixes 🐞
Ensure objects are copied properly and test mounting fastapi by
@jlowin
in
#153
​
Docs 📚
Fix broken links in docs by
@jlowin
in
#154
​
Other Changes 🦾
Update README.md by
@jlowin
in
#149
Only apply log config to FastMCP loggers by
@jlowin
in
#155
Update pyproject.toml by
@jlowin
in
#156
Full Changelog
:
v2.1.1…v2.1.2
​
v2.1.1
2024-04-14
​
v2.1.1: Doc Holiday
FastMCP’s docs are now available at gofastmcp.com.
​
Docs 📚
Add docs by
@jlowin
in
#136
Add docs link to readme by
@jlowin
in
#137
Minor docs updates by
@jlowin
in
#138
​
Fixes 🐞
fix branch name in example by
@zzstoatzz
in
#140
​
Other Changes 🦾
smart home example by
@zzstoatzz
in
#115
Remove mac os tests by
@jlowin
in
#142
Expand support for various method interactions by
@jlowin
in
#143
Update docs and add_resource_fn by
@jlowin
in
#144
Update description by
@jlowin
in
#145
Support openapi 3.0 and 3.1 by
@jlowin
in
#147
Full Changelog
:
v2.1.0…v2.1.1
​
v2.1.0
2024-04-13
​
v2.1.0: Tag, You’re It
The primary motivation for this release is the fix in #128 for Claude desktop compatibility, but the primary new feature of this release is per-object tags. Currently these are for bookkeeping only but will become useful in future releases.
​
New Features 🎉
Add tags for all core MCP objects by
@jlowin
in
#121
Ensure that openapi tags are transferred to MCP objects by
@jlowin
in
#124
​
Fixes 🐞
Change default mounted tool separator from / to _ by
@jlowin
in
#128
Enter mounted app lifespans by
@jlowin
in
#129
Fix CLI that called mcp instead of fastmcp by
@jlowin
in
#128
​
Breaking Changes 🛫
Changed configuration for duplicate resources/tools/prompts by
@jlowin
in
#121
Improve client return types by
@jlowin
in
#123
​
Other Changes 🦾
Add tests for tags in server decorators by
@jlowin
in
#122
Clean up server tests by
@jlowin
in
#125
Full Changelog
:
v2.0.0…v2.1.0
​
v2.0.0
2024-04-11
​
v2.0.0: Second to None
​
New Features 🎉
Support mounting FastMCP instances as sub-MCPs by
@jlowin
in
#99
Add in-memory client for calling FastMCP servers (and tests) by
@jlowin
in
#100
Add MCP proxy server by
@jlowin
in
#105
Update FastMCP for upstream changes by
@jlowin
in
#107
Generate FastMCP servers from OpenAPI specs and FastAPI by
@jlowin
in
#110
Reorganize all client / transports by
@jlowin
in
#111
Add sampling and roots by
@jlowin
in
#117
​
Fixes 🐞
Fix bug with tools that return lists by
@jlowin
in
#116
​
Other Changes 🦾
Add back FastMCP CLI by
@jlowin
in
#108
Update Readme for v2 by
@jlowin
in
#112
fix deprecation warnings by
@zzstoatzz
in
#113
Readme by
@jlowin
in
#118
FastMCP 2.0 by
@jlowin
in
#119
Full Changelog
:
v1.0…v2.0.0
​
v1.0
2024-04-11
​
v1.0: It’s Official
This release commemorates FastMCP 1.0, which is included in the official Model Context Protocol SDK:
from
mcp
.
server
.
fastmcp
import
FastMCP
To the best of my knowledge, v1 is identical to the upstream version included with
mcp
.
​
Docs 📚
Update readme to redirect to the official SDK by
@jlowin
in
#79
​
Other Changes 🦾
fix: use Mount instead of Route for SSE message handling by
@samihamine
in
#77
​
New Contributors
@samihamine
made their first contribution in
#77
Full Changelog
:
v0.4.1…v1.0
​
v0.4.1
2024-12-09
​
v0.4.1: String Theory
​
Fixes 🐞
fix: handle strings containing numbers correctly by
@sd2k
in
#63
​
Docs 📚
patch: Update pyproject.toml license by
@leonkozlowski
in
#67
​
Other Changes 🦾
Avoid new try_eval_type unavailable with older pydantic by
@jurasofish
in
#57
Decorator typing by
@jurasofish
in
#56
​
New Contributors
@leonkozlowski
made their first contribution in
#67
Full Changelog
:
v0.4.0…v0.4.1
​
v0.4.0
2024-12-05
​
v0.4.0: Nice to MIT You
This is a relatively small release in terms of features, but the version is bumped to 0.4 to reflect that the code is being relicensed from Apache 2.0 to MIT. This is to facilitate FastMCP’s inclusion in the official MCP SDK.
​
New Features 🎉
Add pyright + tests by
@jlowin
in
#52
add pgvector memory example by
@zzstoatzz
in
#49
​
Fixes 🐞
fix: use stderr for logging by
@sd2k
in
#51
​
Docs 📚
Update ai-labeler.yml by
@jlowin
in
#48
Relicense from Apache 2.0 to MIT by
@jlowin
in
#54
​
Other Changes 🦾
fix warning and flake by
@zzstoatzz
in
#47
​
New Contributors
@sd2k
made their first contribution in
#51
Full Changelog
:
v0.3.5…v0.4.0
​
v0.3.5
2024-12-03
​
v0.3.5: Windows of Opportunity
This release is highlighted by the ability to handle complex JSON objects as MCP inputs and improved Windows compatibility.
​
New Features 🎉
Set up multiple os tests by
@jlowin
in
#44
Changes to accommodate windows users. by
@justjoehere
in
#42
Handle complex inputs by
@jurasofish
in
#31
​
Docs 📚
Make AI labeler more conservative by
@jlowin
in
#46
​
Other Changes 🦾
Additional Windows Fixes for Dev running and for importing modules in a server by
@justjoehere
in
#43
​
New Contributors
@justjoehere
made their first contribution in
#42
@jurasofish
made their first contribution in
#31
Full Changelog
:
v0.3.4…v0.3.5
​
v0.3.4
2024-12-02
​
v0.3.4: URL’s Well That Ends Well
​
Fixes 🐞
Handle missing config file when installing by
@jlowin
in
#37
Remove BaseURL reference and use AnyURL by
@jlowin
in
#40
Full Changelog
:
v0.3.3…v0.3.4
​
v0.3.3
2024-12-02
​
v0.3.3: Dependence Day
​
New Features 🎉
Surge example by
@zzstoatzz
in
#29
Support Python dependencies in Server by
@jlowin
in
#34
​
Docs 📚
add
Contributing
section to README by
@zzstoatzz
in
#32
Full Changelog
:
v0.3.2…v0.3.3
​
v0.3.2
Green with ENVy
​
v0.3.2: Green with ENVy
​
New Features 🎉
Support env vars when installing by
@jlowin
in
#27
​
Docs 📚
Remove top level env var by
@jlowin
in
#28
Full Changelog
:
v0.3.1…v0.3.2
​
v0.3.1
2024-12-01
​
v0.3.1
​
New Features 🎉
Update README.md by
@jlowin
in
#23
add rich handler and dotenv loading for settings by
@zzstoatzz
in
#22
print exception when server can’t start by
@jlowin
in
#25
​
Docs 📚
Update README.md by
@jlowin
in
#24
​
Other Changes 🦾
Remove log by
@jlowin
in
#26
Full Changelog
:
v0.3.0…v0.3.1
​
v0.3.0
2024-12-01
​
v0.3.0: Prompt and Circumstance
​
New Features 🎉
Update README by
@jlowin
in
#3
Make log levels strings by
@jlowin
in
#4
Make content method a function by
@jlowin
in
#5
Add template support by
@jlowin
in
#6
Refactor resources module by
@jlowin
in
#7
Clean up cli imports by
@jlowin
in
#8
Prepare to list templates by
@jlowin
in
#11
Move image to separate module by
@jlowin
in
#9
Add support for request context, progress, logging, etc. by
@jlowin
in
#12
Add context tests and better runtime loads by
@jlowin
in
#13
Refactor tools + resourcemanager by
@jlowin
in
#14
func → fn everywhere by
@jlowin
in
#15
Add support for prompts by
@jlowin
in
#16
Create LICENSE by
@jlowin
in
#18
Update cli file spec by
@jlowin
in
#19
Update readmeUpdate README by
@jlowin
in
#20
Use hatchling for version by
@jlowin
in
#21
​
Other Changes 🦾
Add echo server by
@jlowin
in
#1
Add github workflows by
@jlowin
in
#2
typing updates by
@zzstoatzz
in
#17
​
New Contributors
@jlowin
made their first contribution in
#1
@zzstoatzz
made their first contribution in
#17
Full Changelog
:
v0.2.0…v0.3.0
​
v0.2.0
2024-11-30
​
v0.2.0
Full Changelog
:
v0.1.0…v0.2.0
​
v0.1.0
2024-11-30
​
v0.1.0
The very first release of FastMCP! 🎉
Full Changelog
:
Initial commits
FastMCP Updates
Previous
FAQ
Next
Ctrl
+I
discord
github
website
x
Powered by
This documentation is built and hosted on Mintlify, a developer documentation platform
Assistant
Responses are generated using AI and may contain mistakes.
\n\n
\n
\n \n
\n
