feat(ai): serveur MCP Streamable HTTP + confirmations two-step (#79 phase E)
CI / lint (push) Successful in 1m3s
CI / security (push) Successful in 41s
CI / test (push) Successful in 1m20s
CI / build (push) Successful in 1m19s
CI / e2e (push) Successful in 10m56s
Desktop Build / build-windows (push) Canceled after 0s
Desktop Build / build-linux (push) Canceled after 0s

This commit is contained in:
2026-09-11 21:28:05 -04:00
parent 83c412b33d
commit 88eecd7671
9 changed files with 984 additions and 17 deletions
+17 -6
View File
@@ -159,14 +159,23 @@ boucle (max N itérations):
(les appels d'outils exigent la réponse complète avant exécution). Confirmations UI en deux temps
(`confirmation` → `confirm`/`confirm_messages`).
### 3.4 Couche 4 — Serveur MCP
### 3.4 Couche 4 — Serveur MCP (livré, phase E)
Nouveau `backend/mcp/server.py` basé sur le SDK MCP Python :
`backend/mcp/server.py` s'appuie sur le SDK MCP Python (`mcp==1.9.4`) :
- **Tools** : enregistrés depuis le registry (mutations + recherche).
- **Resources** : vaults/fichiers en lecture (`vault://name/path.md`).
- **Prompts** : templates (résumer un dossier, générer une note…).
- Transports : **stdio** (local) et **HTTP/SSE** (distant, auth JWT).
- **Tools** : enregistrés depuis le registry (scope `mcp`). Les outils `read` sont exposés
directement ; les outils `write`/`dangerous` le sont via la paire `propose_<tool>` /
`apply_<tool>` (jeton signé, usage unique, TTL).
- **Resources** : `vault://<name>` (vaults accessibles) et `vault://<name>/<path>` (fichiers,
lecture seule, secrets redactés).
- **Prompts** : `summarize-directory`, `generate-note`, `find-related`.
- Transport : **Streamable HTTP** (`/mcp`, SDK `StreamableHTTPSessionManager` en
`json_response=True`), auth `Authorization: Bearer <JWT>` → `get_current_user`. `stdio`
optionnel plus tard.
- Confirmations (E4) : `backend/mcp/confirmations.py` — jeton JWT (`type=mcp_confirmation`)
contenant outil + arguments + utilisateur ; blacklist de JTI persistée pour l'anti-rejeu.
- Le manager de session est démarré **paresseusement** à la première requête, pour fonctionner
aussi bien sous uvicorn que sous le client de test (sans lifespan ASGI).
---
@@ -319,6 +328,8 @@ Voir `docs/ROADMAP.md` (item dédié) pour le détail des activités.
- `backend/services/` — logique métier partagée (vaults, files, search, backups, graph, recent) consommée par les routes et les outils
- `backend/ai_chat.py` — chat completion provider-agnostique avec tool calling et streaming (OpenAI-compat + Gemini)
- `backend/agent/loop.py` — agent loop in-app (multi-étapes, LLM injectable)
- `backend/mcp/server.py` — serveur MCP (Streamable HTTP `/mcp`, tools/resources/prompts)
- `backend/mcp/confirmations.py` — jetons de confirmation signés (two-step, anti-rejeu)
- `backend/bookslm.py`, `backend/bookslm_routes.py` — assistant contextuel (+ endpoint `/agent`)
- `frontend/js/ai.js`, `frontend/js/bookslm.js` — UI IA
- `backend/auth/middleware.py` — permissions