Proposals · SEP-2577 · Final

Deprecate Roots, Sampling, and Logging

Standards Track · Created 2026-04-14 · Source

Note: This SEP is predicated on a hypothetical SEP where MCP considers a specification version supported for one year past its original release date. The deprecation timeline described here assumes that policy is in place.

Abstract

This SEP deprecates the following core protocol features:

These features are deprecated starting in the specification version that includes this SEP (expected June 2026). They will continue to be fully functional in all specification versions released within one year of that version's release.

Each of those subsequent versions will in turn support the features for one year after its own release, assuming the one-year-per-version support policy proposed in a separate SEP. This provides implementations with an extended migration window before the features are fully removed.

During the deprecation period, wire-level behavior is unchanged. No types are removed, no capability negotiation changes, and no existing implementations break. The deprecation serves as a signal to the ecosystem to stop building on these features and to plan for their eventual removal.

Motivation

The MCP specification aims to remain minimal and focused. Features that see low adoption, overlap with existing alternatives, or impose disproportionate implementation burden relative to their value are candidates for removal. Keeping such features in the core specification increases the burden for every client and server, slows protocol evolution, and makes the specification harder to learn. The following three features meet these criteria.

Deprecating these features was proposed during a recent core contributor meeting. This SEP formalizes that proposal with a concrete implementation plan. See discussion #2536.

Roots

Roots provides "informational guidance" about which directories or files a server should operate on. In practice:

Sampling

Sampling allows servers to request LLM completions from the client. While conceptually powerful, it has struggled with adoption:

Logging

Logging allows servers to send structured log messages to clients via the protocol:

Specification

Overview of changes

  1. Mark deprecated features with @deprecated annotations in the schema
  2. Add deprecation notices to feature documentation pages
  3. No wire-level protocol changes during the deprecation period

Schema changes

Add @deprecated JSDoc annotations to the following items in schema/draft/schema.ts. No types, interfaces, or union members are removed.

Deprecated capabilities

Capability Location
ClientCapabilities.roots Client capability for listing roots
ClientCapabilities.sampling Client capability for LLM sampling
ClientCapabilities.tasks.requests.sampling Task-augmented sampling sub-capability
ServerCapabilities.logging Server capability for log messages

Deprecated types — Roots

Type Description
Root Represents a root directory or file
ListRootsRequest Server-to-client request for roots/list
ListRootsResult Result containing roots array
ListRootsResultResponse JSON-RPC response wrapper
RootsListChangedNotification Client notification when roots change

Deprecated types — Sampling

Type Description
CreateMessageRequestParams Parameters for sampling/createMessage
CreateMessageRequest Server-to-client request for sampling
CreateMessageResult Result from a sampling request
CreateMessageResultResponse JSON-RPC response wrapper
SamplingMessage A message in a sampling conversation
SamplingMessageContentBlock Content block union for sampling messages
ToolChoice Controls model tool selection during sampling
ToolUseContent Tool use content block in sampling messages
ToolResultContent Tool result content block in sampling messages
ModelPreferences Server preferences for model selection
ModelHint Hints for model selection

Deprecated types — Logging

Type Description
LoggingLevel Syslog severity level enum
SetLevelRequestParams Parameters for logging/setLevel
SetLevelRequest Client-to-server request to set level
SetLevelResultResponse JSON-RPC response wrapper
LoggingMessageNotificationParams Parameters for log message notification
LoggingMessageNotification Server-to-client log message

Annotation format

Each deprecated item SHOULD receive a JSDoc @deprecated tag with a brief explanation:

/**
 * Present if the client supports listing roots.
 *
 * @deprecated Deprecated as of this specification version. Will be included
 * in all versions released within one year, then may be removed.
 */
roots?: {
  listChanged?: boolean;
};

Union types

The following union types reference deprecated types but MUST NOT be modified during the deprecation period. They will be updated when the deprecated types are removed:

Documentation changes

Add a deprecation warning block at the top of each feature's documentation page, after the title:

docs/specification/draft/client/roots.mdx:

<Warning>
**Deprecated**: The Roots feature is deprecated as of this specification
version. It will remain fully functional in all specification versions released
within one year of the <YYYY-MM-DD> release. Each of those versions will
continue to support it for one year after its own release.
</Warning>

docs/specification/draft/client/sampling.mdx:

<Warning>
**Deprecated**: The Sampling feature is deprecated as of this specification
version. It will remain fully functional in all specification versions released
within one year of the <YYYY-MM-DD> release. Each of those versions will
continue to support it for one year after its own release.
</Warning>

docs/specification/draft/server/utilities/logging.mdx:

<Warning>
**Deprecated**: The Logging feature is deprecated as of this specification
version. It will remain fully functional in all specification versions released
within one year of the <YYYY-MM-DD> release. Each of those versions will
continue to support it for one year after its own release.
</Warning>

Capability negotiation

During the deprecation period, capability negotiation is unchanged:

Timeline

Rationale

Why deprecate rather than move to extensions?

These features are already implemented in many clients and servers. The extensions mechanism (SEP-2133) specifies that unless an extension is provided, implementations must behave as if the extension is not present. Retrofitting this logic into existing SDKs — especially across multiple protocol versions — would be complex and error-prone. Deprecation followed by removal is less disruptive: implementations can continue using the features as-is during the transition period, then simply stop when the features are removed.

Why deprecate rather than remove immediately?

While adoption of these features is low, they are still in use. Removing them immediately would cause unnecessary churn and disruption for users, client and server owners, and SDK builders. A deprecation window minimizes this impact by giving the ecosystem time to migrate at its own pace.

Why these three features specifically?

These were identified during a core contributor meeting as the features with the weakest adoption-to-complexity ratio. Each has viable alternatives outside the protocol, and none are critical to the core resource/tool/prompt interaction model that defines MCP. See discussion #2536.

Backward Compatibility

During the deprecation period, there are no backward compatibility issues. All deprecated features continue to work identically. No wire-level changes are introduced.

After removal (in specification versions released more than one year after this version):

Security Implications

Deprecating these features has a net positive effect on security:

No new security concerns are introduced by deprecation.

Reference Implementation

No reference implementation is required. This SEP only marks existing functionality as deprecated — no new protocol behavior is introduced.