|
feat: MCP-сервер встроенным FastMCP (/mcp) + архив вместо удаления
MCP (docs/07-mcp.md):
- embedded FastMCP streamable-http на /mcp того же контейнера api;
гейт — чистый ASGI McpTokenGuard по Bearer MCP_TOKEN из .env (пусто —
/mcp выключен). Route, не Mount: Mount('/mcp') не матчит точный /mcp.
- 31 тул в app/mcp/tools.py: выдача ключей клиенту (key_issue — plaintext
один раз), полный CRUD источников/типов/целей/правил, поток (events/
deliveries), push-подписки, настройки, send_test_event.
- тула переиспользуют функции admin-routes напрямую (синхронные def без
срабатывания Depends); HTTPException/ValidationError — как данные.
Архив вместо удаления (миграция 0007 b7d3e8f04a92):
- deleted_at на sources/notification_types/channel_targets/routing_rules +
частичные live-индексы; DELETE = 204 → архив, POST .../restore → 200.
- созд поверх архива → 409 с подсказкой id; ключ архивного источника →
401; тройка архивного типа → 422; целевые правки → 422; архивная цель в
правиле — Delivery skipped с аудитом; история имена архива показывает.
- push-подписки — исключение: жёсткое удаление.
- fix list_settings: оверрайды DB-only ключей (push/smtp, без .env-дефолта)
снова возвращаются в value.
Проверено: mcparch ALL OK (41), mcpcheck ALL OK (28, MCP SDK-клиент),
mecheck/retcheck ALL OK, UI-регрессия (SPA, источники+delete 204) ALL OK.
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
|---|
|
|
| .env.example |
|---|
| CLAUDE.md |
|---|
| README.md |
|---|
| alembic/versions/20261003_0007_soft_delete.py 0 → 100644 |
|---|
| app/api/admin_routes.py |
|---|
| app/api/admin_schemas.py |
|---|
| app/api/events_routes.py |
|---|
| app/auth/apikeys.py |
|---|
| app/config.py |
|---|
| app/main.py |
|---|
| app/mcp/__init__.py 0 → 100644 |
|---|
| app/mcp/server.py 0 → 100644 |
|---|
| app/mcp/tools.py 0 → 100644 |
|---|
| app/models/dicts.py |
|---|
| app/models/rules.py |
|---|
| app/worker/tasks.py |
|---|
| docs/07-mcp.md 0 → 100644 |
|---|
| requirements.txt |
|---|