Android MCP Server
This Android MCP Server provides comprehensive Android device control and automation through 22 powerful tools for UI interaction, screen capture, and device management.
Key Capabilities:
Screen Capture & Streaming: Standard screenshots (1-2s), ultra-fast Scrcpy single frame capture (100-300ms), and real-time H.264 video streaming with frame polling (<50ms)
Touch & Gesture Control: Simulate taps, long presses, and swipe gestures at specific screen coordinates
Text Input & Key Events: Direct text input into focused fields and inject key events (HOME, BACK, ENTER, etc.)
App Management: Launch applications by package name and list installed packages with optional filtering
UI Automation (UIAutomator): Inspect UI hierarchy (XML dump), find elements by resource ID or text, and perform targeted interactions (click, double-click, long-click, set/clear text, toggle checkboxes, wait, and scroll)
Generic ADB Commands: Execute any custom ADB command for complete device control including logcat, shell commands, package management, and file operations
Multi-Device Support: Target specific devices using
deviceSerialfor parallel automation
Use Cases: Automated UI testing, remote device monitoring, form filling workflows, app QA, device farm automation, and documentation.
Provides Android device control capabilities via ADB, including capturing screenshots, simulating touch events at specific coordinates, and performing swipe gestures on connected Android devices or emulators.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Android MCP Servertake a screenshot of my phone"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Android MCP Server
A Model Context Protocol (MCP) server providing comprehensive Android device control with 22 powerful tools for UI automation, screen capture, and ultra-fast H.264 streaming via Scrcpy.
Features
📸 Screenshots: Capture screenshots from Android devices
👆 Touch & Gestures: Simulate touch, long press, swipe, and multi-point interactions
⌨️ Text Input & Key Events: Direct text input and key event simulation (2 tools)
Send key events (HOME, BACK, ENTER, etc.)
Input text directly into focused fields
🔧 Generic ADB Commands: Execute any ADB command with custom parameters (1 tool)
Full flexibility for agents to run custom ADB operations
Access to all ADB functionality (logcat, shell commands, package manager, etc.)
🎯 UIAutomator: Full UI hierarchy inspection and element interaction (10 tools)
Dump complete XML UI hierarchy
Find elements by resource ID or text
Click, double-click, long-click on elements
Set/clear text in input fields
Toggle checkboxes
Wait for elements to appear
Scroll within specific elements
⚡ Scrcpy Streaming: Ultra-fast H.264 video streaming (4 tools)
Start/stop H.264 video streams (~2s setup, <50ms frame polling)
Capture single frames (100-300ms) or latest stream frames (<50ms)
Dramatically faster than screenshot capture
🚀 App Management: Launch apps and list installed packages
🔌 ADB Integration: Direct integration with Android Debug Bridge
⚡ Auto-Download: Automatically downloads ADB and Scrcpy from official sources
Related MCP server: Android MCP
Prerequisites
Node.js 18 or higher
Android device connected via USB with USB debugging enabled, or emulator running
Note: ADB (Android Debug Bridge) and Scrcpy are optional - the server automatically downloads them from official sources on first use if needed.
Quick Start
Clone and Build
git clone https://github.com/jduartedj/android-mcp-server.git cd android-mcp-server npm install npm run buildTest the Server
node dist/index.jsThe server will start and automatically download ADB/Scrcpy if needed.
Add to VS Code (see VS Code Integration below)
Installation
npm install
npm run buildUsage
Running the Server Standalone
node dist/index.jsConfiguration
The server supports the following environment variables:
ADB_PATH: Custom path to ADB executable (default: uses system PATH or auto-downloads)DEVICE_SERIAL: Specific device serial number to target (default: first available device)
VS Code Integration
Adding to VS Code GitHub Copilot
To use this MCP server with GitHub Copilot in VS Code:
Open VS Code Settings (Ctrl+, or Cmd+,)
Search for MCP or navigate to:
GitHub Copilot > Chat > MCP ServersEdit the MCP configuration by clicking "Edit in settings.json"
Add the Android MCP Server to your configuration:
{
"github.copilot.chat.mcp.servers": {
"android-mcp-server": {
"command": "node",
"args": ["F:\\android-mcp-server\\dist\\index.js"],
"env": {
"ADB_PATH": "",
"DEVICE_SERIAL": ""
}
}
}
}Note: Replace F:\\android-mcp-server\\dist\\index.js with the actual absolute path to your dist/index.js file. Use double backslashes on Windows.
Alternative: Using npx (if published to npm):
{
"github.copilot.chat.mcp.servers": {
"android-mcp-server": {
"command": "npx",
"args": ["-y", "android-mcp-server"]
}
}
}Reload VS Code or restart the GitHub Copilot extension
Verifying the Integration
After adding the server:
Open GitHub Copilot Chat in VS Code
Type
@workspaceand you should see the Android MCP tools availableTry asking: "Take a screenshot of my Android device"
Copilot will use the appropriate tool to capture the screen
Example Prompts for Copilot
Once integrated, you can ask GitHub Copilot:
"Take a screenshot of my Android device"
"Start streaming my device screen for real-time monitoring"
"Get the latest frame from the stream"
"Tap at coordinates 500, 1000 on my phone"
"Swipe up on my Android screen"
"Press the back button on my device"
"Send the home key event"
"Type 'hello world' into the current field"
"Press enter to submit the form"
"Get the device battery status using ADB"
"Read the logcat output for debugging"
"Clear the app data for com.example.app"
"List all installed packages"
"Launch the Chrome app"
"Find the login button and click it"
"Fill in the email field with user@example.com"
"Dump the UI hierarchy of the current screen"
"Long press on the menu button"
"Scroll down in the settings list"
"Toggle the enable notifications checkbox"
"Wait for the loading indicator to disappear"
All 22 MCP Tools
Basic Tools (5)
1. android_screenshot
Capture a screenshot from the Android device.
Parameters:
outputPath(optional): Local path to save the screenshot. If not provided, returns base64 encoded image.deviceSerial(optional): Target specific device by serial number
Performance: ~1-2 seconds per capture
Example:
{
"name": "android_screenshot",
"arguments": {
"outputPath": "./screenshot.png"
}
}2. android_touch
Simulate a touch event at specific screen coordinates. Supports both quick taps and long presses.
Parameters:
x(required): X coordinatey(required): Y coordinateduration(optional): Touch duration in milliseconds (default: 100ms for tap, >100ms for long press)deviceSerial(optional): Target specific device by serial number
Performance: Immediate
Example - Quick Tap:
{
"name": "android_touch",
"arguments": { "x": 500, "y": 1000, "duration": 100 }
}Example - Long Press:
{
"name": "android_touch",
"arguments": { "x": 500, "y": 1000, "duration": 2000 }
}3. android_swipe
Perform a swipe gesture between two coordinates.
Parameters:
startX(required): Starting X coordinatestartY(required): Starting Y coordinateendX(required): Ending X coordinateendY(required): Ending Y coordinateduration(optional): Swipe duration in milliseconds (default: 300)deviceSerial(optional): Target specific device by serial number
Performance: Immediate
Example:
{
"name": "android_swipe",
"arguments": {
"startX": 500, "startY": 1500, "endX": 500, "endY": 500, "duration": 300
}
}4. android_launch_app
Launch an Android app by package name.
Parameters:
packageName(required): Package name of the app (e.g., com.example.app, com.google.android.apps.maps)deviceSerial(optional): Target specific device by serial number
Performance: ~1-2 seconds
Example:
{
"name": "android_launch_app",
"arguments": { "packageName": "com.example.app" }
}5. android_list_packages
List installed packages on the Android device with optional filtering.
Parameters:
filter(optional): Search filter for package names (case-insensitive)deviceSerial(optional): Target specific device by serial number
Performance: Medium (retrieves full package list)
Example - List All Packages:
{
"name": "android_list_packages",
"arguments": {}
}Example - Filter Packages:
{
"name": "android_list_packages",
"arguments": { "filter": "google" }
}Text Input & Key Event Tools (2)
6. android_input_text
Input text into the currently focused field on the Android device via ADB.
Parameters:
text(required): Text to input. Spaces are automatically handled.deviceSerial(optional): Target specific device by serial number
Performance: Immediate
Use Cases:
Quick text input without UIAutomator
Inputting text when element resource ID is unknown
Simple form filling
Command-line style text entry
Example:
{
"name": "android_input_text",
"arguments": {
"text": "user@example.com"
}
}7. android_send_key_event
Send a key event to the Android device (e.g., HOME, BACK, ENTER).
Parameters:
keyCode(required): Key event code. Can be key name (e.g., KEYEVENT_HOME, KEYEVENT_BACK) or numeric code (e.g., 3 for HOME, 4 for BACK)deviceSerial(optional): Target specific device by serial number
Performance: Immediate
Common Key Codes:
KEYEVENT_HOMEor3- Home buttonKEYEVENT_BACKor4- Back buttonKEYEVENT_ENTERor66- Enter/Return keyKEYEVENT_DELor67- Delete keyKEYEVENT_MENUor82- Menu buttonKEYEVENT_VOLUME_UPor24- Volume upKEYEVENT_VOLUME_DOWNor25- Volume downKEYEVENT_POWERor26- Power button
Use Cases:
Navigation (HOME, BACK)
Submitting forms (ENTER)
Controlling device functions (VOLUME, POWER)
Keyboard shortcuts
Example:
{
"name": "android_send_key_event",
"arguments": {
"keyCode": "KEYEVENT_BACK"
}
}Generic ADB Command Tool (1)
8. android_execute_command
Execute a generic ADB command with custom arguments. This powerful tool gives agents full flexibility to run any ADB command with their own parameters.
Parameters:
args(required): Array of ADB command arguments (e.g., ["shell", "pm", "list", "packages"])deviceSerial(optional): Target specific device by serial number
Performance: Varies by command
Returns: Both stdout and stderr from the command execution
Use Cases:
Execute custom shell commands
Access logcat for debugging
Manage packages (install, uninstall, clear data)
Query device properties
File operations (push, pull)
Network operations (port forwarding)
Any ADB functionality not covered by specific tools
Common Examples:
List all packages:
{
"name": "android_execute_command",
"arguments": {
"args": ["shell", "pm", "list", "packages"]
}
}Get device properties:
{
"name": "android_execute_command",
"arguments": {
"args": ["shell", "getprop", "ro.build.version.release"]
}
}Read logcat:
{
"name": "android_execute_command",
"arguments": {
"args": ["logcat", "-d", "-s", "MyTag:V"]
}
}Clear app data:
{
"name": "android_execute_command",
"arguments": {
"args": ["shell", "pm", "clear", "com.example.app"]
}
}Get battery info:
{
"name": "android_execute_command",
"arguments": {
"args": ["shell", "dumpsys", "battery"]
}
}Push file to device:
{
"name": "android_execute_command",
"arguments": {
"args": ["push", "/local/path/file.txt", "/sdcard/file.txt"]
}
}Install APK:
{
"name": "android_execute_command",
"arguments": {
"args": ["install", "-r", "/path/to/app.apk"]
}
}Port forwarding:
{
"name": "android_execute_command",
"arguments": {
"args": ["forward", "tcp:8080", "tcp:8080"]
}
}UIAutomator Tools (10)
9. android_uiautomator_dump
Dump the complete UI hierarchy of the current screen as XML for inspection and element identification.
Parameters:
deviceSerial(optional): Target specific device by serial number
Returns: Complete XML UI hierarchy that can be parsed to find element resource IDs and attributes.
Performance: ~500-800ms
Use Cases:
Inspecting app UI structure
Finding element resource IDs for automation
Understanding view hierarchies
Example:
{
"name": "android_uiautomator_dump",
"arguments": {}
}10. android_uiautomator_find
Find UI elements by resource ID or text content using UIAutomator.
Parameters:
resourceId(optional): Resource ID to search for (e.g., com.example.app:id/button_submit)text(optional): Text content to search fordeviceSerial(optional): Target specific device by serial number
Performance: Fast
Example - Find by Resource ID:
{
"name": "android_uiautomator_find",
"arguments": { "resourceId": "com.example.app:id/email_input" }
}Example - Find by Text:
{
"name": "android_uiautomator_find",
"arguments": { "text": "Submit" }
}11. android_uiautomator_click
Click on a UI element by resource ID.
Parameters:
resourceId(required): Resource ID of the element to clickdeviceSerial(optional): Target specific device by serial number
Performance: Immediate
Example:
{
"name": "android_uiautomator_click",
"arguments": { "resourceId": "com.example.app:id/button_submit" }
}12. android_uiautomator_double_click
Perform a double-click on a UI element by resource ID.
Parameters:
resourceId(required): Resource ID of the elementdeviceSerial(optional): Target specific device by serial number
Performance: Immediate
Example:
{
"name": "android_uiautomator_double_click",
"arguments": { "resourceId": "com.example.app:id/text_field" }
}13. android_uiautomator_long_click
Perform a long-click on a UI element by resource ID.
Parameters:
resourceId(required): Resource ID of the elementdeviceSerial(optional): Target specific device by serial number
Performance: Immediate
Example:
{
"name": "android_uiautomator_long_click",
"arguments": { "resourceId": "com.example.app:id/menu_item" }
}14. android_uiautomator_set_text
Set text on a UI element by resource ID. Automatically clears existing text first.
Parameters:
resourceId(required): Resource ID of the elementtext(required): Text to setdeviceSerial(optional): Target specific device by serial number
Performance: Immediate
Example:
{
"name": "android_uiautomator_set_text",
"arguments": {
"resourceId": "com.example.app:id/email_input",
"text": "user@example.com"
}
}15. android_uiautomator_clear_text
Clear text from a UI element by resource ID.
Parameters:
resourceId(required): Resource ID of the elementdeviceSerial(optional): Target specific device by serial number
Performance: Immediate
Example:
{
"name": "android_uiautomator_clear_text",
"arguments": { "resourceId": "com.example.app:id/search_input" }
}16. android_uiautomator_toggle_checkbox
Toggle a checkbox element by resource ID.
Parameters:
resourceId(required): Resource ID of the checkboxdeviceSerial(optional): Target specific device by serial number
Performance: Immediate
Example:
{
"name": "android_uiautomator_toggle_checkbox",
"arguments": { "resourceId": "com.example.app:id/agree_checkbox" }
}17. android_uiautomator_wait
Wait for a UI element to appear by resource ID with timeout support.
Parameters:
resourceId(required): Resource ID to wait fortimeoutMs(optional): Maximum wait time in milliseconds (default: 5000)deviceSerial(optional): Target specific device by serial number
Performance: Configurable (up to timeout)
Example:
{
"name": "android_uiautomator_wait",
"arguments": {
"resourceId": "com.example.app:id/loading_indicator",
"timeoutMs": 10000
}
}18. android_uiautomator_scroll_in_element
Scroll within a specific scrollable UI element.
Parameters:
resourceId(required): Resource ID of the scrollable elementdirection(required): Direction to scroll (up, down, left, right)distance(optional): Distance to scroll in pixels (default: 500)deviceSerial(optional): Target specific device by serial number
Performance: Immediate
Example:
{
"name": "android_uiautomator_scroll_in_element",
"arguments": {
"resourceId": "com.example.app:id/list_view",
"direction": "down",
"distance": 500
}
}Scrcpy Streaming Tools (4)
Scrcpy streaming provides ultra-fast frame capture using H.264 video encoding, perfect for real-time monitoring, rapid screenshot sequences, or continuous frame polling.
19. android_start_scrcpy_stream
Initialize an H.264 video stream from the Android device using Scrcpy.
Parameters:
deviceSerial(optional): Target specific device by serial numberbitrate(optional): Video bitrate in Mbps (default: 4)fps(optional): Frames per second (default: 60)
Performance: ~2 seconds setup, <50ms per frame polling afterward
Advantages:
Ultra-fast frame capture (<50ms vs 1-2s for screenshot)
Continuous streaming with pre-buffered frames
Ideal for real-time monitoring
H.264 compression reduces bandwidth
Example:
{
"name": "android_start_scrcpy_stream",
"arguments": {
"bitrate": 4,
"fps": 30
}
}20. android_get_latest_frame
Poll the latest frame from an active Scrcpy stream.
Parameters:
deviceSerial(optional): Target specific device by serial numberoutputPath(optional): Save frame to file, otherwise returns base64
Performance: <50ms per frame (due to pre-buffered streaming)
Use Cases:
Real-time monitoring
Rapid screenshot sequences
Continuous frame polling
Streaming visualization
Example:
{
"name": "android_get_latest_frame",
"arguments": {
"outputPath": "./current_frame.png"
}
}21. android_stop_scrcpy_stream
Stop an active Scrcpy H.264 stream.
Parameters:
deviceSerial(optional): Target specific device by serial number
Example:
{
"name": "android_stop_scrcpy_stream",
"arguments": {}
}22. android_capture_frame_scrcpy
Capture a single frame using Scrcpy without starting a persistent stream.
Parameters:
deviceSerial(optional): Target specific device by serial numberoutputPath(optional): Save frame to file, otherwise returns base64bitrate(optional): Video bitrate in Mbps (default: 4)
Performance: 100-300ms (faster than screenshot, slower than streaming)
Use Cases:
One-off frame captures
When streaming overhead isn't justified
Single frame comparison
Lightweight capture operations
Example:
{
"name": "android_capture_frame_scrcpy",
"arguments": {
"outputPath": "./single_frame.png"
}
}Performance Comparison
Tool | Purpose | Speed | Best For |
| Basic capture | 1-2s | Simple screenshots, initial inspection |
| Single Scrcpy frame | 100-300ms | Faster one-off captures than screenshot |
| Initialize stream | ~2s setup | Real-time monitoring workflows |
| Poll stream | <50ms | Rapid frame sequences, real-time apps |
| Tap/long press | Immediate | UI interaction |
| Swipe gesture | Immediate | Navigation, scrolling |
| Direct text input | Immediate | Quick text entry via ADB |
| Key events | Immediate | Navigation (HOME, BACK, ENTER) |
| Generic ADB | Varies | Custom ADB operations, full flexibility |
| UI inspection | 500-800ms | Element discovery |
| Element search | Fast | Located specific elements |
| Element interaction | Immediate | Form filling, UI automation |
Common Use Cases
1. Automated Testing
1. Dump UI hierarchy to find element IDs
2. Click buttons and input text using resource IDs
3. Use streaming to verify visual changes in real-time
4. Scroll and navigate through the app2. Real-Time Monitoring
1. Start Scrcpy stream (one-time ~2s setup)
2. Poll latest frames continuously (<50ms each)
3. Process frames for visual analysis
4. Stop stream when done3. Rapid Frame Capture Sequence
1. Start Scrcpy stream
2. Get latest frame multiple times (much faster than screenshot)
3. Process frame sequence for animation/comparison
4. Stop stream4. Form Filling (WebView or Native)
1. Find form fields by resource ID or text
2. Clear existing text
3. Set new text values
4. Toggle checkboxes and radio buttons
5. Click submit button5. Multi-Device Automation
Use deviceSerial parameter to target specific devices:
1. List connected devices via ADB
2. Specify device serial for each tool call
3. Automate workflows on multiple devices in parallel
4. Useful for device farms and testing labs6. App Discovery
1. List all packages (potentially 100+)
2. Filter packages by name (e.g., "google", "com.example")
3. Launch apps by package name
4. Perfect for discovering available apps on the deviceADB & Scrcpy Setup
Automatic Installation
The server automatically downloads and installs from official sources:
ADB: From Android Platform Tools
Scrcpy: From official releases
Downloaded tools stored in ~/.android-mcp-server/platform-tools/
Manual Installation (Optional)
Windows:
choco install adb
choco install scrcpymacOS:
brew install android-platform-tools
brew install scrcpyLinux (Ubuntu/Debian):
sudo apt-get install android-tools-adb scrcpyEnabling USB Debugging on Android
Go to Settings → About Phone
Tap Build Number 7 times to enable Developer Options
Go to Settings → Developer Options
Enable USB Debugging
Connect device via USB and accept the debugging prompt
Verify Connection
adb devicesYou should see your device listed.
Troubleshooting
Issue | Solution |
"No Android devices found" | Ensure device is connected via USB and USB debugging is enabled. Run |
UIAutomator element not found | Use |
Scrcpy stream won't start | Ensure Scrcpy is installed or allow auto-download to complete. Check device is connected. |
"ADB not found" error | Run the server once to auto-download ADB, or manually install platform-tools. |
Touch coordinates not working | Verify coordinates are within screen bounds. Use screenshots to determine correct coordinates. |
App launch fails | Verify package name is correct using |
Streaming frames are slow | Reduce bitrate/fps or use single |
Advanced Patterns
Real-Time Visual Monitoring
1. android_start_scrcpy_stream (2s setup)
2. Loop: android_get_latest_frame (<50ms each)
3. Process frames for ML/analysis
4. android_stop_scrcpy_stream when doneStress Testing with Rapid Frames
1. Start stream
2. Perform action on device
3. Capture 10+ frames in rapid succession (<50ms each)
4. Compare frame changes for regression detectionMulti-Step Form Automation
1. android_uiautomator_dump (find all fields)
2. For each field:
- android_uiautomator_find (locate)
- android_uiautomator_set_text (fill)
3. android_uiautomator_click (submit)
4. android_uiautomator_wait (result screen)
5. android_screenshot (verify)Device Farm Parallel Testing
1. Get device list
2. For each device:
- Specify deviceSerial in all tool calls
- Run automation sequence
- Compare results across devicesArchitecture
The server uses the Model Context Protocol to expose Android device control:
ADB Wrapper (
src/adb-wrapper.ts): Device communication, auto-downloads ADBScrcpy Integration (
src/adb-wrapper.ts): H.264 streaming, frame pollingUIAutomator Methods (
src/adb-wrapper.ts): Full XML dumping, element interactionTool Handlers (
src/handlers.ts): All 19 tool operationsMCP Server (
src/index.ts): Exposes all tools via Model Context Protocol
Supported Android Versions
Android 5.0+ (API Level 21+)
Scrcpy streaming: Android 5.0+ via ADB, optimal on 7.0+
Development
# Install dependencies
npm install
# Build
npm run build
# Watch mode (if supported)
npm run watchAdding New Tools
To add a new tool:
Implement method in
src/adb-wrapper.tsImplement handler in
src/handlers.tsRegister tool in
src/index.tswith name, description, and schemaBuild and test with the server running
License
MIT
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Available Tools
22 toolsandroid_capture_frame_scrcpyB
Capture a single frame via scrcpy (faster than ADB screencap)
| Name | Required | Description | Default |
|---|---|---|---|
| outputPath | No | Local path to save the frame (optional). If not provided, returns base64 encoded image. | |
| deviceSerial | No | Specific device serial number to target (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It mentions 'faster than ADB screencap', which adds useful context about performance, but it doesn't disclose other behavioral traits such as whether it requires scrcpy to be running, what happens if no device is connected, or if it has any rate limits. For a tool with no annotations, this leaves significant gaps in understanding its behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core purpose ('Capture a single frame via scrcpy') and adds a key benefit ('faster than ADB screencap'). There is no wasted text, and it's appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, no output schema, and 2 parameters with full schema coverage, the description is minimal but adequate. It covers the basic purpose and a performance advantage, but for a tool that interacts with devices and saves files, it lacks details on error handling, prerequisites (e.g., scrcpy setup), or return values. It's complete enough for a simple tool but has clear gaps in context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters (outputPath and deviceSerial) with descriptions. The description adds no additional parameter information beyond what's in the schema, such as format details or examples. With high schema coverage, the baseline is 3, as the description doesn't compensate but also doesn't detract.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Capture a single frame via scrcpy' specifies the action (capture) and resource (frame), and it distinguishes from siblings by mentioning 'faster than ADB screencap', which differentiates it from android_screenshot. However, it doesn't explicitly name the sibling android_screenshot as an alternative, so it's not a perfect 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by stating 'faster than ADB screencap', suggesting this tool is preferred for speed over alternatives like android_screenshot. However, it doesn't explicitly state when to use this vs. other frame-capturing tools (e.g., android_get_latest_frame) or provide clear exclusions, so guidance is implied but not comprehensive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_execute_commandB
Execute a generic ADB command with custom arguments. Allows agents to run any ADB command with their own parameters.
| Name | Required | Description | Default |
|---|---|---|---|
| args | Yes | Array of ADB command arguments (e.g., ["shell", "pm", "list", "packages"] or ["logcat", "-d", "-s", "MyTag"]) | |
| deviceSerial | No | Specific device serial number to target (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It mentions executing commands but lacks details on behavioral traits like permissions required, error handling, safety risks (e.g., destructive commands), or output format. This is a significant gap for a tool that could perform arbitrary operations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and concise, with two sentences that directly state the purpose and flexibility. Every sentence earns its place by clarifying the tool's role without unnecessary elaboration, making it efficient for quick understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of executing arbitrary ADB commands, no annotations, and no output schema, the description is incomplete. It doesn't address critical aspects like command safety, expected outputs, or integration with sibling tools, leaving gaps that could hinder effective agent use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters thoroughly. The description adds no additional meaning beyond stating it's for 'custom arguments,' which aligns with the schema but doesn't provide extra context like common use cases or constraints. Baseline 3 is appropriate here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Execute a generic ADB command with custom arguments.' It specifies the verb ('Execute') and resource ('ADB command'), distinguishing it from sibling tools that perform specific actions like screenshot or input. However, it doesn't explicitly differentiate from all siblings, as some might also involve ADB commands indirectly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by stating it 'Allows agents to run any ADB command with their own parameters,' suggesting it's for custom or unsupported commands. It doesn't provide explicit when-to-use vs. alternatives, such as preferring specific sibling tools for common tasks, leaving usage context somewhat implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_get_latest_frameB
Get the latest frame from scrcpy stream (instant access, no latency)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden but only mentions 'instant access, no latency'. It omits critical behavioral details: whether this is read-only or modifies state, potential errors if the stream isn't running, return format (e.g., image data), or performance implications like memory usage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core purpose ('Get the latest frame') and adds qualifying context ('instant access, no latency'). Every word earns its place with no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of accessing a live stream and no annotations or output schema, the description is incomplete. It fails to explain prerequisites (e.g., stream must be active), error conditions, or return value format, leaving significant gaps for safe and effective tool invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0 parameters with 100% coverage, so no parameter documentation is needed. The description appropriately adds no parameter details, focusing on tool behavior instead, which aligns with the baseline for zero parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get') and resource ('latest frame from scrcpy stream'), specifying it provides 'instant access, no latency'. It distinguishes from sibling 'android_capture_frame_scrcpy' by emphasizing immediacy versus potential capture delay, though not explicitly naming the alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when low-latency frame access is needed from an active scrcpy stream, as suggested by 'instant access, no latency'. However, it lacks explicit guidance on prerequisites (e.g., requiring 'android_start_scrcpy_stream' first) or clear alternatives like 'android_screenshot' for non-stream contexts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_input_textA
Input text into the currently focused field on the Android device via ADB
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to input. Spaces will be automatically handled. | |
| deviceSerial | No | Specific device serial number to target (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. While it mentions the action and method (ADB), it lacks critical behavioral details such as whether this requires device accessibility permissions, what happens if no field is focused, error conditions, or performance characteristics. The description is minimal and doesn't adequately cover behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero wasted words. It's front-loaded with the core purpose and includes essential context about the method (ADB). Every element of the description serves a clear purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a device interaction tool with no annotations and no output schema, the description is insufficient. It doesn't explain what happens on success/failure, return values, error conditions, or prerequisites (like needing ADB setup or device accessibility enabled). The description leaves too many operational questions unanswered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents both parameters. The description doesn't add any parameter-specific information beyond what's in the schema (e.g., it doesn't explain text encoding, special character handling, or device selection logic). Baseline 3 is appropriate when schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Input text'), target resource ('currently focused field on the Android device'), and method ('via ADB'). It distinguishes itself from sibling tools like android_uiautomator_set_text by specifying it works on the currently focused field rather than requiring UI element targeting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context ('currently focused field') which suggests when to use this tool versus alternatives like android_uiautomator_set_text that require element identification. However, it doesn't explicitly state when NOT to use it or name specific alternative tools, leaving some ambiguity about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_launch_appC
Launch an Android app by package name
| Name | Required | Description | Default |
|---|---|---|---|
| packageName | Yes | Package name of the app to launch (e.g., com.example.app) | |
| deviceSerial | No | Specific device serial number to target (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden for behavioral disclosure. It states the action ('Launch') but doesn't describe what happens (e.g., app opens on device, may fail if not installed, requires device to be connected/on), permissions needed, or error conditions. This is a significant gap for a tool with potential side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero waste—it directly states the tool's purpose without unnecessary words. It's appropriately sized and front-loaded, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description is incomplete for a tool that performs an action with potential side effects. It lacks details on behavior (e.g., success/failure states, device requirements), return values, or error handling, which are crucial for an agent to use it correctly in context with sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with clear descriptions for both parameters (package name and optional device serial). The description adds no additional parameter semantics beyond what the schema provides, such as format examples or constraints. Baseline 3 is appropriate since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Launch') and target resource ('Android app by package name'), providing a specific verb+resource combination. However, it doesn't explicitly differentiate from sibling tools like 'android_list_packages' or 'android_execute_command' that might also interact with apps, leaving some ambiguity about its unique role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., device connectivity), exclusions (e.g., apps not installed), or compare it to siblings like 'android_execute_command' for broader commands or 'android_list_packages' for discovery, leaving the agent to infer usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_list_packagesC
List installed packages on the Android device
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Optional filter to search for specific packages (case-insensitive) | |
| deviceSerial | No | Specific device serial number to target (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states it 'lists' packages, which implies a read-only operation, but doesn't specify what the output includes (e.g., package names, versions, permissions), whether it requires ADB access or specific permissions, or if there are rate limits. The description is minimal and lacks crucial behavioral details for a tool interacting with a device.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence that front-loads the core purpose without any fluff or redundancy. Every word earns its place, making it highly efficient and easy to parse. It's appropriately sized for a simple listing tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (device interaction tool with no annotations and no output schema), the description is incomplete. It doesn't explain the return format (e.g., list of strings, JSON structure), error conditions, or dependencies like ADB setup. For a tool that likely outputs data, the lack of output details is a significant gap, making it inadequate for full contextual understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both parameters (filter and deviceSerial) well-documented in the schema. The description adds no additional parameter information beyond implying a listing action. According to the rules, with high schema coverage (>80%), the baseline is 3 even with no param info in the description, which fits here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('List') and resource ('installed packages on the Android device'), making the purpose immediately understandable. It distinguishes from siblings like android_execute_command or android_launch_app by focusing on package enumeration rather than execution or interaction. However, it doesn't explicitly differentiate from potential similar tools (e.g., if there were a 'list_system_packages' sibling), so it's not a perfect 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., device connectivity), exclusions (e.g., not for uninstalled packages), or related tools (e.g., whether android_uiautomator_dump might overlap). Usage is implied from the name and purpose alone, but no explicit context is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_screenshotC
Capture a screenshot from the Android device
| Name | Required | Description | Default |
|---|---|---|---|
| outputPath | No | Local path to save the screenshot (optional). If not provided, returns base64 encoded image. | |
| deviceSerial | No | Specific device serial number to target (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states 'capture a screenshot' but doesn't mention any behavioral traits such as permissions needed, whether it requires an unlocked device, potential delays, or what happens if the device is off. This leaves significant gaps for a tool that interacts with hardware.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence that efficiently conveys the core action without any wasted words. It's appropriately sized and front-loaded, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of interacting with an Android device and the lack of annotations and output schema, the description is insufficient. It doesn't explain what the tool returns (e.g., base64 image or file path), error conditions, or dependencies, making it incomplete for safe and effective use by an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, clearly documenting both optional parameters. The description adds no additional parameter semantics beyond what the schema provides, so it meets the baseline score of 3 for high schema coverage without extra value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('capture') and resource ('screenshot from the Android device'), making the purpose immediately understandable. However, it doesn't differentiate from sibling tools like 'android_capture_frame_scrcpy' or 'android_get_latest_frame', which appear to be related screenshot/capture tools, so it doesn't reach the highest score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. With multiple sibling tools that might involve capturing or getting frames (e.g., android_capture_frame_scrcpy, android_get_latest_frame), there's no indication of when this specific screenshot tool is preferred or what distinguishes it, leaving the agent without usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_send_key_eventB
Send a key event to the Android device (e.g., KEYEVENT_HOME, KEYEVENT_BACK, KEYEVENT_ENTER)
| Name | Required | Description | Default |
|---|---|---|---|
| keyCode | Yes | Key event code (e.g., KEYEVENT_HOME, KEYEVENT_BACK, KEYEVENT_ENTER, 3 for HOME, 4 for BACK). Can be key name or numeric code. | |
| deviceSerial | No | Specific device serial number to target (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden but lacks behavioral details. It doesn't disclose effects (e.g., whether it simulates physical key presses, requires device connectivity, or has rate limits), leaving the agent to infer behavior from the action 'Send'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core purpose and provides relevant examples without unnecessary elaboration. Every word contributes to understanding the tool's function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 2 parameters, 100% schema coverage, and no output schema, the description is adequate but incomplete. It covers the basic purpose but lacks details on behavioral traits (e.g., device state requirements or error handling), which are important given the absence of annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents keyCode and deviceSerial parameters. The description adds minimal value by listing example key codes (KEYEVENT_HOME, KEYEVENT_BACK, KEYEVENT_ENTER), which aligns with but doesn't significantly expand on schema details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Send a key event') and target ('Android device'), with examples like KEYEVENT_HOME and KEYEVENT_BACK. It distinguishes from siblings like android_input_text (for text) and android_touch (for touch gestures), but doesn't explicitly contrast them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives is provided. For example, it doesn't specify when to use android_send_key_event over android_input_text for Enter key events or android_touch for navigation, leaving usage context implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_start_scrcpy_streamB
Start scrcpy streaming for continuous fast frame capture (requires scrcpy installed)
| Name | Required | Description | Default |
|---|---|---|---|
| deviceSerial | No | Specific device serial number to target (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden but only mentions the scrcpy installation prerequisite. It doesn't disclose whether this starts a background process, consumes resources, requires specific permissions, has rate limits, or how to access the streamed frames. For a streaming tool with zero annotation coverage, this leaves significant behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core purpose and includes a crucial prerequisite. Every word earns its place with no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a streaming tool with no annotations and no output schema, the description is insufficient. It doesn't explain what 'continuous fast frame capture' means operationally, how frames are accessed, whether the stream persists across tool calls, or what happens if scrcpy isn't installed. Given the complexity and lack of structured data, more context is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with one optional parameter clearly documented in the schema. The description adds no parameter information beyond what the schema provides, so it meets the baseline for high schema coverage but doesn't add extra value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Start scrcpy streaming') and purpose ('for continuous fast frame capture'), which distinguishes it from single-frame capture tools like android_capture_frame_scrcpy or android_screenshot. However, it doesn't explicitly differentiate from android_stop_scrcpy_stream beyond the obvious start/stop distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when continuous frame capture is needed versus single-frame alternatives, but doesn't explicitly state when to use this tool versus android_capture_frame_scrcpy or android_get_latest_frame. The prerequisite 'requires scrcpy installed' provides some context but no explicit when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_stop_scrcpy_streamB
Stop scrcpy streaming
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the action ('Stop') but doesn't explain what happens when invoked (e.g., whether it terminates an active stream gracefully, frees resources, or has side effects). This is a significant gap for a tool that likely involves resource management.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with just three words, front-loading the essential action. There's no wasted text, making it efficient and easy to parse, which is ideal for a simple tool with no parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (0 parameters, no output schema, no annotations), the description is minimally adequate but lacks completeness. It doesn't address behavioral aspects like what 'Stop' entails or dependencies on other tools, leaving gaps that could confuse an agent about proper usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0 parameters with 100% coverage, so no parameter documentation is needed. The description doesn't add parameter information, which is appropriate here, earning a baseline score of 4 for not introducing unnecessary details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Stop') and resource ('scrcpy streaming'), making the purpose immediately understandable. It doesn't explicitly differentiate from sibling tools like 'android_start_scrcpy_stream', but the action is specific enough to infer it's the counterpart to starting the stream.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives or any prerequisites. It doesn't mention that it should be used after starting a stream with 'android_start_scrcpy_stream' or warn against using it if no stream is active, leaving usage context unclear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_swipeC
Perform a swipe gesture between two coordinates
| Name | Required | Description | Default |
|---|---|---|---|
| startX | Yes | Starting X coordinate | |
| startY | Yes | Starting Y coordinate | |
| endX | Yes | Ending X coordinate | |
| endY | Yes | Ending Y coordinate | |
| duration | No | Swipe duration in milliseconds (default: 300) | |
| deviceSerial | No | Specific device serial number to target (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions the gesture but doesn't cover important aspects like whether this requires device interaction permissions, if it's synchronous/asynchronous, error conditions, or what happens on multi-touch screens. The default duration is mentioned in the schema but not in the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that states exactly what the tool does with zero wasted words. It's appropriately sized for a straightforward input/output tool and is perfectly front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool that performs device interaction with no annotations and no output schema, the description is insufficient. It doesn't explain what constitutes valid coordinate ranges, how coordinates map to screen dimensions, what happens if coordinates are out of bounds, or what the expected outcome of a successful swipe is.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all parameters. The description adds no additional parameter semantics beyond what's already in the schema. The baseline of 3 is appropriate when the schema does all the parameter documentation work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('perform a swipe gesture') and specifies it's between two coordinates, which distinguishes it from other touch-based interactions like android_touch or android_uiautomator_click. However, it doesn't explicitly differentiate from all sibling tools beyond the basic gesture type.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like android_touch or android_uiautomator_scroll_in_element. The description only states what it does, not when it's appropriate or what scenarios it's designed for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_touchC
Simulate a touch event at specific screen coordinates
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | X coordinate | |
| y | Yes | Y coordinate | |
| duration | No | Touch duration in milliseconds (default: 100) | |
| deviceSerial | No | Specific device serial number to target (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions 'simulate a touch event' which implies a write/mutation operation, but fails to specify critical details like required permissions (e.g., device accessibility), side effects (e.g., potential app state changes), error handling, or response format. This is a significant gap for a tool that interacts with device input.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's function without unnecessary words. It is front-loaded with the core action ('simulate a touch event') and avoids redundancy, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no annotations, no output schema, and parameters that control device interaction, the description is incomplete. It lacks information about behavioral traits (e.g., mutation effects, error conditions), output expectations, or integration context (e.g., how it relates to other Android tools like android_start_scrcpy_stream). This leaves the agent under-informed for safe and effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all parameters (x, y, duration, deviceSerial). The description adds no additional meaning beyond the schema's parameter descriptions, such as coordinate system details (e.g., screen resolution) or practical usage tips. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('simulate a touch event') and target ('at specific screen coordinates'), which distinguishes it from siblings like android_swipe or android_uiautomator_click that involve different interaction types. However, it doesn't explicitly differentiate from all siblings (e.g., android_uiautomator_click also involves touch-like actions but with element-based targeting).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like android_swipe (for drag gestures) or android_uiautomator_click (for element-based interactions). It lacks context about prerequisites (e.g., device state) or exclusions, leaving the agent to infer usage from the tool name and parameters alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_uiautomator_clear_textC
Clear text from a UI element by resource ID
| Name | Required | Description | Default |
|---|---|---|---|
| resourceId | Yes | Resource ID of the element to clear | |
| deviceSerial | No | Specific device serial number to target (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the action (clear text) but lacks details on what 'clear' entails (e.g., does it simulate backspace, delete all text at once, require focus?), potential side effects (e.g., might trigger UI events), error conditions (e.g., if element not found or not clearable), or performance aspects. This is a significant gap for a mutation tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence that efficiently conveys the core functionality without unnecessary words. It's front-loaded with the key action and target, making it easy to parse quickly. Every part of the sentence earns its place by specifying the operation and how to identify the element.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (a mutation tool for Android UI automation), lack of annotations, and no output schema, the description is incomplete. It doesn't explain behavioral traits, error handling, or return values (e.g., success/failure status), which are crucial for safe and effective use. While the schema covers parameters well, the overall context for tool invocation is insufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with clear descriptions for both parameters (resourceId and deviceSerial). The description adds minimal value beyond the schema, as it only reiterates the resource ID aspect without providing additional context (e.g., format examples, common patterns, or when deviceSerial is needed). With high schema coverage, the baseline score of 3 is appropriate, as the description doesn't compensate but also doesn't detract.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('clear text') and target ('from a UI element by resource ID'), making the purpose immediately understandable. It distinguishes itself from sibling tools like android_uiautomator_set_text (which sets text) and android_input_text (which inputs text generally). However, it doesn't specify what type of UI element (e.g., text field, edit box) or clarify that it's specifically for Android UI automation, though context from sibling names helps.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is provided on when to use this tool versus alternatives. While the description implies it's for clearing text from UI elements identified by resource ID, it doesn't mention prerequisites (e.g., the element must be interactable), exclusions (e.g., not for non-text elements), or compare it to similar tools like android_uiautomator_set_text (which could clear by setting empty text). Usage is implied but not clearly defined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_uiautomator_clickC
Click on a UI element by resource ID using UIAutomator
| Name | Required | Description | Default |
|---|---|---|---|
| resourceId | Yes | Resource ID of the element to click (e.g., com.example.app:id/button_submit) | |
| deviceSerial | No | Specific device serial number to target (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It mentions 'using UIAutomator' but doesn't disclose behavioral traits such as error handling (e.g., if element not found), performance implications (e.g., waiting times), or side effects (e.g., potential app state changes). For a UI interaction tool with zero annotation coverage, this is a significant gap in transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core action ('Click on a UI element') and method ('using UIAutomator'), with zero wasted words. It's appropriately sized for a straightforward tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of UI automation (interactive, state-dependent) with no annotations and no output schema, the description is incomplete. It lacks details on success/failure outcomes, error conditions, dependencies (e.g., UIAutomator setup), or behavioral nuances, leaving significant gaps for an AI agent to use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with clear descriptions for both parameters in the schema itself. The description adds no additional meaning beyond what's in the schema (e.g., it doesn't explain format constraints or provide examples beyond the schema's example). Baseline 3 is appropriate as the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Click on a UI element') and the method ('using UIAutomator'), with the resource ID as the targeting mechanism. It distinguishes from generic 'android_touch' by specifying UIAutomator-based clicking, but doesn't explicitly differentiate from 'android_uiautomator_double_click' or 'android_uiautomator_long_click' beyond the basic click action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like 'android_touch' (general touch), 'android_uiautomator_double_click', or 'android_uiautomator_long_click'. The description implies usage for clicking by resource ID with UIAutomator, but lacks explicit context about prerequisites (e.g., device accessibility enabled) or comparative scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_uiautomator_double_clickC
Perform a double click on a UI element by resource ID
| Name | Required | Description | Default |
|---|---|---|---|
| resourceId | Yes | Resource ID of the element to double click | |
| deviceSerial | No | Specific device serial number to target (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It mentions the action (double click) but lacks critical behavioral details: whether this requires prior UI element interaction, what happens on failure (e.g., if element not found), if it blocks until completion, or error conditions. For a UI automation tool with zero annotation coverage, this is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero wasted words. It is front-loaded with the core action and target, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of UI automation, no annotations, and no output schema, the description is incomplete. It misses behavioral context (e.g., success/failure states, dependencies), usage prerequisites, and error handling, which are crucial for effective tool invocation in this domain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents both parameters (resourceId and deviceSerial). The description adds no additional meaning beyond implying resourceId targets a UI element, which is already clear from the schema. Baseline 3 is appropriate as the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Perform a double click') and target ('on a UI element by resource ID'), which is specific and unambiguous. It distinguishes from sibling tools like android_uiautomator_click (single click) and android_uiautomator_long_click, but does not explicitly mention these alternatives in the description itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like android_uiautomator_click or android_touch, nor does it mention prerequisites (e.g., needing an active Android session or UI element visibility). It only states what the tool does, not when to apply it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_uiautomator_dumpB
Dump the UI hierarchy using UIAutomator and return as XML
| Name | Required | Description | Default |
|---|---|---|---|
| deviceSerial | No | Specific device serial number to target (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden but only states the basic action and output format. It doesn't disclose behavioral traits such as whether this requires device connectivity, potential performance impacts, error conditions, or if it's read-only (implied by 'Dump' but not explicit). More context on operational constraints is needed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the key information: action, method, and output. There is no wasted text, making it easy to parse quickly for an AI agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (UI hierarchy dumping) and lack of annotations and output schema, the description is minimally adequate. It specifies the output as XML but doesn't explain the structure or content of the XML, which could be crucial for an agent to interpret results. More details on behavior or output would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameter 'deviceSerial' is well-documented in the schema. The description doesn't add extra param details, which is acceptable given high schema coverage. With only one optional parameter, the baseline is high, and the description doesn't detract from schema clarity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Dump') and resource ('UI hierarchy using UIAutomator'), specifying the output format ('return as XML'). It distinguishes from siblings like android_screenshot or android_capture_frame_scrcpy by focusing on UI hierarchy extraction rather than visual capture, though it doesn't explicitly contrast with android_uiautomator_find which might also interact with UI hierarchy.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. For example, it doesn't mention if this is for debugging, automation setup, or when android_uiautomator_find might be preferred for specific element interactions. The description lacks context about prerequisites or typical use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_uiautomator_findC
Find UI elements by resource ID or text using UIAutomator
| Name | Required | Description | Default |
|---|---|---|---|
| resourceId | No | Resource ID to search for (e.g., com.example.app:id/button_submit) | |
| text | No | Text content to search for | |
| deviceSerial | No | Specific device serial number to target (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions the search mechanism (UIAutomator) but lacks critical details: whether this is a read-only operation, if it requires device permissions, how it handles multiple matching elements, error conditions (e.g., no matches), or performance implications. For a tool with potential side effects or constraints, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core purpose ('Find UI elements') and includes key details (search criteria and mechanism). There is no redundant information or unnecessary elaboration, making it highly concise and well-structured for quick understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of UI automation, no annotations, and no output schema, the description is incomplete. It doesn't explain return values (e.g., element identifiers or error messages), behavioral traits like idempotency or side effects, or integration with sibling tools (e.g., how found elements might be used with android_uiautomator_click). For a tool in a rich sibling set, more context is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with clear parameter descriptions in the input schema. The description adds minimal value by naming the search criteria ('resource ID or text') but doesn't elaborate on syntax, precedence (if both parameters are provided), or practical examples beyond what the schema provides. With high schema coverage, the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Find UI elements') and the mechanism ('using UIAutomator'), with specific search criteria ('by resource ID or text'). It distinguishes itself from sibling tools like android_uiautomator_click or android_uiautomator_set_text by focusing on element discovery rather than interaction. However, it doesn't explicitly differentiate from android_uiautomator_dump, which might also involve element discovery, making it slightly less specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing an active device connection), compare it to sibling tools like android_uiautomator_dump for broader element discovery, or specify scenarios where resource ID vs. text searching is preferred. Usage is implied but not explicitly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_uiautomator_long_clickA
Perform a long click on a UI element by resource ID
| Name | Required | Description | Default |
|---|---|---|---|
| resourceId | Yes | Resource ID of the element to long click | |
| deviceSerial | No | Specific device serial number to target (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It mentions the action ('long click') but lacks details on behavioral traits such as duration of the long click, error handling if the element isn't found, whether it requires the app to be in the foreground, or any side effects like UI changes. This is a significant gap for a mutation tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core action ('Perform a long click') and specifies the target ('UI element by resource ID'). There is no wasted verbiage, making it highly concise and well-structured for quick understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given this is a mutation tool with no annotations, no output schema, and incomplete behavioral disclosure, the description is inadequate. It doesn't cover key aspects like what constitutes a 'long click' (e.g., duration), error scenarios, or expected outcomes, leaving gaps that could hinder correct agent usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters (resourceId and deviceSerial). The description adds minimal value beyond the schema by implying resourceId is used for targeting the element, but it doesn't provide additional context like format examples or usage tips. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Perform a long click') on a specific resource ('UI element by resource ID'), distinguishing it from siblings like android_uiautomator_click (regular click) and android_uiautomator_double_click. It uses precise verb+resource language without being tautological.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context by specifying 'UI element by resource ID,' suggesting it's for interacting with Android UI elements identified by IDs. However, it doesn't explicitly state when to use this versus alternatives like android_touch or android_uiautomator_click, nor does it mention prerequisites like needing UI visibility or device connection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_uiautomator_scroll_in_elementC
Scroll within a specific UI element
| Name | Required | Description | Default |
|---|---|---|---|
| resourceId | Yes | Resource ID of the scrollable element | |
| direction | Yes | Direction to scroll | |
| distance | No | Distance to scroll in pixels (default: 500) | |
| deviceSerial | No | Specific device serial number to target (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the action but lacks details on permissions needed, whether it's destructive (e.g., could cause unintended UI changes), error handling, or performance implications. This is inadequate for a tool with potential side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core functionality ('Scroll within a specific UI element') with zero wasted words. It's appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description is incomplete. It lacks behavioral context (e.g., safety, side effects) and doesn't explain return values or errors. For a UI automation tool with potential mutations, this leaves significant gaps for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all parameters. The description adds no additional meaning beyond what's in the schema, such as explaining 'resourceId' as a UI element identifier or 'distance' in practical terms. Baseline 3 is appropriate as the schema handles parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Scroll') and target ('within a specific UI element'), providing a specific verb+resource combination. It distinguishes from sibling tools like 'android_swipe' (general swipe) by specifying scrolling within an element, though it doesn't explicitly contrast with all siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like 'android_swipe' for general scrolling or other UI automation tools. The description implies usage for scrolling within elements but offers no explicit context, prerequisites, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_uiautomator_set_textB
Set text on a UI element by resource ID using UIAutomator
| Name | Required | Description | Default |
|---|---|---|---|
| resourceId | Yes | Resource ID of the element (e.g., com.example.app:id/text_input) | |
| text | Yes | Text to set in the element | |
| deviceSerial | No | Specific device serial number to target (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions the method ('using UIAutomator') but doesn't cover critical aspects like whether this requires device interaction permissions, potential side effects (e.g., overwriting existing text), error handling, or performance implications. This leaves significant gaps for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence that efficiently conveys the core functionality without unnecessary words. It's front-loaded with the key action ('Set text') and includes essential context ('by resource ID using UIAutomator'), making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description is insufficient. It lacks details on behavioral traits (e.g., permissions, side effects), error conditions, or return values, which are critical for safe and effective tool invocation in an Android automation context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all three parameters (resourceId, text, deviceSerial). The description adds no additional parameter semantics beyond what's in the schema, such as examples or constraints. Baseline 3 is appropriate when the schema handles parameter documentation effectively.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Set text') and target ('on a UI element by resource ID using UIAutomator'), distinguishing it from generic text input tools like 'android_input_text'. However, it doesn't explicitly differentiate from sibling UIAutomator tools like 'android_uiautomator_clear_text' in terms of specific use cases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for setting text on UI elements identified by resource ID, which suggests it's for targeted text input in Android apps. However, it lacks explicit guidance on when to use this vs. alternatives like 'android_input_text' (for general text) or 'android_uiautomator_clear_text' (for clearing text), leaving the agent to infer based on context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_uiautomator_toggle_checkboxC
Toggle a checkbox element by resource ID
| Name | Required | Description | Default |
|---|---|---|---|
| resourceId | Yes | Resource ID of the checkbox element | |
| deviceSerial | No | Specific device serial number to target (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. While 'toggle' implies a state change (mutating the checkbox), the description doesn't disclose behavioral traits like whether this requires specific permissions, what happens if the element isn't found, if it waits for UI stability, or what the expected outcome is. It's minimally descriptive for a mutation operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero wasted words. It's appropriately sized for a simple tool and front-loads the core functionality immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description is insufficient. It doesn't explain what 'toggle' means in practice (e.g., checks if unchecked, unchecks if checked), error conditions, or return values. Given the complexity of UI automation and lack of structured data, more context is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters (resourceId and deviceSerial) adequately. The description doesn't add any meaningful parameter semantics beyond what's in the schema, such as format examples or constraints, meeting the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('toggle') and target ('checkbox element by resource ID'), providing a specific verb+resource combination. However, it doesn't distinguish this tool from similar sibling tools like android_uiautomator_click or android_uiautomator_double_click that might also interact with UI elements.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. There's no mention of prerequisites (e.g., needing an active Android session), when not to use it, or how it differs from other UI interaction tools in the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_uiautomator_waitC
Wait for a UI element to appear by resource ID
| Name | Required | Description | Default |
|---|---|---|---|
| resourceId | Yes | Resource ID of the element to wait for | |
| timeoutMs | No | Maximum time to wait in milliseconds (default: 5000) | |
| deviceSerial | No | Specific device serial number to target (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states the tool waits for an element to appear, implying a blocking operation with a timeout, but doesn't disclose behavioral details like what happens on timeout (e.g., returns error or null), whether it polls continuously, or if it requires specific device states. For a tool with no annotations, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence: 'Wait for a UI element to appear by resource ID.' It's front-loaded with the core action and resource, with zero wasted words. Every part of the sentence contributes directly to understanding the tool's purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, no output schema, and a tool that performs a potentially complex waiting operation, the description is incomplete. It doesn't explain return values (e.g., success/failure, element details), error conditions, or dependencies like device connectivity. For a 3-parameter tool with behavioral implications, more context is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents the three parameters (resourceId, timeoutMs, deviceSerial). The description adds no additional meaning beyond implying resourceId is the key input. With high schema coverage, the baseline score of 3 is appropriate as the description doesn't enhance parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Wait for a UI element to appear by resource ID.' It specifies the verb ('wait') and resource ('UI element'), but doesn't explicitly differentiate from siblings like android_uiautomator_find, which might also locate elements. The description is specific but lacks sibling comparison.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites, such as needing an active Android device connection, or compare it to siblings like android_uiautomator_find for immediate element retrieval. Usage context is implied but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
17 tool updates
v1.0.0- Added
android_capture_frame_scrcpy - Added
android_execute_command - Added
android_get_latest_frame - Added
android_input_text - Added
android_send_key_event - Added
android_start_scrcpy_stream - Added
android_stop_scrcpy_stream - Added
android_uiautomator_clear_text - Added
android_uiautomator_click - Added
android_uiautomator_double_click - Added
android_uiautomator_dump - Added
android_uiautomator_find - Added
android_uiautomator_long_click - Added
android_uiautomator_scroll_in_element - Added
android_uiautomator_set_text - Added
android_uiautomator_toggle_checkbox - Added
android_uiautomator_wait
5 tool updates
- First observed
android_launch_app - First observed
android_list_packages - First observed
android_screenshot - First observed
android_swipe - First observed
android_touch
TDQS
Most tools have distinct purposes, but there is some overlap between android_capture_frame_scrcpy, android_get_latest_frame, and android_screenshot, which all capture screen content with different methods and latencies. The UIAutomator tools are well-differentiated for specific UI interactions like clicking, setting text, or toggling checkboxes.
All tool names follow a consistent snake_case pattern with a clear 'android_' prefix and descriptive verb_noun combinations (e.g., android_execute_command, android_uiautomator_click). This predictability makes it easy for agents to understand and select tools based on their names.
With 22 tools, the count is on the higher side for an Android automation server, which might feel heavy but is reasonable given the broad scope covering ADB commands, screen capture, input simulation, and UIAutomator interactions. It borders on being slightly excessive but still manageable.
The toolset provides comprehensive coverage for Android device automation, including ADB command execution, screen capture (via multiple methods), input gestures, app launching, and detailed UIAutomator-based UI interactions. There are no obvious gaps; agents can perform full testing and control workflows without dead ends.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Control real Android and iOS devices with LLM agents — tap, swipe, type, automate flows.
Drive real Android & iOS devices and web browsers from natural language for mobile + web QA. 290+ tools across device control, app management, automation sessions, browser automation, and flow recording / replay. Bearer-auth — get a token at robotactions.com → Profile → API Tokens.
Melaya is a remote MCP server. It gives an assistant hands on your own Android phone and browser: it reads the screen through the accessibility tree, then taps, types and navigates inside the apps and sites you allow-list, with no per-app API. It also builds, schedules and runs agent pipelines across 6k+ connected tools. OAuth 2.1, nothing to install.
Control Android TV from any AI. 38 MCP tools: playback, recap, recommend, smart-home, schedules.
Related MCP Servers
- AlicenseBqualityBmaintenanceEnables control of Android devices via ADB for automation and testing. Supports app management, screen capture, UI analysis, and input simulation through natural language commands.913032MIT
- AlicenseNot gradedqualityDmaintenanceEnables interaction with Android devices and emulators through ADB, allowing control actions like tapping, text input, screenshots, UI inspection, and app launching through natural language.178ISC
- FlicenseNot gradedqualityDmaintenanceEnables control of Android devices through ADB using natural language commands. Supports browser automation, SMS sending, device information retrieval, settings control, and common device actions like screenshots and button presses.3-
- AlicenseBqualityBmaintenanceEnables AI assistants to interact with Android devices and emulators via ADB, providing tools for screenshots, UI inspection, touch and text input, app management, and device control.427916MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/jduartedj/android-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server