OpenCode 대화 이력 영구 저장을 위한 MCP(Model Context Protocol) 개발기
1. MCP 활용 배경
💡 시도하고자 했던 것과 그 이유
"인터페이스"를 주제로 새로운 기술을 공부하고 구현해 볼 고민을 하던 중, 스터디장님이 공유해주신 MCP(Model Context Protocol) 자료를 접하고 '바로 이거다'라는 확신이 들었습니다.
당시 회사에서 제공하는 AI 툴인 OpenCode를 유용하게 사용하고 있었지만, 한 가지 치명적인 아쉬움이 있었습니다. 이전 대화 내용이나 AI가 제시한 코드 솔루션을 다시 찾을 수 없다는 점이었습니다. 대화 내용이 휘발성으로 사라지다 보니 매번 같은 질문을 반복하거나 기록을 놓치기 일쑤였습니다.
만약 'ChatLog'를 단발성 대화가 아닌, 지속적으로 저장하고 검색할 수 있는 장기 기억(Long-term Memory) 형태로 구축할 수 있다면 이 문제를 완벽히 해결할 수 있을 것 같았습니다. 나아가 이 를 성공적으로 구현한다면, 사내 동료들에게 배포하여 업무 생산성을 높이는 훌륭한 모범 사례(Best Practice)가 될 것이라 확신했습니다.
2. MCP 활용을 위한 도구와 방법
🛠️ 문제 해결과 구현 과정
🔍 1단계: OpenCode 대화 데이터 추적 (시행착오)
가장 먼저 OpenCode가 Claude처럼 대화 내용을 내부적으로 jsonl 형태로 저장하는지 확인해야 했습니다. 하지만 시작부터 난관에 봉착했습니다.
로컬 디렉터리 탐색:
.opencode설치 경로와 로그 폴더를 샅샅히 뒤졌으나 대화 로그는 존재하지 않았습니다.DB 파일 분석: 탐색 끝에
opencode.db파일을 발견했으나, 테이블 중 오직content(대화 내용)테이블만 비어 있는 상태였습니다.이슈 확인: 확인 결과, 이는 이미 알려진 알려진 오픈소스 이슈였습니다 (GitHub Issue #10592).
💡 2단계: 해결의 실마리, /export와 Hook
퇴근길에 Claude와 집요하게 대화를 나누며 상황을 설명한 끝에 결정적인 힌트를 얻었습니다. 바로 OpenCode의 내장 명령어인 /export 기능이었습니다.
출근하자마자 테스트해 보니 대화 내용이
.md파일로 정상 저장되는 것을 확인했습니다.하지만 터미널을 실행한 현재 디렉터리에만 수동으로 저장되는 한계가 있었습니다. 자동으로 로그를 수집하기에는 역부족이었습니다.
⚙️ 3단계: TypeScript Hook 기반 자동 저장 구현
자동화를 위해 Claude가 제시한 Hook 개념을 도입했습니다. 대화가 끝나는 시점을 감지해 파일로 자동 저장하는 TypeScript 플러그인을 작성하고 config.json에 연동했습니다.
opencode.json 설정
JSON
{
"$schema": "https://opencode.ai/config.json",
"plugin": ["./plugins/save-messages.ts"]
}
결과: 드디어 원하던 로컬 경로에 대화 로그가 자동으로 저장되기 시작했습니다!
추가적으로 원하는 형식으로 나오게 하기까지 과정이 좀 있었지만
일단 이제 본격적으로 chatlog 가이드로 mcp 를 만들기 시작 했습니다.
🏠 4단계: 환경의 전환
사내 LLM을 활용해 MCP 인프라를 구축하려 했으나, 내부 모델의 성능 한계로 인해 Tool Call이 실패하거나 엉뚱한 답변을 내놓는 문제가 발생했습니다.
결국 퇴근 후 집에서 Claude를 활용해 본격적인 개발을 이어가기로 결정했습니다.
집 PC에 OpenCode를 새로 설치하고 회사와 동일한 환경을 셋팅했습니다.
Hook을 재설정하고, 수집된 로그를 분석하기 좋은
jsonl규격으로 변환해 주는 TypeScript 코드를 고도화했습니다. 이 과정에서 많은 시행착오가 있었지만 결국 원하는 UI 화면에 내 대화 이력이 깔끔하게 출력되는 감격스러운 순간을 맞이했습니다.
한국사이트 스크린샷
🚀 5단계: MCP 서버 등록 및 최종 테스트
구현한 Chat Tracker를 MCP 컴포넌트로 등록하기 위해 opencode.jsonc 설정을 마쳤습니다.
opencode.jsonc MCP 등록 설정
{ "$schema": "https://opencode.ai/config.json",
"plugin": ["./plugins/save-messages.ts"],
"mcp":
{
"chattracker":
{
"type": "remote",
"url": "http://localhost:7373/mcp",
"enabled": true
}
}
}이후 OpenCode 인터페이스를 통해 "과거 이력에 대해 알려줘"라고 요청하자, LLM이 컨텍스트를 정상적으로 이해하고 chattracker MCP 서버와 성공적으로 통신하며 이전 답변을 훌륭하게 찾아주었습니다. (최종 터미널 및 UI 테스트 스크린샷 참고)
한국어 텍스트가 있는 검은 화면