brunch

PostgreSQL Operation with AI

MCP-PostgreSQL-Ops

by JungIn
"우리 서버에서 가장 느린 쿼리 10개를 보여줘"


"ecommerce 데이터베이스의 테이블 관계도를 분석해 줘"


"현재 활성 연결 상태를 확인해 줘"



만약 이런 질문을 Claude나 ChatGPT에게 자연어로 물어보고, 실시간으로 PostgreSQL 데이터베이스를 분석한 결과를 받을 수 있다면 어떨까요?


복잡한 SQL 쿼리를 작성하거나 모니터링 대시보드를 구축할 필요 없이, 마치 데이터베이스 전문가와 대화하듯 자연스럽게 질문하고 답을 얻을 수 있는 시대가 왔습니다. 오늘 소개할 MCP-PostgreSQL-Ops(GitHub)는 이런 이야기를 실행해 볼 수 있게 만들어주는 오픈소스 프로젝트입니다.




MCP-PostgreSQL-Ops


MCP-PostgreSQL-Ops는 Model Context Protocol(MCP)을 활용하여 AI 어시스턴트가 PostgreSQL 데이터베이스를 직접 모니터링하고 분석할 수 있게 해주는 서버입니다. 쉽게 말해, Claude나 다른 AI 모델이 여러분의 데이터베이스와 '대화'할 수 있게 해주는 다리 역할을 합니다.


안전한 읽기 전용

모든 작업이 읽기 전용으로 설계되어 데이터 손실 위험이 전혀 없습니다.


버전 호환성

PostgreSQL 12-18 버전을 자동으로 감지하고 최적화된 기능을 제공합니다.


자연어 쿼리

복잡한 SQL 없이 평상시 쓰는 말로 데이터베이스를 분석할 수 있습니다.


종합 모니터링

성능, 용량, 연결 상태, 복제 등 모든 측면을 한 번에 확인 가능합니다.




Old vs. MCP-PostgreSQL-Ops


Old: 데이터베이스 모니터링을 위해 복잡한 SQL 쿼리를 작성하고, Grafana나 pgAdmin 같은 도구를 설정하고, 각종 대시보드를 구축해야 했습니다.


MCP-PostgreSQL-Ops: "현재 가장 많은 리소스를 사용하는 쿼리는 뭐야?"라고 자연어로 질문하면, AI가 실시간으로 분석 결과를 제공합니다.


SQL 전문가가 아니어도, 신입 개발자도, 심지어 비개발자도 복잡한 데이터베이스 상태를 쉽게 파악할 수 있게 됩니다.




QuickStart (5 Min)


배경

Docker-Compose 환경에서 진행.

테스트용 PostgreSQL 컨테이너 내장되어 있음.

다른 PostgreSQL 사용 시, docker-compose.yml에서 postgresql 주석처리. (샘플: docker-compose.custom-db.yml)


(상세 매뉴얼) https://github.com/call518/MCP-PostgreSQL-Ops/blob/main/README.md


1. Git 저장소 복제

git clone https://github.com/call518/MCP-PostgreSQL-Ops.git
cd MCP-PostgreSQL-Ops


2. .env 설정

### Check and modify .env file
cp .env.example .env

### No need to modify defaults, but if using your own PostgreSQL server, edit below:
POSTGRES_HOST=host.docker.internal
POSTGRES_PORT=15432
POSTGRES_USER=postgres
POSTGRES_PASSWORD=changeme!@34
POSTGRES_DB=ecommerce


3. Demo Containers 시작

# Start all containers including built-in PostgreSQL for testing
docker-compose up -d


4. OpenWebUI에 도구 등록

관리자 계정 생성 및 OpenWebUI에 로그인.
"설정" → "도구"로 이동.
http://localhost:8003/postgresql-ops 도구 주소 등록.
"관리자 패널" →"설정" → "연결"에서, Ollama 또는 OpenAI 사용 설정.


5. 완료




(선택사항) Claude Desktop 연결


cluade_desktop_config.json

{

"mcpServers": {

"postgresql-ops": {

"command": "uvx",

"args": ["--python", "3.11", "mcp-postgresql-ops"],

"env": {

"POSTGRES_HOST": "127.0.0.1",

"POSTGRES_PORT": "15432",

"POSTGRES_USER": "postgres",

"POSTGRES_PASSWORD": "changeme!@34",

"POSTGRES_DB": "ecommerce"

}

}

}

}


screenshot-claude-desktop-airflow-connections-html.png
screenshot-claude-desktop-mermaid-diagram.png




OpneWebUI 사용 Screenshots


screenshot-000.png

screenshot-001.png

screenshot-002.png

screenshot-004.png

screenshot-005.png




예시 질문들


get_server_info

"PostgreSQL 서버 버전과 확장 상태를 보여주세요."

"pg_stat_statements가 설치되어 있는지 확인해 주세요."


get_active_connections

"모든 활성 연결을 보여주세요."

"데이터베이스와 사용자별 현재 세션을 나열해 주세요."


get_postgresql_config

"모든 PostgreSQL 설정 매개변수를 보여주세요."

"메모리 관련 설정을 모두 찾아주세요."


get_database_list

"모든 데이터베이스와 크기를 나열해 주세요."

"소유자 정보와 함께 데이터베이스 목록을 보여주세요."


get_table_list

"ecommerce 데이터베이스의 모든 테이블을 나열해 주세요."

"public 스키마의 테이블 크기를 보여주세요."


get_table_schema_info

"ecommerce 데이터베이스의 customers 테이블에 대한 상세한 스키마 정보를 보여주세요."

"ecommerce 데이터베이스의 products 테이블에 대한 칼럼 세부사항과 제약조건을 가져와주세요."


get_database_schema_info

"ecommerce 데이터베이스의 모든 스키마와 내용을 보여주세요."

"ecommerce 데이터베이스의 sales 스키마에 대한 자세한 정보를 가져와주세요."


get_table_relationships

"ecommerce 데이터베이스의 customers 테이블에 대한 모든 관계를 보여주세요."

"ecommerce 데이터베이스에 대한 데이터베이스 전체 관계 개요를 가져와주세요."


get_user_list

"모든 데이터베이스 사용자와 역할을 나열해 주세요."

"특정 데이터베이스에 대한 사용자 권한을 보여주세요."


get_index_usage_stats

"인덱스 사용 효율성을 분석해 주세요."

"현재 데이터베이스에서 사용되지 않는 인덱스를 찾아주세요."


get_database_size_info

"데이터베이스 용량 분석을 보여주세요."

"크기별로 가장 큰 데이터베이스를 찾아주세요."


get_table_size_info

"테이블과 인덱스 크기 분석을 보여주세요."

"특정 스키마에서 가장 큰 테이블을 찾아주세요."


get_vacuum_analyze_stats

"최근 VACUUM과 ANALYZE 작업을 보여주세요."

"VACUUM이 필요한 테이블을 나열해 주세요."


get_current_database_info

"현재 연결된 데이터베이스가 무엇인가요?"

"현재 데이터베이스 정보와 연결 세부사항을 보여주세요."


get_table_bloat_analysis

"현재 데이터베이스의 테이블 블로트를 분석해 주세요."

"높은 블로트를 가진 테이블들과 VACUUM 유지보수가 필요한 테이블을 찾아주세요."


get_database_bloat_overview

"스키마별 데이터베이스 전체 블로트 요약을 보여주세요."

"모든 스키마에 걸친 저장소 효율성에 대한 고수준 보기를 가져와주세요."


get_autovacuum_status

"autovacuum 설정과 트리거 조건을 확인해 주세요."

"즉시 autovacuum 주의가 필요한 테이블을 보여주세요."


get_autovacuum_activity

"최근 48시간 동안의 autovacuum 활동 패턴을 보여주세요."

"autovacuum 실행 빈도와 타이밍을 모니터링해 주세요."


get_running_vacuum_operations

"현재 실행 중인 VACUUM과 ANALYZE 작업을 보여주세요."

"활성 유지보수 작업과 진행 상황을 모니터링해 주세요."


get_vacuum_effectiveness_analysis

"VACUUM 효과성과 유지보수 패턴을 분석해 주세요."

"수동 VACUUM 대 autovacuum 효율성을 비교해 주세요."


get_lock_monitoring

"모든 현재 잠금과 차단된 세션을 보여주세요."

"granted=false 필터로 차단된 세션만 보여주세요."


get_wal_status

"WAL 상태와 아카이빙 정보를 보여주세요."

"WAL 생성과 현재 LSN 위치를 모니터링해 주세요."


get_database_stats

"포괄적인 데이터베이스 성능 메트릭을 보여주세요."

"트랜잭션 커밋 비율과 I/O 통계를 분석해 주세요."


get_bgwriter_stats

"체크포인트 성능과 타이밍을 분석해 주세요."

"백그라운드 라이터 효율성 통계를 보여주세요."


get_user_functions_stats

"사용자 정의 함수 성능을 분석해 주세요."

"함수 호출 횟수와 실행 시간을 보여주세요."


get_table_io_stats

"테이블 I/O 성능과 버퍼 적중률을 분석해 주세요."

"버퍼 캐시 성능이 좋지 않은 테이블을 식별해 주세요."


get_index_io_stats

"인덱스 I/O 성능과 버퍼 효율성을 보여주세요."

"과도한 디스크 I/O를 유발하는 인덱스를 식별해 주세요."


get_database_conflicts_stats

"대기 서버에서 복제 충돌을 확인해 주세요."

"충돌 유형과 해결 통계를 분석해 주세요."


get_replication_status

"복제 연결과 지연 상태를 확인해 주세요."

"복제 슬롯과 WAL 수신기 상태를 모니터링해 주세요."


get_io_stats

"포괄적인 I/O 통계를 보여주세요."

"버퍼 캐시 효율성과 I/O 타이밍을 분석해 주세요."


get_bgwriter_stats

"백그라운드 라이터와 체크포인트 성능을 보여주세요."

"체크포인트 성능을 보여주세요."


get_server_info

"서버 버전과 호환성 기능을 보여주세요."

"이 PostgreSQL 버전에서 사용 가능한 MCP 도구가 무엇인지 확인해 주세요."


get_all_tables_stats

"모든 테이블에 대한 포괄적인 통계를 보여주세요."

"테이블 액세스 패턴과 유지보수 요구사항을 분석해 주세요."


get_pg_stat_statements_top_queries

"가장 느린 쿼리 상위 10개를 보여주세요."

"inventory 데이터베이스의 느린 쿼리를 분석해 주세요."


get_pg_stat_monitor_recent_queries

"실시간으로 최근 쿼리를 보여주세요."

"최근 5분간의 쿼리 활동을 모니터링해 주세요."




마무리

LLM과 연계되어 PostgreSQL 데이터베이스의 직관적 관리와 고품질의 정제된 정보를 받을 수 있습니다. 꼭 한번 Demo 진행해 보시길 바랍니다.


GitHub: https://github.com/call518/MCP-PostgreSQL-Ops


감사합니다.

keyword
작가의 이전글MCP for Airflow Cluster