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 서버는 한 번에 하나의 쿼리만 실행하고, 호출할 때마다 연결 세부 정보를 반복해야 하며, 결과를 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 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는 평면 그리드입니다. 헤더 행 하나와 탭으로 구분된 값들만 존재합니다.

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 설정에서 --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 설정을 통한 사용자 정의 도구, 웹 워크벤치 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