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"

なぜ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 a2db

MCPサーバーとして(推奨)

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-mcp

Claude 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 main

MCPツール

ツール

説明

login

接続を保存 — 最初に接続して検証を行う

logout

保存された接続を削除

list_connections

接続を一覧表示(シークレットは表示されません)

execute

ページネーション付きで名前付きバッチクエリを実行

search_objects

スキーマ(テーブル、カラム)を詳細レベルで探索

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設定で--register

設定ファイル

YAML設定

環境変数

クラウド管理

認証情報

DSN内の${ENV_VAR}

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


Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    The 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.
    436
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables 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.
    5
    18 npm
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Zero-config MCP server that empowers AI agents to safely query SQL and NoSQL databases like PostgreSQL, MySQL, SQLite, MongoDB, and Redis.
    5
    123 npm
    1
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    A 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.
    -