iToverDose/Software· 14 JUNI 2026 · 16:01

Sichere SQLite-Datenbankabfragen für KI-Agenten mit MCP

Ein lesender Zugriff auf SQLite-Datenbanken ist für KI-Agenten sicherer als schreibende Operationen. Erfahren Sie, wie ein MCP-Server mit doppeltem Schutzmechanismus unbefugte Änderungen verhindert und gleichzeitig nützliche Abfragen ermöglicht.

DEV Community4 min0 Kommentare

KI-Agenten benötigen oft Zugriff auf Datenbanken, um Fragen zu beantworten oder Analysen durchzuführen. Doch ein direkter Schreibzugriff birgt Risiken: Ein falsch formulierter Befehl kann sensible Daten löschen oder verändern. Eine Lösung liegt in einem lesenden Zugriff, der nur Leseoperationen zulässt – ohne Kompromisse bei der Funktionalität.

Das Model Context Protocol (MCP) bietet eine sichere Möglichkeit, KI-Agenten wie Claude Desktop oder Cursor mit Datenbanken zu verbinden. Ein entscheidender Vorteil: Die schreibenden Operationen werden durch zwei unabhängige Schutzschichten blockiert. So bleibt die Datenintegrität gewahrt, während der Agent trotzdem nützliche Abfragen stellen kann.

Warum ein MCP-Server für SQLite-Datenbanken sinnvoll ist

MCP-Server ermöglichen es KI-Agenten, auf Tools, Ressourcen und Prompts zuzugreifen. Im Gegensatz zu direkten Datenbankverbindungen bietet MCP eine strukturierte Schnittstelle, die Sicherheitsmechanismen integrieren lässt. Besonders wichtig ist dies, wenn Agenten komplexe Abfragen ausführen sollen, ohne dabei die Datenbank zu beschädigen.

Ein lesender Zugriff reicht für viele Anwendungsfälle aus – etwa wenn ein Agent Berichte generieren oder Daten analysieren soll. Durch eine gezielte Beschränkung auf Leseoperationen wird das Risiko eines Datenverlusts minimiert, ohne die Nutzbarkeit einzuschränken.

Zwei unabhängige Schutzschichten gegen schreibende Zugriffe

Ein einzelner Sicherheitsmechanismus ist anfällig für Fehler. Deshalb setzt die Lösung auf zwei voneinander unabhängige Schutzschichten, die jeweils Fehler abfangen können.

Erste Schutzschicht: Datenbankverbindung im Nur-Lese-Modus

Die erste Schicht wird direkt auf Datenbankebene umgesetzt. Durch die Verwendung von SQLite-Befehlen wird sichergestellt, dass die Verbindung ausschließlich lesende Operationen zulässt:

import sqlite3

def verbinden(datenbankpfad: str) -> sqlite3.Connection:
    """Öffnet eine SQLite-Datenbank im Nur-Lese-Modus.
    Jeder Schreibversuch löst einen OperationalError aus."""
    verbindung = sqlite3.connect(f"file:{datenbankpfad}?mode=ro", uri=True)
    verbindung.row_factory = sqlite3.Row
    verbindung.execute("PRAGMA query_only = ON")  # Zusätzliche Absicherung
    return verbindung

Der Parameter ?mode=ro erzwingt einen lesenden Zugriff. Zusätzlich sorgt PRAGMA query_only = ON dafür, dass selbst bei fehlerhaften Abfragen keine Schreiboperationen ausgeführt werden. Jeder Versuch eines INSERT, UPDATE oder DELETE führt zu einem Fehler auf Datenbankebene.

Zweite Schutzschicht: Abfragevalidierung vor der Ausführung

Die zweite Schicht prüft eingehende SQL-Abfragen, bevor sie an die Datenbank weitergeleitet werden. Dadurch wird sichergestellt, dass nur lesende Operationen zugelassen werden:

def sichere_abfrage(abfrage: str) -> str:
    abfrage = abfrage.strip().rstrip(";").strip()
    if not abfrage:
        raise ValueError("Die Abfrage darf nicht leer sein.")
    if ";" in abfrage:
        raise ValueError("Mehrere Abfragen sind nicht erlaubt.")
    kopf = abfrage.lower()
    if not (kopf.startswith("select") or kopf.startswith("with")):
        raise ValueError("Nur lesende SELECT- oder WITH-Abfragen sind erlaubt.")
    return abfrage

Diese Validierung blockiert nicht nur schreibende Befehle, sondern verhindert auch Angriffe durch mehrzeilige Abfragen. Selbst wenn die Validierung in einer späteren Version umgangen werden sollte, bleibt die erste Schutzschicht intakt – und umgekehrt.

MCP-Server als dünne Hülle über der sicheren Logik

Der eigentliche MCP-Server fungiert als minimaler Wrapper, der die sichere Datenbanklogik mit dem MCP-Protokoll verbindet. Die Kernfunktionalität bleibt dabei vollständig getrennt und testbar:

import os
from mcp.server.fastmcp import FastMCP
from mcp_sqlite.db import verbindung, tabellen_auflisten, abfrage_ausfuehren

mcp = FastMCP("sqlite-readonly")

def datenbankpfad() -> str:
    pfad = os.environ.get("SQLITE_DB_PATH")
    if not pfad:
        raise RuntimeError("Legen Sie SQLITE_DB_PATH auf Ihre .db-Datei fest.")
    return pfad

@mcp.tool()
def tabellen_auflisten() -> list[str]:
    """Listet alle Tabellen in der Datenbank auf."""
    with verbindung(datenbankpfad()) as verb:
        return tabellen_auflisten(verb)

@mcp.tool()
def abfrage_ausfuehren(abfrage: str, max_zeilen: int = 100) -> dict:
    """Führt eine lesende SQL-Abfrage (einzelnes SELECT oder WITH) aus."""
    with verbindung(datenbankpfad()) as verb:
        return abfrage_ausfuehren(verb, abfrage, max_zeilen)

if __name__ == "__main__":
    mcp.run()  # Kommunikation über Standard-Eingabe/Ausgabe

Zusätzlich zu den Tools kann der Server auch Ressourcen (z. B. das gesamte Datenbankschema) und Prompts bereitstellen. So kann der KI-Agent die Datenbank eigenständig erkunden und passende Abfragen formulieren.

Integration in Claude Desktop

Um den MCP-Server in Claude Desktop zu nutzen, muss er in der Konfiguration eingebunden werden. Dies erfolgt über die Entwickler-Einstellungen der Anwendung:

{
  "mcpServers": {
    "sqlite-readonly": {
      "command": "python",
      "args": ["-m", "mcp_sqlite.server"],
      "cwd": "/absoluter/Pfad/zum/mcp-sqlite-server",
      "env": {
        "SQLITE_DB_PATH": "/absoluter/Pfad/zur/IhrerDatenbank.db"
      }
    }
  }
}

Nach einem Neustart von Claude Desktop kann der Agent nun Fragen wie „Zeige mir die fünf umsatzstärksten Bestellungen“ beantworten – ohne dabei die Datenbank zu verändern.

Validierung durch Tests: Sicherheit auch bei Umgehungsversuchen

Die wichtigste Prüfung betrifft nicht die Funktionalität lesender Abfragen, sondern die Sicherheit bei Schreibversuchen – selbst wenn die Abfragevalidierung umgangen wird:

def test_nur_lese_verbindung_blockiert_schreibversuche():
    with db.verbindung(_test_datenbank_erstellen()) as verb:
        try:
            verb.execute("INSERT INTO kunden (name) VALUES ('Test')")
            assert False, "Die Nur-Lese-Verbindung sollte Schreibversuche blockieren"
        except sqlite3.OperationalError:
            pass

Dieser Test bestätigt, dass selbst bei fehlerhafter Abfragevalidierung die Datenbankverbindung im Nur-Lese-Modus keine Schreiboperationen zulässt. Die Defense-in-Depth-Strategie erweist sich damit als zuverlässig.

Fazit: Minimale Rechte, maximale Sicherheit

Die Bereitstellung eines lesenden Zugriffs auf Datenbanken für KI-Agenten ist eine bewährte Methode, um Sicherheit und Funktionalität in Einklang zu bringen. Durch die Kombination aus Nur-Lese-Verbindungen und Abfragevalidierung entsteht ein robustes System, das unbefugte Änderungen verhindert. Der entwickelte MCP-Server zeigt, wie wichtig eine saubere Trennung zwischen Sicherheitslogik und Protokoll ist – damit die schützenswerten Teile auch ohne Framework getestet werden können.

Für Entwickler, die KI-Agenten mit Datenbanken verbinden möchten, bietet diese Lösung eine solide Grundlage. Sie ermöglicht es, die Vorteile von KI-gestützter Datenanalyse zu nutzen, ohne dabei Kompromisse bei der Datensicherheit einzugehen.

KI-Zusammenfassung

Learn how to build a Python MCP server providing read-only SQLite access to AI agents for safe database queries and analysis.

Kommentare

00
KOMMENTAR SCHREIBEN
ID #7AFQQ7

0 / 1200 ZEICHEN

Menschen-Check

3 + 3 = ?

Erscheint nach redaktioneller Prüfung

Moderation · Spam-Schutz aktiv

Noch keine Kommentare. Sei der erste.