
AI 에이전트의 '복사 붙여넣기 배달부' 역할 그만하기: agmsg로 Devin CLI와 Claude Code 간의 태스크 전달 시도해보기
요약
여러 CLI AI 에이전트 간의 메시지 전달을 자동화하는 초경량 도구 agmsg를 소개합니다. SQLite를 활용해 서버나 데몬 없이도 Claude Code와 Devin CLI 같은 에이전트들을 연결하는 메커니즘을 다룹니다.
핵심 포인트
- agmsg는 SQLite 기반의 초경량 공유 게시판 방식으로 에이전트를 연결함
- MCP 서버나 별도의 메시지 브로커 없이 bash와 sqlite3만으로 동작함
- monitor, turn 등 4가지 수신 알림 모드를 지원하여 레이턴시 조절 가능
- 에이전트 간의 논리적 제어는 트랜스포트가 아닌 프롬프트 계층에서 수행됨
여러 개의 CLI형 AI 에이전트를 병용하다 보면 흔히 겪게 되는 순간이 있습니다. Claude Code에게 구현을 시키고, 그 결과를 Devin에게 리뷰하게 하고 싶습니다. 하지만 두 에이전트는 직접 연결되어 있지 않기 때문에, 제가 한쪽의 출력을 복사해서 다른 쪽의 프롬프트에 붙여넣습니다. 이 '인간 복사 붙여넣기 배달부' 역할을 하루에도 몇 번씩 반복하다 보면, '이거 에이전트들끼리 알아서 주고받을 수는 없는 걸까?'라는 생각이 들기 마련입니다.
그런 과제에 딱 맞는 도구를 발견했습니다. agmsg(제작자: fujibee 님, MIT 라이ance)입니다. Claude Code, Codex, Gemini CLI 등의 CLI 에이전트들을 인간을 거치지 않고 메시지로 연결하는 메커니즘입니다.
다만, 공식적으로 지원되는 에이전트 유형에 Devin(Devin for Terminal)은 포함되어 있지 않습니다. 그래서 저는 'Devin CLI를 agmsg의 대열에 합류시킬 수 있을까?'를 실제로 직접 움직이며 검증해 보았습니다. 이 기사는 agmsg의 메커니즘 해설과 Devin × Claude Code의 연계 검증을 정리한 것입니다.
agmsg를 한마디로 정의하자면, **CLI 에이전트용 초경량 '공유 게시판'**입니다. 흥미로운 점은 공식 README가 '이것은 ○○이 아니다'라는 점을 먼저 강조하고 있다는 것이며, 여기에 설계 사상이 응축되어 있습니다.
| 흔한 오해 | agmsg의 실제 |
|---|---|
| MCP 서버의 일종 아닌가요? | 아닙니다. MCP 서버도 추가 런타임도 필요 없습니다. 실체는 bash + sqlite3 뿐입니다. |
| 서브 에이전트 기능 아닌가요? | 아닙니다. 부모가 자식을 관리하는 것이 아니라, 서로 다른 도구의 대등한(peer) 세션끼리 연결합니다. |
| 메시지 큐(브로커) 아닌가요? | 아닙니다. 브로커는 존재하지 않습니다. "SQLite 파일이 바닥이고, 에이전트는 그 위의 플레이어입니다." |
제가 처음 이 설계를 읽었을 때, '데몬(Daemon)도 서버도 네트워크도 없는데 성립이 가능한가?'라며 반신반의했습니다. 답은, 공유된 단 하나의 SQLite 파일에 모두가 읽고 쓰는 것뿐이라는 것이었습니다.
메시지는 ~/.agents/skills/agmsg/db/messages.db라는 단일 SQLite(WAL 모드)에 저장됩니다. 스키마는 허탈할 정도로 소박하며, messages(team, from_agent, to_agent, body, created_at, read_at)라는 테이블이 있을 뿐입니다.
WAL 모드이므로 '복수 리더 + 단일 라이터'가 경합 없이 공존할 수 있습니다. 전송은 send.sh가 한 줄의 INSERT를 수행할 뿐이고, 수신은 inbox.sh가 자신에게 온 미독 메시지를 읽고 읽음 처리할 뿐입니다. 데몬도 소켓도 없습니다.
수신 알림 방식(delivery mode)은 4가지 중에서 선택할 수 있습니다.
| 모드 | 메커니즘 | 레이턴시 (Latency) | 적합한 대상 |
|---|---|---|---|
| monitor (Claude Code 기본값) | SessionStart 훅 → Monitor 도구로 블로킹 구독 | 약 5초 | 실시간 push를 원하는 Claude Code |
| turn | Stop 훅이 턴 종료 시마다 수신함을 확인 | 다음 대화까지 | Monitor 도구를 갖추지 않은 Codex 등 |
| both | monitor 방식 + turn을 보조로 사용 | 약 5초 | 두 방식을 모두 사용하고 싶은 사람 |
| off | 자동 전달 없음. 수동 /agmsg만 가능 | 수동 | 미니멀리스트 |
그리고 턴을 양보하거나 폭주 루프를 방지하는 것은, 트랜스포트(agmsg 본체)가 아니라 프롬프트 = 프로토콜(Protocol) 계층에 맡겨져 있다는 점이 중요한 포인트입니다. agmsg는 의도적으로 '똑똑하지 않은 바닥' 역할에 충실합니다.
여기서 서두의 문제로 돌아가겠습니다. agmsg가 공식적으로 인식하는 에이전트 유형을 확인해 보면 Devin은 포함되어 있지 않습니다. 실제로 Devin을 유형으로서 join.sh(팀 참가)에 전달했을 때, 명확하게 거부되었습니다.
$ ~/.agents/skills/agmsg/scripts/join.sh startdevin devin devin "$(pwd)"
Unknown agent type: 'devin' (supported: antigravity, claude-code,
codex, copilot, cursor, gemini, grok-build, hermes, opencode)
"그럼 안 되는 건가"라고 생각했지만, agmsg의 소스 코드를 읽고 깨달았습니다. 팀 등록(join)을 요구하는 것은 모니터링 모드나 자동 배포 메커니즘뿐입니다. 메시지 송수신을 담당하는 send.sh와 inbox.sh는 팀 설정을 전혀 참조하지 않습니다. 그저 SQLite 테이블에 대해 (team, from, to)라는 단순한 문자열로 읽고 쓸 뿐입니다.
이것은 README에 있는 "Shell (any agent)" 경로 그 자체입니다. Devin은 셸(Shell)을 실행할 수 있으므로, send.sh/inbox.sh를 직접 호출하면 드라이버가 없어도 공유 플로어(shared floor)에 완전히 참여할 수 있을 것이라는 가설이 세워졌습니다. 이제 실행해서 확인해 볼 일만 남았습니다.
먼저 agmsg를 설치합니다. npx agmsg가 가장 빠르지만, 저는 동작 방식을 읽고 싶었기에 리포지토리(Repository)를 클론(clone)하여 설치했습니다.
git clone https://github.com/fujibee/agmsg.git
cd agmsg
./install.sh --cmd agmsg --agent-type claude-code
...
다음으로 Claude Code 측을 팀에 참여시킵니다. 팀 이름은 이번에 startdevin으로 정했습니다.
SK=~/.agents/skills/agmsg/scripts
$SK/join.sh startdevin cc claude-code "$(pwd)"
# → Created team: startdevin / Joined team startdevin as cc
Devin 측은 앞서 언급한 대로 "join이 불필요"합니다. 에이전트 이름 devin으로서 생(raw) 스크립트로 송수신하게 합니다. Devin에게는 수신함 읽는 법과 답장하는 법을 비대화형 모드(devin -p) 프롬프트(prompt)를 통해 가르칩니다.
# Devin에게 전달할 프롬프트(prompt-file)
cat > task.md <<'EOF'
당신은 "agmsg"에 "devin"으로서 참여하고 있습니다.
...
devin -p --permission-mode dangerous --prompt-file task.md와 같이, 비대화형 모드에서 확인 프롬프트에 막히지 않도록 호출합니다(--permission-mode에 대한 자세한 내용은 지난 기사를 참조).
시나리오는 간단합니다. Claude Code가 Devin에게 조사 태스크를 통째로 맡기고, Devin이 이를 실행하여 결과를 반환하는 것입니다. 먼저 Claude Code(cc)로부터 송신합니다.
$SK/send.sh startdevin cc devin \
"이 리포지토리의 articles/ 디렉토리 아래에 있는 .md 파일의 총 개수를 세어서, agmsg로 cc에게 답장해줘"
# → Sent to devin in team startdevin
이 시점에서 SQLite에는 cc → devin의 읽지 않은 메시지(read_at = NULL)가 한 줄 들어 있습니다. 여기서 Devin을 실행하면, Devin은 수신함을 읽고 스스로 파일을 센 뒤, send.sh로 답장을 보냅니다. Devin 자신의 최종 출력은 다음과 같습니다.
작업을 완료했습니다.
- articles/ 디렉토리 아래의 .md 파일 총 개수: 50개
- qiita/drafts: 28개 / qiita/published: 14개
...
그리고 Claude Code 측에서 수신함을 확인하면, Devin으로부터의 답장이 제대로 도착해 있었습니다.
$ $SK/inbox.sh startdevin cc
1 new message(s):
[2026-07-01T05:48:15Z] devin: articles/ 디렉토리 아래의 .md 파일 총 개수는 50개입니다.
...
사람의 복사 붙여넣기는 한 번도 발생하지 않았습니다. Claude Code가 던지고, Devin이 받아 처리하여 돌려주는 이 일련의 과정은 공유된 SQLite 파일 1개 위에서만 완결되었습니다.
한 방향성만으로는 '대등하다(peer)'고 할 수 없습니다. 이번에는 Devin을 시작점으로 삼아 Claude Code에게 질문을 던지게 합니다.
Devin에게 '기사 파일명을 제안해 달라고 cc에게 물어봐'라고 지시하자, Devin은 그 질문을 전송했습니다. Claude Code 측에서 수신하여 답변을 돌려줍니다. 최종적인 전체 트랜스크립트(history.sh)는 다음과 같습니다( ○ = 읽음, ● = 안 읽음. 날짜와 본문은 보기 쉽도록 발췌 및 정리했습니다).
○ [05:47:24Z] cc → devin: 작업 요청입니다. articles/ 하위의 .md 파일 총 개수를 세어 회신해 주세요.
○ [05:48:15Z] devin → cc: .md 파일의 총 개수는 50개입니다. 내역은 qiita/drafts에 28개...
○ [05:48:59Z] devin → cc: agmsg 블로그를 작성합니다. 신규 기사의 파일명을 하나 제안해 주세요.
...
덧붙여, 이 기사의 파일명 0701-agmsg-devin-claude-code-handoff.md는 실제로 이 검증 과정 중에 agmsg 위에서 Devin에게 질문을 받고 Claude Code가 답변한 것입니다. 기사 이름이 기재된 소재인 agmsg 자체를 기반으로 정해진, 묘한 중첩 구조가 되었습니다.
실제로 돌려보면 '작동한다'는 점뿐만 아니라 '주의할 점'도 보였습니다. 제가 걸리거나 의식했던 포인트를 남겨둡니다.
| 논점 | 실제 상황 |
|---|---|
| Devin의 자동 수신 | 할 수 없다. Devin은 드라이버가 없어 monitor/turn 훅이 들어가지 않는다. 수신은 devin -p에 'inbox.sh를 실행해라'라고 매번 지시하는 풀(pull) 방식이 된다 |
| 한 번 작업용 | 위의 반대로, 상주하며 대기하기보다, 시작 시 프롬프트에 '수신 → 작업 → 회신'을 압축하여 1턴으로 돌리는 사용법과 궁합이 좋다 (agmsg의 spawn /--boot-prompt는 claude-code/codex 전용이며, Devin의 시작은 여기서 보완한다) |
| 동일 작업의 다툼 | v1에는 클레임/락이 없다. 같은 이름을 여러 개가 구독하면 양쪽 모두 반응할 수 있다. 중지 조건은 프롬프트 측에서 ('N회 왕복으로 종료' 등) |
| 권한 모드 | Devin이 send.sh를 자율 실행하려면 --permission-mode의 완화가 필요하다. 저는 검증용으로 dangerous를 사용했지만, 상용에서는 용도에 따라 제한해야 한다 |
| 설치 시 부작용 | ~/.agents/skills/agmsg/ 생성과 /agmsg 명령어 추가 외에도, ~/.codex/config.toml이 수정된다 (백업은 자동 생성됨). 프로젝트의 .claude/settings.local.json은 이번에는 변경되지 않았다 |
특히 'Devin은 풀 방식(자동 push 없음)'이라는 성질은, Devin for Terminal이 devin -p로 비대화 원샷 실행에 능숙하다는 점과 깔끔하게 맞아떨어집니다. 상시 감시하는 Claude Code가 사령탑, 불릴 때 일해서 돌려주는 Devin이 실행 부대가 되는 역할 분담이 자연스럽게 생겨났습니다.
이 기사에서는 agmsg가 'MCP도 서브 에이전트도 큐도 아닌, SQLite 1파일의 공유 광장'임을 설명하고, 공식 지원 외의 Devin CLI를, 라이브 스크립트를 통해 그 원에 섞을 수 있는지를 실제로 검증했습니다.
결론적으로, Claude Code ⇄ Devin 간의 양방향 작업 전달은 인간의 복사 붙여넣기 없이 성립했습니다. 포인트는 agmsg의 송수신이 '단순한 SQLite로의 문자열 read/write'에 불과하며, 드라이버 유무에 구애받지 않는다는 소박함에 있습니다. 똑똑하지 않은 바닥이기 때문에 예상치 못한 에이전트도 올릴 수 있다는 것입니다.
마찬가지로 여러 에이전트를 병용하여 '복사 붙여넣기 운반꾼'에 지친 분들은 꼭 시도해 보세요. 우선 npx agmsg부터 시작할 수 있습니다.
- agmsg (GitHub) — 본 기사의 주제. README, ARCHITECTURE.md, SKILL.md 참조
- agmsg 공식 사이트 (agmsg.cc)
- Devin 공식 문서
devin을 대화형으로 사용하는 것에 지친 분들을 위한: 비대화형 모드 (devin -p) —--permission-mode등의 상세 내용
감사의 말: 가볍고 "읽기 쉬운" 설계를 가진 agmsg를 공개해 주신 fujibee 님께 감사드립니다. 본 기사의 메커니즘 해설은 해당 리포지토리의 README와 문서를 분석하고, 직접 실행하여 확인한 내용을 바탕으로 작성되었습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기