diff --git a/docs/specification/draft/basic/lifecycle.mdx b/docs/specification/draft/basic/lifecycle.mdx
index b6a84a3f0..f5f513a99 100644
--- a/docs/specification/draft/basic/lifecycle.mdx
+++ b/docs/specification/draft/basic/lifecycle.mdx
@@ -150,18 +150,19 @@ available during the session.
Key capabilities include:
-| Category | Capability | Description |
-| -------- | -------------- | ------------------------------------------------------------------------------------ |
-| Client | `roots` | Ability to provide filesystem [roots](/specification/draft/client/roots) |
-| Client | `sampling` | Support for LLM [sampling](/specification/draft/client/sampling) requests |
-| Client | `elicitation` | Support for server [elicitation](/specification/draft/client/elicitation) requests |
-| Client | `experimental` | Describes support for non-standard experimental features |
-| Server | `prompts` | Offers [prompt templates](/specification/draft/server/prompts) |
-| Server | `resources` | Provides readable [resources](/specification/draft/server/resources) |
-| Server | `tools` | Exposes callable [tools](/specification/draft/server/tools) |
-| Server | `logging` | Emits structured [log messages](/specification/draft/server/utilities/logging) |
-| Server | `completions` | Supports argument [autocompletion](/specification/draft/server/utilities/completion) |
-| Server | `experimental` | Describes support for non-standard experimental features |
+| Category | Capability | Description |
+| -------- | ------------------- | ------------------------------------------------------------------------------------ |
+| Client | `roots` | Ability to provide filesystem [roots](/specification/draft/client/roots) |
+| Client | `sampling` | Support for LLM [sampling](/specification/draft/client/sampling) requests |
+| Client | `elicitation` | Support for server [elicitation](/specification/draft/client/elicitation) requests |
+| Client | `resumableRequests` | Support for [resumable requests](#resuming-requests) |
+| Client | `experimental` | Describes support for non-standard experimental features |
+| Server | `prompts` | Offers [prompt templates](/specification/draft/server/prompts) |
+| Server | `resources` | Provides readable [resources](/specification/draft/server/resources) |
+| Server | `tools` | Exposes callable [tools](/specification/draft/server/tools) |
+| Server | `logging` | Emits structured [log messages](/specification/draft/server/utilities/logging) |
+| Server | `completions` | Supports argument [autocompletion](/specification/draft/server/utilities/completion) |
+| Server | `experimental` | Describes support for non-standard experimental features |
Capability objects can describe sub-capabilities like:
@@ -179,6 +180,57 @@ Both parties **SHOULD**:
- Respect the negotiated protocol version
- Only use capabilities that were successfully negotiated
+#### Resuming Requests
+
+MCP provides a transport-agnostic mechanism for resuming requests across disconnections.
+
+If a client has advertised the [`resumableRequests`][] capability, a server **MAY** send a [`notifications/requests/resumePolicy`][] notification when responding to a request. The notification will specify the resume policy for the request in the event of disconnection, and will include a token that the client can use to resume the request.
+
+After the resume policy is sent, both the client and the server **MAY** disconnect at will. This allows servers to handle long-running requests without maintaining a constant connection.
+
+After a disconnection, clients can resume the request by sending a [`requests/resume`][] request with the **same message ID** as the original request, plus the server-issued token as a parameter. If the ID and token are valid per the resume policy, the server **SHOULD** reset policy-related timers, send any pending messages (e.g., progress notifications), and then continue as if it were handling the original request.
+
+
{ id: 123, params: { ... } }
+
+ Server-->>Client: notifications/requests/resumePolicy
{ params: { requestId: 123, resumeToken: "abc" } }
+ loop
+ Server-->>Client: Messages (e.g., notifications/progress)
+ end
+ Server--x-Client: Disconnection occurs
+
+ Note over Client: Client checks request status (optional)
+ Client->>+Server: requests/getStatus
{ params: { requestId: 123, resumeToken: "abc" } }
+ Server-->>-Client: GetRequestStatusResult
+
+ Note over Client: Client decides to resume
+ Client->>+Server: requests/resume
{ id: 123, params: { resumeToken: "abc" } }
[Same `id` as original request]
+ Server-->>Client: Undelivered messages
+ loop
+ Server-->>Client: Messages (e.g., notifications/progress)
+ end
+ Server-->>-Client: CallToolResult
{ id: 123, result: { ... } }
+```
+
+[`notifications/requests/resumePolicy`]: /specification/draft/schema#notifications%2Frequests%2Fresumepolicy
+[`resumableRequests`]: /specification/draft/schema#clientcapabilities-resumablerequests
+[`requests/getStatus`]: /specification/draft/schema#requests%2Fgetstatus
+[`requests/resume`]: /specification/draft/schema#requests%2Fresume
+
### Shutdown
During the shutdown phase, one side (usually the client) cleanly terminates the protocol
diff --git a/docs/specification/draft/basic/transports.mdx b/docs/specification/draft/basic/transports.mdx
index 582976b06..4cb8b47eb 100644
--- a/docs/specification/draft/basic/transports.mdx
+++ b/docs/specification/draft/basic/transports.mdx
@@ -107,8 +107,8 @@ MCP endpoint.
JSON-RPC _response_. These messages **SHOULD** relate to the originating client
_request_.
- The server **SHOULD NOT** close the SSE stream before sending the JSON-RPC _response_
- for the received JSON-RPC _request_, unless the [session](#session-management)
- expires.
+ or [_resume policy notification_](/specification/draft/basic/lifecycle#resuming-requests)
+ for the received JSON-RPC _request_, unless the [session](#session-management) expires.
- After the JSON-RPC _response_ has been sent, the server **SHOULD** close the SSE
stream.
- Disconnection **MAY** occur at any time (e.g., due to network conditions).
diff --git a/docs/specification/draft/schema.mdx b/docs/specification/draft/schema.mdx
index 458a2d482..bbca01a1f 100644
--- a/docs/specification/draft/schema.mdx
+++ b/docs/specification/draft/schema.mdx
@@ -27,7 +27,7 @@ the data is entirely optional.
Capabilities a client may support. Known capabilities are defined here, in this schema, but this is not a closed set: any client can define its own, additional capabilities.
Present if the client supports elicitation from the server.
Experimental, non-standard capabilities that the client supports.
Present if the client supports listing roots.
OptionallistChanged?: booleanWhether the client supports notifications for changes to the roots list.
Present if the client supports sampling from an LLM.
Capabilities a client may support. Known capabilities are defined here, in this schema, but this is not a closed set: any client can define its own, additional capabilities.
Present if the client supports elicitation from the server.
Experimental, non-standard capabilities that the client supports.
Present if the client supports resumable requests.
Present if the client supports listing roots.
OptionallistChanged?: booleanWhether the client supports notifications for changes to the roots list.
Present if the client supports sampling from an LLM.
An optional notification from the server to the client, informing it that the list of prompts it offers has changed. This may be issued by servers without any previous subscription from the client.
Optional_meta?: { [key: string]: unknown }See [specification/draft/basic/index#general-fields] for notes on _meta usage.
A notification to the client that a request is resumable, subject to the +specified policy.
The server SHOULD send this notification as soon as possible after +determining a request is resumable.
OptionalmaxWait?: numberThe maximum number of seconds a client may wait after a disconnection +before resuming the request or checking its status. After this time has +elapsed, the server MAY cancel the request and free all associated +resources.
If this number is omitted, the server provides no guarantee, and MAY +cancel the request at its own discretion.
OptionalminWait?: numberThe minimum number of seconds a client SHOULD wait after a disconnection +before resuming the request or checking its status.
The ID of the request.
An opaque token that the client MUST send back to the server when +resuming the request or checking its status.
This token should be treated as sensitive information because it can be +used to access messages related to the request.
The server's response to a prompts/list request from the client.
See [specification/draft/basic/index#general-fields] for notes on _meta usage.
An opaque token representing the pagination position after the last returned result. If present, there may be more results available.
A request from the client to the server to get the status of a resumable +request.
When handling this request, the server SHOULD also reset policy-related
+timers in the same way as for requests/resume.
The ID of the resumable request.
The resume token for the resumable request issued by the server via a notifications/requests/resumePolicy notification.
If this value does not match the token issued by the server, the server +MUST respond with an error.
A response to a requests/getStatus request.
See [specification/draft/basic/index#general-fields] for notes on _meta usage.
Whether the server has requested additional input from the client, such as +when making a sampling request.
Whether there are pending messages for the client that are related to the +resumable request, such as progress notifications or sampling requests.
The ID of the resumable request.
The current status of the resumable request.
"processing" indicates that the server is computing a response."completed" indicates that the server has computed a final response."failed" indicates that the server has a final response, but the
+response is an error.A request from the client to the server to resume a prior resumable request. +The ID of this request MUST be the same as the ID of the resumable request.
If the resumable request was cancelled (due to the resume policy or due to an +explicit cancellation request from the client), the server SHOULD respond +with an error.
The resume token for the original request issued by the server via a notifications/requests/resumePolicy notification.
If this value does not match the token issued by the server, the server +MUST respond with an error.
elicitation?: object;
experimental?: { [key: string]: object };
roots?: { listChanged?: boolean };
sampling?: object;
}