DB·Git·공시를 에이전트에게 안전하게 여는 MCP 서버 모음
mcp-* 디렉토리 하나가 서버 하나. 루트 Makefile 하나로 빌드·테스트·실행합니다.
make new NAME=jira 로 같은 규칙의 서버 뼈대가 생깁니다.
mcp-mysql은 SELECT만 통과시키고 민감 컬럼을 가립니다.
make registry 가 Claude Code·Cursor용 .mcp.json을 만듭니다.
MCP 서버를 하나씩 만들다 보면 저장소마다 인증, 로그, 테스트, 클라이언트 설정 방법이 달라집니다. 새 서버를 붙일 때마다 같은 결정을 다시 합니다. 그래서 규칙은 루트에 한 번, 서버는 디렉토리 하나로 정했습니다.
vibe-mcp/
├── Makefile # 모든 mcp-*를 같은 명령으로 다룸
├── mcp.schema.json # 각 서버 manifest 형식
├── shared/ # 공통: 설정 로딩, 감사 로그, 결과 크기 제한
├── templates/mcp-ts/ # make new NAME=... 의 뼈대
├── mcp-mysql/ # 읽기 전용 SQL 조회
├── mcp-git/ # 저장소 이력·diff 조회
├── mcp-docs/ # Markdown 문서 검색
├── mcp-dart/ # OpenDART 공시 조회 (vibe-post-it와 공유)
└── mcp-slack/ # Block Kit 메시지 전송각 mcp-* 디렉토리는 세 가지만 지키면 됩니다.
mcp.yaml manifest: 이름, 전송 방식(stdio·HTTP), 도구 목록, 위험 등급(read·write·external)Makefile에 build, test, run 타깃README.md에 도구별 입력·출력 예시SERVERS := $(patsubst %/,%,$(wildcard mcp-*/))
list: ## 서버 목록과 위험 등급
@for s in $(SERVERS); do printf "%-14s %s\n" $$s "$$(yq '.risk' $$s/mcp.yaml)"; done
build test lint: ## 모든 서버에 같은 타깃 실행
@for s in $(SERVERS); do $(MAKE) -C $$s $@ || exit 1; done
run: ## make run MCP=mysql
@$(MAKE) -C mcp-$(MCP) run
inspect: ## MCP Inspector로 도구 확인
npx @modelcontextprotocol/inspector $(MAKE) -C mcp-$(MCP) run
new: ## make new NAME=jira
cp -r templates/mcp-ts mcp-$(NAME) && sed -i "s/__NAME__/$(NAME)/g" mcp-$(NAME)/mcp.yaml
registry: ## 클라이언트 설정(.mcp.json) 생성
node scripts/registry.mjs $(SERVERS) > .mcp.jsonDB를 에이전트에게 여는 서버라 가장 먼저, 가장 엄격하게 만듭니다.
| 위험 | 막는 방법 |
|---|---|
| 데이터 변경 | 읽기 전용 DB 계정 + SQL 파서로 SELECT·SHOW·EXPLAIN만 통과 |
| 무거운 쿼리 | MAX_EXECUTION_TIME 힌트, 결과 행 수 상한 |
| 민감 컬럼 | 컬럼 이름 패턴(password, token, ssn) 마스킹 |
| 접속 정보 노출 | DSN은 환경변수로만, 도구 결과·로그에 출력하지 않음 |
| 추적 불가 | 모든 호출을 shared 감사 로그에 기록(질의 해시, 행 수, 소요 시간) |