
This page is part of our MCP specification reference, a plain-English guide to the Model Context Protocol spec (version 2026-07-28), within The MCP Guide. Building a server? See MCP development.
Status in the 2026-07-28 spec: core (a required message pattern)
Multi-round-trip requests (MRTR) are how an MCP server asks for more information in the middle of a request without sending its own request to the client. The server replies with a result marked input_required that lists what it needs. The client gathers the answers and sends the original request again, with the answers attached.
MRTR arrived in the 2026-07-28 spec. It replaced the older pattern where servers sent elicitation/create, sampling/createMessage or roots/list requests back to the client. The MRTR page calls this "a breaking change."
This page explains the pattern in plain English, as of October 2026.
Key Takeaways
- MRTR lets a server request user input, a model response or roots while staying stateless.
- The server returns
resultType: "input_required"withinputRequests, an opaquerequestState, or both. - The client answers by retrying the original request with
inputResponsesand the echoedrequestState, under a new JSON-RPC ID. - Only
tools/call,prompts/getandresources/readmay return an input-required result. - Servers must treat
requestStateas attacker-controlled and integrity-protect it when it affects access or logic. - Servers may only ask for inputs the client has declared it supports.
What MRTR is
The spec describes a four-step flow:
- The client sends a request with the parameters for the operation.
- The server decides it needs more information and responds asking for it.
- The client gathers that information "from the user or other sources," then retries the original request with it attached.
- The server now has enough to finish and returns the final result.
The message patterns page lists MRTR as one of three core patterns, next to plain request-and-response and subscriptions. All implementations must support the message patterns.
Why it exists
The old approach did not fit a stateless, load-balanced world. SEP-2322, the proposal behind MRTR, walks through the problem. A tool call lands on server instance A. Server A sends an elicitation request on a stream. The user's answer comes back as a separate request, which the load balancer may send to instance B. Server A "must somehow discover the elicitation response delivered to server B."
The SEP notes that "the vast majority of MCP tools will be ephemeral," meaning they keep no state between steps, and "it is extremely common for tools to be deployed in a horizontally scaled, load balanced service." MRTR optimizes for that case. The server packs whatever it needs into the reply, and the retry carries it back. See why MCP became stateless for the bigger picture.
How it works
Step 1: the server asks
The server returns an InputRequiredResult. This example is trimmed from the spec to one elicitation request:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"resultType": "input_required",
"inputRequests": {
"github_login": {
"method": "elicitation/create",
"params": {
"mode": "form",
"message": "Please provide your GitHub username",
"requestedSchema": {
"type": "object",
"properties": { "name": { "type": "string" } },
"required": ["name"]
}
}
}
},
"requestState": "AEAD-protected blob"
}
}
The two fields:
| Field | What it is |
|---|---|
inputRequests | A map of server-chosen keys to requests: elicitation, sampling or list-roots |
requestState | An opaque string only the server understands; the client echoes it back unchanged |
Every input-required result must include at least one of the two.
Step 2: the client answers by retrying
The client asks the user, then sends the original tools/call again with a new ID. It adds inputResponses, keyed to match, and the exact requestState. The answer for the key above looks like this, per the spec:
{
"github_login": {
"action": "accept",
"content": { "name": "octocat" }
}
}
Step 3: the server finishes
The server reads the answers and the state, completes the work and returns a normal result with resultType: "complete". The spec stresses that "the server processing the retry does not need any information beyond what is directly present in the retry request."
Rules worth knowing
Server side
- Input-required results are allowed only on
prompts/get,resources/readandtools/call. - A server "MUST NOT send an
inputRequeststhat the client has not declared support for in its capabilities." Noelicitationcapability, no elicitation request. See MCP capabilities explained. - Servers "MUST NOT assume that clients will fulfill the
inputRequestsor retry." They may ask again if answers are missing, rather than returning an error.
Client side
- If
inputRequestsis present, the client must build those answers before retrying. - The client must echo
requestStateexactly, and must not "inspect, parse, modify, or make any assumptions about" it. - "The JSON-RPC
idMUST be different between the initial request and the retry." - The input fields apply only to that retry, never to other parallel requests.
Security: requestState is untrusted
Because requestState passes through the client, a malicious client could tamper with it. The spec is firm: servers "MUST treat requestState as an attacker-controlled input." If it influences authorization, resource access or business logic, servers must protect its integrity, for example with an HMAC or AEAD, and reject state that fails the check.
To limit replay, servers SHOULD bind the state to the signed-in user, a short expiry and the original request. The spec warns that this still does not guarantee single use. One-time actions, such as a redemption, need a server-side check. Our guide to MCP security risks covers related threats.
What changed across spec versions
- 2025-06-18 added elicitation as a server-to-client request, per its changelog.
- 2025-11-25 added URL-mode elicitation, along with a
notifications/elicitation/completenotification and anelicitationIdfield, per its changelog. - 2026-07-28 introduced MRTR and the required
resultTypefield. It removed the elicitation-complete notification andelicitationId, since "the client learns the outcome of an out-of-band interaction by retrying the original request," per the 2026-07-28 changelog.
Sampling and roots can still be requested through MRTR, but both were deprecated in the same release. In practice, MRTR's main long-term job is elicitation.
Common mistakes
- Reusing the request ID on the retry. The retry is a new, independent request.
- Trusting
requestStateblindly. Sign or encrypt it whenever it affects who can do what. - Asking for undeclared inputs. Check the client's capabilities first.
- Returning input-required on other methods. Only three methods allow it.
- Keeping the waiting work in server memory. That defeats the purpose. Encode what you need in
requestState, or use the Tasks extension for long jobs.
Next step
MRTR shows how the spec can change shape between versions. Learn how those changes are announced, phased in and retired in MCP versioning and deprecation policy, or see the MCP specification hub.
Frequently asked questions
What is MRTR in MCP?
MRTR stands for multi round-trip requests. When a server needs more input to finish a request, it returns an input_required result, and the client retries the original request with the answers. It was introduced in the 2026-07-28 spec.
Why did MCP replace server-to-client requests?
They required a held-open stream and a server that remembered the pending call. That broke behind load balancers. MRTR keeps each request self-contained, so any server instance can handle the retry.
Which MCP methods can return input_required?
Only tools/call, prompts/get and resources/read. Servers must not send input-required results on any other request.
Is requestState safe to put secrets in?
Treat it as visible to and editable by the client. Servers must integrity-protect it when it affects authorization or business logic, and should add an expiry and bind it to the user and request. Encrypt it if it holds anything the client should not read.
Does MRTR replace the Tasks extension?
No. MRTR handles a short pause for input within one request. The Tasks extension handles long-running work with polling and durable handles. They solve different problems.











