> ## 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
What's New

# Changelog

​
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
Assistant
Responses are generated using AI and may contain mistakes.
\n\n
\n
\n \n
\n
","contacts":" \n
\n\n Prefab\n \n \n \n \n\n
\n
\n \n
\n
","dashboard":" \n
\n\n Prefab\n \n \n \n \n\n
\n
\n \n
\n
","data-table":" \n
\n\n Prefab\n \n \n \n \n\n
\n
\n \n
\n
","hitchhikers":" \n
\n\n Prefab Showcase\n \n \n \n \n\n
\n
\n \n
\n
","pie-chart":" \n
\n\n Prefab\n \n \n \n \n\n
\n
\n \n
\n
","reactive":" \n
\n\n Prefab\n \n \n \n \n\n
\n
\n \n
\n
","team-directory-reactive":" \n
\n\n Prefab\n \n \n \n \n\n
\n
\n \n
\n
","team-directory":" \n
\n\n Prefab\n \n \n \n \n\n
\n
\n \n
\n
"};