feat(fusion): serveur MCP complété (ACC-5.1) + pont MCP ObsiGate (ACC-2.2) — 7.83.0
FlowDeck CI / test (push) Failing after 3h11m23s
FlowDeck CI / lint (push) Failing after 5s
FlowDeck CI / docker (push) Skipped

ACC-5.1 (#24) — app/routers/mcp_server.py : catalogue §7.2 complété
(list_projects, get_project, read_page tronqué proprement,
list_project_tasks), search_pages en plein texte, liens profonds +
kind sur chaque résultat, scopes du jeton appliqués (écriture
refusée -32002 sans scope write) et journalisation §7.4 de chaque
tools/call dans api_audit_log (clés d'arguments seulement).

ACC-2.2 (#20) — pont MCP Flowdeck → ObsiGate, côté client :
- mcp_client : serveurs à session (capture/réémission de
  Mcp-Session-Id, handshake avant tools/call), décodage SSE
  multi-messages par id de réponse, classification des outils à la
  découverte (readOnlyHint sinon heuristique ; lecture par défaut).
- preset connecteur « obsigate » (URL dérivée dev/prod), kinds MCP
  factorisés (connectors.MCP_KINDS), option dans le panneau agent.
- garde-fou n° 2 : permission_manager.is_write_tool couvre les
  outils MCP écrivants → portes politique d'approbation
  (agent_engine) et rôles (assert_can) ; McpTool bloque tout
  apply_* distant (patron §7.5).

Tests : test_fusion_mcp_server 18, nouveau test_fusion_pont_obsigate
7 (faux serveur ObsiGate à session stricte via le vrai _rpc).
Preuve réelle T0-T5 : attend la clé ObsiGate dédiée (1 vault) et
Q-A/Q-B côté Bruno.
This commit is contained in:
Spark
2026-10-26 12:38:04 -04:00
parent fd79a49d63
commit 19b27698f2
13 changed files with 1044 additions and 51 deletions
+43
View File
@@ -1,5 +1,48 @@
# Changelog - FlowDeck
## v7.83.0 (2026-10-26) — Fusion : serveur MCP complété (ACC-5.1) et pont MCP vers ObsiGate (ACC-2.2)
- **ACC-5.1 — serveur MCP Flowdeck complété** (`app/routers/mcp_server.py`,
spec d'accès centralisé §7.2/§7.4). Le catalogue de lecture gagne
`list_projects`, `get_project` (métadonnées + schéma + titres seuls),
`read_page` (page classique ou ligne de collection, contenu tronqué
proprement à 20 000 caractères) et `list_project_tasks` (tâches d'une
base projet, tous assignés). `search_pages` devient une vraie
recherche **plein texte** (titre + contenu des pages, titre +
propriétés des lignes de collection), et chaque résultat porte son
**lien profond** (`url`) et son `kind` — contrat figé : un projet
Flowdeck est une collection. §7.4 tenu : les **scopes du jeton**
sont appliqués (un jeton `read` se voit refuser les outils
d'écriture, erreur -32002) et **chaque appel `tools/call` est
journalisé** dans `api_audit_log` (outil, jeton, statut — jamais les
valeurs d'arguments). `list_meetings`/`get_meeting` restent hors
catalogue tant que la décision Meetings A/B n'est pas tranchée.
- **ACC-2.2 — pont MCP Flowdeck → ObsiGate, côté client**
(`app/services/mcp_client.py`, plan « étape 1 : lectures seules »).
Le client MCP gère désormais les serveurs **à session** (Streamable
HTTP d'ObsiGate) : capture et réémission de l'en-tête
`Mcp-Session-Id`, handshake complet avant `tools/call`, et décodage
SSE **multi-messages** (le message de réponse est sélectionné, pas
le premier `data:`). Nouveau preset de connecteur **« obsigate »**
(URL dérivée de la configuration dev/prod, clé dédiée au pont créée
dans ObsiGate → Configurations → Clés API & MCP).
- **Garde-fou n° 2 du plan du pont** : les outils MCP sont **classés**
à la découverte (annotation `readOnlyHint` du serveur, sinon
heuristique de nom ; lecture par défaut). Un outil MCP écrivant
(`propose_*`, `create_*`…) passe désormais par les mêmes portes que
les outils internes — politique d'approbation (`agent_policies`) et
rôles (`PermissionManager`, via le nouvel `is_write_tool`) — là où
il passait avant pour une lecture. Et un outil distant **`apply_*`
est bloqué côté client** : une écriture croisée ne s'exécute jamais
par un simple appel d'outil ; elle suit le patron §7.5 (propose →
approbation dans l'application propriétaire).
- **Preuve réelle T0–T5** : le code est testé contre un faux serveur
ObsiGate à session stricte (`tests/test_fusion_pont_obsigate.py`,
7 tests ; `tests/test_fusion_mcp_server.py` porté à 18 tests). La
démonstration contre l'ObsiGate réel attend encore deux gestes de
Bruno : créer la clé API ObsiGate dédiée au pont, **limitée à un
seul vault**, et trancher **Q-A/Q-B** (fusion-trois-apps #1).
## v7.82.4 (2026-10-25) — Résolution dev/prod par l'hôte de la requête : le mode console du panneau revit en dev
- **Bug corrigé (dev)** : sur flowdeck-dev, le mode console du