docs: prepare for stable 3.0 release (#1073)

* docs: prepare for stable 3.0 release

* docs: update stable spec code references
This commit is contained in:
Dale Seo 2026-07-28 15:09:56 -04:00 • committed by GitHub
commit e54c2220af
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 77 additions and 78 deletions

View file

@ -6,20 +6,20 @@
An official Rust Model Context Protocol SDK implementation with tokio async runtime. An official Rust Model Context Protocol SDK implementation with tokio async runtime.
> **Migrating to 1.x?** See the [migration guide](https://github.com/modelcontextprotocol/rust-sdk/discussions/716) for breaking changes and upgrade instructions. > **Migrating to 3.x?** See the [migration guide](https://github.com/modelcontextprotocol/rust-sdk/discussions/969) for breaking changes and upgrade instructions.
This repository contains the following crates: This repository contains the following crates:
- [rmcp](crates/rmcp): The core crate providing the RMCP protocol implementation - see [rmcp](crates/rmcp/README.md) - [rmcp](crates/rmcp): The core crate providing the RMCP protocol implementation - see [rmcp](crates/rmcp/README.md)
- [rmcp-macros](crates/rmcp-macros): A procedural macro crate for generating RMCP tool implementations - see [rmcp-macros](crates/rmcp-macros/README.md) - [rmcp-macros](crates/rmcp-macros): A procedural macro crate for generating RMCP tool implementations - see [rmcp-macros](crates/rmcp-macros/README.md)
This SDK tracks the MCP **`2026-07-28`** draft (the current development spec) This SDK implements the stable MCP **`2026-07-28`** specification while
while remaining fully compatible with the stable **`2025-11-25`** release and remaining fully compatible with the **`2025-11-25`** release and earlier
earlier versions. New `2026-07-28` features — server discovery & negotiation, versions. Features introduced in `2026-07-28` — server discovery & negotiation,
transport-neutral subscriptions, long-running tasks, response caching, transport-neutral subscriptions, long-running tasks, response caching,
multi-round-trip requests, and standard HTTP routing headers — are documented multi-round-trip requests, and standard HTTP routing headers — are documented
below alongside the stable feature set. For the full MCP specification, see below. For the full MCP specification, see
[modelcontextprotocol.io](https://modelcontextprotocol.io/specification/draft). [modelcontextprotocol.io](https://modelcontextprotocol.io/specification/2026-07-28).
## Table of Contents ## Table of Contents
@ -185,7 +185,7 @@ let quit_reason = server.cancel().await?;
Tools let servers expose callable functions to clients. Each tool has a name, description, and a JSON Schema for its parameters. Clients discover tools via `list_tools` and invoke them via `call_tool`. Tools let servers expose callable functions to clients. Each tool has a name, description, and a JSON Schema for its parameters. Clients discover tools via `list_tools` and invoke them via `call_tool`.
**MCP Spec:** [Tools](https://modelcontextprotocol.io/specification/draft/server/tools) **MCP Spec:** [Tools](https://modelcontextprotocol.io/specification/2026-07-28/server/tools)
### Server-side ### Server-side
@ -274,7 +274,7 @@ let result = client.call_tool(CallToolRequestParams::new("add")).await?;
Resources let servers expose data (files, database records, API responses) that clients can read. Each resource is identified by a URI and returns content as text or binary (base64-encoded) data. Resource templates allow servers to declare URI patterns with dynamic parameters. Resources let servers expose data (files, database records, API responses) that clients can read. Each resource is identified by a URI and returns content as text or binary (base64-encoded) data. Resource templates allow servers to declare URI patterns with dynamic parameters.
**MCP Spec:** [Resources](https://modelcontextprotocol.io/specification/draft/server/resources) **MCP Spec:** [Resources](https://modelcontextprotocol.io/specification/2026-07-28/server/resources)
### Server-side ### Server-side
@ -409,7 +409,7 @@ impl ClientHandler for MyClient {
Prompts are reusable message templates that servers expose to clients. They accept typed arguments and return conversation messages. The `#[prompt]` macro handles argument validation and routing automatically. Prompts are reusable message templates that servers expose to clients. They accept typed arguments and return conversation messages. The `#[prompt]` macro handles argument validation and routing automatically.
**MCP Spec:** [Prompts](https://modelcontextprotocol.io/specification/draft/server/prompts) **MCP Spec:** [Prompts](https://modelcontextprotocol.io/specification/2026-07-28/server/prompts)
### Server-side ### Server-side
@ -523,7 +523,7 @@ context.peer.notify_prompt_list_changed().await?;
Sampling flips the usual direction: the server asks the client to run an LLM completion. The server sends a `create_message` request, the client processes it through its LLM, and returns the result. Sampling flips the usual direction: the server asks the client to run an LLM completion. The server sends a `create_message` request, the client processes it through its LLM, and returns the result.
**MCP Spec:** [Sampling](https://modelcontextprotocol.io/specification/draft/client/sampling) **MCP Spec:** [Sampling](https://modelcontextprotocol.io/specification/2026-07-28/client/sampling)
### Server-side (requesting sampling) ### Server-side (requesting sampling)
@ -595,7 +595,7 @@ impl ClientHandler for MyClient {
Roots tell servers which directories or projects the client is working in. A root is a URI (typically `file://`) pointing to a workspace or repository. Servers can query roots to know where to look for files and how to scope their work. Roots tell servers which directories or projects the client is working in. A root is a URI (typically `file://`) pointing to a workspace or repository. Servers can query roots to know where to look for files and how to scope their work.
**MCP Spec:** [Roots](https://modelcontextprotocol.io/specification/draft/client/roots) **MCP Spec:** [Roots](https://modelcontextprotocol.io/specification/2026-07-28/client/roots)
### Server-side ### Server-side
@ -660,7 +660,7 @@ client.notify_roots_list_changed().await?;
Servers can send structured log messages to clients. The client sets a minimum severity level, and the server sends messages through the peer notification interface. Servers can send structured log messages to clients. The client sets a minimum severity level, and the server sends messages through the peer notification interface.
**MCP Spec:** [Logging](https://modelcontextprotocol.io/specification/draft/server/utilities/logging) **MCP Spec:** [Logging](https://modelcontextprotocol.io/specification/2026-07-28/server/utilities/logging)
### Server-side ### Server-side
@ -733,7 +733,7 @@ client.set_level(SetLevelRequestParams::new(LoggingLevel::Warning)).await?;
Completions give auto-completion suggestions for prompt or resource template arguments. As a user fills in arguments, the client can ask the server for suggestions based on what's already been entered. Completions give auto-completion suggestions for prompt or resource template arguments. As a user fills in arguments, the client can ask the server for suggestions based on what's already been entered.
**MCP Spec:** [Completions](https://modelcontextprotocol.io/specification/draft/server/utilities/completion) **MCP Spec:** [Completions](https://modelcontextprotocol.io/specification/2026-07-28/server/utilities/completion)
### Server-side ### Server-side
@ -815,7 +815,7 @@ let result = client.complete(CompleteRequestParams::new(
Notifications are fire-and-forget messages -- no response is expected. They cover progress updates, cancellation, and lifecycle events. Both sides can send and receive them. Notifications are fire-and-forget messages -- no response is expected. They cover progress updates, cancellation, and lifecycle events. Both sides can send and receive them.
**MCP Spec:** [Notifications](https://modelcontextprotocol.io/specification/draft/basic#notifications) **MCP Spec:** [Notifications](https://modelcontextprotocol.io/specification/2026-07-28/basic#notifications)
### Progress notifications ### Progress notifications
@ -903,7 +903,7 @@ Protocol `2026-07-28` replaces `resources/subscribe`, `resources/unsubscribe`, a
the standalone HTTP GET stream with the transport-neutral, long-lived the standalone HTTP GET stream with the transport-neutral, long-lived
`subscriptions/listen` request. Each requested notification category is opt-in. `subscriptions/listen` request. Each requested notification category is opt-in.
**MCP Spec:** [Subscriptions](https://modelcontextprotocol.io/specification/draft/basic/patterns/subscriptions) **MCP Spec:** [Subscriptions](https://modelcontextprotocol.io/specification/2026-07-28/basic/patterns/subscriptions)
### Server-side ### Server-side
@ -995,7 +995,7 @@ one or more embedded server requests (elicitation, sampling, or roots) and then
retry. The exchange is stateless — the server carries its progress in an opaque retry. The exchange is stateless — the server carries its progress in an opaque
`requestState` that the client echoes back verbatim. `requestState` that the client echoes back verbatim.
**MCP Spec:** [Multiple Round-Trip Requests](https://modelcontextprotocol.io/specification/draft/server/tools#multiple-round-trip-requests) **MCP Spec:** [Multiple Round-Trip Requests](https://modelcontextprotocol.io/specification/2026-07-28/server/tools#multiple-round-trip-requests)
### Server-side ### Server-side
@ -1098,7 +1098,7 @@ See [`servers_task_stdio`](examples/servers/src/task_stdio.rs) and the matching
## Caching ## Caching
`rmcp` clients transparently cache responses that carry the `rmcp` clients transparently cache responses that carry the
[SEP-2549](https://modelcontextprotocol.io/specification/draft/server/utilities/caching) [SEP-2549](https://modelcontextprotocol.io/specification/2026-07-28/server/utilities/caching)
caching hints (`ttlMs` / `cacheScope`) for `server/discover`, `tools/list`, caching hints (`ttlMs` / `cacheScope`) for `server/discover`, `tools/list`,
`prompts/list`, `resources/list`, `resources/templates/list`, and `resources/read`. `prompts/list`, `resources/list`, `resources/templates/list`, and `resources/read`.
@ -1150,7 +1150,7 @@ validates these automatically once a connection negotiates `2026-07-28` or
newer — no call-site changes are required, and older negotiated versions are newer — no call-site changes are required, and older negotiated versions are
untouched. untouched.
**MCP Spec:** [Header standardization](https://modelcontextprotocol.io/specification/draft/basic/transports#header) **MCP Spec:** [Header standardization](https://modelcontextprotocol.io/specification/2026-07-28/basic/transports#header)
- `Mcp-Method` — the JSON-RPC method (e.g. `tools/call`). - `Mcp-Method` — the JSON-RPC method (e.g. `tools/call`).
- `Mcp-Name` — the target name, sourced from `params.name` (`tools/call`, - `Mcp-Name` — the target name, sourced from `params.name` (`tools/call`,
@ -1186,7 +1186,7 @@ no `Mcp-Session-Id`, no standalone GET/DELETE stream, and no `Last-Event-ID`
resumption. The `legacy_session_mode` flag below only controls behavior for resumption. The `legacy_session_mode` flag below only controls behavior for
*legacy* protocol versions (`< 2026-07-28`). *legacy* protocol versions (`< 2026-07-28`).
**MCP Spec:** [Transports](https://modelcontextprotocol.io/specification/draft/basic/transports) **MCP Spec:** [Transports](https://modelcontextprotocol.io/specification/2026-07-28/basic/transports)
### Server-side ### Server-side
@ -1249,8 +1249,8 @@ See [Oauth_support](docs/OAUTH_SUPPORT.md) for details.
## Related Resources ## Related Resources
- [MCP Specification](https://modelcontextprotocol.io/specification/draft) - [MCP Specification](https://modelcontextprotocol.io/specification/2026-07-28)
- [Schema](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/schema/draft/schema.ts) - [Schema](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/schema/2026-07-28/schema.ts)
## Related Projects ## Related Projects

View file

@ -11,7 +11,7 @@
</div> </div>
The official Rust SDK for the [Model Context Protocol](https://modelcontextprotocol.io/specification/draft). Build MCP servers that expose tools, resources, and prompts to AI assistants — or build clients that connect to them. The official Rust SDK for the [Model Context Protocol](https://modelcontextprotocol.io/specification/2026-07-28). Build MCP servers that expose tools, resources, and prompts to AI assistants — or build clients that connect to them.
For **getting started**, **usage guides**, and **full MCP feature documentation** (resources, prompts, sampling, roots, logging, completions, subscriptions, etc.), see the [main README](../../README.md). For **getting started**, **usage guides**, and **full MCP feature documentation** (resources, prompts, sampling, roots, logging, completions, subscriptions, etc.), see the [main README](../../README.md).

View file

@ -171,7 +171,7 @@ impl<H: ServerHandler> Service<RoleServer> for H {
let subscription_id = context.id.clone(); let subscription_id = context.id.clone();
let subscription = let subscription =
SubscriptionContext::establish(context, requested, accepted).await?; SubscriptionContext::establish(context, requested, accepted).await?;
// The integrated draft schema defines a final result for graceful // The 2026-07-28 schema defines a final result for graceful
// server teardown; explicit stdio cancellation remains a notification. // server teardown; explicit stdio cancellation remains a notification.
self.listen(subscription).await.map(|()| { self.listen(subscription).await.map(|()| {
ServerResult::SubscriptionsListenResult( ServerResult::SubscriptionsListenResult(
@ -405,7 +405,7 @@ macro_rules! server_handler_methods {
/// ///
/// The SDK sends the acknowledgment before invoking this method. Returning /// The SDK sends the acknowledgment before invoking this method. Returning
/// `Ok(())` sends the final [`SubscriptionsListenResult`] defined by the /// `Ok(())` sends the final [`SubscriptionsListenResult`] defined by the
/// integrated draft schema, marking graceful server teardown. Explicit /// 2026-07-28 schema, marking graceful server teardown. Explicit
/// stdio cancellation uses `notifications/cancelled` instead. /// stdio cancellation uses `notifications/cancelled` instead.
fn listen( fn listen(
&self, &self,

View file

@ -503,9 +503,9 @@ pub struct JsonRpcResponse<R = JsonObject> {
#[expect(clippy::exhaustive_structs, reason = "intentionally exhaustive")] #[expect(clippy::exhaustive_structs, reason = "intentionally exhaustive")]
pub struct JsonRpcError { pub struct JsonRpcError {
pub jsonrpc: JsonRpcVersion2_0, pub jsonrpc: JsonRpcVersion2_0,
// MCP 2025-11-25 §Error Responses: `id` is optional and omitted when the // MCP 2026-07-28 §Error Responses: `id` is optional and omitted when the
// server cannot read the request id (e.g. parse error / invalid request). // server cannot read the request id (e.g. parse error / invalid request).
// https://modelcontextprotocol.io/specification/2025-11-25/basic#error-responses // https://modelcontextprotocol.io/specification/2026-07-28/basic#error-responses
#[serde(default, skip_serializing_if = "Option::is_none")] #[serde(default, skip_serializing_if = "Option::is_none")]
pub id: Option<RequestId>, pub id: Option<RequestId>,
pub error: ErrorData, pub error: ErrorData,
@ -1534,7 +1534,7 @@ macro_rules! paginated_result {
/// the server handler clears the field when responding to peers that /// the server handler clears the field when responding to peers that
/// negotiated an older version. /// negotiated an older version.
/// ///
/// [spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/5bed7b30527019e34ccb0eb474636651424501f6/schema/draft/schema.ts#L225-L234 /// [spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/271ecc9accafdd9b83a3c869fa67c22953b2af80/schema/2026-07-28/schema.ts#L219-L235
#[serde(default, skip_serializing_if = "Option::is_none")] #[serde(default, skip_serializing_if = "Option::is_none")]
pub result_type: Option<ResultType>, pub result_type: Option<ResultType>,
#[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")] #[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")]
@ -1688,7 +1688,7 @@ pub struct ReadResourceResult {
/// the server handler clears the field when responding to peers that /// the server handler clears the field when responding to peers that
/// negotiated an older version. /// negotiated an older version.
/// ///
/// [spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/5bed7b30527019e34ccb0eb474636651424501f6/schema/draft/schema.ts#L225-L234 /// [spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/271ecc9accafdd9b83a3c869fa67c22953b2af80/schema/2026-07-28/schema.ts#L219-L235
#[serde(default, skip_serializing_if = "Option::is_none")] #[serde(default, skip_serializing_if = "Option::is_none")]
pub result_type: Option<ResultType>, pub result_type: Option<ResultType>,
/// Time, in milliseconds, that this result may be treated as fresh (SEP-2549). /// Time, in milliseconds, that this result may be treated as fresh (SEP-2549).
@ -2046,7 +2046,7 @@ fn subscriptions_listen_request_meta_schema(
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
#[non_exhaustive] #[non_exhaustive]
pub struct SubscriptionsListenRequestParams { pub struct SubscriptionsListenRequestParams {
/// Protocol-level metadata. Required by the draft wire schema. /// Protocol-level metadata. Required by the 2026-07-28 wire schema.
#[serde(rename = "_meta", skip_serializing_if = "Option::is_none")] #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
#[cfg_attr( #[cfg_attr(
feature = "schemars", feature = "schemars",
@ -3262,7 +3262,7 @@ pub struct CompleteResult {
/// the server handler clears the field when responding to peers that /// the server handler clears the field when responding to peers that
/// negotiated an older version. /// negotiated an older version.
/// ///
/// [spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/5bed7b30527019e34ccb0eb474636651424501f6/schema/draft/schema.ts#L225-L234 /// [spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/271ecc9accafdd9b83a3c869fa67c22953b2af80/schema/2026-07-28/schema.ts#L219-L235
#[serde(default, skip_serializing_if = "Option::is_none")] #[serde(default, skip_serializing_if = "Option::is_none")]
pub result_type: Option<ResultType>, pub result_type: Option<ResultType>,
pub completion: CompletionInfo, pub completion: CompletionInfo,
@ -3721,7 +3721,7 @@ pub struct CallToolResult {
/// the server handler clears the field when responding to peers that /// the server handler clears the field when responding to peers that
/// negotiated an older version. /// negotiated an older version.
/// ///
/// [spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/5bed7b30527019e34ccb0eb474636651424501f6/schema/draft/schema.ts#L225-L234 /// [spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/271ecc9accafdd9b83a3c869fa67c22953b2af80/schema/2026-07-28/schema.ts#L219-L235
#[serde(default, skip_serializing_if = "Option::is_none")] #[serde(default, skip_serializing_if = "Option::is_none")]
pub result_type: Option<ResultType>, pub result_type: Option<ResultType>,
/// The content returned by the tool (text, images, etc.) /// The content returned by the tool (text, images, etc.)
@ -4105,7 +4105,7 @@ pub struct GetPromptResult {
/// the server handler clears the field when responding to peers that /// the server handler clears the field when responding to peers that
/// negotiated an older version. /// negotiated an older version.
/// ///
/// [spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/5bed7b30527019e34ccb0eb474636651424501f6/schema/draft/schema.ts#L225-L234 /// [spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/271ecc9accafdd9b83a3c869fa67c22953b2af80/schema/2026-07-28/schema.ts#L219-L235
#[serde(default, skip_serializing_if = "Option::is_none")] #[serde(default, skip_serializing_if = "Option::is_none")]
pub result_type: Option<ResultType>, pub result_type: Option<ResultType>,
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]

View file

@ -358,7 +358,7 @@ impl schemars::JsonSchema for MetaObject {
fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema { fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
schemars::json_schema!({ schemars::json_schema!({
"description": "See [specification/draft/basic/index#general-fields] for notes on _meta usage.", "description": "See [MCP general fields](https://modelcontextprotocol.io/specification/2026-07-28/basic#general-fields) for notes on _meta usage.",
"type": "object", "type": "object",
"additionalProperties": true, "additionalProperties": true,
}) })
@ -374,10 +374,9 @@ impl schemars::JsonSchema for MetaObject {
/// - `io.modelcontextprotocol/clientCapabilities` (SEP-2575) /// - `io.modelcontextprotocol/clientCapabilities` (SEP-2575)
/// - `io.modelcontextprotocol/logLevel` (SEP-2575) /// - `io.modelcontextprotocol/logLevel` (SEP-2575)
/// ///
/// The 2026-07-28 draft schema marks the protocol-version, client-info, and /// The 2026-07-28 schema defines required per-request metadata; earlier
/// client-capabilities keys as required; earlier protocol versions do not know /// protocol versions do not know these keys. All keys therefore stay optional
/// them. All keys therefore stay optional at runtime and in the generated /// at runtime and in the generated (version-shared) JSON schema — use
/// (version-shared) JSON schema — use
/// [`RequestMetaObject::missing_required_keys`] to validate a request against /// [`RequestMetaObject::missing_required_keys`] to validate a request against
/// the negotiated protocol version. /// the negotiated protocol version.
/// ///
@ -396,7 +395,7 @@ impl RequestMetaObject {
const META_KEY_CLIENT_CAPABILITIES: &str = "io.modelcontextprotocol/clientCapabilities"; const META_KEY_CLIENT_CAPABILITIES: &str = "io.modelcontextprotocol/clientCapabilities";
const META_KEY_LOG_LEVEL: &str = "io.modelcontextprotocol/logLevel"; const META_KEY_LOG_LEVEL: &str = "io.modelcontextprotocol/logLevel";
/// Request `_meta` keys the 2026-07-28 draft schema marks as required. /// Request `_meta` keys validated for the 2026-07-28 protocol.
pub const DRAFT_REQUIRED_KEYS: [&str; 3] = [ pub const DRAFT_REQUIRED_KEYS: [&str; 3] = [
Self::META_KEY_PROTOCOL_VERSION, Self::META_KEY_PROTOCOL_VERSION,
Self::META_KEY_CLIENT_INFO, Self::META_KEY_CLIENT_INFO,
@ -510,7 +509,7 @@ impl RequestMetaObject {
/// meta.missing_required_keys(&ProtocolVersion::V_2025_11_25) /// meta.missing_required_keys(&ProtocolVersion::V_2025_11_25)
/// .is_empty() /// .is_empty()
/// ); /// );
/// // The 2026-07-28 draft requires the SEP-2575 keys. /// // The 2026-07-28 protocol requires per-request context.
/// assert_eq!( /// assert_eq!(
/// meta.missing_required_keys(&ProtocolVersion::V_2026_07_28), /// meta.missing_required_keys(&ProtocolVersion::V_2026_07_28),
/// RequestMetaObject::DRAFT_REQUIRED_KEYS.to_vec(), /// RequestMetaObject::DRAFT_REQUIRED_KEYS.to_vec(),
@ -577,9 +576,9 @@ impl schemars::JsonSchema for RequestMetaObject {
let client_capabilities = generator.subschema_for::<ClientCapabilities>(); let client_capabilities = generator.subschema_for::<ClientCapabilities>();
let log_level = generator.subschema_for::<LoggingLevel>(); let log_level = generator.subschema_for::<LoggingLevel>();
// rmcp generates one schema shared by every supported protocol // rmcp generates one schema shared by every supported protocol
// version, so the keys the 2026-07-28 draft marks as required are left // version, so the keys validated for 2026-07-28 are left
// optional here: a 2025-11-25 request whose `_meta` only carries // optional here: a 2025-11-25 request whose `_meta` only carries
// `progressToken` is valid. Draft-strict validation is available at // `progressToken` is valid. Version-specific validation is available at
// runtime via [`RequestMetaObject::missing_required_keys`]. // runtime via [`RequestMetaObject::missing_required_keys`].
schemars::json_schema!({ schemars::json_schema!({
"description": "Metadata reserved by MCP on requests. Extension keys are also allowed.", "description": "Metadata reserved by MCP on requests. Extension keys are also allowed.",

View file

@ -607,7 +607,7 @@ pub enum AuthorizationMetadataSource {
/// [Newer MCP revisions] require metadata discovery and do not define an /// [Newer MCP revisions] require metadata discovery and do not define an
/// endpoint-synthesis fallback. /// endpoint-synthesis fallback.
/// ///
/// [Newer MCP revisions]: https://modelcontextprotocol.io/specification/draft/basic/authorization/authorization-server-discovery#protected-resource-metadata-discovery-requirements /// [Newer MCP revisions]: https://modelcontextprotocol.io/specification/2026-07-28/basic/authorization/authorization-server-discovery#protected-resource-metadata-discovery-requirements
LegacyEndpointFallback, LegacyEndpointFallback,
} }
@ -705,7 +705,7 @@ impl OAuthClientConfig {
/// Declarative description of the client identity material available for an /// Declarative description of the client identity material available for an
/// authorization flow. /// authorization flow.
/// ///
/// The [MCP authorization specification](https://modelcontextprotocol.io/specification/draft/basic/authorization/client-registration) /// The [MCP authorization specification](https://modelcontextprotocol.io/specification/2026-07-28/basic/authorization/client-registration)
/// recommends that clients obtain a client ID using the following priority /// recommends that clients obtain a client ID using the following priority
/// order. [`OAuthState::start_authorization`] and [`AuthorizationSession::new`] /// order. [`OAuthState::start_authorization`] and [`AuthorizationSession::new`]
/// apply it internally: /// apply it internally:
@ -3245,7 +3245,7 @@ pub struct AuthorizationSession {
impl AuthorizationSession { impl AuthorizationSession {
/// Create a new authorization session, selecting a client registration /// Create a new authorization session, selecting a client registration
/// mechanism per the [MCP authorization specification](https://modelcontextprotocol.io/specification/draft/basic/authorization/client-registration) /// mechanism per the [MCP authorization specification](https://modelcontextprotocol.io/specification/2026-07-28/basic/authorization/client-registration)
/// priority order: /// priority order:
/// ///
/// 1. Pre-registered client information /// 1. Pre-registered client information
@ -3600,7 +3600,7 @@ impl OAuthState {
/// Start authorization. /// Start authorization.
/// ///
/// Selects a client registration mechanism from the identity material in /// Selects a client registration mechanism from the identity material in
/// `request`, following the [MCP authorization specification](https://modelcontextprotocol.io/specification/draft/basic/authorization/client-registration) /// `request`, following the [MCP authorization specification](https://modelcontextprotocol.io/specification/2026-07-28/basic/authorization/client-registration)
/// priority order: /// priority order:
/// ///
/// 1. Pre-registered client information /// 1. Pre-registered client information

View file

@ -63,7 +63,7 @@ pub struct StreamableHttpServerConfig {
/// When enabled, SSE priming events are sent to enable client reconnection. /// When enabled, SSE priming events are sent to enable client reconnection.
/// ///
/// Only applies to legacy protocol versions (`< 2026-07-28`). Per SEP-2567, /// Only applies to legacy protocol versions (`< 2026-07-28`). Per SEP-2567,
/// sessions are removed from the `2026-07-28` draft version, so requests /// sessions are removed from the `2026-07-28` version, so requests
/// negotiating that version are always served statelessly regardless of /// negotiating that version are always served statelessly regardless of
/// this setting. /// this setting.
pub legacy_session_mode: bool, pub legacy_session_mode: bool,
@ -745,7 +745,7 @@ fn validate_origin_header(
/// # Streamable HTTP server /// # Streamable HTTP server
/// ///
/// An HTTP service that implements the /// An HTTP service that implements the
/// [Streamable HTTP transport](https://modelcontextprotocol.io/specification/2025-11-25/basic/transports#streamable-http) /// [Streamable HTTP transport](https://modelcontextprotocol.io/specification/2026-07-28/basic/transports/streamable-http)
/// for MCP servers. /// for MCP servers.
/// ///
/// ## Session management /// ## Session management

View file

@ -61,15 +61,15 @@ mod tests {
); );
} }
/// The three metadata definitions must expose the MCP 2026-07-28 draft /// The three metadata definitions must expose the MCP 2026-07-28
/// vocabulary: `MetaObject` is an open map, `RequestMetaObject` reserves /// vocabulary: `MetaObject` is an open map, `RequestMetaObject` reserves
/// `progressToken` plus the SEP-2575 keys, and `NotificationMetaObject` /// `progressToken` plus the SEP-2575 keys, and `NotificationMetaObject`
/// reserves `io.modelcontextprotocol/subscriptionId`. The keys the draft /// reserves `io.modelcontextprotocol/subscriptionId`. Version-specific
/// marks as required stay optional because rmcp generates one schema /// required keys stay optional because rmcp generates one schema shared
/// shared by every supported protocol version; draft-strict validation is /// by every supported protocol version; current-version validation is
/// a runtime concern (`RequestMetaObject::missing_required_keys`). /// a runtime concern (`RequestMetaObject::missing_required_keys`).
#[test] #[test]
fn test_metadata_definitions_match_draft_schema() { fn test_metadata_definitions_match_2026_07_28_schema() {
let settings = SchemaSettings::draft07(); let settings = SchemaSettings::draft07();
let schema = settings let schema = settings
.into_generator() .into_generator()
@ -80,7 +80,7 @@ mod tests {
assert_eq!( assert_eq!(
definitions["MetaObject"], definitions["MetaObject"],
serde_json::json!({ serde_json::json!({
"description": "See [specification/draft/basic/index#general-fields] for notes on _meta usage.", "description": "See [MCP general fields](https://modelcontextprotocol.io/specification/2026-07-28/basic#general-fields) for notes on _meta usage.",
"type": "object", "type": "object",
"additionalProperties": true, "additionalProperties": true,
}) })

View file

@ -1206,7 +1206,7 @@
] ]
}, },
"MetaObject": { "MetaObject": {
"description": "See [specification/draft/basic/index#general-fields] for notes on _meta usage.", "description": "See [MCP general fields](https://modelcontextprotocol.io/specification/2026-07-28/basic#general-fields) for notes on _meta usage.",
"type": "object", "type": "object",
"additionalProperties": true "additionalProperties": true
}, },
@ -2233,7 +2233,7 @@
"type": "object", "type": "object",
"properties": { "properties": {
"_meta": { "_meta": {
"description": "Protocol-level metadata. Required by the draft wire schema.", "description": "Protocol-level metadata. Required by the 2026-07-28 wire schema.",
"type": "object", "type": "object",
"properties": { "properties": {
"io.modelcontextprotocol/clientCapabilities": { "io.modelcontextprotocol/clientCapabilities": {

View file

@ -1206,7 +1206,7 @@
] ]
}, },
"MetaObject": { "MetaObject": {
"description": "See [specification/draft/basic/index#general-fields] for notes on _meta usage.", "description": "See [MCP general fields](https://modelcontextprotocol.io/specification/2026-07-28/basic#general-fields) for notes on _meta usage.",
"type": "object", "type": "object",
"additionalProperties": true "additionalProperties": true
}, },
@ -2233,7 +2233,7 @@
"type": "object", "type": "object",
"properties": { "properties": {
"_meta": { "_meta": {
"description": "Protocol-level metadata. Required by the draft wire schema.", "description": "Protocol-level metadata. Required by the 2026-07-28 wire schema.",
"type": "object", "type": "object",
"properties": { "properties": {
"io.modelcontextprotocol/clientCapabilities": { "io.modelcontextprotocol/clientCapabilities": {

View file

@ -199,7 +199,7 @@
] ]
}, },
"resultType": { "resultType": {
"description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/5bed7b30527019e34ccb0eb474636651424501f6/schema/draft/schema.ts#L225-L234", "description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/271ecc9accafdd9b83a3c869fa67c22953b2af80/schema/2026-07-28/schema.ts#L219-L235",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/ResultType" "$ref": "#/definitions/ResultType"
@ -328,7 +328,7 @@
"$ref": "#/definitions/CompletionInfo" "$ref": "#/definitions/CompletionInfo"
}, },
"resultType": { "resultType": {
"description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/5bed7b30527019e34ccb0eb474636651424501f6/schema/draft/schema.ts#L225-L234", "description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/271ecc9accafdd9b83a3c869fa67c22953b2af80/schema/2026-07-28/schema.ts#L219-L235",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/ResultType" "$ref": "#/definitions/ResultType"
@ -1144,7 +1144,7 @@
} }
}, },
"resultType": { "resultType": {
"description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/5bed7b30527019e34ccb0eb474636651424501f6/schema/draft/schema.ts#L225-L234", "description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/271ecc9accafdd9b83a3c869fa67c22953b2af80/schema/2026-07-28/schema.ts#L219-L235",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/ResultType" "$ref": "#/definitions/ResultType"
@ -1789,7 +1789,7 @@
} }
}, },
"resultType": { "resultType": {
"description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/5bed7b30527019e34ccb0eb474636651424501f6/schema/draft/schema.ts#L225-L234", "description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/271ecc9accafdd9b83a3c869fa67c22953b2af80/schema/2026-07-28/schema.ts#L219-L235",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/ResultType" "$ref": "#/definitions/ResultType"
@ -1850,7 +1850,7 @@
} }
}, },
"resultType": { "resultType": {
"description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/5bed7b30527019e34ccb0eb474636651424501f6/schema/draft/schema.ts#L225-L234", "description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/271ecc9accafdd9b83a3c869fa67c22953b2af80/schema/2026-07-28/schema.ts#L219-L235",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/ResultType" "$ref": "#/definitions/ResultType"
@ -1911,7 +1911,7 @@
} }
}, },
"resultType": { "resultType": {
"description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/5bed7b30527019e34ccb0eb474636651424501f6/schema/draft/schema.ts#L225-L234", "description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/271ecc9accafdd9b83a3c869fa67c22953b2af80/schema/2026-07-28/schema.ts#L219-L235",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/ResultType" "$ref": "#/definitions/ResultType"
@ -1971,7 +1971,7 @@
] ]
}, },
"resultType": { "resultType": {
"description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/5bed7b30527019e34ccb0eb474636651424501f6/schema/draft/schema.ts#L225-L234", "description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/271ecc9accafdd9b83a3c869fa67c22953b2af80/schema/2026-07-28/schema.ts#L219-L235",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/ResultType" "$ref": "#/definitions/ResultType"
@ -2061,7 +2061,7 @@
] ]
}, },
"MetaObject": { "MetaObject": {
"description": "See [specification/draft/basic/index#general-fields] for notes on _meta usage.", "description": "See [MCP general fields](https://modelcontextprotocol.io/specification/2026-07-28/basic#general-fields) for notes on _meta usage.",
"type": "object", "type": "object",
"additionalProperties": true "additionalProperties": true
}, },
@ -2595,7 +2595,7 @@
} }
}, },
"resultType": { "resultType": {
"description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/5bed7b30527019e34ccb0eb474636651424501f6/schema/draft/schema.ts#L225-L234", "description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/271ecc9accafdd9b83a3c869fa67c22953b2af80/schema/2026-07-28/schema.ts#L219-L235",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/ResultType" "$ref": "#/definitions/ResultType"

View file

@ -199,7 +199,7 @@
] ]
}, },
"resultType": { "resultType": {
"description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/5bed7b30527019e34ccb0eb474636651424501f6/schema/draft/schema.ts#L225-L234", "description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/271ecc9accafdd9b83a3c869fa67c22953b2af80/schema/2026-07-28/schema.ts#L219-L235",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/ResultType" "$ref": "#/definitions/ResultType"
@ -328,7 +328,7 @@
"$ref": "#/definitions/CompletionInfo" "$ref": "#/definitions/CompletionInfo"
}, },
"resultType": { "resultType": {
"description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/5bed7b30527019e34ccb0eb474636651424501f6/schema/draft/schema.ts#L225-L234", "description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/271ecc9accafdd9b83a3c869fa67c22953b2af80/schema/2026-07-28/schema.ts#L219-L235",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/ResultType" "$ref": "#/definitions/ResultType"
@ -1144,7 +1144,7 @@
} }
}, },
"resultType": { "resultType": {
"description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/5bed7b30527019e34ccb0eb474636651424501f6/schema/draft/schema.ts#L225-L234", "description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/271ecc9accafdd9b83a3c869fa67c22953b2af80/schema/2026-07-28/schema.ts#L219-L235",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/ResultType" "$ref": "#/definitions/ResultType"
@ -1789,7 +1789,7 @@
} }
}, },
"resultType": { "resultType": {
"description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/5bed7b30527019e34ccb0eb474636651424501f6/schema/draft/schema.ts#L225-L234", "description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/271ecc9accafdd9b83a3c869fa67c22953b2af80/schema/2026-07-28/schema.ts#L219-L235",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/ResultType" "$ref": "#/definitions/ResultType"
@ -1850,7 +1850,7 @@
} }
}, },
"resultType": { "resultType": {
"description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/5bed7b30527019e34ccb0eb474636651424501f6/schema/draft/schema.ts#L225-L234", "description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/271ecc9accafdd9b83a3c869fa67c22953b2af80/schema/2026-07-28/schema.ts#L219-L235",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/ResultType" "$ref": "#/definitions/ResultType"
@ -1911,7 +1911,7 @@
} }
}, },
"resultType": { "resultType": {
"description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/5bed7b30527019e34ccb0eb474636651424501f6/schema/draft/schema.ts#L225-L234", "description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/271ecc9accafdd9b83a3c869fa67c22953b2af80/schema/2026-07-28/schema.ts#L219-L235",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/ResultType" "$ref": "#/definitions/ResultType"
@ -1971,7 +1971,7 @@
] ]
}, },
"resultType": { "resultType": {
"description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/5bed7b30527019e34ccb0eb474636651424501f6/schema/draft/schema.ts#L225-L234", "description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/271ecc9accafdd9b83a3c869fa67c22953b2af80/schema/2026-07-28/schema.ts#L219-L235",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/ResultType" "$ref": "#/definitions/ResultType"
@ -2061,7 +2061,7 @@
] ]
}, },
"MetaObject": { "MetaObject": {
"description": "See [specification/draft/basic/index#general-fields] for notes on _meta usage.", "description": "See [MCP general fields](https://modelcontextprotocol.io/specification/2026-07-28/basic#general-fields) for notes on _meta usage.",
"type": "object", "type": "object",
"additionalProperties": true "additionalProperties": true
}, },
@ -2595,7 +2595,7 @@
} }
}, },
"resultType": { "resultType": {
"description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/5bed7b30527019e34ccb0eb474636651424501f6/schema/draft/schema.ts#L225-L234", "description": "Result type discriminator (SEP-2322). Required by the [spec schema]\nfor servers implementing protocol version `2026-07-28`, but optional\nhere because this type also models results from older protocol\nversions, which do not carry the field: `None` means absent on the\nwire, and per the spec \"the client MUST treat the absent field as\n`\"complete\"`\". Constructors default to `Some(ResultType::COMPLETE)`;\nthe server handler clears the field when responding to peers that\nnegotiated an older version.\n\n[spec schema]: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/271ecc9accafdd9b83a3c869fa67c22953b2af80/schema/2026-07-28/schema.ts#L219-L235",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/ResultType" "$ref": "#/definitions/ResultType"

View file

@ -1,6 +1,6 @@
# Model Context Protocol OAuth Authorization # Model Context Protocol OAuth Authorization
This document describes the OAuth 2.1 authorization implementation for Model Context Protocol (MCP), following the [MCP Authorization Specification](https://modelcontextprotocol.io/specification/draft/basic/authorization/). This document describes the OAuth 2.1 authorization implementation for Model Context Protocol (MCP), following the [MCP Authorization Specification](https://modelcontextprotocol.io/specification/2026-07-28/basic/authorization/).
## Features ## Features
@ -160,7 +160,7 @@ distinguish server-published metadata from synthesized metadata.
The `OAuthState` state machine manages the full authorization lifecycle. The `OAuthState` state machine manages the full authorization lifecycle.
`start_authorization` accepts an `AuthorizationRequest` describing the client `start_authorization` accepts an `AuthorizationRequest` describing the client
identity material you have available, and selects a client registration identity material you have available, and selects a client registration
mechanism following the [spec's priority order](https://modelcontextprotocol.io/specification/draft/basic/authorization/client-registration): mechanism following the [spec's priority order](https://modelcontextprotocol.io/specification/2026-07-28/basic/authorization/client-registration):
1. **Pre-registered client information** (`with_preregistered_client`), when 1. **Pre-registered client information** (`with_preregistered_client`), when
the client already holds a `client_id` issued out of band the client already holds a `client_id` issued out of band
@ -331,7 +331,7 @@ If you encounter authorization issues, check the following:
## References ## References
- [MCP Authorization Specification](https://modelcontextprotocol.io/specification/draft/basic/authorization/) - [MCP Authorization Specification](https://modelcontextprotocol.io/specification/2026-07-28/basic/authorization/)
- [OAuth 2.1 Specification Draft](https://oauth.net/2.1/) - [OAuth 2.1 Specification Draft](https://oauth.net/2.1/)
- [RFC 8414: OAuth 2.0 Authorization Server Metadata](https://datatracker.ietf.org/doc/html/rfc8414) - [RFC 8414: OAuth 2.0 Authorization Server Metadata](https://datatracker.ietf.org/doc/html/rfc8414)
- [RFC 7591: OAuth 2.0 Dynamic Client Registration Protocol](https://datatracker.ietf.org/doc/html/rfc7591) - [RFC 7591: OAuth 2.0 Dynamic Client Registration Protocol](https://datatracker.ietf.org/doc/html/rfc7591)