Skip to content

Commit b891c21

Browse files
committed
add stateless http transport support
1 parent e5cad13 commit b891c21

File tree

3 files changed

+385
-4
lines changed

3 files changed

+385
-4
lines changed

fastapi_mcp/server.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,16 @@ def mount_http(
330330
"""
331331
),
332332
] = "/mcp",
333+
stateless: Annotated[
334+
bool,
335+
Doc(
336+
"""
337+
Whether to force stateless transport. When True, the MCP server will ignore
338+
the mcp-session-id header and treat all requests as stateless.
339+
Defaults to False.
340+
"""
341+
),
342+
] = False,
333343
) -> None:
334344
"""
335345
Mount the MCP server with HTTP transport to **any** FastAPI app or APIRouter.
@@ -348,7 +358,7 @@ def mount_http(
348358

349359
assert isinstance(router, (FastAPI, APIRouter)), f"Invalid router type: {type(router)}"
350360

351-
http_transport = FastApiHttpSessionManager(mcp_server=self.server)
361+
http_transport = FastApiHttpSessionManager(mcp_server=self.server, stateless=stateless)
352362
dependencies = self._auth_config.dependencies if self._auth_config else None
353363

354364
self._register_mcp_endpoints_http(router, http_transport, mount_path, dependencies)

fastapi_mcp/transport/http.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@ def __init__(
2020
event_store: EventStore | None = None,
2121
json_response: bool = True, # Default to JSON for HTTP transport
2222
security_settings: TransportSecuritySettings | None = None,
23+
stateless: bool = False,
2324
):
2425
self.mcp_server = mcp_server
2526
self.event_store = event_store
2627
self.json_response = json_response
2728
self.security_settings = security_settings
29+
self.stateless = stateless
2830
self._session_manager: StreamableHTTPSessionManager | None = None
2931
self._manager_task: asyncio.Task | None = None
3032
self._manager_started = False
@@ -47,13 +49,12 @@ async def _ensure_session_manager_started(self) -> None:
4749
logger.debug("Starting StreamableHTTP session manager")
4850

4951
# Create the session manager
50-
# Note: We don't use stateless=True because we want to support sessions
51-
# but sessions are optional as per the MCP spec
52+
# Use stateless flag to determine whether to support sessions
5253
self._session_manager = StreamableHTTPSessionManager(
5354
app=self.mcp_server,
5455
event_store=self.event_store,
5556
json_response=self.json_response,
56-
stateless=False, # Always support sessions, but they're optional
57+
stateless=self.stateless, # Use the stateless flag
5758
security_settings=self.security_settings,
5859
)
5960

0 commit comments

Comments
 (0)