Skip to content

[v2] Last-Event-ID resumability on modern createMcpHandler path #3037

Open

Description

@JayDS22

Question

Is Last-Event-ID based stream resumability intentionally out of scope on the modern createMcpHandler path, or supported through a non-obvious seam?

Context

The pre-2.0 NodeStreamableHTTPServerTransport accepted an eventStore (e.g. the SDK's own InMemoryEventStore) that persisted JSON-RPC events keyed by Last-Event-ID, so a client that dropped mid-stream could resume cleanly on reconnect.

On the modern path, CreateMcpHandlerOptions exposes no event-store option and I cannot find a comparable seam in McpHttpHandler or ServerEventBus. A downstream project migrating from the pre-2.0 transport to createMcpHandler loses resumability as a side effect of the swap.

Specific questions

  1. Is resumability intentionally dropped from the modern (2026-07-28) handler-dispatch path?
  2. If it is retained, where does an integrator pass the event store? Is it hidden on WebStandardStreamableHTTPServerTransport / PerRequestHTTPServerTransport configuration?
  3. If it is dropped, is there a recommended approximation for long-lived subscriptions/listen streams, where a mid-stream drop is more likely than for request/response calls?

Downstream context

  • accordproject/apap#260 migrated to createMcpHandler + InMemoryServerEventBus and lost the eventStore seam as a side effect. The project is tracking this issue to decide between documenting the regression or restoring resumability if a seam exists.

Activity

  1. added
    v2Ideas, requests and plans for v2 of the SDK which will incorporate major changes and fixes
    on Oct 16, 2026
  2. IlyaKhalafi commented on Oct 18, 2026

    @IlyaKhalafi

    Yes, this is a protocol change. The 2026-07-28 HTTP specification explicitly excludes SSE resumption through Last-Event-ID and says to ignore that header.

    There is no modern event-store option to wire up. At this SDK revision, bus supplies change notifications. ServerEventBus exposes publish and subscribe, without a replay cursor or history contract. The older transport’s eventStore does not add resumption to modern subscriptions/listen.

    For reconnect recovery, I’d open a new listen request, wait for its acknowledgement and accepted filters, and refresh the relevant lists or resources. Queue notifications received during refresh and re-read affected state afterward. This is application-level catch-up, not guaranteed replay of every missed event. If every event matters, expose a separate versioned event log or cursor API.

    For clients still speaking the older protocol, the SDK documents routing with isLegacyRequest to your existing sessionful handler, alongside a modern handler configured with legacy: 'reject'. That preserves the older handler’s event-store path for older traffic, without extending the modern protocol. This assessment is from the specification and SDK source, not a test of APAP.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    v2Ideas, requests and plans for v2 of the SDK which will incorporate major changes and fixes

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions