CourseModel Context Protocol · Module 4: Resources, Prompts and Interaction · part 25 of 83
Part 25 · Module 4: Resources, Prompts and Interaction

Topic 4: User interaction

39 min read·22 Sept 2026

Why a server needs to ask, and how it asks now

Some tools cannot finish with only the model's arguments. create_note should check with Nare before saving a note that looks like a duplicate. An import from Zotero needs Nare's Zotero API key, which the model must never see. Both need a person, in the middle of a call.

Elicitation is MCP's way for a server to ask the user something during a request. It has two modes:

  • Form mode: the server sends a message and a small flat JSON Schema; the client renders a form; the answer comes back as data.
  • URL mode (added in 2025-11-25): the server sends a message and a URL; the client asks the user for consent and opens the URL in a browser; what the user does there never passes through the client.

How the question travels changed in 2026-07-28. Before, the server opened its own request back to the client (elicitation/create) while the original tools/call was still pending: a server-initiated request over a back-channel. The stateless 2026-07-28 revision removed that back-channel. Instead, the server returns an InputRequiredResult (resultType: "input_required") carrying inputRequests (what it needs) and an opaque requestState (where it was). The client gets the answers and retries the same request with inputResponses and the echoed requestState. This pattern is called Multi Round-Trip Requests (MRTR, SEP-2322). Every leg is an ordinary client-to-server request, which is what lets any replica behind a load balancer handle any leg.

Two ways a server asks for input it is missing. Under 2025-11-25 it calls elicitation/create back to the client in the middle of the request. Under 2026-07-28 it returns an InputRequiredResult and the client retries, carrying the answers and the request state.
Elicitation, and the multi-round-trip request that replaced it.

The Python SDK hides the difference behind one server API and one client API. On the server, you hang a question on a parameter with a resolver; the SDK picks the transport from the negotiated protocol version. On the client, you register one elicitation_callback; the SDK feeds it from either era and, on 2026-07-28, runs the retry loop for you.

The rest of this course is yours to keep

This course is bought on its own, once, and stays readable afterwards, including the parts added to it later.