diff --git a/.changeset/stateless-json-response.md b/.changeset/stateless-json-response.md new file mode 100644 index 00000000..352e9dc0 --- /dev/null +++ b/.changeset/stateless-json-response.md @@ -0,0 +1,5 @@ +--- +"@nuxtjs/mcp-toolkit": patch +--- + +fix(transport): use JSON response mode for stateless Node transport \ No newline at end of file diff --git a/packages/nuxt-mcp-toolkit/src/runtime/server/mcp/providers/node.ts b/packages/nuxt-mcp-toolkit/src/runtime/server/mcp/providers/node.ts index 2effdc64..493a26d1 100644 --- a/packages/nuxt-mcp-toolkit/src/runtime/server/mcp/providers/node.ts +++ b/packages/nuxt-mcp-toolkit/src/runtime/server/mcp/providers/node.ts @@ -84,7 +84,16 @@ export default createMcpTransportHandler(async (createServer, event) => { const server = createServer() event.context._mcpServer = server - const transport = new WebStandardStreamableHTTPServerTransport({ sessionIdGenerator: undefined }) + const transport = new WebStandardStreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + // In stateless mode, use JSON responses instead of SSE so that H3 can + // fully await the response and afterResponse fires only after the tool + // handler completes. With SSE the response stream is returned immediately + // (before the handler runs), which causes serverless runtimes to fire + // afterResponse too early and drops any log.set() calls made after async + // work inside the handler. + enableJsonResponse: true, + }) onResponseClose(event, () => { transport.close() server.close()