Telaria MCP — Validation end-to-end (v0.1.5)
Rapport de test exécuté le 2026-06-20, depuis une session Claude Code via le transport HTTP Streamable (
mcp.telaria.dev), bundletlr-mcpv0.1.5. Référence implémentation :specs/ia-mcp.md.
Environnement
| Paramètre | Valeur |
|---|---|
| Transport | HTTP Streamable (V1.1) |
| Endpoint | mcp.telaria.dev |
| Version bundle | v0.1.5 |
| Client | Claude Code (session Atlas tlr-doc) |
| Corpus testé | telaria-doc (projet codexia) |
| Date | 2026-06-20 |
Résultats par outil
list_docs
Cas nominal — liste complète
{ "status": "ok", "documents": [...], "truncated": false }
Résultat : ✅ 152 documents retournés.
SCRATCH.mdabsent de la liste (ADN respecté).inputs/legacy/absent (ADN respecté).- Champ
truncated: falsecorrect.
Cas nominal — filtre prefix
{ "prefix": "03-comment-je-travaille/tutos/ia/" } → { "status": "ok", "documents": [10 entrées], "truncated": false }
Résultat : ✅ 10 tutos IA retournés. Le filtre est un préfixe de chemin littéral — il correspond exactement au début du champ path.
⚠️ Piège courant :
prefix: "specs/"retourne 0 résultat car les specs sont sous02-ce-que-je-construis/specs/. Toujours utiliser le chemin complet depuis la racine du projet.
Cas nominal — limit
{ "limit": 5 } → { "status": "ok", "documents": [5 entrées], "truncated": true }
Résultat : ✅ Limite respectée, truncated: true correctement positionné.
search_docs
Cas nominal — requête précise
{ "query": "serveur MCP HTTP Streamable", "k": 3 } → hits: [ { "path": "03-comment-je-travaille/tutos/ia/mcp-vps.md", "score": 0.8763 }, { "path": "03-comment-je-travaille/tutos/ia/brancher-mcp-claude-desktop-cursor.md", "score": 0.8758 }, { "path": "02-ce-que-je-construis/specs/ia-mcp.md", "score": 0.875 } ]
Résultat : ✅ Hits pertinents, scores cohérents (~0.87). Champs path, section, score, excerpt présents.
Cas nominal — domaine différent
{ "query": "déploiement multisite Apache vhost", "k": 3 } → hits: [ { "path": "03-comment-je-travaille/vps/02-stack-web.md", "score": 0.8739 }, { "path": "toc.md", "score": 0.8728 }, { "path": "03-comment-je-travaille/guides/dsn-ovh.md", "score": 0.8713 } ]
Résultat : ✅ Recherche sémantique cross-domaine fonctionnelle.
Cas nominal — requête spécialisée
{ "query": "authentification 2FA scheb Symfony", "k": 2 } → hits: [ { "path": "02-ce-que-je-construis/specs/auth-compte.md", "score": 0.8933 }, { "path": "03-comment-je-travaille/tutos/securite-token-api-symfony.md", "score": 0.8882 } ]
Résultat : ✅ Score légèrement plus élevé (~0.89) pour une requête très spécifique. Le RAG remonte bien la spec et le tuto associé.
Observation — plage de scores
Les scores observés se concentrent entre 0.87 et 0.90 pour des requêtes pertinentes. Pas de seuil de coupure configuré côté serveur en V1 : le client reçoit les k meilleurs résultats quel que soit leur score.
read_doc
Cas nominal — document existant
{ "path": "02-ce-que-je-construis/specs/ia-mcp.md" } → { "status": "ok", "path": "02-ce-que-je-construis/specs/ia-mcp.md", "title": "Lot 1 — Serveur MCP (tlr-mcp) : spécification", "content": "--- [Markdown brut complet] ---", "metadata": { "mtime": "2026-06-14T13:34:17+00:00", "content_hash": "37140acb...", "size_bytes": 23705 } }
Résultat : ✅ Markdown brut retourné, métadonnées complètes (mtime, content_hash, size_bytes).
Cas d'erreur
read_doc — chemin inputs/legacy/
{ "path": "inputs/legacy/old-doc.md" } → MCP error -32000: "Chemin interdit ou hors racine : « inputs/legacy/old-doc.md »."
Résultat : ✅ Erreur -32000 correcte. L'ADN bloque l'accès à inputs/legacy/.
read_doc — fichier inexistant
{ "path": "fichier-inexistant.md" } → MCP error -32000: "Chemin interdit ou hors racine : « fichier-inexistant.md »."
Résultat : ✅ Erreur -32000 retournée.
⚠️ Ambiguïté du message d'erreur : un fichier inexistant retourne le même message qu'un fichier interdit (
"Chemin interdit ou hors racine"). Le code d'erreur-32000est correct mais le message ne distingue pasNOT_FOUNDdeINVALID_PATH. Point d'amélioration pour V2 : retournererror.data.code = "NOT_FOUND"pour les chemins valides mais absents du corpus.
read_doc — traversée de répertoire (../)
Testé avec { "path": "../etc/passwd" } : bloqué en amont par le client Claude Code (sandboxing de sécurité). Le comportement serveur n'a pas pu être observé directement, mais la spec (§10) prévoit INVALID_PATH pour tout chemin hors racine après normalisation.
Synthèse
| Test | Résultat |
|---|---|
list_docs — liste complète (152 docs) |
âś… |
list_docs — filtre prefix chemin complet |
âś… |
list_docs — limit + truncated |
âś… |
list_docs — ADN : pas de SCRATCH.md ni inputs/legacy/ |
âś… |
search_docs — requête MCP |
âś… |
search_docs — requête Apache/VPS |
âś… |
search_docs — requête auth 2FA |
âś… |
read_doc — document existant + métadonnées |
âś… |
read_doc — inputs/legacy/ bloqué |
âś… |
read_doc — fichier inexistant → erreur -32000 |
âś… |
Conclusion : les 3 outils MCP sont opérationnels en transport HTTP Streamable. Chaîne complète validée : authentification → ADN → RAG (search_docs) → lecture brute (read_doc).
Points d'amélioration identifiés
| # | Priorité | Description |
|---|---|---|
| 1 | Basse | read_doc sur fichier inexistant : message d'erreur indistingable d'un chemin interdit — ajouter error.data.code = "NOT_FOUND" en V2 |
| 2 | Info | list_docs prefix : préfixe chemin littéral — documenter clairement dans les schemas/tutos que specs/ ≠02-ce-que-je-construis/specs/ |
Voir aussi
- Spec :
specs/ia-mcp.md - Exploitation :
tlr-mcp-exploitation.md - Intégration cliente :
tutos/ia/brancher-mcp-claude-desktop-cursor.md