uitree-local
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| UITREE_TOKEN | No | Token for authenticating with the local Uitree Portal API. If not set, the token is auto-discovered via an explicit --token argument or adb content provider. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| pingB | Checks whether the Portal device API is reachable and responding. |
| get_screen_stateA | Returns the current UI accessibility tree (text, class names, bounds) plus phone state and screen dimensions. Call this first to understand what is on screen, then use tap / swipe / keyboard_input with coordinates taken from the returned bounds. |
| get_element_treeB | Returns only the accessibility element tree of the current screen as JSON. |
| get_phone_stateA | Returns phone state: current app, screen on/off, battery, connectivity. |
| get_screenshotA | Takes a screenshot of the device screen and returns it as an image. Use this for visual verification of UI before/after actions. |
| tapA | Taps at the given screen coordinates (pixels, 0,0 = top-left). Read coordinates from get_screen_state bounds. Prefer tap_element when you have a node's bounds: it picks the point randomly inside the element. |
| tap_elementA | Taps an element identified by its accessibility bounds. The tap point is chosen randomly inside the bounds after excluding |
| long_pressA | Long-presses at (x, y) for |
| long_press_elementA | Long-presses an element identified by bounds (random point inside the bounds, edge margin excluded). For e.g. icon long-press menus. |
| swipeA | Swipes (or drags) from one point to another over the given duration. A slow swipe (>400ms) reads as a drag in most apps. |
| press_global_actionB | Performs a system-level action. Valid actions: back, home, recents, notifications, quick_settings, power_dialog, toggle_split_screen, lock_screen, take_screenshot, headphone_button, dock_and_hold. Uses Android GLOBAL_ACTION_* semantics, requires the Portal accessibility service to be enabled. |
| keyboard_inputA | Types text into the currently focused field using the Portal keyboard bridge. Set clear=false to append instead of replacing the field content. |
| keyboard_clearC | Clears the currently focused text field. |
| keyboard_keyB | Sends a key press. Use named keys: back, home, app_switch, menu, enter, del, tab, space, escape, search, volume_up, volume_down, arrow_up/down/left/right, or a raw Android keycode integer. |
| get_clipboardB | Reads the current clipboard content. |
| set_clipboardC | Writes text to the device clipboard. |
| launch_appB | Launches an app by package name (and optional activity). Use list_installed_apps to find package names. |
| stop_appC | Force-stops an app by package name. |
| open_deep_linkB | Opens a deep link / URL (or intent). Use for URLs, market links, custom schemes. |
| list_installed_appsA | Lists installed packages. Returns a large list; grep it for the app you want. |
| list_filesB | Lists files in a directory on the device. |
| read_fileA | Reads a file from the device and returns its content base64-encoded as data URI. Decode it if you need the raw bytes. |
| write_fileB | Writes base64-encoded bytes to a file on the device (max ~4MB decoded). |
| delete_fileC | Deletes a file on the device. |
| set_overlay_offsetC | Adjusts the Portal floating-offset (only meaningful when the overlay is enabled). |
| is_overlay_visibleA | Returns whether the Portal overlay is currently visible. |
| install_apkA | Installs one or more APKs from URLs on the device (WebSocket required). Automatically accepts the install confirmation via the Portal. |
| set_keep_awakeB | Prevents the screen from sleeping while the connection is active (WebSocket required). |
| get_keep_awake_statusA | Returns whether screen keep-awake is currently active. |
| get_versionA | Returns the installed Portal app version. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 30 tools
Several tools overlap: get_screen_state already includes element tree and phone state, making get_element_tree and get_phone_state potentially confusing; keyboard_key and press_global_action both handle back/home; tap vs tap_element and long_press vs long_press_element split the same action by target type. Descriptions clarify intended use, but an agent still faces multiple plausible choices.
Names are consistently snake_case and mostly follow verb_noun or noun_verb patterns (get_screen_state, launch_app, tap_element). Minor deviations exist: keyboard_clear and keyboard_key put the noun first, and bare verbs tap/swipe/ping lack a noun. Overall readable and predictable.
30 tools is high for a device-automation MCP and exceeds the typical 3-15 well-scoped range; several getters are redundant because get_screen_state already bundles element tree and phone state. This inflates surface area and increases selection cost.
The surface covers core device control well: screen inspection, taps/swipes, keyboard, global actions, apps, files, clipboard, overlay, and keep-awake. Minor gaps remain (e.g., pinch/zoom or multi-touch gestures, wait-for-idle), but agents can work around them with existing swipe/tap primitives.