Un agent capable de lire votre base de données répond à des questions pour lesquelles vous ouvririez autrement un éditeur SQL. « Pourquoi les inscriptions ont-elles chuté mardi ? » « Quelles commandes sont bloquées sur pending depuis plus d’une heure ? » « Qu’y a-t-il réellement dans la table events ? » Avec une capacité de requête, le modèle répond en quelques secondes ; sans elle, il devine. L’utile, ce n’est pas le SQL — Claude Code et Cursor écrivent tous deux du SQL très bien — c’est de donner à l’agent un moyen d’exécuter une lecture sans lui confier vos identifiants. Ce passage de relais est toute la friction, et c’est ce que cet article déroule pour les deux outils.
Nous avons traité à part pourquoi coller une chaîne de connexion de base de données dans un agent est le geste qu’on ne peut pas défaire (en anglais) — l’identifiant est un accès au porteur, il peut écrire et supprimer autant que lire, et une fois passé dans le contexte d’un modèle, vous ne pouvez pas le « dé-partager ». Lisez-le pour le modèle de sécurité ; ici, nous le tenons pour acquis et faisons le branchement. En bref : le client détient l’identifiant, l’agent obtient une demande cadrée, en lecture seule par défaut.
Ce qu’il vous faut
- Termalin — l’application de bureau, le forfait Free suffit. C’est un client SSH et de bases de données doté d’un serveur MCP intégré ; c’est à ce serveur local que votre agent parlera.
- Au moins une connexion de base de données enregistrée dans le client Data de Termalin — Postgres, MySQL, SQLite, SQL Server, ClickHouse, MongoDB, Redis, et d’autres. Choisissez quelque chose sans enjeu pour le premier essai : un réplica analytique, une base de préproduction, une copie.
- Claude Code ou Cursor sur la même machine que l’app. Les outils de base de données pilotent l’application de bureau en direct, donc l’agent et l’app partagent la même machine.
Une attente à poser : pour Claude Code et Cursor, l’accès aux bases passe par le serveur MCP local en stdio, l’agent doit donc être sur la même machine que votre application de bureau déverrouillée. (Il existe aussi une voie hébergée — le serveur MCP hébergé, termal.in/mcp avec une connexion pour claude.ai, ChatGPT, Claude Code et Cursor, ou termal.in/api/v1/mcp avec une clé API, peut interroger les bases d’un serveur ajouté sans mot de passe, en s’appuyant sur la confiance locale de la base sur ce serveur, sans aucune application de bureau en cours d’exécution. Pour les connexions enregistrées dans le client Data de l’application de bureau, c’est le serveur local qu’il vous faut.)
Étape 1 — activer l’accès de l’agent aux données
C’est désactivé par défaut, et à dessein. Ouvrez Paramètres → Agent et activez « Let agents query your databases » (« Autoriser les agents à interroger vos bases de données »). Le sous-titre énonce la posture : désactivé par défaut, et reste en lecture seule à moins qu’une connexion n’accorde l’accès complet. Tant que vous ne l’activez pas, chaque outil de base de données renvoie database access for agents is off — enable it in Settings → Agent, point final.
Deux réglages par défaut méritent d’être intégrés avant d’aller plus loin :
- C’est un second consentement, en plus de l’app en fonctionnement. Activer l’accès de l’agent aux serveurs n’active pas l’accès aux bases — c’est un interrupteur à part. Rien n’est exposé tant que vous n’avez pas pris la décision.
- Chaque connexion est en lecture seule pour l’agent. Même avec l’interrupteur principal activé, chaque requête est vérifiée avant de s’exécuter. Une écriture ne passe que si vous avez élevé la politique de l’agent de cette connexion précise à l’accès complet — un choix par connexion, pas global. Laissez-la en lecture seule pour l’instant.
L’identifiant lui-même ne bouge jamais : l’hôte, le port et le mot de passe de la connexion restent dans le coffre de l’app, et l’agent n’obtient que de demander à l’app en fonctionnement d’exécuter une requête et de renvoyer des lignes. Il n’y a aucune chaîne de connexion dans un fichier de configuration que l’agent — ou une injection de prompt — pourrait lire.
Étape 2 — déclarer le serveur MCP local
Claude Code — une seule commande :
claude mcp add termalin -- <path>/termalin-mcp
Remplacez <path> par l’emplacement du binaire termalin-mcp (l’app peut vous l’indiquer). Redémarrez Claude Code et il récupère les outils.
Cursor — Cursor lit les serveurs MCP depuis un fichier JSON : .cursor/mcp.json à la racine d’un projet pour ce projet seulement, ou ~/.cursor/mcp.json pour rendre le serveur disponible partout. Pour un serveur local en stdio, l’entrée est une commande et ses arguments :
{
"mcpServers": {
"termalin": {
"command": "<path>/termalin-mcp",
"args": []
}
}
}
Le fichier global est le choix sensé — l’accès aux bases n’est pas une affaire propre à un dépôt. Redémarrez Cursor (ou rechargez la liste MCP dans ses paramètres) et confirmez que le serveur apparaît comme actif. C’est la même déclaration que celle utilisée par le tutoriel Cursor SSH et par celui de Claude Code (en anglais) — un seul serveur, qui porte désormais les outils de base de données à côté de ceux du SSH.
Étape 3 — les outils, et une vraie première tâche
Une fois le serveur déclaré et l’interrupteur activé, l’agent voit quatre outils de base de données :
data_list # your saved connections: id, name, engine, and whether the agent may write
data_tables # tables / collections / measurements for a connection, with row counts
data_schema # one table's columns: name, type, nullable, primary key
data_query # run a query in the connection's own language; default cap 200 rows
Ils reflètent la façon dont vous exploreriez une base à la main : lister ce qui est connecté, voir les tables, décrire une table, lancer la requête. data_query parle le langage de la connexion — SQL pour les moteurs relationnels et ClickHouse, Cypher pour Neo4j, une commande Redis, un collection {filter} pour MongoDB — et renvoie des lignes jusqu’à un plafond que vous pouvez relever par appel (maxRows), fixé par défaut à 200 pour qu’un agent ne tire pas accidentellement un million de lignes dans son contexte.
Posez-lui maintenant une question que vous poseriez vraiment, pas une requête de démonstration :
Selon le tableau de bord, les inscriptions ont chuté mardi. À partir de la base analytics, déterminez ce qui s’est passé.
Observez l’agent enchaîner les outils dans l’ordre :
data_list— il trouve votre connexionanalytics, voit que le moteur est Postgres, et note qu’elle est en lecture seule pour l’agent.data_tables— il liste les tables, repèresignupsetsignup_events, et lit le nombre de lignes pour savoir ce qui mérite une requête.data_schemasursignups— il apprend les colonnes (created_at,source,status, …) et sait désormais découper par jour et par source.data_query— il exécute quelque chose commeSELECT date_trunc('day', created_at) AS day, source, count(*) FROM signups WHERE created_at >= now() - interval '10 days' GROUP BY 1, 2 ORDER BY 1et relit les lignes.
Les lignes racontent l’histoire — peut-être qu’une source est tombée à zéro mardi (un lien de parrainage cassé), peut-être que le total a tenu mais que status = 'failed' a bondi (une panne de prestataire). Dans les deux cas, l’agent a formé sa requête à partir du vrai schéma, pas d’une supposition, et n’a jamais rien détenu de plus que la possibilité de demander. Si un résultat est tronqué au plafond de 200 lignes, il le signale et resserre la requête plutôt que d’en réclamer davantage.
Où sont les limites
Brièvement, car l’article sur la sécurité (en anglais) le couvre en entier — mais voici les réglages par défaut sur lesquels vous comptez :
- Lecture seule par défaut. Sur les moteurs de la famille SQL, seuls les verbes de lecture passent —
SELECT,SHOW,DESCRIBE,EXPLAIN,WITH,PRAGMA. Sur Redis, seules les commandes de lecture ; sur MongoDB, une agrégation avec$out/$mergeest bloquée ; sur Neo4j,CREATE/MERGE/DELETE/SET/DROPsont bloqués. Un modèle désorienté ou détourné obtient une lecture, pas unDROP. - Par connexion, pas global. Votre réplica analytique est une décision distincte de votre base de production primaire ; élever l’une à l’accès complet en écriture ne touche pas l’autre.
- Désactivable d’un seul interrupteur, et c’est l’app qui détient l’identifiant — rien n’a jamais été partagé, donc le désactiver ne laisse aucune copie ni aucun mot de passe à faire tourner.
Pour tout ce qui est sensible, faites les deux : pointez la connexion Data vers un réplica en lecture ou vers un rôle de base au moindre privilège et laissez l’agent en lecture seule. Le garde-fou côté client rattrape les erreurs ; les droits de la base fixent le plafond.
Notes propres à chaque outil
- Cursor demande avant chaque appel d’outil par défaut. Laissez cela actif pour les premières sessions — vous verrez chaque
data_queryavant son exécution et pourrez lire le SQL que l’agent propose. L’approbation automatique est un confort à étendre un outil à la fois :data_listetdata_schemapeuvent passer sans risque en premier,data_queryest celui à garder en manuel le plus longtemps. - Claude Code fait apparaître chaque appel d’outil en ligne avec ses arguments, de sorte que le texte de la requête est dans la transcription avant son exécution. Vous lisez le SQL de l’agent, vous ne vous fiez pas à un résumé — et chaque appel est attribué à l’agent, si bien qu’à 2 h du matin, vous pouvez distinguer « c’est lui qui a lu ça » de « c’est moi qui ai lu ça ».
Où se situe Termalin
La plupart des guides « connectez votre agent à une base de données » s’arrêtent à coller une chaîne de connexion dans un fichier de configuration, ce qui accorde discrètement à un agent le même pouvoir d’écrire et de supprimer que celui de votre app. Le client Data de Termalin renverse cela : l’app est le gardien, l’agent obtient quatre outils cadrés, pilotés à travers la fenêtre en fonctionnement, et toute la capacité est en lecture seule jusqu’à ce que vous en décidiez autrement, et désactivable d’un seul interrupteur. C’est le même principe de garde que nous appliquons à l’accès SSH pour les agents (en anglais) et à ce qu’est réellement un serveur MCP (en anglais) — une base de données n’est que la version où une mauvaise écriture se mesure en lignes. Commencez par une connexion, gardez-la en lecture seule, et posez une vraie question avant d’envisager d’élargir quoi que ce soit.
Termalin est un client SSH et de bases de données gratuit et multiplateforme, avec un serveur MCP intégré et une politique d’agent par connexion — téléchargez-le, ou lisez comment il gère les identifiants en toute sécurité.