表題の通り、mobile-mcpを使ってiOSアプリのUIテストを試してみていくつか学びになったことがありましたので、まだ使用されたことのない方向けに執筆したいと思います。
mobile-mcpとは
LLMからiOS/Android 端末を自動操作するためのMCPサーバになります。過去にUIテストをやったことのある方ならご存知かも知れませんが、内部的にはAppiumが使われており、それをラップしてLLMから操作できるようにしたものと理解しておけば良いかと思います。
セットアップ
簡単にですが、セットアップ手順についてまとめておきます。
内部的にはAppiumを使用しているとお話しましたが、このAppiumを利用するにあたり、WebDriverAgentが必要になりますので、まずはこちらが動作できるようにします。
git clone --depth 1 https://github.com/appium/WebDriverAgent.git
// ここではiPhone 16を起動するように指定
// xcodeはインストールされている前提です
cd WebDriverAgent
xcodebuild -project WebDriverAgent.xcodeproj \
-scheme WebDriverAgentRunner \
-destination 'platform=iOS Simulator,name=iPhone 16' \
test
あとはmcpを設定するだけです。私の場合はClaude Codeを使用していますので、以下のコマンドを実行しました。
claude mcp add mobile -- npx -y @mobilenext/mobile-mcp@latest
実際に使ってみて感じた課題
mobile-mcpでは利用可能なツールが複数あり、例えばmcp_mobile_click_on_screen_at_coordinatesは指定座標をクリックする操作を提供します。
例えば「ログインボタンを押して」と指示を出すと、上記コマンドが実行されて実際に操作されるのですが試した感じ一発ではいけず、mcpと何度か会話していってクリックする要素の座標値を調整していくという作業が発生しました。(この辺りは使用するLLMによって変わる可能性はあるかと思います)
上記の会話で定まった座標値を次回以降のプロンプトで含めるようにすれば、その実行している端末に限り次回以降のテストはスムーズにいくと思いますが、端末を変えれば座標値も変わるのでこれでは持続性がないと感じました。
課題への対応
iOSではaccessibilityIdentifierという要素に固有のIDを付与をすることができます。mobile-mcpのツールでmobile_list_elements_on_screenというのがあり、これは画面上の要素一覧を取得するものになるのですが、これを使って付与したIDを元に操作対象の要素を特定させます。
例ですが、実行手順書を作成して下記のように記載しました。
## 要素特定の基本ルール
タップ操作を行う前に、必ず `mobile_list_elements_on_screen` で要素一覧を取得し、
`accessibilityIdentifier`(identifier)を使って目的の要素を特定してください。
### accessibilityIdentifierの重要性
accessibilityIdentifierを使うことで、UIの見た目(テキストやラベル)に依存せず、
一意の識別子で要素を特定できます。
### Step 1: ログインボタンをタップする
**要素の特定方法**:
1. `mobile_list_elements_on_screen` で要素一覧を取得
2. `identifier: "login_button"` を探す(ログイン画面では「ログイン」ボタン)
3. その要素の `coordinates` から中心座標を計算する
ツール: mobile_click_on_screen_at_coordinates
パラメータ:
- device: "iPhone 16"
- x: (login_buttonの中心x座標)
- y: (login_buttonの中心y座標)
上記手順だと、mcpで何度も要素の座標の調整をやりとりすることなくだいたい一発で該当の要素を操作してくれるようになりました。
手順まとめ
- accessibilityIdentifierを付与
- mobile_list_elements_on_screenで最初に操作対象の要素を取得
- mobile_click_on_screen_at_coordinatesで操作を行う
終わりに
使うにはそれなりに工夫はいりそうですが、UIテストを大いに補助してくれるツールだと思いました。ただしaccessibilityIdentifierを付与する前提なので、WebViewの多いアプリとかだと活用が難しいのではとも思いました。このあたりの課題感は使用していく中で、別ツールの利用も含めアプローチを考えていきたいと思います。