2026-07-28 protocol era and the session-based handshake eras from a single server, with per-connection auto-detection. This page catalogs what FastMCP provides for the modern era — both the protocol machinery it inherits from the MCP Python SDK and the capabilities FastMCP implements itself on top of that layer. It is the reference for what a v4 deployment can actually do on the modern protocol today.
Identity assertion (SEP-990)
SEP-990 defines enterprise “on-behalf-of” access: a corporate identity provider (Okta, Microsoft Entra, etc.) issues a signed ID-JAG asserting an employee’s identity, the employee’s agent presents it at the MCP authorization server’s token endpoint via the RFC 7523jwt-bearer grant, and receives a short-lived access token — no browser login, no per-user consent screen, and revocation lives at the IdP.
The protocol layer for this flow — grant parsing, the exchange_identity_assertion provider hook, and metadata advertisement — comes from the SDK. The validation and issuance logic that makes the flow actually work is FastMCP’s implementation, and enabling it is one parameter on the existing auth providers:
typ/iss/aud/sub validation, temporal checks (exp, iat, nbf, maximum assertion lifetime), enforcement of the assertion’s signed client_id and resource bindings, jti replay rejection, scope derivation from the signed assertion (client requests can narrow but never widen), short-lived token issuance with no refresh token, and revocation tracking for the issued tokens. The asserted subject flows into the normal FastMCP auth context, so tools read it through get_access_token() like any other identity. See Identity Assertion for the full documentation.
This slots into FastMCP’s existing authorization-server stack — the OAuth proxy’s dynamic client registration, the consent flow, and self-issued JWTs — which is what makes a one-parameter enterprise deployment possible.
Modern-era capability inventory
The complete picture of what a FastMCP v4 server and client provide on the2026-07-28 era:
Still in the program
Elicitation on the modern protocol is now shipped in its guard form — a tool returns anInputRequiredResult and re-runs per round to gather user input via multi-round trips (see Elicitation on the modern protocol). The declarative Resolve(...) layer over that primitive remains staged, tracked in the Feature Program, along with the unified subscriptions/listen stream. The Known Gaps page tracks the upstream dependencies that gate them.
