mirror of https://github.com/dapr/dapr-agents.git
65 lines
2.8 KiB
Python
65 lines
2.8 KiB
Python
import argparse
|
|
import logging
|
|
import uvicorn
|
|
from starlette.applications import Starlette
|
|
from starlette.requests import Request
|
|
from starlette.routing import Mount, Route
|
|
|
|
from mcp.server.sse import SseServerTransport
|
|
from tools import mcp
|
|
|
|
# ─────────────────────────────────────────────
|
|
# Logging Configuration
|
|
# ─────────────────────────────────────────────
|
|
logging.basicConfig(
|
|
level=logging.INFO,
|
|
format="%(asctime)s - %(levelname)s - %(message)s"
|
|
)
|
|
logger = logging.getLogger("mcp-server")
|
|
|
|
# ─────────────────────────────────────────────
|
|
# Starlette App Factory
|
|
# ─────────────────────────────────────────────
|
|
def create_starlette_app():
|
|
"""
|
|
Create a Starlette app wired with the MCP server over SSE transport.
|
|
"""
|
|
logger.debug("Creating Starlette app with SSE transport")
|
|
sse = SseServerTransport("/messages/")
|
|
|
|
async def handle_sse(request: Request) -> None:
|
|
logger.info("🔌 SSE connection established")
|
|
async with sse.connect_sse(request.scope, request.receive, request._send) as (read_stream, write_stream):
|
|
logger.debug("Starting MCP server run loop over SSE")
|
|
await mcp._mcp_server.run(read_stream, write_stream, mcp._mcp_server.create_initialization_options())
|
|
logger.debug("MCP run loop completed")
|
|
|
|
return Starlette(
|
|
debug=False,
|
|
routes=[
|
|
Route("/sse", endpoint=handle_sse),
|
|
Mount("/messages/", app=sse.handle_post_message)
|
|
]
|
|
)
|
|
|
|
# ─────────────────────────────────────────────
|
|
# CLI Entrypoint
|
|
# ─────────────────────────────────────────────
|
|
def main():
|
|
parser = argparse.ArgumentParser(description="Run an MCP tool server.")
|
|
parser.add_argument("--server_type", choices=["stdio", "sse"], default="stdio", help="Transport to use")
|
|
parser.add_argument("--host", default="127.0.0.1", help="Host to bind to (SSE only)")
|
|
parser.add_argument("--port", type=int, default=8000, help="Port to bind to (SSE only)")
|
|
args = parser.parse_args()
|
|
|
|
logger.info(f"🚀 Starting MCP server in {args.server_type.upper()} mode")
|
|
|
|
if args.server_type == "stdio":
|
|
mcp.run("stdio")
|
|
else:
|
|
app = create_starlette_app()
|
|
logger.info(f"🌐 Running SSE server on {args.host}:{args.port}")
|
|
uvicorn.run(app, host=args.host, port=args.port)
|
|
|
|
if __name__ == "__main__":
|
|
main() |