본문으로 건너뛰기

© 2026 Molayo

Zenn헤드라인2026. 05. 23. 12:39

AI의 제안에 사용자가 동의했다는 증적을 남기는 MCP를 만들었다

요약

AI 에이전트가 수행하는 작업에 대해 사용자의 동의를 기록하고 증적을 남길 수 있는 MCP(Model Context Protocol) 서버 구현 사례를 소개합니다. GitHub의 커밋 히스토리를 활용하여 위조가 어려운 감사 로그를 생성하는 메커니즘을 다룹니다.

핵심 포인트

  • 에이전트 대화 내에서 완결되는 사용자 동의 프로세스 구현
  • MCP 서버를 통한 범용적인 동의 관리 도구 제공
  • GitHub 커밋 히스토리를 활용한 위조 방지형 증적 저장
  • 증적 저장 성공 시에만 실행을 허가하는 안전한 설계

toC용 AI 에이전트 (AI Agent)를 만들다 보면, 사용자의 동의를 기록하고 싶은 상황이 있다.

예를 들어 사용자를 대신하여 외부 서비스로 데이터를 전송하거나 등록을 에이전트가 대행할 때, "사용자가 이 내용에 동의했다"라는 증적 (Evidence)이 필요하다.

정형적인 동의라면 브라우저로 열면 된다

웹 서비스의 이용약관과 같은 정형화된 문구라면, 동의 페이지를 브라우저로 열어 체크를 하게 만드는 방법이 있다. 그것은 단순한 UI가 아니라, 누가·언제·무엇에 동의했는지에 대한 기록이다.

문제는 AI 에이전트의 경우, 제안 내용이 매번 다르다는 점이다. 에이전트가 상황에 맞춰 제안한 내용에 대한 동의도 남기고 싶다.

에이전트 안에서 완결하고 싶다

브라우저를 열게 하는 것은 사용자 경험 (UX) 측면에서 무겁다. CLI든 채팅이든, 에이전트와의 대화 속에서 완결시키고 싶다.

에이전트 측에 함수 (Function)를 정의하면 구현은 가능하다. 하지만 동의 취득 로직을 에이전트마다 작성하는 것은 비효율적이고, 증적의 견고성도 제각각이 된다. 범용적인 메커니즘으로서 분리하고 싶었다.

MCP 서버로 만들었다

그래서 동의 관리를 MCP (Model Context Protocol) 서버로 구현했다.

에이전트는 3가지 도구 (Tool)를 순서대로 호출하기만 하면 된다.

1. consent.request.fixed: 사용자에게 확인문을 제시
2. consent.judge.fixed: 답변을 판정
3. consent.evidence.commit: 증적을 저장

consent.request.fixed를 호출하면, 사용자에게 보여줄 확인문이 생성된다.

다음 내용으로 실행해도 될까요?
대상: 〇〇
전송처: 〇〇
...

사용자가 이 문구를 그대로 답장하면 consent.judge.fixed로 판정한다. "뭐, 괜찮겠지"와 같은 애매한 답변은 통과되지 않는다. 판정 결과는 4가지 패턴이다.

accepted → 다음 단계로
rejected → 실행하지 않음
unclear → 재확인 유도
...

위조할 수 없는 로그로서 Git을 사용한다

증적의 저장소는 GitHub Private Repository의 커밋 히스토리 (Commit History)로 정했다.

커밋 히스토리는 추가 전용 (Append-only) 방식이라 나중에 내용을 수정하기 어렵다. 전용 DB나 스토리지 (Storage)를 구축하지 않아도, 이미 가지고 있는 GitHub가 그대로 감사 로그 (Audit Log)가 된다.

GitHub에 저장되는 것은 다음과 같은 JSON이다. 개인 정보는 포함하지 않고, 해시 (Hash)와 라벨 (Label)만 포함한다.

{
"consent_id": "consent_01KS...",
"status": "accepted",
...
}

증적 로그 리포지토리: https://github.com/tomohiro-owada/ai-consent-audit-log

판정만으로는 실행시키지 않는다

동의 판정이 통과되더라도, GitHub에 증적 저장이 성공할 때까지 실행을 허가하지 않는 설계로 만들었다.

consent.judge.fixed → accepted (판정은 OK지만 실행은 아직 불가)
consent.evidence.commit → 성공 (여기서 처음으로 execution_allowed: true)

로그가 남지 않으면 작동하지 않는다는 제약을 서버 측에 가짐으로써, 에이전트 측의 실수나 생략을 방지한다.

Discussion

AI 자동 생성 콘텐츠

본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0