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는 이 모든 문제를 해결합니다:
사전 구성된 연결 —
.mcp.json에서--register로 데이터베이스를 정의하면 에이전트가 즉시 쿼리 가능배치 쿼리 — 단일 도구 호출로 여러 명명된 쿼리 실행
기본 연결 — 연결을 한 번 설정하면 배치 내의 모든 쿼리에서 사용 가능
깔끔한 출력 — 컴팩트한 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 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는 평면 그리드입니다. 헤더 행 하나와 탭으로 구분된 값들만 존재합니다.
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)로부터 환경 변수를 상속받습니다. 이는 DBHub, Google Toolbox 등에서 사용하는 로컬 MCP 서버의 표준 모델입니다.
계획: 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) |
배치 쿼리 | 명명된 딕셔너리 + 리스트 | 세미콜론 구분 | 없음 | 없음 | 없음 |
기본 연결 | 한 번 설정, 모두 사용 | 쿼리별 | 해당 없음 | 단일 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 설정을 통한 사용자 정의 도구, 웹 워크벤치 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