import argparse import logging import uvicorn from mcp.server import Server from mcp.server.sse import SseServerTransport from starlette.applications import Starlette from starlette.requests import Request from starlette.routing import Mount, Route from starlette.middleware import Middleware from starlette.middleware.cors import CORSMiddleware from tools import mcp # Configure logging logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) logger = logging.getLogger('audio_index_server') def create_starlette_app(mcp_server: Server, *, debug: bool = False) -> Starlette: """Create a Starlette application that can serve the provided mcp server with SSE. Args: mcp_server: The MCP server instance to serve debug: Whether to enable debug mode Returns: A configured Starlette application """ sse = SseServerTransport("/messages/") async def handle_sse(request: Request) -> None: """Handle SSE connections from clients. Args: request: The incoming request """ logger.info(f"New SSE connection from {request.client.host if request.client else 'unknown'}") try: async with sse.connect_sse( request.scope, request.receive, request._send, # noqa: SLF001 ) as (read_stream, write_stream): await mcp_server.run( read_stream, write_stream, mcp_server.create_initialization_options(), ) except Exception as e: logger.error(f"Error in SSE connection: {str(e)}") raise # Configure middleware middleware = [ Middleware( CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"], ) ] return Starlette( debug=debug, routes=[ Route("/sse", endpoint=handle_sse), Mount("/messages/", app=sse.handle_post_message), ], middleware=middleware, ) def parse_arguments(): """Parse command line arguments. Returns: Parsed arguments """ parser = argparse.ArgumentParser(description="Run MCP SSE-based Audio Index server") parser.add_argument("--host", default="0.0.0.0", help="Host to bind to") parser.add_argument("--port", type=int, default=8080, help="Port to listen on") parser.add_argument("--debug", action="store_true", help="Enable debug mode") return parser.parse_args() if __name__ == "__main__": args = parse_arguments() logger.info(f"Starting Audio Index MCP server on {args.host}:{args.port}") mcp_server = mcp._mcp_server # noqa: WPS437 starlette_app = create_starlette_app(mcp_server, debug=args.debug) try: uvicorn.run(starlette_app, host=args.host, port=args.port) except Exception as e: logger.error(f"Server error: {str(e)}")