02-ce-que-je-construis/bundles/tlr-mcp/tlr-mcp-validation.md

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), bundle tlr-mcp v0.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.md absent de la liste (ADN respectĂ©).
  • inputs/legacy/ absent (ADN respectĂ©).
  • Champ truncated: false correct.

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 sous 02-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 -32000 est correct mais le message ne distingue pas NOT_FOUND de INVALID_PATH. Point d'amélioration pour V2 : retourner error.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

Assistant documentaire

Posez une question sur la documentation. Les réponses citent leurs sources — un clic ouvre le document à gauche.

Loading…
Loading the web debug toolbar…
Attempt #