Skip to main content
Glama

QueryShield

Sicherer SQL-Proxy zwischen KI-Agenten und Unternehmensdatenbanken.

Agenten rufen einen einzigen Endpunkt in einfachem Englisch (oder strukturiertem SQL) auf. QueryShield:

  1. Übersetzt natürliche Sprache → SQL mittels Claude mit Prompt-Caching.

  2. Validiert jede Abfrage auf AST-Ebene — nur SELECT ist erlaubt, keine gestapelten Anweisungen, keine verbotenen Funktionen, LIMIT erforderlich.

  3. Wendet agentenspezifische Sicherheit auf Zeilenebene an: Schema-/Tabellen-Whitelists und WHERE-Klausel-Injektion.

  4. Führt die Abfrage gegen die Kundendatenbank aus und gibt die Zeilen zurück.

  5. 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.start

Generieren 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-mcp

Fü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 Sprache

  • query_database_sql(database_alias, sql, max_rows) — vorgefertigtes SELECT

  • get_audit_log(limit) — letzte Versuche für den aufrufenden Agenten


Sicherheitsmodell

Bedrohung

Abwehr

Agent erstellt ein DROP TABLE

sqlglot AST verweigert Nicht-SELECT

Agent schleicht ; und eine zweite Anweisung ein

Parser lehnt len(statements) > 1 ab

Agent verwendet pg_sleep, xp_cmdshell, ...

Funktions-Deny-List auf AST-Knotenebene

Agent liest Tabellen außerhalb seines Bereichs

RLS Schema + Tabellen-Whitelist

Agent liest Zeilen anderer Mandanten

row_filters via AST .where() injiziert

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

VAULT_KEY-Rotation

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)

A
license - permissive license
-
quality - not tested
C
maintenance

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