Skip to main content
Glama

pgmcp

Go Reference GitHub go.mod Go version Go Report Card GitHub Workflow Status (with branch) GitHub GitHub code size in bytes

pgmcp는 공식 modelcontextprotocol/go-sdk를 기반으로 구축된 Model Context Protocol용 읽기 전용 PostgreSQL 운영/DBA 서버입니다. DBA가 장애 상황에서 묻는 질문들 — 어떤 문장이 느린지, 이 실행 계획이 왜 느린지, 어떤 인덱스가 죽은 짐인지, 어떤 테이블에서 autovacuum이 뒤처졌는지, 누가 누구를 블로킹하는지, 대기 서버가 얼마나 지연되는지 — 에 답하며, 관례가 아닌 구조적으로 읽기 전용입니다: 쓰기 권한이 없는 전용 데이터베이스 역할, 모든 단일 문장에 문장 타임아웃이 적용된 BEGIN READ ONLY 트랜잭션, 그리고 하나의 SELECT/EXPLAIN/SHOW가 아니거나 읽기 전용 트랜잭션 내에서 상태를 변경할 수 있는 모든 함수를 거부하는 SQL 파서 가드가 있습니다. PostgreSQL 16에서 테스트되었으며, 13 이상이 필요합니다.

설치

Claude Desktop, 원클릭: Releases에서 pgmcp_<version>.mcpb를 다운로드하여 열면 됩니다. Claude Desktop이 Postgres 연결 문자열을 요청하고, OS 키체인에 보관하며, 번들된 바이너리를 직접 실행합니다 — PATH에 아무것도 추가하거나 구성 파일을 편집할 필요가 없습니다. 하나의 번들로 macOS(유니버설)와 Windows(x64)를 모두 지원합니다.

그렇지 않으면 Releases에서 플랫폼에 맞는 바이너리를 다운로드하세요 — darwin, linux, windows, amd64arm64, 체크섬 포함.

또는 Go CLI 도구 go로 소스에서 빌드하세요:

go install github.com/pascalallen/pgmcp/cmd/pgmcp@latest

또는 distroless, 비루트, 멀티 아키텍처인 릴리스 이미지를 실행하세요:

docker run --rm -i -e PGMCP_DATABASE_URL='postgres://…' ghcr.io/pascalallen/pgmcp

pgmcp는 MCP 레지스트리에 io.github.pascalallen/pgmcp로 등록되어 있습니다.

무엇에든 연결하기 전에 읽기 전용 역할을 생성하세요 — 데이터베이스 역할을 참조하세요. 나머지 두 계층에 버그가 있어도 여전히 지켜주는 계층입니다.

Related MCP server: PostgreSQL MCP Server

사용법

하나의 MCP 표면, 두 가지 전송 방식. 어느 것을 실행할지는 구성의 문제이지 다른 빌드가 아닙니다.

Claude Code, stdio — 클라이언트가 바이너리를 실행하고 stdin/stdout으로 통신합니다:

claude mcp add pgmcp --transport stdio \
  --env PGMCP_DATABASE_URL='postgres://pgmcp:…@db.internal:5432/app?sslmode=require' \
  -- pgmcp

Claude Desktop, stdio — Releases에서 .mcpb 번들을 설치하거나(설치 참조), 같은 내용을 claude_desktop_config.json에 직접 작성하세요:

{
  "mcpServers": {
    "pgmcp": {
      "command": "pgmcp",
      "env": {
        "PGMCP_DATABASE_URL": "postgres://pgmcp:…@db.internal:5432/app?sslmode=require"
      }
    }
  }
}

HTTP — 공유 배포를 위한 정적 베어러 키 뒤의 Streamable HTTP. pgmcp는 일반 HTTP만 사용하며 TLS를 직접 종료하지 않습니다. 루프백에서 실행하고 리버스 프록시 뒤에 두세요.

PGMCP_DATABASE_URL='postgres://pgmcp:…@db.internal:5432/app?sslmode=require' \
PGMCP_AUTH_MODE=static \
PGMCP_API_KEYS="$(openssl rand -hex 32)" \
  pgmcp --transport http --listen 127.0.0.1:8080
claude mcp add pgmcp --transport http https://pgmcp.example.com/mcp \
  --header "Authorization: Bearer <key>"

TLS 종료, 스트리밍 전송에 필요한 프록시 설정, ID 공급자에 대한 JWT 인증, 그리고 pgmcp를 claude.ai 사용자 지정 커넥터로 연결하는 방법은 모두 docs/DEPLOYING.md에 있습니다.

도구

도구

답하는 질문

top_queries

서버 전체에서 어떤 문장이 느리거나 비용이 많이 드나요? pg_stat_statements를 총 시간, 평균 시간, 호출 수, 읽은 행 또는 블록 수로 순위를 매깁니다.

explain

문장이 왜 느린가요? 계획 트리, 가장 많은 자체 시간을 소비하는 노드, 계획 경고, 그리고 이후 실행과 비교할 수 있는 안정적인 plan_hash를 제공합니다.

index_health

어떤 인덱스를 삭제할 수 있고, 어떤 인덱스가 제 역할을 못하고 있나요? 스캔된 적 없는, 중복된, 유효하지 않은, 그리고 블로트된 인덱스.

table_health

autovacuum이 어디서 뒤처지고 있나요? 테이블별로 죽은 튜플 비율, 마지막 vacuum/analyze, 순차 스캔 대 인덱스 스캔, 예상 블로트를 제공합니다.

lock_waits

이 쿼리가 왜 멈춰 있나요? 현재 잠금 대기 그래프 — 누가 블로킹되었고, 누가 블로킹하는지, 그리고 교착 상태에 해당하는 사이클이 있는지.

connections

서버가 지금 무엇을 하고 있으며 max_connections에 얼마나 가까운가요? 상태, 대기 이벤트, 애플리케이션, 사용자 또는 데이터베이스별로 백엔드를 그룹화하며, idle-in-transaction 세션도 포함합니다.

replication

대기 서버가 얼마나 뒤처져 있고, 어떤 슬롯이 WAL을 보유하고 있나요? 기본/대기 역할, 대기 서버별 지연(바이트 및 밀리초), 슬롯 및 현재 WAL 속도.

config_check

이 서버가 합리적으로 튜닝되었나요? 메모리, autovacuum, WAL 및 연결 휴리스틱에 대한 pg_settings를 확인하고, 설정별로 ok/review/warn 판정과 메모를 제공합니다.

query

나머지 여덟 가지가 다루지 않는 모든 것. 행 상한과 문장 타임아웃으로 제한된 READ ONLY 트랜잭션에서 하나의 읽기 전용 SELECT/EXPLAIN/SHOW를 실행하며, $1..$n 바인드 매개변수를 지원합니다.

모든 도구는 readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false로 주석 처리되어 있으며, 타입이 지정된 출력 스키마를 반환합니다.

query는 자유 형식 SQL을 전달하는 유일한 도구이며 선택 사항입니다. --disable-query는 카탈로그에서 완전히 제거합니다 — 여덟 가지 진단 도구만 필요한 배포는 임시 SQL 표면 없이 실행할 수 있습니다. --query-schemas=public,app는 명명된 스키마로 제한합니다 — 그리고 analyze=true가 문장을 실행하므로 explain도 함께 제한합니다. 이것이 무엇을 막고 무엇을 막지 않는지 docs/SECURITY.md에서 읽어보세요.

리소스 및 프롬프트

리소스

내용

pgmcp://overview

시작할 서버 스냅샷: 버전, 업타임, 복구 상태, 설치된 확장, 데이터베이스별 크기, 캐시 적중률, max_connections 대비 연결 수. 30초 동안 캐시 가능.

pgmcp://settings

원시 pg_settings 행. 5분 동안 캐시 가능.

프롬프트

인수

목적

diagnose_slow_query

sql (필수)

4단계 조사: 문장을 explain하고, 계획의 핫 노드에 있는 모든 스키마에 대해 index_health/table_health를 확인하고, top_queries에서 찾은 다음, 근본 원인, 증거 및 권장 인덱스 또는 재작성을 텍스트로만 요약합니다 — 실행하지 않습니다.

구성

모든 설정에는 --flagPGMCP_<KEY> 환경 변수가 있습니다. 플래그가 환경보다 우선하고, 환경이 기본값보다 우선합니다. 구성 오류는 모든 위반 키를 하나의 메시지에 나열하고 종료 코드 2로 종료됩니다. 런타임 실패는 1로 종료됩니다.

플래그

환경

기본값

의미

--database-url

PGMCP_DATABASE_URL

— (필수)

Postgres 연결 문자열

--transport

PGMCP_TRANSPORT

stdio

stdio 또는 http

--listen

PGMCP_LISTEN

127.0.0.1:8080

HTTP 수신 주소

--resource-url

PGMCP_RESOURCE_URL

OAuth 리소스 메타데이터를 위해 이 서버가 도달 가능한 공개 원본

--auth-mode

PGMCP_AUTH_MODE

none

none, static 또는 jwt (HTTP 전용)

--api-keys

PGMCP_API_KEYS

쉼표로 구분된 정적 API 키, static에 필요

--jwks-url

PGMCP_JWKS_URL

JWK 세트 URL, jwt에 필요

--jwt-issuer

PGMCP_JWT_ISSUER

필수 iss 클레임, jwt에 필요

--jwt-audience

PGMCP_JWT_AUDIENCE

필수 aud 클레임, jwt에 필요

--auth-servers

PGMCP_AUTH_SERVERS

RFC 9728을 통해 광고할 쉼표로 구분된 OAuth 인증 서버

--disable-query

PGMCP_DISABLE_QUERY

false

임시 query 도구를 완전히 제거

--query-schemas

PGMCP_QUERY_SCHEMAS

queryexplain 도구가 읽을 수 있는 쉼표로 구분된 스키마, 설정하지 않으면 허용 목록 비활성화

--max-conns

PGMCP_MAX_CONNS

4

최대 Postgres 연결 수

--call-timeout

PGMCP_CALL_TIMEOUT

60s

도구 호출당 타임아웃

--rate-limit

PGMCP_RATE_LIMIT

60

주체당 분당 도구 호출 수 (HTTP 전용)

--max-output-bytes

PGMCP_MAX_OUTPUT_BYTES

1048576

도구 호출의 구조화된 콘텐츠 상한

--log-level

PGMCP_LOG_LEVEL

info

debug, info, warn 또는 error

--log-format

PGMCP_LOG_FORMAT

text

text 또는 json

--insecure-no-auth

PGMCP_INSECURE_NO_AUTH

false

루프백이 아닌 수신 주소에서 auth-mode=none 허용

--version

버전을 출력하고 종료

인증 블록은 HTTP 전송에만 적용됩니다. stdio를 통해서는 운영 체제가 호출자가 누구인지 결정합니다: 바이너리를 실행한 부모 프로세스, 그리고 다른 누구도 아닙니다.

보안 모델

  • 세 가지 독립적인 경로로 읽기 전용. 쓰기 권한이 없는 전용 역할(pg_monitorSELECT, 그리고 의도적으로 pg_signal_backend아님); 어댑터가 실행하는 모든 문장을 항상 롤백하는 SET LOCAL statement_timeoutlock_timeout = '2s'를 사용한 BEGIN READ ONLY; 그리고 파서 수준 가드. 읽기 전용 트랜잭션만으로는 pg_terminate_backend, pg_read_file, pg_sleep 또는 setval을 막을 수 없기 때문입니다.

  • SQL 가드는 허용 목록 우선. 최상위 문장 하나, 그리고 그것은 SELECT, EXPLAIN 또는 SHOW여야 합니다. 트리 어디에도 중첩된 쓰기 문장이 없어야 하며, FOR UPDATE/FOR SHARE 잠금 절이 없어야 하고, SELECT INTO가 없어야 하며, 거부된 함수 호출(파일 접근, 백업 및 WAL 제어, 복제 슬롯, 어드바이저리 락, dblink, 시퀀스 변경, 통계 재설정)이 없어야 합니다.

  • 스키마 허용 목록은 가드레일이지 경계가 아닙니다. --query-schemas는 구문 분석된 문장에서 테이블 참조를 한정하는 스키마와 대소문자를 구분하지 않고 일치하며, 호출자가 제공한 SQL을 전달하는 두 도구(queryexplain)를 모두 제한하므로 analyze=trueexplain은 제외한 스키마에 대해 실행될 수 없습니다. 허용된 스키마 내부의 뷰, 집합 반환 함수 또는 SECURITY DEFINER 함수는 여전히 외부를 읽을 수 있습니다. 데이터베이스 권한이 경계이며, 허용 목록은 명백한 경로를 좁힐 뿐입니다.

  • 인증되며, 실패 시 폐쇄되고, HTTP를 통해. 정적 키는 조기 종료 없이 저장된 모든 해시에 대해 상수 시간으로 비교됩니다. JWT는 비대칭 알고리즘만 사용하여(alg=none 없음, HMAC 혼동 없음) JWK 세트에 대해 검증되며 필수 iss, audexp가 있어야 하고, 검증기는 JWKS가 도착할 때까지 키를 보유하지 않으므로 열린 상태가 아닌 닫힌 상태로 시작합니다. RFC 9728 보호 리소스 메타데이터는 토큰을 얻을 수 있는 위치를 알려줍니다. 서버는 인증이 꺼진 상태에서 루프백이 아닌 주소로 시작을 거부합니다.

  • 제한적. 주체별 속도 제한, 호출별 타임아웃, 트랜잭션 내부의 문장 타임아웃 및 잠금 타임아웃, query 도구의 행 상한, 결과 구조화 콘텐츠의 상한, 그리고 1MiB 요청 본문 제한.

  • 민감한 정보는 기록되지 않습니다. 도구 호출은 이름, 기간, 결과 및 호출자의 사용자 ID를 기록합니다 — 인자, SQL 텍스트, 결과 행 또는 오류 텍스트는 절대 기록하지 않습니다. 구문 분석 실패는 문장을 되풀이하는 대신 고정된 문구로 반환되며, DSN은 연결 오류에서 편집됩니다.

위협 모델, 계층의 전체 목록, 각 계층이 다루지 않는 제한 사항은 docs/SECURITY.md에 있습니다.

테스트

경쟁 탐지기와 커버리지로 테스트 스위트를 실행하세요:

go test -race -cover ./...

통합 테스트는 Postgres 데이터베이스가 필요하며 PGMCP_TEST_DSN이 설정되지 않으면 건너뜁니다. pg_stat_statements가 사전 로드된 임시 Postgres에 대해 실행하려면:

docker run -d --rm --name pg -e POSTGRES_PASSWORD=postgres -p 5544:5432 postgres:16 \
  -c shared_preload_libraries=pg_stat_statements -c pg_stat_statements.track=all
docker exec pg psql -U postgres -c "CREATE EXTENSION IF NOT EXISTS pg_stat_statements"
PGMCP_TEST_DSN="postgres://postgres:postgres@localhost:5544/postgres?sslmode=disable" go test -race -cover ./...

커버리지 프로필을 생성하고 확인하세요:

go test -covermode=count -coverprofile=coverage.out ./...
go tool cover -html=coverage.out

공식 MCP 적합성 스위트로 실행 중인 서버를 테스트하거나 Inspector로 스모크 테스트하세요:

npx -y @modelcontextprotocol/conformance server --url http://127.0.0.1:8080/mcp \
  --expected-failures .github/conformance-expected-failures.yaml
npx @modelcontextprotocol/inspector --cli http://127.0.0.1:8080/mcp --transport http --method tools/list

기여

풀 리퀘스트를 환영합니다. 주요 변경 사항의 경우, 변경하고자 하는 내용을 논의하기 위해 먼저 이슈를 열어 주세요.

테스트를 적절히 업데이트해 주세요.

라이선스

MIT

A
license - permissive license
Not graded
quality - not tested
A
maintenance

Maintenance

Maintainers
<1hResponse time
0dRelease cycle
2Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • -
    license
    Not graded
    quality
    A
    maintenance
    A Model Context Protocol server that provides read-only access to PostgreSQL databases. This server enables LLMs to inspect database schemas and execute read-only queries.
    66,136
    89,405
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A Model Context Protocol server that provides AI assistants with secure, read-only access to PostgreSQL databases while offering comprehensive tools for schema exploration, query validation, and performance optimization.
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A Model Context Protocol server providing read-only access to PostgreSQL databases, enabling LLMs to inspect database schemas and execute read-only SQL queries.
    66,136
    MIT

View all related MCP servers

Related MCP Connectors

  • Comprehensive PostgreSQL documentation and best practices, including ecosystem tools

  • MCP server for managing Prisma Postgres.

  • Query PostgreSQL databases in plain English — LLM-generated, safety-validated SQL.

View all MCP Connectors

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/pascalallen/pgmcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server