* Separate proxy protocol policy from client construction
🤖 Generated with OpenAI Codex
* Strip connection-owned request metadata at the proxy backend boundary
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Sanitize forwarded request metadata where the proxy copies it
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Forward hop-safe request metadata for proxied resources, templates, and prompts
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* Fix upgrade static analysis
Generated with Codex
* Preserve concrete transport return types
Generated with Codex
* Avoid widening transport return types
Generated with Codex
* Model transforming transport return types
Generated with Codex
* Exclude standalone screenshot examples from ty
Generated with Codex
pytest-timeout falls back to its thread method on Windows, which os._exit()s
the process instead of failing the test. A single slow test therefore kills an
xdist worker and fails whichever unrelated test it was running.
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* Rewrite the v4 What's New page
Teach the headline features with code instead of asserting them, drop the
major-version throat-clearing and SEP list, and correct the elicitation
claim: ctx.elicit() is unchanged and handshake-only, while sampling and
roots are removed outright.
* Fix broken doc links and stale version references
Repoint five dead links and anchors, refresh v3-era version examples on the
v4 docs, and add the missing FastMCP 3 entry to the installation page's
upgrade section.
* Document server extensions
add_extension() shipped in v4 with no documentation page. Covers the
extension interface, request methods, tool-call interception, lifespan
ownership, and the client half.
* Link the FastMCP TypeScript library
* Address Codex review feedback
Gate the extension interceptor on the client's per-request opt-in rather
than claiming negotiation does it; show the v4 beta pin on the install
page instead of a version a reader cannot get; note that UserSession
requires authentication.
* Always emit a tool title, derived from name when unset
Some MCP clients (e.g. ChatGPT) drop tools with no `title` instead of
falling back to `name` for display as the spec allows. Deriving a
default title in Tool.to_mcp_tool() fixes this for every tool built on
top of it, including the search-transform, code-mode, and session
proxy tools that never set one explicitly.
Fixes#4414
* Derive fallback title from the overridden name, document it
Addresses Codex review on #4694.
* Resolve title precedence from effective overrides
* Normalize mapping annotations before deriving the title
Migration guides now map the SDK's Resolve to Elicit rather than claiming
FastMCP has no resolver injection; the FastMCP 3 guide leads its ctx.elicit
era-gate section with declaring the parameter, since that is the fix that
serves both eras. Client docs cover answering the rounds yourself, including
the two same-named ElicitResult types. Also fixes a pre-existing broken
anchor in the FastMCP 3 guide.
* Add v4.0.0b1 changelog and updates entries
* Drop meta note from b1 intro; add #4682 under enhancements
* File #4682 under fixes
* Correct the camelCase rename claim: Python model fields, not the wire
* Baseline the b1 changelog on v3.4.5
* Simplify the beta banner
No elicitation handler and a tool that asks now yields the question on
CallToolResult.input_required instead of an 'Elicitation not supported'
error. A handler still answers inline where one is registered, and legacy
still errors, because there the server is blocked mid-call and there is no
result to hand back. No opt-in flag: not passing a handler already says it.
allow_input_required was the SDK session's own vocabulary. drive=True (the
default) answers each ask from the client's handlers and returns a terminal
result; drive=False hands the ask back so the caller can answer it on a later
call, which is what an app whose user replies minutes later actually needs.
call_tool and call_tool_mcp take input_responses and request_state, and
allow_input_required hands back the ask instead of resolving it against the
client's own handlers. CallToolResult carries it on input_required, mirroring
the server's InputRequiredToolResult.
Elicit becomes generic and a resolver returns `T | Elicit[T]`: a value fills
the parameter without asking, an Elicit performs the ask. elicit_type states
the type where the annotation is out of view, and a resolver's declared
Elicit[T] is checked against its parameter at registration.
Also fixes 3.10, where get_type_hints still applies implicit-Optional, so a
`= None` parameter arrived wrapped in a Union and the buried-marker guard
misfired on the legitimate optional form.