본문으로 건너뛰기

© 2026 Molayo

Qiita헤드라인2026. 05. 15. 22:46

Rokid Glasses에서 Claude Code를 조작할 수 있도록 만들었다

요약

AI 에이전트의 발전으로 인해 작업 흐름의 병목 현상이 'AI의 능력'에서 '사용자가 PC 앞에 상주하는 여부'로 이동하고 있으며, 이에 따라 사용자는 언제 어디서든 AI와 연결되어 지시 및 승인(Approval)을 내릴 수 있는 환경을 필요로 한다. 본 글은 Rokid Glasses를 활용하여 Claude Code 세션에 대한 원격 제어 및 알림 기능을 구현한 사례를 제시하며, 스마트폰과 연동된 플러그인형 SDK (CXR-L)를 통해 AI 에이전트의 상태와 응답을 안경(HUD)으로 받아보는 방법을 설명한다.

핵심 포인트

  • AI 에이전트는 단발성 응답을 넘어 목표 지향적이고 자율적으로 움직이는 시스템(Agentic System)으로 진화하고 있다.
  • 미래의 AI 활용은 PC 앞에서 에이전트를 감시하는 것이 아니라, 출퇴근이나 휴식 중에도 연결되어 상태를 파악하고 승인할 수 있는 '원격성'에 초점을 맞추고 있다.
  • Rokid Glasses와 플러그인형 SDK (CXR-L)를 활용하여 Claude Code 세션의 응답 및 승인 요청을 안경(HUD)으로 받아보는 커스텀 양방향 통신 시스템을 구축했다.
  • 구현은 PC 측 Hub(중계 지점), PC 측 Bridge(세션별 MCP 서버), 그리고 스마트폰 앱/글래스를 통한 사용자 인터페이스로 구성된다.

Claude Code가 최근 업데이트를 통해 단숨에 자율적으로 변했다. 2026년 3월의 Auto Mode (안전한 액션은 자동 승인, 위험한 것만 사람에게 질문)에 이어, 5월에는 /goal 커맨드 (완료 조건을 설정하면 여러 턴에 걸쳐 자율적으로 계속 실행)가 도입되어, 지시를 내린 뒤 AI가 스스로 생각하고 움직이는 시간이 확실히 늘어났다. Anthropic 스스로도 Claude Code의 위치를 다음과 같이 설명하고 있다.

"An agentic system acts toward a goal with a degree of autonomy, rather than responding to one prompt at a time."

즉, 한 번에 한 번씩 응답하는 것이 아니라, 목표를 향해 자율적으로 움직이는 시스템이라는 입장이다.

결과적으로 병목 현상이 'AI의 능력'에서 '사람이 PC 앞에 있느냐 없느냐'로 이동하고 있다. 자리를 비우면 세션이 사실상 중단되며, 돌아왔을 때는 다시 집중력을 전환해야 하는 비용이 발생한다.

나의 유스케이스에 비추어 말하자면, 대량의 코드를 직접 작성하는 시간은 줄어들고 AI에 대한 지시, 확인, 승인이 중심이 되고 있다. 양손이 자유로운 상태에서 짧은 지시와 승인을 내릴 수 있다면 사실 충분한 장면이 많다.

이는 개인적인 감각이라기보다 업계 전체의 트렌드이며, 실제로 Even Realities 스스로도 G2의 Terminal Mode를 발표했을 때, CEO인 Will Wang이 이러한 경험을 의도하여 만들었다고 언급했다. agent와 연결을 끊지 않고 지내고 싶은 상황으로 다음과 같이 꼽았다.

"during a coffee break, commute, workout or while running errands"

— Will Wang, CEO of Even Realities (Engadget 인터뷰 코멘트)

즉, PC 앞에서 agent를 감시하는 것이 아니라, 커피 휴식이나 출퇴근, 운동, 심부름 중에도 연결되어 있고 싶다. 이것이 목표라고 명확히 밝히고 있다.

사용자 측에서도 이미 동일한 경험을 실연하는 사례가 나오고 있다. AI 디렉터인 KEITO 님이 Even G2의 터미널 모드에서 Claude Code를 백그라운드에서 실행시키고, 안경에 음성으로 "자료 좀 만들어 놔"라고 부탁하여 PC 상에 결과물을 내놓은 데모를 공개했다. 이를 생성 AI 활용 엔지니어인 아키라파파(あきらパパ) 님이 "진짜 멋지다"라며 인용하여 소개하면서, AI 개발자 커뮤니티 내에서도 "안경에서 agent를 호출하는" 형태가 현실감 있게 받아들여지기 시작했다.

동일한 수요는 Rokid Glasses에서도 당연히 있을 것이지만, 공식/비공식 모두 유사한 구현은 아직 보이지 않았다. 그렇다면 직접 만들자, 이것이 이 글의 출발점이다.

Rokid Glasses 본체 (프레임 전면 우측에 카메라, 템플 안쪽에 micro-LED 투영 모듈)

본 글에서 사용하는 것은 중국 Rokid가 2025-08에 출시한 Rokid Glasses이다. 평소 안경과 다를 바 없는 49g의 경량 프레임에, 양안의 micro-LED waveguide 디스플레이와 프레임 전면의 카메라를 탑재한 AI 글래스로, Android 기반의 독자 OS인 YodaOS-Sprite 상에서 AI 어시스턴트 (GPT + Gemini) · 번역 · 텔레프롬프터 등이 단독으로 동작한다.

외부 개발자에게는 3종류의 SDK가 공개되어 있다.

SDK구동 장소위치 설정
CXR-L스마트폰 (Android)Hi Rokid 앱을 확장하는 플러그인형
CXR-M스마트폰 (Android)Hi Rokid 앱을 대체하는 스탠드얼론(Standalone)형
CXR-S글래스 (YodaOS)글래스 측 앱 (bare-metal)

본 글에서는 CXR-L을 채택하고 있다. Hi Rokid 앱 (Rokid 공식 Android 컴패니언)으로부터 인가 토큰을 발급받고, 그 토큰을 사용하여 스마트폰 앱 ↔ 글래스 간에 커스텀 양방향 통신을 구축하는 플러그인형 SDK이다. 스마트폰 측에 독자적인 UI를 가지면서 글래스를 HUD로서 가볍게 사용하는 본 글의 구성에 딱 맞아떨어진다.

완성된 형태를 먼저 적어둔다 (PC 측에서 상주하는 Hub + Claude Code 세션이 실행 중이라는 전제, 구성은 다음 절에서).

  • 스마트폰 앱을 통해 실행 중인 Claude Code 세션에 텍스트나 음성으로 지시를 보낼 수 있다.
  • Claude의 응답은 스마트폰 알림뿐만 아니라 Rokid Glasses로도 전달된다. 글래스의 스크린이 OFF 상태라도 알림이 오는 순간 자동으로 점등되며, 해당 세션의 대화 화면으로 전환된다.
  • Claude가 승인을 요청할 때 (Bash 실행, 파일 편집 등), 스마트폰 알림에 「거부 / 허가」 버튼이 나타난다. 승인 조작 자체는 스마트폰 측에서 완결된다.
  • 여러 개의 Claude Code 세션을 병렬로 실행하고 있더라도, 글래스의 세션 선택 화면에서 전환하며 모두 추적할 수 있다.

PC를 떠나 있는 동안 "아, Claude가 무언가 물어왔구나"라고 알아차리고, 그에 응답할 수 있다는 점이 일상적으로 유용하다.

스마트폰으로 전송하여 Claude의 응답을 glass로 받기까지의 전체 루프. 왼쪽이 Rokid Glasses, 오른쪽이 Pixel 8이며, 양쪽 단말을 scrcpy로 PC에 미러링한 상태를 화면 녹화했다.

구현은 3가지 컴포넌트로 나뉘어 있다. 이용 절차를 읽기 전에 이 내역을 파악해 두면, 어떤 것을 실행하고 있는 작업인지 연결하기 쉽다.

  • PC 측 Hub: Node로 작성된 상주 데몬 (Daemon). 스마트폰으로부터의 HTTP / SSE 엔드포인트를 가진다. 여러 Claude 세션을 묶는 중계 지점
  • PC 측 Bridge: 하나의 Claude 세션마다 하나씩 생성되는 MCP 서버. Claude Code는 --mcp-config를 통해 이 bridge를 spawn 한다. Hub와 bridge는 IPC로 연결되어 있다
  • 스마트폰 앱: Hub에 대한 단일 클라이언트. 텍스트/음성으로 지시를 내리고, Claude의 reply와 permission 요청을 받는다. 필요하다면 Rokid Glasses로도 중계한다
  • Rokid Glasses 컴패니언 (Companion): 선택 사항. 스마트폰 앱과 Bluetooth 기반의 제어 평면 (Rokid 독자 기술인 CXR-L)으로 연결되며, HUD에 세션 목록과 대화를 표시한다. 제스처로 스마트폰에 지시를 보낸다

"스마트폰을 Hub로 향하는 단일 엔드포인트로 고정한다", "글래스는 어디까지나 스마트폰의 얇은 컴패니언이다"라는 것이 설계상의 가장 큰 판단이었으며, 이를 통해 재연결 문제나 다중 세션 처리가 깔끔해졌다. 이유는 뒤의 개발담에서 자세히 기술하겠다.

claude-channel hub

실행하면 포그라운드(Foreground)에서 bridge IPC와 app HTTP라는 두 개의 리스너(Listener)가 올라온다. [hub] hub up이 나오면 이것으로 OK.

Hub 실행 직후의 터미널

외부에서도 Hub에 연결하고 싶다면, LAN이 아니라 Tailscale을 사용하여 고정 IP를 사용하는 구성으로 해두면 집에서도 밖에서도 동일한 URL로 연결할 수 있다.

다른 터미널에서 claude-channel pair lan을 입력하면, 페어링용 QR과 base URL / token이 콘솔에 표시된다.

claude-channel pair lan

페어링 QR (base URL + token 포함). 게재된 토큰은 촬영용으로 일시 발행된 것이며, 촬영 후 로테이트(Rotate)되었습니다 — 그대로 스캔해도 연결되지 않습니다.

전용 스마트폰 앱 (rgapp/phone)을 설치하여 실행하고, 최초 실행 시의 설정 다이얼로그에서 「QR로 읽기」를 선택한 뒤 터미널의 QR에 카메라를 향한다. base URL과 token이 앱 측으로 복사되어, 자동으로 Hub로의 SSE가 연결된다.

스마트폰 앱의 설정 다이얼로그 (최초 실행 직후, 빈칸)

「QR로 읽기」를 탭하면 QR 스캐너가 실행됨

페어링 후의 스마트폰 앱 메인 화면 ("연결됨" 표시)

글래스를 사용하는 경우에는 사전에 Hi Rokid 앱을 통해 글래스 본체의 BT 페어링과 인가를 완료해 둔다.

스마트폰 앱의 주요 아이콘 (Visibility)에서 연결 다이얼로그를 열고 「연결」을 누르면, CXR-L 링크가 연결된다. 글래스 측의 앱 (rgapp/glass)이 자동으로 실행되며, HUD에 세션 선택 화면이 나타난다.

스마트폰 앱의 글래스 연결 다이얼로그 (인가·연결 상태 표시와 「연결」 버튼)

Glass HUD: 구동 직후의 session-select 화면 (scrcpy를 통해 캡처)

작업 디렉토리에서 claude-channel run safe를 입력하면, Hub에 연결된 bridge를 MCP로 끼워 넣은 상태로 claude가 실행된다. safe 모드는 Auto Mode에 상응하는 동작(안전한 액션은 자동 승인, 위험한 것만 permission을 통해 물어봄)을 활성화한다.

claude-channel run safe

해당 세션에 대응하는 bridge가 hub에 어태치(attach)되며, 스마트폰 앱의 세션 목록에 해당 세션이 나타나고 녹색 점(액티브)이 붙는다. 여러 세션을 서로 다른 터미널에서 실행하면 동일한 목록에 나열된다.

claude-channel run safe로 Claude Code가 실행된 터미널

스마트폰 앱의 session 드로어(drawer)에 새 세션이 나열됨

스마트폰 측에서는 일반적인 텍ast 입력으로 전송한다.

음성으로 보내고 싶을 경우, 설정에 OpenAI API key를 입력해 두면 마이크 버튼이 나타난다. 녹음 중에는 실시간으로 받아쓰기(transcription) 내용이 입력란에 흐르며, 멈추면 확정된다. 전송 전에 손으로 편집한 뒤 보낼 수 있어 말실수를 수정하기 쉽다.

글래스의 터치패드로도 지시를 내릴 수 있다. 탭하면 녹음 시작, 다시 탭하면 정지, 그 후 「전송」 「취소」를 앞뒤로 스와이프하여 선택하고 결정한다.

스마트폰에서의 텍스트 입력 → 전송

스마트폰의 음성 입력 (녹음 중, delta가 입력란에 흐르고 있음)

Claude가 답장을 생성하면 스마트폰에 알림이 뜨고, 글래스에서는 소리 + 화면 웨이크(wake) + 해당 세션 화면으로의 자동 전환이라는 흐름이 이어진다. 글래스를 착용한 채로 PC를 보지 않고도 답장 내용을 확인할 수 있다.

Bash 실행이나 편집 등 Claude가 승인을 요청하는 툴(tool)이 사용되면, 스마트폰 알림에 「거부 / 허가」 액션 버튼이 나타난다. 글래스에도 알림은 전달되지만, 현재 이 조작 자체는 스마트폰에서 수행하는 것을 상정하고 있다.

스마트폰 알림: Claude reply의 heads-up + FGS의 사이런트(silent) 알림도 함께 나타남

Glass HUD: AI 답장이 conversation 화면에 나타남 (답장은 녹색+bold로 강조)

스마트폰 알림: permission 요청 (거부 / 허가 버튼 포함)

여기서부터는 기술적인 측면인 「어떻게 만들었는가」이다. 요소별로 왜 그 선택을 했는지 기술해 나가겠다.

Claude의 세션과 외부(스마트폰) 간에 양방향으로 메시지를 흘려보내려면, reply를 외부로 내보내는 경로와 외부에서 chat을 흘려보내 답변하게 하는 경로가 모두 필요하다.

이 용도에 딱 맞는 것이 Anthropic의 Channels이며, MCP의 notification 메서드를 사용하여 bridge와 Claude 세션 사이에 양방향 push를 구축할 수 있다. 동기적인 permission request에도 자연스럽게 대응한다.

다만 Channels는 연구 프리뷰(research preview) 취급이므로, 메서드 이름이나 capability key, --dangerously-load-development-channels 플래그의 사양은 Claude Code 버전 간에 변경될 수 있다. 이는 전제로 인지하고 채택한 것이며, 동작이 깨지면 추종할 것이다.

채택하지 않은 대안으로는 파일 감시, stdout 파싱, 폴링(polling) 등이 후보였으나, 모두 단방향이라 permission과 같은 동기적인 상호작용에는 적합하지 않았다.

스마트폰 측에서는 「항상 동일한 엔드포인트(endpoint)」와 통신하고 싶어 한다. 반면 Claude의 세션은 MCP의 특성상 「1 세션 = 1 bridge 프로세스」가 된다.

이 두 가지를 직접 연결하면, 여러 세션이 병렬로 실행될 때마다 스마트폰 측에서 「이것은 어디로 보내는 것인가?」를 분류하는 처리가 늘어난다. 재연결 관련 작업도 N개의 bridge에 대해 N개의 연결을 유지해야 한다.

그래서 「세션마다 실행되는 MCP server」와 「스마트폰이 바라보는 단일 엔드포인트」를 분리했다. 전자가 bridge이고 후자가 hub이다. Hub는 bridge 그룹과 IPC로 연결되어 있으며, request_id 기반으로 permission verdict를 발신 측인 bridge로 라우팅(route)한다.

결과적으로,

  • bridge는 하나의 Claude 세션만을 고려하면 되므로, MCP 사양에 깔끔하게 담긴다.
  • 스마트폰은 hub에 대해 단 하나의 SSE + HTTP 연결만 맺으면 되므로, 재연결 로직도 단순하다.
  • 여러 세션이 병렬로 동작하더라도, 스마트폰 UI에서는 세션 목록의 모습만 늘어난다.

라는 구조가 되었다.

Rokid Glasses를 스마트폰에서 제어하려면, Rokid에서 제공하는 CXR-L SDK가 필요하다. 이는 Hi Rokid 앱을 통해 스마트폰과 글래스 사이에 BT(Bluetooth) 제어 평면(control plane)을 구축하는 것이다.

다만 문제점은, 이 SDK가 당초 중국 시장용으로만 공개되어 있어 Maven Central이나 글로벌 표준 경로로는 획득할 수 없었다는 점이다.

그래서 필요한 부분을 글로벌 이용자용으로 정리하여, CxrGlobal이라는 별도의 repo(저장소)로 분리했다. claude-channel 측에서는 git submodule로 참조하고 있으며, 글래스 앱과 스마트폰 앱 모두 동일한 CxrGlobal을 공유한다. Wire protocol의 타입 정의를 포함하여 양 끝단에서 일관된 상태를 유지할 수 있다.

CxrGlobal 리포지토리 (GitHub repo 톱)

이 부분은 본래의 핵심 주제는 아니지만, "글로벌 버전의 Rokid Glasses로 무언가를 만들고 싶은 사람"에게는 가장 큰 진입 장벽이라고 생각했기에, 부산물로서 독립 repo로 만들어 두었다.

음성 입력 부분은 스마트폰에서 OpenAI의 Realtime API에 직접 연결한다.

wss://api.openai.com/v1/realtime?intent=transcription

24kHz mono PCM16을 40ms 청크(chunk) 단위로 계속 던지며, *.delta(중간 과정)와 *.completed(확정)를 입력창에 흘려보내는 방식이다. 최신 Realtime Whisper 모델 (gpt-realtime-whisper)을 audio.input.transcription.model에 지정하고 있다.

UX 상의 포인트는 확정 전에 사용자가 수동으로 편집할 수 있다는 점이다. 녹음 중에는 delta가 인라인(inline)으로 흐르지만, 이를 "전송"하지 않고 멈춘 뒤 텍스트를 수정한 후 보낼 수 있는 운용이 가능하다. 말을 잘못했을 때 확정 전에 바로잡고 싶은 상황에서 유용하다.

녹음 중: delta가 입력창에 흐르고 있음

경로로 보면 Hub / Bridge를 전혀 거치지 않고, 스마트폰 ↔ OpenAI로 완결된다. PC 측을 음성으로 번거롭게 하지 않는다는 분리가 결과적으로 운용 측면에서도 심플했다.

처음에는 Hi Rokid 앱이 가진 알림 연동 기능(Android의 Notification Listener access를 획득하여 스마트폰 알림을 글래스로 전달하는 기능)으로 충분할 것이라고 생각했다.

하지만 이것은 실질적으로 메시징(messaging) 계열의 알림(SMS, 채팅 앱)만 전달(forward)하는 구현이었기에, 자체 제작 앱의 reply / permission 알림은 통과되지 않았다.

따라서 알림만은 CXR-L을 통해 직접 흐르게 하는 방식으로 처리했다. 스마트폰 앱 측에서 ChannelEvent.Reply / PermissionRequested를 구독하고, 글래스에 전용 notification Caps 이벤트를 보낸다.

글래스 측 (MainActivity)은 수신 시 다음을 순차적으로 실행한다:

  • 효과음 (짧은 chime mp3를 MediaPlayer로 재생)
  • 화면 깨우기 (SCREEN_BRIGHT_WAKE_LOCK | ACQUIRE_CAUSES_WAKEUP을 3초 동안만 획득)
  • 해당 세션의 conversation 화면으로 자동 전환

3초 후에 WakeLock은 해제되지만, 그 사이에 conversation 화면이 전면으로 나오면 FLAG_KEEP_SCREEN_ON이 화면 유지를 이어받는다.

부수적인 이점으로, 자체 경로로 구축함으로써 "동일한 세션으로 자동 전환한다"와 같은 사이드 이펙트(side effect)를 작성할 수 있게 되었다. 범용 알림 미러링(mirror)으로는 구현하기 어려운 부분이다.

AI가 자율적이 될수록 사람이 PC 앞에 있을 필요성은 줄어든다. 줄어들겠지만 제로가 되지는 않으며, "잠깐의 확인·승인·지시"는 여전히 사람이 수행해야 할 필요가 있다.

거기에 glass + 음성 (Voice)이라는 인터페이스를 접목해 보았더니, 생각했던 것보다 훨씬 자연스럽게 루프 (Loop)가 닫혔다. 완벽한 glass-only 환경을 목표로 하는 것이 아니라, PC를 떠나 있는 동안에도 Claude의 세션 (Session)이 끊기지 않는다는 점에 가치가 있다.

코드는 개인 프로젝트로서 GitHub에 공개하고 있다. Rokid Glasses를 가진 사람이 늘어난다면, 이와 유사한 "잠깐 자리를 비울 때를 위한" 자작 도구들도 늘어날 것이라고 생각한다.

  • 공식: Even Realities Terminal Mode (Engadget)
  • 시연 포스트 (Even G2 + Claude Code 음성 조작): KEITO 님 (@keitowebai)의 포스트
  • 상기 인용 소개: 아키라파파 님 (@akira_papa_IT)의 포스트
  • 선행 기사 (Even G2 + Claude Code): Claude Code / Codex CLI from smart glasses — wmoto_ai (Zenn)
  • 커뮤니티 구현 (Even G2): sam-siavoshian/claude-code-g2
  • OpenClaw Bridge (Even G2): JU CHUN KO's Blog
  • 본 기사의 구현: claude-channel

AI 자동 생성 콘텐츠

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

원문 바로가기
0

댓글

0