0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Rokid Glasses から Claude Code を操作できるようにした

0
Last updated at Posted at 2026-05-15

はじめに

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."

Anthropic — Claude Code product page

と説明している。1 ターンずつの応答ではなく、目標に向かって自律的に動くシステム、というスタンス。

結果として、ボトルネックが「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 でも当然あるはずだけれど、公式 / 非公式ともに同種の実装はまだ見当たらなかった。だったら自分で作ろう、というのがこの記事の出発点。

実装コード: https://github.com/TakanariShimbo/claude-channel

Rokid Glasses について

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 アプリを置き換えるスタンドアロン型
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 で受け取るまでの全体ループ

スマホで送信して Claude の返信を glass で受け取るまでの全体ループ。左が Rokid Glasses、右が Pixel 8 で、両端末を scrcpy で PC にミラーした状態を画面録画した。

全体構成

実装は 3 つのコンポーネントに分かれている。利用手順を読む前にこの内訳を把握しておくと、何を起動している作業なのかが繋がりやすい。

  • PC 側 Hub: Node で書いた常駐デーモン。スマホからの HTTP / SSE エンドポイントを持つ。複数の Claude セッションを束ねる中継地点
  • PC 側 Bridge: 1 つの Claude セッションごとに 1 つ立つ MCP サーバ。Claude Code は --mcp-config 経由でこの bridge を spawn する。Hub と bridge は IPC で繋がっている
  • スマホアプリ: Hub に対する単一のクライアント。テキスト/音声で指示を出し、Claude の reply と permission 要求を受け取る。必要なら Rokid Glasses にも中継する
  • Rokid Glasses コンパニオン: 任意。スマホアプリと Bluetooth ベースの制御プレーン (Rokid 独自の CXR-L) で繋がり、HUD にセッション一覧と会話を表示する。ジェスチャでスマホに指示を返す

「スマホを Hub への単一エンドポイントとして固定する」「グラスはあくまでスマホの薄いコンパニオン」というのが設計上の一番の判断で、これで再接続まわりや複数セッションの取り扱いがすっきりした。理由は後ろの開発談で詳しく書く。

利用手順

1. PC で Hub を起動する

claude-channel hub

起動すると、フォアグラウンドで bridge IPC と app HTTP の 2 つのリスナが立ち上がる。[hub] hub up が出ればこれで OK。

Hub 起動直後のターミナル

Hub 起動直後のターミナル

外出先からも Hub に繋ぎたいなら、LAN ではなく Tailscale で固定 IP を使う構成にしておくと、家でも外でも同じ URL で繋がる。

2. スマホアプリと PC をペアリングする

別ターミナルで claude-channel pair lan を叩くと、ペアリング用 QR と base URL / token がコンソールに表示される。

claude-channel pair lan
ペアリング QR (base URL + token 入り)

ペアリング QR (base URL + token 入り)。掲載しているトークンは撮影用に一時発行したもので、撮影後にローテート済 — そのままスキャンしても繋がりません。

専用のスマホアプリ (rgapp/phone) をインストールして起動し、初回起動時の設定ダイアログで「QR で読む」を選び、ターミナルの QR にカメラを向ける。base URL と token がアプリ側にコピーされて、自動で Hub への SSE が張られる。

スマホアプリの設定ダイアログ (初回起動直後、空欄)

スマホアプリの設定ダイアログ (初回起動直後、空欄)

「QR で読む」をタップすると QR スキャナが起動

「QR で読む」をタップすると QR スキャナが起動

ペアリング後のスマホアプリ メイン画面 (「接続済み」表示)

ペアリング後のスマホアプリ メイン画面 (「接続済み」表示)

3. Rokid Glasses を接続する (任意)

グラスを使う場合は事前に Hi Rokid アプリでグラス本体の BT ペアリングと認可を済ませておく。

スマホアプリの目玉アイコン (Visibility) から接続ダイアログを開いて「接続」を押すと、CXR-L のリンクが張られる。グラス側のアプリ (rgapp/glass) が自動で起動し、HUD にセッション選択画面が出る。

スマホアプリのグラス接続ダイアログ (認可・接続状態の表示と「接続」ボタン)

スマホアプリのグラス接続ダイアログ (認可・接続状態の表示と「接続」ボタン)

Glass HUD: 起動直後の session-select 画面 (scrcpy 経由でキャプチャ)

Glass HUD: 起動直後の session-select 画面 (scrcpy 経由でキャプチャ)

4. Claude Code セッションを開始する

作業ディレクトリで claude-channel run safe を叩くと、Hub に紐付いた bridge を MCP で噛ませた状態で claude が起動する。safe モードは Auto Mode 相当の動作 (安全なアクションは自動承認、危険なものだけ permission に乗せて聞いてくる) を有効にする。

claude-channel run safe

そのセッションに対応する bridge が hub にアタッチされ、スマホアプリのセッション一覧にそのセッションが現れて緑のドット (アクティブ) が付く。複数セッションを別々のターミナルで立てれば、同じ一覧に並ぶ。

claude-channel run safe で Claude Code が起動したターミナル

claude-channel run safe で Claude Code が起動したターミナル

スマホアプリの session ドロワーに新セッションが並ぶ

スマホアプリの session ドロワーに新セッションが並ぶ

5. スマホ / グラスから指示を送る

スマホ側は普通にテキスト入力で送信。

音声で送りたい場合は、設定に OpenAI API key を入れておくとマイクボタンが出る。録音中はリアルタイムで文字起こしが入力欄に流れて、止めると確定。送信前に手で編集してから送信できるので、言い間違いを直しやすい。

グラスのタッチパッドからも指示が出せる。タップで録音開始、もう一度タップで停止、その後「送信」「取消」を前後スワイプで選んで決定する。

スマホからのテキスト入力 → 送信

スマホからのテキスト入力 → 送信

スマホの音声入力 (録音中、delta が入力欄に流れている)

スマホの音声入力 (録音中、delta が入力欄に流れている)

6. 返信と承認に対応する

Claude が返信を生成すると、スマホに通知が立ち、グラスでは音 + 画面ウェイク + 該当セッション画面への自動遷移という流れになる。グラスを掛けたまま、PC を見ずに返信内容を確認できる。

Bash の実行や編集など、Claude が承認を求めてくるツールが使われると、スマホ通知に「拒否 / 許可」のアクションボタンが出る。グラスにも通知は届くが、現状この操作自体はスマホで行う想定。

スマホ通知: Claude reply の heads-up + FGS のサイレント通知も並ぶ

スマホ通知: Claude reply の heads-up + FGS のサイレント通知も並ぶ

Glass HUD: AI 返信が conversation 画面に出る (返信は緑+bold で強調)

Glass HUD: AI 返信が conversation 画面に出る (返信は緑+bold で強調)

スマホ通知: permission 要求 (拒否 / 許可 ボタン付き)

スマホ通知: permission 要求 (拒否 / 許可 ボタン付き)

開発談

ここから先は技術寄りの「どう作ったか」。要素ごとに、なぜその選択をしたのかを書いていく。

Channels に乗った判断

Claude のセッションと外部 (スマホ) で双方向にメッセージを流すには、reply を外に出すパスと、外から chat を流して回答させるパスの両方が必要になる。

ちょうどこの用途にはまるのが Anthropic の Channels で、MCP の通知メソッドを使って bridge と Claude セッションのあいだに双方向 push を張れる。同期的な permission request にも自然に乗る。

ただし Channels は研究プレビュー扱いで、メソッド名や capability key、--dangerously-load-development-channels フラグの仕様は Claude Code のバージョン間で変わり得る。これは前提として承知の上で採用していて、壊れたら追従する。

採用しなかった代替手段としては、ファイル監視・stdout のパース・polling が候補だったけれど、どれも片方向で、permission のような同期的なやりとりに向かなかった。

Hub と Bridge を分けた理由

スマホからは「常に同じエンドポイント」に話したい。一方で、Claude のセッションは MCP の都合上「1 セッション = 1 bridge プロセス」になる。

この 2 つを直結すると、複数セッションが並行で立つたびにスマホ側で「これはどっち宛?」を仕分ける処理が増える。再接続まわりも、N 個の bridge に対して N 本の接続を維持しないといけない。

そこで「セッションごとに立つ MCP server」と「スマホから見た単一エンドポイント」を分離した。前者が bridge、後者が hub。Hub は bridge 群と IPC で繋がっていて、request_id ベースで permission verdict を発火元の bridge にルートする。

結果として、

  • bridge は 1 つの Claude セッションのことだけ考えればよくて、MCP 仕様にすっきり載る
  • スマホは hub に対する 1 本の SSE + HTTP だけ張ればよくて、再接続ロジックも単純
  • 複数セッションが並行で動いても、スマホ UI ではセッション一覧の見た目だけが増える

という構造になった。

Rokid CXR-L SDK を中華版から Global 化した

Rokid Glasses をスマホから制御するには、Rokid が出している CXR-L SDK が必要になる。これは Hi Rokid アプリを介してスマホとグラスの間に BT の制御プレーンを張るもの。

ただ問題として、この SDK は当初中国市場向けにのみ公開されていて、Maven Central や Global の標準的な経路では取得できなかった。

そこで必要な部分を Global 利用向けに整理して、CxrGlobal という別 repo として切り出した。claude-channel 側からは git submodule で参照していて、グラスアプリとスマホアプリの両方が同じ CxrGlobal を共有している。Wire protocol の型定義も含めて、両端で一貫した状態を保てる。

CxrGlobal リポジトリ (GitHub repo トップ)

CxrGlobal リポジトリ (GitHub repo トップ)

このあたりは本来の本筋ではないものの、「Global の Rokid Glasses で何かを作りたい人」にとっては一番の参入障壁だと思うので、副産物として独立 repo にしておいた。

文字起こしは OpenAI Realtime API + Whisper

音声入力部分はスマホから OpenAI の Realtime API に直接接続している。

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

24kHz mono PCM16 を 40ms チャンクで投げ続けて、*.delta (途中経過) と *.completed (確定) を入力欄に流す形。最新の Realtime Whisper モデル (gpt-realtime-whisper) を audio.input.transcription.model に指定している。

UX 上のポイントは、確定前にユーザが手で編集できるところ。録音中は delta がインラインで流れるが、それを「送信」せずに止めて、テキストを直してから送る運用ができる。言い間違いを確定前に直したい場面で効く。

録音中: delta が入力欄に流れている

録音中: delta が入力欄に流れている

経路としては Hub / Bridge を一切経由せず、スマホ ↔ OpenAI で完結している。PC 側を音声で煩わせない、という分離が結果的に運用上もシンプルだった。

グラスへの通知ミラーを自前で書いた

最初は Hi Rokid アプリが持つ通知連動機能 (Android の Notification Listener access を取得して、スマホ通知をグラスに転送する) で済むと思っていた。

ところがこれが実質 messaging 系の通知 (SMS、チャットアプリ) しか forward しない実装で、自作アプリの reply / permission 通知は素通しされなかった。

なので、通知だけは CXR-L 経由で自前で流す形に倒した。スマホアプリ側で ChannelEvent.Reply / PermissionRequested を購読して、グラスに専用の notification Caps イベントを送る。

グラス側 (MainActivity) は受信時に以下を順に実行する:

  1. 効果音 (短い chime mp3 を MediaPlayer で再生)
  2. 画面の wake (SCREEN_BRIGHT_WAKE_LOCK | ACQUIRE_CAUSES_WAKEUP を 3 秒だけ取得)
  3. 該当セッションの conversation 画面への自動遷移

3 秒で WakeLock は切るけれど、その間に conversation 画面が前に出れば、FLAG_KEEP_SCREEN_ON が画面保持を引き継いでくれる。

副次的なメリットとして、自前ルートにしたことで「同じセッションに自動遷移する」のような副作用が書けるようになった。汎用通知 mirror では難しい部分。

まとめ

AI が自律的になればなるほど、人が PC の前にいる必要性は減る。減るけれど、ゼロにはならず、「ちょっとした確認・承認・指示出し」は依然として人がやる必要がある。

そこに glass + 音声というインターフェースをぶつけてみたら、思っていたよりずっと自然にループが閉じた。完璧な glass-only 環境を目指すのではなく、PC を離れているあいだも Claude のセッションが死なない、ということに価値がある。

コードは個人プロジェクトとして GitHub に公開している。Rokid Glasses を持っている人が増えていけば、似たような「ちょっと離席用」の自作ツールも増えていくと思う。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?