fix: switch public MCP server to stateless transport#30
Merged
fbsobreira merged 2 commits intodevelopfrom Feb 20, 2026
Merged
Conversation
Replace stateful session-based transport with stateless per-request transport to eliminate "Session not found" errors caused by container restarts, Watchtower redeployments, and session TTL expiry. Each POST to /mcp now creates its own transport and server instance, making requests fully self-contained with no in-memory session state to lose.
There was a problem hiding this comment.
Pull request overview
Switches the public MCP HTTP endpoint from session-based (stateful) transport to stateless per-request handling to eliminate “Session not found” errors caused by restarts/TTL expiry.
Changes:
- Replaced session-tracked
/mcphandling with a statelessPOST /mcpthat creates a transport+server per request. - Added explicit 405 responses for
GET /mcpandDELETE /mcpin stateless mode and removedactiveSessionsfrom/health. - Updated
.gitignoreto exclude local MCP publisher registry/login artifacts.
Reviewed changes
Copilot reviewed 1 out of 2 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
src/index.ts |
Implements stateless MCP transport per POST request; removes session tracking/cleanup and updates health + shutdown behavior. |
.gitignore |
Ignores .mcpregistry* files. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
- Register res.on('close') before awaiting handleRequest to ensure
transport cleanup even if handleRequest throws mid-response
- Add mcpLimiter to GET and DELETE /mcp routes for consistency
- Exit process inside server.close() callback for truly graceful shutdown
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 1 out of 2 changed files in this pull request and generated no new comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
sessionIdGenerator: undefined)/mcpnow creates its own transport+server, making requests fully self-contained with no in-memory session state to lose/mcpnow return 405 (not applicable in stateless mode)Test plan
pnpm run buildpassespnpm run lintcleanactiveSessions