Startseite / Artikel

MCP erklärt: Erstellen Sie einen PostgreSQL-Assistenten für natürliche Sprache für Claude.

MCP erläutert anhand eines Projekts: wie das Model Context Protocol N x M-Integrationen in N + M umwandelt, sodass ein nur zum Lesen geeigneter PostgreSQL-Server von Claude Desktop abgefragt werden kann.

Verlag: REACTAPP.TOP10 Min. Lesezeit2335 Wörter

Quellen: MCP Explained: The Protocol That Finally Gives AI a Standard Way to Talk to the World

Das Problem des „Glue-Code“

Irgendwann stößt jeder Entwickler, der KI-Produkte erstellt, auf dieselbe Herausforderung. Das Modell ist leistungsfähig, und es gibt nützliche Daten in einer Datenbank, einem Dateisystem oder einer API. Was fehlt, ist eine saubere, standardisierte Methode, um beides miteinander zu verbinden.

Deshalb entsteht „Glue-Code“: ein Adapter hier, ein anfälliger Wrapper dort. Dies hält so lange durch, bis sich das Modell ändert, eine weitere Datenquelle hinzukommt oder ein neuer Teammitglied die gesamte Verbindungslogik nachbauen muss.

Die Lösung von Anthropic kam im November 2024 in Form des Model Context Protocol (MCP). Innerhalb von etwa zwei Jahren entwickelte es sich von einem Nischenexperiment zu einer etablierten Infrastruktur für KI-Agenten: Bis Mitte 2026 gab es 97 Millionen SDK-Downloads pro Monat sowie fast 10.000 aktive öffentliche Server im offiziellen Register.

Betrachten wir ein Produkt, bei dem Nutzer in einfachem Englisch Fragen zu Unternehmensdaten stellen. Die Idee ist einfach, doch die Umsetzung schwierig. Das System muss die Frage interpretieren, sie in eine Datenbankabfrage umwandeln, diese ausführen, die Ergebnisse an das Modell weiterleiten und eine Antwort formatieren. Multiplizieren wir das mit allen Tools, mit denen die KI in Berührung kommen sollte – wie Kalender, GitHub-Repositorien oder Slack-Arbeitsräume –, wird jede Integration zu einer Einzelanpassung mit eigenen API-Strukturen, Authentifizierungsverfahren und Fehlerformaten.

Einige Ingenieure bezeichnen das Ergebnis als „Spaghetti-Integration“. Wenn man die Modelle mit N und die Tools mit M bezeichnet, erfordert jede Kombination eigenen Code. Fügt man ein weiteres Modell hinzu, müssen alle Tools überarbeitet werden, und jedes zusätzliche Tool bedeutet wiederum die Aktualisierung der Integrationen aller Modelle.

Was MCP ist

MCP ist ein offener Standard, der auf JSON-RPC 2.0 aufbaut, und bietet Modellen ein gemeinsames Vokabular, um auf externe Tools und Daten zuzugreifen. Die Komplexität von N × M reduziert sich auf N + M, da ein einziger Server jeden Client bedienen kann, der das Protokoll befolgt.

Die gängigste Analogie ist USB-C. Früher unterschieden sich Ladegeräte für Laptops, Handys, Kameras und Kopfhörer, wobei jedes sein eigenes Kabel benötigte. USB-C änderte den Anschluss, nicht die Elektrizität, und nun reicht ein einziges Kabel aus. MCP übernimmt diese Rolle für KI: Ein Modell, das das Protokoll verwendet, kann auf jedes Tool zugreifen, das es unterstützt, sodass ein einmal entwickelter Server mit jedem kompatiblen Modell funktioniert.

Die Governance machte 2026 zu einem Wendepunkt. Anthropic übergab MCP im Dezember 2025 an die Agentic AI Foundation, einen gezielten Fonds innerhalb der Linux Foundation, den Anthropic, Block und OpenAI gemeinsam gegründet haben, was darauf hindeutete, dass das Protokoll nicht mehr ausschließlich Anthropics Eigentum war. Es folgte öffentliche Unterstützung: Der CEO von OpenAI befürwortete es und kündigte Unterstützung über das Agents SDK sowie ChatGPT an, und Google DeepMind bestätigte innerhalb weniger Tage, dass Gemini MCP für Tools nutzen würde. Das Protokoll ist nun der Standardweg von Modellen zu externen Tools, Daten und Diensten.

Die drei Komponenten

Der Host ist die Anwendung, mit der der Benutzer tatsächlich arbeitet: Claude Desktop, eine VS Code-Erweiterung oder ein internes Chatbot.

Der MCP-Client befindet sich im Host. Er hält Verbindungen zu einem oder mehreren MCP-Servern offen und leitet Nachrichten zwischen dem Modell und diesen Servern weiter, sodass der Client die Anfrage übermittelt, wenn das Modell beschließt, ein Tool aufzurufen.

Der MCP-Server ist der Ort, an dem die Funktionalitäten vorhanden sind. Jeder Server umhüllt ein Tool oder eine Datenquelle hinter einer standardmäßigen Schnittstelle und kann drei Arten von Ressourcen anbieten:

  • Tools sind aufrufbare Funktionen wie run_sql_query, search_web oder send_email. Das Modell verwendet sie, um Aktionen auszuführen oder Daten abzurufen.
  • Ressourcen sind lesbare Daten wie Dateien, Datenbankzeilen oder Dokumente, die das Modell in sein Kontextfenster ziehen kann.
  • Prompts sind wiederverwendbare Prompt-Vorlagen, die der Server an den Host weiterleitet.

Nachrichten werden als JSON-RPC 2.0 kodiert und über einen von zwei Übertragungsmechanismen gesendet. stdio eignet sich für Server, die als lokaler Prozess auf dem Rechner des Clients laufen. Streamable HTTP richtet sich an entfernte Server und Cloud-Umgebungen und verwendet herkömmliche HTTP-Anfragen sowie gegebenenfalls Server-Sent Events (SSE) für gestreamte Antworten und Benachrichtigungen vom Server zum Client. Aufgrund dieser Trennung deckt ein Protokoll sowohl die lokale Entwicklung als auch Systeme in Produktionsumgebungen ab.

Eine Frage, Schritt für Schritt

So verläuft der Ablauf von dem Moment an, in dem ein Benutzer eine Frage eintippt, bis er eine Antwort erhält.

  1. Ein Benutzer fragt: „Wie viele Bestellungen haben wir letzte Woche erhalten?“
  2. Das Modell sieht die Frage neben der Liste der verfügbaren Tools, die beim Start vom MCP-Server abgerufen wurde.
  3. Es entscheidet, dass query_database erforderlich ist, und sendet einen strukturierten Tool-Aufruf.
  4. Der MCP-Client fängt den Aufruf ab und leitet ihn an den richtigen Server weiter.
  5. Der Server führt die Abfrage aus und gibt das Ergebnis als JSON zurück.
  6. Das Modell liest dieses Ergebnis ein und erstellt eine Antwort in Alltagssprache.

Das Modell berührt niemals die Datenbank selbst, und es benötigt den Verbindungsstring nicht im Voraus, denn der MCP-Server kümmert sich um alles davon.

Das Projekt: Eine Chat-Schnittstelle für PostgreSQL

Abgesehen von der Theorie hier etwas Konkretes: Ein Team speichert seine Bestelldaten in PostgreSQL, und nicht-technische Kollegen fragen ständig die einzige Person, die SQL kennt, um Berichte zu erhalten. Das Ziel ist eine Chat-Schnittstelle, über die sie auf Englisch fragen können und sofortige Antworten erhalten, ohne dass SQL geschrieben werden muss.

Der Plan sieht einen MCP-Server vor der PostgreSQL-Datenbank vor, der ein einziges query_database-Tool bietet und mit Claude verbunden ist. Jeder im Team kann anschließend in Alltagssprache eine Frage stellen und echte Daten erhalten.

Einrichtung

Beginnen Sie mit einem neuen Projektverzeichnis und installieren Sie die Abhängigkeiten.

mkdir nl-db-assistant
cd nl-db-assistant
npm init -y
npm install @modelcontextprotocol/sdk pg dotenv zod

Die Pakete teilen die Arbeit auf. @modelcontextprotocol/sdk ist Anthropics offizielles JavaScript- und TypeScript-Toolkit für MCP-Server, pg ist der übliche Node.js-PostgreSQL-Client, und dotenv verhindert, dass Datenbank-Zugangsdaten im Quellcode landen. zod überprüft die Schemata zur Laufzeit, und MCP nutzt es, um das JSON-Schema zu erzeugen, durch das das Modell lernt, wie es die Tools aufrufen kann.

Erstellen Sie eine .env-Datei im Projektverzeichnis, in der die Verbindungszeichenkette gespeichert wird.

DATABASE_URL=postgresql://your_user:your_password@localhost:5432/your_database

Fügen Sie umgehend .env zu .gitignore hinzu, da Anmeldeinformationen auf keinen Fall kommittiert werden dürfen.

Das Server-Skelett

Danach kommt server.js, das mit den Imports, dem Namen und der Version des Servers sowie einem Datenbankpool beginnt.

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import pg from "pg";
import dotenv from "dotenv";

dotenv.config();
// Set up the PostgreSQL connection pool
const pool = new pg.Pool({
  connectionString: process.env.DATABASE_URL,
});
// Create the MCP server instance
const server = new McpServer({
  name: "postgres-assistant",
  version: "1.0.0",
});

Der Name und die Version werden dem Client während des Funktionsverhandlungsprozesses beim Verbinden mitgeteilt. Der Verbindungspool wird einmal erstellt und für jede Abfrage wiederverwendet, was weitaus effizienter ist als jedes Mal eine neue Verbindung herzustellen.

Präsentation des Schemas

Damit das Modell nützliche Abfragen erstellen kann, muss es wissen, welche Tabellen und Spalten vorhanden sind. Das aktuelle Schema wird als lesbares MCP-Ressource bereitgestellt, die es in den Kontext aufnehmen kann.

server.resource(
  "database-schema",
  "schema://main",
  async (uri) => {
    const result = await pool.query(`
      SELECT
        table_name,
        column_name,
        data_type
      FROM information_schema.columns
      WHERE table_schema = 'public'
      ORDER BY table_name, ordinal_position
    `);

    const schema = result.rows.reduce((acc, row) => {
      if (!acc[row.table_name]) acc[row.table_name] = [];
      acc[row.table_name].push(`${row.column_name} (${row.data_type})`);
      return acc;
    }, {});
    const schemaText = Object.entries(schema)
      .map(([table, cols]) => `${table}:\n  ${cols.join("\n  ")}`)
      .join("\n\n");
    return {
      contents: [{
        uri: uri.href,
        text: schemaText,
      }],
    };
  }
);

information_schema.columns ist eine eingebaute PostgreSQL-View, die jede Tabelle und jeden Spalten beschreibt. Der Code fragt sie ab, formt die Zeilen in lesbaren Text um und gibt diesen als Ressource zurück. Das Modell liest diese Informationen, bevor es entscheidet, wie eine Abfrage formuliert werden soll, sodass es das vollständige Schema zur Verfügung hat und nicht auf Vermutungen bezüglich gültiger SQL-Abfragen angewiesen ist.

Das Abfragemittel

Das ist das Herzstück des Servers – das Werkzeug, das das Modell aufruft, um SQL-Abfragen gegen die Datenbank auszuführen.

server.tool(
  "query_database",
  "Run a read-only SQL query against the PostgreSQL database. Use this to answer questions about data, counts, trends, or summaries.",
  {
    sql: z.string().describe(
      "A valid PostgreSQL SELECT query. Only SELECT statements are allowed."
    ),
  },
  async ({ sql }) => {
    // Safety gate: only allow SELECT statements
    const trimmed = sql.trim().toUpperCase();
    if (!trimmed.startsWith("SELECT")) {
      return {
        content: [{
          type: "text",
          text: "Error: only SELECT queries are permitted through this interface.",
        }],
        isError: true,
      };
    }
    try {
      const result = await pool.query(sql);
      const output = JSON.stringify(result.rows, null, 2);
      return {
        content: [{
          type: "text",
          text: `Query returned ${result.rowCount} row(s):\n\n${output}`,
        }],
      };
    } catch (err) {
      return {
        content: [{
          type: "text",
          text: `Query failed: ${err.message}`,
        }],
        isError: true,
      };
    }
  }
);

Achten Sie besonders auf den Beschreibungsstring, das zweite Argument, denn das Modell liest ihn, um zu entscheiden, ob und wie das Tool verwendet werden soll. Schreiben Sie ihn wie Anweisungen für einen unerfahrenen Praktikanten, der die Datenbank noch nie gesehen hat. Zods Schema für den sql-Parameter wird automatisch in das JSON-Schema umgewandelt, das dem Modell zur Verfügung steht und die Struktur des Arguments festlegt. Ein Filter am Anfang akzeptiert nur SELECT-Anfragen, sodass keine Schreibvorgänge absichtlich oder versehentlich durchkommen.

Server starten

Schließlich startet der Server über den stdio-Transport.

const transport = new StdioServerTransport();
await server.connect(transport);
console.error("PostgreSQL MCP server is running");

Mit stdio startet der MCP-Client das Skript als Kindprozess und kommuniziert mit ihm über Standard-Eingabe und -Ausgabe. Es handelt sich dabei um den einfachsten und zuverlässigsten Transportweg für die lokale Entwicklung. Die Protokollierung nutzt absichtlich console.error, damit dieser den stdout-Kanal, den MCP für Protokollnachrichten verwendet, nicht verunreinigt.

Verbindung zu Claude Desktop herstellen

Öffnen Sie die Konfigurationsdatei von Claude Desktop. Unter macOS befindet sie sich hier:

~/Library/Application Support/Claude/claude_desktop_config.json

Auf Windows lautet der Pfad:

%APPDATA%\Claude\claude_desktop_config.json

Fügen Sie einen Eintrag für den neuen Server hinzu:

{
  "mcpServers": {
    "postgres-assistant": {
      "command": "node",
      "args": ["/absolute/path/to/nl-db-assistant/server.js"]
    }
  }
}

Starten Sie Claude Desktop erneut – dann erscheint ein kleines Tools-Symbol in der Benutzeroberfläche, um zu bestätigen, dass die MCP-Server verbunden und bereit sind.

Outfit ausprobieren

Übliche Formulierungen funktionieren: Wie viele Bestellungen gab es in der letzten Woche, welche Produktkategorie brachte diesen Monat den meisten Umsatz ein oder wer sind die fünf größten Kunden nach Gesamtwert der Bestellungen.

Claude liest die aktuelle Schema-Ressource, erstellt geeigneten SQL-Code, ruft query_database auf, erhält die Ergebnisse und wandelt sie in eine klare Antwort um. Nicht-technische Kollegen sehen niemals eine Abfrage, nur eine Frage und eine Antwort.

Etwa 80 Zeilen JavaScript ergeben einen Server, der jedem verbundenen Modell das aktuelle PostgreSQL-Schema anzeigt, Fragen in natürlicher Sprache in SQL umwandelt, den Zugriff auf Lesezugriff beschränkt und strukturierte Ausgaben zurückgibt, die von einem Modell zusammengefasst werden können. Er wurde nur einmal geschrieben, und jedes MCP-kompatible Modell – sei es Claude jetzt oder ein anderes morgen – kann ihn ohne Änderungen am Server verwenden. Das ist der Vorteil eines gemeinsamen Protokolls.

Adoptionszahlen

Die Adoption verlief rasant. Die monatlichen SDK-Downloads stiegen von 100.000 bei der Einführung auf 97 Millionen bis März 2026 – das sind etwa 970-mal mehr in 18 Monaten. Im Vergleich dazu dauerte es beim npm-Paket von React etwa drei Jahre, bis die monatlichen Downloads 100 Millionen erreichten.

Zu den Kunden im Produktionsumfeld gehören Block, Bloomberg, Amazon sowie Hunderte von Unternehmen aus der Fortune 500-Liste. Pinterest beschrieb im April 2026 seine Produktionsumgebung für MCP: domänenspezifische Server für Presto, Spark und Airflow, wobei ein Mensch sensible Abläufe genehmigt. Berichten zufolge sparen etwa 66.000 Tool-Aufrufe pro Monat durch 844 aktive Nutzer rund 7.000 Ingenieurstunden monatlich.

Derzeit gibt es offizielle oder von der Community gepflegte MCP-Server für Slack, GitHub, Google, Salesforce und Stripe sowie für HubSpot, Shopify, Notion, Linear, Sentry, Figma, Webflow, Cloudflare und Postman.

Das Thema des Roadmaps für 2026 ist die Unternehmensreife. Zu den wichtigsten Punkten gehören der OAuth 2.1-Anmeldemechanismus in Verbindung mit Unternehmens-Identitätsanbietern, die Koordination mehrerer Agenten, wobei ein Agent wie ein Tool-Server aufgerufen werden kann, sowie ein sorgfältig zusammengestellter Register mit überprüften Servern mit Sicherheitsbewertungen.

Häufig gestellte Fragen

Ist MCP lediglich eine Funktionsaufruf-Methode mit zusätzlichen Schritten? Nein, denn sie befinden sich in unterschiedlichen Schichten. Ein Funktionsaufruf bedeutet, dass ein Modell entscheidet, ein Tool aufzurufen, während MCP das Protokoll ist, das Modell und Tool miteinander verbindet. Der Funktionsaufruf entscheidet darüber, ob ein Tool aufgerufen werden soll, während MCP dafür sorgt, wie man darauf zugreift und mit ihm kommuniziert. Typische moderne Konfigurationen kombinieren beides.

Funktioniert es nur mit Claude? Überhaupt nicht – das ist sogar einer seiner größten Vorteile. OpenAI, Google DeepMind und Microsoft haben MCP übernommen, genauso wie Tausende von Entwicklerteams. Ein Modell mit einem MCP-kompatiblen Client kann jeden MCP-Server nutzen, unabhängig davon, wer die jeweiligen Komponenten entwickelt hat.

Ist es im Jahr 2026 produktionsreif? Für die meisten Anwendungen ja, angesichts der oben genannten umfangreichen Implementierungen. Für latenzkritische Systeme wie den Echtzeit-Handel oder Anforderungen von unter 100 Millisekunden hat die Abstraktion jedoch ihren Preis, und direkte API-Verbindungen können vorteilhaft sein im Vergleich zu solchen, die über MCP vermittelt werden.

Ist es sicher genug für den Unternehmensgebrauch? Es kommt langsam in diese Richtung. Die im März 2025 vorgenommene Spezifikationsaktualisierung führte ein umfassendes Autorisierungsframework auf Basis von OAuth 2.1 ein, und der Fahrplan für 2026 sieht die Integration von SAML und OIDC mit Identitätsanbietern wie Okta und Azure AD vor. Hochregulierte Branchen wie Finanzen oder Gesundheitswesen benötigen derzeit noch zusätzliche Konformitätsmechanismen.

Wer regelt es, und könnte Anthropic die Richtung ändern? Seit Dezember 2025 steht das Protokoll unter der Verwaltung der Agentic AI Foundation bei der Linux Foundation. Dadurch handelt es sich um eine anbieterneutrale, von der Community verwaltete gemeinsame Infrastruktur, vergleichbar mit HTTP oder TCP/IP, und kein einzelnes Unternehmen kann es einseitig umleiten.

Was unterscheidet ein Tool von einer Ressource? Ein Tool ist eine Aktion, die das Modell ausführt, wie zum Beispiel das Ausführen einer Abfrage, das Senden einer Nachricht oder das Erstellen einer Datei. Eine Ressource sind Daten, die das Modell passiv liest, wie beispielsweise eine Datei, ein Schema oder ein Dokument. Ressourcen werden in den Kontext geladen, während Tools während des Gesprächs auf Anfrage ausgeführt werden.

Kann ein Server mehrere Datenbanken oder Dienste abdecken? Ja. Ein Server kann so viele Tools und Ressourcen anbieten, wie sinnvoll ist, wobei ein häufiges Design ein Datenplattform-Server ist, der Lesezugriff auf mehrere Datenbanken bietet, wobei jede als eigenständiges Tool oder Ressource bereitgestellt wird.

Verwandte Artikel

  • Praktische Hinweise: Der neue MCP ist zustandslos – Ein Blick ins Protokoll vom 2026–07–28 — Detaillierte Anleitung zu den Praktischen Hinweisen: Der neue MCP ist zustandslos – Ein Blick ins Protokoll vom 2026–07–28: Verträge, Überprüfungen sowie Code-Blöcke für Teams, die dieses Muster einsetzen.