a2db MCPサーバー
✓ 検証済みバッチクエリと構造化されたTSV出力を使用して、AIエージェントに複数のデータベースへの安全な読み取り専用アクセスを提供します。
別名 agentic-eng/a2db
- スター
- 2
- ツール
- 5
- ダウンロード数(30日間)
- 173
- 最新バージョン
- 0.2.1
- 最終コミット
- 2026年4月13日
- ライセンス
- Apache-2.0
a2db MCPとは
a2dbはMCPサーバーです。 バッチクエリと構造化されたTSV出力を使用して、AIエージェントに複数のデータベースへの安全な読み取り専用アクセスを提供します。. 5個のツールを提供しており、login, logout, list_connectionsなどがあります。
プロジェクトのREADMEから生成された概要
a2db MCP server について
a2dbは、PostgreSQL、SQLite、MySQL、Oracle、SQL Serverを含む5種類の異なるデータベースタイプに対して、AIエージェントに安全な読み取り専用アクセスを提供します。このサーバーは、エージェントが単一のツール呼び出しで複数の名前付きクエリを実行できるようにすることで、単一クエリ実行の非効率性を解決するように設計されています。stdioを介してローカルで動作し、設定ファイルを使用してClaude Code、Claude Desktop、Cursorなどのクライアントに統合できます。
セキュリティは主要な焦点であり、SQLGlot ASTパースを利用して、データベースユーザーに権限がある場合でも、INSERTやDELETEなどのすべての書き込み操作をブロックします。トークン使用量を最適化するために、サーバーは構造化されたJSONエンベロープ内にコンパクトなTSV形式でデータを返します。これにより、標準的なJSON行と比較してコンテキストウィンドウの消費量を40〜60%削減できます。ユーザーはCLIを通じて接続を管理するか、--registerフラグを使用してMCP設定に事前登録できます。また、環境変数の展開を使用することで、機密性の高い認証情報を安全に保つことができます。
できること
- 1データベースのバッチクエリ実行AIエージェントは、アクティブなユーザーとその最近の注文など、関連する複数のデータセットを単一のリクエストで取得できます。
- 2LLMトークンコストの削減サーバーはフラットなグリッド形式を使用して、AIモデルに送信されるテキスト量を最小限に抑えます。
プロジェクトの README から作成されています。すべてのユースケースは、その引用と照らし合わせて確認されています。
a2db MCPのインストール方法
フォーマット検証日 2026年11月10日Cursor に追加Gooseに追加Claude Codeにa2db MCPをインストール
$ claude mcp add a2db -- uvx a2dbCursorにa2db MCPをインストール
~/.cursor/mcp.json
{
"mcpServers": {
"a2db": {
"command": "uvx",
"args": [
"a2db"
]
}
}
}VS Codeにa2db MCPをインストール
.vscode/mcp.json
{
"servers": {
"a2db": {
"type": "stdio",
"command": "uvx",
"args": [
"a2db"
]
}
}
}VS Code CLIにa2db MCPをインストール
$ code --add-mcp '{"name":"a2db","type":"stdio","command":"uvx","args":["a2db"]}'Claude Desktopにa2db MCPをインストール
claude_desktop_config.json
{
"mcpServers": {
"a2db": {
"command": "uvx",
"args": [
"a2db"
]
}
}
}Codexにa2db MCPをインストール
$ codex mcp add a2db -- uvx a2dbCodex config.tomlにa2db MCPをインストール
~/.codex/config.toml
[mcp_servers.a2db] command = "uvx" args = ["a2db"]
Gemini CLIにa2db MCPをインストール
$ gemini mcp add -s user a2db uvx -- a2dbGemini settings.jsonにa2db MCPをインストール
~/.gemini/settings.json
{
"mcpServers": {
"a2db": {
"command": "uvx",
"args": [
"a2db"
]
}
}
}a2db MCPツール 5
READMEから検出loginlogoutlist_connectionsexecutesearch_objects
| login | — | |
| logout | — | |
| list_connections | — | |
| execute | — | |
| search_objects | — |
設定
DB_PASSWORD
| 名前 | 説明 | 種類 |
|---|---|---|
| DB_PASSWORD | — |
自動チェック
実行日 2026年11月14日完全なレポート →自動チェックに合格しました。これはセキュリティ監査ではありません。コードを読み、サーバーに必要最小限のアクセス権を与えてください。 チェックの仕組み
- ソースリポジトリがリンクされており、アクセス可能agentic-eng/a2db is public and reachablegithub.com/agentic-eng/a2db ↗合格
- パッケージがこのリポジトリをソースとして指定未チェック
- ビルドの来歴 (Sigstore 証明)Sigstore attestation for a2dbpypi.org/project/a2db/ ↗合格
- オープンソースライセンス (OSI)Apache-2.0spdx.org/licenses/Apache-2.0.html ↗合格
- 過去1年以内にコミットまたはリリースありLast commit or release 2026-04-13github.com/agentic-eng/a2db ↗合格
- OpenSSF Scorecard未チェック
- パッケージ名が有名なパッケージに酷似していないNo popular package one edit away from a2db合格
- パッケージおよびその依存関係に重大な勧告なし43 resolved dependencies checked; no critical advisoryosv.dev ↗合格
- モデルへの隠れた指示がない5 tool descriptions and the README read; no override phrases, credential paths or hidden characters合格
- 破壊的なツールがラベル付けされている未チェック
- リモートエンドポイントが MCP ハンドシェイクに応答未チェック
README
GitHubで見る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"
Why a2db?
Most database MCP servers make you run one query at a time, repeat connection details on every call, and return results double-encoded inside JSON strings. a2db fixes all of that:
- Pre-configured connections — define databases in
.mcp.jsonwith--register, agent queries immediately - Batch queries — run multiple named queries in a single tool call
- Default connection — set connection once, use it across all queries in a batch
- Clean output — structured JSON envelope with compact TSV data and per-query timing (see why TSV?)
- Read-only enforced — SQLGlot AST parsing blocks all write operations
- All drivers bundled —
pip install a2dband you're done - Secrets stay in env —
${DB_PASSWORD}in DSNs, expanded only at connection time
Supported Databases
| Database | Driver | Async |
|---|---|---|
| PostgreSQL | asyncpg | native |
| SQLite | aiosqlite | native |
| MySQL / MariaDB | mysql-connector-python | wrapped |
| Oracle | oracledb | wrapped |
| SQL Server | pymssql | wrapped |
Quick Start
pip install a2db
As an MCP Server (recommended)
Claude Code (with pre-configured connection):
claude mcp add -s user a2db -- a2db-mcp \
--register myapp/prod/main 'postgresql://user:${DB_PASSWORD}@host/mydb'
Claude Code (minimal — agent calls login on demand):
claude mcp add -s user a2db -- a2db-mcp
Claude Desktop / Cursor / any 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"
}
}
}
}
Multiple databases:
{
"args": [
"a2db-mcp",
"--register", "myapp/prod/main", "postgresql://user:${DB_PASSWORD}@host/maindb",
"--register", "myapp/prod/analytics", "postgresql://user:${DB_PASSWORD}@host/analytics"
]
}
--register pre-registers connections at server startup — the agent can query immediately. Passwords use ${ENV_VAR} syntax and are expanded at connection time, never stored in plaintext.
As a 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 | Description |
|---|---|
login |
Save a connection — validates by connecting first |
logout |
Remove a saved connection |
list_connections |
List connections (no secrets exposed) |
execute |
Run named batch queries with pagination |
search_objects |
Explore schema — tables, columns, with detail levels |
execute — the core tool
Named dict with default connection (preferred):
{
"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"}
}
}
List format (auto-named 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"}
]
}
Response (TSV format — default):
{
"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
}
}
No ::text casts needed — integers, floats, timestamps, arrays, NULLs all work natively.
Error context
When a query fails with a column error, a2db enriches the message:
column "nme" does not exist
Did you mean: name?
Available columns: id (integer), name (text), email (text), active (integer)
Why TSV?
LLM context windows are expensive. JSON row data is verbose — every row repeats every column name, adds braces, commas, and quotes. TSV is a flat grid: one header row, then just values separated by tabs.
For a 100-row, 5-column result set, TSV typically uses 40-60% fewer tokens than JSON row format. The structured JSON envelope still gives you metadata (row count, truncation status) — only the row payload is TSV.
Set format="json" if you need full structured output with column names on every row.
Security
Read-Only Enforcement
Every query is parsed by SQLGlot before execution:
- Blocked: INSERT, UPDATE, DELETE, DROP, TRUNCATE, ALTER, CREATE, GRANT, REVOKE
- Bypass-resistant: multi-statement attacks and comment-wrapped writes are caught at the AST level, not just keyword matching
- Allowed: SELECT, UNION, EXPLAIN, SHOW, DESCRIBE, PRAGMA
This is defense-in-depth — you should also use a read-only database user, but a2db won't let writes through even if the user has write permissions.
Write support is implemented in the core but not yet exposed via MCP. Planned: per-connection write permissions, explicitly enabled by the human operator — not the agent. See TODO.md.
Credential Storage
Connections are saved in ~/.config/a2db/connections/ as TOML files.
${DB_PASSWORD}syntax — environment variable references are stored literally and expanded only at connection time. Secrets stay in your environment, not on disk.- No secrets in list output —
list_connectionsshows project/env/db and database type, never DSNs or passwords - Connection files are local to your machine and outside any repository
Deployment Scope
a2db currently runs as a local stdio MCP server. It inherits environment variables from the process that launches it (your shell, Claude Code, Docker). This is the standard model for local MCP servers — the same approach used by DBHub, Google Toolbox, and others.
Planned: remote HTTP transport with OAuth 2.1 per the MCP spec. For now, if running in Docker, inject secrets via environment variables at container runtime.
Comparison
| Feature | a2db | DBHub | Google Toolbox | PGMCP | Supabase MCP |
|---|---|---|---|---|---|
| Databases | 5 (PG, SQLite, MySQL, Oracle, MSSQL) | 5 (PG, MySQL, MSSQL, MariaDB, SQLite) | 40+ (cloud + OSS) | PG only | PG (Supabase) |
| Batch queries | Named dict + list | Semicolon-separated | No | No | No |
| Default connection | Set once, use for all | Per-query | N/A | Single DB | Single project |
| Read-only | SQLGlot AST (enforced) | Keyword check (config) | Hint/annotation | Read-only tx + regex | Config flag |
| Write support | Planned (per-connection) | Config flag | Via tool definition | No | Config flag |
| Output | JSON + TSV data | Structured text | MCP protocol | Table / JSON / CSV | JSON |
| Schema discovery | 3 detail levels | Dedicated tool | Prebuilt tools | Via NL-to-SQL | Dedicated tools |
| Pre-configured | --register in MCP config |
Config file | YAML config | Env var | Cloud-managed |
| Credentials | ${ENV_VAR} in DSN |
DSN strings | Env vars + GCP IAM | Env var | OAuth 2.1 |
| Drivers bundled | All included | All included | Varies | Built-in | Managed |
| CLI | Yes | No | Yes | Yes | No |
| Error context | Column suggestions + types | No | No | No | No |
| License | Apache 2.0 | MIT | Apache 2.0 | Apache 2.0 | Apache 2.0 |
When to use what:
- a2db — multi-DB batch queries with clean output, agent-first design, fast setup
- DBHub — custom tools via TOML config, web workbench UI
- Google Toolbox — GCP ecosystem, IAM integration, 40+ sources
- PGMCP — natural-language-to-SQL for PostgreSQL (requires OpenAI key)
- Supabase MCP — full Supabase platform management (edge functions, branching, storage)
Setup by Environment
Local (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
Secrets are injected as environment variables at runtime — never baked into the image.
CI / Automation
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"
Development
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
License
Apache 2.0
a2db MCPのよくある質問
a2db MCPをClaude Codeに追加するには
ターミナルでclaude mcp add a2db -- uvx a2dbを実行します。すべてのプロジェクトで利用するには--scope userを追加します。
a2db MCPをCursorに追加するには
~/.cursor/mcp.jsonを開き、上記のインストールセクションに示すCursor設定を使ってmcpServersの下にサーバーを追加します。
a2db MCPが提供するツールは
5個のツールを提供しており、login, logout, list_connections, execute, search_objectsなどがあります。
a2dbはどのようにデータベースのセキュリティを確保していますか?
SQLGlot ASTパースを使用して、INSERT、UPDATE、DELETEなどのすべての書き込み操作をブロックし、クエリが読み取り専用であることを保証します。
データベースの認証情報はどのように扱われますか?
シークレットは${ENV_VAR}構文を使用して環境変数に保持され、接続時にのみ展開されます。平文で保存されることはありません。
なぜサーバーはクエリ結果にTSV形式を使用するのですか?
TSVはJSON行形式よりもトークン数を40〜60%削減できるため、LLMのコンテキストウィンドウにおいてより効率的です。