02-ce-que-je-construis/specs/ia-mcp-http.md

MCP V1.1 — Transport HTTP Streamable (TLR-006)

Contexte : tlr-mcp v0.1.3 ne supporte que le transport stdio (mcp:serve). Pour que les instances Claude Code se connectent directement au VPS sans dépendance locale (WSL + PHP), il faut implémenter le transport HTTP Streamable (spec MCP 2025-11-25). Résultat : un .mcp.json réduit à une URL, zéro WSL.

Spec V1 stdio de référence : ia-mcp.md.


1. Architecture cible

Claude Code (.mcp.json)
  └─ url: https://mcp.telaria.dev/mcp
  └─ Authorization: Bearer <token>
          │
VPS — Apache
  └─ mcp.telaria.dev → DocumentRoot /var/www/telaria-dev/public
      └─ POST /mcp  ← JSON-RPC (rĂ©ponse JSON)
      └─ GET  /mcp  ← ouverture canal SSE (optionnel V1.1)

2. PérimÚtre tlr-mcp bundle

2.1 Nouveau contrĂŽleur McpHttpController

src/Controller/McpHttpController.php

Route POST /mcp — chemin principal :

  1. Lire Authorization: Bearer <token> → 401 si absent
  2. Valider le token : hash('sha256', $token) → lookup mcp_api_client.token_hash → 401 si invalide
  3. VĂ©rifier non rĂ©voquĂ© + scopes → 403 si insuffisant
  4. RĂ©soudre tenant/projet depuis mcp_api_client → mcp_project → mcp_tenant
  5. Parser le body JSON-RPC 2.0
  6. Dispatcher via ExecutionPipeline (mĂȘme logique que stdio)
  7. Logger dans mcp_tool_audit_log
  8. Retourner la réponse JSON-RPC (Content-Type: application/json)

Route GET /mcp — canal SSE (optionnel) :

  • Retourner Content-Type: text/event-stream avec un Ă©vĂ©nement endpoint
  • Permet aux clients MCP conformes 2025-11-25 de nĂ©gocier le mode streaming

Header MCP-Session-Id :

  • PremiĂšre requĂȘte : gĂ©nĂ©rer un UUID v4, le renvoyer dans le header MCP-Session-Id
  • RequĂȘtes suivantes : si le header est prĂ©sent, le valider (optionnel V1.1 — log seulement)

Erreurs auth standardisées :

Cas HTTP Code JSON-RPC
Token absent 401 -32001 AUTH_REQUIRED
Token invalide / révoqué 401 -32001 AUTH_REQUIRED
Scope manquant 403 -32003 FORBIDDEN_TOOL

2.2 Auto-montage dans Symfony

Route dĂ©clarĂ©e dans Resources/config/routes.xml du bundle — telaria-app l'hĂ©rite sans modification de ses propres fichiers de config.

Aucune modification de security.yaml dans telaria-app — l'auth est entiĂšrement gĂ©rĂ©e dans le contrĂŽleur (stateless).


3. Infrastructure VPS

3.1 Sous-domaine mcp.telaria.dev

Nouveau vhost Apache sur le VPS staging. À intĂ©grer dans tlr-ansible / tlr-vhosts.

<VirtualHost *:443>
    ServerName mcp.telaria.dev

    SSLEngine on
    SSLCertificateFile    /etc/letsencrypt/live/telaria.dev/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/telaria.dev/privkey.pem

    DocumentRoot /var/www/telaria-dev/public

    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php8.5-fpm.sock|fcgi://localhost"
    </FilesMatch>

    <Directory /var/www/telaria-dev/public>
        AllowOverride None
        Require all granted
        FallbackResource /index.php
    </Directory>

    ErrorLog  ${APACHE_LOG_DIR}/mcp-telaria-dev-error.log
    CustomLog ${APACHE_LOG_DIR}/mcp-telaria-dev-access.log combined
</VirtualHost>

Le sous-domaine partage le DocumentRoot de telaria.dev — mĂȘme app Symfony, Symfony dispatche sur /mcp.

3.2 DNS + Certbot

  • DNS : ajouter entrĂ©e mcp.telaria.dev → mĂȘme IP que telaria.dev
  • Certbot : Ă©tendre le certificat existant (--expand) ou obtenir un certificat dĂ©diĂ©

4. .mcp.json par instance (aprĂšs livraison)

{
  "mcpServers": {
    "tlr-mcp": {
      "url": "https://mcp.telaria.dev/mcp",
      "headers": {
        "Authorization": "Bearer <token-instance>"
      }
    }
  }
}
Instance DépÎt Token
Atlas C:/src/tlr-doc client id=1, déjà seedé sur telaria-dev
Lead Tech C:/src/telaria-app à générer aprÚs livraison
Chef C:/src/tlr-blueprint à générer aprÚs livraison

Les tokens sont émis via app:mcp:seed sur le VPS staging (cf. mcp-mise-en-service.md).


5. Tests

  • ContainerWiringTest : vĂ©rifier que McpHttpController est dans le conteneur
  • Test fonctionnel : POST /mcp avec token valide → rĂ©ponse JSON-RPC 200
  • Test fonctionnel : POST /mcp sans token → 401
  • Test fonctionnel : POST /mcp token rĂ©voquĂ© → 403

6. Hors périmÚtre V1.1

  • SSE full streaming des rĂ©sultats d'outils (rĂ©ponses synchrones suffisantes en V1.1)
  • Multi-tenant HTTP dynamique
  • Invalidation de session active (MCP-Session-Id en lecture seule)
  • DĂ©ploiement prod telaria.fr — staging d'abord, prod aprĂšs feu vert Chef

Références

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 #