""" MCP gateway router — mounts SSE transport at /mcp/sse and /mcp/messages. All requests that invoke agents are forced to local (Ollama) mode inside server.py before any agent reasoning begins. The MCP client (e.g. Claude Code CLI) only ever receives tool *results*, not any LLM completions. """ from __future__ import annotations import logging from mcp.server.models import InitializationOptions from mcp.server.lowlevel import NotificationOptions from starlette.requests import Request from starlette.responses import Response from starlette.routing import Route from ..mcp.server import create_mcp_server, build_sse_transport logger = logging.getLogger(__name__) # Singletons created once at module import time _mcp_server = create_mcp_server() _sse_transport = build_sse_transport() _INIT_OPTIONS = InitializationOptions( server_name='activeblue-ai', server_version='0.1.0', capabilities=_mcp_server.get_capabilities( notification_options=NotificationOptions(), experimental_capabilities={}, ), ) async def handle_sse(request: Request) -> Response: """SSE endpoint — client connects here to establish a session.""" logger.debug('MCP SSE connection from %s', request.client) async with _sse_transport.connect_sse( request.scope, request.receive, request._send ) as streams: await _mcp_server.run(streams[0], streams[1], _INIT_OPTIONS) return Response() async def handle_post_message(request: Request) -> Response: """POST endpoint — client sends JSON-RPC tool call messages here.""" await _sse_transport.handle_post_message( request.scope, request.receive, request._send ) return Response() # Starlette routes to be added to the FastAPI app mcp_routes = [ Route('/mcp/sse', endpoint=handle_sse, methods=['GET']), Route('/mcp/messages', endpoint=handle_post_message, methods=['POST']), ]