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}は、接続時にのみ展開
Related MCP server: MCP Universal DB Client
対応データベース
データベース | ドライバー | 非同期 |
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 deployed
Maintenance
Related MCP Connectors
- dataOAuthco.thinair
PostgreSQL, MySQL, and SQL Server in one session. 26 read-only MCP tools for AI agents.
Analytical memory for AI agents: a real Postgres queried in plain English over MCP. One command.
Text-to-SQL MCP server: read-only queries on PostgreSQL, MySQL and SQL Server with your real schema
- mcpOAuthcom.gibsonai
GibsonAI MCP server: manage your databases with natural language
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceThe Multi DB MCP Server is a high-performance implementation of the Database Model Context Protocol designed to revolutionize how AI agents interact with databases. Currently supporting MySQL and PostgreSQL databases.436MIT
- AlicenseAqualityCmaintenanceEnables connecting to and querying multiple database types (PostgreSQL, MySQL, SQLite) through a unified interface. Supports managing multiple concurrent database connections with connection pooling and SQL query execution through MCP tools.518 npmMIT
- AlicenseAqualityAmaintenanceZero-config MCP server that empowers AI agents to safely query SQL and NoSQL databases like PostgreSQL, MySQL, SQLite, MongoDB, and Redis.5123 npm1MIT
- FlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server that provides database operations as tools for LLM-powered applications. Supports PostgreSQL, MySQL, and MongoDB databases with connection pooling and flexible result formatting.-