Skip to main content
Glama
yoselabs

a2db

Official
by yoselabs

Agent: "Show me active users and their recent orders"
  ↓
a2db execute → 2 queries, 1 call, structured results
  ↓
Agent: "Got it — 847 active users, avg order $42.50"

Warum a2db?

Die meisten Datenbank-MCP-Server zwingen Sie dazu, eine Abfrage nach der anderen auszuführen, Verbindungsdetails bei jedem Aufruf zu wiederholen und Ergebnisse doppelt kodiert in JSON-Strings zurückzugeben. a2db behebt all das:

  • Vorab konfigurierte Verbindungen — definieren Sie Datenbanken in .mcp.json mit --register, der Agent kann sofort abfragen

  • Batch-Abfragen — führen Sie mehrere benannte Abfragen in einem einzigen Tool-Aufruf aus

  • Standardverbindung — legen Sie die Verbindung einmal fest und verwenden Sie sie für alle Abfragen in einem Batch

  • Saubere Ausgabe — strukturierter JSON-Umschlag mit kompakten TSV-Daten und Timing pro Abfrage (siehe warum TSV?)

  • Erzwungener Schreibschutz — SQLGlot AST-Parsing blockiert alle Schreiboperationen

  • Alle Treiber gebündeltpip install a2db und Sie sind fertig

  • Geheimnisse bleiben in der Umgebung${DB_PASSWORD} in DSNs wird erst zum Zeitpunkt der Verbindung erweitert

Unterstützte Datenbanken

Datenbank

Treiber

Async

PostgreSQL

asyncpg

nativ

SQLite

aiosqlite

nativ

MySQL / MariaDB

mysql-connector-python

gewrappt

Oracle

oracledb

gewrappt

SQL Server

pymssql

gewrappt

Schnellstart

pip install a2db

Als MCP-Server (empfohlen)

Claude Code (mit vorab konfigurierter Verbindung):

claude mcp add -s user a2db -- a2db-mcp \
  --register myapp/prod/main 'postgresql://user:${DB_PASSWORD}@host/mydb'

Claude Code (minimal — Agent ruft bei Bedarf login auf):

claude mcp add -s user a2db -- a2db-mcp

Claude Desktop / Cursor / jeder MCP-Client (.mcp.json):

{
  "mcpServers": {
    "a2db": {
      "command": "uvx",
      "args": [
        "a2db-mcp",
        "--register", "myapp/prod/main", "postgresql://user:${DB_PASSWORD}@host/mydb"
      ],
      "env": {
        "DB_PASSWORD": "your-password-here"
      }
    }
  }
}

Mehrere Datenbanken:

{
  "args": [
    "a2db-mcp",
    "--register", "myapp/prod/main", "postgresql://user:${DB_PASSWORD}@host/maindb",
    "--register", "myapp/prod/analytics", "postgresql://user:${DB_PASSWORD}@host/analytics"
  ]
}

--register registriert Verbindungen beim Serverstart vor — der Agent kann sofort abfragen. Passwörter verwenden die ${ENV_VAR}-Syntax und werden zum Zeitpunkt der Verbindung erweitert, niemals im Klartext gespeichert.

Als CLI

# Save a connection (validates immediately)
a2db login -p myapp -e prod -d main 'postgresql://user:${DB_PASSWORD}@localhost/mydb'

# Query
a2db query -p myapp -e prod -d main "SELECT * FROM users LIMIT 10"

# JSON output
a2db query -p myapp -e prod -d main -f json "SELECT * FROM users LIMIT 10"

# Explore schema
a2db schema -p myapp -e prod -d main tables
a2db schema -p myapp -e prod -d main columns -t users

# List / remove connections
a2db connections
a2db logout -p myapp -e prod -d main

MCP-Tools

Tool

Beschreibung

login

Verbindung speichern — validiert durch vorheriges Verbinden

logout

Gespeicherte Verbindung entfernen

list_connections

Verbindungen auflisten (keine Geheimnisse offengelegt)

execute

Benannte Batch-Abfragen mit Paginierung ausführen

search_objects

Schema erkunden — Tabellen, Spalten, mit Detailstufen

execute — das Kern-Tool

Benanntes Dictionary mit Standardverbindung (bevorzugt):

{
  "connection": {"project": "myapp", "env": "prod", "db": "main"},
  "queries": {
    "active_users": {"sql": "SELECT id, name FROM users WHERE active = true"},
    "recent_orders": {"sql": "SELECT id, total FROM orders ORDER BY created_at DESC LIMIT 5"}
  }
}

Listenformat (automatisch benannt q1, q2, ...):

{
  "connection": {"project": "myapp", "env": "prod", "db": "main"},
  "queries": [
    {"sql": "SELECT COUNT(*) AS cnt FROM users"},
    {"sql": "SELECT AVG(total) AS avg_order FROM orders"}
  ]
}

Antwort (TSV-Format — Standard):

{
  "active_users": {
    "data": "id\tname\n1\tAlice\n2\tBob\n3\tCharlie",
    "rows": 3,
    "truncated": false,
    "time_ms": 12
  },
  "recent_orders": {
    "data": "id\ttotal\n501\t129.00\n500\t49.99",
    "rows": 2,
    "truncated": false,
    "time_ms": 8
  }
}

Keine ::text-Casts erforderlich — Ganzzahlen, Gleitkommazahlen, Zeitstempel, Arrays, NULLs funktionieren alle nativ.

Fehlerkontext

Wenn eine Abfrage mit einem Spaltenfehler fehlschlägt, reichert a2db die Nachricht an:

column "nme" does not exist
Did you mean: name?
Available columns: id (integer), name (text), email (text), active (integer)

Warum TSV?

LLM-Kontextfenster sind teuer. JSON-Zeilendaten sind wortreich — jede Zeile wiederholt jeden Spaltennamen, fügt geschweifte Klammern, Kommas und Anführungszeichen hinzu. TSV ist ein flaches Raster: eine Kopfzeile, dann nur durch Tabs getrennte Werte.

Für einen Ergebnissatz mit 100 Zeilen und 5 Spalten verbraucht TSV typischerweise 40-60% weniger Token als das JSON-Zeilenformat. Der strukturierte JSON-Umschlag liefert Ihnen weiterhin Metadaten (Zeilenanzahl, Kürzungsstatus) — nur die Zeilennutzlast ist TSV.

Setzen Sie format="json", wenn Sie eine vollständig strukturierte Ausgabe mit Spaltennamen in jeder Zeile benötigen.

Sicherheit

Erzwungener Schreibschutz

Jede Abfrage wird vor der Ausführung von SQLGlot geparst:

  • Blockiert: INSERT, UPDATE, DELETE, DROP, TRUNCATE, ALTER, CREATE, GRANT, REVOKE

  • Umgehungssicher: Angriffe mit mehreren Anweisungen und in Kommentaren verpackte Schreibvorgänge werden auf AST-Ebene erkannt, nicht nur durch Schlüsselwortabgleich

  • Erlaubt: SELECT, UNION, EXPLAIN, SHOW, DESCRIBE, PRAGMA

Dies ist eine tiefgestaffelte Verteidigung — Sie sollten zusätzlich einen schreibgeschützten Datenbankbenutzer verwenden, aber a2db lässt keine Schreibvorgänge durch, selbst wenn der Benutzer Schreibrechte hat.

Schreibunterstützung ist im Kern implementiert, aber noch nicht über MCP verfügbar. Geplant: Schreibrechte pro Verbindung, explizit vom menschlichen Bediener aktiviert — nicht vom Agenten. Siehe TODO.md.

Speicherung von Anmeldedaten

Verbindungen werden in ~/.config/a2db/connections/ als TOML-Dateien gespeichert.

  • ${DB_PASSWORD}-Syntax — Umgebungsvariablen-Referenzen werden wörtlich gespeichert und erst zum Zeitpunkt der Verbindung erweitert. Geheimnisse bleiben in Ihrer Umgebung, nicht auf der Festplatte.

  • Keine Geheimnisse in der Listen-Ausgabelist_connections zeigt Projekt/Umgebung/DB und Datenbanktyp, niemals DSNs oder Passwörter

  • Verbindungsdateien sind lokal auf Ihrem Computer und außerhalb jedes Repositorys

Bereitstellungsumfang

a2db läuft derzeit als lokaler stdio-MCP-Server. Er erbt Umgebungsvariablen von dem Prozess, der ihn startet (Ihre Shell, Claude Code, Docker). Dies ist das Standardmodell für lokale MCP-Server — der gleiche Ansatz, der von DBHub, Google Toolbox und anderen verwendet wird.

Geplant: Remote-HTTP-Transport mit OAuth 2.1 gemäß MCP-Spezifikation. Wenn Sie derzeit in Docker ausführen, injizieren Sie Geheimnisse über Umgebungsvariablen zur Laufzeit des Containers.

Vergleich

Funktion

a2db

DBHub

Google Toolbox

PGMCP

Supabase MCP

Datenbanken

5 (PG, SQLite, MySQL, Oracle, MSSQL)

5 (PG, MySQL, MSSQL, MariaDB, SQLite)

40+ (Cloud + OSS)

Nur PG

PG (Supabase)

Batch-Abfragen

Benanntes Dict + Liste

Semikolon-getrennt

Nein

Nein

Nein

Standardverbindung

Einmal festlegen, für alle nutzen

Pro Abfrage

N/A

Einzelne DB

Einzelnes Projekt

Schreibschutz

SQLGlot AST (erzwungen)

Schlüsselwortprüfung (Konfig)

Hinweis/Annotation

Schreibgeschützte Transaktion + Regex

Konfig-Flag

Schreibunterstützung

Geplant (pro Verbindung)

Konfig-Flag

Über Tool-Definition

Nein

Konfig-Flag

Ausgabe

JSON + TSV-Daten

Strukturierter Text

MCP-Protokoll

Tabelle / JSON / CSV

JSON

Schema-Erkennung

3 Detailstufen

Dediziertes Tool

Vorgefertigte Tools

Über NL-zu-SQL

Dedizierte Tools

Vorab konfiguriert

--register in MCP-Konfig

Konfig-Datei

YAML-Konfig

Env-Var

Cloud-verwaltet

Anmeldedaten

${ENV_VAR} in DSN

DSN-Strings

Env-Vars + GCP IAM

Env-Var

OAuth 2.1

Treiber gebündelt

Alle enthalten

Alle enthalten

Variiert

Eingebaut

Verwaltet

CLI

Ja

Nein

Ja

Ja

Nein

Fehlerkontext

Spaltenvorschläge + Typen

Nein

Nein

Nein

Nein

Lizenz

Apache 2.0

MIT

Apache 2.0

Apache 2.0

Apache 2.0

Wann was verwenden:

  • a2db — Multi-DB-Batch-Abfragen mit sauberer Ausgabe, Agent-First-Design, schnelle Einrichtung

  • DBHub — benutzerdefinierte Tools über TOML-Konfig, Web-Workbench-UI

  • Google Toolbox — GCP-Ökosystem, IAM-Integration, 40+ Quellen

  • PGMCP — natürliche Sprache zu SQL für PostgreSQL (erfordert OpenAI-Key)

  • Supabase MCP — vollständige Supabase-Plattformverwaltung (Edge-Funktionen, Branching, Speicher)

Einrichtung nach Umgebung

Lokal (macOS / Linux)

pip install a2db

# CLI
a2db login -p myapp -e dev -d main 'postgresql://user:pass@localhost/mydb'

# Or add as MCP server (see Quick Start)

Docker

FROM python:3.12-slim
RUN pip install a2db
CMD ["a2db-mcp", "--register", "myapp/prod/main", "postgresql://user:${DB_PASSWORD}@host/mydb"]
docker run -e DB_PASSWORD=secret -i my-a2db-image

Geheimnisse werden zur Laufzeit als Umgebungsvariablen injiziert — niemals in das Image eingebettet.

CI / Automatisierung

pip install a2db

# Pre-configured — no login needed
a2db-mcp --register myapp/ci/main "postgresql://ci_user:${CI_DB_PASSWORD}@db-host/mydb"

# Or use CLI directly
a2db login -p myapp -e ci -d main "postgresql://ci_user:${CI_DB_PASSWORD}@db-host/mydb"
a2db query -p myapp -e ci -d main "SELECT COUNT(*) FROM migrations"

Entwicklung

make bootstrap   # Install deps + hooks
make check       # Lint + test + security (full gate)
make test        # Tests with coverage (90% minimum)
make lint        # Lint only (never modifies files)
make fix         # Auto-fix + lint

Lizenz

Apache 2.0


-
security - not tested
A
license - permissive license
-
quality - not tested

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

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/yoselabs/a2db'

If you have feedback or need assistance with the MCP directory API, please join our Discord server