03-comment-je-travaille/vps/10-mcp.md

Serveur MCP — Model Context Protocol

MCP (Model Context Protocol) est un protocole qui permet à un LLM (Claude, etc.) d'appeler des outils externes et d'accéder à des ressources contextuelles. Telaria expose son corpus documentaire via un serveur MCP.


1. RĂ´le du serveur MCP Telaria

Sans MCP, Claude ne connaît que ce qu'on lui donne dans le prompt. Avec le serveur MCP Telaria, Claude peut interroger le corpus documentaire (telaria-doc, adoption-corpus) en temps réel, via des outils formels.

Utilisateur → Claude Desktop / Cursor
                │  "Quelles sont les entités Doctrine de Telaria ?"
                â–Ľ
            Claude → appel outil MCP → list_docs / search_docs / read_doc
                │
                â–Ľ
            Serveur MCP Telaria (tlr-mcp)
                │  cherche dans l'index RAG
                â–Ľ
            Réponse contextualisée → Claude → Utilisateur

2. Le bundle tlr-mcp

Package Composer : telaria/mcp-bundle
Namespace : Telaria\Mcp\
Version courante : v0.1.3

3 outils exposés

Outil Description
list_docs Liste les documents disponibles dans le corpus (titre, path, type)
read_doc Retourne le contenu complet d'un document par son chemin
search_docs Recherche sémantique kNN dans l'index vectoriel

list_docs — authentification optionnelle

tools/list est accessible sans auth (permet aux clients MCP de découvrir les outils disponibles). Les appels aux outils eux-mêmes requièrent un token valide.


3. Authentification par token opaque

Chaque client MCP reçoit un token opaque (chaîne aléatoire). Le serveur stocke le hash SHA-512 du token, jamais le token en clair.

Génération d'un token

php bin/console app:token:generate
# Sortie :
# Token (Ă  transmettre au client) : tlr_abc123...xyz
# Hash stocké en BDD : 7f3a... (SHA-512)

Vérification à chaque requête MCP

// MCP Authenticator
$hash = hash('sha512', $tokenFromHeader);
$tenant = $this->tokenRepository->findByHash($hash);

if (!$tenant || !hash_equals($tenant->getHash(), $hash)) {
    throw new UnauthorizedHttpException('Bearer');
}

4. Quotas par tenant et par outil

Chaque tenant (client) a des quotas définis par outil, sur fenêtre glissante.

# config/packages/telaria_mcp.yaml
telaria_mcp:
    quotas:
        default:
            list_docs:   { limit: 100, window: 3600 }   # 100 appels/heure
            read_doc:    { limit: 200, window: 3600 }
            search_docs: { limit: 50,  window: 3600 }

Les quotas sont vérifiés avant chaque appel outil. Dépassement → HTTP 429 Too Many Requests avec header Retry-After.


5. Format de requĂŞte MCP (JSON-RPC 2.0)

Le serveur implémente le protocole MCP sur HTTP, en JSON-RPC 2.0.

Initialisation :

POST /mcp HTTP/1.1
Authorization: Bearer tlr_abc123...xyz
Content-Type: application/json

{
  "jsonrpc": "2.0",
  "method": "initialize",
  "params": {
    "protocolVersion": "2024-11-05",
    "clientInfo": { "name": "claude-desktop", "version": "1.0" }
  },
  "id": 1
}

Appel outil :

POST /mcp HTTP/1.1
Authorization: Bearer tlr_abc123...xyz

{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "search_docs",
    "arguments": { "query": "configuration OpenDKIM multi-NDD", "k": 5 }
  },
  "id": 2
}

6. Intégration Claude Desktop

Fichier de configuration : ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) ou %APPDATA%\Claude\claude_desktop_config.json (Windows).

{
  "mcpServers": {
    "telaria": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-fetch"],
      "env": {
        "SERVER_URL": "https://telaria.dev/mcp",
        "AUTH_TOKEN": "tlr_abc123...xyz"
      }
    }
  }
}

En pratique, Telaria utilise un serveur MCP HTTP (pas stdio). Le client doit supporter le transport HTTP — Claude Desktop le supporte depuis la version 1.x via le proxy server-fetch.


7. Intégration Cursor

Fichier : .cursor/mcp.json Ă  la racine du projet.

{
  "mcpServers": {
    "telaria": {
      "url": "https://telaria.dev/mcp",
      "headers": {
        "Authorization": "Bearer tlr_abc123...xyz"
      }
    }
  }
}

8. Le MCP comme pont entre deux corpus

Le serveur MCP Telaria peut servir deux corpus distincts avec le mĂŞme protocole :

Corpus Audience Contenu
telaria-doc Développeurs, recruteurs techniques Architecture, guides, patterns, stack
adoption-corpus Décideurs, managers, DRH Fiches pédagogiques, cas d'usage IA, méthodes

Un même client Claude peut interroger les deux via search_docs, en passant un paramètre de corpus optionnel. Un développeur qui conçoit et maintient les deux corpus : c'est le différenciateur de Telaria.


9. Déploiement

Le bundle tlr-mcp est une dépendance Composer de telaria-app. Il n'a pas de déploiement séparé.

# Vérifier que le bundle est installé
composer show telaria/mcp-bundle

# Vérifier la route MCP
php bin/console router:match /mcp
# → Tlr\Mcp\Controller\McpController::handle

# Tester l'endpoint (sans auth → liste des outils uniquement)
curl https://telaria.dev/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"tools/list","id":1}'

10. Pièges connus

Piège Symptôme Solution
instanceof avant load tools/list retourne liste vide Vérifier l'ordre d'initialisation des services
ContainerWiringTest Tests verts mais DI cassée en prod Lancer ContainerWiringTest en CI
tools/list auth requise Client ne peut pas découvrir les outils tools/list doit être optionnelle (implémenté en v0.1.3)
Quota dépassé silencieux L'outil retourne une erreur générique Vérifier Retry-After header + logs

Documentation complète — fin du cycle VPS→prod.

Voir aussi : ../guides/stack-production.md pour la carte d'identité de la stack.

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 #