From 6483453437d0edceebb6b75be4792bb1661dff66 Mon Sep 17 00:00:00 2001 From: Agent Zero Date: Mon, 13 Jul 2026 03:42:13 +0200 Subject: [PATCH] feat: reintegrate MCP server with proper session manager lifecycle, nginx /mcp proxy, docker.sock mount --- backend/app/main.py | 7 +++++++ backend/app/mcp_server.py | 15 +-------------- docker-compose.yml | 1 + frontend/nginx.conf | 12 ++++++++++++ 4 files changed, 21 insertions(+), 14 deletions(-) diff --git a/backend/app/main.py b/backend/app/main.py index a297b81..b1060b2 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -11,6 +11,7 @@ from app.cache import cache from app.routers import equipment, health, admin, rental_requests, contact from app.services.sync_service import SyncService from app.services.email_service import EmailService +from app.mcp_server import get_mcp_app, mcp_session_manager logger = logging.getLogger(__name__) settings = get_settings() @@ -41,6 +42,9 @@ async def lifespan(app: FastAPI): await init_db() await cache.connect() + _mcp_cm = mcp_session_manager.run() + await _mcp_cm.__aenter__() + scheduler.add_job(run_equipment_sync, trigger="cron", hour="*/6", id="equipment_sync", replace_existing=True) scheduler.add_job(run_email_retry, trigger="cron", minute="*/15", id="email_retry", replace_existing=True) scheduler.start() @@ -49,6 +53,7 @@ async def lifespan(app: FastAPI): yield scheduler.shutdown(wait=False) + await _mcp_cm.__aexit__(None, None, None) await cache.disconnect() await engine.dispose() @@ -63,3 +68,5 @@ app.include_router(health.router) app.include_router(admin.router) app.include_router(rental_requests.router) app.include_router(contact.router) + +app.mount("/mcp", get_mcp_app()) diff --git a/backend/app/mcp_server.py b/backend/app/mcp_server.py index 5dc8fbc..2a4552a 100644 --- a/backend/app/mcp_server.py +++ b/backend/app/mcp_server.py @@ -122,20 +122,7 @@ _STATIC_COMPONENTS = [ # streamable_http_path="/" so that when mounted at /mcp the endpoint is /mcp/ # stateless_http=True: each request is independent (no session management) # Disable DNS rebinding protection for Docker deployment -try: - from mcp.server.fastmcp.settings import TransportSecuritySettings - _ts = TransportSecuritySettings(enable_dns_rebinding_protection=False) -except Exception: - _ts = None - -_mcp_kwargs: dict[str, Any] = { - "streamable_http_path": "/", - "stateless_http": True, -} -if _ts is not None: - _mcp_kwargs["transport_security"] = _ts - -mcp = FastMCP("hms-cms", **_mcp_kwargs) +mcp = FastMCP("hms-cms", streamable_http_path="/", stateless_http=True) # ---------------------------------------------------------------------------# # Bearer token authentication wrapper diff --git a/docker-compose.yml b/docker-compose.yml index 50fd7e2..00e7138 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -55,6 +55,7 @@ services: volumes: - ./:/data/repo - ./images:/data/images + - /var/run/docker.sock:/var/run/docker.sock restart: unless-stopped healthcheck: test: diff --git a/frontend/nginx.conf b/frontend/nginx.conf index ab4654b..c195cb7 100644 --- a/frontend/nginx.conf +++ b/frontend/nginx.conf @@ -12,6 +12,18 @@ server { proxy_set_header X-Forwarded-Proto $scheme; } + + location /mcp { + proxy_pass http://backend:8000/mcp; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } + location / { try_files $uri $uri/ /index.html; }