Skip to content

Protocol Primitives

Primitive Offered by Controlled by Key methods Status (2026-07-28)
Tools Server Model tools/list, tools/call Current
Resources Server Application (host) resources/list, resources/read, resources/templates/list Current
Prompts Server User prompts/list, prompts/get Current
Sampling Client sampling/createMessage Deprecated
Roots Client roots/list Deprecated
Elicitation Client elicitation/create Current
flowchart LR
SV[Server] --> T[Tools - model-controlled]
SV --> R[Resources - app-controlled]
SV --> P[Prompts - user-controlled]
CL[Client] --> S[Sampling - deprecated]
CL --> RO[Roots - deprecated]
CL --> E[Elicitation]
Who offers what

Executable functions the model decides to invoke (with host-mediated consent — a human should always be able to deny an invocation). Defined by name, description, and a JSON Schema inputSchema (optionally an outputSchema for structured results). See the Tool Invocation Lifecycle.

Data the application chooses to provide as context — files, database schemas, documents. Identified by URI. Resource templates (RFC 6570 URI templates like weather://{city}/current) allow parameterized resources. Clients can receive updates on individual resources — via resources/subscribe in legacy revisions, or by opting into resource subscriptions on a subscriptions/listen stream in 2026-07-28.

Reusable, parameterized message templates the user explicitly selects (e.g. slash commands). prompts/get accepts arguments and returns concrete messages ready for the model.

The server asks the client’s LLM for a completion (sampling/createMessage). The client controls model choice, cost, and consent — servers gain intelligence without holding API keys. The host should keep a human in the loop. Deprecated in 2026-07-28; new implementations are steered toward direct LLM provider APIs.

The client communicates which directories/URIs the server should operate within (roots/list; each root must be a file:// URI). Roots are a coordination mechanism, not an enforced sandbox. Deprecated in 2026-07-28 (and the notifications/roots/list_changed notification was removed); pass paths via tool parameters, resource URIs, or server configuration instead.

The server requests input from the user mid-operation (elicitation/create) — e.g. asking for a missing parameter or a confirmation. It supports a form mode (structured data via a flat JSON Schema) and a URL mode for sensitive out-of-band flows. The user can accept, decline, or cancel.

Server offers T-R-P (Tools, Resources, Prompts) — controlled by Model, App, User respectively. Client offers S-R-E (Sampling, Roots, Elicitation) — with S and R deprecated in the latest revision.

  • Know every primitive’s direction (who offers it) and its control model
  • In legacy revisions (2025-11-25 and earlier), sampling, roots, and elicitation are server-initiated requests to the client; in 2026-07-28 servers never initiate requests — these arrive inside an InputRequiredResult and the client retries the original request with the answers (the MRTR pattern)
  • Roots inform; they do not enforce

📝 Check your knowledge

1. Which primitive lets a server ask the user for missing information mid-operation?
2. A client wants to read a document a server exposes. Which methods does it use?
3. Who controls whether a sampling request is fulfilled?
4. Which pairing of primitive and control model is correct?
5. In the 2026-07-28 revision, how does per-resource update subscription work?
6. Which client-offered primitives were deprecated in the 2026-07-28 revision?