agent-device: AI 에이전트가 iOS·Android 기기를 직접 조작하게 하는 CLI

Callstack이 코딩 에이전트가 iOS·Android 앱을 직접 열고 조작·검증할 수 있게 하는 CLI agent-device를 공개했습니다. JPMorgan, Shopify 등이 이미 쓰고 있습니다.

agent-device가 화면 상태를 읽고 기기 명령을 실행한 뒤 결과와 증거를 남기는 세 단계 요약 도식
agent-device의 inspect-act-verify 흐름을 공식 README 기준으로 세 단계로 요약한 도식입니다.

영국 소프트웨어 컨설팅사 Callstack이 코딩 에이전트가 iOS·Android 앱을 직접 열고 조작하고 검증할 수 있게 하는 커맨드라인 도구 agent-device를 오픈소스로 내놨다. Node.js 22.12 이상에서 npm install -g agent-device@latest 한 줄로 설치하며, Claude Code나 Codex 같은 에이전트가 터미널에서 명령을 실행해 실제 시뮬레이터·에뮬레이터·실기기의 화면을 읽고 버튼을 누르고 결과를 근거로 저장하게 만드는 것이 목적이다. GitHub 저장소는 스타 3.9천 개, 포크 230개를 넘겼고 Callstack의 공식 발표에 따르면 자사 외에도 JPMorgan Chase, Expensify, Shopify 등이 이 도구를 쓰고 있다.

지금까지 코딩 에이전트는 소스 코드를 읽고 쓰는 데는 능숙했지만, 자신이 고친 코드가 실제 앱에서 어떻게 동작하는지 확인할 방법이 없었다. agent-device는 이 공백을 메우려는 시도로, 앞서 나온 웹 브라우저 자동화 도구 Vercel agent-browser의 검사-실행-검증(inspect-act-verify) 구조를 모바일·TV·데스크톱 앱에 그대로 옮겨온 것이 특징이다.

명령 하나가 화면을 어떻게 읽고 조작하나

agent-device의 기본 동작 단위는 세션이다. agent-device open Contacts --platform ios로 앱을 열면 세션이 시작되고, agent-device snapshot -i는 화면의 접근성 트리(스크린 리더가 읽는 구조화된 정보)를 텍스트로 반환한다. 이때 각 요소에는 @e1, @e2 같은 참조 번호(ref)가 붙는데, 에이전트는 이 번호로 agent-device press @e2 --settle처럼 특정 버튼을 누르거나 agent-device fill @e7 "Ada" --settle처럼 입력창에 텍스트를 채울 수 있다. --settle 옵션을 쓰면 화면이 안정된 뒤의 변경 사항만 diff로 돌려주기 때문에, 에이전트가 매번 전체 화면을 다시 읽지 않고도 다음 행동을 결정할 수 있다.

agent-device가 snapshot으로 접근성 트리를 읽고 ref로 명령을 실행한 뒤 settle로 재확인하는 4단계 순환 구조 도식
공식 문서의 워크플로를 기준으로 정리한 inspect-act-verify 순환 구조다.

공식 문서는 ref가 "가장 최근 출력에서만 유효하다"는 점을 반복해서 강조한다. 이전 명령에서 받은 @e7이 다음 화면에서도 같은 요소를 가리킨다고 가정하면 안 되고, --settle 명령 뒤에는 그 결과 diff에 포함된 새 ref를 써야 한다. 접근성 트리에 정보가 부족하면 agent-device screenshot으로 실제 화면 이미지를 찍어 좌표 기반으로 클릭하는 대안도 제공하지만, 문서는 ref와 selector 방식을 우선 권장한다.

iOS, Android부터 TV·데스크톱·웹까지 한 명령 체계로

agent-device는 iOS·Android뿐 아니라 tvOS, Android TV, Amazon Vega OS TV(Vega Virtual Device 한정), macOS, Linux, 그리고 기본적인 웹 자동화까지 지원 범위를 넓혔다. 명령 문법은 플랫폼이 달라져도 거의 동일하지만, 실제로 기기를 조작하는 하위 계층은 플랫폼마다 다릅니다. iOS와 tvOS는 Apple 공식 UI 테스트 프레임워크인 XCTest를 통해 명령을 보내고, Android는 ADB와 자체 스냅샷 헬퍼를 쓰며, macOS는 로컬 헬퍼 프로세스, Linux는 AT-SPI 접근성 계층을 사용한다. 웹 자동화는 별도 구현 없이 같은 세션 안에서 Vercel의 agent-browser를 실행하는 방식으로 처리한다.

agent-device가 iOS, Android, Amazon Vega OS TV, macOS, Linux, 웹 각 플랫폼에서 사용하는 실제 제어 계층과 지원 범위를 정리한 표
같은 명령 체계 아래 플랫폼별로 다른 제어 계층이 자리하고 있다.

플랫폼 간 지원 수준에는 차이가 있다. Amazon Vega OS TV는 초기 지원이 VVD(가상 기기)로만 한정돼 있고, 실제 Fire TV 기기나 화면 캡처, selector 기반 탐색은 아직 지원하지 않는다. Android에서는 실기기에서 이모지나 한자 같은 비-ASCII 문자를 입력할 때 표준 adb shell input text가 ASCII만 처리하는 한계가 있어, agent-device는 이를 우회하기 위한 자체 헬퍼 키보드(테스트용 IME)를 함께 제공한다. iOS 쪽에서는 XCTest로 앱을 실행하면 iOS가 이를 테스트 환경으로 인식해 클립보드 접근을 조용히 허용해버리는 애플 플랫폼 자체의 제약이 있어, "붙여넣기 허용" 팝업이 뜨는 상황을 자동화로는 재현할 수 없다고 공식 문서가 명시하고 있다.

Appium·Detox·Maestro와 다른 지점

모바일 UI 자동화 도구는 이미 Appium, Detox, Maestro 등으로 성숙한 편이다. Callstack은 공식 README의 FAQ에서 이 차이를 직접 짚었다. Appium·Detox·Maestro는 사람이 미리 작성한 테스트 스크립트를 그대로 실행하는 도구인 반면, agent-device는 에이전트가 매 순간 화면 상태를 읽고 다음 명령을 스스로 선택하는 구조다. 두 방식은 경쟁 관계보다는 상호 보완 관계로 설계됐는데, agent-device로 탐색한 조작 흐름을 .ad 스크립트로 저장해두면 이를 CI에서 반복 실행하는 결정적(deterministic) 리플레이로 쓸 수 있고, 필요하면 Maestro가 읽을 수 있는 표준 YAML 형식으로 내보내는 것도 가능하다.

Appium, Detox, Maestro와 agent-device의 명령 결정 주체, 주 용도, 에이전트와의 관계를 비교한 표
정해진 스크립트를 도는 도구와, 즉석에서 다음 명령을 고르는 도구의 역할 차이다.

agent-device 자체에는 AI가 들어 있지 않다. Callstack의 설명대로 "그저 CLI"이며, 명령을 실행하고 그 결과를 구조화된 텍스트나 이미지로 돌려주는 역할만 한다. 다음 행동을 결정하는 것은 이 CLI를 호출하는 Claude Code, Codex, Cursor 같은 코딩 에이전트 쪽이다. Callstack은 각 에이전트 클라이언트가 이 도구를 곧바로 제대로 쓸 수 있도록 npx skills add callstackincubator/agent-device 명령으로 설치하는 공식 스킬도 함께 배포하고 있으며, MCP를 지원하는 클라이언트를 위한 agent-device mcp 서버도 제공한다.


출처: GitHub, callstack/agent-device README, agent-device 공식 문서, Quick Start, Callstack Blog, "Agent Device: iOS & Android Automation for AI Agents"