fix(server): tag list_changed notifications with the in-flight request id - #2522
Conversation
…t id Server.sendToolListChanged()/sendResourceListChanged()/sendPromptListChanged() send with no relatedRequestId, so the transport always routes them at the standalone GET SSE stream. On a stateless Streamable HTTP transport that stream never exists, so a notification fired from inside a request handler (e.g. enabling a tool via RegisteredTool.enable()) is silently dropped, even though the handler's own request has a response stream sitting right there. Protocol now runs each request handler inside a tracked context (_runHandlerInContext) and, when a notification is sent without an explicit relatedRequestId, defaults it to whatever request is currently in flight (_currentInflightRequestId). Server backs this with an AsyncLocalStorage sourced from the existing per-runtime _shims subpath (a single-slot synchronous-scope fallback on workerd/browser, where node:async_hooks isn't available). Fixes modelcontextprotocol#2232.
🦋 Changeset detectedLatest commit: 122d15a The changes in this PR will be included in the next version bump. This PR includes changesets to release 6 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
@modelcontextprotocol/client
@modelcontextprotocol/codemod
@modelcontextprotocol/core
@modelcontextprotocol/server
@modelcontextprotocol/server-legacy
@modelcontextprotocol/express
@modelcontextprotocol/fastify
@modelcontextprotocol/hono
@modelcontextprotocol/node
commit: |
knoal
left a comment
There was a problem hiding this comment.
Reviewing via MCE A/B pilot 10 (sophia@hermes.local).
Summary
Tag list_changed notifications with the in-flight related request ID. 218 LOC, 7 files.
APPROVE — standard MCP protocol change for client-side tracking. The notification includes a _meta field with the relatedRequestId.
— sophia
knoal
left a comment
There was a problem hiding this comment.
Re-checking — the build workflow is FAILING. 218 LOC across 7 files likely includes a build-breaking change. Most likely cause: TypeScript type errors or import errors introduced by the new list_changed notification tagging. Recommend checking the build log for the specific error. HOLD until CI is green.
Pipeline is fixed |
Fixes #2232.
Server.sendToolListChanged()/sendResourceListChanged()/sendPromptListChanged() send with no relatedRequestId, so the transport always routes them at the standalone GET SSE stream. On a stateless Streamable HTTP transport that stream never exists, so a notification fired from inside a request handler (e.g. enabling a tool via RegisteredTool.enable()) is silently dropped, even though the handler's own request has a response stream sitting right there.
Protocol now runs each request handler inside a tracked context (_runHandlerInContext) and, when a notification is sent without an explicit relatedRequestId, defaults it to whatever request is currently in flight (_currentInflightRequestId). Server backs this with an AsyncLocalStorage sourced from the existing per-runtime _shims subpath (a single-slot synchronous-scope fallback on workerd/browser, where node:async_hooks isn't available).
Motivation and Context
How Has This Been Tested?
Breaking Changes
Types of changes
Checklist
Additional context