fastmcp/docs/servers
Jeremiah Lowin 717f3535f6
Add guard-mode multi-round-trip tools (SEP-2322) (#4544)
* Add guard-mode MRTR server support (SEP-2322)

* Add server-side MRTR guard tests

* Add MRTR guard docs, exports, and output-schema handling

* Apply formatting to MRTR guard changes

* Fix MRTR review round 1: middleware-safe suspend, Annotated strip, stable audience

- ToolInputRequired subclasses BaseException (CancelledError precedent) so
  error middleware's broad except Exception cannot swallow a suspension
- Strip InputRequiredResult arms inside Annotated return types
- Reject a custom RequestStateSecurity without a stable audience (random
  per-replica server names would break shared-key verification)

* Fix static analysis: rewrite tuple([...]) as tuple literal (C409)

* Recognize InputRequiredResult inside Annotated union arms

_is_input_required_type now peels Annotated first, so a metadata-carrying
guard arm (str | Annotated[InputRequiredResult, Field(...)]) is stripped
and the data arm's output schema survives.

* docs: frame multi-round tools as elicitation on the modern protocol

Fold multi-round-tools.mdx into elicitation.mdx as two eras of one
capability; drop pause/suspend framing for the stateless per-round model.

* Transport MRTR asks as InputRequiredToolResult, not a raised signal

An input-required result is the full result of a stateless MRTR leg, so it
flows through the middleware chain as an ordinary ToolResult subclass instead
of a raised ToolInputRequired(BaseException). Middleware observes it, caching
skips it, and response-limiting leaves it untouched.

* Document MRTR middleware interaction and the isinstance pattern

* Update MRTR change-register verify note to InputRequiredToolResult

* Align test module docstring with result-cycle framing

* Fix MRTR review: bypass cache on continuation legs; soften audience guard

- ResponseCachingMiddleware skips read AND write on continuation legs:
  the cache key is name+arguments only, so a continuation's final result
  would be served to later fresh calls, which would never be asked
- The stable-audience check is a warning, not an error: a policy object
  cannot reveal whether its keys are shared, and single-process
  customization (ephemeral ttl, custom codec) is legitimate unnamed

* Treat state-only rounds as continuations in the response cache

A round carrying request_state but no questions retries with
input_responses=None; request_state alone must bypass the cache or its
terminal result is stored under the fresh-call key.

* Fix MRTR review round: preserve asks through transforms, empty-name audience, docs predicate

- TransformedTool.run returns an InputRequiredToolResult intact instead of
  reshaping it into an empty ToolResult for non-object output schemas
- audience warning uses a falsy-name check (empty string also autogenerates
  a per-replica name)
- the elicitation docs continuation predicate checks request_state too

* Add create_proxy(mode=) opt-in for guard round-tripping through proxies

An auto-created proxy client stays handshake-era by default (a dual-era
backend serves both, and one proxy session is one era; handshake preserves
server-initiated push forwarding). Pass create_proxy(target, mode="auto")
to negotiate modern so an upstream guard's InputRequiredResult round-trips —
the two are mutually exclusive per session.

* Wrap raw InputRequiredResult returned by a transform_fn

A custom transform function may return the raw ask directly, like any tool
body — wrap it into InputRequiredToolResult so it survives output
normalization and reaches the wire, not only pre-wrapped forwarded guards.

* Reject input-required results from background tasks

* Unwrap type aliases before stripping guard arms

* Apply ruff format

* Recursively strip guard arms through nested and composed aliases

* Reflect MRTR continuation fields on the middleware message

* Suppress output schema for InputRequiredResult subclasses

* Forward progress on modern proxy tool calls

* Suppress output schema for bare aliased guard returns

* Suppress output schema for any surviving guard return wrapping
2026-07-19 16:42:06 -04:00
..
auth Add server-side identity assertion (SEP-990 ID-JAG) (#4483) 2026-07-18 19:52:15 -04:00
providers Align server component docs (#4260) 2026-07-19 14:23:36 -04:00
transforms feat(code-mode): default sandbox limits and per-execution tool-call cap (#4170) 2026-05-20 10:47:12 -04:00
authorization.mdx Support async auth checks (#3152) 2026-02-11 12:48:51 -05:00
composition.mdx Align server component docs (#4260) 2026-07-19 14:23:36 -04:00
context.mdx Align server component docs (#4260) 2026-07-19 14:23:36 -04:00
dependency-injection.mdx Align server component docs (#4260) 2026-07-19 14:23:36 -04:00
elicitation.mdx Add guard-mode multi-round-trip tools (SEP-2322) (#4544) 2026-07-19 16:42:06 -04:00
icons.mdx Document icon theme support (#4537) 2026-07-18 20:57:36 -04:00
lifespan.mdx Restructure documentation for FastMCP 3.0 (#2951) 2026-01-19 21:33:35 -05:00
logging.mdx Restructure documentation for FastMCP 3.0 (#2951) 2026-01-19 21:33:35 -05:00
middleware.mdx Align server component docs (#4260) 2026-07-19 14:23:36 -04:00
pagination.mdx Align server component docs (#4260) 2026-07-19 14:23:36 -04:00
progress.mdx Align server component docs (#4260) 2026-07-19 14:23:36 -04:00
prompts.mdx Align server component docs (#4260) 2026-07-19 14:23:36 -04:00
resources.mdx Align server component docs (#4260) 2026-07-19 14:23:36 -04:00
sampling.mdx Add guard-mode multi-round-trip tools (SEP-2322) (#4544) 2026-07-19 16:42:06 -04:00
server.mdx Align server component docs (#4260) 2026-07-19 14:23:36 -04:00
storage-backends.mdx Fix broken code examples in docs (#3869) 2026-04-12 12:53:04 -04:00
tasks.mdx Align server component docs (#4260) 2026-07-19 14:23:36 -04:00
telemetry.mdx Align server component docs (#4260) 2026-07-19 14:23:36 -04:00
testing.mdx Restructure docs navigation: CLI section, Composition, More (#3361) 2026-03-02 21:09:48 -05:00
tool-fingerprinting.mdx docs: add tool fingerprinting recipe for stable schema hashing (#4233) 2026-05-27 10:52:14 -04:00
tools.mdx Align server component docs (#4260) 2026-07-19 14:23:36 -04:00
versioning.mdx Align server component docs (#4260) 2026-07-19 14:23:36 -04:00
visibility.mdx Align server component docs (#4260) 2026-07-19 14:23:36 -04:00