Connecter Claude Code à une base de données : requêtes sur de vraies données avec MCP

Connectez PostgreSQL à Claude Code via MCP, configurez un compte en lecture seule avec contrôle des permissions, et laissez Claude lire les schémas, écrire des requêtes et analyser les données directement.


Une fois la base de données connectée, Claude Code fonctionne différemment. Inutile de coller la structure des tables dans le prompt ou d'expliquer les noms des champs — Claude se connecte directement, lit le schéma lui-même, écrit les requêtes et analyse les résultats.

Cet article utilise PostgreSQL comme exemple et parcourt l'intégralité du processus, de la configuration à l'utilisation réelle.

Quel MCP Server utiliser

Le @modelcontextprotocol/server-postgres officiel prend en charge :

  • La lecture du schéma de toutes les tables (noms des champs, types, contraintes)
  • L'exécution de requêtes SQL et le renvoi des résultats
  • Les schémas multiples

Lecture seule. Ce Server est conçu uniquement pour les requêtes — il n'exécute pas INSERT, UPDATE ni DELETE.

Installation

npm install -g @modelcontextprotocol/server-postgres

Configuration

Éditez .claude/settings.json (niveau projet) :

{
  "mcpServers": {
    "db": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-postgres",
        "postgresql://readonly_user:password@localhost:5432/myapp_production"
      ]
    }
  }
}

Format de la chaîne de connexion : postgresql://USER:PASSWORD@HOST:PORT/DATABASE

Pour éviter de mettre le mot de passe dans le fichier de configuration, utilisez une variable d'environnement :

{
  "mcpServers": {
    "db": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-postgres"],
      "env": {
        "DATABASE_URL": "postgresql://readonly_user:password@localhost:5432/myapp_production"
      }
    }
  }
}

Si .claude/settings.json est versionné dans git, assurez-vous qu'il ne contient pas de mots de passe en clair. Mettez la configuration sensible dans .claude/settings.local.json et ajoutez-le au .gitignore.

Créez d'abord un compte en lecture seule

Ne donnez pas à Claude un compte avec des droits d'écriture. Créez un utilisateur en lecture seule dans PostgreSQL :

CREATE USER claude_readonly WITH PASSWORD 'your_password';
GRANT CONNECT ON DATABASE myapp_production TO claude_readonly;
GRANT USAGE ON SCHEMA public TO claude_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO claude_readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT ON TABLES TO claude_readonly;

Pour les tables que vous ne voulez pas que Claude voie (sessions, audit_logs…), ne leur accordez pas de droits, ou déplacez-les dans un schéma séparé.

Vérifier la connexion

Redémarrez Claude Code puis demandez :

Liste toutes les tables de la base de données

Si Claude renvoie une liste de tables plutôt que « je n'ai pas accès à une base de données », la connexion MCP fonctionne.

Exemples d'utilisation réelle

Scénario 1 : Comprendre la structure des données

Quelle est la relation entre les tables users et orders ?
Y a-t-il des contraintes de clé étrangère ?

Claude interroge directement information_schema et vous donne une explication claire, sans que vous ayez à coller le schéma.

Scénario 2 : Analyse de données

Parmi les utilisateurs inscrits ces 30 derniers jours,
quel pourcentage a passé au moins une commande ?
Ventilé par canal d'inscription.

Claude écrit le SQL, l'exécute et analyse les résultats. S'il y a une erreur, il la corrige lui-même.

Scénario 3 : Débogage

Trouvez les commandes avec status = 'pending' créées il y a plus de 7 jours.
Combien y en a-t-il et quand la plus récente a-t-elle été créée ?

Scénario 4 : Support au développement

Je veux ajouter une colonne last_login_at à la table users.
Écrivez le SQL de migration et vérifiez si les index actuels sont suffisants.

Contrôler ce que Claude peut voir

Contrôle par table

GRANT SELECT ON TABLE users, orders, products TO claude_readonly;

Filtrer les colonnes sensibles avec une vue

CREATE VIEW users_safe AS
  SELECT id, email, created_at, plan, status FROM users;
GRANT SELECT ON users_safe TO claude_readonly;

Connexion à une base distante

Utilisez un tunnel SSH :

ssh -L 5433:localhost:5432 [email protected] -N

Puis utilisez le port local dans la configuration.

Ce qui change en pratique

Le changement le plus notable : les conversations sur les données ne nécessitent plus de préparation. Pas de schéma à expliquer, pas de types à décrire — vous énoncez le besoin, Claude s'en occupe. Particulièrement utile pour le débogage : au lieu de requêter, copier et coller, vous décrivez le problème et Claude requête directement.