The client-side trio is what makes MCP feel conversational. Each capability lets the server reach back through the host to do something only the host can do.
Sampling lets a server ask the host's LLM to do inference on its behalf. The classic case: a code-analysis server wants to reason about three possible refactors before picking one; instead of shipping its own LLM, it sends a sampling request and the host runs the inference. The host MUST ask the user before forwarding the request — sampling is "the server is asking to use my brain" and that needs consent. When approved, the response flows back to the server as a regular sampling result.
Roots let a server ask the host which directories or URIs are in scope for the current session. A filesystem server should not assume access to $HOME; it should ask the host for roots, get back something like file:///Users/me/project, and operate inside that. The host typically derives roots from the current workspace or a user pick; the protocol just defines how the question is asked.
Elicitation is the most human of the three: a server can request additional input from the user mid-workflow without restarting. "Which environment do you want to deploy to?" "Should I include the test files?" The server sends an elicitation/create request describing a small JSON Schema for the input it needs; the host renders a form, collects the response, and returns it. Elicitation is what turns a one-shot tool call into an interactive workflow without breaking the protocol's structure.