Files
SafeLine/mcp_server/server.py

49 lines
1.5 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
from starlette.responses import PlainTextResponse
import tools
from config import GLOBAL_CONFIG
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]:
return tools.ALL_TOOLS
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:
2025-04-03 14:07:37 +08:00
if GLOBAL_CONFIG.SECRET and GLOBAL_CONFIG.SECRET != "" and request.headers.get("Secret") != GLOBAL_CONFIG.SECRET:
2025-04-02 21:51:51 +08:00
return PlainTextResponse("Unauthorized", status_code=401)
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():
starlette_app = Starlette(debug=True,routes=[
Route("/sse", endpoint=handle_sse),
Mount("/messages/", app=sse.handle_post_message),
])
uvicorn.run(starlette_app, host=GLOBAL_CONFIG.LISTEN_ADDRESS, port=GLOBAL_CONFIG.LISTEN_PORT)