Skip to main content
Glama

query-sanitizer-mcp

Eine leichtgewichtige MCP-Middleware, die zwischen Ihren Prompts und externen LLMs sitzt und sensible Daten automatisch schwärzt, bevor sie Ihren Rechner verlassen.

[Your Prompt] → sanitize_query() → [Safe Prompt] → External LLM → [Response] → restore_response() → [You]

v0.3.0 — Vier-Phasen-DLP-Pipeline: Regex → GLiNER NER → LLM-Verfeinerung → Post-Scan-Prüfung. Läuft zu 100 % Open-Source, zu 100 % lokal. Getestet auf M4 MacBook und Google Colab T4.


Warum

Jedes Mal, wenn Sie internen Kontext in Claude, ChatGPT oder ein beliebiges Cloud-LLM einfügen, riskieren Sie das Durchsickern von:

  • Mitarbeiternamen, E-Mails, Telefonnummern

  • Internen Projekt-Codenamen

  • Infrastrukturdetails (IPs, Hostnamen, DB-Namen)

  • API-Schlüsseln und Anmeldedaten

  • Firmennamen, Auftragsvolumina, rechtlichen Referenzen

Dieser MCP-Server fängt diesen Text ab, schwärzt sensible Tokens mit typisierten Platzhaltern ([ORG_NAME_1], [PII_NAME_1] usw.) und stellt sie in der Antwort wieder her — sodass Sie natürlichen Text sehen, während das Cloud-LLM niemals die echten Werte sieht.


Related MCP server: zentric-protocol-mcp

Tools

Tool

Beschreibung

sanitize_query(text)

Drei-Phasen-Schwärzung. Gibt sicheren Text + san_id zurück.

restore_response(text, san_id)

Tauscht Platzhalter zurück gegen die Originale.

scan_response(text)

Scannt die Antwort eines LLMs auf Daten, die es möglicherweise generiert oder preisgegeben hat.

view_ledger(last_n)

Zeigt den Verlauf der letzten Bereinigungen an.


Erkennungs-Pipeline

Phase 1 — Regex-Vorabprüfung (läuft immer, kein Modell erforderlich)

Deterministische Muster für strukturierte Tokens. Läuft auch, wenn das lokale Modell offline ist.

Muster

Kategorie

Blockiert?

AWS-Zugriffsschlüssel (AKIA…)

CREDENTIAL

Ja — blockiert

GitHub-Tokens (ghp_…, gho_…)

CREDENTIAL

Ja

JWTs (eyJ…)

CREDENTIAL

Ja

Slack-Tokens (xox[baprs]-…)

CREDENTIAL

Ja

api_key = "…" Zuweisungen

CREDENTIAL

Ja

Passwörter in URLs (://user:pass@)

CREDENTIAL

Ja

E-Mail-Adressen

PII_NAME

Nein — wiederhergestellt

Telefonnummern

PII_NAME

Nein

SSNs (NNN-NN-NNNN)

PII_ID

Nein

Mitarbeiter-/Ausweis-IDs (EMP-…)

PII_ID

Nein

RFC 1918 private IPs

INFRA

Nein

Dollar-Beträge

FINANCIAL

Nein

Konfigurationsdefinierte Entitäten (Firmennamen, Mitarbeiter, Codenamen, Domains)

variiert

Nein

Phase 2 — LLM-Verfeinerung (kontextbezogen, Best-Effort)

Erfasst Entitäten, die ein semantisches Verständnis erfordern: im Kontext verwendete Firmennamen, Projekt-Codenamen, GEO_INTERNAL-Referenzen, RECHTLICHE Begriffe, INTERNAL_URL-Muster. Wenn das lokale Modell nicht verfügbar ist, wird die Ausgabe von Phase 1 mit einer deutlichen Warnung zurückgegeben.

Phase 3 — Post-Scan-Konfidenzprüfung

Führt Regex-Muster mit hoher Konfidenz über den bereinigten Text aus, um potenzielle LLM-Fehler zu markieren (z. B. ein JWT, das das Modell übersehen hat). Wird als Warnung im Bericht angezeigt.


Einrichtung

Option A — M4 MacBook (empfohlen)

Stack: Ollama 0.19+ (MLX-Backend, ~50 Tok/s auf M4) + GLiNER NER (MPS, ~80ms/Aufruf)

# 1. Install Ollama and pull the recommended model
brew install ollama
ollama pull qwen2.5:3b   # 2GB, fast + strong instruction following
ollama serve             # Ollama 0.19+ uses MLX automatically on Apple Silicon

# 2. Clone and install with NER layer
git clone https://github.com/vidoluco/query-sanitizer-mcp
cd query-sanitizer-mcp
python3 -m venv .venv
.venv/bin/pip install -e ".[nlp]"   # fastmcp + gliner (GLiNER NER layer)

Zu Claude Code hinzufügen (~/.claude/settings.json):

{
  "mcpServers": {
    "query-sanitizer": {
      "command": "/path/to/query-sanitizer-mcp/.venv/bin/python",
      "args": ["/path/to/query-sanitizer-mcp/server.py"],
      "env": {
        "SANITIZER_MODEL_NAME": "qwen2.5:3b",
        "SANITIZER_GLINER_MODEL": "urchade/gliner_medium-v2.1"
      }
    }
  }
}

Alternative LLM-Modelle für M4 (alle über Ollama):

Modell

Größe

Geschwindigkeit auf M4

Am besten für

qwen2.5:3b

2 GB

~50 Tok/s

Standard — schnell, präzise

phi4-mini

3 GB

~40 Tok/s

Starke Schlussfolgerung

llama3.2:3b

2 GB

~45 Tok/s

Breite allgemeine Nutzung

qwen2.5:7b

5 GB

~30 Tok/s

Höhere Genauigkeit, mehr RAM


Option B — Google Colab T4

Stack: HuggingFace Transformers (kein Ollama erforderlich) + GLiNER (CUDA)

# Cell 1 — install
!pip install "query-sanitizer-mcp[colab]" -q
# fastmcp + gliner + transformers + torch + accelerate

# Cell 2 — configure
import os
os.environ["SANITIZER_BACKEND"]    = "hf"
os.environ["SANITIZER_HF_MODEL"]   = "Qwen/Qwen2.5-3B-Instruct"  # ~6GB, fits T4 16GB
os.environ["SANITIZER_GLINER_MODEL"] = "urchade/gliner_medium-v2.1"
os.environ["SANITIZER_LEDGER_DIR"] = "/content/sanitizer-ledger"

# Cell 3 — use directly (no MCP client needed in Colab)
import sys; sys.path.insert(0, ".")
from server import sanitize_query, restore_response, scan_response

result = sanitize_query("Send report to jane.doe@acme.com re: Project Phoenix")
print(result)

Der erste Durchlauf lädt Qwen2.5-3B-Instruct (~6 GB) und gliner_medium-v2.1 (~500 MB) in den Colab-Cache. Nachfolgende Durchläufe erfolgen sofort.


Minimale Einrichtung (nur Regex, keine Modelle erforderlich)

Wenn Sie einen Betrieb ohne Abhängigkeiten wünschen (reines Regex, kein Ollama, kein GLiNER):

pip install fastmcp
SANITIZER_MODEL_RETRIES=0 python server.py

Anmeldedaten, E-Mails, SSNs, private IPs und Finanzbeträge werden allein durch Regex erfasst. Personen, Firmennamen und Projekt-Codenamen erfordern GLiNER oder die LLM-Ebene.


Konfiguration

Erstellen Sie .sanitizer-ledger/config.json (oder führen Sie python scripts/ledger.py init-config aus):

{
  "org_names": ["Acme Corp", "Acme"],
  "org_domains": ["acme-internal.net"],
  "project_codenames": ["Phoenix", "Titan"],
  "known_employees": ["Jane Smith", "Marcus Webb"],
  "internal_ip_ranges": ["10.0.0.0/8"],
  "custom_patterns": [
    {"pattern": "JIRA-\\d{4,}", "category": "PROJECT_NAME", "description": "Jira tickets"}
  ],
  "always_allow": ["Google Cloud", "Kubernetes", "BigQuery", "Terraform", "Docker"]
}

Konfigurationsdefinierte Entitäten (org_names, known_employees usw.) sind sowohl in die Regex-Vorabprüfung (für deterministisches Matching) als auch in den LLM-System-Prompt (für kontextuelle Varianten) eingebunden. Änderungen werden beim nächsten sanitize_query-Aufruf wirksam — kein Server-Neustart erforderlich.


Umgebungsvariablen

Variable

Standard

Beschreibung

SANITIZER_MODEL_URL

http://localhost:11434/v1/chat/completions

Lokaler Modell-Endpunkt

SANITIZER_MODEL_NAME

llama3.2

Modellname

SANITIZER_MODEL_RETRIES

2

Wiederholungsversuche bei Modellfehler (2s, 4s Backoff)

SANITIZER_LEDGER_DIR

.sanitizer-ledger/

Pfad zum Protokollverzeichnis

SANITIZER_LEDGER_STORE_ORIGINALS

true

Auf false setzen, um das Speichern von Originalwerten im Ruhezustand zu stoppen (GDPR-Modus — Wiederherstellung funktioniert nur innerhalb derselben Sitzung)


Ledger CLI

python scripts/ledger.py list [N]                # recent N entries
python scripts/ledger.py lookup <san_id>         # full mapping for one entry
python scripts/ledger.py restore <san_id> <text> # restore from CLI
python scripts/ledger.py stats                   # aggregate stats by category and source
python scripts/ledger.py purge --older-than 30d  # enforce retention policy
python scripts/ledger.py init-config             # create starter config.json

Schwärzungskategorien

Kategorie

Beispiele

Schweregrad

CREDENTIAL

API-Schlüssel, Tokens, Passwörter

KRITISCH — blockiert, niemals wiederhergestellt

INTERNAL_URL

Intranet-URLs, Staging-Endpunkte

KRITISCH

PII_NAME

Namen, E-Mails, Telefonnummern

HOCH

PII_ID

SSNs, Mitarbeiter-IDs, Ausweisnummern

HOCH

ORG_NAME

Firmen-/Tochtergesellschaftsnamen

HOCH

LEGAL

Vertragsbedingungen, Fallnummern

HOCH

PROJECT_NAME

Interne Codenamen

MITTEL

INFRA

IPs, Hostnamen, DB-Namen

MITTEL

FINANCIAL

Umsatz, Auftragsvolumina, Budgets

MITTEL

GEO_INTERNAL

Bürostandorte, Gebäudenamen

NIEDRIG


Sicherheitsmodell

  • Anmeldedaten werden niemals gespeichert[BLOCKED] wird anstelle des Originalwerts in das Protokoll geschrieben

  • Fail-safe, nicht fail-open — Nichtverfügbarkeit des Modells löst Regex-Fallback aus, niemals Klartext-Durchleitung

  • Nur lokale Inferenz — keine Daten werden für den Schwärzungsschritt an eine externe API gesendet

  • Datenschutzmodus (SANITIZER_LEDGER_STORE_ORIGINALS=false) — Originale werden überhaupt nicht auf die Festplatte geschrieben; die Wiederherstellung funktioniert nur innerhalb derselben Serversitzung über den In-Memory-Cache


Beispiele

Siehe examples/ für vollständige Sitzungsprotokolle:

  1. 01_api_key_leak.md — AWS-Anmeldedaten durch Regex-Vorabprüfung blockiert

  2. 02_employee_pii.md — HR-Prompt mit Namen, E-Mails, Mitarbeiter-IDs + Wiederherstellung

  3. 03_internal_infra.md — Infrastruktur-Debugging mit Ollama offline (Regex-Fallback)


Mitwirken

Eröffnen Sie ein Issue oder senden Sie einen PR.

Ideen für die Zukunft:

  • [ ] Automatische Vorschläge für Konfigurationseinträge aus erkannten Mustern

  • [ ] Claude Code Hook-Integration (automatische Vorab-Bereinigung)

  • [ ] Konfiguration der Konfidenzschwelle

  • [ ] Batch-/Massenbereinigungsmodus

  • [ ] Code-Block-Scan (Inline-Secrets, Import-Pfade)

  • [ ] Verschlüsselung des Protokolls im Ruhezustand

  • [ ] Web-UI zur Überprüfung des Protokolls


Lizenz

MIT

Related MCP Connectors

Related MCP Servers