Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add mttmcknn/android-emulator-plugin --skill emulatorgit clone --depth 1 https://github.com/mttmcknn/android-emulator-pluginWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/mttmcknn/android-emulator-plugin/emulator)<a href="https://agentmods.dev/skills/mttmcknn/android-emulator-plugin/emulator"><img src="https://agentmods.dev/badge/skills/mttmcknn/android-emulator-plugin/emulator/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/mttmcknn/android-emulator-plugin/emulator"><img src="https://agentmods.dev/badge/skills/mttmcknn/android-emulator-plugin/emulator.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00067 | $0.02540 |
| Opus 5.5 | $0.00027 | $0.01016 |
| Sonnet 5.5 | $0.00013 | $0.00508 |
| Haiku 4.5 | $0.00007 | $0.00254 |
Grade A, and why
emulator scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured today.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 62 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Android Emulators
Each Codex chat can pin multiple emulators and connected Android devices. Every device belongs exclusively to one chat. The emulator MCP tools identify the calling chat automatically and reject another chat's device IDs.
Start and show the emulator
- Call
list_devicesorcheck_device_status. To use a connected phone, callpin_devicewith its listed serial. If it belongs to another chat, let the user confirm the move in the panel; never try to bypass confirmation. If the user named an existing AVD, pass it tostart_emulator; otherwise letstart_emulatorchoose one that is not already running. Without a name,start_emulatoruses the user's default device setting. - If no AVD exists or none matches the requested device, call
create_emulatorwith a profile such aspixel_9orpixel_tablet. It uses the newest suitable installed system image and starts the device. Leavekeepfalse unless the user wants the device after this chat. - Successful
start_emulatorandcreate_emulatorstartup open the device panel automatically and reuse this chat's tab. Do not callshow_device_panelafterward. Use it to reopen a closed panel or when the user asks to show it. Creating withstart: falsedoes not open the panel. - Tell the user which AVD and serial the chat owns, and whether it is read-only (state is discarded on stop).
For comparison, start another AVD or use newInstance: true for a second instance of the same AVD. The panel has separate device tabs; Compare or dragging one tab onto another shows both. Use the IDs from list_devices and pass deviceId on every device action when multiple devices are pinned. Never infer a target from the visible tab. Disconnecting a phone leaves its pin unavailable; it never redirects actions to a different device.
Operate the device
- Use only this plugin's device tools for this device. Do not run
adb,emulator, or Gradle device tasks against another serial, and never stop an emulator this chat does not own. - Start with
inspect_screenfor a screenshot, UI elements, and foreground app in one call. Reads run concurrently; check partial errors and remember a changing screen may differ between reads. Useread_screen_elementsfor lighter target lookup. - Find targets with
read_screen_elements, thentap_screenbytext,description, orresourceId. Use coordinates only when the tree has no usable element. SetdurationMsontap_screenfor a long press. - Use
wait_for_screenafter an action that changes the screen. Give it atext,description, orresourceIdselector; it waits up to 10 seconds by default for the target to appear, or usestate: "disappears"for transient UI to go away.timeoutMsaccepts whole milliseconds from 1 through 30000. - Use
scroll_to_elementfor an off-screen named element, optionally withtap: true. It stops after five swipes by default (ten maximum), on ambiguity, or when the viewport stops changing. Directions describe the finger movement. For nested scroll containers, use explicitswipe_screencoordinates. - Use
type_textfor Unicode text, including emoji. Supplytargetto focus a named editable field andreplace: trueto select all first. It uses the device clipboard and reports whether the UI confirms the result. Never automatically retry an unverified entry; inspect it first.submit: truepresses Enter only after verification; password/opaque fields need a separate explicit key action after inspection. - Use
manage_appto restart or force-stop a named package, or grant/revoke one named runtime permission. It does not clear data. - Use
take_screenshotto confirm visual results, layout, and anything the accessibility tree cannot show. Ordinary screenshots are temporary. Setsave: truewhen the user wants a reusable capture for clipboard or chat sharing; the result includes its capture ID and local file path. - Install builds with
install_appusing absolute APK paths, then launch withopen_app_or_link. For a shell-based Gradle install, target this chat's serial explicitly:ANDROID_SERIAL=<serial> ./gradlew :app:installDebug. - Use
change_device_settingsfor dark mode and font scale on any device. Location, battery, rotation, fold posture (posture: "folded","half-folded", or"unfolded"), and snapshots require an emulator.check_device_status.foldablelists the supported postures and current reading; posture controls require a foldable AVD with hinge support. Userun_device_commandfor logcat, package management, and other device-scoped commands. - Use
record_screento capture a flow as MP4 when the user wants a video. Stop returns a saved capture ID and local file path. Useview_or_copy_captureswithaction: "copy"and that ID to copy the PNG image or MP4 file to the macOS clipboard;action: "list"recovers this chat’s latest 20 captures.action: "context"returns the screenshot or up to four timestamped video samples (requires FFmpeg). Treat those frames as samples, not evidence of every event in the video; inspect the saved MP4 when motion or intervening events matter. These tools return media to the agent; the panel’s Add to chat action adds media to the user’s next message. - Use
manage_emulator_snapshotsto save or restore device state around risky steps. - The user sees each tap, swipe, key, and text-entry action in the panel, and may interact at the same time. Re-read the UI tree before acting if the screen may have changed.
- The user can attach the current screen to their message, @-mention devices or installed apps, drag APKs onto the device, and open
.apkfiles in a viewer that installs them. Check the capture timestamp before treating an attached screen as current.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- today First seen · 62 lines · 67 tokens per session scan A 9afe52f6fcac
emulator is a skill published in the GitHub repository mttmcknn/android-emulator-plugin (17 stars, last pushed today), licensed Apache-2.0. It adds 67 tokens to every session and 2,540 once invoked, about $0.0003 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-10-18.
Other skills, from other repositories
android_ui_verification
Automated end-to-end UI testing and verification on an Android Emulator using ADB.
solopi-ai
A command-line framework for testing Android apps and devices with SoloPi, including on-device or cloud AI decision models. It manages devices, test cases, recorded interactions, replays, performance history, and evidence.
ios-simulator
Verify and debug native, React Native, Expo, or Flutter apps on an iOS Simulator with agent-device. Use when an agent needs to launch an app, inspect its live UI, tap, type, scroll, validate a code change, collect failure evidence, or reproduce a workflow on an iPhone or iPad Simulator.
dogfood
Systematically explore and test a mobile app on iOS/Android with agent-device to find bugs, UX issues, and other problems. Use when asked to dogfood, QA, exploratory test, find issues, bug hunt, or test this app on mobile.
eas-simulator
Run and control a user's app on a remote iOS/Android simulator hosted on EAS cloud. Read before running any eas simulator: commands - it has the current syntax for this experimental API. Use whenever the user needs a simulator they can't run locally - 'run my app on a cloud simulator', 'use eas simulator to…
mobile-automation
Control Android and iOS devices, emulators and simulators — launch apps, tap, swipe, type, take screenshots, read the accessibility tree. Use when a task involves a mobile device or app, mobile UI testing, or reproducing a bug on a phone.