ServicesÀ proposNotesContact Me contacter →
EN FR
Note

Considérations de sécurité du serveur MCP dbt

Les risques d'accorder à un assistant IA un accès CLI dbt — modification des données de production, portée des identifiants, consommation de crédits Copilot, et atténuations pratiques.

Planté
mcpdbtclaude codeaidata engineeringdata quality

Le mode local du serveur MCP dbt donne à un assistant IA un accès CLI dbt complet. C’est la proposition de valeur : “exécuter mes modèles via la conversation.” C’est aussi le risque. Des commandes comme run et build matérialisent des modèles dans votre entrepôt. Si le serveur est configuré avec des identifiants de production, l’IA peut modifier les données de production.

Ce n’est pas une préoccupation théorique. C’est le comportement par défaut. Le serveur MCP dbt exécute les commandes avec le profil et la cible que votre installation dbt utilise par défaut. Si votre profiles.yml pointe vers la production par défaut — et beaucoup le font, notamment dans les environnements où dbt Cloud gère le développement — chaque dbt run via MCP frappe la production.

Les Commandes CLI Modifient les Données

La distinction mérite d’être énoncée clairement :

  • Les outils de métadonnées (get_model_details, get_lineage, get_all_sources) sont en lecture seule. Ils lisent le manifest et le catalog. Aucune écriture dans l’entrepôt.
  • Les outils CLI (run, build, test, show, compile) s’exécutent contre l’entrepôt. compile génère seulement du SQL sans l’exécuter, mais run et build matérialisent des tables et des vues. test exécute des requêtes. show exécute du SQL arbitraire.

Quand un assistant IA appelle build, il exécute exactement la même opération que si vous tapiez dbt build dans votre terminal. Il n’y a pas de sandbox, pas de mode dry-run, pas de couche de sécurité entre l’appel d’outil MCP et la commande dbt.

Atténuations

Utiliser un Profil de Développement

L’atténuation la plus directe : configurer le serveur MCP pour utiliser une cible de développement.

Si votre profiles.yml a des cibles séparées pour dev et prod, définissez la cible appropriée dans le dbt_project.yml de votre projet ou passez-la via l’environnement du serveur MCP :

profiles.yml
my_project:
target: dev # Par défaut sur dev, pas sur prod
outputs:
dev:
type: bigquery
project: my-project-dev
dataset: dbt_dev
prod:
type: bigquery
project: my-project-prod
dataset: analytics

Quand le serveur MCP lance dbt, il récupère la cible par défaut. Si c’est dev, toutes les commandes CLI s’exécutent contre votre environnement de développement. La production reste intacte.

Désactiver le CLI pour l’Accès en Production

Pour les configurations où le serveur a besoin d’identifiants de production — pour la découverte de métadonnées et les requêtes Semantic Layer par exemple — mais ne doit pas pouvoir exécuter des commandes CLI :

{
"env": {
"DISABLE_DBT_CLI": "true",
"DBT_HOST": "cloud.getdbt.com",
"DBT_TOKEN": "your-production-token",
"DBT_PROD_ENV_ID": "12345"
}
}

Le toggle de fonctionnalité DISABLE_DBT_CLI=true supprime tous les outils CLI du serveur. L’IA peut toujours parcourir les métadonnées et interroger le Semantic Layer, mais run, build et test n’existent pas comme options. C’est la configuration recommandée pour tout serveur connecté à la production.

Ajouter des Hooks de Sécurité

Le pattern dbt Production Safety Hooks utilise les hooks PreToolUse de Claude Code pour bloquer des commandes dangereuses spécifiques avant qu’elles s’exécutent. Même si le serveur MCP a accès au CLI, un hook peut intercepter dbt run --target prod et le bloquer :

Terminal window
# Dans .claude/hooks/dbt-safety.sh
if echo "$command" | grep -q "dbt" && echo "$command" | grep -q "\-\-target.*prod"; then
if echo "$command" | grep -qE "dbt (run|build)" && ! echo "$command" | grep -qE "\-\-(select|models)"; then
echo "Bloqué : dbt run sur la production nécessite un --select explicite" >&2
exit 2
fi
fi

Les hooks constituent une couche de défense en profondeur. La défense principale est d’utiliser un profil de développement ou de désactiver le CLI. Les hooks capturent ce qui passe à travers.

Limiter la Portée du Token de Service

Si vous utilisez des identifiants dbt Cloud, suivez le principe du moindre privilège :

BesoinAccorder
Navigation de métadonnées uniquementMetadata Only
Métadonnées + métriquesMetadata Only + Semantic Layer Only
Accès complet incluant la gestion des jobsMetadata Only + Semantic Layer Only + Job Admin

Commencez par Metadata Only. Ajoutez des permissions quand le workflow l’exige, pas de manière préventive.

Consommation de Crédits Copilot

L’outil text_to_sql, s’il est activé dans votre configuration dbt Cloud, consomme des crédits dbt Copilot. Ces crédits sont spécifiques au plan et limités. Un assistant IA qui convertit libéralement du langage naturel en SQL via cet outil peut épuiser les crédits plus vite que prévu, notamment lors de sessions exploratoires où l’IA essaie plusieurs variantes de requêtes.

Surveillez votre consommation de crédits Copilot dans le dashboard dbt Cloud. Si les crédits sont une préoccupation, DISABLE_SQL=true empêche l’IA d’utiliser la fonctionnalité text-to-SQL. L’IA peut toujours utiliser l’outil show régulier pour exécuter du SQL explicite, ce qui ne consomme pas de crédits Copilot.

Complications OAuth Entreprise

Les organisations utilisant l’authentification OAuth (plutôt que des tokens de service) peuvent rencontrer des problèmes avec le MCP dbt. Le serveur nécessite des sous-domaines statiques pour l’authentification — les URI de redirection OAuth dynamiques qui changent par session ne sont pas pris en charge. Consultez votre administrateur dbt Cloud pour le format de nom d’hôte correct.

C’est principalement un problème pour les grandes entreprises avec des fournisseurs d’identité personnalisés. Si vous utilisez des tokens de service, cela ne s’applique pas.

Le Statut Expérimental

dbt Labs marque le serveur MCP comme expérimental. En pratique, cela signifie :

  • L’API des outils peut changer entre les versions. Les noms d’outils, les paramètres et les formats de réponse ne sont pas garantis stables.
  • De nouveaux outils peuvent apparaître et les existants peuvent être dépréciés sans longs cycles de dépréciation.
  • Le canal #tools-dbt-mcp dans le Slack de la communauté dbt est la source canonique des mises à jour et des changements cassants.

Le label expérimental ne signifie pas que le serveur est peu fiable — il fonctionne bien pour son objectif. Cela signifie que vous ne devriez pas construire d’automatisation fortement couplée sur des noms d’outils ou des formats de réponse spécifiques sans accepter la charge de maintenance quand les choses changent.

Une Configuration Par Défaut Sensée

Pour la plupart des data engineers individuels, la configuration de départ sécurisée est :

  1. Serveur local avec la cible de développement comme défaut
  2. Identifiants dbt Cloud pour les métadonnées et le Semantic Layer (si disponibles)
  3. Hooks de sécurité bloquant les commandes run/build ciblant la production
  4. CLI activé (car c’est là que se trouve la valeur)

Pour les déploiements en équipe avec accès à la production :

  1. Serveur local avec DISABLE_DBT_CLI=true
  2. Identifiants dbt Cloud pour les métadonnées en lecture seule et le Semantic Layer
  3. Token de service limité à Metadata Only + Semantic Layer Only
  4. Serveur séparé ciblant le développement pour les ingénieurs qui ont besoin de l’accès CLI

Cela reflète les patterns de coût et de sécurité utilisés pour l’accès MCP BigQuery — lecture seule par défaut, accès en écriture délibérément limité.