feat(fusion): serveur MCP complété (ACC-5.1) + pont MCP ObsiGate (ACC-2.2) — 7.83.0
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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user