Yash030 commited on
Commit
bd2a9a6
·
1 Parent(s): cd7fabd

Fix MCP SSE implementation using raw ASGI routes

Browse files
Files changed (1) hide show
  1. src/combined_server.py +24 -24
src/combined_server.py CHANGED
@@ -182,32 +182,32 @@ async def handle_call_tool(name: str, arguments: dict | None) -> list[types.Text
182
 
183
  # --- 5. Mount MCP SSE Endpoint ---
184
 
185
- # We need to manage the SSE transport manually
186
  sse_transport = SseServerTransport("/mcp/messages")
187
 
188
- @app.get("/mcp/sse")
189
- async def handle_sse(request: Request):
190
- async def event_generator():
191
- try:
192
- async with mcp_server.run_sse(sse_transport) as streams:
193
- logger.info("✅ MCP SSE Stream Started")
194
- async for message in streams[1]:
195
- # logger.info(f"📤 Yielding message type: {type(message)}")
196
- # Ensure message is compatible with sse_starlette
197
- if isinstance(message, types.ServerMessage):
198
- yield message.model_dump_json()
199
- else:
200
- yield message
201
- except Exception as e:
202
- logger.error(f"❌ SSE Generator Error: {e}", exc_info=True)
203
- raise
204
-
205
- return EventSourceResponse(event_generator())
206
-
207
- @app.post("/mcp/messages")
208
- async def handle_messages(request: Request):
209
- await sse_transport.handle_post_message(request.scope, request.receive, request._send)
210
- return {}
211
 
212
  from fastapi.responses import RedirectResponse
213
 
 
182
 
183
  # --- 5. Mount MCP SSE Endpoint ---
184
 
185
+ # We need to manage the SSE transport manually using raw ASGI routes
186
  sse_transport = SseServerTransport("/mcp/messages")
187
 
188
+ async def handle_sse(scope, receive, send):
189
+ """
190
+ Raw ASGI handler for SSE endpoint.
191
+ Uses sse_transport.connect_sse to manage the connection and streams.
192
+ """
193
+ async with sse_transport.connect_sse(scope, receive, send) as (read_stream, write_stream):
194
+ # Run the MCP server with the streams
195
+ await mcp_server.run(
196
+ read_stream,
197
+ write_stream,
198
+ mcp_server.create_initialization_options()
199
+ )
200
+
201
+ async def handle_messages(scope, receive, send):
202
+ """
203
+ Raw ASGI handler for Messages endpoint.
204
+ Delegates to sse_transport.handle_post_message.
205
+ """
206
+ await sse_transport.handle_post_message(scope, receive, send)
207
+
208
+ # Add routes directly to the FastAPI app (which is a Starlette app)
209
+ app.add_route("/mcp/sse", handle_sse, methods=["GET"])
210
+ app.add_route("/mcp/messages", handle_messages, methods=["POST"])
211
 
212
  from fastapi.responses import RedirectResponse
213