MCP로 Claude Code에게 내 Prod 데이터베이스 접근 권한을 부여했다
Source: Dev.to

소개
지난 주에 나는 6개월 전이라면 불편했을 상황을 해냈다. Claude Desktop 설정을 열고, 내 프로덕션 Postgres 데이터베이스를 가리키는 MCP 서버 URL을 추가한 뒤 Claude에게 실제 고객 데이터를 보도록 요청했다.
아무 일도 일어나지 않았다.
나는 QueryBear를 꽤 오래 만들어 왔고, 항상 스테이징 데이터, 데모 데이터베이스, 시드 데이터를 사용해 테스트해 왔다. 프로덕션은 내가 보호해야 할 대상이었다.
하지만 같은 벽에 계속 부딪혔다. Claude와 디버깅 스레드에 깊이 파고들었을 때—Linear와 내 코드베이스에 연결된 상태—고객 이슈를 이해하는 데 90 % 정도 도달했다. 그 다음 데이터베이스 클라이언트로 전환해 사용자를 찾아보고, 몇 개의 조인을 작성하고, 결과를 눈여겨본 뒤, 그 결과를 다시 채팅에 복사했다. 매번 그렇다.
그냥 마찰일 뿐이다. 일주일에 이 과정을 다섯 번씩 반복하면서 나는 스스로에게 물었다: 왜 내가 여기서 병목이 되는 걸까?
Source: …
Claude Desktop 구성
그래서 AI와 내 데이터베이스 사이에 위치하는 MCP 서버를 만들었습니다. AI는 연결 문자열이나 자격 증명을 받지 않고; 도구 호출을 받아서 서버가 어떤 일이 일어날지 결정합니다.
Claude Desktop에 추가한 설정은 두 개의 필드였습니다:
{
"mcpServers": {
"querybear": {
"url": "https://mcp.querybear.com/mcp",
"headers": {
"Authorization": "Bearer qb_live_xxxxx"
}
}
}
}
Claude를 재시작하고 “지난 7일 동안 가입한 사용자는 몇 명인가요?” 라고 입력했습니다.
3초 후에 바로 답을 받았습니다—프로덕션 데이터에서 직접 가져온 정확한 답변이었습니다.
그 뒤에 가입자를 일별로, 그 다음에 추천 소스별로, 그리고 처음 쿼리를 만든 사용자를 교차 참조하도록 요청했습니다. 각 답변은 빠르게 돌아왔고 모두 정확했습니다.
놀라웠던 점은 작동했다는 것이 아니라, 내가 직접 만든 시스템이었음에도 불구하고 매우 자연스럽게 느껴졌다는 것입니다. 더 이상 컨텍스트 전환을 할 필요가 없었습니다. 이미 작업 중이던 같은 스레드 안에서 질문만 하면 되었습니다.
보안 파이프라인
내가 두렵지 않았던 이유: 모든 쿼리는 데이터베이스에 도달하기 전에 보안 파이프라인을 통과합니다.
- SQL 파싱 – 쿼리를 AST로 파싱합니다;
SELECT문만 허용됩니다. - 허용 목록 검사 – 테이블이 허용 목록에 있는지 검증합니다.
- 컬럼 제거 – 민감한 컬럼을 결과 집합에서 제외합니다.
- 행 제한 – 쿼리를 재작성하여 행 제한을 적용합니다.
- 타임아웃 – 오래 실행되는 쿼리는 서버 측에서 중단됩니다.
- 읽기 전용 트랜잭션 – 전체 작업이 읽기 전용 트랜잭션 내에서 실행됩니다.
- 로깅 – 모든 요청과 응답이 기록됩니다.
최악의 경우 AI가 “쿼리 거부” 응답을 받는 것이며, 이는 “앗, 프로덕션이었네”보다 훨씬 나은 실패 모드입니다.
작업 흐름에 미치는 영향
이전에는 고객 문제를 디버깅하는 것이 다음과 같은 의미였습니다:
- AI 스레드에서 티켓을 읽기.
- 데이터베이스 클라이언트로 탭 이동.
- 쿼리 작성.
- 결과를 채팅에 복사하기.
이제 티켓을 붙여넣고 “이 사용자의 계정을 조회하고 무슨 일이 일어나고 있는지 알려줘.”라고 말할 수 있습니다. 2‑4 단계는 사라집니다.
또한 이전에 쿼리를 작성할 필요가 없었던 일에도 사용하기 시작했습니다—개발 중 빠른 정상성 검사 등. 예를 들어: “그 마이그레이션이 실제로 새 컬럼을 채웠나요?” 버려지는 쿼리를 작성하는 대신 그냥 물어봅니다.
아직도 이를 개선하고 있지만, “데이터에 대해 AI에게 질문하고 실제 답을 얻는” 핵심 루프는 이미 작동하고 있으며 일상 업무 방식을 바꾸었습니다.
직접 해보기
시도해보고 싶다면, querybear.com 에서 몇 분 안에 설정할 수 있습니다. 그리고 이미 다른 방법으로 AI를 데이터베이스에 연결했다면, 보안 측면을 어떻게 처리했는지 궁금합니다. 저는 아직 어느 정도까지가 적절한지 고민 중입니다.