Back in the guide on tools, resources, and prompts, sampling got a single mention as "less common" and was set aside. It's worth coming back to now that the rest of the picture is in place, because it inverts the direction every other primitive flows in - and that inversion is exactly why it's used sparingly.
The direction every other primitive flows
Tools, resources, and prompts all flow the same way: the host's model calls into the server, or the server hands data to the host. The server is always the one being asked. Sampling reverses this - it lets a server send a request back to the client asking the host's model to generate a completion, which the server then uses as part of its own processing, before returning a result. The server, normally the one responding to requests, becomes the one making a request of the model.
Every other primitive flows host-to-server. Sampling is the one case where the server asks the model for help.
What this is actually useful for
Sampling lets a server offload a task that genuinely needs language model reasoning, without the server needing to run or pay for its own separate model - it borrows the capability of whichever model the user's host is already using. A server that summarizes long documents before returning them, or one that needs to classify or rewrite something as an intermediate step in a larger tool call, can use sampling instead of bundling its own LLM integration. This keeps the server itself simpler and lets it stay in sync with whatever model the user has chosen, rather than being locked to a specific provider the server author picked.
Why it's used sparingly
Sampling introduces a real design tension: it means a server - which might be a third-party component you didn't write - can trigger model generations on your behalf, at your model provider's cost, without you directly initiating that call. Because of this, the specification requires human-in-the-loop control: a host is expected to let the user review and approve sampling requests, both the request going out and the completion coming back, rather than letting a server silently generate text through the user's model. That approval step is exactly why sampling isn't something you reach for casually - it adds a layer of user friction that only makes sense when the alternative (the server running its own separate model) is clearly worse.