100 lines
3.1 KiB
Python
100 lines
3.1 KiB
Python
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)}")
|