Claude Code용 MCP, 연결 성공만으로는 로그 누락을 놓칠 수 있습니다
요약
Claude Code용 MCP를 테스트할 때 단순히 연결 성공 여부만으로는 로그 누락이나 파싱 예외 같은 중요한 문제를 놓칠 수 있습니다. 본문은 공식 Python SDK의 `stdout_reader`를 분석하며, JSON-RPC 메시지 처리 시 필수 필드 부족으로 발생하는 오류와 이를 검수하는 방법을 제시합니다.
핵심 포인트
- 단순 연결 성공만으로는 로그 누락 및 파싱 예외를 놓칠 수 있습니다.
- 공식 Python SDK는 개행 구분된 줄을 `JSONRPCMessage`로 읽으며, 필수 필드가 부족할 경우 에러가 발생합니다.
- 테스트 시 합격 조건에 `errors == []`와 같은 상세 검증 로직 추가가 필요합니다.
- stderr 로그를 stdout으로 리다이렉션하는 점 등 환경적 요인도 고려해야 합니다.
Claude Code용 MCP는 단순히 연결 성공 여부만으로 검수할 경우 로그 누입(ログ混入)을 간과하여 도입 후 문제 분리에 시간을 소모하게 됩니다.
오늘 부팅 로그를 섞어보니, 에러가 발생했음에도 불구하고 덧셈은 통했습니다. 의외였습니다.
{"msg": "boot"}
이것 역시 에러가 되었습니다.
직접 가지고 있는 공식 Python SDK의 stdout_reader를 읽어보았습니다. 개행으로 구분된 각 줄을 JSONRPCMessage.model_validate_json에 전달하고 있습니다. 일반 JSON으로는 읽히더라도, JSON-RPC의 필수 필드가 부족합니다.
확인 환경은 Python 3.12.13, mcp 1.27.1, anyio 4.13.0, pydantic 2.13.4입니다. probe_stdio.py에 저장하고, 같은 환경에서 python3 probe_stdio.py를 실행합니다. 로컬 자식 프로세스로 완결됩니다.
import json
import sys
import anyio
...
실행 결과입니다. stderr에는 2가지 케이스에서 Failed to parse JSONRPC message from server라는 상세 내용이 나왔습니다.
plain: errors=['ValidationError'], add=3
json: errors=['ValidationError'], add=3
stderr: errors=[], add=3
SDK는 파싱 예외를 읽어오는 쪽으로 보내고 다음 줄을 읽습니다. message_handler에서 세어보니 stdout의 2가지 케이스에서 각각 1건씩입니다. 후속 응답은 도착했고, 덧셈도 통했습니다.
성공만 포착하는 테스트라면 이 차이는 사라집니다.
stderr에 남은 boot는 남아있었습니다. 부팅 로그는 역시 보고 싶습니다.
합격 조건에 errors == []도 추가합니다. 래퍼의 2>&1로 stderr의 로그가 stdout으로 돌아오는 점에도 주의해야 합니다.
이번에는 Python SDK의 stdio 경로를 측정했습니다. Claude Code 본체의 연결 가능 여부는 미확인입니다. 부팅 로그를 stderr로 보내고, 정상 응답과 파싱 예외 0건을 세트로 검수합니다. 앞으로는 부팅 래퍼도 검수에 포함하고 싶습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기