You will meet them in existing servers and hosts, and need to know what replaces them.
Besides elicitation, the protocol defined three features that servers could use from the client. The 2026-07-28 spec deprecates all three: they still work for at least twelve months, but new code should not adopt them.
- Sampling let a server ask the host's model to generate text, so the server needed no API key of its own. Replacement: call a model provider's API directly from your server.
- Roots let the client tell the server which folders or URIs it may work in (for example the open project). Replacement: pass paths as tool arguments, resource URIs or server configuration.
- Logging sent log messages to the client with a level such as
infoorerror. Replacement: log to standard error on stdio servers, or use OpenTelemetry (a standard for collecting logs and traces) on remote ones. SDK v2 has OpenTelemetry tracing built in.
In the Python SDK these still exist: Sample with Resolve for sampling, sampling_callback and list_roots_callback on the client, and ctx.info() for logging. Using them emits an MCPDeprecationWarning.
Also removed outright in 2026-07-28: ping and logging/setLevel. Change notifications (a tool list or resource changed) now flow through a single subscriptions/listen stream the client opens and filters.
The lesson for design: keep servers self-contained. Everything a tool needs should arrive as arguments, configuration, or an explicit question to the user.
Remember
- Sampling, roots and logging are deprecated as of 2026-07-28
- Replace sampling with direct model API calls, roots with explicit paths
- Log to stderr or OpenTelemetry instead of MCP logging
- Change notifications now use subscriptions/listen