a2db
OfficialAgent: "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"なぜa2dbなのか?
ほとんどのデータベースMCPサーバーは、一度に1つのクエリしか実行できず、呼び出しのたびに接続詳細を繰り返す必要があり、結果はJSON文字列内に二重エンコードされて返されます。a2dbはこれらすべてを解決します:
事前設定された接続 —
.mcp.jsonで--registerを使用してデータベースを定義すれば、エージェントは即座にクエリを実行可能バッチクエリ — 1回のツール呼び出しで複数の名前付きクエリを実行可能
デフォルト接続 — 接続を一度設定すれば、バッチ内のすべてのクエリで再利用可能
クリーンな出力 — コンパクトなTSVデータとクエリごとのタイミングを含む構造化されたJSONエンベロープ(なぜTSVなのか?を参照)
読み取り専用の強制 — SQLGlot AST解析により、すべての書き込み操作をブロック
すべてのドライバーをバンドル —
pip install a2dbを実行するだけで完了シークレットは環境変数に保持 — DSN内の
${DB_PASSWORD}は、接続時にのみ展開
対応データベース
データベース | ドライバー | 非同期 |
PostgreSQL | asyncpg | ネイティブ |
SQLite | aiosqlite | ネイティブ |
MySQL / MariaDB | mysql-connector-python | ラップ済み |
Oracle | oracledb | ラップ済み |
SQL Server | pymssql | ラップ済み |
クイックスタート
pip install a2dbMCPサーバーとして(推奨)
Claude Code(事前設定された接続を使用):
claude mcp add -s user a2db -- a2db-mcp \
--register myapp/prod/main 'postgresql://user:${DB_PASSWORD}@host/mydb'Claude Code(最小構成 — エージェントが必要に応じてloginを呼び出す):
claude mcp add -s user a2db -- a2db-mcpClaude Desktop / Cursor / その他のMCPクライアント(.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"
}
}
}
}複数のデータベース:
{
"args": [
"a2db-mcp",
"--register", "myapp/prod/main", "postgresql://user:${DB_PASSWORD}@host/maindb",
"--register", "myapp/prod/analytics", "postgresql://user:${DB_PASSWORD}@host/analytics"
]
}--registerはサーバー起動時に接続を事前登録するため、エージェントは即座にクエリを実行できます。パスワードには${ENV_VAR}構文を使用し、接続時に展開されるため、プレーンテキストで保存されることはありません。
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 mainMCPツール
ツール | 説明 |
| 接続を保存 — 最初に接続して検証を行う |
| 保存された接続を削除 |
| 接続を一覧表示(シークレットは表示されません) |
| ページネーション付きで名前付きバッチクエリを実行 |
| スキーマ(テーブル、カラム)を詳細レベルで探索 |
execute — コアツール
デフォルト接続を使用した名前付き辞書(推奨):
{
"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"}
}
}リスト形式(自動的に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"}
]
}レスポンス(TSV形式 — デフォルト):
{
"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
}
}::textキャストは不要です。整数、浮動小数点数、タイムスタンプ、配列、NULLはすべてネイティブに動作します。
エラーコンテキスト
カラムエラーでクエリが失敗した場合、a2dbはメッセージを補強します:
column "nme" does not exist
Did you mean: name?
Available columns: id (integer), name (text), email (text), active (integer)なぜTSVなのか?
LLMのコンテキストウィンドウは高価です。JSONの行データは冗長で、すべての行がすべてのカラム名を繰り返し、中括弧、カンマ、引用符を追加します。TSVはフラットなグリッド形式です。ヘッダー行が1つあり、その後にタブで区切られた値が続きます。
100行5カラムの結果セットの場合、TSVはJSON行形式よりも通常40〜60%少ないトークンで済みます。構造化されたJSONエンベロープにより、メタデータ(行数、切り捨てステータス)は引き続き取得できます。行のペイロードのみがTSVになります。
すべての行にカラム名を含む完全な構造化出力が必要な場合は、format="json"を設定してください。
セキュリティ
読み取り専用の強制
すべてのクエリは、実行前にSQLGlotによって解析されます:
ブロック対象: INSERT, UPDATE, DELETE, DROP, TRUNCATE, ALTER, CREATE, GRANT, REVOKE
バイパス耐性: 複数ステートメント攻撃やコメントでラップされた書き込みは、キーワードマッチングだけでなくASTレベルで捕捉されます
許可対象: SELECT, UNION, EXPLAIN, SHOW, DESCRIBE, PRAGMA
これは多層防御です。読み取り専用のデータベースユーザーを使用することも推奨しますが、ユーザーに書き込み権限がある場合でも、a2dbは書き込みを許可しません。
書き込みサポートはコアには実装されていますが、MCP経由ではまだ公開されていません。計画中:接続ごとの書き込み権限(エージェントではなく、人間が明示的に有効化)。TODO.mdを参照してください。
認証情報の保存
接続は~/.config/a2db/connections/にTOMLファイルとして保存されます。
${DB_PASSWORD}構文 — 環境変数参照はそのまま保存され、接続時にのみ展開されます。シークレットはディスク上ではなく、環境内に保持されます。リスト出力にシークレットを含めない —
list_connectionsはプロジェクト/環境/DBおよびデータベースタイプを表示しますが、DSNやパスワードは表示しません。接続ファイルはローカルマシン上にあり、リポジトリの外に保存されます。
デプロイメントスコープ
a2dbは現在、ローカルstdio MCPサーバーとして動作します。起動プロセス(シェル、Claude Code、Dockerなど)から環境変数を継承します。これはローカルMCPサーバーの標準モデルであり、DBHubやGoogle Toolboxなどで採用されているアプローチと同じです。
計画中: MCP仕様に従ったOAuth 2.1によるリモートHTTPトランスポート。現時点では、Dockerで実行する場合は、コンテナ実行時に環境変数経由でシークレットを注入してください。
比較
機能 | a2db | DBHub | Google Toolbox | PGMCP | Supabase MCP |
データベース | 5 (PG, SQLite, MySQL, Oracle, MSSQL) | 5 (PG, MySQL, MSSQL, MariaDB, SQLite) | 40以上 (クラウド + OSS) | PGのみ | PG (Supabase) |
バッチクエリ | 名前付き辞書 + リスト | セミコロン区切り | なし | なし | なし |
デフォルト接続 | 一度設定して再利用 | クエリごと | N/A | 単一DB | 単一プロジェクト |
読み取り専用 | SQLGlot AST (強制) | キーワードチェック (設定) | ヒント/注釈 | 読み取り専用tx + 正規表現 | 設定フラグ |
書き込みサポート | 計画中 (接続ごと) | 設定フラグ | ツール定義経由 | なし | 設定フラグ |
出力 | JSON + TSVデータ | 構造化テキスト | MCPプロトコル | テーブル / JSON / CSV | JSON |
スキーマ探索 | 3段階の詳細レベル | 専用ツール | 事前構築ツール | NL-to-SQL経由 | 専用ツール |
事前設定 | MCP設定で | 設定ファイル | YAML設定 | 環境変数 | クラウド管理 |
認証情報 | DSN内の | DSN文字列 | 環境変数 + GCP IAM | 環境変数 | OAuth 2.1 |
ドライバーバンドル | すべて含む | すべて含む | 様々 | ビルトイン | 管理済み |
CLI | あり | なし | あり | あり | なし |
エラーコンテキスト | カラムの提案 + 型 | なし | なし | なし | なし |
ライセンス | Apache 2.0 | MIT | Apache 2.0 | Apache 2.0 | Apache 2.0 |
使い分け:
a2db — クリーンな出力、エージェントファースト設計、迅速なセットアップを求めるマルチDBバッチクエリ向け
DBHub — TOML設定によるカスタムツール、WebワークベンチUI向け
Google Toolbox — GCPエコシステム、IAM統合、40以上のソース向け
PGMCP — PostgreSQL向けの自然言語からSQLへの変換(OpenAIキーが必要)
Supabase MCP — Supabaseプラットフォーム全体の管理(エッジ関数、ブランチ、ストレージ)向け
環境別のセットアップ
ローカル (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シークレットは実行時に環境変数として注入され、イメージに焼き込まれることはありません。
CI / 自動化
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"開発
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ライセンス
Apache 2.0
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.
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