AI 에이전트가 5단계 중 3단계에서 실패했다면? 이제 어떻게 해야 할까요?
요약
AI 에이전트의 도구 사용 중 발생하는 실수와 데이터 삭제 위험을 방지하기 위한 프록시 솔루션인 ChronoMCP를 소개합니다. MCP 프로토콜을 활용하여 도구 호출을 분류하고, 인간의 승인을 거치며, 실패 시 Saga 패턴을 통해 자동으로 롤백하는 기능을 제공합니다.
핵심 포인트
- AI 에이전트의 다단계 작업 실패 시 발생하는 상태 변경 문제 해결
- ChronoMCP를 통한 도구 호출의 읽기/변경/파괴 분류 및 영향력 표시
- 인간의 승인 절차를 통한 위험한 도구 실행 제어
- LIFO Saga 방식을 이용한 결정론적 롤백 및 감사 로그 생성
AI 에이전트는 이제 단순히 _말하는 것_에 그치지 않습니다. 이제 도구(tools)를 통해 직접 행동합니다. 데이터베이스 사용자를 생성하거나, 이메일을 보내고, 카드를 결제하며, 테이블을 삭제(drop a table)합니다. 이것이 바로 Model Context Protocol (MCP)의 핵심 목적입니다. 즉, AI에게 실제 도구를 전달하는 보편적인 방법입니다.
이는 강력합니다. 또한 약간은 두렵기도 합니다.
2025년 7월, 한 AI 코딩 에이전트가 회사의 운영(production) 데이터베이스를 삭제하여 유명해진 사건이 있었습니다. 이름 기반의 혼동 — prod 대 staging — 은 빠르고 자신감 넘치며 도구를 휘두르는 에이전트가 저지르는 전형적인 실수입니다. 그리고 여기서 불편한 사실이 있습니다. 다단계 작업(multi-step task)에서 4단계가 실패했을 때, 실제 시스템에서는 1~3단계가 이미 실행(committed)된 상태라는 점입니다. Ctrl+Z는 없습니다.
오케스트레이터(Orchestrators) (Temporal, Restate, LangGraph)는 이를 사용자의 워크플로우 코드 내부에서 해결합니다. 하지만 MCP 서버가 _"이 도구는 상태를 변경(mutating)하며, 이 도구의 역작업(inverse)은 이러한 파라미터를 가진 저 도구이다"_라고 말할 수 있는 선언적(declarative)이고 프로토콜 수준의 방법은 없었습니다.
그래서 제가 하나 만들었습니다. 이름은 ChronoMCP이며, MIT 라이선스로 제공되고, 단 한 번의 npm install로 설치할 수 있습니다.
아이디어: 에이전트와 세상 사이의 투명한 가드(guard)
ChronoMCP는 어떠한 MCP 클라이언트와 어떠한 MCP 서버 사이에도 위치할 수 있는 프록시(proxy)입니다. 클라이언트를 이 프록시에 연결하면 도구 호출이 위험해지기 전까지는 모든 것이 변경 없이 통과됩니다. 그 후 ChronoMCP는 다음과 같은 작업을 수행합니다:
- 분류(Classifies): 모든 호출을
read(읽기) /mutating(변경) /destructive(파괴)로 분류합니다 (기본적으로 보수적으로 설정되어, 알 수 없는 호출은mutating으로 취급됩니다). - 인간이 읽을 수 있는 영향력 차이(impact diff) 표시: 실행 전 무엇이 변하는지 보여주며, PRODUCTION(운영 환경) 및 되돌릴 수 없는 작업을 플래그(flag)로 표시합니다.
- 인간의 승인에 따른 변경(mutations) 제어: 터미널 프롬프트, 정책, 또는 Slack과 같은 원격 제어 평면(remote control plane)을 통해 승인 과정을 거칩니다.
- 실패 시 롤백(Rolls back): LIFO saga 방식을 사용하여 결정론적(deterministically)으로 실패 시 되돌립니다.
- 해시 체인(Hash-chains) 기반의 감사 로그(audit log): 누구나 검증할 수 있는 로그를 생성합니다.
핵심: 선언적이고 정직한 보상(compensation)
서버는 도구별로 mcp-compensate라는 공개 확장을 통해 _어떻게 되돌릴 것인지(how to undo it)_를 선언합니다:
{
"name": "create_record",
"_meta": {
...
이제 서버를 보호하고 saga 모드를 켭니다:
npm install -g chronomcp
chronomcp guard --mode gate --saga -- node examples/server-demo/server.mjs
에이전트가 create_record (성공)를 실행한 후 charge_payment (실패)를 실행하면, ChronoMCP는 에이전트가 에러를 인지하기도 전에 완료된 단계들을 역순으로 거슬러 올라가며 보상(compensate) 작업을 수행합니다:
! ChronoMCP: 'charge_payment' failed — starting rollback of 1 step(s)…
✓ create_record: compensated (via delete_record)
제가 죽어도 옹호할 두 가지 설계 결정
롤백 경로에 LLM을 사용하지 않습니다. 보상 도구(compensating tool)와 그 매개변수는 _정적 선언(static declarations)_입니다. 왜일까요?
mcp-compensate 명세(spec)는 MCP SEP 프로세스를 목표로 하는 커뮤니티 초안(community draft)입니다. 만약 당신이 MCP 서버를 제작하는 개발자라면, 저는 진심으로 가차 없는 피드백을 받고 싶습니다 — 특히 이 어휘가 당신의 도구(tools)와 맞지 않는다면 더욱 그렇습니다. 이슈(issue)를 생성하여 어느 부분이 어색한지 저에게 알려주세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기