diff --git a/common/PROTOCOL-INFRA.md b/common/PROTOCOL-INFRA.md index f6d960a..2a54823 100644 --- a/common/PROTOCOL-INFRA.md +++ b/common/PROTOCOL-INFRA.md @@ -428,6 +428,6 @@ Regle distincte de l'anti-invention benchmarks du 27/07/2026 (qui couvre la veil Le MCP natif de Baserow (image officielle, non patchable) ne couvre que les lignes (create_rows/delete_rows/list_tables/...), pas le schema (tables/champs). Nouveau service independant `baserow-schema-mcp` (port 3101, meme famille que le sidecar OAuth `baserow-oauth-stub`) proxyant 4 outils vers l'API REST native de Baserow. Trois pieges a retenir pour tout futur service MCP maison : (1) ces 4 routes de schema exigent un JWT utilisateur, le Database API Token ne fonctionne pas dessus (confirme via /api/redoc/) -- re-login proactif + retry sur 401 pour eviter de reproduire l'incident "rotation Baserow" deja vu sur dashboard-terrain et gsparc-mezzouna-api ; (2) l'API bas niveau `mcp.server.sse.SseServerTransport` a change entre la version figee par context-hub et `mcp==1.29.0` (methodes disparues) -- preferer l'API haut niveau `FastMCP` (`@mcp.tool()` + `mcp.sse_app()`), plus stable dans le temps ; (3) `mcp>=1.29` protege par defaut contre le DNS rebinding avec `allowed_hosts=[]`, ce qui rejette TOUT Host header tant qu'on ne le configure pas explicitement. Reste a faire (manuel, hors perimetre agent) : reverse-proxy DSM `baserow-schema.bolbol.tn` -> 3101, puis ajout du connecteur cote Claude.ai. Detail complet : common/baserow-schema-mcp.md. -## FIX -- baserow-schema-mcp : flux SSE bloque en HTTP/2 via le reverse-proxy DSM (2026-08-17) +## FIX -- baserow-schema-mcp : flux SSE bloque via le reverse-proxy DSM, resolu en HTTP 1.0 backend (2026-08-17, resolu) -Une fois la regle DSM `baserow-schema.bolbol.tn` -> 3101 creee (cert Let's Encrypt auto-provisionne OK, TLS OK), le endpoint `/mcp//sse` restait silencieusement bloque quand le client negociait HTTP/2 via ALPN (comportement par defaut de curl et probablement des clients MCP standards) -- 0 octet recu avant timeout. En forcant HTTP/1.1 (`curl --http1.1`), la reponse SSE arrive immediatement et normalement (`event: endpoint` avec session_id). Cause probable : la couche DSM (TLS + reverse-proxy) ne relaie pas correctement un flux chunked/SSE en HTTP/2 sur cette regle precise, alors que `baserow.bolbol.tn` (meme pattern de sidecar nginx, connecteur Claude.ai deja en prod) fonctionne -- ecart de configuration DSM entre les deux regles, pas cote applicatif (nginx interne identique dans les deux cas). A verifier/fixer cote DSM (desactiver HTTP/2 sur cette regle, ou aligner sur la config de baserow.bolbol.tn) si le connecteur Claude.ai echoue silencieusement a l'inscription. +Une fois la regle DSM `baserow-schema.bolbol.tn` -> 3101 creee (cert Let's Encrypt auto-provisionne OK, TLS OK), le endpoint `/mcp//sse` restait silencieusement bloque (0 octet recu avant timeout), reproduit avec plusieurs clients. **Resolu par Nabil : choisir HTTP 1.0 (pas 1.1) comme version backend dans le formulaire DSM du reverse-proxy.** Reteste apres coup avec succes sur curl (ALPN h2 par defaut) ET httpx pur HTTP/1.1 -- pas de regression cote client malgre le libelle "HTTP 1.0" trompeur (mode de proxying DSM->backend moins strict sur le chunked/keep-alive, pas une vraie retrogradation cote client). A appliquer directement sur toute future regle DSM devant un service SSE/MCP si le meme blocage silencieux apparait. Detail : common/baserow-schema-mcp.md. diff --git a/common/baserow-schema-mcp.md b/common/baserow-schema-mcp.md index 77c80cc..500c814 100644 --- a/common/baserow-schema-mcp.md +++ b/common/baserow-schema-mcp.md @@ -1,10 +1,16 @@ -**MAJ 17/08/2026** : DSM cree, endpoint accessible en HTTPS mais flux SSE bloque en HTTP/2 (voir piege n°5 en fin de fichier PROTOCOL-INFRA.md) -- fonctionne en forcant HTTP/1.1. A verifier avant test connecteur Claude.ai. +**MAJ 17/08/2026 (resolu)** : reverse-proxy DSM cree, blocage SSE initial +resolu en choisissant **HTTP 1.0** (pas 1.1) comme version backend dans le +formulaire DSM. Reteste avec succes en conditions reelles : SSE (curl h2 par +defaut ET httpx http/1.1 pur), puis les 4 outils bout-en-bout (create_table, +create_field, delete_field, delete_table) via l'URL publique. Connecteur +Claude.ai pret a etre ajoute. # baserow-schema-mcp — serveur MCP compagnon pour la gestion de schema Baserow (17/08/2026) -**Statut** : PRODUCTION (4 outils testes end-to-end). Reste une action manuelle : -reverse-proxy DSM `baserow-schema.bolbol.tn` → 3101, puis ajout du connecteur -cote Claude.ai. +**Statut** : PRODUCTION. 4 outils testes end-to-end en interne PUIS via +l'URL publique reelle (`https://baserow-schema.bolbol.tn/mcp//sse`). +Reste uniquement l'ajout du connecteur cote Claude.ai (action manuelle +Nabil, pas d'API pour ca). ## Probleme @@ -106,11 +112,25 @@ appliquee lors de la creation des tables CI-CPT 2026 : retry avec backoff CI-CPT 2026", champ `lots_couverts` juste apres `fournisseur`), resolu au 1er retry. +## Piege n°5 — reverse-proxy DSM : forcer HTTP 1.0 (pas 1.1) en version backend + +Reverse-proxy DSM cree par Nabil pour `baserow-schema.bolbol.tn` → `3101`, +cert Let's Encrypt auto-provisionne OK, TLS OK — mais flux SSE bloque +silencieusement (0 octet recu) tant que le formulaire DSM etait regle sur +HTTP 1.1 pour la connexion backend. **Fix : choisir HTTP 1.0 dans ce champ** +(pas 1.1). Une fois change, SSE fonctionne dans les deux sens observes : +client curl par defaut (ALPN h2) ET client httpx pur HTTP/1.1 — donc pas de +regression sur les clients non-h2 malgre le nom "HTTP 1.0" trompeur dans le +libelle DSM (il s'agit vraisemblablement d'un mode de proxying moins strict +sur le framing chunked/keep-alive cote DSM->backend, pas d'une vraie +retrogradation du protocole cote client). A appliquer directement sur toute +future regle DSM devant un service SSE/MCP si le meme blocage silencieux +apparait, avant de chercher plus loin. + ## Reste a faire (action manuelle Nabil) -1. Reverse-proxy DSM : `baserow-schema.bolbol.tn` → `3101` (meme manip que - `cin.bolbol.tn`/`formation.bolbol.tn`, pas d'automatisation connue depuis - le NAS/Mac pour cette etape). +1. ~~Reverse-proxy DSM : `baserow-schema.bolbol.tn` → `3101`~~ FAIT + 17/08/2026 (voir piege n°5 ci-dessus pour le reglage HTTP 1.0). 2. Ajouter le connecteur MCP personnalise cote Claude.ai avec l'URL `https://baserow-schema.bolbol.tn/mcp//sse` (TOKEN = `MCP_SECRET_TOKEN` dans `/volume1/docker/baserow-schema-mcp/.env`, non commite sur Gitea).