SQL MCP Server
SQL MCP Server
Ein Model Context Protocol-Server, der LLM-Agenten (Claude Desktop, Claude Code oder ein beliebiger MCP-Client) über sechs schreibgeschützte Tools Zugriff auf eine Postgres-Datenbank gibt. Setzen Sie einen Agenten darauf an und stellen Sie Fragen wie „Welche Kunden haben letzten Monat mehr als fünf Bestellungen aufgegeben?" – der Agent erkundet das Schema und fragt die Daten selbst ab, über die unten aufgeführten Tools.
Tools
Tool | Beschreibung |
| Übersicht über alle Tabellen: Name, Beschreibung, Größe, Spaltenanzahl |
| Spalten, Typen und Fremdschlüsselbeziehungen für eine Tabelle |
| Tabellen/Spalten finden, deren Name einem Schlüsselwort entspricht |
| Echte Zeilen ansehen (Standard: 5) |
| Zeilenanzahl einer Tabelle |
| Eine beliebige schreibgeschützte |
Related MCP server: mcp-data-gateway
Warum das kein „bloßer Wrapper um psycopg2" ist
Text-to-SQL-Demos sind weit verbreitet; der Teil, der wirklich schwierig ist – und auf den dieses Projekt seinen Fokus legt – ist, execute_select so sicher zu machen, dass es einem LLM übergeben werden kann, das beliebiges SQL generiert:
Schreibgeschützte Postgres-Rolle. Der Server verbindet sich als
mcp_readonly, eine Rolle mit ausschließlichSELECT-Berechtigungen (siehescripts/init_schema.sql). Selbst ein Fehler in den unten genannten Prüfungen auf Anwendungsebene kann keinen Schreibvorgang auslösen.Schreibschutz auf Sitzungsebene. Jede Verbindung führt
SET TRANSACTION READ ONLYaus (db.py).Statement-Validierung (
security.py): Es ist nur eine einzelneSELECT/WITH-Anweisung erlaubt – keine gestapelten Anweisungen (; DROP TABLE ...), keine SQL-Kommentare (blockiert kommentarbasiertes Einschleusen von Anweisungen), und eine Keyword-Blocklist decktINSERT/UPDATE/DELETE/DDL/GRANT/usw. ab, einschließlichSELECT ... INTO(das stillschweigend eine Tabelle erstellt).Bezeichner-Validierung.
describe_table,sample_rowsundcount_rowsakzeptieren einen Tabellennamen als Parameter. Da SQL-Bezeichner nicht mit Platzhaltern parametrisiert werden können, werden Tabellennamen gegen einen strengen Regex und eine live ausinformation_schemaabgerufene Whitelist geprüft – nicht nur per String-Escaping.Ressourcenlimits. Ein Postgres-
statement_timeoutverhindert, dass Abfragen außer Kontrolle geraten, und ein serverseitiges Zeilenlimit wird bei jedem Abfrageergebnis durchgesetzt, selbst wenn die Abfrage des LLMs keinLIMITangegeben hat.
Schnellstart
git clone <this-repo>
cd sql-mcp-server
pip install -r requirements.txt
# 1. Start Postgres with the sample schema
docker compose up -d
# 2. Generate sample e-commerce data (uses the postgres superuser, not mcp_readonly)
PGUSER=postgres PGPASSWORD=postgres python scripts/generate_sample_data.py
# 3. Configure the server to use the read-only role
cp .env.example .env
# edit .env if you changed the default mcp_readonly password
# 4. Run the tests
pytest
# 5. Run the server (stdio transport, for use with an MCP client)
python -m sql_mcp_server.serverVerbinden mit Claude Desktop
Fügen Sie Folgendes zu Ihrer MCP-Konfiguration von Claude Desktop hinzu (claude_desktop_config.json):
{
"mcpServers": {
"sql-explorer": {
"command": "python",
"args": ["-m", "sql_mcp_server.server"],
"cwd": "/absolute/path/to/sql-mcp-server",
"env": {
"PGHOST": "localhost",
"PGPORT": "5432",
"PGDATABASE": "sales",
"PGUSER": "mcp_readonly",
"PGPASSWORD": "change_me"
}
}
}
}Starten Sie Claude Desktop neu und fragen Sie dann etwas wie „Welche Tabellen sind verfügbar und welche Produktkategorie hat den höchsten Gesamtumsatz?"
Beispielschema
orders → order_items → products → categories, plus customers. Der Umsatz einer Bestellung = sum(order_items.quantity * order_items.unit_price). Der Generator erzeugt ~600 Kunden, ~3.500 Bestellungen und eine Handvoll absichtlicher Daten-Eigenheiten (fehlende E-Mails, ein paar Ausreißer bei Großbestellungen), damit die Abfragen den Eindruck erwecken, auf echte Daten zu treffen.
Tests
tests/test_security.py und tests/test_tools.py laufen ohne Datenbank – sie testen die Validierungsschicht direkt und die Tool-Funktionen mit gemockter DB-Schicht. Das ist es, was CI ausführt. db.py selbst (die psycopg2-Schicht) wird in der Praxis erprobt, indem der Server gegen die Docker-Postgres-Instanz ausgeführt wird; siehe Schnellstart oben.
Projektstruktur
sql_mcp_server/
config.py Environment-based settings
security.py SQL/identifier validation (the core safety logic)
db.py psycopg2 access layer
server.py MCP tool definitions
scripts/
init_schema.sql Schema + read-only role setup
generate_sample_data.py Faker-based sample data
tests/
test_security.py Validation logic (18+ cases: injection, stacked
statements, comment smuggling, DDL/DML blocking, etc.)
test_tools.py Tool functions with mocked DBThis server cannot be deployed
Maintenance
Related MCP Connectors
- dataOAuthco.thinair
PostgreSQL, MySQL, and SQL Server in one session. 26 read-only MCP tools for AI agents.
Query PostgreSQL databases in plain English — LLM-generated, safety-validated SQL.
Text-to-SQL MCP server: read-only queries on PostgreSQL, MySQL and SQL Server with your real schema
Safe, read-only Postgres and MySQL access for AI agents. Audit log + column-level controls.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables interaction with PostgreSQL databases through MCP, allowing users to explore database structures, inspect table schemas, and execute read-only SQL queries.-
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to query a PostgreSQL database through a small set of controlled, read-only tools for schema inspection, row lookup, and aggregate statistics.1MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to execute SQL queries and inspect PostgreSQL database schemas via MCP tools.-
- AlicenseNot gradedqualityDmaintenanceA read-only natural-language database agent that exposes PostgreSQL schema-discovery and SELECT tools via MCP, enabling users to query databases in plain English.MIT