feat: add stateless_sse option for SSE transport#1845
Open
jayhemnani9910 wants to merge 1 commit intomodelcontextprotocol:mainfrom
Open
feat: add stateless_sse option for SSE transport#1845jayhemnani9910 wants to merge 1 commit intomodelcontextprotocol:mainfrom
jayhemnani9910 wants to merge 1 commit intomodelcontextprotocol:mainfrom
Conversation
Add a stateless_sse parameter to FastMCP that bypasses the MCP protocol
initialization handshake for SSE transport. This mirrors the existing
stateless_http option for Streamable HTTP transport.
When stateless_sse=True, the server allows tool calls without waiting
for the InitializeRequest → InitializeResponse → InitializedNotification
handshake to complete. This fixes issues with fast clients like Claude
Code that may send requests before initialization completes.
Usage:
mcp = FastMCP("my-server", stateless_sse=True)
Fixes modelcontextprotocol#1844
Github-Issue: modelcontextprotocol#1844
Reported-by: Tech-Fumi
There was a problem hiding this comment.
Pull request overview
This PR adds a stateless_sse configuration option to FastMCP that mirrors the existing stateless_http functionality, allowing the SSE transport to bypass the MCP protocol initialization handshake. This addresses issue #1844 where fast clients like Claude Code send requests before initialization completes, causing RuntimeError: Received request before initialization was complete.
Key Changes:
- Added
stateless_sseboolean field to theSettingsclass with appropriate documentation - Added
stateless_sseparameter toFastMCP.__init__()with a default value ofFalse - Modified the
handle_ssemethod insse_app()to passstateless=self.settings.stateless_ssetoserver.run()
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| src/mcp/server/fastmcp/server.py | Adds stateless_sse configuration option to Settings class and FastMCP constructor, passing it through to server.run() in SSE handler |
| tests/shared/test_sse.py | Adds comprehensive integration test for stateless SSE mode with helper functions to create and run a stateless test server |
💡 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.
Body:
Summary
Add a
stateless_sseparameter to FastMCP that bypasses the MCP protocol initialization handshake for SSE transport, fixing issues where fast clients send requests before initialization completes.Changes
stateless_ssefield toSettingsclass in FastMCPstateless_sseparameter toFastMCP.__init__()(default:False)stateless=self.settings.stateless_ssetoserver.run()insse_app()methodProblem
When Claude Code (or other fast clients) connects via SSE transport, tool call requests can arrive before the initialization handshake completes, causing:
RuntimeError: Received request before initialization was completeSolution
Mirror the existing
stateless_httpoption by addingstateless_sse. When enabled, bypasses the initialization barrier.Testing
test_sse_stateless_mode_allows_requests_without_initializationFixes #1844