ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 남의 AI를 내 안에서 실행한다 — Claude Code를 붙이는 subprocess 하나와 두 개의 브리지
    IT 2026. 8. 8. 22:00
    남의 AI를 내 안에서 실행한다 — Claude Code를 붙이는 subprocess 하나와 두 개의 브리지

    지난 편에서 외부 AI를 붙이는 네 갈래를 지도로 그리고, 그중 ACP(Agent Client Protocol — 클라이언트가 코딩 에이전트를 실행해 대화하는 규격)를 골랐다. 이번엔 뚜껑을 연다. 격리해 둔 내 시스템이 Claude Code라는 남이 만든 에이전트를 실제로 어떻게 실행하고, 그 대화의 주도권은 누가 쥐는가? 파고들수록 흥미로웠던 건, 내가 남의 에이전트를 내 안에서 돌리는데도 주인은 여전히 나라는 점이었다.

    이 글은 그 동작을 네 걸음으로 연다 — 하네스를 자식 프로세스로 띄워 대화하는 흐름, 그러면서도 권한을 내가 쥐는 구조, 그리고 이 그림을 실제로 성립시키는 두 개의 브리지다. 하나는 ACP를 모르는 에이전트를 억지로 ACP로 말하게 만드는 브리지, 다른 하나는 그렇게 붙인 에이전트에게 내 도구를 되돌려주는 브리지다.

    1단 — 자식 프로세스로 띄우고 정해진 순서로 대화한다

    ACP로 붙인다는 건 Claude Code를 내 시스템의 자식 프로세스로 실행하고, 표준입출력(stdio — 프로세스의 기본 입출력 통로)으로 JSON-RPC(요청·응답을 정해진 형식으로 주고받는 규격) 메시지를 주고받는다는 뜻이다. 그 대화는 즉흥적이지 않고 정해진 순서를 따른다.

    diagram

    다이어그램 설명. ACP 세션이 열리고 한 턴이 돌아가는 순서를 보여준다. 맨 처음 버전·능력을 맞추는 악수를 하고("initialize"), 그다음 대화 세션을 하나 만든다("session/new"). 이 세션 생성 요청에 작업 폴더와 쓸 도구 목록을 함께 실어 보내는 것이 뒤에서 중요해진다. 세션이 열리면 사용자 메시지를 한 턴씩 보내고("session/prompt"), 에이전트는 생각과 도구 호출과 결과 조각을 실시간 알림으로 흘려보낸다("session/update"). 이 알림은 응답을 기다리지 않는 일방향이라, 진행 상황이 방송처럼 계속 들어온다. 핵심은 이 모든 게 내 시스템 안의 프로세스 사이 대화라는 것 — 네트워크가 아니라 파이프로 오가므로, 지난 편에서 본 대로 이 연결 자체는 격리 경계를 넘지 않는다.

    2단 — 남의 에이전트를 실행하는데도 주인은 나다

    여기가 처음에 직관에 어긋났던 지점이다. Claude Code는 파일을 지우고 명령을 실행하는, 손발이 달린 에이전트다. 그런 걸 내 안에서 돌리면 통제권을 넘겨주는 것 같은데, ACP의 설계는 정반대다. 에이전트는 도구를 쓰기 전에 매번 클라이언트에게 허락을 구해야 한다.

    diagram

    다이어그램 설명. 도구 실행의 통제가 누구 손에 있는지를 보여준다. 하네스가 파일 삭제 같은 도구를 쓰고 싶으면, 곧장 실행하는 게 아니라 클라이언트에게 허락을 요청하는 메서드("session/request_permission")를 호출한다. 그 요청은 내 시스템으로 오고, 내 시스템은 스스로 판단하거나 — 이게 좋은 점인데 — 필요하면 메신저로 사람에게 물어 답을 받는다. 허가가 떨어져야 도구가 돌고, 거부하면 그 도구는 실행되지 않는다. 그래서 ACP 규격은 "클라이언트가 환경을 관리하고, 사용자 상호작용을 처리하고, 자원 접근을 통제한다"고 못박는다. 이 구조 덕에 내 시스템(OpenClaw 같은 호스트)은 남의 에이전트를 실행하면서도 세션·권한·결과 전달·게이트웨이 상태를 자기가 소유한다. 손발은 빌려 오되, 그 손발을 언제 움직일지는 내가 정하는 것이다. 놓치기 쉬운 함정 하나 — 이 통제는 "에이전트가 규격을 지킨다"는 전제 위에 선다. 그래서 지난 시리즈의 샌드박스가 여전히 필요하다. 권한 확인은 착한 에이전트의 실수를 막고, 샌드박스는 규격을 안 지키는 오염된 에이전트를 가둔다 — 둘은 다른 층의 방어다.

    첫 번째 브리지 — ACP를 모르는 에이전트를 ACP로 말하게 한다

    그런데 이상한 점이 있다. Anthropic은 자기 Claude Code가 ACP를 네이티브로 말하도록 만들지 않았다. ACP는 Anthropic이 아니라 다른 회사(코드 에디터를 만드는 Zed)가 주도한 규격이기 때문이다. 그런데도 Claude Code가 ACP를 쓰는 여러 도구에서 도는 이유는, 중간에 통역사가 있기 때문이다.

    diagram

    다이어그램 설명. ACP를 모르는 에이전트가 어떻게 ACP 세계에 들어오는지를 보여준다. 내 시스템은 ACP만 말하고, Claude Code 본체는 자기 고유 방식만 안다. 그 사이에 어댑터가 끼어 양쪽을 통역한다 — 내 쪽에서 온 ACP 메시지를 Claude Code가 알아듣는 방식으로 바꾸고, 그 반대도 한다. 이 어댑터는 Claude Code를 얇게 감싸는 별도 프로그램(Zed 측이 만들어 공개했다)이고, 내 시스템은 어댑터를 자식 프로세스로 띄울 뿐 안에 Claude Code가 들었는지 Gemini가 들었는지 몰라도 된다. 이게 브리지 패턴의 값어치다 — 규격이 안 맞는 현실을 얇은 접착제 한 겹으로 메우고, 그 위의 코드는 표준만 상대한다. 덕분에 에이전트를 갈아끼워도 내 쪽 코드는 그대로다. 언어 도구를 표준화한 Language Server Protocol이 에디터마다의 중복을 없앤 것과 같은 발상이다.

    두 번째 브리지 — 붙인 에이전트에게 내 도구를 되돌려준다

    마지막 조각이 이 구조를 완성한다. Claude Code를 붙여 놨는데, 그 에이전트가 내 시스템이 가진 도구(내가 만든 검색·기록·알림 같은 기능)를 쓰게 하려면 어떻게 해야 할까? 여기서 ACP와 MCP(Model Context Protocol — 모델과 도구를 잇는 별도 표준)가 한 번의 악수로 엮인다.

    diagram

    다이어그램 설명. 붙인 에이전트에게 내 도구를 되돌려주는 왕복을 보여준다. 앞의 1단에서 "세션 생성 요청에 쓸 도구 목록을 함께 실어 보낸다"고 했는데, 그 목록이 바로 이것이다 — 내 시스템이 자기 기능을 MCP 서버 형태로 노출하고, 세션을 열 때 그 접속 정보를 하네스에게 넘긴다. 그러면 하네스는 그 주소로 되접속해, 마치 자기 도구인 양 내 검색·기록·알림을 호출하고 결과를 받아 간다. 여기서 두 브리지의 방향이 정확히 반대라는 게 보인다 — 첫 번째 브리지는 남의 에이전트를 내 쪽 표준(ACP)으로 끌어들이는 통역이고, 두 번째 브리지는 내 도구를 그 에이전트 쪽 표준(MCP)으로 내어주는 통역이다. 하나는 안으로 당기고 하나는 밖으로 내주는, 마주 보는 두 접착제다. ACP가 세션을 열고 MCP가 도구를 얹는 이 한 번의 handshake로, 남의 에이전트가 내 능력을 쓰는 그림이 완성된다.

    정리 — 빌려 오되, 주도권은 내가 쥔다

    정리하면 이렇다. 남의 코딩 에이전트를 내 시스템에 붙이는 일은 자식 프로세스 하나를 띄워 정해진 순서로 대화하는 것이고, 그 대화에서 도구를 언제 움직일지는 에이전트가 아니라 내가(클라이언트가) 정한다. 이 그림은 마주 보는 두 브리지 위에 선다. 하나는 ACP를 모르는 에이전트를 표준으로 끌어들이는 통역이고, 다른 하나는 내 도구를 그 에이전트에게 내어주는 통역이다. 남의 능력을 빌려 오면서도 세션·권한·전달의 주인 자리는 내가 지키는 것, 그게 이 방식의 핵심 값어치다. 격리해 둔 내 시스템에 외부 AI를 들일 때 내가 가장 먼저 확인하는 것도 이 한 가지가 됐다 — 손발을 빌려 오는가, 아니면 주도권까지 넘겨주는가.


    참고한 공개 자료:

    • Agent Client Protocol — Overview (initialize·session/new·session/prompt·session/update): https://agentclientprotocol.com/protocol/overview
    • Agent Client Protocol — Session Setup (session/new의 mcpServers 파라미터): https://agentclientprotocol.com/protocol/session-setup
    • Marc Nuri — Agent Client Protocol (ACP): The LSP for AI Coding Agents Explained: https://blog.marcnuri.com/agent-client-protocol-acp-introduction
    • Zed — Agent Client Protocol: https://zed.dev/acp
    • Model Context Protocol — 사양: https://modelcontextprotocol.io/

    이 글은 생성형 AI의 도움을 받아 작성되었습니다. 원본 자료를 기반으로 AI가 초안을 생성하고, 작성자가 검토·편집하였습니다.

Designed by Tistory.