Xcode MCP の Device Interaction で iOS シミュレータを操作する
背景
Xcode 27 の MCP サーバーに DeviceInteractionStartSession などデバイス操作らしきツールが並んでいるのに気付きました。
実際にどこまでできるのか、手を動かして確かめました。
mcpbridge を直に叩いて動かす
Xcode MCP の実体は xcrun mcpbridge という実行ファイルで、標準入出力で JSON-RPC 2.0 のやり取りをします。
Claude Code を経由せず Python から直接起動すれば、ツールをそのまま試せます。
proc = subprocess.Popen(["xcrun", "mcpbridge"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True)
send({"jsonrpc": "2.0", "id": 1, "method": "initialize", "params": {...}})
call("DeviceInteractionStartWorkspaceSession", {...})
call("DeviceInteractionInstallAndRun", {...})
call("DeviceInteractionSynthesize", {
"interactSessionKey": session_key,
"activationBundleId": "com.example.app",
"interactionCommand": "t 200 400",
})
call("DeviceInteractionEndSession", {...})
セッションを開き、ビルドとインストールと起動を済ませ、interactionCommand に "t 200 400" を渡すとその座標をタップします。
activationBundleId を指定し忘れると、対象アプリではなく前面に出ている別のアプリに操作が届きます。
呼ぶたびにスクリーンショットと UI 階層のパスも返ってきます。
sim-use との比較
サードパーティ製ですが、シミュレータ操作には sim-use という CLI ツールもあります。 実際に動かして分かった違いは次の通りです。
ビルドから起動まで一つのツールで完結するのは Device Interaction の強みです。
一方で録画機能は見当たらず、実機は xcrun devicectl list devices 上では connected と表示されるのに、Device Interaction のデバイス候補には現れませんでした。
なお sim-use の実機対応も無条件ではありません。 実機ではアクセシビリティ要素を読む経路しか用意されておらず、座標タップの手段がないので、アクセシビリティ要素を持たないカスタム描画の UI は操作できません。
まとめ
シミュレータだけで完結し、録画が要らない作業なら Device Interaction を試す価値があります。
xcrun mcpbridge は Xcode があれば誰でも直に叩けるので、気になった方はぜひ試してみてください。