feat: connecteurs Discord/Telegram/MCP + outils MCP dynamiques au registre (v7.57.0)
- presets Discord / Telegram : colonnes kind + auth (bearer/bot/none) sur
agent_connectors (migration 34) ; Discord envoie le jeton préfixé dans
l'en-tête d'autorisation, Telegram le place dans l'URL via le substitut
{secret} remplacé à l'appel — jamais stocké en clair
- Teams : scope ChannelMessage.Read.All ajouté aux Graph scopes M365
- app/services/mcp_client.py : handshake initialize → notifications/initialized
→ tools/list → tools/call (JSON-RPC 2.0, réponse JSON ou premier data: d'un
text/event-stream), garde SSRF, outils cachés en base (tools_json) —
le bouton « Tester » rejoue le handshake
- ToolRegistry._all() merge le cache MCP à chaque run : outils exposés au LLM
sous mcp_<serveur>_<outil> avec leur inputSchema, dispatch tools/call ;
serveur désactivé → outil absent du schéma, échec réseau → ToolResult(error)
- menu + : champ Type dans le formulaire connecteur (preset URL + auth),
badge « · N outil(s) » sur la fiche d'un serveur MCP
- tests : tests/test_v757_mcp_discord.py (12 tests, 0 appel réseau réel) ;
suite complète 1331 verts, ruff 0, eslint 0
- livraison : VERSION + app/main = 7.57.0, OpenAPI 523 chemins, CHANGELOG,
ROADMAP phase 7 cochée, avenant phase 7 dans docs/V74_Agent_Plus_Menu.md
This commit is contained in:
@@ -1,5 +1,37 @@
|
||||
# Changelog - FlowDeck
|
||||
|
||||
## v7.57.0 (2026-10-06) — Connecteurs : Discord, Telegram, Teams, MCP (phase 7/8)
|
||||
|
||||
### Added
|
||||
|
||||
- **Presets Discord / Telegram** — champ **Type** dans le formulaire « Ajouter
|
||||
un connecteur » (Personnalisé / Discord / Telegram / Serveur MCP) : URL et
|
||||
schéma d'authentification pré-remplis. Colonnes `kind` + `auth`
|
||||
(`bearer`/`bot`/`none`) ajoutées à `agent_connectors` (migration **34**) ;
|
||||
Discord envoie son jeton préfixé dans l'en-tête d'autorisation, Telegram place
|
||||
le jeton **dans l'URL** via le substitut `{secret}` — substitué à l'appel,
|
||||
**jamais stocké en clair** (la colonne url ne contient que le motif).
|
||||
- **Teams** — scope `ChannelMessage.Read.All` ajouté aux Graph scopes M365
|
||||
(consentement admin requis à la reconnexion).
|
||||
- **`app/services/mcp_client.py`** — client MCP (streamable HTTP) : handshake
|
||||
`initialize` → `notifications/initialized` → `tools/list` → `tools/call`
|
||||
(JSON-RPC 2.0, réponse JSON **ou** premier `data:` d'un `text/event-stream`),
|
||||
garde SSRF conservée, erreurs JSON-RPC remontées telles quelles, sortie
|
||||
bornée à 20 000 car. Les outils sont **cachés** en base (`tools_json`) — le
|
||||
bouton « Tester le connecteur » rejoue le handshake et met à jour la liste.
|
||||
- **Outils dynamiques au registre** — `ToolRegistry._all()` merge ce cache à
|
||||
chaque run : chaque outil est exposé au LLM sous `mcp_<serveur>_<outil>` avec
|
||||
son `inputSchema` d'origine, et `execute()` dispatche sur `tools/call`.
|
||||
Serveur désactivé → outil **absent du schéma** ; échec réseau →
|
||||
`ToolResult(error)` sans casser le run.
|
||||
- **Menu +** — badge `· N outil(s)` sur la fiche d'un serveur MCP ;
|
||||
`POST /api/agent/connectors` accepte `kind` + `auth` (400 sur valeurs
|
||||
inconnues).
|
||||
- **Tests** — `tests/test_v757_mcp_discord.py` : **12 tests**, 0 appel réseau
|
||||
réel (`_rpc` / `_get` monkeypatchés) — presets, `{secret}` absent de la base,
|
||||
handshake + séquence d'appels, cache, dispatch LLM, serveur désactivé,
|
||||
erreurs RPC, parse SSE, scopes Teams, câblage menu.
|
||||
|
||||
## v7.56.0 (2026-10-06) — Connecteurs : Google + Microsoft 365 (phase 6/8)
|
||||
|
||||
### Added
|
||||
|
||||
Reference in New Issue
Block a user