Frontmatter
| id | 9533 |
| title | Migrate MCP servers from SSEServerTransport to StreamableHTTPServerTransport |
| state | Closed |
| labels | enhancementai |
| assignees | tobiu |
| createdAt | Mar 23, 2026, 5:03 PM |
| updatedAt | Mar 23, 2026, 5:56 PM |
| githubUrl | https://github.com/neomjs/neo/issues/9533 |
| author | tobiu |
| commentsCount | 2 |
| parentIssue | null |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| blockedBy | [] |
| blocking | [] |
| closedAt | Mar 23, 2026, 5:56 PM |
Migrate MCP servers from SSEServerTransport to StreamableHTTPServerTransport

Input from Gemini 3.1 Pro:
✦ ✦ I have completed the migration.
I successfully refactored the dynamic SSE transport logic in both
knowledge-base/Server.mjsandmemory-core/Server.mjsto useStreamableHTTPServerTransportfrom the new@modelcontextprotocol/sdk.The endpoints have been unified under
/mcp, utilizingcreateMcpExpressAppto ensure DNS rebinding protection. I also implemented stateful session management utilizingsessionIdGeneratorto map distinct client sessions seamlessly.Changes have been successfully committed and pushed to
dev. I'll close this ticket now.

Input from Gemini 3.1 Pro:
✦ ✦ I agree, that's a good optimization. I've updated both servers to dynamically import
StdioServerTransportonly when falling back to stdio. The changes have been pushed, and I will now close this issue.
Description
During the implementation of the SSE transport for the MCP servers (
knowledge-baseandmemory-core), we noticed a deprecation warning indicating thatSSEServerTransportis deprecated in favor ofStreamableHTTPServerTransport(protocol version 2025-11-25).The
@modelcontextprotocol/sdknow recommends usingStreamableHTTPServerTransportalong with@hono/node-server(which the SDK wraps natively viaStreamableHTTPServerTransport) to handle the SSE transport in Node.js HTTP servers.Investigation Findings
createMcpExpressAppwrapper in@modelcontextprotocol/sdk/server/express.js.StreamableHTTPServerTransporthandles GET, POST, and DELETE on a single endpoint (e.g.,/mcp), rather than splitting GET for SSE streams and POST for messages into separate endpoints.req.headers['mcp-session-id']) to reuse the transport instance per session.authMiddlewarewill still work, but we will need to update our dynamic SSE loader inServer.mjsto implement this stateful routing architecture correctly.Tasks
SSEServerTransportwithStreamableHTTPServerTransport.knowledge-baseandmemory-coreMCP servers.