Files
SafeLine/mcp_server/server.py

47 lines
1.4 KiB
Python
Raw Normal View History

2025-04-02 21:51:51 +08:00
from mcp.server import Server
from mcp.types import Tool, TextContent
import mcp.server.sse
from starlette.applications import Starlette
from starlette.routing import Route, Mount
from starlette.requests import Request
import uvicorn
2025-04-03 16:21:13 +08:00
from tools import tools
2025-04-02 21:51:51 +08:00
from config import GLOBAL_CONFIG
2025-04-03 16:21:13 +08:00
from middleware import AuthenticationMiddleware
from starlette.middleware import Middleware
2025-04-03 14:07:37 +08:00
2025-04-02 21:51:51 +08:00
# Create an MCP server
2025-04-03 14:07:37 +08:00
mcp_server = Server("SafeLine WAF mcp server")
2025-04-02 21:51:51 +08:00
sse = mcp.server.sse.SseServerTransport("/messages/")
2025-04-03 14:07:37 +08:00
@mcp_server.list_tools()
2025-04-02 21:51:51 +08:00
async def list_tools() -> list[Tool]:
2025-04-03 16:21:13 +08:00
return tools.all()
2025-04-02 21:51:51 +08:00
2025-04-03 14:07:37 +08:00
@mcp_server.call_tool()
2025-04-02 21:51:51 +08:00
async def call_tool(name: str, arguments: dict) -> list[TextContent]:
result = await tools.run(name, arguments)
return [TextContent(
type="text",
text=f"{name} result: {result}"
)]
async def handle_sse(request: Request) -> None:
async with sse.connect_sse(
request.scope, request.receive, request._send
) as [read_stream, write_stream]:
2025-04-03 14:07:37 +08:00
await mcp_server.run(
read_stream, write_stream, mcp_server.create_initialization_options()
2025-04-02 21:51:51 +08:00
)
def main():
2025-04-03 16:21:13 +08:00
starlette_app = Starlette(debug=GLOBAL_CONFIG.DEBUG,routes=[
2025-04-02 21:51:51 +08:00
Route("/sse", endpoint=handle_sse),
2025-04-03 16:21:13 +08:00
Mount("/messages/", app=sse.handle_post_message, middleware=[Middleware(AuthenticationMiddleware)]),
2025-04-02 21:51:51 +08:00
])
uvicorn.run(starlette_app, host=GLOBAL_CONFIG.LISTEN_ADDRESS, port=GLOBAL_CONFIG.LISTEN_PORT)