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 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
- FlicenseNot gradedqualityDmaintenanceEnables interaction with PostgreSQL databases through MCP, allowing users to explore database structures, inspect table schemas, and execute read-only SQL queries.
- AlicenseNot gradedqualityBmaintenanceEnables 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 gradedqualityCmaintenanceEnables AI assistants to execute SQL queries and inspect PostgreSQL database schemas via MCP tools.
- AlicenseNot gradedqualityCmaintenanceA 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
Related MCP Connectors
Query PostgreSQL databases in plain English — LLM-generated, safety-validated SQL.
Analytical memory for AI agents: a real Postgres queried in plain English over MCP. One command.
MCP server for managing Prisma Postgres.
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/Kenza-21/MCP-SQL-Server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server