mcp-sqlserv
mcp-sqlserv
MCP-Server für schreibgeschützten Zugriff auf SQL-Server-Datenbanken — SQL-Injection konstruktionsbedingt ausgeschlossen, verwaltet über eine Web-Admin-UI.
Kein rohes SQL · Default Deny · 100 % Bindparameter · Vollständiges Audit
Überblick
mcp-sqlserv ermöglicht KI-Agenten (Claude, Cursor, Claude Code, beliebige MCP-Clients), SQL-Server-Datenbanken sicher und kontrolliert zu lesen:
Alle Abfragen werden vom Server strukturiert aufgebaut – die KI schreibt niemals rohes SQL.
Bezeichner (Tabellen/Spalten) werden gegen die tatsächlichen Datenbank-Metadaten validiert (
sys.tables,sys.columns).Werte sind immer Bindparameter → SQL-Injection ist konstruktionsbedingt unmöglich.
Berechtigungen sind pro Tabelle Default Deny: Ohne explizite Berechtigung kann eine Tabelle nicht angefasst werden.
Jede Anfrage wird im Audit-Log erfasst, inklusive Schlüssel, Tool, Filter, Zeilenzahl und Dauer.
Related MCP server: safedb-mcp
Funktionen
Merkmal | Beschreibung |
MCP Streamable HTTP | Endpoint |
Multi-Projekt | URL pro Projekt |
API-Key | Schlüssel pro KI-Anwendung erstellen / widerrufen |
OAuth 2.1 | Authorization Code + PKCE, DCR (RFC 7591), Refresh Rotation, Revoke |
SQL-Server-Verbindung | Host/Port/Benutzer/Passwort (verschlüsselt mit AES-256-GCM), TLS optional |
Granulare Berechtigung | Pro Tabelle: Daten lesen und/oder Metadaten ansehen. Standard = DENY |
Audit-Log | Alle KI-Anfragen werden protokolliert: Key, Tool, Tabelle, Filter, Zeilen, Dauer, Status |
Rate-Limit | 60 Anfragen pro Minute und API-Key (konfigurierbar) |
Vollständiger-Read-Only | Tools erzeugen ausschließlich |
Agent-Test | Chatten Sie direkt mit einem Gemini-Modell aus der Web-UI für End-to-End-Tests |
Architektur
┌──────────────┐ HTTPS ┌─────────────┐ ┌──────────────────────────────┐
│ AI Agent ├───────────►│ nginx ├─────────►│ mcp-sqlserv (Docker) │
│ (MCP client)│ Bearer │ reverse │ app-net │ Express + MCP + OAuth │
└──────────────┘ token │ proxy+SSL │ work │ │ │ │
└─────────────┘ │ ▼ ▼ │
┌──────────────┐ HTTPS │ SQLite mssql pool │
│ Web Admin UI ├─────────────────────────────────────►│ (data/, keys, │ │
│ (browser) │ REST /api/* │ audit, izin) ▼ │
└──────────────┘ │ ┌──────────┐ │
│ │ SQL Srvr │ │
└──────────────┴──────────┴────┘Quick Start
# 1. Clone & siapkan environment
git clone https://github.com/<username>/mcp-sqlserv.git
cd mcp-sqlserv
cp .env.example .env # isi ADMIN_USER / ADMIN_PASSWORD (min 8 karakter)
# 2. Build & jalankan
docker compose up -d --build
# 3. Verifikasi
curl http://localhost:4000/healthzDer Server läuft unter http://localhost:4000 – Web-Admin-UI unter /, MCP-Endpoint mit /mcp.
Umgebungsvariablen
Variable | Soll | Beschreibung |
|
| Server-Port |
|
| SQLite-Ordner (bei Compose als Volume eingehängt) |
|
| Benutzer für die Web-Admin-UI |
| Plicht | Passwort für die Web-Admin-UI (mindestens 8 Zeichen) |
| automatisch | JWT-/Verschlüsselungs-Secret (auto-generiert & persistent, falls leer) |
|
| Ablaufzeit für SQL-Abfragen |
|
| Zulässige Anfragen pro API-Key und Minute |
|
| Deaktivieren mit |
|
| TTL des Autorisierungscodes (Sekunden) |
|
| TTL des Access-Tokens (Sekunden) |
|
| TTL des Refresh-Tokens (Sekunden, 30 Tage) |
Verwendung
In der Web-UI anmelden → Menü DB-Verbindung → Host/Port/Benutzer/Passwort/Datenbank eintragen + Testverbindung.
Für Docker-Container ist der SQL Server des Hosts über
host.docker.internalerreichbar.Menü mit API-Keys → Schlüssel erstellen (wird einmal angezeigt, unbedingt speichern!).
Menü Tabellenberechtigungen → Tabellen auswählen, welche die KI lesen darf → Berechtigungen speichern. Standard ist: verweigert.
KI-Agent mit
https://<domain>/mcpverbinden + HeaderAuthorization: Bearer <api-key>.
Generischen MCP-Client verbinden
{
"mcpServers": {
"sql-server": {
"url": "https://<domain>/mcp",
"headers": { "Authorization": "Bearer sk-xxxx" }
}
}
}Schneller Test mit curl:
curl -X POST https://<domain>/mcp \
-H "Authorization: Bearer sk-xxxx" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"curl","version":"1.0"}}}'Claude Custom Connector (claude.ai / Desktop)
Öffne Customize → Connectors → Add custom connector.
Remote MCP server URL:
url: KürzelAlternativ:https://<domain>/mcp.Unter Advanced settings → OAuth Client ID + Secret aus dem Menü OAuth Clients eintragen (Redirect-URI:
https://claude.ai/api/mcp/auth_callback).Kann leer bleiben – Claude registriert selbst per Dynamic Client Registration (RFC 7591).
Klicke D – Hafe → Add → Connect – der Browser öffnet die Betreiber-Anmeldeseite → Zugriff erlauben.
Claude speichert das Refresh-Token und ruft die MCP-Tools mit einem Bearer-Token ab.
Claude Code ist (CLI):
claude mcp add mcp-sqlserv https://<domain>/mcp --transport http \
... # bila client pre-registered: --client-id <id> --client-secret --callback-portOAuth-Endpunkte
Endpoint | Standard |
| RFC 9728 |
| RFC 8414 |
| RFC 7591 (DCR, public + confidential) |
| RFC 6749 + PKCE S256 |
| RFC 6749 / 7636 |
| RFC 7009 |
Die OAuth-Identität entspricht der Betreiber-Sitzung. Keine Access-Tokens sind an den internen API-Key oauth:<client_id> gebunden – alle Berechtigungen, Ratelimit und das Audit gelten darüber hinaus auch für Claude-Verbindungenstrated. Clients werden alle zugehörigen sofort aktualisiert.
MCP-Tools
Werkzeug | Funktion |
| Listet die erlaubten Tabellen + ungefähre Zeilenanzahl |
| Spalten, Typen, Nullability, Identity, Primärschlüssel, Indizes |
| Zeilen mit Struktur-Filter, Sortierung, Seitenzahl lesen |
| Zeilen mit optionalem Filter zählen |
| Daten aus per 1 Zeile über den Primärschlüssel holen |
| Server- / Datenbank- Informationen |
Tabellennamen müssen ohne Schema-Präfix angegeben werden (users, nicht dbo.users). Spaltenanzahl werden gegen sys.columns überprüft; die Werte sind zu 100 % Bind-Parameter.
Unterstützte strukturierte Filter: eq, neq, lt, lte, gt, gte, like, startsWith, ndc, endsWith, in, interval, isNull, isNotNull.
Sicherheit
Kein rohes SQL von KI– nur strukturierter Query-Builder
Identifier-Allowlist – Regex plus Validierung gegen echte DB-Metadata
Default Deny – Tabellen ohne Berechtigung können nicht zugreifen
Moderate Grenzen – max. 1000 ZeilenAufruf, 20 Filter, 50 IN-Werte, Timeout 30 s
API Key + Grenzrate – pro Key + Audit-Log aller Aufrufe
Nur-Lesen – Empfehlung: SQL-Server-Benutzer nur mit
GRANT SELECTDiesel-Passwort ist mit AES-256-GCM verschlüsselt in in SQLite gespeichert
Deployment
Einsatz mit Docker Compose im Netzwerk app-network zusammen mit nginx als Reverse-Proxy (Wildcard-SSL, nicht gepufferte SSE, CORS für Web-MCP-Clients).
Migration zwischen VPS
Karabiner und Docker funktionieren automatisch auf jede VPS; Spiele jedoch Folgendes sind nicht in Git (im .gitignore) und müssen manuell umgezogen werden:
Übertragen | Inhalt | Vorgehensweise |
| Admin-Zugangsdaten & Secrets | Dateicopied einen VPS alt übernehmen, oder erstelle neue aus |
| SQLite (API-Keys, Berechtigungen, Audit-Log, DB-Verbindungen) |
|
# Di VPS baru
git clone https://github.com/<username>/mcp-sqlserv.git && cd mcp-sqlserv
# Migrasi state dari VPS lama (opsional)
rsync -av vps-lama:/path/mcp-sqlserv/.env .env
rsync -av vps-lama:/path/mcp-sqlserv/data ./data
# Network eksternal harus ada dulu (dipakai docker-compose.yaml)
docker network create app-network # abaikan jika sudah ada
docker compose up -d --buildOhne Migration von
data/läuft ein Server weiter – nur zuvor müssen DB-Verbindung, API-Keys und Tabellenberechtigungen und die WebUI neu eingerichtet werden.
Projektstruktur
mcp-sqlserv/
├── src/
│ ├── index.ts # Bootstrap Express + routing
│ ├── config.ts # Env config
│ ├── db/storage.ts # SQLite: api_keys, db_config, permissions, audit_log
│ ├── sqlserver/ # Connection pool, metadata (sys.tables), query builder
│ ├── mcp/ # MCP server (per-session) + tools
│ ├── oauth/ # OAuth 2.1: router, PKCE, discovery
│ ├── api/ # REST admin (auth, config, keys, permissions, audit)
│ └── ui/ # SPA vanilla JS (public/)
├── public/ # Web UI admin (tanpa build step)
├── test/ # Test suite keamanan + OAuth + smoke
├── Dockerfile # Multi-stage build (node:20-alpine)
├── docker-compose.yaml # Attach ke app-network, host.docker.internal
└── LICENSE # MITAdmin REST API
Methode | Pfad | Beschreibung |
POST |
| Admin-Login (httpOnly-Cookie) |
GET |
| Status von DB, Keys, Berechtigungen |
GET/PUT |
| DB-Konfiguration lesen / speichern |
POST |
| Verbindung testen |
GET/POST |
| API-Keys auflisten / neu erzeugen |
PUT/DELETE |
| Umbenennen / widerrufen |
GET/LESS |
| Tabellenberechtigungen anzeigen / speichern |
GET |
| Zugriffsprotokoll (Audit-Log) |
GET |
| MCP-URL-Info + Beispiel-Konfiguration |
GET |
| Health-Check (ohne Login) |
Tests
npm run test:smoke # smoke test dasar
npm run test:security # 29 test: injection, permission, limit, pagination, auth
npm run test:oauth # 46 test: discovery, DCR, PKCE, consent, token, refresh, revoketest/oauth.mjs startet bei eigener Server auf Datenbankport 4100 Pfad Port (Datenverzeichnis oauth-test-data/) — es gibt keine zusätzliche Konfiguration.
Mitwirken
Mitwirkende sind willkommen! Bitte eröffne eine Issue oder eine Pull-Request. Für größere Änderungen zuerst in einer Issue besprechen, damit es den dem Prinzip “security is the product” folgt — jede Fläche (MCP, UI, Agent Test) soll denselben Standards linearhalten: read-only, default-deny, parameterized.
Lizenz
Dieses Projekt ist unter der MIT License lizenziert.
This server cannot be installed
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
- AlicenseAqualityDmaintenanceEnables AI agents to securely connect to and query Microsoft SQL Server databases with read-only access, schema discovery, and relationship mapping. Features advanced security protections, health monitoring, and bulk operations for production environments.975MIT
- AlicenseAqualityCmaintenanceSecure MCP server for safe, read-only DB access by AI agents, with SQL guardrails, table allowlists, PII masking, and audit logs6347MIT
- AlicenseBqualityDmaintenanceAn MCP server that connects AI assistants to Microsoft SQL Server databases, enabling schema exploration and read-only queries safely.49234MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to connect to Microsoft SQL Server via the MCP protocol, supporting database schema queries, data reading, and arbitrary SQL execution.
Related MCP Connectors
Official Microsoft MCP Server to query Microsoft Entra data using natural language
Analytical memory for AI agents: a real Postgres queried in plain English over MCP. One command.
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
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/Fattan-malva/mcp-sqlserver'
If you have feedback or need assistance with the MCP directory API, please join our Discord server