You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Multi-server clients with legacy-only backends now avoid unnecessary startup retries, and tools returning unconstrained sequences no longer send images twice. This patch also fixes task timing values rejected by strict clients and cleans up unfinished Monty callbacks when execution ends.
What's Changed
Enhancements ✨
ci: deploy docs through Mintlify's admin API and wait for a verdict by @zzstoatzz in #4996
perf: avoid duplicate startup for mixed-era backends by @ningmao-hlyz in #4971
ClientGroup is now importable from the package root, from fastmcp import ClientGroup, with the same lazy export and install hint as Client, so integrations no longer couple to FastMCP's internal module layout.
What's Changed
Enhancements ✨
Expose ClientGroup from package root by @jlowin in #4987
skills: add release skill with changelog entry helper by @zzstoatzz in #4982
ClientGroup now reference-counts its context the way Client does, so entering a connected group from a nested block or a concurrent task reuses the existing connections instead of raising. Adapters written against Client's reentrancy can hold a ClientGroup the same way.
What's Changed
Fixes 🐞
ci: fix the published-docs PR step's working base by @zzstoatzz in #4960
FastMCP 4 is stable. Five betas, five weeks, 23 contributors, and more than 80 pull requests later — the new protocol engine held up under real gateways, agent frameworks, and production servers, and most FastMCP 3 applications upgrade without code changes.
This is the FastMCP release for the new MCP. On July 28, MCP released the 2026-07-28 protocol revision and the rewritten Python SDK v2 shipped the same day. FastMCP 4 is built on both: modern requests are sessionless and self-contained, so any replica behind an ordinary load balancer can answer them, and one FastMCP 4 deployment negotiates the best protocol version per connection — new clients get the new protocol, old clients keep working, and Client(url) does the same negotiation from the other side.
The new protocol's capabilities come through FastMCP's usual high-level surfaces:
Interactive tools return a request for input — approval, a missing field — and re-run with the client's answers available on the context.
Background tasks (@mcp.tool(task=True)) run outside the request path via the io.modelcontextprotocol/tasks extension, shipped in the optional fastmcp-tasks package on the same Docket engine as FastMCP 3.
Extensions register with add_extension(): a negotiated capability, additive request methods, tool-call interception, and a lifespan. Tasks are built this way, outside core.
Argument completion for prompt and resource-template inputs, with already-supplied arguments visible to the handler.
Auth for agents and services: identity assertion (SEP-990, beta), provider-neutral role checks, insufficient-scope challenges that name the missing scopes, and client-credentials auth.
Infrastructure hooks: server-level cache hints, and Mcp-Method/Mcp-Name routing headers so gateways can route without parsing JSON-RPC.
The framework grew alongside the protocol: dependency injection can bind a dependency to arguments of the call it serves (Depends(get_account, user_id=CallArgument("owner"))) while keeping it out of the tool schema, and ClientGroup manages one client per server with collision-checked namespacing — each member negotiating its own protocol version.
The beta period motivated a bunch of correctness work. Most of it was auth: hardened OAuth consent flows, issuer validation, and JWT verification, plus proxies that strip cookies and connection-owned headers at trust boundaries. The rest was durability and compatibility — encrypted task snapshots, serialized event-store writes, response caching handling empty results, errors, and versioned components, and dozens of smaller fixes from CodeMode to Python 3.14 compat.
Breaking changes: server-initiated sampling and roots are removed (no live connection exists to call back into mid-request), ctx.elicit() is old-protocol-only, FastMCP 3's deprecated APIs are gone, MCP model fields are snake_case (with a warning compatibility bridge for the old names), and background tasks moved to fastmcp-tasks. Passing a bare string like Client("server.py") to run local code is deprecated in favor of Path, for removal in FastMCP 5.
The upgrade guide covers every change and includes a copyable prompt for auditing an application with a coding agent.
Renovate failed to update an artifact related to this branch. You probably do not want to merge this PR as-is.
♻ Renovate will retry this branch, including artifacts, only when one of the following happens:
any of the package files in this branch needs updating, or
the branch becomes conflicted, or
you click the rebase/retry checkbox if found above, or
you rename this PR's title to start with "rebase!" to trigger it manually
The artifact failure details are included below:
File name: uv.lock
Command failed: uv lock --upgrade-package fastmcp
Using CPython 3.13.15 interpreter at: /opt/containerbase/tools/python/3.13.15/bin/python3
× No solution found when resolving dependencies:
╰─▶ Because fastmcp-slim[client]>=4.0.3 depends on mcp>=2.0.0,<3.0.0 and
fastmcp>=4.0.3 depends on fastmcp-slim[client]==4.0.3, we can conclude
that fastmcp>=4.0.3 depends on mcp>=2.0.0,<3.0.0.
And because your project depends on fastmcp>=4.0.3, we can conclude that
your project depends on mcp>=2.0.0,<3.0.0.
And because your project depends on mcp>=1.30.0,<2 and your project
requires better-code-review-graph[security], we can conclude that your
project's requirements are unsatisfiable.
Closing: fastmcp 4.x requires mcp>=2.0.0,<3.0.0 (via fastmcp-slim[client]) while this repository pins mcp>=1.30.0,<2, so resolution is unsatisfiable. Taking fastmcp 4 means widening the direct mcp constraint and migrating any direct mcp client usage (e.g. tests driving the server over stdio) to mcp 2.x in the same change. This must land as one grouped fastmcp-4+mcp-2 wave; renovate will recreate the bump afterwards.
Because you closed this PR without merging, Renovate will ignore this update. You will not get PRs for any future 4.x releases. But if you manually upgrade to 4.x then Renovate will re-enable minor and patch updates automatically.
If you accidentally closed this PR, or if you changed your mind: rename this PR to get a fresh replacement PR.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
>=3.4.7,<4→>=4.0.3,<5Release Notes
PrefectHQ/fastmcp (fastmcp)
v4.0.3: : Once Is EnoughCompare Source
Multi-server clients with legacy-only backends now avoid unnecessary startup retries, and tools returning unconstrained sequences no longer send images twice. This patch also fixes task timing values rejected by strict clients and cleans up unfinished Monty callbacks when execution ends.
What's Changed
Enhancements ✨
Fixes 🐞
Docs 📚
New Contributors
Full Changelog: PrefectHQ/fastmcp@v4.0.2...v4.0.3
v4.0.2: : Root AccessCompare Source
ClientGroupis now importable from the package root,from fastmcp import ClientGroup, with the same lazy export and install hint asClient, so integrations no longer couple to FastMCP's internal module layout.What's Changed
Enhancements ✨
Fixes 🐞
Docs 📚
Other Changes 🦾
Full Changelog: PrefectHQ/fastmcp@v4.0.1...v4.0.2
v4.0.1: : Come Back Any TimeCompare Source
ClientGroupnow reference-counts its context the wayClientdoes, so entering a connected group from a nested block or a concurrent task reuses the existing connections instead of raising. Adapters written againstClient's reentrancy can hold aClientGroupthe same way.What's Changed
Fixes 🐞
Docs 📚
Other Changes 🦾
Full Changelog: PrefectHQ/fastmcp@v4.0.0...v4.0.1
v4.0.0: : Four RealCompare Source
FastMCP 4 is stable. Five betas, five weeks, 23 contributors, and more than 80 pull requests later — the new protocol engine held up under real gateways, agent frameworks, and production servers, and most FastMCP 3 applications upgrade without code changes.
This is the FastMCP release for the new MCP. On July 28, MCP released the
2026-07-28protocol revision and the rewritten Python SDK v2 shipped the same day. FastMCP 4 is built on both: modern requests are sessionless and self-contained, so any replica behind an ordinary load balancer can answer them, and one FastMCP 4 deployment negotiates the best protocol version per connection — new clients get the new protocol, old clients keep working, andClient(url)does the same negotiation from the other side.The new protocol's capabilities come through FastMCP's usual high-level surfaces:
@mcp.tool(task=True)) run outside the request path via theio.modelcontextprotocol/tasksextension, shipped in the optionalfastmcp-taskspackage on the same Docket engine as FastMCP 3.add_extension(): a negotiated capability, additive request methods, tool-call interception, and a lifespan. Tasks are built this way, outside core.Mcp-Method/Mcp-Namerouting headers so gateways can route without parsing JSON-RPC.The framework grew alongside the protocol: dependency injection can bind a dependency to arguments of the call it serves (
Depends(get_account, user_id=CallArgument("owner"))) while keeping it out of the tool schema, andClientGroupmanages one client per server with collision-checked namespacing — each member negotiating its own protocol version.The beta period motivated a bunch of correctness work. Most of it was auth: hardened OAuth consent flows, issuer validation, and JWT verification, plus proxies that strip cookies and connection-owned headers at trust boundaries. The rest was durability and compatibility — encrypted task snapshots, serialized event-store writes, response caching handling empty results, errors, and versioned components, and dozens of smaller fixes from CodeMode to Python 3.14 compat.
Breaking changes: server-initiated sampling and roots are removed (no live connection exists to call back into mid-request),
ctx.elicit()is old-protocol-only, FastMCP 3's deprecated APIs are gone, MCP model fields are snake_case (with a warning compatibility bridge for the old names), and background tasks moved tofastmcp-tasks. Passing a bare string likeClient("server.py")to run local code is deprecated in favor ofPath, for removal in FastMCP 5.The upgrade guide covers every change and includes a copyable prompt for auditing an application with a coding agent.
Happy (context) engineering!
What's Changed
New Features 🎉
Breaking Changes⚠️
Enhancements ✨
valid_scopesparameter to OIDC proxy valid scopes by @Educg550 in #4660Security 🔒
Fixes 🐞
requiredorder deterministic by @Kludex in #4564Docs 📚
Dependencies 📦
Other Changes 🦾
New Contributors
Configuration
📅 Schedule: (in timezone Asia/Ho_Chi_Minh)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.