📊 sunnypoint
개발일지

2026-07-23

4분 읽기

내부 MCP 패키지 배포 호환성 복구 — 토스 Broken pipe 원인 추적과 해결

JYP 주식 분석 프로세스를 수행하던 중 국내 차트 도구 호출 시 지속적인 Broken pipe 에러가 발생하는 현상을 발견하고 원인을 추적했다. 처음에는 토스 API나 차트 데이터 자체의 통신 오류라고 생각했으나, 샌드박스 내부 프로세스를 정밀 진단해 보니 원인은 전혀 달랐다. 최근 토스 MCP 모듈을 분할 리팩터링하면서 공용 형제 모듈인 새로 만들었는데, 샌드박스 배포 매니페스트에는 단일 엔트리포인트 파일만 등록되어 있어 배포 환경에서 누락된 것이 문제였다.

이로 인해 프로세스 초기화 시점에 ModuleNotFoundError가 발생하며 곧바로 종료되었고, Stdio MCP 클라이언트는 이미 닫힌 프로세스의 Stdin에 요청을 전송하면서 표면적으로 Broken pipe 에러만 노출하고 있었다. 심지어 기존 에러 핸들링 구조에서는 Stderr 로그를 소비만 하고 버리고 있어 실제 원인이 완전히 은폐되어 있었다. 이에 따라 내부 MCP의 공식 배포 단위를 개별 엔트리포인트 파일이 아닌 mcp_servers Python 패키지 전체로 고정하고, 샌드박스 매니페스트가 패키지 하위의 모든 파일과 디렉터리를 재귀적으로 추적하여 업로드 및 동기화하도록 전환했다.

동시에 MCP 클라이언트가 프로세스 종료 시 최근 8KB의 Stderr 기록을 보관하여 명확한 오류 원인과 서버명, 종료 코드를 반환하도록 개선했다. 이제 누락된 모듈이나 초기화 오류가 발생하더라도 껍데기뿐인 파이프 에러 대신 정확한 예외 문구를 즉시 확인할 수 있게 되었다. 배포 계약 수정 및 Stderr 로깅 보완 후 42개의 관련 단위 테스트와 static 분석을 모두 통과하는 것을 검증하며 내부 MCP 안정성을 확보했다.

데이터 파이프라인 버그 패치 — DART, 키움, KRX MCP 스택 정비

종목 분석 리포트를 생성하는 과정에서 일부 데이터 필드에 N/A가 출력되던 문제를 진단하고 시스템 코드를 정비했다. 가장 먼저 MCP 서버 설정에서 DART 및 ECOS 서버의 환경변수 passthrough 구문이 누락된 것을 확인하여 API 키 연동 단계를 정상화했다. 또한 한국 주식 리포트 스킬(kr-stock-report) 내에서 도구 반환값인 JSON 문자열에 직접 .get() 메서드를 호출하다가 발생하던 AttributeError를 발견하고, json.loads() 파싱 과정을 추가하여 데이터 추출 버그를 깔끔하게 해결했다.

KRX 시장 데이터 도구 역시 안정성을 한층 강화했다. 도구 별칭(get_krx_stock_info)을 추가하여 모듈 임포트 실패를 사전에 방지하도록 조치했고, 장마감 전이나 휴일 조회 시 공매도 데이터가 비어버리는 현상을 막기 위해 최근 5영업일 데이터를 자동으로 소급 조회하는 Fallback 로직을 작성했다. 이로써 시장 상황이나 조회 시점에 구애받지 않고 언제나 균일한 데이터 품질을 유지할 수 있게 되었다.

SK하이닉스·삼성전자 실측 검증과 JYP v2 리포트 가동

버그 패치를 완료한 뒤 SK하이닉스(000660)와 삼성전자(005930) 두 대표 종목을 대상으로 전체 파이프라인 실측 데이터 검증을 진행했다. DART의 연결 재무제표 데이터, 키움 30일 외인 및 기관 수급 데이터, 컨센서스 및 KRX 공매도 잔고 데이터가 모두 오차 없이 수집되는 것을 확인했다.

수집된 데이터를 바탕으로 나의 블로그 규격 가이드라인에 맞추어 BLUF, 4x2 KPI Grid, 수급 분석 차트, Risk & Catalyst 카드 그리드, 시나리오 분석 박스 등 다채로운 컴포넌트가 조화롭게 배치된 최신 스타일의 주식 분석 리포트를 성공적으로 생성하여 노션 하위 페이지로 공유 완료했다.

오늘의 소감

머지 작업을 하거나 다른 업데이트를 하면서 함수의 변화등을 한번식 놓치는 케이스가 있었던거 같다.

#개발일지

의견 나누기

💬 GitHub Discussions 댓글 위젯 영역 (Giscus 활성화 예정)