MCP elicitation and tasks

Handle missing user input and long-running work through Multi Round-Trip Requests and the MCP Tasks extension.

In this article

Some operations need information that is not available at the start. Others outlive one HTTP response. Modern MCP addresses these cases without restoring a hidden protocol session.

Fig 1Waiting for input differs from background work
STUDY MODEL
Inspect one part at a timePause for input
  1. Pause for input

    A tool request can return input_required when it needs missing user or client data to finish.

  2. Resume the request

    Supply the missing information and resume the same logical request.

  3. Detach a task

    Long-running work returns a task ID and working status, with optional progress.

  4. Inspect or cancel

    Use the task’s supported get, update, and cancel operations, then retrieve its final result.

Choose by lifetime: a paused logical request and an independently running task are different mechanisms.

How to read this model

A request holding bay beside an independent job magazine. The object is a teaching analogy. Inspecting a part highlights its role; it does not execute or simulate the software. Cabinet trays are records, workpieces are data, and latches are checks. Unless an explanation states a quantity, compartments and sample workpieces do not denote data counts. Part dimensions are not a quantitative scale.

Multi Round-Trip Requests carry input in-band

In protocol revision 2026-07-28, the server cannot start an unrelated request toward the client. While handling a client request, the server can return an input_required result. The result contains input requests and an opaque requestState value.

The client gathers the requested input and retries the original operation with inputResponses and the unchanged requestState.

client -> tools/call
server -> input_required + requestState
client -> user supplies approved input
client -> tools/call + inputResponses + requestState
server -> complete result

The server must treat returned input and requestState as untrusted. Sign or otherwise protect state that carries security-relevant data, apply expiry, and recheck authorization on the retried request.

Elicitation asks a person for information

Elicitation can request structured form input or a URL-based interaction according to supported capabilities. Use it for missing parameters, consent, or an approval that needs a user-facing explanation.

The host controls how the request appears and whether it is appropriate. A server must not use elicitation to collect secrets that the host should never expose.

Tasks represent durable asynchronous work

The Tasks extension is io.modelcontextprotocol/tasks. A server can return a task handle instead of a final tool result. The client observes progress through tasks/get, supplies requested input through tasks/update, and requests cancellation through tasks/cancel.

Task creation is server-directed after the client advertises support. The server decides that a particular operation should become a task.

A task handle is not proof of completion

The client must inspect terminal status and final result. Cancellation may race with an external effect. The server needs durable state, idempotency, and reconciliation just like any other background job system.

When a task enters input_required, outstanding requests appear in task state. The client responds and keeps observing until the task reaches a terminal state.

Bound all round trips

Set limits on input rounds, elapsed time, payload size, and retained state. A server that repeatedly asks for slightly different input can otherwise keep the user and client in an endless loop.

Sources

Last verified: September 23, 2026.

Keep track of your reading.

Your reading progress stays in this browser.