QueryShield
QueryShield
Sicherer SQL-Proxy zwischen KI-Agenten und Unternehmensdatenbanken.
Agenten rufen einen einzigen Endpunkt in einfachem Englisch (oder strukturiertem SQL) auf. QueryShield:
Übersetzt natürliche Sprache → SQL mittels Claude mit Prompt-Caching.
Validiert jede Abfrage auf AST-Ebene — nur
SELECTist erlaubt, keine gestapelten Anweisungen, keine verbotenen Funktionen, LIMIT erforderlich.Wendet agentenspezifische Sicherheit auf Zeilenebene an: Schema-/Tabellen-Whitelists und
WHERE-Klausel-Injektion.Führt die Abfrage gegen die Kundendatenbank aus und gibt die Zeilen zurück.
Protokolliert jeden Versuch in einer Nur-Anhängen-Audit-Tabelle — nur Metadaten, niemals Zeileninhalte.
Agenten sehen niemals Verbindungszeichenfolgen.
Schnellstart
pip install -r requirements.txt
cp .env.example .env
# Set ANTHROPIC_API_KEY, DATABASE_URL, VAULT_KEY (see below)
python -m queryshield.startGenerieren Sie einmalig einen Fernet-Schlüssel für VAULT_KEY und verlieren Sie ihn niemals:
python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"End-to-End-Ablauf (curl)
# 1) Boot a tenant. Returns the admin API key — copy it.
curl -X POST localhost:8000/v1/tenants?name=Acme
# 2) Register the customer DB. Connection string is encrypted at rest.
curl -X POST localhost:8000/v1/databases \
-H 'X-Admin-Key: qs_...' \
-H 'Content-Type: application/json' \
-d '{
"alias": "prod",
"db_type": "postgresql",
"connection_string": "postgresql://reader:secret@db.acme.internal:5432/app",
"allowed_tables": ["users", "orders"]
}'
# 3) Provision a scoped agent (different from admin) for your AI app.
curl -X POST localhost:8000/v1/agents \
-H 'X-Admin-Key: qs_...' \
-H 'Content-Type: application/json' \
-d '{ "name": "reporting", "tenant_id": "<tenant>" }'
# 4) Set the agent's RLS policy.
curl -X POST localhost:8000/v1/policies \
-H 'X-Admin-Key: qs_...' \
-H 'Content-Type: application/json' \
-d '{
"agent_id": "<agent>",
"database_alias": "prod",
"allowed_tables": ["users", "orders"],
"row_filters": { "users": "tenant_id = 42" }
}'
# 5) The agent queries.
curl -X POST localhost:8000/v1/query \
-H 'X-API-Key: qs_...' \
-H 'Content-Type: application/json' \
-d '{
"database_alias": "prod",
"query": "how many active users do we have?",
"mode": "nl",
"max_rows": 10
}'MCP-Integration
Aufgeführt im offiziellen MCP Registry als io.github.bch1212/queryshield.
Installieren Sie den Client:
pip install queryshield-mcpFügen Sie dies dann in Ihre Claude Desktop / Cursor / Agenten-Konfiguration ein:
{
"queryshield": {
"command": "queryshield-mcp",
"env": { "QUERYSHIELD_API_KEY": "qs_..." }
}
}Der Quellcode für das eigenständige PyPI-Paket befindet sich unter packages/queryshield-mcp/.
MCP-Integration (veraltet)
Fügen Sie dies in einen beliebigen MCP-fähigen Client ein (Claude Desktop, Cursor, benutzerdefinierte Agenten):
{
"queryshield": {
"command": "python",
"args": ["-m", "queryshield.mcp_server"],
"env": {
"QUERYSHIELD_API_KEY": "qs_...",
"QUERYSHIELD_BASE_URL": "https://api.queryshield.io"
}
}
}Verfügbare Tools:
query_database(database_alias, question, max_rows)— natürliche Sprachequery_database_sql(database_alias, sql, max_rows)— vorgefertigtes SELECTget_audit_log(limit)— letzte Versuche für den aufrufenden Agenten
Sicherheitsmodell
Bedrohung | Abwehr |
Agent erstellt ein | sqlglot AST verweigert Nicht-SELECT |
Agent schleicht | Parser lehnt |
Agent verwendet | Funktions-Deny-List auf AST-Knotenebene |
Agent liest Tabellen außerhalb seines Bereichs | RLS Schema + Tabellen-Whitelist |
Agent liest Zeilen anderer Mandanten |
|
Verbindungszeichenfolge leckt via Stack-Traces | Fernet-verschlüsselt, niemals in einer API zurückgegeben |
Audit-Log wird zum Daten-Exfiltrationsvektor | nur Metadaten werden gespeichert — niemals Zeilen |
| Zeilen mit neuem Schlüssel neu verschlüsseln (skriptgesteuert) |
safety.py ist das wichtigste Modul. Jede zusätzliche Prüfung,
welche dort landet, sollte mit einem Test in tests/test_safety.py ausgeliefert werden.
Preisgestaltung
Stufe | Monatlich | Datenbanken | Abfragen / Monat | Hinweise |
Starter | $500 | 3 | 1.000.000 | |
Pro | $1.500 | 10 | 10.000.000 | Audit-Export |
Enterprise | $3.500 | unbegrenzt | unbegrenzt | SSO, SIEM-Webhook |
Ziel: $32.5K MRR bei 15 Kunden (10 Pro + 5 Enterprise).
Bereitstellung
Das Repo ist Railway-ready. python -m queryshield.start ist der Einstiegspunkt
(liest PORT via os.getenv, da Railway den Startbefehl ohne
Shell ausführt). Stellen Sie Postgres + (optional) Redis über den Marketplace von Railway bereit
und der Rest sind Umgebungsvariablen.
railway up/health ist die Liveness-Prüfung. /ready gibt 503 zurück, wenn die Control-Plane
DB nicht erreichbar ist.
Tests
pip install pytest
python -m pytest tests/42 Tests decken ab:
AST-Sicherheit (24 Fälle — direktes DDL, Kommentare, kodierte Schlüsselwörter, mehrere Anweisungen, verbotene Funktionen, fehlendes LIMIT)
RLS-Engine (6 Fälle — Whitelist-Durchsetzung, WHERE-Injektion, Konjunktion mit bestehenden Prädikaten)
Proxy End-to-End gegen eine SQLite "Kundendatenbank" (5 Fälle — Happy Path, blockiertes DML, RLS-Zeilenfilterung, Tabellen-Whitelist, Cache-Treffer)
HTTP-Integration via FastAPI TestClient (7 Fälle — vollständige Bereitstellung → Abfrageablauf, bereichsbeschränkter Agent mit RLS, Authentifizierungsfehler)
Latest Blog Posts
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/bch1212/queryshield'
If you have feedback or need assistance with the MCP directory API, please join our Discord server