Windowsアプリのテスト自動化ツール「Terminator(mediar-ai)」とは?
Rust言語で開発したWindowsアプリ(WinRemap)のGUIテストを自動化したくて調査したときの覚書。
Geminiでディープリサーチしてから、Claudeアプリで記事にしている。
環境: Windows 11 Pro 25H2
Webのテスト自動化にはPlaywrightという定番があるが、Windowsデスクトップアプリには決定打が乏しい。
WinAppDriverは開発が停滞し、UI Automation(UIA)を生で叩くとCOMの作法に付き合うことになる。
Terminator(mediar-ai)とは?
Windowsデスクトップを対象としたオープンソースのGUI自動化基盤。
「Playwright for windows computer use」を掲げている。
参考: mediar-ai/terminator - GitHub
構成は主に2つ。
- terminator-rs — Rust製のコアライブラリ。Python(terminator.py)とTypeScript(@mediar-ai/terminator)のバインディングもある
- terminator-mcp-agent — MCPサーバー。Claude CodeやCursorから直接デスクトップを操作できる
対応プラットフォームは事実上Windows専用。
開発元はアメリカ・サンフランシスコのMediar.ai(Mediar Inc.)。
従来のComputer Useとの違い
AnthropicやOpenAIのComputer Useは、スクリーンショットをVLM(視覚言語モデル)に解釈させて座標をクリックするビジョン依存型。
- 1ステップごとにVLM推論(Vision-Language Model:視覚言語モデル)が入るので遅い
- 画像トークンを大量に消費するのでランニングコストが嵩む
- 解像度やフォント描画の揺らぎで誤操作する(非決定論的)
TerminatorはOSのアクセシビリティツリー(Windows UI Automation)を直接読む。
スクリーンリーダーが使っているのと同じUIの「意味」が入ったツリー。
- 座標ではなく role:Button, name:Save, window:WinRemap のような属性で要素を特定する
- ウィンドウのサイズやDPIが変わっても壊れない
- 画面全体のツリー走査が約80ms(公称値)
- ロケータのチェイニングやリトライが用意されていて、Playwrightを触ったことがあれば違和感がない
設計思想は「決定論を主、AIを従」。
- 定型処理は確定的なコードとして実行する
- 応答遅延や画面構造の変化など、想定外が起きたときだけLLMを呼んでリカバリする
- 従来のRPA(UiPath等)はUIが少し変わるだけで止まる。
純粋なAIエージェントは遅くて高い。
その中間を狙っている
操作対象アプリ側の条件
UIAベースなので、対象アプリがアクセシビリティツリーを公開していないと要素を掴めない。
ここが使えるかどうかの分かれ目になる。
- WinUI 3 / WPF / Win32ネイティブ — 標準コントロールなら自動で対応する。最も相性がいい
- egui / eframe — AccessKitが統合されており、そのWindowsアダプタがUI Automationを実装している。eframeではデフォルト有効。掴める
- gpui(Zed) — GPUに直接描画する方式で、AccessKit対応は現在進行形。現状はツリーがほぼ出ない。掴めない
費用とライセンス
- OSSコアはMITライセンスで無料 — terminator-rs、各言語バインディング、MCPサーバーすべて
- ローカル実行なのでデータは外に出ない — OSS版を自前環境で回す限り、Mediar.aiに情報は送られない
- マネージドホスティングとMediar IDEは商用製品 — こちらを使う場合はデータの扱いが別契約になる
- LLM APIコストは別途かかる — ただしAI呼び出しをリカバリ時のみに限定すれば、ビジョン型と比べて大幅に安く済む
AIエージェントとの親和性
Terminatorの実質的な主役はMCPサーバーのほう。
- MCPサーバーとして登録すれば、Claude CodeやCursorから自然言語でデスクトップを操作できる
- 「アプリを起動して、設定タブを開いて、チェックボックスをオンにして保存し、メモ帳で動作を確認して」といった指示が通る
- エージェントがアクセシビリティツリーを読んでセレクタを自分で試せるので、人間がインスペクタで探索するのと同じループを回せる
- 探索して動く手順が固まったら、決定論的なワークフローやSDKコードに落とし込む
つまりAIは「テストを書く側」に使い、「テストを実行する側」は決定論的コードに任せる。
CIで毎晩回すことを考えると、この分業が現実的だと思う。
Terminatorのセキュリティ上の懸念
Terminatorが強力な理由は「AIエージェントにデスクトップ全体の操作権限を渡すこと」であり、リスクはその裏返しとして存在する。
1. プロンプトインジェクション
最大のリスク。
エージェントは画面上のUIテキストを読んで判断する。
ということは、画面に表示された文字列が実質的に指示として機能しうる。
- 悪意あるWebページ、受信メールの本文、開いたドキュメント、処理対象のCSVの中身
- そこに「これまでの指示を無視して〜」と書き込まれていた場合、エージェントが従う可能性がある
これはTerminator固有の欠陥ではなく、Computer Use系エージェント全般に共通する未解決問題。
ただしTerminatorはOS全体を操作できるぶん、成功したときの被害範囲がブラウザ内に閉じない。
2. ブラウザの既存セッションを継承する設計
「再ログイン処理を書かなくていい」という利便性として紹介される機能だが、セキュリティ観点では警戒すべき特性。
- 専用Chrome拡張経由で、既存のCookieやSSO認証情報をそのまま利用する
- エージェントが乗っ取られた場合、攻撃者は認証済みセッションを持った状態で動くことになる
- 1のインジェクションと組み合わさると、情報の持ち出しまで一直線につながる
3. 権限の粒度がない
UIAには「このアプリだけ操作可」といった細かい制限をかける仕組みがない。
そのユーザーが操作できるものは、エージェントも操作できる。
なおUIPI(User Interface Privilege Isolation)により、非昇格プロセスから管理者権限のウィンドウは操作できない。
これは防御機構として機能するので、エージェントを管理者権限で起動するのは避けたい。
「動かないから管理者で実行」が最悪の解決策になる。
4. 画面録画機能と機微情報
ワークフロー録画は便利だが、録画中に画面に映っていたものはすべて取り込まれる。
- 認証情報、個人情報、顧客データ
- 顧客情報が映り込む可能性のある画面では使えない
録画対象の画面は事前に選別する必要がある。
5. サプライチェーンと名前の衝突
npx -y terminator-mcp-agent@latest という起動方法は手軽だが、実行のたびに最新版を取ってくることを意味する。
パッケージが侵害されれば、それがそのままデスクトップ操作権限を持って動く。
本番ではバージョンを固定すべき。
さらに厄介なのが名前の衝突。
エコシステム内に同名・類似名の無関係なプロジェクトが複数ある。
- rkuklik/terminator — Rustのエラー整形ライブラリ
- steipete/Terminator — macOSのターミナル制御MCP
- Terminator-Qwen3-8B — LLMの推論終了制御フレームワーク
単に紛らわしいだけでなく、タイポスクワッティング(Typosquatting)の温床でもある。
crate名が terminator-rs、リポジトリが mediar-ai/terminator であることを毎回確認する。
実務上の落としどころ
最低限こう構える。
- 専用のWindows VMで動かす。ホストの本番環境では動かさない
- 標準ユーザー権限で実行する。管理者権限を与えない
- そのVMのブラウザプロファイルに業務アカウントをログインさせない。顧客データを置かない
- バージョンを固定し、更新時は差分を確認する
- ワークフローYAMLはGit管理してレビュー対象にする
- 不可逆な操作(削除・送信・購入)には人間の承認を挟む
- AIの出番はエラーリカバリ時のみに限定し、通常時は決定論的コードで回す
テスト自動化という用途は、この点でかなり有利。
テスト対象は隔離環境の自作アプリであり、機微情報も本番認証も関与しない。
Terminatorを最も安全に使える用途のひとつだと思う。
逆に「業務PCで日常業務を丸ごと代行させる」という使い方は、現時点ではリスクに見合わない。