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}は、接続時にのみ展開

対応データベース

データベース

ドライバー

非同期

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


-
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