Use this skill when you need to control a single Android cloud device through the VMOS Edge Android Control API. MCP is an optional channel, not a prerequisite.
Connection entry
- If the user has already explicitly given
host_iporcloud_ip, prefer the value given by the user - If the user has not explicitly given an IP, first check whether
cbs_goexists locally; if it does, default tohost_ip=127.0.0.1 - If the user has not explicitly given an IP, and there is no
cbs_golocally, guide the user to providehost_ip、cloud_ip, or providedb_id - in a known host scenario. If both
vmos-edge-container-api:- are installed in the current session, use the host route
http://{host_ip}:18182/android_api/v2/{db_id} - . You must first obtain the target
POST /container_api/v1/get_dbvia the container API'sGET /container_api/v1/get_android_detail/{db_id}ordb_id
- are installed in the current session, use the host route
- . If currently only
vmos-edge-control-api:- is available, by default prefer the cloud device direct connection
http://{cloud_ip}:18185/api - only supports cloud devices with LAN mode enabled
- is available, by default prefer the cloud device direct connection
- If currently only
vmos-edge-control-api, and the current path requires going throughhost_ip:- If the user has already given
db_id, usehttp://{host_ip}:18182/android_api/v2/{db_id} - directly. If there is no
db_id, clearly state thatdb_idis still missing, orvmos-edge-container-api
- If the user has already given
- If the direct connection to
http://{cloud_ip}:18185/api/base/version_infocannot connect, times out, or returns5xx, clearly state that the current cloud device has not exposed the Control API, or has not enabled LAN mode
Core flow
- Always follow
Observe -> Plan -> Act -> Verify - On the first connection, first check whether
/base/version_info /base/version_infocan return successfully; if so, consider the current environment to support the Control API; if no return can be obtained, then explain that the current environment does not support it or has not exposed the interface- When locally checking
cbs_go, prefer exact matching, for examplepgrep -x cbs_go >/dev/null 2>&1 - , then use
/base/list_actionfor capability discovery:- When you need a low-cost way to see which interfaces the current device supports, first get the interface list
- When you need detailed usage of a certain interface, then query by
pathsin a targeted way and includedetail
- Observation priority:
- The screenshot interface
screenshot/format、screenshot/raw、screenshot/data_url /accessibility/dump_compact/accessibility/node's action-free query/display/info、/activity/top_activity、/package/list
- The screenshot interface
- Observation strategy:
- When you need to see the visual layout, icons, colors, popup occlusion, or coordinate click positions, prioritize screenshots
- When you need a low-cost way to obtain text, hierarchy, bounds, or need to connect with
/accessibility/node, prioritizedump_compact - When both can be used, take a screenshot first to understand the interface, then use
dump_compact/nodefor structured positioning - When echoing screenshots to the user: first use bash/exec's
curl -oto save the screenshot to the workspace directory (such as~/.openclaw/workspace/), then use the read tool to read that file so the model can see the image content - When returning images, prioritize saving
screenshot/formatorscreenshot/rawas files; only whenscreenshot/data_urlis available, then base64-decode and save to disk - Do not write
MEDIA:in text replies or directly paste base64 / data_url — these will not render as images - If you need to forward the image to a messaging channel (Telegram, etc.), use
message --media <路径>tool to send
- Do not include the old accessibility export / lookup interfaces in the default flow
- Interaction priority:
- Plan actions based first on the screenshot,
dump_compactor/accessibility/nodePlanning actions - Structured node location / operation priority
/accessibility/node - Tap / swipe priority
/input/click、/input/swipe、/input/scroll_bezier - Input priority
/input/text - Launch app priority
/activity/start; when first-launch authorization is needed, prioritize/activity/launch_app - Browser / web page scenarios priority
/activity/start_activityOpen the specified browser; browser package name prioritymark.via, if not available then usecom.android.chrome - Installation priority
/package/install_syncor/package/install_uri_sync - Reading or modifying Settings priority
/system/settings_get、/system/settings_put
- Plan actions based first on the screenshot,
- Re-observe after each key action; do not perform aggregated batch actions
- Only consider when there is no dedicated interface
/system/shell
Required reading reference
- First look at the index in
references/api-reference.md, then open only the needed reference files by module - Prioritize using
/base/list_actionto confirm capabilities as needed, then decide whether to expand more interface details - Only read the corresponding module reference when precise paths, fields, or example requests are needed
- If the task is "install, download, and open a third-party app", then read
references/app-installation.md - If the task is "search, open web pages, and extract web page content in the cloud phone browser", then read
references/browser-search-and-reading.md
Security boundaries
- Confirm user intent before deleting apps, clearing data, system settings, permission modifications, or shell operations
- When there is no explicit requirement, do not change the time zone, language, country, Google status, device information, location, or sensors