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 headerAuthorization: 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
../../specs/ia-mcp.md— gouvernance, scopes, quotas, pipeline d'exécutiontlr-mcp-securite-conformite.md— tokens, OAuth 2.1, RGPD../../../03-comment-je-travaille/bdd/schema.md— schéma BDD complet (types exacts)