나의 쳇 로그를 담고 MCP로 활용하다

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 테스트 스크린샷 참고)

한국어 텍스트가 있는 검은 화면
한국어 텍스트가 있는 화면의 스크린샷
한국어 텍스트가 있는 웹사이트의 스크린샷
검은 화면에 한국어 스크린샷

3. 결과 및 배운 점

🧠 이번 프로젝트를 통해 배운 점

  • Hook과 이벤트 핸들러의 명확한 이해: 이번 스터디를 통해 Hook의 메커니즘을 확실하게 정립했습니다. 이를 '이벤트 핸들러' 개념으로 접근하니 구조가 명확해졌습니다.

    • 이벤트(Event): AI와의 대화가 종료되는 시점

    • 핸들러(Handler): 대화 이벤트 데이터(컨텐츠)를 받아 지정된 경로에 파일로 저장하는 로직

⚠️ 주요 시행착오

  • 대화 내용 추출 가시화: OpenCode의 내부 아키텍처 한계로 인해 대화 내용을 파싱하고, 이를 정제된 jsonl 파일로 완벽하게 떨어뜨리는 초기 단계에 가장 많은 시간과 노력을 투자했습니다. 환경 차이(opencode vs Claude)에서 오는 파싱 싱크를 맞추는 것도 까다로운 숙제였습니다.

🔮 앞으로의 계획

  • 사내 검증 및 배포: 집에서 성공적으로 빌드한 이 프로젝트 코드를 다시 회사 환경으로 가져가 정상 동작 여부를 정밀 테스트할 예정입니다.

  • 솔루션 고도화: 발견되는 버그나 예외 상황을 보완하여 안정성을 높인 후, 팀원들과 주변 동료들에게 배포하여 팀 전체의 AI 생산성을 높이는 BP(Best Practice) 도구로 확장하고 싶습니다.

1
1개의 답글

뉴스레터 무료 구독