skip to content

Which MCP methods can return input_required, and what may they ask for?

level: middleimportance: should knowfreq 44%

answer

  1. only the calls that actually do work
  2. three methods, three request kinds
  3. listing calls never pause
  4. completion, roots, or ask the user
  5. two of the three are deprecated

basics

~20 s

Only tools/call, prompts/get and resources/read may answer with an input_required result. Each entry in its inputRequests map is one of three request types: a sampling createMessage request, a roots list request, or an elicitation request.

solid answer

~40 s

In MCP revision 2026-07-28 the Multi Round-Trip Request pattern is deliberately narrow. Just three methods may return an `InputRequiredResult`: **`tools/call`**, **`prompts/get`** and **`resources/read`** — the calls that do real work on the server's side and can plausibly need something only the client can provide. Listing calls (`tools/list`, `prompts/list`, `resources/list`, `resources/templates/list`), `server/discover` and `completion/complete` always answer with a complete result. What may be asked is the union `InputRequest = CreateMessageRequest | ListRootsRequest | ElicitRequest`: an LLM completion from the client (`sampling/createMessage`, deprecated in 2026-07-28), the client's filesystem roots (`roots/list`, also deprecated), or a value from the user (`elicitation/create`, not deprecated). The answers come back as the matching `CreateMessageResult`, `ListRootsResult` or `ElicitResult`.

go deeper

for a junior

Recall the two short lists: tools/call, prompts/get and resources/read are the calls that can pause, and they can ask for a completion, the client's roots, or a value from the user.

for a middle

Name the unions precisely — CreateMessageRequest, ListRootsRequest and ElicitRequest going out, and their matching result types coming back — and say why listing calls are excluded.

for a senior

Add the deprecation state: sampling and roots are deprecated in 2026-07-28 with removal no earlier than 2027-07-28, elicitation is not, so build new flows on elicitation or plain tool arguments while still handling the old kinds.

for a principal

Speak to why the union is closed: a client must enumerate every way a server can reach the model or the user, which is what lets the host put consent in front of each one and keeps the trust boundary auditable.

## The closed set of methods MCP 2026-07-28 does not let any call pause for input. Exactly three may return a result whose `resultType` is `"input_required"`: - `tools/call` - `prompts/get` - `resources/read` Everything else — `tools/list`, `prompts/list`, `resources/list`, `resources/templates/list`, `server/discover`, `completion/complete` — must answer with a complete result. The line is drawn along a sensible axis: discovery and enumeration are cheap, cacheable, and describe what the server offers regardless of the caller, so they can never depend on client-side input. The three that can pause are the ones that *execute* something. A practical consequence for client implementers: the MRTR loop only needs to exist in the code paths for those three methods. A client's list-fetching code can assume a single round trip. ## The closed set of things that can be asked Each value in the `inputRequests` map is one member of the union: ``` InputRequest = CreateMessageRequest | ListRootsRequest | ElicitRequest ``` - **`sampling/createMessage`** — the server asks the client's LLM to produce a completion. Sampling was **deprecated** in 2026-07-28 (SEP-2577); the stated migration is for servers to integrate directly with an LLM provider API instead. - **`roots/list`** — the server asks which directories or files the client considers in scope. Roots was **deprecated** in the same revision; the migration is to pass paths as tool parameters, resource URIs, or server configuration. - **`elicitation/create`** — the server asks the *user*, through the client's UI, for a value. Elicitation is **not** deprecated and is the one member of the union expected to grow in use. The symmetric union on the way back is `InputResponse = CreateMessageResult | ListRootsResult | ElicitResult`. There is no fourth kind, and a server cannot invent one: an extension that needs a different interaction defines its own mechanism rather than widening this union. ## Why the union is closed A client must be able to enumerate, at build time, every kind of thing a server can demand of it — that is what makes the capability model meaningful. `ClientCapabilities` advertises `elicitation`, `roots` and `sampling`, and a server that asks for something the client never declared should expect failure rather than cooperation. A closed union also keeps the security story tractable: the host knows the complete list of ways a server can reach back toward the user or the model, and can put consent in front of each one. ## Reading the deprecations correctly Two of the three members being deprecated in the same revision that made MRTR the only path can look contradictory. It is not: MRTR is the *transport* of these interactions, and it will outlive the two deprecated payload types. Deprecated features remain in the spec for at least twelve months, with the earliest removal in the first revision released on or after **2027-07-28**, and new implementations SHOULD NOT adopt them. So in 2026 you must still be able to *receive* a `roots/list` or `sampling/createMessage` request from an older server, while designing anything new around elicitation or plain tool parameters. ## Multiple asks in one round Because `inputRequests` is a map rather than a single field, one interim result can carry several entries of different kinds — say an elicitation and a roots request under two different server-assigned keys. The client fulfils each, fills the corresponding key in `inputResponses`, and retries once with all the answers, rather than making a round trip per item. ## Interview framing The strongest answer names the three methods, names the three request types, and flags which are deprecated and which is not. A candidate who says "any request can return input_required" or who describes the server calling the client directly is answering from the pre-2026-07-28 era.

  • Why can tools/list never return an input_required result?
    Listing is a description of what the server offers, not an execution, and its result is cacheable with ttlMs and cacheScope. MCP 2026-07-28 also requires that the tool set MUST NOT vary per connection, so there is nothing the client could supply that would change the listing — it may only vary by the authorization presented.
  • Can one inputRequests map mix different kinds of request?
    Yes. It is a map from server-assigned keys to InputRequest values, and the members may differ — an elicitation under one key and a roots request under another. The client fulfils all of them and returns every answer in a single retry, which keeps the number of round trips down.
  • If sampling and roots are deprecated, should a new server still use them?
    No. New implementations SHOULD NOT adopt deprecated features; servers should call an LLM provider directly instead of sampling, and take paths as tool parameters or configuration instead of roots. They stay in the spec for at least twelve months, with the earliest removal in the first revision on or after 2027-07-28, so clients must still handle them.

saying these in an interview costs you the question

  • Claims any MCP request can return input_required
  • Says tools/list may pause for client input
  • Thinks the server opens a separate channel to ask
  • Treats elicitation as deprecated alongside sampling and roots
  • Expects to define a custom fourth input request type

context