diff --git a/atxpi/deploy/systemd/atxpi.service b/atxpi/deploy/systemd/atxpi.service index b2275a7..bd9898d 100644 --- a/atxpi/deploy/systemd/atxpi.service +++ b/atxpi/deploy/systemd/atxpi.service @@ -12,7 +12,7 @@ EnvironmentFile=/etc/atxpi/atxpi.env ExecStart=@TARGET@/atxpi/venv/bin/uvicorn atxpi.webui.server:app --host @BIND_HOST@ --port @BIND_PORT@ Restart=always RestartSec=3 -Umask=0077 +UMask=0077 # безопасность: не даём раскрывать переменные окружения сервиса NoNewPrivileges=true ProtectSystem=full diff --git a/atxpi/webui/server.py b/atxpi/webui/server.py index 36e375f..fe0387a 100644 --- a/atxpi/webui/server.py +++ b/atxpi/webui/server.py @@ -208,7 +208,8 @@ def power_cycle() -> dict: return power_mod.cycle() -app.mount("/mcp", mcp.streamable_http_app()) +# Суб-приложение mcp уже содержит маршрут `/mcp` → монтируем его в КОРЕНЬ +# (см. app.mount("/", ...) в самом низу файла), чтобы наш /mcp отдавал его роут. # ── статика ───────────────────────────────────────────────────────────────── @@ -218,3 +219,8 @@ async def index(): app.mount("/static", StaticFiles(directory=STATIC), name="static") + +# MCP-эндпоинт. streamable_http_app() имеет собственный маршрут `/mcp`, поэтому +# монтируем суб-приложение в корень ПОСЛЕ всех наших маршрутов — тогда +# /api/*, /, /static обрабатываются первыми, а /mcp отдаёт MCP-протокол. +app.mount("/", mcp.streamable_http_app(), name="mcp")