Ein Agent, der deine Datenbank lesen kann, beantwortet Fragen, für die du sonst einen SQL-Editor öffnen würdest. „Warum sind die Registrierungen am Dienstag eingebrochen?“ „Welche Bestellungen hängen seit über einer Stunde in pending fest?“ „Was steht eigentlich in der events-Tabelle?“ Mit einer Abfragefähigkeit antwortet das Modell in Sekunden; ohne sie rät es. Das Nützliche ist nicht das SQL – Claude Code und Cursor schreiben beide gut SQL –, sondern dem Agenten einen Weg zu geben, einen Lesevorgang auszuführen, ohne ihm deine Zugangsdaten zu übergeben. Diese Übergabe ist die ganze Reibung, und genau sie geht dieser Beitrag für beide Tools durch.
Wir haben separat darüber geschrieben, warum das Einfügen eines Datenbank-Connection-Strings in einen Agenten der Schritt ist, den du nicht rückgängig machen kannst (auf Englisch) – das Zugangsmittel ist Bearer-Zugriff, es kann lesen, aber genauso schreiben und droppen, und sobald es durch den Kontext eines Modells gelaufen ist, kannst du es nicht mehr zurücknehmen. Lies das für das Sicherheitsmodell; hier nehmen wir es als geklärt an und erledigen die Verdrahtung. Die Kurzfassung: Der Client hält das Zugangsmittel, der Agent bekommt eine begrenzte, standardmäßig nur lesende Anfrage.
Was du brauchst
- Termalin – die Desktop-App, der Free-Tarif reicht. Es ist ein SSH- und Datenbank-Client mit integriertem MCP-Server; mit diesem lokalen Server wird dein Agent sprechen.
- Mindestens eine Datenbankverbindung gespeichert in Termalins Data-Client – Postgres, MySQL, SQLite, SQL Server, ClickHouse, MongoDB, Redis und mehr. Wähl für den ersten Lauf etwas Unkritisches: eine Analytics-Replik, eine Staging-Datenbank, eine Kopie.
- Claude Code oder Cursor auf derselben Maschine wie die App. Die Datenbank-Tools steuern die laufende Desktop-App, Agent und App teilen sich also eine Kiste.
Eine Erwartung vorab: Für Claude Code und Cursor läuft der Datenbankzugriff über den lokalen stdio-MCP-Server, der Agent muss also auf derselben Maschine sein wie deine entsperrte Desktop-App. (Es gibt auch einen gehosteten Weg – der gehostete MCP-Server, termal.in/mcp mit Anmeldung für claude.ai, ChatGPT, Claude Code und Cursor, oder termal.in/api/v1/mcp mit einem API-Schlüssel, kann die Datenbanken eines angebundenen Servers passwortlos abfragen, über das lokale Datenbankvertrauen des Servers selbst, ohne laufende Desktop-App. Für die im Data-Client der Desktop-App gespeicherten Verbindungen ist der lokale Server der richtige.)
Schritt 1 – den Datenzugriff für Agenten einschalten
Das ist standardmäßig aus, und zwar bewusst. Öffne Einstellungen → Agentenzugriff (MCP) und aktiviere „Let agents query your databases.“ (Agenten deine Datenbanken abfragen lassen). Der Untertitel benennt die Haltung: standardmäßig aus und bleibt nur lesend, sofern eine Verbindung nicht vollen Zugriff gewährt. Bis du es umlegst, gibt jedes Datenbank-Tool database access for agents is off — enable it in Settings → Agent zurück, Punkt.
Zwei Voreinstellungen lohnt es sich zu verinnerlichen, bevor du weitergehst:
- Es ist ein zweites Opt-in, zusätzlich zur laufenden App. Den Agenten-Zugriff auf Server einzuschalten schaltet nicht den Datenbankzugriff ein – das ist ein eigener Schalter. Nichts wird offengelegt, bis du die Entscheidung triffst.
- Jede Verbindung ist für den Agenten nur lesend. Selbst bei eingeschaltetem Hauptschalter wird jede Abfrage geprüft, bevor sie läuft. Ein Schreibvorgang geht nur durch, wenn du die Agenten-Richtlinie dieser bestimmten Verbindung auf vollen Zugriff angehoben hast – eine Entscheidung pro Verbindung, keine globale. Lass es vorerst nur lesend.
Das Zugangsmittel selbst bewegt sich nie: Host, Port und Passwort der Verbindung bleiben im Tresor der App, und der Agent darf nur die laufende App bitten, eine Abfrage auszuführen und Zeilen zurückzugeben. Es gibt keinen Connection-String in einer Konfigurationsdatei, den der Agent – oder eine Prompt-Injection – lesen könnte.
Schritt 2 – den lokalen MCP-Server registrieren
Claude Code – ein Befehl:
claude mcp add termalin -- <path>/termalin-mcp
Ersetz <path> durch den Ort, an dem das termalin-mcp-Binary liegt (die App kann dich darauf verweisen). Starte Claude Code neu, und es übernimmt die Tools.
Cursor – Cursor liest MCP-Server aus einer JSON-Datei: .cursor/mcp.json im Wurzelverzeichnis eines Projekts nur für dieses Projekt, oder ~/.cursor/mcp.json, um den Server überall verfügbar zu machen. Für einen lokalen stdio-Server ist der Eintrag ein Befehl und seine Argumente:
{
"mcpServers": {
"termalin": {
"command": "<path>/termalin-mcp",
"args": []
}
}
}
Die globale Datei ist die sinnvolle Wahl – Datenbankzugriff ist keine Sache pro Repo. Starte Cursor neu (oder lade die MCP-Liste in seinen Einstellungen neu) und bestätige, dass der Server als laufend angezeigt wird. Das ist dieselbe Registrierung, die auch die Cursor-SSH-Anleitung und die für Claude Code (auf Englisch) nutzen – ein Server, der jetzt die Datenbank-Tools neben den SSH-Tools trägt.
Schritt 3 – die Tools und eine echte erste Aufgabe
Mit registriertem Server und eingeschaltetem Schalter sieht der Agent vier Datenbank-Tools:
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
Sie bilden nach, wie du eine Datenbank von Hand erkunden würdest: auflisten, was verbunden ist, die Tabellen ansehen, eine Tabelle beschreiben, die Abfrage ausführen. data_query spricht, was die Verbindung spricht – SQL für die relationalen Engines und ClickHouse, Cypher für Neo4j, einen Redis-Befehl, ein collection {filter} für MongoDB – und gibt Zeilen bis zu einer Obergrenze zurück, die du pro Aufruf anheben kannst (maxRows), standardmäßig 200, damit ein Agent nicht versehentlich eine Million Zeilen in seinen Kontext zieht.
Jetzt gib ihm eine Frage, die du wirklich stellen würdest, keine Demo-Abfrage:
Laut Dashboard sind die Registrierungen am Dienstag eingebrochen. Finde mit der Analytics-Datenbank heraus, was passiert ist.
Sieh zu, wie der Agent die Tools der Reihe nach durcharbeitet:
data_list– es findet deineanalytics-Verbindung, sieht, dass die Engine Postgres ist, und vermerkt, dass sie für den Agenten nur lesend ist.data_tables– es listet die Tabellen auf, entdecktsignupsundsignup_eventsund liest die Zeilenzahlen, um zu wissen, was sich zu abfragen lohnt.data_schemaaufsignups– es lernt die Spalten (created_at,source,status, …) und weiß nun, wie es nach Tag und Quelle aufteilt.data_query– es führt etwas aus wieSELECT date_trunc('day', created_at) AS day, source, count(*) FROM signups WHERE created_at >= now() - interval '10 days' GROUP BY 1, 2 ORDER BY 1und liest die Zeilen zurück.
Die Zeilen erzählen die Geschichte – vielleicht fiel eine source am Dienstag auf null (ein kaputter Empfehlungslink), vielleicht hielt die Gesamtzahl, aber status = 'failed' schoss hoch (ein Ausfall beim Anbieter). So oder so hat der Agent seine Abfrage aus dem echten Schema gebildet, nicht aus einer Vermutung, und nie mehr gehalten als die Möglichkeit zu fragen. Wenn ein Ergebnis an der 200-Zeilen-Grenze abgeschnitten wird, sagt es das und engt die Abfrage ein, statt auf mehr zu drängen.
Wo die Grenzen liegen
Kurz, weil der Sicherheitsbeitrag (auf Englisch) es vollständig abdeckt – aber die Voreinstellungen, auf die du dich verlässt:
- Standardmäßig nur lesend. Bei den Engines der SQL-Familie gehen nur Leseverben durch –
SELECT,SHOW,DESCRIBE,EXPLAIN,WITH,PRAGMA. Bei Redis nur Lesebefehle; bei MongoDB wird eine Aggregation mit$out/$mergeblockiert; bei Neo4j sindCREATE/MERGE/DELETE/SET/DROPblockiert. Ein verwirrtes oder gekapertes Modell bekommt einen Lesevorgang, keinDROP. - Pro Verbindung, nicht global. Deine Analytics-Replik ist eine andere Entscheidung als deine primäre Produktionsdatenbank; eine auf vollen Schreibzugriff anzuheben rührt die andere nicht an.
- Mit einem Schalter aus, und die App hält das Zugangsmittel – es wurde nie etwas geteilt, das Ausschalten hinterlässt also keine Kopien und kein Passwort zum Rotieren.
Für alles Sensible mach beides: Richte die Data-Verbindung auf eine Lese-Replik oder eine Datenbankrolle mit minimalen Rechten und lass den Agenten nur lesend. Das Tor auf Client-Seite fängt Fehler ab; die Datenbank-Berechtigung setzt die Obergrenze.
Tool-spezifische Hinweise
- Cursor fragt standardmäßig vor jedem Tool-Aufruf. Lass das für die ersten Sitzungen an – du siehst jede
data_query, bevor sie läuft, und kannst das SQL lesen, das der Agent vorschlägt. Die automatische Freigabe ist eine Bequemlichkeit, die man Tool für Tool ausweitet:data_listunddata_schemakann man zuerst gefahrlos durchwinken,data_querybehält man am längsten auf manuell. - Claude Code zeigt jeden Tool-Aufruf samt Argumenten inline, der Abfragetext steht also im Transkript, bevor er ausgeführt wird. Du liest das SQL des Agenten, statt einer Zusammenfassung davon zu vertrauen – und jeder Aufruf ist dem Agenten zugeordnet, sodass du um 2 Uhr nachts „das hat es gelesen“ von „das habe ich gelesen“ unterscheiden kannst.
Wo Termalin hineinpasst
Die meisten Anleitungen zum Thema „verbinde deinen Agenten mit einer Datenbank“ enden beim Einfügen eines Connection-Strings in eine Konfigurationsdatei, was einem Agenten still dieselbe Schreib-und-Drop-Macht gibt, die deine App hat. Termalins Data-Client dreht das um: Die App ist der Verwahrer, der Agent bekommt vier begrenzte Tools, gesteuert durch das laufende Fenster, und die ganze Fähigkeit ist nur lesend, bis du anders entscheidest, und mit einem einzigen Schalter aus. Es ist dieselbe Verwahr-Idee, die wir auf SSH-Zugriff für Agenten (auf Englisch) und auf was ein MCP-Server eigentlich ist (auf Englisch) anwenden – eine Datenbank ist nur die Variante, bei der ein schlechter Schreibvorgang in Zeilen gemessen wird. Fang mit einer Verbindung an, lass sie nur lesend, und frag etwas Echtes, bevor du daran denkst, irgendetwas zu erweitern.
Termalin ist ein kostenloser, plattformübergreifender SSH- und Datenbank-Client mit integriertem MCP-Server und einer Agenten-Richtlinie pro Verbindung – lade es herunter oder lies, wie es Zugangsdaten sicher verwahrt.