105
105
ToolService ,
106
106
)
107
107
from mcpgateway .transports .sse_transport import SSETransport
108
- from mcpgateway .transports .streamablehttp_transport import handle_streamable_http , session_manager
108
+ from mcpgateway .transports .streamablehttp_transport import SessionManagerWrapper , JWTAuthMiddlewareStreamableHttp
109
109
from mcpgateway .types import (
110
110
InitializeRequest ,
111
111
InitializeResult ,
146
146
sampling_handler = SamplingHandler ()
147
147
server_service = ServerService ()
148
148
149
+ # Initialize session manager for Streamable HTTP transport
150
+ streamable_http_session = SessionManagerWrapper ()
151
+
149
152
150
153
# Initialize session registry
151
154
session_registry = SessionRegistry (
@@ -192,11 +195,8 @@ async def lifespan(_app: FastAPI) -> AsyncIterator[None]:
192
195
await logging_service .initialize ()
193
196
await sampling_handler .initialize ()
194
197
await resource_cache .initialize ()
198
+ await streamable_http_session .start ()
195
199
196
- from contextlib import AsyncExitStack
197
- stack = AsyncExitStack ()
198
- await stack .enter_async_context (session_manager .run ())
199
- # await start_streamablehttp()
200
200
logger .info ("All services initialized successfully" )
201
201
yield
202
202
except Exception as e :
@@ -215,6 +215,7 @@ async def lifespan(_app: FastAPI) -> AsyncIterator[None]:
215
215
prompt_service ,
216
216
resource_service ,
217
217
tool_service ,
218
+ streamable_http_session
218
219
]:
219
220
try :
220
221
await service .shutdown ()
@@ -284,6 +285,9 @@ async def dispatch(self, request: Request, call_next):
284
285
# Add custom DocsAuthMiddleware
285
286
app .add_middleware (DocsAuthMiddleware )
286
287
288
+ # Add streamable HTTP middleware for JWT auth
289
+ app .add_middleware (JWTAuthMiddlewareStreamableHttp )
290
+
287
291
# Set up Jinja2 templates and store in app state for later use
288
292
templates = Jinja2Templates (directory = str (settings .templates_dir ))
289
293
app .state .templates = templates
@@ -2027,7 +2031,7 @@ async def readiness_check(db: Session = Depends(get_db)):
2027
2031
logger .warning ("Admin API routes not mounted - Admin API disabled via MCPGATEWAY_ADMIN_API_ENABLED=False" )
2028
2032
2029
2033
# Streamable http Mount
2030
- app .mount ("/mcp" , app = handle_streamable_http )
2034
+ app .mount ("/mcp" , app = streamable_http_session . handle_streamable_http )
2031
2035
2032
2036
# Conditional static files mounting and root redirect
2033
2037
if UI_ENABLED :
0 commit comments