MCP 프로토콜 이해
MCP는 AI 어시스턴트와 외부 도구 간의 표준화된 인터페이스를 제공합니다. Claude는 도구를 검색하고, 필요에 따라 특정 인자와 함께 도구를 호출하며, 구조화된 응답을 받아 추론에 활용합니다. 통신은 stdio(표준 입출력)를 통해 JSON-RPC 메시지로 이루어지며, 이는 프로토콜의 단순성과 언어 독립성을 보장합니다.
서버 설정
모든 MCP 서버는 기본 초기화로 시작합니다. @modelcontextprotocol/sdk/server/index.js의 Server와 StdioServerTransport를 사용하여 서버를 설정하고, 서버의 기능(예: 도구 지원)을 선언합니다. 연결 후 서버는 Claude의 요청을 대기합니다.
도구 정의
도구는 MCP의 핵심이며, Claude에게 서버가 제공하는 기능과 사용 방법을 알려주는 계약서 역할을 합니다. 각 도구 정의는 다음 세 가지 필수 요소를 포함합니다.
-
고유 식별자:
name필드로 도구를 호출하는 데 사용됩니다. -
상세 설명:
description필드는 Claude가 도구를 언제, 어떻게 사용할지 이해하는 데 결정적인 역할을 합니다. 구체적이고 맥락을 포함한 설명은 Claude의 동작을 효과적으로 안내합니다. -
입력 스키마: JSON Schema 형식으로 모든 매개변수를 정의하며, 타입 안전성과 명확한 문서를 제공합니다.
required필드,type제약 조건,enum열거형,default값 및description을 포함합니다. SDK는 이 스키마를 기반으로 들어오는 요청을 자동으로 검증합니다.
요청 처리
MCP 서버는 두 가지 유형의 요청에 응답합니다.
-
도구 목록 요청 (ListToolsRequestSchema): Claude가 서버에 연결될 때 한 번 발생하며, 서버는 사용 가능한 모든 도구 정의 배열을 반환합니다.
-
도구 호출 요청 (CallToolRequestSchema): Claude가 도구를 사용하고자 할 때 도구 이름과 인자(스키마에 따라 이미 유효성 검사됨)를 보냅니다. 서버는
switch문 등을 사용하여 적절한 핸들러로 요청을 라우팅합니다.
인자 처리 및 보안
핸들러는 스키마에 따라 유효성 검사된 인자를 수신하지만, 특히 파일 경로 구성이나 시스템 명령 실행에 사용될 경우 추가적인 보안 유효성 검사가 필수적입니다. 예를 들어, preview_id에 대해 정규식(PREVIEW_ID_REGEX)을 사용하여 경로 탐색 공격(../../etc/passwd)을 방지해야 합니다. handleMermaidPreview 함수는 필수 및 선택적 인자를 추출하고, 보안 유효성 검사를 수행하며, 외부 도구(mmdc)를 실행하여 다이어그램을 렌더링하는 과정을 보여줍니다.
응답 형식
MCP 도구 응답은 표준 구조를 따릅니다. content 배열은 텍스트, 이미지 등 여러 정보를 반환할 수 있습니다. isError 플래그는 작업 실패 여부를 나타내며, Claude는 이를 통해 도구 호출 실패를 인지하고 사용자에게 알릴 수 있습니다.
여러 도구 노출
대부분의 MCP 서버는 여러 관련 도구를 노출합니다. claude-mermaid는 mermaid_preview (다이어그램 렌더링 및 미리보기)와 mermaid_save (렌더링된 다이어그램 파일로 저장) 두 가지 도구를 가집니다. 이는 사용자가 미리보기를 통해 다이어그램을 자유롭게 실험하고, 만족할 때만 저장하도록 하여 제어권을 부여합니다.
MCP 서버 디버깅
stdio 통신으로 인해 console.log()를 직접 사용할 수 없으므로, 파일 기반 로깅을 활용하는 것이 효과적입니다. 또한, 도구 핸들러에 대한 단위 테스트를 작성하여 MCP 프로토콜 전체를 실행하지 않고도 로직을 독립적으로 디버깅할 수 있습니다.
MCP 서버 배포
서버를 쉽게 설치할 수 있도록 package.json을 구성하고, 진입점 파일을 실행 가능하게 만들어야 합니다. 이후 npm install -g claude-mermaid로 설치하고 claude mcp add --scope user mermaid claude-mermaid 명령으로 Claude에 서버를 추가할 수 있습니다.