Skip to content

Conversation

@jayhemnani9910
Copy link
Contributor

Body:

Summary

Add a stateless_sse parameter to FastMCP that bypasses the MCP protocol initialization handshake for SSE transport, fixing issues where fast clients send requests before initialization completes.

Changes

  • Add stateless_sse field to Settings class in FastMCP
  • Add stateless_sse parameter to FastMCP.__init__() (default: False)
  • Pass stateless=self.settings.stateless_sse to server.run() in sse_app() method
  • Add integration test for stateless SSE mode

Problem

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 complete

Solution

Mirror the existing stateless_http option by adding stateless_sse. When enabled, bypasses the initialization barrier.

Testing

  • All existing SSE tests pass (26 passed)
  • New test added: test_sse_stateless_mode_allows_requests_without_initialization

Fixes #1844

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
Copilot AI review requested due to automatic review settings January 9, 2026 19:11
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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_sse boolean field to the Settings class with appropriate documentation
  • Added stateless_sse parameter to FastMCP.__init__() with a default value of False
  • Modified the handle_sse method in sse_app() to pass stateless=self.settings.stateless_sse to server.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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

SSE transport: "Received request before initialization was complete" error with Claude Code client

1 participant