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 服务器要求您一次运行一个查询,在每次调用时重复连接详细信息,并将结果双重编码在 JSON 字符串中。a2db 解决了所有这些问题:
预配置连接 — 通过
--register在.mcp.json中定义数据库,代理可立即查询批量查询 — 在单个工具调用中运行多个命名查询
默认连接 — 设置一次连接,即可在批处理中的所有查询中使用
整洁的输出 — 带有紧凑 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-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 是一个扁平网格:一个标题行,然后是仅由制表符分隔的值。
对于 100 行、5 列的结果集,TSV 通常比 JSON 行格式少使用 40-60% 的 token。结构化 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。
凭据存储
连接以 TOML 文件形式保存在 ~/.config/a2db/connections/ 中。
${DB_PASSWORD}语法 — 环境变量引用按字面存储,仅在连接时展开。密钥保留在您的环境中,而不是磁盘上。列表输出中无密钥 —
list_connections显示项目/环境/数据库和数据库类型,绝不显示 DSN 或密码连接文件位于您的本地机器上,且在任何存储库之外
部署范围
a2db 目前作为本地 stdio MCP 服务器运行。它从启动它的进程(您的 shell、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 (强制) | 关键字检查 (配置) | 提示/注释 | 只读事务 + 正则表达式 | 配置标志 |
写入支持 | 计划中 (按连接) | 配置标志 | 通过工具定义 | 无 | 配置标志 |
输出 | 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 — 具有整洁输出的多数据库批量查询,代理优先设计,快速设置
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