Editorial

Research guide · MCP migration · 13 September 2026

MCP 2026-07-28 migration: fix server/discover, Mcp-Session-Id and initialize failures

If a remote MCP server suddenly fails on server/discover, waits for initialize, requires Mcp-Session-Id or breaks behind a stateless client, treat it as a protocol-era migration problem before changing tool logic. MCP 2026-07-28 removed the handshake and protocol session, moved client context into every request, and replaced several connection-bound patterns with explicit request/response mechanisms.

Published 13 September 2026 · sources checked 13 September 2026

2026-07-28

Current stateless MCP protocol revision covered here

server/discover

Optional modern capability-discovery RPC

No session ID

Mcp-Session-Id is removed on the modern wire path

input_required

MRTR result used when a call needs another round trip

Why this is showing up now

Current clients are reaching 2025-era servers with 2026-era expectations

The 2026-07-28 MCP release is a breaking transport and lifecycle shift, not a cosmetic version bump. The official release removes the initialize/initialized exchange and Mcp-Session-Id. Protocol version, client information and client capabilities instead travel with each request, and server/discover can be used when a client wants server capabilities before making another call.

Fresh implementation demand is still arriving. A Microsoft Agent Framework issue opened 10 September 2026 asks for Python support for the stateless revision because its MCP integration is still built around the 2025-era session model. A separate Java SDK report documents OpenAI's hosted MCP client sending server/discover before tools/list; a server on an older SDK returned HTTP 500 and the hosted client surfaced an HTTP 424 connector error.

Those reports are implementation evidence, not new protocol rules. The acquisition-relevant point is practical: an operator can have a valid tool implementation, valid OAuth and a reachable endpoint and still fail before tool discovery because client and server disagree about the protocol era.

Migration map

Replace connection-bound assumptions one boundary at a time

Boundary2025-era pattern2026-07-28 patternMigration action
Connection setupinitialize → notifications/initializedNo handshake; request metadata carries protocol/client contextDo not wait for initialize before accepting a modern request.
Protocol sessionOptional Mcp-Session-Id bound later requests to a sessionNo protocol-level session or Mcp-Session-IdMove durable workflow state to explicit application handles where needed.
Capability discoveryLearned during initializeserver/discover is available for upfront discoveryImplement discovery on modern servers and keep clean legacy fallback behavior.
Server-to-client requestsSampling/elicitation/roots could ride a held-open connectionMulti Round-Trip Requests return input_required and retryPreserve opaque requestState and correlate the retry to the original operation.
NotificationsLegacy GET/SSE stream and unsolicited delivery patternssubscriptions/listen for requested notification classesDo not diagnose a modern GET 405 as a server outage by itself.
Horizontal scalingSticky sessions/shared session stores were commonAny request can land on any capable replicaRemove protocol-session affinity, but keep application state explicit and authorized.

Fast diagnosis

Map the failure to the protocol-era boundary first

SignalLikely boundaryFirst action
server/discover → HTTP 500The server dispatcher or SDK likely does not understand the modern discovery method.Check the server SDK revision and modern request path before debugging tools/list or OAuth.
Hosted client reports 424 external_connector_errorAn upstream MCP call may have failed before a tool was invoked; a failed discovery request is one documented cause.Inspect the remote server logs for server/discover and protocol-version handling.
Server says Mcp-Session-Id is missingA 2025-era session requirement is leaking into a 2026-07-28 request path.Branch behavior by negotiated protocol revision instead of requiring a session header globally.
Server waits forever for initializeA modern client may never send the removed handshake.Accept self-describing 2026-07-28 requests or use a dual-era SDK transport.
GET /mcp returns 405This can be expected on a stateless modern endpoint where POST is the request path and subscriptions/listen owns notifications.Check the negotiated revision before restoring a legacy GET stream.
Elicitation hangs or never reaches the userA host may still depend on the legacy push-style approval path or lack an interaction surface.Test MRTR/input_required handling and the host's actual approval/elicitation UI separately.

Repair sequence

Eight checks for a production migration

  1. 1. Capture the actual protocol version. Do not infer it from the SDK package name or server URL. Log the negotiated revision without logging credentials or private request data.
  2. 2. Test server/discover independently. If the modern client uses discovery, confirm the server handles it as a protocol request rather than falling into an unknown-route HTTP 500 path.
  3. 3. Stop requiring initialize on the modern path. A 2026-07-28 request is self-describing. Legacy clients may still initialize; modern ones should not be forced through the old lifecycle.
  4. 4. Remove global Mcp-Session-Id assumptions. Do not make a modern request depend on a session ID that the current wire format removed. Keep legacy session behavior scoped to legacy negotiations.
  5. 5. Make application state explicit. If a browser run, shopping basket, job or workflow must survive across calls, mint an application-level handle and pass it as an authorized argument. Stateless protocol does not mean state-free applications.
  6. 6. Move interaction loops to MRTR. For modern elicitation or other supported server requests, return input_required, preserve the opaque requestState, collect the required response through the host, and retry the original operation.
  7. 7. Move notification listening to subscriptions/listen. Keep legacy stream behavior only for clients that actually negotiated the older protocol. Do not reintroduce a session solely because a modern GET stream disappeared.
  8. 8. Run a dual-era matrix. Test at least one current 2026-07-28 client and one initialize-based 2025-era client against the same endpoint if backward compatibility matters. Record which features are intentionally unavailable on each path.

State design

Stateless MCP does not require a stateless business workflow

The removed session was protocol plumbing. Your application can still maintain a cart, browser, job, reservation or long-running workflow. The safer migration is to make that state explicit: a tool creates an opaque handle, later tools receive that handle as an ordinary argument, and authorization checks bind the handle to the correct principal and permissions.

This matters for agent commerce and autonomous procurement because hidden connection affinity is a poor place to keep spending context. An explicit purchase or workflow handle can be audited, expired and scoped. Do not place payment credentials or bearer secrets inside the handle merely because it is opaque to the model.

Dual-era compatibility

Do not “fix” a 2026 client by silently forcing everything back to 2025

Current official SDK documentation shows a cleaner migration pattern: serve both revisions on one endpoint where the SDK supports it. Modern requests use the stateless path; legacy clients keep the initialize/session behavior they understand. Current Python SDK v2 documentation describes probing server/discover and falling back to the initialize handshake for an older peer.

That compatibility layer should be explicit and testable. A modern client receiving a legacy session requirement, or an older client receiving only modern routing semantics, is not graceful negotiation. Record the negotiated era and keep transport behavior consistent with it.

If the modern request then fails on Mcp-Method, Mcp-Name or Mcp-Param-*, move to zFinia's HeaderMismatch guide. That is a separate modern-header integrity problem, not evidence that sessions should be restored.

Related zFinia guides

Continue from protocol migration into transport, output and authorization integrity

Sources

Primary specification and implementation references