Einführung

MCP-Server lassen dich eigene Datenquellen anbinden und in Cursor verfügbar machen. Das ist besonders hilfreich, wenn du Kontext aus Quellen wie Browsern, Datenbanken oder Fehler- und Systemlogs brauchst. Das Einrichten eines MCP-Servers ist unkompliziert und mit Cursor schnell erledigt. In diesem Guide zeigen wir Schritt für Schritt, wie du einen MCP-Server für Postgres baust. Unser Ziel ist, Cursor zu ermöglichen, SQL-Abfragen direkt gegen eine Postgres-Datenbank auszuführen und Tabellenschemata strukturiert bereitzustellen.
Dieses Tutorial vermittelt die Grundlagen zum Erstellen von MCP-Servern.

Was ist ein MCP-Server?

Ein MCP-Server ist ein Prozess, der mit Cursor kommuniziert und Zugriff auf externe Daten oder Aktionen bereitstellt. Er kann auf mehrere Arten implementiert werden, aber hier verwenden wir die einfachste Methode: einen Server, der lokal auf deinem Computer über stdio (Standard-Ein-/Ausgabeströme) läuft. Das vermeidet komplizierte Sicherheitsüberlegungen und lässt uns auf die MCP-Logik selbst fokussieren. Einer der häufigsten Anwendungsfälle für MCP ist der Datenbankzugriff. Beim Erstellen von Dashboards, Ausführen von Analysen oder Erstellen von Migrationen ist es oft nötig, eine Datenbank abzufragen und zu inspizieren. Unser Postgres-MCP-Server wird zwei Kernfunktionen unterstützen: das Ausführen beliebiger Abfragen und das Auflisten von Tabellenschemata. Obwohl beide Aufgaben auch mit einfachem SQL erledigt werden könnten, bietet MCP Features, die sie leistungsfähiger und allgemein nützlicher machen. Tools bieten eine Möglichkeit, Aktionen wie das Ausführen von Abfragen bereitzustellen, während Resources es erlauben, standardisierten Kontext wie Schema-Informationen zu teilen. Später in diesem Guide schauen wir uns auch Prompts an, die fortgeschrittenere Workflows ermöglichen. Unter der Haube verlassen wir uns auf das npm-Paket postgres, um SQL-Anweisungen gegen die Datenbank auszuführen. Das MCP-SDK dient als Wrapper um diese Aufrufe und ermöglicht es uns, Postgres-Funktionalität nahtlos in Cursor zu integrieren.

So baust du den MCP-Server

Der erste Schritt beim Erstellen des Servers ist das Einrichten eines neuen Projekts. Wir starten mit dem Anlegen eines neuen Ordners und der Initialisierung eines Bun-Projekts:
> mkdir postgres-mcp-server
> Bun init
Als Nächstes wählen wir das Blank-Projekt. Sobald das Boilerplate steht, installieren wir die benötigten Dependencies. zod wird benötigt, um Schemas für I/O im MCP-SDK zu definieren.
bun add postgres @modelcontextprotocol/sdk zod
Dann holen wir uns aus den Repositories der jeweiligen Bibliotheken die Links zu den Rohinhalten der README-Dateien. Die nutzen wir als Kontext beim Aufbau des Servers. Jetzt definieren wir, wie sich der Server verhalten soll. Dazu erstellen wir eine spec.md und schreiben die High-Level-Ziele auf:
# Spec

- Allow defining DATABASE_URL through MCP env configuration
- Query postgres data through tool
  - By default, make it readonly
  - Allow write ops by setting ENV `DANGEROUSLY_ALLOW_WRITE_OPS=true|1`
- Access tables as `resources`
- Use Zod for schema definitions
Wie du siehst, ist das eine recht leichte Spec. Fühl dich frei, bei Bedarf mehr Details hinzuzufügen. Zusammen mit den README-Links bauen wir den finalen Prompt:
Read the following and follow @spec.md to understand what we want. All necesary dependeies are installed
- @https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md
- @https://raw.githubusercontent.com/porsager/postgres/refs/heads/master/README.md
Mit diesen drei Komponenten (der Spezifikation, der MCP-SDK-Dokumentation und der Postgres-Bibliotheksdokumentation) können wir Cursor nutzen, um die Serverimplementierung zu scaffolden. Cursor hilft uns, die Teile zusammenzufügen und den Code zu generieren, der das MCP-SDK mit Postgres verbindet. Nach etwas Hin und Her beim Prompting haben wir jetzt eine erste Version des MCP-Servers am Laufen. Um ihn auszuprobieren, können wir den MCP Inspector verwenden:
npx @modelcontextprotocol/inspector bun run index.ts

Testen des MCP-Servers

Sobald die erste Implementierung steht, kannst du sie mit dem MCP Inspector testen. Der Inspector zeigt dir, was der Server bereitstellt, und hilft zu überprüfen, dass Tools und Ressourcen wie erwartet funktionieren. Stell sicher, dass Abfragen ausgeführt werden können und Schema­informationen korrekt zurückgeliefert werden. MCP Inspector interface Wenn alles gut aussieht, kannst du den Server mit Cursor verbinden und ihn in einer realen Umgebung testen. Ab diesem Zeitpunkt kann Cursor den Postgres-MCP-Server so nutzen, als wäre er eine integrierte Fähigkeit, sodass du die Datenbank direkt abfragen und inspizieren kannst.

Nächste Schritte

Das lokale Ausführen des MCP-Servers über stdio ist ein guter Einstieg, aber Teams brauchen oft gemeinsamen Zugriff auf dieselbe Datenbank über ihren MCP-Server. In diesen Fällen ist es sinnvoll, den MCP-Server als zentralen HTTP-Service zu deployen. Ein bereitgestellter MCP-Server bietet mehrere Vorteile gegenüber einzelnen stdio-Instanzen:
  • Gemeinsamer Datenbankzugriff: Mehrere Teammitglieder können über Cursor dieselbe Datenbankinstanz abfragen
  • Zentrale Konfiguration: Schema-Updates und Berechtigungsänderungen werden an einem Ort verwaltet
  • Höhere Sicherheit: Saubere Authentifizierung, Rate-Limiting und Zugriffskontrollen können implementiert werden
  • Observability: Nutzungsmuster und Performance-Metriken können teamweit überwacht werden
Dafür würdest du das Transportverfahren von stdio auf HTTP umstellen. Wir behandeln zwar nicht das komplette Setup, aber hier ist ein guter Start-Prompt, den du Cursor geben kannst
Based on the existing MCP server, create a new file that implements the HTTP protocol.

Move shared logic to mcp-core, and name each transport implementation by name (mcp-server-stdio, mcp-server-http)

@https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md 
Die finalen Ergebnisse findest du hier: pg-mcp-server