Alle Beiträge
MCPAI AgentsSecurityIntegration

MCP-Server mit Schreibzugriff sicher betreiben: Architektur und Praxistests

10 Min. LesezeitThomas Stermole
Editorial-Illustration in Creme und Waldgrün: Eine limettengrüne Datenkarte passiert ein schmales Gateway vor einem Datenbankspeicher.

Ein MCP-Server mit Schreibzugriff braucht serverseitig erzwungene Rechte, begrenzte Operationen und einen definierten Umgang mit unklaren Ergebnissen. Eine Bestätigung im Chat reicht dafür nicht. Besonders nach einem Timeout darf der Agent nicht einfach noch einmal schreiben: Die erste Änderung könnte bereits gespeichert sein.

Beim Ausbau meines NocoDB-MCP-Gateways habe ich diese Grenzen getrennt umgesetzt und getestet. Der dokumentierte Stand vom 13. Oktober 2026 umfasste 17 Lesetools, eine reine Schreibvorschau und fünf mutierende Tools. Ein vollständiger Create/Read/Update/Read/Delete-Test gelang mit einem neuen synthetischen Datensatz in einer isolierten Testtabelle. Für diesen Artikel habe ich außerdem die 51 zugehörigen Gateway-, Transport- und Schreibtests am 19. Oktober erneut lokal ausgeführt: alle erfolgreich, ohne Verbindung zur produktiven Datenbank.

Das ist ein Praxisbericht über einen begrenzten Integrationspfad, kein allgemeines Sicherheitszertifikat. Er richtet sich an Entwickler und IT-Verantwortliche, deren Agenten Datensätze tatsächlich verändern sollen. Eine allgemeine Einführung in MCP steht hier nicht im Mittelpunkt. Die übergreifende Bewertung von Agentenabläufen behandelt AI Agent Evaluation.

Die Architektur: Das Modell schlägt vor, das Gateway begrenzt

Das Gateway vermittelt zwischen MCP-Client und dem vorhandenen NocoDB-MCP-Endpunkt. Es bietet eng definierte Datensatzoperationen an und übersetzt sie in die tatsächlich entdeckten Upstream-Tools. Es nimmt weder frei formuliertes SQL noch beliebige Tool-Namen entgegen.

Kontrollierter Schreibpfad

  1. 01

    MCP-Client

    Wählt eine erlaubte Operation und übergibt konkrete Parameter.

  2. 02

    Gateway

    Prüft Flags, Zielschema, Feld-IDs und gegebenenfalls eine Löschfreigabe.

  3. 03

    NocoDB

    Erzwingt eigene Zugriffsrechte und Datenbankregeln. Danach liest der Client den Zustand zurück.

Vereinfachte logische Architektur. Vorschau, Ausführung und Rücklesen sind getrennte Aufrufe.

Diese Aufteilung hat eine wichtige Grenze: Das Gateway kontrolliert nur Aufrufe, die durch das Gateway gehen. Direkter Datenbankzugriff, Betriebssystemrechte und andere Integrationen liegen außerhalb dieses Schutzbereichs. Der Agent darf daher keinen alternativen Zugang erhalten, mit dem er dieselben Regeln umgehen kann.

Lese- und Schreibrechte an zwei Stellen trennen

Im Gateway sind Mutationen standardmäßig deaktiviert. Vier unabhängige Konfigurationsschalter unterscheiden allgemeines Schreiben, Löschen, Bulk-Erstellen und Bulk-Löschen. Fehlende oder abweichende Werte aktivieren nichts; nur der exakte Wert true schaltet die jeweilige Funktion ein. Lösch- und Bulk-Funktionen benötigen zusätzlich die allgemeine Schreibfreigabe.

FähigkeitGrenze im geprüften Gateway
LesenExplizite Liste bekannter Lesetools
Erstellen und AktualisierenAllgemeine Schreibfreigabe; jeweils genau ein Datensatz
Einzel-LöschenZusätzliche Löschfreigabe und explizite Bestätigung; standardmäßig administrative Einmalfreigabe
Bulk-ErstellenEigener Schalter; höchstens zehn Datensätze pro Aufruf
Bulk-LöschenEigener Schalter; höchstens zehn eindeutige IDs und zwingende zielgebundene Einmalfreigabe

Deaktivierte Schreibtools fehlen in tools/list. Das allein wäre keine belastbare Zugriffssperre: Ein Client könnte einen bekannten Tool-Namen direkt aufrufen. Deshalb prüft auch der ausführende Handler die Berechtigung. Generische Weiterleitungsaufrufe und die nativen Bulk-Mutationsformate bleiben gesperrt. Ausführende Notifications und JSON-RPC-Batches werden ebenfalls abgewiesen.

Die zweite Grenze muss im Zielsystem liegen: ein eigener, möglichst eng berechtigter Benutzer beziehungsweise Token für die benötigten Ressourcen. Die Gateway-Schalter reduzieren Fähigkeiten, verkleinern aber nicht automatisch die Rechte des Upstream-Tokens. Im dokumentierten Projektstand war dessen Ressourcenbereich noch breit; eine vollständige Least-Privilege-Umsetzung auf dieser Ebene war damit nicht nachgewiesen.

Die aktuelle NocoDB-Dokumentation zu MCP-Berechtigungen beschreibt Ressourcen- und Toolfreigaben, deren Verfügbarkeit vom Betriebsmodell und der Lizenz abhängt. Prüfe die tatsächlich installierte Fassung und ihre Discovery. Übernimm weder die Toolanzahl dieses Projekts noch die Berechtigungsoberfläche einer anderen Edition als allgemeine NocoDB-Eigenschaft.

Eine Vorschau validiert Eingaben, sie genehmigt keine Ausführung

Das separate Tool previewRecordWrite kann eine Operation prüfen, ohne Daten zu verändern. Es funktioniert auch bei deaktiviertem Schreiben. Vor jeder Ausführung werden Ziel und Felder erneut validiert; es gibt keine automatisch wirksame Freigabe durch eine frühere Vorschau.

Ein gekürzter Aufruf für ein synthetisches Beispiel sieht so aus. Alle IDs sind absichtliche Platzhalter; das Beispiel zeigt die Gateway-Schnittstelle, keinen universellen NocoDB-Request:

{
  "name": "previewRecordWrite",
  "arguments": {
    "operation": "updateRecord",
    "workspaceId": "WORKSPACE_ID",
    "baseId": "BASE_ID",
    "tableId": "TABLE_ID",
    "recordId": 42,
    "fields": { "STATUS_FIELD_ID": "reviewed" }
  }
}

Geprüft werden die Zugehörigkeit des Ziels, das aktuelle Schema und erlaubte Feldwerte. Schreibfelder werden über Feld-IDs adressiert; Titel- und ID-Kollisionen werden abgewiesen. Berechnete Felder, Systemfelder und im geprüften Datensatzpfad nicht unterstützte Typen dürfen nicht beschrieben werden.

Die Vorschau liest keine bestehenden Datensätze und reserviert keinen Zustand. Sie beweist weder tatsächliche Schreibrechte noch alle Datenbank-Constraints. Zwischen Vorschau und Ausführung kann ein anderer Prozess Daten verändern. Wer konkurrierende Bearbeitung verhindern muss, braucht zusätzlich eine vom Zielsystem atomar geprüfte Vorbedingung, etwa eine erwartete Versionsnummer. Das wurde durch die hier beschriebene Vorschau nicht implementiert.

Ein Bestätigungs-Boolean ist kein Nachweis menschlicher Zustimmung

Ein Modell kann confirmDeletion=true selbst als Argument erzeugen. Das Flag beschreibt einen expliziten Löschaufruf, beweist aber nicht, dass ein Mensch die konkreten Ziele gesehen und genehmigt hat.

Für Bulk-Löschungen verlangt das Gateway deshalb eine administrative Freigabe außerhalb des MCP-Zugangs. Sie bindet Operation, Workspace, Base, Tabelle, exakte ID-Menge und Ablaufzeit. Ein MCP-Tool kann diese Freigabe nicht selbst erstellen. Das Betriebsverfahren verlangt zusätzlich die menschliche Bestätigung für genau diese Tabelle, IDs und Anzahl.

Die Freigabedatei muss dem Gateway-Benutzer gehören, in einem geschützten Verzeichnis liegen und eng gesetzte Dateirechte besitzen. Symlinks, abgelaufene Freigaben und abweichende Zielmengen werden abgewiesen. Ein Dateilock und ein Inode-Vergleich schützen den Verbrauch gegen konkurrierende Gateway-Prozesse; vor dem Upstream-Aufruf wird die Datei atomar umbenannt.

Auch bei einem Timeout bleibt sie verbraucht. Würde die Freigabe bei einem Fehler wieder freigegeben, könnte derselbe Auftrag ein zweites Mal ausgeführt werden, obwohl die erste Löschung schon stattgefunden hat.

Für Einzel-Löschungen existiert eine ausdrücklich aktivierbare Betreiberoption, die die administrative Datei ersetzt. Sie gilt niemals für Bulk-Löschungen. Wiederholte Einzelaufrufe dürfen die Bulk-Freigabe nicht umgehen; diese Vorgabe gehört zum Betriebsverfahren. Ein kumulatives Löschbudget über mehrere Aufrufe ist hier nicht nachgewiesen. Für stärker autonome Agenten wäre eine zusätzliche serverseitige Mengen- oder Zeitgrenze sinnvoll.

Unklare Schreibantworten: erst abgleichen, dann entscheiden

Das Gateway wiederholt Mutationen nicht automatisch. Sobald der Upstream-Mutationsaufruf begonnen wurde, behandelt es einen folgenden Fehler konservativ als möglicherweise wirksam. Ein fehlgeschlagener Schema-Check vor diesem Punkt ist davon unterscheidbar.

Eine illustrative, gekürzte Fehlerantwort lautet:

{
  "isError": true,
  "structuredContent": {
    "error": {
      "code": "TIMEOUT",
      "message": "NocoDB request did not complete.",
      "outcomeUnknown": true,
      "automaticRetry": false
    }
  }
}

Das sind projektspezifische Ergebnisfelder, keine standardisierte MCP-Recovery-Schnittstelle. Die MCP-Tools-Spezifikation definiert unter anderem isError und strukturierte Ergebnisse; wie dieser Integrationspfad seinen unbekannten Ausgang behandelt, legt die Anwendung fest.

Auch eine formal erfolgreiche Upstream-Antwort wird geprüft. Bestätigt sie nicht die erwartete Anzahl von IDs, meldet das Gateway keinen Abschluss. Bei Update und Einzel-Löschen muss die bestätigte ID zum Ziel passen; bei Bulk-Löschen muss die vollständige ID-Menge übereinstimmen. Ein HTTP-Erfolg ohne diese Evidenz ist kein belastbarer Schreibnachweis.

BeobachtungNächste Aktion
Eingabeprüfung scheitert vor dem MutationsaufrufParameter oder Berechtigung klären; keine unveränderte Wiederholungsschleife
Timeout oder unvollständige Antwort nach Beginn der MutationAutomatisches Schreiben stoppen; Zielzustand abgleichen
Erwartete Werte sind beim Rücklesen vorhandenKeine erneute Mutation auslösen; beobachteten Zustand dokumentieren
Fehlender Datensatz, widersprüchliche Werte oder unvollständige LesesichtUngeklärt lassen und übergeben; keinen sicheren Fehlschlag unterstellen
Eine neue Löschung wird nach Prüfung nötigNeue konkrete Zustimmung und gegebenenfalls neue Einmalfreigabe

Für Create ist ein vorab erzeugter eindeutiger Testmarker hilfreich, weil die Antwort samt neuer ID verloren gehen kann. Eine Suche ohne Treffer reicht bei verzögerter Sichtbarkeit oder eingeschränkten Leserechten aber nicht zum sicheren Wiederholen. Für automatisches Replay wären zusätzlich belastbare Idempotenzmechanismen nötig: zum Beispiel ein vom Zielsystem eindeutig erzwungener Operationsschlüssel, atomare Ausführung und gespeicherte Ergebnisse. Solche Mechanismen wurden im geprüften Gateway nicht implementiert.

Rückleseprüfungen müssen mehr als die Anzahl vergleichen

Nach einem Create wird der erzeugte Datensatz gelesen und sein eindeutiger Marker verglichen. Nach einem Update werden die beauftragten Werte und unverändert zu erhaltende Felder geprüft. Nach dem Löschen werden die konkrete ID und der Marker auf Abwesenheit kontrolliert. Erst danach folgt der Bestandsvergleich.

Ein eigenständig ausführbares Python-Beispiel zeigt den Unterschied zwischen einem passenden Gesamtbestand und einem passenden Datensatz. Es ist ein Offline-Beispiel für die Prüfidee, kein MCP-Client und keine automatische Wiederholungslogik:

def verify_update(before, after, marker, expected_status):
    if not isinstance(before, dict) or not isinstance(after, dict):
        return "unresolved"
    if any(key not in before or key not in after
           for key in ("id", "marker", "status")):
        return "unresolved"
    if before["id"] != after["id"]:
        return "unresolved"
    if before["marker"] != marker or after["marker"] != marker:
        return "unresolved"
    if after["status"] != expected_status:
        return "unresolved"
    return "expected_state_observed"


before = {"id": 42, "marker": "synthetic-example", "status": "new"}
after = {**before, "status": "reviewed"}
assert verify_update(before, after, "synthetic-example", "reviewed") == (
    "expected_state_observed"
)
assert verify_update(before, None, "synthetic-example", "reviewed") == "unresolved"
assert verify_update(before, {**after, "id": 43},
                     "synthetic-example", "reviewed") == "unresolved"

Ein passender Rücklesezustand beweist nicht allein, welcher konkurrierende Prozess ihn hergestellt hat. Dafür wären zusätzliche Versions- oder Operationsnachweise erforderlich. Für den isolierten synthetischen Test lassen sich Identität und erwartete Werte dagegen gezielt kontrollieren.

Was die Praxistests tatsächlich belegen

Der folgende anonymisierte Auszug fasst den eigenen Testbericht vom 13. Oktober zusammen. Die Originalprotokolle und das Gateway-Repository sind privat; dieser Bericht ist keine unabhängige Prüfung und enthält keine öffentlich abrufbaren Rohdaten.

SchrittBeobachtetes Ergebnis
AusgangszustandIsolierte Testtabelle mit einem bestehenden synthetischen Datensatz
Separate Create-VorschauValidiert, keine Mutation
Create und ReadGenau ein neuer Datensatz; ID, vollständiger Marker und Ausgangsstatus stimmen
Update und ReadStatus geändert, Marker unverändert
Einzel-Delete und AbwesenheitsprüfungID nicht mehr vorhanden; gezielte Markersuche ohne Treffer
AbschlussvergleichWieder ein Datensatz; bestehender Datensatz identisch zum Ausgangszustand

Zusätzlich bestanden am 19. Oktober die 51 lokal erneut ausgeführten Mock- und Transporttests. Sie prüfen unter anderem gesperrte direkte Aufrufe, Schemaabweichungen, Feldkollisionen, ungültige Datentypen, Vorschauen ohne Mutation, falsche Antwort-IDs, Timeout ohne Retry sowie Ablauf, Dateirechte und einmaligen Verbrauch von Löschfreigaben.

Eine echte Bulk-Löschung wurde im dokumentierten Live-Test nicht ausgeführt. Die Bulk-Freigabe wurde durch automatisierte Tests und eine Live-Vorschau geprüft. Der erfolgreiche Einzel-Datensatz-Zyklus belegt außerdem keine allgemeine Sicherheit bei parallelen Änderungen, allen Feldtypen oder einem kompromittierten Betriebssystem.

Was vor dem produktiven Einsatz zusätzlich geklärt sein muss

MCP-Tool-Annotationen helfen Clients bei der Darstellung und Einordnung. Sie ersetzen keine serverseitige Zugriffskontrolle; die Schema-Referenz beschreibt sie als Hinweise. Auch ein rein lesender Zugang kann sensible Daten offenlegen. Daten aus Datensätzen sind als Inhalte zu behandeln und dürfen keine neue Schreibberechtigung begründen.

Für einen konkreten Integrationspfad würde ich zuerst das Upstream-Konto auf die wirklich benötigten Ressourcen begrenzen, direkte Umgehungswege ausschließen und einen synthetischen vollständigen Schreibzyklus samt Fehlerfällen abnehmen. Für Löschungen braucht es darüber hinaus eine geprüfte Wiederherstellungsmöglichkeit; der hier beschriebene Test enthält keinen Restore-Nachweis. Bei konkurrierenden Bearbeitern oder automatischem Replay müssen Versionsprüfung beziehungsweise Idempotenz vor der Freigabe hinzukommen.

Die grundsätzliche Trennung von minimaler technischer Identität und nativen Datenbankrechten empfiehlt auch Google Cloud für MCP-Agenten. Für die übergreifende Planung hilft meine KI-Architektur-Checkliste; die Abgrenzung zwischen lesender Wissenssuche und Rechten behandelt RAG-Berechtigungen und Security Trimming.

Einen konkreten MCP-Schreibpfad prüfen

Du möchtest einen Agenten mit CRM, Datenbank oder Fachanwendung verbinden? Für eine belastbare Integration müssen Zieloperationen, Rechte, Freigaben und Verhalten bei unklarem Ausgang zusammenpassen. Als AI Solution Architect & Hands-on AI Engineer unterstütze ich bei Architektur, Umsetzung und den Tests dieses konkreten Pfads.

MCP-Integrationsprojekt besprechen – nenne das Zielsystem, die gewünschten Änderungen und die Aktionen, die immer eine Freigabe benötigen. Wenn bereits ein Pilot läuft, kann der Einstieg auch eine Production-Readiness-Prüfung sein.

Primärquellen und Evidenz

Nächster Schritt

Klingt relevant für Ihr Unternehmen?

In einem unverbindlichen Erstgespräch klären wir in 30 Minuten, ob und wo sich der Einstieg für Sie lohnt — ehrlich und ohne Verkaufsdruck.

Erstgespräch anfragen