pgmcp
pgmcp
pgmcp ist ein schreibgeschützter PostgreSQL-Ops-/DBA-Server für das Model Context Protocol, der auf dem offiziellen modelcontextprotocol/go-sdk aufbaut. Er beantwortet die Fragen, die ein DBA während eines Vorfalls stellt – welche Anweisungen langsam sind, warum dieser Plan langsam ist, welche Indizes überflüssig sind, bei welchen Tabellen autovacuum hinterherhinkt, wer wen blockiert, wie weit der Standby zurückliegt – und er ist konstruktionsbedingt schreibgeschützt, nicht nur durch Konvention: eine dedizierte Datenbankrolle ohne Schreibrechte, eine BEGIN READ ONLY-Transaktion mit einem Statement-Timeout für jede einzelne Anweisung und ein SQL-Parser-Guard, der alles ablehnt, was nicht ein SELECT/EXPLAIN/SHOW ist, sowie jede Funktion, die innerhalb einer Read-Only-Transaktion Zustand mutieren könnte. Getestet gegen PostgreSQL 16; erfordert Version 13 oder neuer.
Installation
Claude Desktop, mit einem Klick: Laden Sie pgmcp_<version>.mcpb von Releases herunter und öffnen Sie es. Claude Desktop fragt nach einer Postgres-Verbindungszeichenfolge, bewahrt sie im Schlüsselbund des Betriebssystems auf und startet die gebündelte Binärdatei selbst – nichts im PATH, keine Konfigurationsdatei zum Bearbeiten. Ein Bundle deckt macOS (universal) und Windows (x64) ab.
Andernfalls laden Sie eine Binärdatei für Ihre Plattform von Releases herunter – darwin, linux und windows, amd64 und arm64, mit Prüfsummen.
Oder bauen Sie mit dem Go-CLI-Tool go aus dem Quellcode:
go install github.com/pascalallen/pgmcp/cmd/pgmcp@latestOder führen Sie das veröffentlichte Image aus, das distroless, nicht-root und multi-arch ist:
docker run --rm -i -e PGMCP_DATABASE_URL='postgres://…' ghcr.io/pascalallen/pgmcppgmcp ist im MCP-Registry als io.github.pascalallen/pgmcp gelistet.
Bevor Sie es mit etwas verbinden, erstellen Sie die schreibgeschützte Rolle – siehe Datenbankrolle. Sie ist die Ebene, die auch dann noch hält, wenn die anderen beiden einen Fehler haben.
Related MCP server: PostgreSQL MCP Server
Verwendung
Eine MCP-Oberfläche, zwei Transporte. Welchen Sie ausführen, ist eine Frage der Konfiguration, kein anderer Build.
Claude Code, stdio – der Client startet die Binärdatei und kommuniziert über stdin/stdout:
claude mcp add pgmcp --transport stdio \
--env PGMCP_DATABASE_URL='postgres://pgmcp:…@db.internal:5432/app?sslmode=require' \
-- pgmcpClaude Desktop, stdio – installieren Sie das .mcpb-Bundle aus Releases (siehe Installation) oder schreiben Sie dasselbe von Hand in claude_desktop_config.json:
{
"mcpServers": {
"pgmcp": {
"command": "pgmcp",
"env": {
"PGMCP_DATABASE_URL": "postgres://pgmcp:…@db.internal:5432/app?sslmode=require"
}
}
}
}HTTP – Streamable HTTP hinter einem statischen Bearer-Key für eine gemeinsame Bereitstellung. pgmcp spricht reines HTTP und terminiert TLS nie selbst; führen Sie es hinter einem Reverse-Proxy auf Loopback aus.
PGMCP_DATABASE_URL='postgres://pgmcp:…@db.internal:5432/app?sslmode=require' \
PGMCP_AUTH_MODE=static \
PGMCP_API_KEYS="$(openssl rand -hex 32)" \
pgmcp --transport http --listen 127.0.0.1:8080claude mcp add pgmcp --transport http https://pgmcp.example.com/mcp \
--header "Authorization: Bearer <key>"TLS-Terminierung, die Proxy-Einstellungen, die der Streaming-Transport benötigt, JWT-Authentifizierung gegen einen Identitätsanbieter und die Anbindung von pgmcp als benutzerdefinierter Connector für claude.ai befinden sich alle in docs/DEPLOYING.md.
Tools
Tool | Die Frage, die es beantwortet |
| Welche Anweisungen sind serverweit langsam oder teuer? Sortiert |
| Warum ist diese Anweisung langsam? Plambaum, die Knoten mit dem höchsten Eigenzeitverbrauch, Planwarnungen und ein stabiler |
| Welche Indizes kann ich löschen und welche erfüllen ihre Aufgabe nicht? Nie gescannte, doppelte, ungültige und aufgeblähte Indizes. |
| Wo hinkt autovacuum hinterher? Dead-Tuple-Anteil, letztes vacuum/analyze, Sequenzscans gegenüber Indexscans und geschätzter Bloat, pro Tabelle. |
| Warum hängt diese Abfrage? Der aktuelle Lock-Wait-Graph – wer blockiert ist, wer sie blockiert, und jeder Zyklus, der einem Deadlock entspricht. |
| Was macht der Server gerade, und wie nahe ist er an |
| Wie weit liegt der Standby zurück, und welcher Slot hält WAL zurück? Primär-/Standby-Rolle, Verzögerung pro Standby in Bytes und Millisekunden, Slots und die aktuelle WAL-Rate. |
| Ist dieser Server vernünftig konfiguriert? |
| Alles, was die anderen acht nicht abdecken. Ein schreibgeschütztes |
Jedes Tool ist mit readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false annotiert und gibt ein typisiertes Ausgabeschema zurück.
query ist das einzige Tool, das frei formuliertes SQL enthält, und es ist optional. --disable-query entfernt es vollständig aus dem Katalog – eine Bereitstellung, die nur die acht Diagnose-Tools benötigt, kann ganz ohne Ad-hoc-SQL-Oberfläche betrieben werden. --query-schemas=public,app beschränkt es stattdessen auf benannte Schemas – und begrenzt damit auch explain, da analyze=true die Anweisung ausführt; lesen Sie in docs/SECURITY.md, was das verhindert und was nicht.
Ressourcen & Prompt
Resource | Inhalt |
| Der Server-Snapshot als Ausgangspunkt: Version, Uptime, Recovery-Status, installierte Erweiterungen, Größen pro Datenbank, Cache-Trefferquote und Verbindungen im Vergleich zu |
| Die rohen |
Prompt | Argumente | Zweck |
|
| Eine vierschrittige Untersuchung: |
Konfiguration
Jede Einstellung hat ein --flag und eine Umgebungsvariable PGMCP_<KEY>. Flags haben Vorrang vor der Umgebung, die Vorrang vor dem Standardwert hat. Konfigurationsfehler beenden mit Exit-Code 2 und nennen jeden fehlerhaften Schlüssel in einer Meldung; Laufzeitfehler beenden mit Exit-Code 1.
Flag | Env | Standard | Bedeutung |
|
| — (erforderlich) | Postgres-Verbindungszeichenfolge |
|
|
|
|
|
|
| HTTP-Listen-Adresse |
|
| — | Öffentliche Origin, unter der dieser Server erreichbar ist, für OAuth-Ressourcenmetadaten |
|
|
|
|
|
| — | Durch Kommas getrennte statische API-Schlüssel, erforderlich für |
|
| — | JWK-Set-URL, erforderlich für |
|
| — | Erforderlicher |
|
| — | Erforderlicher |
|
| — | Durch Kommas getrennte OAuth-Autorisierungsserver, die per RFC 9728 bekannt gegeben werden sollen |
|
|
| Das Ad-hoc-Tool |
|
| — | Durch Kommas getrennte Schemas, die die Tools |
|
|
| Maximale Anzahl von Postgres-Verbindungen |
|
|
| Timeout pro Tool-Aufruf |
|
|
| Tool-Aufrufe pro Principal und Minute (nur HTTP) |
|
|
| Obergrenze für den strukturierten Inhalt eines Tool-Aufrufs |
|
|
|
|
|
|
|
|
|
|
|
|
| — | — | Version ausgeben und beenden |
Der Auth-Block gilt nur für den HTTP-Transport. Über stdio entscheidet das Betriebssystem, wer der Aufrufer ist: der übergeordnete Prozess, der die Binärdatei gestartet hat, und sonst niemand.
Sicherheitsmodell
Nur-Lesen auf drei unabhängige Arten. Eine dedizierte Rolle ohne Schreibberechtigung (
pg_monitorplusSELECT, und bewusst nichtpg_signal_backend);BEGIN READ ONLYmitSET LOCAL statement_timeoutundlock_timeout = '2s'wird für jede Anweisung, die der Adapter ausführt, verwendet und stets zurückgerollt; und ein Parser-Guard, denn eine Nur-Lesen-Transaktion allein stopptpg_terminate_backend,pg_read_file,pg_sleepodersetvalnicht.Die SQL-Guard setzt in erster Linie auf eine Allowlist. Eine einzelne Top-Level-Anweisung, und sie muss ein
SELECT,EXPLAINoderSHOWsein; keine verschachtelte Schreibanweisung irgendwo im Syntaxbaum; keineFOR UPDATE/FOR SHARE-Sperrklausel; keinSELECT INTO; und kein Aufruf einer verbotenen Funktion — Dateizugriff, Backup- und WAL-Kontrolle, Replikations-Slots, Advisory Locks,dblink, Sequenz-Mutation, Stats-Resets.Die Schema-Allowlist ist eine Leitplanke, keine Grenze.
--query-schemasgleicht die Schemas ab, die Tabellenreferenzen in der geparsten Anweisung qualifizieren, ohne Beachtung der Groß- und Kleinschreibung, und sie begrenzt beide Tools, die vom Aufrufer geliefertes SQL ausführen —queryundexplain, sodassexplainmitanalyze=truenicht gegen ein Schema ausgeführt werden kann, das du ausgeschlossen hast. Eine View, eine set-returning Funktion oder eineSECURITY DEFINER-Funktion innerhalb eines erlaubten Schemas kann trotzdem außerhalb davon lesen. Datenbank-Berechtigungen sind die Grenze; die Allowlist verengt nur den offensichtlichen Weg.Authentifiziert, fail-closed, über HTTP. Statische Schlüssel werden in konstanter Zeit gegen jeden gespeicherten Hash verglichen, ohne vorzeitigen Abbruch; JWTs werden gegen einen JWK-Satz mit ausschließlich asymmetrischen Algorithmen validiert (kein
alg=none, keine HMAC-Verwechslung) und mit erforderlicheniss,audundexp; und der Verifizierer hält keine Schlüssel, bis das JWKS eintrifft, sodass er geschlossen statt offen startet. Die Metadaten der geschützten Ressource aus RFC 9728 geben an, wo ein Token bezogen werden kann. Der Server weigert sich, auf einer Nicht-Loopback-Adresse mit deaktivierter Authentifizierung zu starten.Begrenzt. Rate-Limiting pro Prinzipal, ein Timeout pro Aufruf, ein Statement-Timeout und ein Lock-Timeout innerhalb der Transaktion, eine Zeilenobergrenze für das
query-Tool, eine Obergrenze für den strukturierten Inhalt eines Ergebnisses und ein 1-MiB-Limit für den Request-Body.Es wird nichts Sensibles protokolliert. Ein Tool-Aufruf protokolliert seinen Namen, seine Dauer, sein Ergebnis und die Benutzer-ID des Aufrufers — niemals Argumente, SQL-Text, Ergebniszeilen oder Fehlertext. Parse-Fehler werden als feste Phrase zurückgegeben, statt die Anweisung wiederzugeben, und die DSN wird aus Verbindungsfehlern entfernt.
Das Bedrohungsmodell, die vollständige Auflistung der Schichten und die Einschränkungen, die jede einzelne nicht abdeckt, finden sich in docs/SECURITY.md.
Tests
Führe die Testsuite mit Race-Detektor und Coverage aus:
go test -race -cover ./...Integrationstests benötigen eine Postgres-Datenbank und werden übersprungen, wenn PGMCP_TEST_DSN nicht gesetzt ist. Um sie gegen eine temporäre Postgres-Datenbank mit vorab geladenem pg_stat_statements auszuführen:
docker run -d --rm --name pg -e POSTGRES_PASSWORD=postgres -p 5544:5432 postgres:16 \
-c shared_preload_libraries=pg_stat_statements -c pg_stat_statements.track=all
docker exec pg psql -U postgres -c "CREATE EXTENSION IF NOT EXISTS pg_stat_statements"
PGMCP_TEST_DSN="postgres://postgres:postgres@localhost:5544/postgres?sslmode=disable" go test -race -cover ./...Erstelle und betrachte ein Coverage-Profil:
go test -covermode=count -coverprofile=coverage.out ./...
go tool cover -html=coverage.outFühre einen laufenden Server durch die offizielle MCP-Konformitätssuite oder mache einen Smoke-Test mit dem Inspector:
npx -y @modelcontextprotocol/conformance server --url http://127.0.0.1:8080/mcp \
--expected-failures .github/conformance-expected-failures.yaml
npx @modelcontextprotocol/inspector --cli http://127.0.0.1:8080/mcp --transport http --method tools/listMitwirken
Pull Requests sind willkommen. Für größere Änderungen öffne bitte zuerst ein Issue, um zu besprechen, was du ändern möchtest.
Bitte stelle sicher, dass die Tests entsprechend aktualisiert werden.
Lizenz
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- -licenseNot gradedqualityAmaintenanceA Model Context Protocol server that provides read-only access to PostgreSQL databases. This server enables LLMs to inspect database schemas and execute read-only queries.66,13689,405MIT
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server providing LLMs read-only access to PostgreSQL databases for inspecting schemas and executing queries.66,13627MIT
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server that provides AI assistants with secure, read-only access to PostgreSQL databases while offering comprehensive tools for schema exploration, query validation, and performance optimization.MIT
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server providing read-only access to PostgreSQL databases, enabling LLMs to inspect database schemas and execute read-only SQL queries.66,136MIT
Related MCP Connectors
Comprehensive PostgreSQL documentation and best practices, including ecosystem tools
MCP server for managing Prisma Postgres.
Query PostgreSQL databases in plain English — LLM-generated, safety-validated SQL.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/pascalallen/pgmcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server