Skip to content

Commit 188dc83

Browse files
committed
Pass app and security_settings explicitly to handle_modern_request
Drops the StreamableHTTPSessionManager dependency from the experimental module; the handler only needs the lowlevel Server and the TransportSecuritySettings. Claude-Session: https://claude.ai/code/session_017S3aJaxEHeMvftp6whnHWK
1 parent 980d57a commit 188dc83

2 files changed

Lines changed: 8 additions & 7 deletions

File tree

src/mcp/server/_experimental/streamable_http_modern.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
from starlette.types import Receive, Scope, Send
2626

2727
from mcp.server.runner import ServerRunner, otel_middleware
28-
from mcp.server.transport_security import TransportSecurityMiddleware
28+
from mcp.server.transport_security import TransportSecurityMiddleware, TransportSecuritySettings
2929
from mcp.shared.dispatcher import CallOptions, OnNotify, OnRequest
3030
from mcp.shared.exceptions import MCPError, NoBackChannelError
3131
from mcp.shared.message import MessageMetadata, ServerMessageMetadata
@@ -42,7 +42,7 @@
4242
)
4343

4444
if TYPE_CHECKING:
45-
from mcp.server.streamable_http_manager import StreamableHTTPSessionManager
45+
from mcp.server.lowlevel.server import Server
4646

4747
logger = logging.getLogger(__name__)
4848

@@ -157,7 +157,8 @@ async def handle(self, req: JSONRPCRequest, on_request: OnRequest) -> JSONRPCRes
157157

158158

159159
async def handle_modern_request(
160-
manager: StreamableHTTPSessionManager,
160+
app: Server[Any],
161+
security_settings: TransportSecuritySettings | None,
161162
scope: Scope,
162163
receive: Receive,
163164
send: Send,
@@ -169,7 +170,7 @@ async def handle_modern_request(
169170
"""
170171
request = Request(scope, receive)
171172

172-
security = TransportSecurityMiddleware(manager.security_settings)
173+
security = TransportSecurityMiddleware(security_settings)
173174
err = await security.validate_request(request, is_post=(request.method == "POST"))
174175
if err is not None:
175176
await err(scope, receive, send)
@@ -196,9 +197,9 @@ async def handle_modern_request(
196197

197198
dispatcher = SingleExchangeDispatcher(request)
198199
# TODO: per-request lifespan re-entry matches stateless_http=True today; revisit in #2893.
199-
async with manager.app.lifespan(manager.app) as lifespan_state:
200+
async with app.lifespan(app) as lifespan_state:
200201
runner = ServerRunner(
201-
server=manager.app,
202+
server=app,
202203
dispatcher=dispatcher,
203204
lifespan_state=lifespan_state,
204205
has_standalone_channel=False,

src/mcp/server/streamable_http_manager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ async def handle_request(self, scope: Scope, receive: Receive, send: Send) -> No
155155
# (per SEP-2575) is a follow-up. 2025 paths below remain unchanged.
156156
pv = next((v.decode("latin-1") for k, v in scope["headers"] if k == b"mcp-protocol-version"), None)
157157
if pv == "2026-07-28":
158-
await handle_modern_request(self, scope, receive, send)
158+
await handle_modern_request(self.app, self.security_settings, scope, receive, send)
159159
return
160160

161161
# Dispatch to the appropriate handler

0 commit comments

Comments
 (0)