목표 및 범위
- 목적: Docusaurus 빌드 산출물을 IDE용 MCP 서버가 제공하도록 사이드카 컨테이너를 추가해 문서 참조 경험을 개선.
- 범위: 인덱서, MCP 서버, 배포/운영 구성, 관측성, 최소 인증. Docusaurus 콘텐츠 자체는 변경하지 않음.
- 비범위: 퍼블릭 노출, 검색 엔진 고도화(LTR 등), 문서 번역/작성 도구.
아키텍처 개요
- 배치: 동일 Pod에
doc-web(Nginx) + doc-mcp(Node) 사이드카. ReadOnly 공유 볼륨에 dist/apps/dta-wi-doc 마운트.
- 프로젝트 구성: Nx 별도 애플리케이션
apps/dta-wi-doc-mcp를 추가해 MCP 서버(런타임·의존성·테스트·배포 타깃)를 정적 사이트와 분리. 정적 사이트(apps/dta-wi-doc)는 그대로 유지해 Nginx 빌드 파이프라인 영향 최소화.
- 네트워크: Pod 내부 localhost 통신. 외부 노출은 내부망 Service/Ingress로 분리된 경로 또는 포트 사용(
/mcp/*).
- 데이터 소스: 기본은 정적 빌드 결과물(HTML/asset). 필요 시 MD/MDX 직접 파싱 옵션을 플래그로 제공.
- 버전 단일 소스:
libs/shared/version.json + apps/dta-wi-doc/versions.json을 읽어 MCP 리소스 메타에 반영.
MCP 기능 스펙(초안)
- 프로토콜:
@modelcontextprotocol/sdk HTTP(S)/SSE 서버. 로컬 개발용 stdio 옵션 유지.
- 트랜스포트: 기본 SSE, 프록시/방화벽 제약 시
streamable HTTP(NDJSON chunked 응답) 경로 제공. 클라이언트는 StreamableHTTPClientTransport로 접속 가능하도록 엔드포인트 명시.
- 리소스 URI:
doc:<version>:<slug> (예: doc:0.3.0:domains/chat/requirements).
- listResources: 버전/섹션(Architecture, Domains 등) 필터, 태그에 버전·섹션·언어 정보 포함.
- readResource: 본문(마크다운/텍스트), 원본 경로, 상대 링크를 반환. 요청 파라미터로 빌드본 vs 원본 선택.
- 툴:
searchDocs: 키워드·태그·버전 필터, 스니펫 상한/하이라이트.
getDocBySlug: 정확 매칭 반환.
listVersions: 사용 가능한 버전 및 기본 버전 노출.
health: 인덱스 해시, 로드 시각, 리소스 개수, 버전 일치 여부.
인덱싱 및 데이터 파이프라인
- Nx 타깃 추가:
dta-wi-doc:build (기존) → dist/apps/dta-wi-doc.
dta-wi-doc:index (신규) → 빌드 산출물/MDX 읽어 index.json 생성 후 dist/apps/dta-wi-doc/index.json에 저장.
- 인덱서 기능:
- 사이드바/버전 정보 동기화, 슬러그 생성 규칙 정렬.
- 본문 정제(코드블록/테이블 유지, HTML 제거 최소화), 메타데이터 태깅.
- 파일 경로 allowlist 적용으로 경로 탈출 방지.
- 품질 검증: 인덱스 생성 후 SHA/리소스 수/버전 매칭 스모크 테스트 실행.
보안 및 접근 제어
- 노출: 내부망 전용. Service/Ingress 레벨에서 차단.
- 인증: 최소 토큰 기반 헤더를 옵션으로 지원(
AUTH_TOKEN). 필요 시 mTLS 확장 가능.
- 레이트 리미트: 기본 쿼리 길이/빈도 제한, 대형 응답 상한 설정.
- 파일 접근: MCP 프로세스는 ReadOnly 볼륨만 접근, 허용 디렉터리 제한.
관측성
- 메트릭:
mcp_requests_total, mcp_errors_total, mcp_index_version, mcp_index_loaded_at, resource_hits.
- 로깅: JSON 구조화, 요청 ID/latency/쿼리 길이 기록, 슬로우 로그(예: 500ms 이상) 경고.
- 헬스체크:
/health에서 버전 일치 여부와 인덱스 해시 제공.
테스트 전략
- 단위: 인덱서(버전/슬러그/태그 추출), MCP 핸들러(list/read/search), 보안(경로 탈출 차단).
- 계약/스모크: 최신 버전 리소스 존재 확인, 슬러그 미스→404, 인증 미설정 시 거부(옵션 사용 시).
- 부하: 대형 문서 read/search 응답 시간 상한, 메모리 사용량 검증.
배포 전략
- 이미지:
doc-web(Nginx) 기존 이미지 + doc-mcp(Node) 신규 이미지. 동일 아티팩트(SHA) 기준으로 빌드.
- Pod 스펙: 공유 볼륨(ReadOnly) 마운트, 컨테이너별 리소스 요청/제한 분리. 롤링 업데이트 단위는 Pod.
- 롤백: 인덱스/정적 산출물을 동일 버전 묶음으로 관리해 이전 아티팩트로 되돌림.
진행 상황(업데이트 로그)
- 2025-11-28: 계획 초안 작성, 사이드카 아키텍처 및 스펙 합의 초안.
작업 항목 체크리스트
오픈 이슈
- 인덱스 소스 선택: 빌드 HTML vs 원본 MDX(검색 품질/추출 난이도 트레이드오프).
- 인증 강도: 내부망 한정 시 토큰 스킴만으로 충분한지, mTLS 필요 여부.
- 검색 엔진: 초기 Fuse.js로 시작 후 필요 시 외부 검색 서비스 연동 여부.