Fix SSE server bug with uncaught TypeError

This commit is contained in:
Allen Porter
2024-12-30 10:04:19 -08:00
parent 59fff69c38
commit 0970ef4ae0
5 changed files with 13 additions and 25 deletions

View File

@@ -90,9 +90,9 @@ def main(port: int, transport: str) -> int:
if transport == "sse": if transport == "sse":
from mcp.server.sse import SseServerTransport from mcp.server.sse import SseServerTransport
from starlette.applications import Starlette from starlette.applications import Starlette
from starlette.routing import Route from starlette.routing import Route, Mount
sse = SseServerTransport("/messages") sse = SseServerTransport("/messages/")
async def handle_sse(request): async def handle_sse(request):
async with sse.connect_sse( async with sse.connect_sse(
@@ -102,14 +102,11 @@ def main(port: int, transport: str) -> int:
streams[0], streams[1], app.create_initialization_options() streams[0], streams[1], app.create_initialization_options()
) )
async def handle_messages(request):
await sse.handle_post_message(request.scope, request.receive, request._send)
starlette_app = Starlette( starlette_app = Starlette(
debug=True, debug=True,
routes=[ routes=[
Route("/sse", endpoint=handle_sse), Route("/sse", endpoint=handle_sse),
Route("/messages", endpoint=handle_messages, methods=["POST"]), Mount("/messages/", app=sse.handle_post_message)
], ],
) )

View File

@@ -47,9 +47,9 @@ def main(port: int, transport: str) -> int:
if transport == "sse": if transport == "sse":
from mcp.server.sse import SseServerTransport from mcp.server.sse import SseServerTransport
from starlette.applications import Starlette from starlette.applications import Starlette
from starlette.routing import Route from starlette.routing import Route, Mount
sse = SseServerTransport("/messages") sse = SseServerTransport("/messages/")
async def handle_sse(request): async def handle_sse(request):
async with sse.connect_sse( async with sse.connect_sse(
@@ -59,14 +59,11 @@ def main(port: int, transport: str) -> int:
streams[0], streams[1], app.create_initialization_options() streams[0], streams[1], app.create_initialization_options()
) )
async def handle_messages(request):
await sse.handle_post_message(request.scope, request.receive, request._send)
starlette_app = Starlette( starlette_app = Starlette(
debug=True, debug=True,
routes=[ routes=[
Route("/sse", endpoint=handle_sse), Route("/sse", endpoint=handle_sse),
Route("/messages", endpoint=handle_messages, methods=["POST"]), Mount("/messages/", app=sse.handle_post_message),
], ],
) )

View File

@@ -60,9 +60,9 @@ def main(port: int, transport: str) -> int:
if transport == "sse": if transport == "sse":
from mcp.server.sse import SseServerTransport from mcp.server.sse import SseServerTransport
from starlette.applications import Starlette from starlette.applications import Starlette
from starlette.routing import Route from starlette.routing import Route, Mount
sse = SseServerTransport("/messages") sse = SseServerTransport("/messages/")
async def handle_sse(request): async def handle_sse(request):
async with sse.connect_sse( async with sse.connect_sse(
@@ -72,14 +72,11 @@ def main(port: int, transport: str) -> int:
streams[0], streams[1], app.create_initialization_options() streams[0], streams[1], app.create_initialization_options()
) )
async def handle_messages(request):
await sse.handle_post_message(request.scope, request.receive, request._send)
starlette_app = Starlette( starlette_app = Starlette(
debug=True, debug=True,
routes=[ routes=[
Route("/sse", endpoint=handle_sse), Route("/sse", endpoint=handle_sse),
Route("/messages", endpoint=handle_messages, methods=["POST"]), Mount("/messages/", app=sse.handle_post_message),
], ],
) )

View File

@@ -423,9 +423,9 @@ class FastMCP:
async def run_sse_async(self) -> None: async def run_sse_async(self) -> None:
"""Run the server using SSE transport.""" """Run the server using SSE transport."""
from starlette.applications import Starlette from starlette.applications import Starlette
from starlette.routing import Route from starlette.routing import Route, Mount
sse = SseServerTransport("/messages") sse = SseServerTransport("/messages/")
async def handle_sse(request): async def handle_sse(request):
async with sse.connect_sse( async with sse.connect_sse(
@@ -437,14 +437,11 @@ class FastMCP:
self._mcp_server.create_initialization_options(), self._mcp_server.create_initialization_options(),
) )
async def handle_messages(request):
await sse.handle_post_message(request.scope, request.receive, request._send)
starlette_app = Starlette( starlette_app = Starlette(
debug=self.settings.debug, debug=self.settings.debug,
routes=[ routes=[
Route("/sse", endpoint=handle_sse), Route("/sse", endpoint=handle_sse),
Route("/messages", endpoint=handle_messages, methods=["POST"]), Mount("/messages/", app=sse.handle_post_message),
], ],
) )

View File

@@ -11,7 +11,7 @@ Example usage:
# Create Starlette routes for SSE and message handling # Create Starlette routes for SSE and message handling
routes = [ routes = [
Route("/sse", endpoint=handle_sse), Route("/sse", endpoint=handle_sse),
Route("/messages", endpoint=handle_messages, methods=["POST"]) Mount("/messages", endpoint=handle_messages, methods=["POST"])
] ]
# Define handler functions # Define handler functions