Summary
The new version of the MCP specification (2026-07-28) is being released on July 28th 2026. This is going to be the most significant protocol revision to date, introducing a stateless communication model and deprecating several features we rely on heavily in the MCP server.
I didn't see another Issue/PR covering the protocol changes, so I put this issue together to track the impact on our server implementation and the work we would need to do to stay current with the protocol.
Protocol changes
Below are the headline changes in the new protocol:
Stateless protocol model
The protocol is moving to a stateless request/response model. The initialize/initialized handshake and Mcp-Session-Id header are removed. Each request now carries its protocol version and client capabilities in _meta fields (io.modelcontextprotocol/protocolVersion, io.modelcontextprotocol/clientCapabilities). A new server/discover RPC replaces the initialization handshake for capability advertisement.
Multi Round-Trip Requests (MRTR) replace server-initiated requests
This is probably the most architecturally significant change. Previously, a server could send requests back to the client mid-execution (Sampling, Elicitation, Roots). In the new model, the server returns an InputRequiredResult with resultType: "input_required" containing inputRequests and an opaque requestState. The client processes the requests and re-invokes the original tool with inputResponses and requestState. This turns what was a synchronous mid-execution call into a multi-round-trip exchange.
Deprecated features (12+ month removal window)
- Sampling (
sampling/createMessage): We will need to migrate to MRTR or integrate directly with LLM provider APIs
- Elicitation (
elicitation/create): We will need to migrate to MRTR
- Roots (
roots/list): We will have to pass directories/files via tool parameters or server configuration instead
- Logging (
logging/setLevel): The log level is now per-request via _meta. We will need to migrate to logging via stderr/OpenTelemetry.
The old protocol features will remain fully functional during the deprecation window, but new implementations should not adopt them.
Resource subscriptions are reworked
resources/subscribe and resources/unsubscribe are replaced by subscriptions/listen, a single long-lived POST stream where clients opt in to specific notification types (toolsListChanged, promptsListChanged, resourcesListChanged, resourceSubscriptions).
New required fields on all results
resultType (string, required): "complete" for normal results, "input_required" for MRTR interim results
ttlMs (integer, required on list/read results): cache freshness hint in milliseconds
cacheScope ("public" | "private", required on list/read results): controls intermediary caching
Other changes
ping RPC is removed
logging/setLevel RPC is removed
- Deterministic tool ordering is recommended for
tools/list responses (improves LLM prompt cache hit rates)
- New
Mcp-Method and Mcp-Name headers are required on Streamable HTTP POST requests
- Error code renumbering (
HeaderMismatch -32001 to -32020, UnsupportedProtocolVersion -32004 to -32022, etc.)
inputSchema/outputSchema loosened to allow any JSON Schema 2020-12 keywords
- Tools, prompts, resources can now carry an
icons array
Impact on our MCP Server
What should be handled by Quarkus
The quarkus-mcp-server extension handles transport and protocol-level concerns. The 2.0.0.Beta3 release already supports both stateful (2025-11-25) and stateless (2026-07-28) MCP clients simultaneously on the same endpoint. It looks like the following changes should be absorbed by the framework with no code changes required in this project:
initialize/initialized removal and server/discover implementation
- Session removal and stateless client detection
ping removal
- Per-request
_meta for protocol version, capabilities, and client info
resultType on all results
ttlMs and cacheScope on list/read results
- Transport-level header changes
- Error code renumbering
Sampling
Our MCP server uses Sampling extensively in all diagnostic services via BaseDiagnosticService.performSampling(), performTriage(), and performAnalysis(). The pattern is a multi-step workflow where the tool calls the LLM mid-execution to guide investigation:
- Gather initial cluster data
- Send data to LLM via Sampling for triage (which areas to investigate deeper)
- Gather additional data based on triage results
- Send all data to LLM via Sampling for root cause analysis
Affected services: KafkaClusterDiagnosticService, KafkaConnectivityDiagnosticService, KafkaMetricsDiagnosticService, KafkaConfigComparisonService, UpgradeReadinessDiagnosticService, KafkaConnectDiagnosticService, KafkaConnectorDiagnosticService, KafkaMirrorMaker2DiagnosticService, KafkaTopicDiagnosticService, OperatorMetricsDiagnosticService
The MRTR replacement fundamentally changes this execution model. Each Sampling call would become a tool return/re-invocation cycle, meaning the diagnostic workflow needs to be resumable across multiple invocations using the requestState continuation token. This is probably going to be the largest piece of migration work.
Note: the quarkus-mcp-server 2.0 beta does not yet implement MRTR for Sampling. Stateless clients simply cannot use Sampling in the current beta. We need to track when MRTR support lands in the framework, as it will determine the API we needs to code against.
Elicitation
Used for namespace disambiguation via NamespaceElicitationHelper and time-window expansion in diagnostic workflows. Same MRTR migration path as Sampling. Affected in the same set of diagnostic services listed above.
McpLog / Logging
McpLog is used throughout diagnostic services and tool classes for real-time user feedback (mcpLog.info("Gathering cluster status...")). The logging/setLevel removal looks to be handled by Quarkus and notifications/message should continue to work during the deprecation window. Long-term we should consider moving user feedback to Progress notifications (not deprecated) and operational logging to OpenTelemetry/stderr.
Resource subscriptions
ResourceSubscriptionManager manages Kubernetes watches and delivers notifications/resources/updated via the framework's ResourceManager API. The migration from resources/subscribe to subscriptions/listen should be handled by Quarkus, but we need to verify the ResourceManager API still works as expected after upgrading.
Action items
Near-term
Medium-term
Before deprecation window closes (~mid-2027)
References
Summary
The new version of the MCP specification (2026-07-28) is being released on July 28th 2026. This is going to be the most significant protocol revision to date, introducing a stateless communication model and deprecating several features we rely on heavily in the MCP server.
I didn't see another Issue/PR covering the protocol changes, so I put this issue together to track the impact on our server implementation and the work we would need to do to stay current with the protocol.
Protocol changes
Below are the headline changes in the new protocol:
Stateless protocol model
The protocol is moving to a stateless request/response model. The
initialize/initializedhandshake andMcp-Session-Idheader are removed. Each request now carries its protocol version and client capabilities in_metafields (io.modelcontextprotocol/protocolVersion,io.modelcontextprotocol/clientCapabilities). A newserver/discoverRPC replaces the initialization handshake for capability advertisement.Multi Round-Trip Requests (MRTR) replace server-initiated requests
This is probably the most architecturally significant change. Previously, a server could send requests back to the client mid-execution (Sampling, Elicitation, Roots). In the new model, the server returns an
InputRequiredResultwithresultType: "input_required"containinginputRequestsand an opaquerequestState. The client processes the requests and re-invokes the original tool withinputResponsesandrequestState. This turns what was a synchronous mid-execution call into a multi-round-trip exchange.Deprecated features (12+ month removal window)
sampling/createMessage): We will need to migrate to MRTR or integrate directly with LLM provider APIselicitation/create): We will need to migrate to MRTRroots/list): We will have to pass directories/files via tool parameters or server configuration insteadlogging/setLevel): The log level is now per-request via_meta. We will need to migrate to logging via stderr/OpenTelemetry.The old protocol features will remain fully functional during the deprecation window, but new implementations should not adopt them.
Resource subscriptions are reworked
resources/subscribeandresources/unsubscribeare replaced bysubscriptions/listen, a single long-lived POST stream where clients opt in to specific notification types (toolsListChanged,promptsListChanged,resourcesListChanged,resourceSubscriptions).New required fields on all results
resultType(string, required):"complete"for normal results,"input_required"for MRTR interim resultsttlMs(integer, required on list/read results): cache freshness hint in millisecondscacheScope("public"|"private", required on list/read results): controls intermediary cachingOther changes
pingRPC is removedlogging/setLevelRPC is removedtools/listresponses (improves LLM prompt cache hit rates)Mcp-MethodandMcp-Nameheaders are required on Streamable HTTP POST requestsHeaderMismatch-32001 to -32020,UnsupportedProtocolVersion-32004 to -32022, etc.)inputSchema/outputSchemaloosened to allow any JSON Schema 2020-12 keywordsiconsarrayImpact on our MCP Server
What should be handled by Quarkus
The quarkus-mcp-server extension handles transport and protocol-level concerns. The 2.0.0.Beta3 release already supports both stateful (2025-11-25) and stateless (2026-07-28) MCP clients simultaneously on the same endpoint. It looks like the following changes should be absorbed by the framework with no code changes required in this project:
initialize/initializedremoval andserver/discoverimplementationpingremoval_metafor protocol version, capabilities, and client inforesultTypeon all resultsttlMsandcacheScopeon list/read resultsSampling
Our MCP server uses
Samplingextensively in all diagnostic services viaBaseDiagnosticService.performSampling(),performTriage(), andperformAnalysis(). The pattern is a multi-step workflow where the tool calls the LLM mid-execution to guide investigation:Affected services:
KafkaClusterDiagnosticService,KafkaConnectivityDiagnosticService,KafkaMetricsDiagnosticService,KafkaConfigComparisonService,UpgradeReadinessDiagnosticService,KafkaConnectDiagnosticService,KafkaConnectorDiagnosticService,KafkaMirrorMaker2DiagnosticService,KafkaTopicDiagnosticService,OperatorMetricsDiagnosticServiceThe MRTR replacement fundamentally changes this execution model. Each Sampling call would become a tool return/re-invocation cycle, meaning the diagnostic workflow needs to be resumable across multiple invocations using the
requestStatecontinuation token. This is probably going to be the largest piece of migration work.Note: the quarkus-mcp-server 2.0 beta does not yet implement MRTR for Sampling. Stateless clients simply cannot use Sampling in the current beta. We need to track when MRTR support lands in the framework, as it will determine the API we needs to code against.
Elicitation
Used for namespace disambiguation via
NamespaceElicitationHelperand time-window expansion in diagnostic workflows. Same MRTR migration path as Sampling. Affected in the same set of diagnostic services listed above.McpLog / Logging
McpLogis used throughout diagnostic services and tool classes for real-time user feedback (mcpLog.info("Gathering cluster status...")). Thelogging/setLevelremoval looks to be handled by Quarkus andnotifications/messageshould continue to work during the deprecation window. Long-term we should consider moving user feedback toProgressnotifications (not deprecated) and operational logging to OpenTelemetry/stderr.Resource subscriptions
ResourceSubscriptionManagermanages Kubernetes watches and deliversnotifications/resources/updatedvia the framework'sResourceManagerAPI. The migration fromresources/subscribetosubscriptions/listenshould be handled by Quarkus, but we need to verify theResourceManagerAPI still works as expected after upgrading.Action items
Near-term
mcp-server-apibumped to1.0.0-Beta4,McpProtocolVersionchanged from enum to final class, JSON-RPC batching removedResourceSubscriptionManagerworks correctly with the new framework internals andsubscriptions/listenMedium-term
McpLoguser feedback toProgressnotifications where appropriatetools/listresponsesBefore deprecation window closes (~mid-2027)
McpLogusage to Progress/OpenTelemetry/stderrReferences