From 586acf22e8041f99a05780098074e50852729d7b Mon Sep 17 00:00:00 2001 From: toros Date: Tue, 8 Sep 2026 22:59:49 +0500 Subject: [PATCH] =?UTF-8?q?fix(webui):=20=D0=BC=D0=BE=D0=BD=D1=82=D0=B8?= =?UTF-8?q?=D1=80=D1=83=D0=B5=D0=BC=20MCP=20=D0=B2=20=D0=BA=D0=BE=D1=80?= =?UTF-8?q?=D0=B5=D0=BD=D1=8C=20(=D0=B2=D0=BD=D1=83=D1=82=D1=80=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D0=B8=D0=B9=20=D1=80=D0=BE=D1=83=D1=82=20/mcp)=20+?= =?UTF-8?q?=20UMask=20key?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit streamable_http_app() уже содержит маршрут /mcp, поэтому Mount на /mcp давал двойной префикс (307→/mcp/→404). Монтируем суб-приложение в корень после всех маршрутов — /api/*, /, /static приоритетны, /mcp отдаёт MCP. --- atxpi/deploy/systemd/atxpi.service | 2 +- atxpi/webui/server.py | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) 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")