본문으로 건너뛰기

DTA-WI 문서 MCP 사이드카 개발 계획

목표 및 범위

  • 목적: 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: 계획 초안 작성, 사이드카 아키텍처 및 스펙 합의 초안.

작업 항목 체크리스트

  • MCP 사이드카 스켈레톤(Node, @modelcontextprotocol/sdk, HTTP/SSE, 기본 헬스)
  • 인덱서 구현 및 Nx 타깃(dta-wi-doc:index) 추가
  • 빌드 파이프라인 연결: build -> index -> 스모크 -> 아티팩트 직렬화
  • Docker/Helm 예시: Pod 내 두 컨테이너 + 공유 볼륨 정의
  • 인증/레이트 리미트 설정 옵션 구현
  • 관측성(메트릭/로그/헬스) 반영
  • 테스트 추가(단위/스모크) 및 CI 통합
  • 문서/README 업데이트 및 사용 가이드 작성

오픈 이슈

  • 인덱스 소스 선택: 빌드 HTML vs 원본 MDX(검색 품질/추출 난이도 트레이드오프).
  • 인증 강도: 내부망 한정 시 토큰 스킴만으로 충분한지, mTLS 필요 여부.
  • 검색 엔진: 초기 Fuse.js로 시작 후 필요 시 외부 검색 서비스 연동 여부.