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

Telaria MCP — Modèle de données et opérations


Entités

mcp_tenant — Tenant MCP

Organisation cliente. Isole projets, tokens, quotas et audits.

Colonne Type Notes
id INT AUTO_INCREMENT PK
name VARCHAR(100) UNIQUE nom de l'organisation
status VARCHAR(20) active | …

mcp_api_client — Clé d'accès d'un tenant

Le token brut n'est jamais stocké — seulement son hash SHA-256.

Colonne Type Notes
id INT AUTO_INCREMENT PK
tenant_id INT FK → mcp_tenant.id CASCADE DELETE
token_hash VARCHAR(64) UNIQUE SHA-256 du token opaque (32 bytes base64url)
scopes JSON ex. ["tool:search_docs", "project:codexia"] — wildcards tool:* / project:* supportés
rate_limit_per_minute INT défaut 60
revoked BOOL révocation immédiate sans suppression
expires_at DATETIME_IMMUTABLE nullable — null = pas d'expiration

Scopes 2D : tool:<name> (autorise un outil) ∧ project:<slug> (restreint les projets). Vérifiés avant toute exécution de tools/call.

Rotation : révoquer l'ancien client (revoked=true), créer un nouveau via app:mcp:seed.


mcp_project — Projet RAG accessible

Pointe vers un root_path sur le disque (racine des documents indexés par le cœur L0).

Colonne Type Notes
id INT AUTO_INCREMENT PK
tenant_id INT FK → mcp_tenant.id CASCADE DELETE
slug VARCHAR(100) identifiant stable du projet (ex. codexia)
root_path VARCHAR(512) chemin absolu vers le corpus RAG
status VARCHAR(20) active | …

mcp_tool_audit_log — Journal d'audit des appels

Dénormalisé délibérément : les IDs sont stockés en colonnes scalaires (pas de FK), pour conserver l'historique même si le tenant ou le client est supprimé.

Colonne Type Notes
id INT AUTO_INCREMENT PK
tenant_id INT dénormalisé — pas de FK
project_id INT nullable, dénormalisé
api_client_id INT nullable, dénormalisé
tool_name VARCHAR(100) list_docs | read_doc | search_docs
status VARCHAR(20) success | refused | error
error_code VARCHAR(50) nullable — code JSON-RPC applicatif si erreur
timestamp DATETIME_IMMUTABLE INDEX

Usage diagnostic :

-- Appels récents par outil et statut
SELECT tool_name, status, COUNT(*) as n
FROM mcp_tool_audit_log
WHERE timestamp >= NOW() - INTERVAL 7 DAY
GROUP BY tool_name, status
ORDER BY n DESC;

-- Erreurs détaillées
SELECT timestamp, tool_name, error_code, api_client_id
FROM mcp_tool_audit_log
WHERE status IN ('refused', 'error')
ORDER BY timestamp DESC
LIMIT 20;

Commandes CLI

# Seeder un tenant + projet + clé API (affiche le token brut — noter immédiatement)
php bin/console app:mcp:seed

# Variante avec options (si la commande les expose)
php bin/console app:mcp:seed --tenant=Codexia --project=codexia

Le token brut est affiché une seule fois à la création — non stocké. À noter immédiatement et à passer en variable d'environnement MCP_TOKEN (transport stdio) ou en header Authorization: Bearer <token> (Streamable HTTP).


Patterns Doctrine notables

Auto-mapping — Zéro fichier XML/YAML, zéro migration au bootstrap.

Dénormalisation d'audit — mcp_tool_audit_log utilise des colonnes scalaires plutôt que des FK : choix délibéré pour que la suppression d'un tenant n'efface pas l'historique d'audit (conformité, traçabilité).

resolve_target_entities — pas de couplage direct à App\Entity\User dans ce bundle (l'auth passe par le token MCP, pas par la session Symfony).


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 #