Skip to main content
Glama
appium

MCP Appium

Official
by appium

MCP Appium - MCP server for Mobile Development and Automation | iOS, Android, Simulator, Emulator, and Real Devices

npm version

License

MCP Appium is an intelligent MCP (Model Context Protocol) server designed to empower AI assistants with a robust suite of tools for mobile automation. It streamlines mobile app testing by enabling natural language interactions, intelligent locator generation, and automated test creation for both Android and iOS platforms.

Table of Contents

Related MCP server: iOS Device Control MCP Server

🚀 Features

  • Cross-Platform Support: Automate tests for both Android (UiAutomator2) and iOS (XCUITest).

  • AI-Powered Element Finding: Locate UI elements using natural language descriptions powered by vision models - no need for complex XPath or selectors.

  • Intelligent Locator Generation: AI-powered element identification using priority-based strategies.

  • Interactive Session Management: Easily create and manage sessions on local mobile devices.

  • Smart Element Interactions: Perform actions like clicks, text input, screenshots, and element finding.

  • Automated Test Generation: Generate Java/TestNG test code from natural language descriptions.

  • Page Object Model Support: Utilize built-in templates that follow industry best practices.

  • Flexible Configuration: Customize capabilities and settings for different environments.

  • Multilingual Support: Use your native language - AI handles all interactions naturally in any language (English, Spanish, Chinese, Japanese, Korean, etc.).

📋 Prerequisites

Before you begin, ensure you have the following installed:

System Requirements

  • Node.js (v22 or higher)

  • npm or yarn

  • Java Development Kit (JDK) (8 or higher)

  • Android SDK (for Android testing)

  • Xcode (for iOS testing on macOS)

MCP Appium supports two driver modes:

  • Embedded local drivers: when appium_session_management creates an android or ios session without remoteServerUrl, MCP Appium uses the bundled appium-uiautomator2-driver or appium-xcuitest-driver dependency directly. You still need the platform toolchains below, but you do not need to install a global Appium server or run appium driver install uiautomator2 / appium driver install xcuitest for this mode.

  • Remote WebDriver/Appium server: when remoteServerUrl is provided to action=create or action=attach, MCP Appium uses the webdriver client to talk to that existing server. In this mode the remote server is responsible for its installed drivers, plugins, device access, and capability handling. Use this mode for platform=general; embedded local creation is available only for Android and iOS.

Mobile Testing Setup for embedded local drivers

Android

  1. Install Android Studio and the Android SDK.

  2. Set the ANDROID_HOME environment variable.

  3. Add the Android SDK tools to your system's PATH.

  4. Enable USB debugging on your Android device.

  5. Install the Android platform tools/build tools and keep adb available on PATH.

iOS (macOS only)

  1. Install Xcode from the App Store.

  2. Install the Xcode Command Line Tools: xcode-select --install.

  3. Install iOS simulators through Xcode.

  4. For real device testing, enable Developer Mode on the device and sign in to your Apple ID in Xcode (Settings → Accounts). Use appium_prepare_ios_real_device to download and sign WebDriverAgent in a single call - it will guide you through provisioning profile selection and return capabilities for session startup.

🛠️ Installation

Standard config works in most of the tools::

{
  "mcpServers": {
    "appium-mcp": {
      "disabled": false,
      "timeout": 100,
      "type": "stdio",
      "command": "npx",
      "args": ["appium-mcp@latest"],
      "env": {
        "ANDROID_HOME": "/path/to/android/sdk",
        "CAPABILITIES_CONFIG": "/path/to/your/capabilities.json"
      }
    }
  }
}

In Cursor IDE

The easiest way to install MCP Appium in Cursor IDE is using the one-click install button:

Install MCP Server

This will automatically configure the MCP server in your Cursor IDE settings. Make sure to update the ANDROID_HOME environment variable in the configuration to match your Android SDK path.

Or install manually:

Go to Cursor Settings → MCP → Add new MCP Server. Name it to your liking, use command type with the command npx -y appium-mcp@latest. You can also verify config or add command arguments via clicking Edit.

Here is the recommended configuration:

{
  "appium-mcp": {
    "disabled": false,
    "timeout": 100,
    "type": "stdio",
    "command": "npx",
    "args": ["appium-mcp@latest"],
    "env": {
      "ANDROID_HOME": "/Users/xyz/Library/Android/sdk"
    }
  }
}

Note: Make sure to update the ANDROID_HOME path to match your Android SDK installation path.

With Gemini CLI

Use the Gemini CLI to add the MCP Appium server:

gemini mcp add appium-mcp npx -y appium-mcp@latest

This will automatically configure the MCP server for use with Gemini. Make sure to update the ANDROID_HOME environment variable in the configuration to match your Android SDK path.

With Claude Code CLI

Use the Claude Code CLI to add the MCP Appium server:

claude mcp add appium-mcp -- npx -y appium-mcp@latest

This will automatically configure the MCP server for use with Claude Code. Make sure to update the ANDROID_HOME environment variable in the configuration to match your Android SDK path.

⚙️ Configuration

Environment Variables

Note: For embedded local Android/iOS sessions, MCP Appium already includes the UiAutomator2 and XCUITest driver packages. The system-level requirements are the platform toolchains (ANDROID_HOME, Java, Android SDK tools, Xcode/iOS signing or simulator setup). For remote sessions, configure those requirements on the remote Appium/WebDriver server instead.

Variable

Required

Description

CAPABILITIES_CONFIG

Optional

Absolute path to a capabilities.json file with per-platform capability presets

SCREENSHOTS_DIR

Optional

Directory where screenshots and screen recordings are saved. Defaults to the system temp directory (os.tmpdir())

NO_UI

Optional

Set to true or 1 to disable HTML UI components — faster responses, fewer tokens. See NO_UI Mode

APPIUM_MCP_APPS_ENABLED

Optional

MCP Apps static UI mode. Enabled by default. Set to false or 0 to force the embedded UI compatibility fallback. See MCP Apps Mode

APPIUM_MCP_ON_CLIENT_DISCONNECT

Optional

Session cleanup when the MCP client disconnects: delete_all (default) deletes MCP-owned Appium sessions (safeDeleteAllSessions); skip keeps those sessions across disconnects (e.g. HTTP/stream clients that reconnect). Attached/remote sessions are not removed by this path. See MCP disconnect behavior.

APPIUM_MCP_WDA_APP_PATH

Optional

Absolute path to a pre-extracted WebDriverAgentRunner-Runner.app bundle. When set, prepare_ios_simulator skips all GitHub downloads and uses this bundle directly — useful in environments where external downloads are blocked

REMOTE_SERVER_URL_ALLOW_REGEX

Optional

Regular expression applied to the complete remoteServerUrl value before MCP Appium connects to a remote Appium/WebDriver server. When unset, any valid HTTP(S) server URL is accepted. This checks the supplied URL only, not destinations selected by the WebDriver client from server responses. See Remote server security and trust model.

REMOTE_SERVER_ENABLE_DIRECT_CONNECT

Optional

true (default) or false. Controls the WebDriver client's enableDirectConnect option for remote session creation, attachment, and persisted-session reconnection. Set false to disable switching to Appium-advertised direct-connect endpoints. Does not disable HTTP redirects or WebDriver BiDi connections.

ALLOW_REMOTE_APP_URLS

Optional

true (default) or false. Set false to reject HTTP(S) app URLs for embedded-driver installation and session creation (appium:app and appium:otherApps, including legacy unprefixed and appium:options forms). Local app paths remain supported. Remote Appium sessions are unaffected: their server resolves app inputs.

AI_VISION_ENABLED

Optional

Set to true to register the appium_ai tool (vision-based element finding). When unset or false, the AI tool is not registered and the LLM has no way to invoke vision-based finding. Requires AI_VISION_API_BASE_URL and AI_VISION_API_KEY to also be set, otherwise the server fails to start.

AI_VISION_API_BASE_URL

Required when AI_VISION_ENABLED=true

Base URL of the OpenAI-compatible vision model API

AI_VISION_API_KEY

Required when AI_VISION_ENABLED=true

API key for the vision model provider

AI_VISION_MODEL

Optional

Vision model name (default: Qwen3-VL-235B-A22B-Instruct)

AI_VISION_COORD_TYPE

Optional

Coordinate type: normalized (default) or absolute

AI_VISION_IMAGE_MAX_WIDTH

Optional

Max image width in pixels before compression (default: 1080)

AI_VISION_IMAGE_QUALITY

Optional

JPEG quality 1–100 for compressed screenshots sent to the vision API (default: 80)

APPIUM_MCP_DOCS_ENABLED

Optional

Set to true (or 1/yes/on) to register the documentation tools (appium_documentation_query, appium_skills). Opt-in and disabled by default. Requires the optional @appium/mcp-documentation package (embeddings cache + ML stack) to be installed separately; when unset it is never downloaded. See Documentation Tools (opt-in).

SENTENCE_TRANSFORMERS_MODEL

Optional

Hugging Face model used for semantic search in Appium documentation queries (default: Xenova/all-MiniLM-L6-v2). Only applies when APPIUM_MCP_DOCS_ENABLED is set.

APPIUM_MCP_PERSIST_REMOTE_SESSIONS_PATH

Optional

Directory path for persisted attached remote session info. When set, attached remote sessions are stored as JSON files in that directory and can be rehydrated after restart.

APPIUM_MCP_EVIDENCE

Optional

Set to true or 1 to attach a structured action evidence record (locator, resolved element id, context, timing, normalized error code) to appium_find_element and appium_gesture responses as an application/vnd.appium.evidence+json resource block, for CI/debugging. Disabled by default; responses are unchanged when unset.

APPIUM_MCP_OTEL_ENABLED

Optional

Set to true to enable OpenTelemetry tracing (disabled by default).

APPIUM_MCP_OTEL_INCLUDE_ARGUMENT_VALUES

Optional

Set to true to include sanitized non-sensitive argument values in spans; disabled by default because values may contain sensitive data.

OTEL_SERVICE_NAME

Optional

Service name reported to the OpenTelemetry collector (example: appium-mcp).

OTEL_EXPORTER_OTLP_TRACES_ENDPOINT

Optional

OTLP/HTTP traces endpoint (example: http://127.0.0.1:4318/v1/traces).

OTEL_TRACES_SAMPLER

Optional

Trace sampling strategy; parentbased_always_on samples new root traces and follows parent decisions.

OTEL_RESOURCE_ATTRIBUTES

Optional

Comma-separated key=value pairs attached as resource attributes to every span (example: testcase.id=my-test-123,team=platform).

REMOTE_SERVER_ENABLE_DIRECT_CONNECT and ALLOW_REMOTE_APP_URLS preserve existing behavior when unset. Values are case-insensitive and may contain surrounding whitespace; other values (including an empty string) fail server startup. They are operator-controlled environment settings, not MCP tool arguments.

URL-based app installation is an intentional Appium feature. For embedded sessions it downloads on the MCP host; for remote sessions it downloads on the remote Appium server. Disabling ALLOW_REMOTE_APP_URLS limits these app inputs, not all host network access or all driver capabilities that may use the network. When URL installation is enabled, redirect handling, download size limits, and cache management remain the responsibility of the Appium downloader and deployment controls. The app lifecycle tool uses openWorldHint: true because its operations can interact with external services.

OpenTelemetry tracing

OpenTelemetry tracing is disabled by default. Set APPIUM_MCP_OTEL_ENABLED=true to initialize the Node.js OpenTelemetry SDK before the MCP server is constructed. The SDK uses standard OTEL_* environment variables, for example:

APPIUM_MCP_OTEL_ENABLED=true
# Optional: include sanitized non-sensitive argument values in spans.
# APPIUM_MCP_OTEL_INCLUDE_ARGUMENT_VALUES=true
# Optional: attach custom key=value pairs to every span (e.g. test case ID, team name).
# OTEL_RESOURCE_ATTRIBUTES=testcase.id=my-test-123,team=platform
OTEL_SERVICE_NAME=appium-mcp
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=http://127.0.0.1:4318/v1/traces
OTEL_TRACES_SAMPLER=parentbased_always_on

(Please check the official document as well)

When enabled, appium-mcp creates spans for MCP tool calls, prompt loads, resource reads, and resource template reads. Error status is recorded for thrown operation errors and MCP tool results marked with isError. Span attributes intentionally avoid raw screenshots, XML page source, prompts, credentials, and other high-cardinality or sensitive payloads.

Tool spans include payload-free result-size attributes: mcp.tool.result.content_count, content_types, text_chars, resource_count, resource_text_chars, image_count, audio_count, base64_chars, and base64_bytes_estimate (all prefixed with mcp.tool.result.). content_types contains only known MCP types or other; payload values, resource URIs, MIME types, and unknown type strings are never recorded. Sizes are counted directly from known result fields without serializing or copying the complete result.

For local trace inspection, use the Jaeger setup in tools/telemetry:

npm run telemetry:jaeger:start

Then open http://127.0.0.1:16686 and run appium-mcp with the environment values in tools/telemetry/jaeger.env.

Capabilities

Create a capabilities.json file to define your device capabilities:

{
  "android": {
    "appium:app": "/path/to/your/android/app.apk",
    "appium:deviceName": "Android Device",
    "appium:platformVersion": "11.0",
    "appium:automationName": "UiAutomator2",
    "appium:udid": "your-device-udid"
  },
  "ios": {
    "appium:app": "/path/to/your/ios/app.ipa",
    "appium:deviceName": "iPhone 15 Pro",
    "appium:platformVersion": "17.0",
    "appium:automationName": "XCUITest",
    "appium:udid": "your-device-udid"
  },
  "general": {
    "platformName": "mac",
    "appium:automationName": "mac2",
    "appium:bundleId": "com.apple.Safari"
  }
}

Set the CAPABILITIES_CONFIG environment variable to point to your configuration file.

Platform names and "general" mode

  • You can pass any platform name to appium_session_management (action=create).

  • If the platform is ios or android, the server builds capabilities for that platform (including selected device info when local).

  • If the platform is any other value, it is treated internally as general:

    • The session will use the provided capabilities exactly as given, or

    • If CAPABILITIES_CONFIG is set, it will merge with the general section from your capabilities file.

  • This allows custom setups and non-standard platforms to work without changing server logic.

Integrator notes (sessions, transport, logging)

For CI, device farms, or multi-session setups:

Multi-session and sessionId

The process keeps one active Appium session; tools use it when sessionId is omitted. If a tool call does not include a sessionId, it will target the active session instead of a specific one. If more than one session exists (see appium_session_management with action=list), pass sessionId on every tool call that must target a specific session. Do not assume the active session is stable if other clients or flows can create, select, or delete sessions.

Session persistence

If APPIUM_MCP_PERSIST_REMOTE_SESSIONS_PATH is set, MCP Appium persists attached remote sessions to that directory as JSON files. The path may be absolute or relative to the current working directory. Each session is stored under a canonical filename derived from a hash of the sessionId; older legacy filenames are migrated, and duplicate files for the same session are removed when the directory is read. When a persisted attached session is used again, the server tries to reattach to the remote Appium session; unreachable entries are pruned automatically.

Client disconnect

When the MCP client disconnects, the server deletes only MCP-owned sessions it is tracking (Appium deleteSession for each, via safeDeleteAllSessions). Attached sessions (ownership=attached) are intentionally left on the remote Appium server. Transports that drop often—httpStream behind proxies, idle timeouts, or flaky clients—can wipe owned automation in one go under the default policy. stdio is usually safer for a single long-lived operator; if you use httpStream, expect reconnects to require new owned sessions where applicable.

Remote Appium, CI, and device farms

For grids, cloud labs, or CI, prefer remoteServerUrl plus explicit capabilities on appium_session_management (action=create)—for example appium:udid, app path or id, platform version—rather than depending on local discovery. select_device is geared toward local ADB / simulator picking; use it as a dev convenience, not the main path for allocated remote devices.

Tool logging and argument size

Tool calls are logged with argument redaction implemented via JSON.stringify. Oversized payloads (especially long base64 strings, e.g., screenshot/image payloads, and also very large capabilities objects) cost CPU and log volume. Prefer CAPABILITIES_CONFIG and avoid passing large inline blobs in tool arguments when possible.

Screenshots

Set the SCREENSHOTS_DIR environment variable to specify where screenshots are saved. If not set, screenshots are saved to the system temp directory (os.tmpdir()). Supports both absolute and relative paths (relative paths are resolved from the current working directory). The directory is created automatically if it doesn't exist.

Screen Recording

Screen recordings are saved as MP4 files to the same directory as screenshots (SCREENSHOTS_DIR, or os.tmpdir() if not set).

  • iOS: Requires ffmpeg to be installed and available on PATH. The default codec is libx264 with yuv420p pixel format for QuickTime compatibility.

  • Android: Uses the built-in screenrecord command via UiAutomator2. No additional dependencies required.

To start recording, call appium_screen_recording with action="start". You may provide timeLimit in seconds to limit the maximum recording duration, but the start call still returns immediately. To finalize the recording, save the video, and receive the file path, call appium_screen_recording again with action="stop".

For iOS, videoScale accepts width:height with dimensions from 1 to 16384 (for example, 1280:720). One dimension may be -1 or -2 to preserve the aspect ratio; -2 also makes that dimension divisible by two. Scaling expressions and custom videoFilters are no longer supported by this MCP tool.

AI Vision Element Finding

Configure AI-powered element finding using vision models. When enabled, a separate tool — appium_ai — is registered alongside appium_find_element. It exposes action=find_element, which locates UI elements from natural-language descriptions and returns a coordinate UUID (ai-element:x,y:bbox) that can be passed to appium_gesture (tap / double_tap / long_press).

This feature is opt-in. When AI_VISION_ENABLED is unset or false, the appium_ai tool is not registered and the LLM has no way to invoke vision-based finding — keeping appium_find_element purely traditional. This deliberate gating prevents the model from defaulting to a slow, paid vision call when a stable locator (accessibility id, resource-id, etc.) would do the job.

Required Environment Variables:

{
  "appium-mcp": {
    "env": {
      "ANDROID_HOME": "/path/to/android/sdk",
      "AI_VISION_ENABLED": "true",
      "AI_VISION_API_BASE_URL": "https://dashscope.aliyuncs.com/compatible-mode/v1",
      "AI_VISION_API_KEY": "your_api_key_here"
    }
  }
}

If AI_VISION_ENABLED=true is set without both API vars, the server fails to start with a clear error message — misconfiguration is surfaced immediately rather than mid-test.

Optional Environment Variables:

See the Environment Variables table above for the full list of AI_VISION_* options and their defaults.

Supported Vision Model Providers:

Based on benchmark testing, the following models are recommended:

  1. Qwen3-VL-235B-A22B-Instruct

    • Provider: Alibaba Cloud DashScope

    • Accuracy: 100%

    • Speed: 12649ms

    • API: https://dashscope.aliyuncs.com/compatible-mode/v1

  2. gemini-3-flash-preview

    • Provider: Google AI

    • Accuracy: 100%

    • Speed: 17353

    • API: https://generativelanguage.googleapis.com/v1beta

More models benchmarked can be found here.

Performance Features:

  • Image Compression: Automatically compresses screenshots to reduce API latency and token costs (50-80% size reduction)

  • Result Caching: Caches results for 5 minutes using a module-level LRU cache (max 50 entries) that persists across tool calls, avoiding redundant API calls for identical screenshot + instruction pairs

  • Coordinate Handling: In normalized mode (default), the model returns 0–1000 range coordinates that are automatically scaled to absolute pixel coordinates using the original image dimensions — independent of any image compression. In absolute mode, image resizing is disabled so the model's returned pixel coordinates always map directly to the original screen dimensions.

Performance Optimization

MCP Apps Mode

appium_get_page_source, appium_screenshot, and generate_locators use static MCP App viewers by default when the client advertises MCP Apps support.

  • Page source XML and generated locator JSON remain in their normal text results for the LLM. Their viewers read those existing results instead of receiving duplicated copies inside generated HTML.

  • Saved screenshot base64 is delivered to the viewer through structuredContent, which MCP Apps keeps out of model context. The LLM still receives the saved file path. Explicit returnRawBase64=true calls keep their existing raw image result.

For clients with unreliable MCP Apps rendering, set APPIUM_MCP_APPS_ENABLED to false or 0:

{
  "appium-mcp": {
    "env": {
      "APPIUM_MCP_APPS_ENABLED": "false"
    }
  }
}

This keeps interactive UI enabled but forces the previous embedded viewers. The compatibility mode places viewer data inside inline HTML and therefore uses more result tokens and bandwidth. With a synthetic 95,000-character page source, the static mode reduced the result from approximately 267 KB to 95 KB (about 64%).

NO_UI=true or NO_UI=1 takes precedence over this setting and disables both static and embedded UI.

NO_UI Mode

Set the NO_UI environment variable to true or 1 to disable UI components and improve performance:

{
  "appium-mcp": {
    "env": {
      "NO_UI": "true",
      "ANDROID_HOME": "/path/to/android/sdk"
    }
  }
}

Benefits:

  • Significantly Faster Response Times: UI rendering and data processing are completely skipped, resulting in 50-80% faster tool responses depending on the operation.

  • Major Token Savings: Eliminates 500-5000+ tokens per request by removing HTML UI components from responses, dramatically reducing LLM API costs.

  • Massive Bandwidth Reduction:

    • Screenshots: Saves 1-5MB of base64-encoded image data per screenshot

    • Page source: Saves 50-200KB+ of duplicated XML data in HTML UI

    • Locators: Saves 10-100KB+ of element data in interactive UI

    • Device/App lists: Saves 5-50KB of HTML UI per selection

  • Lower Memory Usage: Client applications consume less memory without HTML rendering and embedded data.

  • Perfect for Headless Environments: Ideal for CI/CD pipelines, automated testing scripts, batch operations, or any scenario where visual UI feedback is not required.

  • Better Scalability: Reduced resource consumption allows handling more concurrent sessions.

Affected Tools:

The following tools return lightweight text-only responses when NO_UI is enabled:

  • appium_screenshot - Screenshot files are still saved to disk, but base64 data is not embedded in responses

  • appium_get_page_source - Returns XML as text without interactive inspector UI

  • generate_locators - Returns locator data as JSON without interactive UI

  • select_device - Returns device list as text without picker UI

  • appium_session_management (action=create) - Returns session info as text without dashboard UI

  • appium_context - Returns context list as text with action=list without switcher UI

  • appium_app_lifecycle (action=list) - Returns app list as JSON without interactive UI

When to Enable NO_UI:

  • ✅ Automated test execution in CI/CD pipelines

  • ✅ Batch processing multiple devices/sessions

  • ✅ Cost-sensitive LLM API usage (reduces token consumption by 60-90%)

  • ✅ Network-constrained environments

  • ✅ Scripted automation where human interaction is not needed

  • ❌ Interactive debugging and exploration (keep UI enabled for better experience)

Documentation Tools (opt-in)

The documentation tools — appium_documentation_query (RAG search over the Appium docs) and appium_skills — live in a separate package, @appium/mcp-documentation, that carries a multi-megabyte embeddings cache and pulls in a heavy ML stack (@xenova/transformers, @langchain/*). To keep the default install lean, this package is not a runtime dependency of appium-mcp and is never downloaded unless you opt in. It is declared as an optional peer dependency.

Enabling the tools is a two-step opt-in:

1. Install the optional package (in the same project/environment as appium-mcp):

npm install @appium/mcp-documentation

Installing it with your own package manager dedupes against appium-mcp's existing dependencies, so only the genuinely new code is added.

2. Set APPIUM_MCP_DOCS_ENABLED in your MCP server config:

{
  "appium-mcp": {
    "env": {
      "APPIUM_MCP_DOCS_ENABLED": "true",
      "ANDROID_HOME": "/path/to/android/sdk"
    }
  }
}

Behavior:

  • Unset / not truthy (default): the documentation tools are not registered, and nothing related to them (cache, embeddings, ML dependencies) is loaded.

  • Truthy (true/1/yes/on): the server registers the documentation tools if @appium/mcp-documentation is installed. If the flag is set but the package is not installed, the server starts normally without the documentation tools and logs a hint to run npm install @appium/mcp-documentation.

The gate is governed by the env var, not by mere presence of the package: with APPIUM_MCP_DOCS_ENABLED unset, the tools stay hidden even if the package happens to be installed.

Pre-installing it that way also avoids the first-run download delay.

MCP disconnect behavior

By default (APPIUM_MCP_ON_CLIENT_DISCONNECT unset or delete_all), when the MCP client disconnects, this server deletes every MCP-owned Appium session (the same sessions safeDeleteAllSessions targets) so embedded drivers are not left running after a short-lived assistant run. Attached sessions (ownership=attached) are unchanged by this teardown.

HTTP and streamable MCP clients may disconnect briefly (reconnect, reload, proxy). If that tears down drivers you still need, set APPIUM_MCP_ON_CLIENT_DISCONNECT to skip in your MCP server env (same pattern as NO_UI above). With skip, sessions survive disconnect until you call appium_session_management with action=delete, or you stop the Appium server / process.

Tradeoff: skip can leave orphaned sessions on your Appium server if nothing cleans up — use it when disconnect is not the same as “automation finished.”

Remote server security and trust model

MCP Appium is designed to run as a local, single-user MCP server or as part of a trusted CI job. It is not intended to be exposed as a shared service to untrusted MCP clients.

The remoteServerUrl argument is intentionally configurable because MCP Appium acts as an Appium/WebDriver client and may need to connect to local, remote, private-network, or CI-hosted Appium servers.

Only allow trusted users and trusted workflow configuration to control remoteServerUrl. In particular:

  • Do not expose the MCP tool surface directly to untrusted users.

  • In CI, do not construct remoteServerUrl from untrusted pull request content, repository data, prompts, or other externally controlled input.

  • Keep remote server URLs in trusted MCP or CI configuration where possible.

  • Use REMOTE_SERVER_URL_ALLOW_REGEX to restrict the supplied Appium server URLs. Trust the permitted servers and their responses as described below.

When REMOTE_SERVER_URL_ALLOW_REGEX is not set, MCP Appium accepts any syntactically valid HTTP or HTTPS destination. Remote server URLs must not contain a query string or fragment. The variable is a regular-expression check against the complete remoteServerUrl value and can only narrow the HTTP(S) destinations accepted by the built-in validation.

Capability discovery for attached sessions does not follow HTTP redirects. This keeps a permitted endpoint from redirecting the initial metadata request to a destination outside the configured URL policy.

REMOTE_SERVER_URL_ALLOW_REGEX validates the supplied server URL only. Subsequent destinations selected by HTTP redirects, Appium direct-connect metadata, or a WebDriver BiDi webSocketUrl are handled by the WebDriver client library and are not checked against this regex. Intercepting or modifying the client library's internal transport is outside appium-mcp's scope. Operators must therefore trust the permitted Appium servers and their responses. Set REMOTE_SERVER_ENABLE_DIRECT_CONNECT=false to disable direct connect through the client's public option; this does not disable HTTP redirects or BiDi connections. Deployments that need to restrict all outbound destinations should enforce that policy through network egress controls.

If a remote URL contains credentials, MCP Appium redacts its userinfo from logs and error responses. Opt-in persisted-session files may still contain credentials and sensitive capabilities because they are needed for reattachment; those files are created with owner-only (0600) permissions, and permissions on existing regular session files are repaired when read. Use a dedicated persistence directory owned by the MCP process.

For example, to permit only a specific Appium server:

REMOTE_SERVER_URL_ALLOW_REGEX='^https://appium\.example\.com:4723(?:/wd/hub)?/?$'

To permit Appium servers under a controlled internal domain:

REMOTE_SERVER_URL_ALLOW_REGEX='^https://[a-z0-9-]+\.appium\.example\.internal(?::[0-9]+)?(?:/.*)?$'

Treat this setting as an additional deployment safeguard. Network-level controls, CI isolation, and trusted MCP client configuration should remain the primary security boundaries.

🔌 Plugin API

Load plugins from the command line

Pass --plugin to start the standard server with a plugin, without writing a server bootstrap module. Repeat the option to load multiple plugins in order; both --plugin <module> and --plugin=<module> work with stdio and --httpStream:

appium-mcp --plugin ./checkout-plugin.mjs --plugin=@acme/appium-mcp-plugin

Each module must default-export either an AppiumMcpPlugin object or a plugin class whose constructor takes no arguments. For example, save this as checkout-plugin.mjs:

export default class CheckoutPlugin {
  name = 'checkout-plugin';
  version = '1.0.0';

  register(registry) {
    registry.addTool({
      name: 'checkout_status',
      description: 'Return the checkout integration status.',
      execute: async () => ({content: [{type: 'text', text: 'Checkout plugin ready'}]}),
    });
  }
}

Use an exported object (for example, export default new CheckoutPlugin(options)) when a plugin needs constructor options. TypeScript plugins must be compiled to JavaScript before loading.

Relative paths and installed package names resolve from the working directory where appium-mcp is launched. Package names use Node's CommonJS resolution (createRequire(...).resolve()), including require or default export conditions and legacy main entries. Packages exposing only an import export must be loaded through an explicit file path (for example, --plugin ./node_modules/my-plugin/plugin.mjs) or a file: URL. Loading still uses dynamic import(), so ESM plugin files, including those with top-level await, remain supported.

Absolute paths and file: URLs are also accepted; absolute paths are recommended in MCP client configurations because the client's working directory can vary. The CLI does not install packages: install package plugins in that working directory first.

Plugins execute in the server process, so load only trusted files and packages and keep plugin logs on stderr when using stdio. A missing module or invalid plugin export stops startup with an error instead of silently omitting the plugin. The optional documentation plugin, when enabled, is registered before CLI plugins. The existing duplicate-name and lifecycle rules below apply.

Compose a server programmatically

Use appium-mcp/core to compose the default Appium MCP server with custom business logic without maintaining a fork. Plugins can register MCP tools, prompts, resources, and resource templates, and can wrap tool execution with lifecycle hooks. Call hooks are tool-only: prompts, resources, and resource templates are registered with FastMCP but are not wrapped by beforeCall or afterCall.

createAppiumMcpServer({ policy }) can also hide nonmatching tools and resources from MCP discovery. The factory is async, so await it before starting the returned server. Policy rules are regular expressions matched against tool and resource names exactly as registered. The policy is applied at registration time to both single and batch registration methods. Resource policy matches the resource name only; resources or resource templates without a string name cannot match a non-empty allowResources list.

import { createAppiumMcpServer } from 'appium-mcp/core';
import type {
  AppiumMcpPlugin,
  McpRegistry,
  ToolCallContext,
} from 'appium-mcp/core';
import { z } from 'zod';

class CheckoutPlugin implements AppiumMcpPlugin {
  readonly name = 'checkout-plugin';
  readonly version = '1.0.0';

  register(registry: McpRegistry): void {
    const parameters = z.object({ orderId: z.string() });
    registry.addTool({
      name: 'assert_checkout_summary',
      description:
        'Assert that the checkout summary screen shows an expected order ID.',
      parameters,
      execute: async (args) => {
        const { orderId } = parameters.parse(args);
        return {
          content: [
            { type: 'text', text: `Assert checkout order ${orderId}` },
          ],
        };
      },
    });
  }

  async beforeCall(ctx: ToolCallContext): Promise<void> {
    if (ctx.toolName === 'appium_gesture') {
      console.error(`[checkout-plugin] about to call ${ctx.toolName}`);
    }
  }
}

const server = await createAppiumMcpServer({
  plugins: [new CheckoutPlugin()],
  additionalInstructions: 'Custom checkout policies are active.',
  policy: {
    allowTools: [/^appium_session_management$/, /^assert_checkout_summary$/],
    allowResources: [/^Generate Code With Locators$/],
  },
});

await server.start({ transportType: 'stdio' });

Stdio logging

start({ transportType: 'stdio' }) automatically configures Appium and WebDriver logging before the stdio transport starts, keeping stdout reserved for JSON-RPC. You normally do not need to configure logging separately.

In stdio mode, WDIO_LOG_LEVEL values that would write verbose output to stdout (trace, debug, and info) are clamped to warn. Quieter error and silent values are preserved. This behavior only applies to stdio; httpStream logging is unchanged.

For advanced integrations that need to configure logging explicitly, configureStdioTransportLogging() is exported from appium-mcp/core. Call it before starting stdio work; calling server.start({ transportType: 'stdio' }) already invokes it automatically.

Plugin lifecycle:

  • register(registry, core): called during server construction. Register custom tools, prompts, resources, and resource templates here.

  • initialize(ctx): called lazily on the first MCP client connection. Use it for async setup such as artifact storage or internal service clients.

  • beforeCall(ctx): called before a registered MCP tool executes. Return a ToolCallResult to short-circuit the tool. This hook only applies to tools, not prompts, resources, or resource templates.

  • afterCall(ctx, result): called after a registered MCP tool executes. Return a modified ToolCallResult to decorate or replace the response. This hook only applies to tools, not prompts, resources, or resource templates.

  • destroy(): called after the last MCP client disconnects.

Safe plugin surface

The supported plugin API is intentionally small:

Surface

Safe methods

McpRegistry

addTool, addTools, addPrompt, addPrompts, addResource, addResources, addResourceTemplate, addResourceTemplates

AppiumMcpCore

getSessionId(), getSessionInfo(sessionId?), getDriver(sessionId?), listSessions()

ToolCallContext.session

getSessionId(), getSessionInfo(sessionId?), getDriver(sessionId?), listSessions()

PluginContext

core, plugins

McpRegistry methods delegate to the matching FastMCP registration APIs, so their object shapes follow FastMCP's documented tool, prompt, resource, and resource-template definitions. Appium MCP wraps registered tools with plugin call hooks, but prompts and resources are registered directly with FastMCP.

Each plugin name should be unique within the server. If two plugins use the same name, Appium MCP keeps the first plugin registered for that name and skips later plugins with a warning. Use a stable, package-style or organization-prefixed name, such as acme-checkout-plugin, to avoid collisions when composing plugins from multiple teams.

Each tool name should also be unique across all plugins and the core server. Tool names follow FastMCP behavior, not plugin-name behavior: when a tool is registered with the same name as an existing tool, FastMCP replaces the earlier tool definition with the later one. Appium MCP registers built-in tools before plugin tools, which means a plugin tool that uses the same name as a built-in tool replaces the built-in tool. Appium MCP tools usually have an appium_ prefix, so plugin tool names should use that pattern only when they intentionally override a core tool.

Verify plugin and tool names

Use verifyAppiumMcpNames before publishing or deploying a custom plugin setup. It registers your plugin capabilities into a lightweight collector, registers the Appium MCP core tools, and reports duplicate plugin names, duplicate tool names, and registration errors without starting the MCP server.

The recommended approach is to verify the same plugin array you pass to createAppiumMcpServer({ plugins }). This preserves your real plugin instances and order:

import {
  formatVerificationReport,
  verifyAppiumMcpNames,
} from 'appium-mcp/core';
import { plugins } from './plugins.js';

const report = verifyAppiumMcpNames({ plugins });

console.log(formatVerificationReport(report));
process.exit(report.ok ? 0 : 1);

When you provide multiple plugins, order is preserved. Plugins are verified in array order after the appium-mcp core tools. This matters because Appium MCP keeps the first plugin for a duplicate plugin name and skips later plugins with the same name, while duplicate tool names follow FastMCP's later-registration-wins behavior. Tool names still need to be unique across all loaded plugins and appium-mcp core; the verifier reports any collisions it finds.

The report labels this package's own shipped tools as appium-mcp core. Plugin sources are labeled as plugin:<name> with the plugin version.

Treat anything outside appium-mcp/core as internal. In particular, plugins should not rely on private server internals, internal session-store modules, tool implementation files, or the raw FastMCP server instance. If a plugin needs another stable primitive, open an issue so it can be added to AppiumMcpCore or McpRegistry deliberately.

See examples/plugin-example.ts for a fuller cookbook with tools, prompts, resources, resource templates, call hooks, and lifecycle setup.

🎯 Available Tools

MCP Appium provides a comprehensive set of tools organized into the following categories:

Platform & Device Setup

Tool

Description

select_device

REQUIRED FIRST: Discover available devices and select one. Auto-selects if only one device found

prepare_ios_simulator

Boot an iOS/tvOS simulator, download WDA (if not cached), and install/launch WDA in a single call. Each step is skipped if already satisfied (iOS/tvOS only). Set APPIUM_MCP_WDA_APP_PATH to skip all downloads and use a local .app bundle instead.

appium_prepare_ios_real_device

Prepare a real iOS device for Appium testing. Two-step flow: (1) call without provisioningProfileUuid to list available .mobileprovision profiles; (2) call again with the chosen UUID and isFreeAccount to download the matching WDA release, package it as an IPA, and resign with the profile. Results are cached per WDA version and profile, so repeat runs are fast. Pass the returned capabilitiesHint to create_session so Appium installs and launches WDA. macOS + Xcode 16+ required.

Session Management

Tool

Description

appium_session_management

Unified session management. action=create: start a new session for Android, iOS, or general capabilities (see 'general' mode above); forwards capabilities to a remote server via WebDriver newSession when remoteServerUrl is provided. action=attach: connect MCP Appium to an already-running remote Appium session without taking ownership. action=detach: forget an attached session without deleting the real remote session. action=delete: stop and clean up an owned session (defaults to active). action=list: show all active sessions, including ownership. action=select: switch the active session by sessionId.

appium_mobile_device_control

Control device behavior: lock/unlock the screen, shake the device, or open the notifications panel (action: lock | unlock | shake | open_notifications). shake is iOS only; open_notifications is Android only; seconds is optional for timed lock.

appium_driver_settings

Read or update Appium driver session settings in one tool. action=get returns current settings as JSON; action=update merges a settings map (driver-specific keys; use action=get first to inspect).

The remote server URL in appium_session_management (action=create or action=attach) can be set via the remoteServerUrl parameter. When remoteServerUrl is omitted, action=create starts an embedded local UiAutomator2 or XCUITest driver for platform=android or platform=ios. platform=general requires remoteServerUrl. When remoteServerUrl is present, action=create calls WebDriver newSession on the remote server, and action=attach connects MCP Appium to an existing remote session without owning its lifecycle. If REMOTE_SERVER_URL_ALLOW_REGEX is set, the URL must match the provided regex pattern for security reasons. This allows you to restrict which remote servers can be used with your MCP Appium instance, preventing unauthorized connections. Without an allow regex, any syntactically valid HTTP(S) URL without a query string or fragment is accepted.

Context Management

Tool

Description

appium_context

Manage contexts in one tool. action=list gets all available contexts including NATIVEAPP and WEBVIEW* entries. action=switch switches to a target context (context required).

Element Discovery & Interaction

Tool

Description

appium_find_element

Find a specific element using traditional locator strategies. Strategy priority: accessibility id > id > platform-native (-ios predicate string / -ios class chain on iOS, -android uiautomator on Android) > xpath (last resort — slow & brittle). To scroll until an element appears, use appium_gesture with action=scroll_to_element (same strategy / selector as find).

appium_ai

Opt-in (gated by AI_VISION_ENABLED=true). Vision-based element finding — fallback for when traditional locators don't work. action=find_element takes a natural-language instruction (e.g., "yellow search button at bottom") and returns a coordinate UUID consumable by appium_gesture (tap / double_tap / long_press). See AI Vision Element Finding for setup.

appium_gesture

Perform a touch gesture. action = back, tap, double_tap, long_press, scroll, swipe, pinch_zoom, or scroll_to_element. scroll_to_element scrolls vertically (direction = up | down) until the locator matches, page source stops changing after a scroll (end of list), or maxScrollAttempts (default 10, max 80). Optional scrollDistance (0.05–1) or scrollDistancePreset = small | medium | large. Supports element UUIDs and raw coordinates for other actions. For swipe, use speed = slow | normal | fast (fast for pull-to-refresh).

appium_drag_and_drop

Perform a drag and drop gesture from a source location to a target location (supports element-to-element, element-to-coordinates, coordinates-to-element, and coordinates-to-coordinates)

appium_perform_actions

Execute raw W3C Actions API sequences for custom multi-touch gestures (rotate, three-finger swipe, edge swipes, precise timing). Prefer appium_gesture for standard gestures.

appium_set_value

Enter text into an input field

appium_mobile_keyboard

Hide the on-screen keyboard or query visibility. action=hide | is_shown (keys optional for hide).

appium_get_text

Get text content from an element

appium_mobile_clipboard

Read or set device clipboard plain text. action=get | set (content required for set).

appium_alert

Handle alerts with action = accept, dismiss, or get_text (optional buttonLabel)

Screen & Navigation

Tool

Description

appium_screenshot

Take a screenshot and save as PNG. Optionally provide elementUUID to capture a specific element. Pass returnRawBase64: true (default false) to return the raw base64 PNG inline instead of saving to disk — useful when the server runs on a remote machine where the saved file is not accessible. Intended for manual use only; an LLM should keep this false.

appium_get_window_size

Get the width and height of the device screen in pixels

appium_get_page_source

Get the page source (XML) from the current screen

appium_orientation

Get or set device/screen orientation with action = get or set (requires orientation for set).

appium_geolocation

Get, set, or reset the device GPS coordinates with action = get, set, or reset. For set, provide latitude and longitude (and optional altitude on Android). Not supported on Android emulators for reset.

appium_screen_recording

Start or stop screen recording with action = start or stop. On stop, returns the saved MP4 path.

appium_mobile_device_info

Get device information, battery status, or current device time. Use action = info (model, OS version, locale, timezone, screen density, etc.), battery (level as percentage and charging state), or time (current device time; accepts an optional format moment.js string, defaults to ISO 8601). Works on both iOS and Android.

App Management

Tool

Action

Description

appium_app_lifecycle

activate

Activate (launch/bring to foreground) a specified app by bundle ID or name

appium_app_lifecycle

terminate

Terminate (close) a specified app

appium_app_lifecycle

install

Install an app on the device from a file path

appium_app_lifecycle

uninstall

Uninstall an app from the device by bundle ID or name

appium_app_lifecycle

list

List all installed apps on the device (Android and iOS)

appium_app_lifecycle

is_installed

Check whether an app is installed. Package name for Android, bundle ID for iOS.

appium_app_lifecycle

query_state

Query the current state of an app: 0=not installed, 1=not running, 2=background suspended, 3=background, 4=foreground

appium_app_lifecycle

background

Background the current app for a duration (optional; defaults to 5 seconds)

appium_app_lifecycle

clear

Clear app data and cache without uninstalling (mobile: clearApp). Android: stop the app first when possible. iOS: Simulator only; not supported on real devices.

appium_app_lifecycle

deep_link

Open a deep link URL with the default or a specified app

appium_mobile_permissions

Get, update, or reset app permissions in one tool (action: get / update / reset)

Android: list or change runtime permissions. iOS Simulator: get/set privacy via bundle id; reset (action=reset) applies to the AUT on sim and device.

Test Generation & Documentation

Tool

Description

generate_locators

Generate intelligent locators for all interactive elements on the current screen

appium_generate_tests

Generate automated test code from natural language scenarios

appium_documentation_query

Opt-in (gated by APPIUM_MCP_DOCS_ENABLED). Query Appium documentation using RAG for help and guidance

appium_skills

Opt-in (gated by APPIUM_MCP_DOCS_ENABLED). Return ordered setup or troubleshooting skills from appium/skills for local Appium environments

🤖 Client Support

MCP Appium is designed to be compatible with any MCP-compliant client.

📚 Usage Examples

Amazon Mobile App Checkout Flow

Here's an example prompt to test the Amazon mobile app checkout process:

Open Amazon mobile app, search for "iPhone 15 Pro", select the first search result, add the item to cart, proceed to checkout, sign in with email "test@example.com" and password "testpassword123", select shipping address, choose payment method, review order details, and place the order. Use JAVA + TestNG for test generation.

This example demonstrates a complete e-commerce checkout flow that can be automated using MCP Appium's intelligent locator generation and test creation capabilities.

AI-Powered Element Finding Examples

Traditional Mode — prefer stable identifiers:

Try strategies in priority order: accessibility id first, then id, then platform-native predicates (-ios predicate string / -ios class chain on iOS, -android uiautomator on Android). Reach for xpath only when nothing more stable exists.

{
  "tool": "appium_find_element",
  "arguments": {
    "strategy": "accessibility id",
    "selector": "search-button"
  }
}

xpath fallback (when no accessibility id, resource-id, or platform-native predicate works):

{
  "tool": "appium_find_element",
  "arguments": {
    "strategy": "xpath",
    "selector": "//android.widget.Button[@text='Search']"
  }
}

Scroll until element is on screen (appium_gesture / scroll_to_element):

{
  "tool": "appium_gesture",
  "arguments": {
    "action": "scroll_to_element",
    "strategy": "xpath",
    "selector": "//*[contains(@text,'My header')]",
    "direction": "down",
    "maxScrollAttempts": 40,
    "scrollDistancePreset": "medium"
  }
}

Use scrollDistance (0.05–1) instead of scrollDistancePreset when you want an exact fraction. Then call appium_find_element with the same strategy / selector to obtain the element id.

AI Mode (Natural Language) — requires AI_VISION_ENABLED=true:

When the AI tool is enabled, use appium_ai (not appium_find_element) for vision-based finding:

{
  "tool": "appium_ai",
  "arguments": {
    "action": "find_element",
    "instruction": "yellow search button at the bottom of the screen"
  }
}

The returned UUID (ai-element:x,y:bbox) flows directly into appium_gesture:

{
  "tool": "appium_gesture",
  "arguments": {
    "action": "tap",
    "elementUUID": "ai-element:540,2280:480,2240,600,2320"
  }
}

More instruction examples:

  • "username input field at top"

  • "settings icon in top-right corner"

  • "red delete button next to the item"

  • "blue submit button at bottom"

  • "profile picture in navigation bar"

When to reach for appium_ai vs appium_find_element:

  • Prefer appium_find_element whenever a stable accessibility id, resource-id, or unique text exists — faster, free, deterministic.

  • Use appium_ai only when the element has no stable identifier, the page source is unavailable, or you must locate by visual cues (color, position, icon).

  • See AI Vision Element Finding for setup and configuration.

Working in Your Native Language

MCP Appium works seamlessly in any language - you don't need to know English! The AI assistant understands and responds in your native language. Simply describe what you want to do in your preferred language:

Examples in different languages:

🇪🇸 Spanish: "Abre la aplicación de Amazon, busca 'iPhone 15 Pro' y agrégalo al carrito"

🇨🇳 Chinese: "打开Amazon应用,搜索'iPhone 15 Pro'并添加到购物车"

🇯🇵 Japanese: "Amazonアプリを開いて、'iPhone 15 Pro'を検索してカートに追加する"

🇰🇷 Korean: "Amazon 앱을 열고 'iPhone 15 Pro'를 검색한 후 장바구니에 추가"

🇫🇷 French: "Ouvre l'application Amazon, recherche 'iPhone 15 Pro' et ajoute-le au panier"

🇩🇪 German: "Öffne die Amazon App, suche nach 'iPhone 15 Pro' und füge es zum Warenkorb hinzu"

The AI will handle your requests naturally and generate the appropriate test code, regardless of the language you use.

🙌 Contributing

Contributions are welcome! Please feel free to submit a pull request or open an issue to discuss any changes.

📄 License

This project is licensed under the Apache-2.0. See the LICENSE file for details.

Behavioral evals

Model-dependent MCP tool-selection and argument evals are available separately from npm test. See evals/README.md for setup and npm run eval:mcp. For local evaluation using Codex with ChatGPT login, use npm run eval:codex.

Available Tools

31 tools
appium_alertA

Handle system alerts with action=accept|dismiss, or read alert text with action=get_text.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform on alert: accept, dismiss, or get_text
sessionIdNoSession ID; defaults to the active session.
buttonLabelNoOptional label of the button to click for accept/dismiss.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations indicate only that the tool is not read-only; the description adds that get_text is a read operation while accept/dismiss mutate the alert. However, it does not disclose behavior such as what happens when no alert is present, whether accept/dismiss consume the alert, or edge cases involving buttonLabel.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler. It conveys the resource and the three action modes without wasting words, making it easy to scan and parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple three-parameter tool with no output schema, the description plus schema is nearly sufficient; 'read alert text' reasonably implies the return value. Still, it does not specify return details or no-alert/error behavior, so it stops just short of fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 all parameters including the action enum and buttonLabel. The description mostly restates those values, adding only the semantic framing of get_text as reading alert text, which provides marginal extra value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the target resource (system alerts) and enumerates the exact operations: accept, dismiss, or get alert text. This makes it clearly distinguishable from generic text tools such as appium_get_text, despite 'handle' being a generic verb.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description establishes a clear trigger condition: use this tool when a system alert must be accepted, dismissed, or its text read. It does not explicitly name alternative tools or state when not to use it, but the alert-specific scope makes routing an agent straightforward.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appium_app_lifecycleC

Manage app lifecycle, installation, state, data, and deep links.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoAndroid package or iOS bundle ID; takes precedence over name.
urlNoURL for deep_link (e.g. https://example.com or myapp://path).
nameNoHuman-readable app name resolved to an ID; alternative to id.
pathNoApp file path or HTTP(S) URL; required for install. Embedded URL downloads require ALLOW_REMOTE_APP_URLS=true (default). Remote sessions resolve app inputs on the remote Appium server.
actionYesactivate: foreground app; terminate: stop app; is_installed: check installation; clear: clear app data without uninstalling (all require id or name). install: requires path. uninstall: requires id/name; Android keepData is optional. list: optional iOS applicationType. query_state: get state 0=not installed,1=not running,2=background suspended,3=background,4=foreground (requires id or name). background: send foreground app to background; optional seconds (default 5). deep_link: requires url; id/name is optional.
secondsNoBackground duration; default 5. Use -1 to remain in background.
keepDataNoAndroid uninstall: preserve app data and cache.
sessionIdNoSession ID; defaults to the active session.
waitForLaunchNoAndroid deep_link: wait for the activity to return; default true.
applicationTypeNoiOS list filter: User (default) or System.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal non-read-only and open-world behavior, and the description adds no further behavioral disclosure. It does not mention that clear/uninstall destroy data, install may fetch remote URLs, or deep_link can wait for activity launch. No contradiction exists, but the description carries little transparency weight.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single efficient sentence and lists the main capability areas without filler. It is heavily front-loaded, though the word 'Manage' adds little beyond the action-category list.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 10 parameters, 10 distinct actions, and no output schema, a one-line description is not enough for an agent to confidently select and invoke the tool. The schema fills in action details, but the description lacks context about destructive operations, prerequisites, and when this tool is the right choice.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already explains every parameter. The tool description adds no parameter-specific meaning, which is acceptable at the baseline but not a contributor.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names concrete domains—lifecycle, installation, state, data, and deep links—so an agent can tell this is the app-level management tool rather than UI, session, or device-control tools. The verb 'Manage' is broad, but the appended resource list gives useful specificity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus sibling tools like appium_mobile_device_control or appium_session_management. No exclusions, alternatives, or selection criteria are stated; the agent must infer usage from the action enum.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appium_contextA

Manage Appium contexts with one tool. action=list returns all contexts and current context. action=switch changes to a target context.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesUse list to fetch contexts or switch to change context.
contextNoRequired when action is switch. Common values: NATIVE_APP or WEBVIEW_<id>/WEBVIEW_<package>.
sessionIdNoSession ID; defaults to the active session.

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations carry no behavioral hints (readOnlyHint=false, openWorldHint=false), so the description itself must disclose side effects. It states that list returns all contexts and the current context, and that switch changes to a target context, which covers the basic effects. However, it does not disclose what happens on invalid context, whether the switch persists, or any session-level implications, leaving 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences with no wasted words. The first sentence states the tool's overall purpose, and the second precisely defines the two actions, front-loading the essential information immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 3 parameters and no output schema, the description covers the core functionality but omits details an agent might need, such as what the switch action returns, error behavior for invalid contexts, and the effect on the active session. It is adequate for a knowledgeable user but not fully complete for autonomous selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema already documents all three parameters. The description adds marginal value by explaining the distinct outcomes of list versus switch, but it does not enrich the context or sessionId parameters beyond the schema's existing descriptions, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource, 'Manage Appium contexts', and enumerates the two supported actions (list and switch) with distinct effects. It clearly differentiates this tool from the many sibling Appium tools by focusing solely on context management, which is unique among the listed siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies that the tool is for managing Appium contexts but does not explicitly state when to use this tool versus alternatives or when not to use it. It provides no prerequisites or conditions beyond the actions themselves, so an agent must infer usage context from the tool name and description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appium_drag_and_dropA

Perform a drag-and-drop gesture from a source location to a target location. The gesture: long press the source (default 600ms), drag to the target (default 1200ms), then release. Source and target can each be specified as either an element UUID or coordinates. Useful for reordering lists, moving items, drag-to-delete.

ParametersJSON Schema
NameRequiredDescriptionDefault
sourceXNoSource X coordinate. Required if sourceElementUUID is not provided.
sourceYNoSource Y coordinate. Required if sourceElementUUID is not provided.
targetXNoTarget X coordinate. Required if targetElementUUID is not provided.
targetYNoTarget Y coordinate. Required if targetElementUUID is not provided.
durationNoDuration of the drag movement in milliseconds. Default 1200.
sessionIdNoSession ID; defaults to the active session.
longPressDurationNoDuration of the long press before dragging in milliseconds. Default 600.
sourceElementUUIDNoUUID of source element to drag from. Either sourceElementUUID or sourceX+sourceY must be provided.
targetElementUUIDNoUUID of target element to drop on. Either targetElementUUID or targetX+targetY must be provided.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes beyond the sparse annotations by disclosing the exact gesture sequence (long press, drag, release) and default durations (600ms and 1200ms). It also explains that source and target can be an element UUID or coordinates, adding practical behavioral context beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded, with the core action stated first, followed by the gesture mechanics and then representative use cases. Every sentence contributes useful information without unnecessary filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 9 parameters and no output schema, the description covers the essential behavioral contract: what gesture is performed, the timing defaults, and the two ways to specify source and target. It does not exhaustively explain every edge case, but it is sufficiently complete for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description repeats default timings and the element/coordinate alternative that are already present in the parameter schemas, but it does not add significant new meaning beyond what the structured schema already documents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('Perform a drag-and-drop gesture from a source location to a target location') and details the gesture mechanics, making it clearly distinct from gesture-related siblings like appium_gesture and appium_perform_actions. It also clarifies the two acceptable input forms (element UUID or coordinates).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context with concrete examples ('Useful for reordering lists, moving items, drag-to-delete'), which helps an agent decide when to use this tool. However, it does not explicitly name alternative tools or state when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appium_driver_settingsA

Read or update Appium driver session settings (e.g. idle timeouts, selector waits). Use action=get to return JSON settings; action=update merges a map into the session. Works for embedded UiAutomator2/XCUITest sessions and remote WebDriver clients that support Appium settings.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesget: read current Appium driver session settings (timeouts, selector waits, flags). update: merge a settings map into the session (requires settings).
settingsNoRequired when action is update. Driver-specific keys (e.g. Android UiAutomator2: waitForIdleTimeout, waitForSelectorTimeout, ignoreUnimportantViews; iOS XCUITest has its own set). Use action=get first to inspect current values.
sessionIdNoSession ID; defaults to the active session.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide no real behavioral cover beyond readOnlyHint=false, so the description carries the burden. It usefully reveals that get returns JSON settings and update merges a map into the session, but it does not describe update response behavior, side effects, or failure cases. This is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler: the first front-loads the tool's purpose and action modes, and the second scopes supported client types. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a moderately simple settings tool, the description covers the main operational distinctions: reading vs. updating, merge semantics, and supported session types. Since there is no output schema, it could have specified what update returns, but the core usage is complete enough for an agent to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 all parameters. The description adds some useful context by naming typical settings keys and explaining the get/update split, but it does not significantly compensate beyond the schema's own detailed parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb-resource pair ('Read or update Appium driver session settings') with concrete examples like idle timeouts and selector waits. It is clearly distinct from the sibling tools by targeting driver session settings, though it does not explicitly name or differentiate itself from a sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit action-level guidance: use action=get to read settings and action=update to merge a settings map. It also clarifies supported session types (embedded UiAutomator2/XCUITest and remote WebDriver clients), which helps an agent decide when this tool applies.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appium_find_elementA
Read-only

Find an element by strategy and selector; the primary tool for locating a specific target. Returns its ID for interactions. Pass that ID as elementUUID to interaction tools. Prefer accessibility id > id > platform-native > xpath (last resort: slow/brittle). See strategy for platform-specific guidance. To scroll until a target is found, use appium_gesture action=scroll_to_element with the same strategy and selector, rather than repeatedly calling this tool. For natural-language/vision finding, use appium_ai action=find_element if enabled and stable locators do not work.

ParametersJSON Schema
NameRequiredDescriptionDefault
selectorYesSelector string for the chosen strategy. Do not pass natural-language descriptions of the target here; use appium_ai action=find_element if enabled for vision-based finding.
strategyYesLocator strategy. Prefer stable identifiers, then platform-native queries; xpath is the last resort. - accessibility id: cross-platform, fast and stable when available. - id: Android resource-id; an accessibility-id alias on iOS. - -ios predicate string: fast native iOS queries on element attributes. - -ios class chain: native iOS hierarchy queries. - -android uiautomator: native Android queries using UiSelector. - xpath: last resort; slow on iOS XCUITest and brittle to layout changes. - name: legacy; often aliased on iOS. - class name: usually too generic and may match multiple elements. - css selector: webview/hybrid web contexts only, not native screens. iOS prefer accessibility id > -ios predicate string > -ios class chain; Android prefer accessibility id > id > -android uiautomator. Use xpath last on both.
sessionIdNoSession ID; defaults to the active session.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as readOnlyHint=true, so the safety profile is known. The description adds useful behavioral context: the tool returns an ID for later interactions, xpath is slow and brittle, and platform-specific strategies have different reliability. This goes beyond the annotations without relying on them to carry the whole burden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the core action and output are stated first, then strategy ordering, then alternatives. Every sentence contributes either usage guidance, an alternative, or a caveat, with no filler or redundant restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the strategy complexity and the lack of an output schema, the description adequately explains the return value and downstream usage. It covers alternatives and selector pitfalls. It does not describe failure behavior (e.g., timeout or not-found), but the read-only annotation and the rich input schema keep this from being a serious gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description still adds value by giving a concise cross-platform precedence rule ('accessibility id > id > platform-native > xpath') and by warning not to pass natural-language text as a selector. It reinforces and summarizes the schema's parameter guidance rather than merely repeating it verbatim.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Find an element by strategy and selector') and identifies itself as 'the primary tool for locating a specific target,' clearly distinguishing it from sibling interaction tools. It also states the concrete output (an element ID) and how that output feeds other tools, making the tool's role unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage guidance is explicit: it gives a locator preference order, names appium_gesture action=scroll_to_element as the alternative when scrolling is needed, and directs natural-language/vision cases to appium_ai action=find_element. It also tells the agent what not to do ('rather than repeatedly calling this tool'), which is strong when-to-use/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.

appium_generate_testsA

Return a workflow to execute the scenario with MCP tools, then generate test code from observed interactions. Prefer appium_find_element; generate_locators is for broad inspection.

ParametersJSON Schema
NameRequiredDescriptionDefault
stepsYesThe steps of the test

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that the tool executes a scenario via MCP tools, observes interactions, and then produces test code, which is meaningful behavioral context. However, with sparse annotations it omits side-effect details, session or device prerequisites, and whether the generated code is returned inline or written elsewhere.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, both information-dense: the first explains the workflow and output, and the second provides actionable locator-selection guidance. There is no filler or redundant repetition of the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter tool with a documented schema, the description is mostly adequate: an agent can infer the expected input and output. The main gaps are missing prerequisites such as an active Appium session or device, and the expected granularity of the steps input.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already fully documents the single steps parameter as the steps of the test, and the description only alludes to it via the word scenario. No additional formatting, granularity, or example guidance is provided, so this stays at the schema-coverage baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific outcome: return a workflow to execute a scenario and then generate test code from observed interactions. The second sentence differentiates the tool from appium_find_element and generate_locators, making the purpose largely unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit routing guidance: prefer appium_find_element for targeted element location and reserve generate_locators for broad inspection. It does not enumerate all exclusion cases or alternative tools, but the context is clear enough for an agent to decide when to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appium_geolocationA

Get, set, or reset the device geolocation (GPS coordinates). Works on both iOS (simulators and real devices) and Android (emulators and real devices with mock location enabled). Use action=get to read current coordinates, action=set with latitude/longitude (and optional altitude for Android) to simulate a location, or action=reset to restore the system default. Note: On Android emulators, reset is not supported — use action=set to manually restore coordinates instead. On Android real devices, the mocked location may persist until the GPS cache refreshes.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform. get: read the current device geolocation. set: set the device geolocation (requires latitude and longitude; optional altitude for Android). reset: reset the geolocation to the default/system value. Not supported on Android emulators — use action=set instead.
altitudeNoAltitude value in meters. Android only, defaults to 0. Ignored on iOS. Used with: set.
latitudeNoLatitude value (-90 to 90). Measurement of distance north or south of the Equator. Required for: set.
longitudeNoLongitude value (-180 to 180). Measurement of distance east or west of the prime meridian. Required for: set.
sessionIdNoSession ID; defaults to the active session.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the minimal annotations, the description discloses meaningful behavioral caveats: Android emulator reset is unsupported, mocked locations may persist until GPS cache refresh on Android real devices, and altitude is Android-only. These details help an agent anticipate platform-specific outcomes. The readOnlyHint=false annotation is consistent with the mutating set/reset actions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded, starting with the core function and platform scope before detailing action modes and edge cases. Every sentence contributes operational information, and there is no filler or redundant restatement.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully covers action selection, platform constraints, required parameters, and important caveats. There is no output schema, and the description does not specify the exact return shape of action=get, but the invocation path is otherwise complete and unambiguous.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds value by explaining action semantics and platform dependencies, such as action=set requiring latitude/longitude, altitude being Android-only, and reset having an Android emulator limitation. This supplements the schema rather than merely repeating it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Get, set, or reset the device geolocation (GPS coordinates)', providing specific verbs and the resource being operated on. It clearly distinguishes this tool from sibling Appium tools by naming the exact geolocation capability and supported platforms.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit action-based guidance: use action=get to read, action=set with latitude/longitude to simulate, and action=reset to restore defaults. It also notes that reset is unsupported on Android emulators and directs users to action=set instead. It does not mention alternative sibling tools, but it clearly scopes its own usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appium_gestureA

Perform a touch gesture. Use 'action' to choose: tap, double_tap, long_press, scroll, swipe, pinch_zoom, scroll_to_element, back. Choose scroll vs swipe by intent: scroll to browse content in a list or feed; swipe to dismiss, switch screens, navigate carousels, or pull-to-refresh (speed=fast). For drag-and-drop use appium_drag_and_drop. For custom multi-touch use appium_perform_actions.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNoX coordinate in pixels. For tap/double_tap/long_press: tap location, paired with y. For scroll/swipe: starting X in custom-coordinate mode; requires y, endX, endY. For pinch_zoom: center X, paired with y. Tap/double_tap/long_press/pinch_zoom ignore x/y when elementUUID is set.
yNoY coordinate in pixels, paired with x. For tap/double_tap/long_press: tap location. For scroll/swipe: starting Y in custom-coordinate mode. For pinch_zoom: center Y. The same elementUUID precedence as x applies.
endXNoEnding X coordinate in pixels for scroll/swipe; requires x, y, endY.
endYNoEnding Y coordinate in pixels for scroll/swipe; requires x, y, endX.
scaleNoRequired for pinch_zoom. Scale < 1 zooms out (fingers close); scale > 1 zooms in (fingers spread). Examples: 0.5 zooms out; 2.0 zooms in 2x.
speedNoSwipe only. slow: deliberate drag; normal: default navigation speed; fast: flick without an initial hold. Use fast for pull-to-refresh and other velocity-sensitive interfaces.
actionYesGesture to perform: - tap: tap an element or a coordinate. - double_tap: double-tap, for example to zoom an image or favorite a post. - long_press: press and hold to open a context menu or initiate a drag. For tap/double_tap/long_press, provide elementUUID or both x and y. - scroll: browse a list, feed, or page to reveal content. - swipe: dismiss a card, switch screens or tabs, navigate a carousel, or pull-to-refresh (use speed=fast). For scroll/swipe, provide direction or all four custom coordinates: x, y, endX, endY. - pinch_zoom: zoom in (scale > 1) or out (scale < 1) on maps, images, or other zoomable views. Requires scale. - scroll_to_element: scroll to find a target using strategy and selector. Direction is up/down, default down. Stops when the element is found, page source is unchanged after a scroll (likely end of content), or maxScrollAttempts is reached. Adjust distance with scrollDistance (0.05–1) or scrollDistancePreset (small/medium/large). - back: trigger system back navigation.
durationNoDuration in milliseconds. long_press defaults to 2000 (range 500–10000); scroll defaults to 800. For swipe, prefer speed unless a custom movement duration is needed. For W3C swipe, overrides movement time; speed still sets the initial hold. Ignored by iOS native mobile: swipe (direction, no elementUUID, speed != fast).
selectorNoLocator selector value. Required for: scroll_to_element.
strategyNoRequired for scroll_to_element. Prefer accessibility id > id > platform-native (iOS: -ios predicate string / -ios class chain; Android: -android uiautomator) > xpath (last resort: slow/brittle). name is legacy; class name may match multiple elements; css selector is webview-only. Same priorities as appium_find_element.
velocityNoPinch velocity in scale factor per second. Default 2.2. Used by pinch_zoom.
directionNoDirection for scroll/swipe. Coordinates are calculated from the screen or element bounds. Provide either direction or custom coordinates (x, y, endX, endY); direction takes precedence if both are given. For scroll_to_element, use up/down; default down.
sessionIdNoSession ID; defaults to the active session.
elementUUIDNoElement UUID for tap, double_tap, long_press, or pinch_zoom; overrides x/y for these actions. For scroll/swipe with direction, coordinates are calculated relative to this element instead of the whole screen.
scrollDistanceNoscroll_to_element only: vertical swipe distance fraction (0.05–1). Ignored when scrollDistancePreset is set. Default 0.45 when neither option is supplied.
maxScrollAttemptsNoscroll_to_element only: maximum scroll attempts after the initial lookup fails. Default 10.
scrollDistancePresetNoscroll_to_element only: small is a light nudge (0.25), medium is 0.45, large is the full default swipe (1). Overrides scrollDistance when set.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only indicate readOnlyHint=false and openWorldHint=false. The description adds meaningful behavioral context by explaining the intent behind scroll vs swipe and recommending speed=fast for velocity-sensitive actions. It does not contradict annotations and provides useful semantic guidance, though it omits details like side effects or failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler. The purpose and action list are front-loaded, followed by decision guidance and pointers to sibling tools. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (8 actions, 17 params) and full schema coverage, the description covers the key decision points: action selection, scroll/swipe distinction, and alternatives. There is no output schema, so return values are not a gap. The description provides enough for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all 17 parameters are fully documented in the schema. The description does not need to repeat parameter details; it only adds a high-level reference to speed=fast, which is also in the schema. Baseline 3 applies because the schema handles the parameter documentation burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Perform a touch gesture') and enumerates the supported actions. It clearly differentiates from siblings by naming appium_drag_and_drop and appium_perform_actions as alternatives for other gesture types.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on when to use scroll vs swipe (browse vs dismiss/carousel/pull-to-refresh) and calls out alternatives for drag-and-drop and custom multi-touch. This is actionable routing logic an agent can follow without inspecting schemas.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appium_get_active_elementA
Read-only

Get the currently active/focused element and return its UUID for follow-up interactions. [PRIORITY 1: Use this first when you need to find what element currently has focus]

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionIdNoSession ID; defaults to the active session.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The read-only behavior is already covered by annotations, so the description doesn't need to restate that. It adds useful context by specifying that the tool returns a UUID intended for follow-up interactions. It does not mention edge cases like what happens when no element is focused, but that is a minor omission for such a simple read-only tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short, efficient components: the purpose first, then the priority usage note. There is no filler, and the key information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter, read-only tool with safety annotations, the description is nearly complete: it states what is returned (UUID) and why it matters. The only real gap is the lack of guidance on the no-focused-element case, especially given the absence of an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%: the only parameter, sessionId, is already documented as defaulting to the active session. The description adds no parameter-level detail, so the schema carries the semantic load and the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource ('Get the currently active/focused element') and states a concrete output ('return its UUID for follow-up interactions'). This clearly distinguishes it from siblings like appium_find_element, which search for elements rather than report the current focus.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit usage context: 'Use this first when you need to find what element currently has focus.' This is clear and actionable, but it does not name alternatives or state when not to use it, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appium_get_element_attributeA
Read-only

Get the value of an element attribute. Use this to check element state (enabled, selected, checked, focused, displayed, clickable) or read properties (name, value, label, content-desc, resource-id, class).

ParametersJSON Schema
NameRequiredDescriptionDefault
attributeYesThe attribute name to retrieve. Common attributes: "enabled", "selected", "displayed", "checked", "focused", "clickable", "scrollable", "focusable", "name", "value", "label", "text", "content-desc", "resource-id", "class", "package".
sessionIdNoSession ID; defaults to the active session.
elementUUIDYesElement ID from appium_find_element.

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true, and the description is consistent with that non-destructive getter. The description adds no further behavioral detail beyond the annotation, such as what happens if the attribute does not exist or the exact return format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no filler. The core action is front-loaded, followed by the practical use cases, making it easy to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only 3-parameter tool with full schema coverage, the description is largely sufficient for selection and invocation. The main omission is the exact return type or null behavior for missing attributes, but that is minor given the tool name and examples.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage, the baseline is 3, but the description adds meaningful semantic grouping by separating state attributes from property attributes. This helps the agent choose appropriate values for the attribute parameter beyond what the schema lists.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Get the value of an element attribute') and concrete use examples, so an agent can tell what the tool does. It does not explicitly differentiate it from the overlapping sibling appium_get_text, which can also retrieve text or value attributes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says 'Use this to check element state... or read properties', giving clear contexts for when the tool is appropriate. However, it does not mention when not to use it or when to prefer a sibling tool, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appium_get_page_sourceB
Read-only

Get the page source (XML) from the current screen

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionIdNoSession ID; defaults to the active session.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds that the output is XML and scoped to the current screen, which is useful behavioral context, though it does not mention potential size/latency or failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single 10-word sentence with no filler. The key information—operation, resource, and format—is immediately front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with one optional sessionId parameter, the description covers the essential operation and return format (XML). No output schema exists, but the 'page source (XML)' phrase sufficiently indicates the return value for a standard Appium agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The sole parameter, sessionId, is fully described in the schema with a default behavior, so schema coverage is 100%. The tool description adds no further parameter insights, hence the baseline score of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Get') and identifies the precise resource ('page source (XML)') plus the scope ('current screen'). This clearly differentiates from siblings like appium_screenshot or appium_get_text, though it does not explicitly name alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description offers no guidance on when to prefer this tool over its many siblings, such as appium_get_active_element or appium_get_window_size. It does not state conditions, exclusions, or alternatives, leaving an agent to infer from the name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appium_get_textC
Read-only

Get text from an element

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionIdNoSession ID; defaults to the active session.
elementUUIDYesElement ID from appium_find_element.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description aligns with readOnlyHint=true and does not contradict the annotations, but it adds no behavioral detail beyond them. There is no mention of return format, stale-element behavior, or side effects, so the description contributes little transparency that the annotation doesn't already supply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler or redundancy. It is appropriately compact for a simple getter tool, though it sacrifices explanatory richness for brevity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read-only getter with a well-documented schema and readOnly annotation, the tool is minimally callable. However, there is no output schema, and the description could usefully state that the return value is the element's text content; it also fails to route agents away from nearby siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Both parameters are already described in the JSON schema: sessionId defaults to the active session and elementUUID comes from appium_find_element. With 100% schema coverage, the description adds no extra parameter meaning, so 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.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific operation ('Get text') and target ('from an element'), making the core purpose immediately clear. However, it doesn't contrast with related siblings such as appium_get_element_attribute or clarify whether 'text' means visible text vs. an attribute value.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives like appium_get_element_attribute or appium_get_active_element. The only implied trigger is needing text from an element, but no prerequisites, exclusions, or contextual cues are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appium_get_window_sizeA
Read-only

Get the width and height of the device screen in pixels. Useful for calculating coordinates for swipes, taps, and scrolls.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionIdNoSession ID; defaults to the active session.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No contradiction with annotations: readOnlyHint=true matches the read-only 'Get' wording. The description adds useful context beyond the annotation by specifying the result is the device screen dimensions in pixels rather than element-level or abstract coordinates.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no redundancy: the first states the return value and unit, the second states the practical use case. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple: one optional parameter, read-only, and the return semantics are clear from 'width and height in pixels.' The description plus schema fully equip an agent to decide to call it and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the only parameter, sessionId, is already documented as 'Session ID; defaults to the active session.' The description adds nothing needed about parameters, so the schema carries the burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource: 'Get the width and height of the device screen in pixels.' This clearly distinguishes the tool from sibling getters like appium_get_text, appium_get_element_attribute, appium_get_page_source, and appium_get_active_element.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a concrete intended use: 'calculating coordinates for swipes, taps, and scrolls,' which tells an agent when to call it. It does not explicitly name exclusions or alternative tools, but for a simple screen-size query the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appium_mobile_clipboardA

Read or set the device clipboard as plain text (Android UiAutomator2 / iOS XCUITest). action=get returns current text; action=set requires content.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesget: read device clipboard as plain text. set: write plain text to the clipboard.
contentNoRequired when action is set. Plain text to put on the clipboard.
sessionIdNoSession ID; defaults to the active session.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark readOnlyHint=false, so the description's confirmation of a set/write mode adds modest value. It does contribute platform scope, plain-text semantics, and the behavior that action=get returns current text. However, it does not disclose side effects such as replacing the existing clipboard contents or any platform-specific failure behavior; these would be useful but are not severe omissions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences with no filler. The core operation is front-loaded, followed by the mode-specific behavior and the prerequisite condition for set. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-action clipboard tool, the description plus the input schema is sufficient to invoke it correctly: action is required and enum-limited, content is required when setting, and sessionId defaults to the active session. The return for get is described as current text, and no output schema exists. Minor caveats such as clipboard persistence or platform restrictions are not covered, but the tool is simple enough that the current description feels complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters are already documented. The description adds a little extra meaning by linking action=get to returning text and action=set to requiring content, but this mostly restates the schema's enum descriptions rather than providing substantial new semantic information. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a precise verb+resource pair: 'Read or set the device clipboard as plain text.' It also narrows the scope by naming the supported platforms (Android UiAutomator2 / iOS XCUITest) and enumerating the two modes via action=get and action=set, which clearly distinguishes it from sibling tools that target elements, keyboards, or sessions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit mode-level guidance: 'action=get returns current text; action=set requires content.' This tells the agent exactly when each action branch is appropriate and which parameter is needed. It does not name alternative sibling tools for exclusion, but there is no obvious clipboard-specific sibling among the listed tools, so the guidance is sufficiently clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appium_mobile_device_controlA

Control device behavior: lock/unlock the screen, shake the device, or open the notifications panel. Use the action parameter to choose what to do.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform. lock: lock the device (optional seconds for timed lock). unlock: unlock the device. shake: perform shake gesture (iOS only). open_notifications: open notifications panel (Android only).
secondsNoOnly for action=lock: lock duration in seconds before auto-unlock. Omit to remain locked until unlock.
sessionIdNoSession ID; defaults to the active session.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false, so the agent knows this mutates state. The description adds no further behavioral context beyond what the schema already provides (platform-specific actions). It does not disclose side effects like disrupting the app under test or requiring an active session. Since annotations cover the mutation aspect and the schema covers platform limitations, a 3 is appropriate – the description adds minimal but non-contradictory context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that immediately states the tool's purpose and points to the key parameter. It is concise, avoids repetition, and contains no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with three parameters fully described in the schema and no output schema, the description is adequate. It explains what the tool does and directs the agent to the action parameter. It does not mention preconditions like device availability or potential interference with the test, but these are not strictly required for correct invocation. The description is complete enough for an agent to use it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all parameters are documented in the schema. The description only says 'Use the action parameter to choose what to do,' which adds no additional meaning beyond the schema's detailed enum and per-parameter descriptions. Baseline 3 is correct when the schema fully documents parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the resource (device behavior) and lists specific actions: lock/unlock the screen, shake, open notifications. This is distinct from sibling tools like appium_gesture (screen gestures) or appium_orientation (screen rotation), making the purpose immediately clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: if you need to perform these device-level actions, use this tool. However, it does not mention alternatives or when not to use it, such as 'use appium_gesture for screen-level interactions' or platform-specific exclusions (though the schema does note iOS-only for shake and Android-only for open_notifications). No explicit when/when-not guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appium_mobile_device_infoA
Read-only

Get device information, battery status, or current device time in a single call. Use the "action" parameter to select which data to retrieve. Works on both iOS and Android.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform: "info" returns device model/OS/locale/etc., "battery" returns battery level and charging state, "time" returns the current device time.
formatNoOnly used when action is "time". moment.js format string for the returned time. Defaults to ISO 8601 (YYYY-MM-DDTHH:mm:ssZ).
sessionIdNoSession ID; defaults to the active session.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already covers the non-destructive nature, and the description adds useful behavioral context: a single call can retrieve three different kinds of data selected by the action parameter, and it works across iOS and Android. It does not discuss session behavior, but the schema documents sessionId and its default.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short, front-loaded sentences with no filler. The main purpose comes first, followed by the selection mechanism and platform compatibility, so every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple three-parameter read-only tool, the description is complete. There is no output schema, but the input schema's action enum descriptions already specify what 'info', 'battery', and 'time' return, so an agent has everything it needs to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 explains the action enum values, the format parameter, and sessionId. The description reinforces that action selects which data to retrieve but adds little beyond the schema, fitting the baseline for fully documented parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Get device information, battery status, or current device time.' It immediately ties these outputs to the action parameterable and clearly distinguishes this read-only device-info tool from the sibling control, text, and element-interaction tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly indicates when to use the tool: whenever the agent needs device info, battery status, or device time, and it notes both iOS and Android are supported. It does not explicitly name alternatives for non-device-info tasks, so it falls short of fully 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.

appium_mobile_fileA

Push or pull a file using Appium mobile extensions. action=push uses payloadBase64, action=pull returns contentBase64.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYespush uploads a file to device; pull downloads from device.
sessionIdNoSession ID; defaults to the active session.
remotePathYesPath to the file on the device. Android (UiAutomator2): use an absolute path (e.g. /data/local/tmp/foo.txt or /sdcard/Download/foo.txt). iOS (XCUITest): use the formats described in the Appium XCUITest file transfer guide (e.g. @com.example.app:documents/file.txt or simulator-relative paths).
payloadBase64NoRequired when action=push. Ignored when action=pull.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations show readOnlyHint=false, indicating mutation, which aligns with the push action. The description adds the action-to-payload mapping (push uses payloadBase64, pull returns contentBase64) but does not disclose side effects like file overwriting or failure conditions. It provides some context but is not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that states the purpose and the key action-to-payload behavior with zero waste. It is efficient and immediately actionable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with four parameters and no output schema, the description covers the core behavior and return format for pull. The schema handles platform-specific paths and parameter requirements, so the description is adequate for correct invocation, though it omits error handling and side-effect details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 all parameters in detail, including platform-specific remotePath formats. The description only restates the action-payload relationship already present in the schema, adding no extra semantic value beyond the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('push or pull a file') and the specific Appium mobile extensions, making it distinct from other appium_* tools like screenshot or clipboard. It names the resource and the operation precisely, avoiding tautology.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the tool's purpose, but the description does not explicitly state when to choose this over alternatives or provide any exclusion criteria. Since it is the only file-transfer tool among siblings, the choice is obvious, yet the guidance is not explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appium_mobile_keyboardA

Hide the software keyboard or check if it is visible (Android UiAutomator2 / iOS XCUITest). action=hide uses mobile: hideKeyboard; action=is_shown uses mobile: isKeyboardShown.

ParametersJSON Schema
NameRequiredDescriptionDefault
keysNohide only: optional key names to dismiss the keyboard (e.g. "done"). Forwarded to mobile: hideKeyboard when non-empty. Ignored for is_shown.
actionYeshide: dismiss the software keyboard (mobile: hideKeyboard). is_shown: whether the keyboard is visible (mobile: isKeyboardShown).
sessionIdNoSession ID; defaults to the active session.

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnlyHint=false, so the tool is expected to mutate state. The description confirms the hide action is mutating and the is_shown action is a query, but does not add deeper behavioral details such as side effects when the keyboard is already hidden, platform-specific quirks, or error conditions. It adds the platform scope (Android/iOS), which is useful context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences with the core purpose front-loaded, followed by the action mappings. Every word earns its place; there is no fluff or redundancy, making it efficient and easily scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with three parameters and no output schema, the description covers the actions but fails to specify the return value for is_shown (expected boolean). It also does not mention error handling or platform-specific behaviors. While the core functionality is clear, the missing return-type detail leaves a gap for an agent relying on the description alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the description duplicates the parameter information already present in the schema (e.g., keys are only for hide, action enum). It adds no new semantic value beyond what the schema provides, so a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb-resource pairing: hide the software keyboard or check its visibility, scoped to Android/iOS. It names the two specific actions (hide, is_shown) and maps them to Appium commands, making the purpose unambiguous and distinct from sibling tools like appium_mobile_press_key.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly states what the tool does and the two action variants, but does not explicitly say when to use it versus alternatives or when not to use it. The context is implied (keyboard control), but no exclusions or sibling routing is provided, leaving the agent to infer appropriateness.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appium_mobile_permissionsA

Get/update Android app permissions or iOS Simulator privacy services; reset iOS privacy prompts. See action-specific parameters.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoApp ID; overrides name. Android defaults to the app under test; required for iOS get/update.
nameNoApp name resolved to an ID. Android defaults to the app under test; alternative to id for iOS get/update.
accessNoiOS update only: map of access rule → yes|no|unset|limited (Simulator + AppleSimulatorUtils). Required for iOS update.
actionYesget: list (Android) or read one privacy state (iOS Simulator). update: grant/revoke (Android) or set privacy map (iOS Simulator). reset: restore a privacy prompt for the app under test (iOS only).
targetNoAndroid update: pm (default) or appops.
serviceNoiOS get: privacy service name (e.g. camera, microphone, photos). iOS reset: service name or numeric XCUIProtectedResource id.
sessionIdNoSession ID; defaults to the active session.
permissionsNoAndroid update only: permission name(s), `all` (with pm target), or appops names. Required for Android update.
permissionFilterNoAndroid get only: which bucket to return. Defaults to requested per UiAutomator2.
permissionChangeActionNoAndroid update: for pm target grant (default) or revoke; for appops allow, deny, ignore, default.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say readOnlyHint=false and openWorldHint=false, so the description carries the burden of disclosing mutation behavior. It does disclose that 'update' grants/revokes and 'reset' restores a privacy prompt, and it notes platform-specific defaults (Android defaults to the app under test; iOS requires an ID). It does not mention side effects like whether reset clears all prompts or whether update is destructive, but the action-specific parameter hints cover the main 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loads the core purpose and then points to action-specific parameters. It is compact and avoids repeating schema details. It could be slightly more structured (e.g., bullet points per action), but it earns its place and is not bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (10 parameters, nested objects, three actions, two platforms) and no output schema, the description is reasonably complete: it names the actions, platforms, and points to parameter details. It does not explain return values or error cases, but the schema covers parameter semantics and the description covers the action matrix. A short note on output shape would push it to 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds value by grouping parameters by action ('iOS update only', 'Android update only', 'Android get only') and by clarifying defaults (Android defaults to the app under test; pm target default). This goes beyond the schema's per-parameter descriptions and helps an agent pick the right parameters for a chosen action.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb-resource pair ('Get/update Android app permissions or iOS Simulator privacy services; reset iOS privacy prompts') and clearly distinguishes the three actions. It also names the platform split (Android vs iOS Simulator), which differentiates it from sibling tools like appium_mobile_device_control or appium_driver_settings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool (permissions/privacy services) and points to action-specific parameters, but it does not explicitly state when not to use it or name alternative tools. The sibling list contains related device-control tools, but no exclusion is stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appium_mobile_press_keyA

Press navigation keys (BACK, HOME, APP_SWITCH) on Android or physical buttons (HOME, volume, etc.) on iOS/tvOS.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNoLogical key/button to press. On Android: BACK, HOME, APP_SWITCH. On iOS/tvOS: HOME, VOLUME_UP, VOLUME_DOWN, UP, DOWN, LEFT, RIGHT, MENU, PLAY_PAUSE, SELECT.
keyCodeNoAndroid keycode to press. If provided, takes precedence over key for Android.
sessionIdNoSession ID; defaults to the active session.
isLongPressNoAndroid only. Whether to perform a long press. Defaults to false.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal a non-read-only operation, so the description only needs to add behavioral context. It adds platform-specific key behavior and implies navigation side effects via key names, but it does not explicitly state effects like leaving the current screen (HOME/APP_SWITCH) or changing volume, nor does it mention long-press behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence delivers the core action and platform scope with no filler or repetition. It is front-loaded and every phrase earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The input schema fully documents all four parameters, including platform restrictions and keyCode precedence, so the brief description plus the schema gives an agent what it needs for a simple key press. The main missing piece is relationship guidance to sibling input tools, which is already captured under usage guidelines.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3 and the schema already documents key, keyCode precedence, sessionId, and isLongPress. The description only echoes a subset of key-to-platform mappings and adds no new meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with the specific action 'Press' and identifies the exact resources: navigation keys (BACK, HOME, APP_SWITCH) on Android and physical buttons on iOS/tvOS. This clearly distinguishes the tool from sibling input tools like appium_mobile_keyboard and appium_gesture without needing to open the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance about when to choose this tool over alternatives or when not to use it. The only context is platform coverage ('on Android' vs 'on iOS/tvOS'), but the description never names a sibling like appium_mobile_keyboard or appium_perform_actions or gives a selection condition.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appium_orientationA

Get or set the device/screen orientation. Supports action=get and action=set (LANDSCAPE or PORTRAIT).

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesUse get to read current orientation, set to change orientation.
sessionIdNoSession ID; defaults to the active session.
orientationNoRequired when action is set.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=false; the description adds that the tool can set orientation to LANDSCAPE or PORTRAIT. However, it does not mention side effects, persistence, or what the get action returns, leaving some behavioral detail undisclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that front-loads the core purpose and then lists supported actions and values. There is no filler or redundant content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The schema covers parameters and required fields, and the description conveys the get/set semantics. However, since there is no output schema, the description does not explain what the get action returns, which is a small but relevant completeness gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 and enums. The description mostly restates what the schema already provides (action=get/set, LANDSCAPE/PORTRAIT) without adding new semantic detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb-resource pair: 'Get or set the device/screen orientation.' It is specific enough to identify the tool's purpose, though it does not explicitly contrast it with sibling tools, so it misses the top score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The usage is implied: use this tool when you need to read or change the device orientation. It does not explicitly state when to prefer this over related siblings like appium_get_window_size or appium_context, nor when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appium_perform_actionsA

Execute raw W3C Actions API sequences for advanced multi-touch gestures not covered by appium_gesture. Use this for custom multi-finger gestures (rotate, three-finger swipe, edge swipes), complex timing sequences, or any gesture requiring precise control over individual touch points. Prefer appium_gesture for standard gestures (tap, scroll, swipe, pinch) — it handles platform differences automatically.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionsYesW3C Actions API input source array. Each entry is one input source (pointer/key/none) with its action sequence. Multiple pointer sources enable multi-touch gestures (e.g. two-finger rotate, three-finger swipe). All sources execute in parallel, synchronized tick-by-tick.
sessionIdNoSession ID; defaults to the active session.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide readOnlyHint=false and openWorldHint=false, so the description is not required to restate those. It does add meaningful behavioral context by labeling the tool as 'raw' and contrasting it with appium_gesture's automatic platform handling, implying this tool does not abstract platform differences. This informs the agent of potential platform-specific behavior. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero fluff. The first sentence states the purpose and scope, the second gives usage guidance and alternatives. Critical information (the contrast with appium_gesture) is front-loaded, and every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of raw W3C Actions API, the description is complete for an agent to decide when to invoke it and what to expect. It covers the tool's niche, its relationship to the sibling, and the key concept of multi-touch via multiple input sources. The detailed schema handles the technical specifics, so the description fills the conceptual gap adequately.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers 100% of parameters with descriptions, so the baseline is 3. The description adds conceptual value beyond the schema by explaining how multiple pointer sources enable multi-touch gestures and that all sources execute in parallel synchronized tick-by-tick. This helps an agent understand the semantics of the actions array without opening the schema, though it doesn't introduce new parameter-specific details beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb ('Execute') and a specific resource ('raw W3C Actions API sequences'), and immediately distinguishes itself from appium_gesture by noting it covers gestures 'not covered by appium_gesture'. This makes the tool's purpose unambiguous and separates it from the sibling without requiring schema inspection.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent when to use this tool (custom multi-finger gestures, complex timing, precise control) and when to prefer the alternative ('Prefer appium_gesture for standard gestures...'). It also explains why (appium_gesture handles platform differences automatically). This is clear, actionable routing with no ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appium_prepare_ios_real_deviceA

Prepare signed WDA for a real iOS device. Omit provisioningProfileUuid to list profiles; ask the user to choose, highlighting recommendedForWda. Pass the chosen UUID to download, package, and sign WDA; wildcard profiles use a concrete WDA bundle ID. Downloads/unsigned IPA are cached per version; signing always reruns. Pass capabilitiesHint to appium_session_management action=create to install/launch the signed WDA. Requires macOS, Xcode 16+, and a paired developer-mode device.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesUDID of the connected iOS real device. Use select_device to discover it.
forceRebuildNoIf true, ignore the cached WDA download and unsigned IPA and start clean. The signed IPA is always rebuilt regardless. Default: false.
provisioningProfileUuidNoUUID of the .mobileprovision profile to sign WDA with. If omitted, the tool returns the list of available profiles so you can ask the user to pick one.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Description discloses substantial behavior beyond annotations: omitting provisioningProfileUuid lists profiles, wildcard profiles use a concrete WDA bundle ID, downloads/unsigned IPA are cached per version while signing always reruns, and the tool hands off to appium_session_management. It also states prerequisites and the need to ask the user, which the readOnlyHint=false annotation alone does not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but efficient: purpose, user-interaction flow, cache behavior, handoff, and requirements each earn their place. The most important operational detail (omit UUID to list profiles) appears immediately after the purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex, mutating tool with no output schema, the description covers prerequisites, two modes of operation, the exact next step (capabilitiesHint to appium_session_management), and cache semantics. However, it leaves the concrete shape of the returned profile list unspecified beyond 'list of available profiles' and 'recommendedForWda', so an agent lacks full return-value transparency.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema already documents all three parameters (100% coverage), so baseline is 3. The description adds workflow-level meaning: the omission semantics of provisioningProfileUuid, the recommendedForWda highlighting, the cache/forceRebuild interaction ('signing always reruns'), and wildcard-profile behavior. This is meaningful but not exhaustive enough to warrant 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Prepare signed WDA for a real iOS device.' This clearly distinguishes from the sibling prepare_ios_simulator by targeting real devices, and the rest of the description narrows the exact deliverable (signed WDA).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context: real iOS device, requires macOS, Xcode 16+, paired developer-mode device, and a two-step flow depending on provisioningProfileUuid. It does not explicitly name an alternative like prepare_ios_simulator or state when not to use this tool, so it falls short of the 5-level 'explicit when-not/alternatives' bar.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appium_screen_recordingA

Start or stop screen recording. action=start begins recording; action=stop stops and saves to MP4.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesstart begins recording; stop ends, retrieves, and saves it.
bitRateNoAndroid only. Video bit rate in bits per second.
videoFpsNoiOS only. Frames per second. Default: 10.
bugReportNoAndroid only. Display timestamp overlay. Requires API level 27+.
sessionIdNoSession ID; defaults to the active session.
timeLimitNoRecorder limit in seconds; it does not retrieve/save automatically, so call stop. iOS default 180/max 4200; Android default 180/max 1800.
videoSizeNoAndroid only. Frame size in WIDTHxHEIGHT format (e.g. 1280x720).
videoTypeNoiOS only. Video codec to use (e.g. libx264).
videoScaleNoiOS only. Width:height, each 1–16384 (e.g. 1280:720); one may be -1 or -2 to preserve aspect ratio.
pixelFormatNoiOS only. Output pixel format (e.g. yuv420p).
forceRestartNoRestart and discard any active recording; default false.
videoQualityNoiOS only. Video quality preset. Default: medium.
hardwareAccelerationNoiOS only. FFMPEG hardware acceleration backend.

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds the useful behavioral fact that stopping the recording saves it as an MP4, which goes beyond the readOnlyHint=false annotation. However, it does not disclose stateful concerns like the need to pair start with stop, what happens if a recording is already active, or where the file is saved.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences with no filler. It front-loads the core purpose and then gives the action-level mechanics, making it easy to scan and process.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is adequate for a basic understanding, and the schema supplies rich parameter detail. However, for a 13-parameter tool with no output schema, it leaves lifecycle behavior, return values, and platform considerations implicit, so an agent gets only partial context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 all 13 parameters. The description mostly restates the action parameter's meaning ('action=start begins recording; action=stop stops and saves to MP4') without adding extra semantics for the platform-specific parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: start or stop screen recording. It also gives the concrete outcome for stop ('saves to MP4'), which clearly distinguishes this video-capture tool from sibling tools like appium_screenshot.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The action values make the basic usage clear, but there is no explicit guidance about when to choose this tool over alternatives, nor any documented prerequisites such as an active session or a started recording. Usage is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appium_screenshotA

Take a screenshot and save as PNG. Optionally provide elementUUID to capture only that element.

ParametersJSON Schema
NameRequiredDescriptionDefault
maxWidthNoResize to at most this width in pixels, preserving aspect ratio.
sessionIdNoSession ID; defaults to the active session.
elementUUIDNoCapture this element; omit for the full screen.
returnRawBase64NoReturn inline PNG instead of saving, for explicit manual use when the server file is inaccessible. LLMs must keep false and use the saved path.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the core behavior: capturing a screenshot and saving it as PNG. It does not contradict the annotations, but with readOnlyHint false and openWorldHint false, the annotations add little context, and the description does not mention output paths, return semantics, or limitations such as element visibility.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one concise sentence that front-loads the main action and then introduces the optional element capture. Every word contributes to understanding, with no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple screenshot tool with fully documented parameters, the description plus schema is largely sufficient. It lacks an explicit statement of the return value, such as the saved file path, but the returnRawBase64 parameter description partially covers that expectation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all parameters are already well documented. The description mostly restates the elementUUID behavior found in the schema without adding significant new meaning, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Take a screenshot and save as PNG.' It also distinguishes the element-capture mode from full-screen capture, making the tool's purpose clear and distinct from siblings like appium_screen_recording or appium_get_page_source.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The purpose implies the tool should be used for still visual capture, and the optional elementUUID note adds a usage mode. However, it does not explicitly mention alternatives, such as screen recording or page source, or state when one should be preferred over the other.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appium_session_managementA
Destructive

Manage Appium sessions. Use action=create to start a session, attach to connect to an existing one, detach to forget an attached session, delete to stop one, list to see all active sessions, or select to switch the active session.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYescreate: Create a new Appium session. DEFAULT MODE (no remoteServerUrl): use unless the user explicitly provides a server URL. - Drivers run embedded inside this MCP server; no separate Appium process is needed. - Use select_device tool FIRST to discover devices. Ask for platform/device if unknown; do not assume a platform. - For iOS simulators, run prepare_ios_simulator before creating the session. - Call appium_session_management action=create with the selected platform and any returned capabilitiesHint serialized as capabilities. - Do NOT pass remoteServerUrl for local/embedded mode. NEVER invent a localhost URL. REMOTE SERVER MODE (only when user explicitly provides a URL): - Skip local device selection and preparation; do not call select_device. - Infer platform and device type from the request when possible; ask if unclear. - Use platform=general for non-Android/iOS drivers (Windows, macOS, custom); capabilities pass through without platform defaults. - Call appium_session_management action=create with platform, remoteServerUrl, and the requested capabilities. - Example: "create an iOS session at http://localhost:4723" means platform=ios and remoteServerUrl=http://localhost:4723; do not discover local devices. attach: connect to an existing remote Appium session without taking ownership of its lifecycle. Requires remoteServerUrl and sessionId; capabilities are fetched from the remote server. detach: remove an attached session from MCP without deleting the real remote session. Defaults to the active session. delete: delete a session and clean up resources. Defaults to the active session. list: list managed sessions with active flag, ownership, and current context. select: set sessionId as the active session for subsequent calls; requires sessionId.
platformNoRequired for create. For local sessions, match the platform selected via select_device. For remote sessions, infer from the request; general supports non-Android/iOS drivers (Windows, macOS, custom) and requires remoteServerUrl.
sessionIdNoRequired for attach and select: the existing session to connect to or activate. For delete: session to delete. For detach: attached session to forget without stopping it. Delete/detach default to the active session when omitted.
capabilitiesNoOptional W3C capabilities as a JSON string, e.g. '{"appium:app":"/path/to/app","appium:platformVersion":"17.0"}'. Create: overrides defaults for ios/android; passed through as-is for general. Common keys: appium:app, appium:deviceName, appium:udid, appium:platformVersion, appium:bundleId. When using capabilitiesHint from a preparation tool, serialize the full object to JSON; preserve boolean and numeric values. Attach: optional fallback values (e.g. '{"platformName":"iOS"}'); capabilities fetched from the server take precedence.
remoteServerUrlNoRemote Appium server URL for create or attach (e.g. http://localhost:4723). Omit to use local server for create.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (destructiveHint=true), the description discloses lifecycle semantics: detach 'remove[s] an attached session... without deleting the real remote session', delete 'clean[s] up resources' and defaults to the active session, and attach fetches capabilities from the server. These ownership and defaulting behaviors are not encoded in the schema or annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The tool-level description is concise and front-loaded with all six actions. However, the action parameter description is a large wall of text that absorbs nearly all workflow guidance, and the tool description carries little of the load. Every sentence is informative, but the distribution is uneven.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-action, dual-mode (local/remote) tool with no output schema, the description is remarkably complete: prerequisites, mode selection, parameter roles, and defaults are all covered. Minor gaps remain in return-value shapes (e.g., what create or list returns), but nothing essential to invoking the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the parameter descriptions add substantial semantics: the action enum embeds complete per-action workflows, sessionId documents default-on-omit behavior per action, capabilities explains serialization rules and precedence, and remoteServerUrl distinguishes local vs remote modes.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource statement ('Manage Appium sessions') and enumerates all six operation modes (create, attach, detach, delete, list, select), each with a distinct purpose. It differentiates cleanly from siblings like appium_app_lifecycle or select_device, which do not manage session lifecycle.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The action parameter description provides explicit when-to-use guidance: local/embedded mode vs remote server mode, when to call select_device and prepare_ios_simulator first, when to use platform=general, and a concrete example ('create an iOS session at http://localhost:4723'). It also names the alternative preparation tools, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appium_set_valueB

Enter text into an element

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe text to enter
sessionIdNoSession ID; defaults to the active session.
w3cActionsNoWhen true, type text via the W3C Actions API (performActions) instead of the driver-specific setValue. No elementUUID needed — key events are sent to whatever element currently has focus. Works on both Android and iOS.
elementUUIDNoElement ID from appium_find_element.

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=false, so the mutation behavior is known. The description adds no further behavioral context such as whether existing text is replaced, whether the element must be editable, or how w3cActions changes focus behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler or redundant wording. It is appropriately concise for the simple operation it names.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The schema covers all parameters and annotations cover the mutation profile, but the description alone is thin for a tool with two distinct input modes (elementUUID vs w3cActions). Missing usage guidance and behavioral details prevent it from being fully self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so parameters are fully documented in the schema. The description itself adds no parameter-level meaning, but the baseline of 3 applies because the schema carries the burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Enter text into an element'. It clearly identifies the operation and target, and is distinguishable from sibling read tools like appium_get_text, though it does not explicitly name or contrast sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives such as appium_mobile_keyboard, appium_mobile_press_key, or appium_perform_actions. No exclusions, prerequisites, or selection criteria are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_locatorsA
Read-only

Generate locators for all interactable elements on the current page. [PRIORITY 3: Use this for debugging/inspection or when you need comprehensive element info with locator suggestions]

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionIdNoSession ID; defaults to the active session.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already covers safety, and the description adds the useful scope 'all interactable elements' and 'current page.' It does not go further into output format, cost/performance, or session requirements, which would add value beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence plus a compact usage/priority tag. Every phrase earns its place, and the priority guidance is separated cleanly from the core definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only tool with one optional parameter and no output schema, the description supplies the essential behavior and return concept ('locator suggestions'). It is slightly thin on what the returned locator data looks like, but it is otherwise complete enough to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%; the only parameter, sessionId, is already documented with 'defaults to active session.' The tool description adds nothing about parameters, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Generate locators for all interactable elements on the current page.' This distinguishes it from sibling tools like appium_find_element (which targets a single element) and appium_get_page_source (which returns raw source rather than locator suggestions).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The bracketed guidance states concrete use cases: 'debugging/inspection' or needing 'comprehensive element info with locator suggestions.' It does not name alternatives or explicitly state when not to use it, but the context is clear enough for an agent to route to it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

prepare_ios_simulatorA

Boot an iOS/tvOS simulator, download/cache WDA, and launch it on a free per-simulator port. Pass capabilitiesHint (appium:webDriverAgentUrl) to appium_session_management action=create to reuse WDA. skipWda=true only boots. APPIUM_MCP_WDA_APP_PATH can point to an extracted WebDriverAgentRunner-Runner.app (absolute path) to skip download.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesThe UDID of the iOS simulator to prepare. Use select_device to get this.
skipWdaNoIf true, only boot the simulator without downloading or installing WDA. Default: false.
platformNoThe simulator platform to download WDA for. Default is "ios". Use "tvos" for Apple TV simulators.ios
forceRefreshWdaNoIf true, re-download WDA even if already cached. Default: false.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only mark this as not read-only, so the description carries the burden. It adds valuable behavioral context: WDA is cached, launched on a free per-simulator port, and can be skipped via an environment variable pointing to an already-extracted app. It doesn't describe failure modes or cleanup, but the main side effects are visible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences carry all necessary information, with the core action front-loaded and optional usage details following. It is appropriately concise, though the second and third sentences are dense and mix integration guidance with environment configuration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description still explains the full setup flow: boot, WDA download/cache/launch, reuse via capabilities, and the skip-download path via environment variable. It implies the returned WDA URL without explicitly stating it, leaving a minor gap for an agent that needs to rely solely on this text.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description references skipWda and the environment variable override, which supplements the schema slightly, but it does not add significant new meaning to the parameters beyond what the property descriptions already provide.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb+resource: boot an iOS/tvOS simulator, download/cache WebDriverAgent, and launch it on a per-simulator port. This clearly distinguishes it from the sibling appium_prepare_ios_real_device by targeting simulators and explicitly mentions Apple TV support.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides concrete usage direction: pass capabilitiesHint (appium:webDriverAgentUrl) to appium_session_management to reuse WDA, and use skipWda=true when only booting is needed. It stops short of explicitly stating when not to use this tool or comparing it to the real-device sibling, so it isn't a perfect 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

select_deviceA

Discover/select a LOCAL device. Ask for platform if unknown; one device is auto-selected. For multiple devices, ask the user to choose, then pass deviceUdid. Next: prepare_ios_simulator for iOS simulators, then appium_session_management action=create. Skip for REMOTE servers: pass device capabilities (appium:deviceName/appium:udid) and the user-provided remoteServerUrl to session creation.

ParametersJSON Schema
NameRequiredDescriptionDefault
platformYesPlatform chosen by the user.
deviceUdidNoUser-selected UDID. Omit to discover devices.
iosDeviceTypeNoRequired for ios: simulator or real device.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide little signal (both hints false), so the description carries the behavioral burden. It discloses interactive behavior: asking the user, auto-selecting one device, or requesting a choice among multiple. It also explains what to do in the remote case, giving the agent a clear behavioral contract, though it does not address no-device or failure scenarios.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose, then proceeds through decision branches and exceptions. It uses semicolons and colons to pack workflow into three sentences with minimal waste. A bulleted structure might improve scannability, but every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple parameter surface and lack of an output schema, the description covers purpose, decision rules, the remote exception, and next steps for iOS simulators. It is missing a real-iOS device route and any behavior for zero devices found, but the overall flow is clear enough for an agent to invoke the tool correctly in common cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and each parameter already has a meaningful description. The tool description adds only slight reinforcement, such as 'ask the user to choose, then pass deviceUdid,' which is already implied by the schema. There is no substantial semantic value beyond the schema, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Discover/select a LOCAL device.' It clearly delineates local versus remote use, which distinguishes it from sibling Appium session/device tools. The phrase 'Skip for REMOTE servers' further separates this tool's scope from session-creation tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit decision guidance: ask for platform if unknown, auto-select when one device, ask the user when multiple, and skip for remote servers by passing capabilities to session creation. However, it only names prepare_ios_simulator for iOS simulators and omits the real-iOS preparation path, leaving a sibling-adjacent gap.

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.

  1. 28 tool updatesv1.95.0
    • Changedappium_alert1 field changed
      • changedInput schema / properties / sessionId / description
        Previous value: -"Session ID to target. If omitted, uses the active session."New value: +"Session ID; defaults to the active session."
    • Changedappium_app_lifecycle2 fields changed
      • changedInput schema / properties / path / description
        Previous value: -"App file path; required for install."New value: +"App file path or HTTP(S) URL; required for install. Embedded URL downloads require ALLOW_REMOTE_APP_URLS=true (default). Remote sessions resolve app inputs on the remote Appium server."
      • changedInput schema / properties / sessionId / description
        Previous value: -"Session ID to target. If omitted, uses the active session."New value: +"Session ID; defaults to the active session."
    • Changedappium_context1 field changed
      • changedInput schema / properties / sessionId / description
        Previous value: -"Session ID to target. If omitted, uses the active session."New value: +"Session ID; defaults to the active session."
    • Changedappium_drag_and_drop1 field changed
      • changedInput schema / properties / sessionId / description
        Previous value: -"Session ID to target. If omitted, uses the active session."New value: +"Session ID; defaults to the active session."
    • Changedappium_driver_settings2 fields changed
      • changedInput schema / properties / sessionId / description
        Previous value: -"Session ID to target. If omitted, uses the active session."New value: +"Session ID; defaults to the active session."
      • changedInput schema / properties / settings / additionalProperties
        Previous value: -falseNew value: +{}
    • Changedappium_find_element3 fields changed
      • changedInput schema / properties / selector / description
        Previous value: -"Selector string for the chosen strategy. Do not pass natural-language descriptions of the target here; use appium_ai (action=find_element) for that."New value: +"Selector string for the chosen strategy. Do not pass natural-language descriptions of the target here; use appium_ai action=find_element if enabled for vision-based finding."
      • changedInput schema / properties / sessionId / description
        Previous value: -"Session ID to target. If omitted, uses the active session."New value: +"Session ID; defaults to the active session."
      • changedInput schema / properties / strategy / description
        Previous value: -"Locator strategy. Try in priority order: (1) accessibility id [cross-platform, fastest, most stable], (2) id [Android resource-id; iOS aliases accessibility id], (3) -ios predicate string [iOS native, fast], (4) -ios class chain [iOS native, hierarchy queries], (5) -android uiautomator [Android native, expressive UiSelector], (6) xpath [LAST RESORT — slow on iOS XCUITest, brittle to layout changes], (7) name [legacy; often aliased on iOS], (8) class name [too generic, usually multi-match], (9) css selector [webview/hybrid contexts only]. Platform tips: iOS prefer (1)→(3)→(4); Android prefer (1)→(2)→(5); xpath last on both. For natural-language / vision-based find, use the appium_ai tool (action=find_element), not this one."New value: +"Locator strategy. Prefer stable identifiers, then platform-native queries; xpath is the last resort.\n- accessibility id: cross-platform, fast and stable when available.\n- id: Android resource-id; an accessibility-id alias on iOS.\n- -ios predicate string: fast native iOS queries on element attributes.\n- -ios class chain: native iOS hierarchy queries.\n- -android uiautomator: native Android queries using UiSelector.\n- xpath: last resort; slow on iOS XCUITest and brittle to layout changes.\n- name: legacy; often aliased on iOS.\n- class name: usually too generic and may match multiple elements.\n- css selector: webview/hybrid web contexts only, not native screens.\niOS prefer accessibility id > -ios predicate string > -ios class chain; Android prefer accessibility id > id > -android uiautomator. Use xpath last on both."
    • Changedappium_geolocation1 field changed
      • changedInput schema / properties / sessionId / description
        Previous value: -"Session ID to target. If omitted, uses the active session."New value: +"Session ID; defaults to the active session."
    • Changedappium_gesture16 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"Gesture to perform. tap: tap an element or a coordinate. double_tap: trigger a double-tap action (e.g. zoom in on an image, favorite a post). long_press: press and hold to open a context menu or initiate drag. scroll: browse a list, feed, or page to reveal content. swipe: dismiss a card, switch screens or tabs, navigate a carousel, or pull-to-refresh (use speed=fast). pinch_zoom: zoom in (scale > 1) or out (scale < 1) on maps, images, or any zoomable view. scroll_to_element: scroll until a specific element is on screen (strategy + selector + direction up|down). Stops when the element is found, page source is unchanged after a scroll (end of scrollable content), or maxScrollAttempts is reached. Optional scrollDistance (0.05–1) or scrollDistancePreset (small|medium|large). back: triggers the system back navigation (e.g., Android back button or iOS navigation controller pop)."New value: +"Gesture to perform:\n- tap: tap an element or a coordinate.\n- double_tap: double-tap, for example to zoom an image or favorite a post.\n- long_press: press and hold to open a context menu or initiate a drag.\nFor tap/double_tap/long_press, provide elementUUID or both x and y.\n- scroll: browse a list, feed, or page to reveal content.\n- swipe: dismiss a card, switch screens or tabs, navigate a carousel, or pull-to-refresh (use speed=fast).\nFor scroll/swipe, provide direction or all four custom coordinates: x, y, endX, endY.\n- pinch_zoom: zoom in (scale > 1) or out (scale < 1) on maps, images, or other zoomable views. Requires scale.\n- scroll_to_element: scroll to find a target using strategy and selector. Direction is up/down, default down.\nStops when the element is found, page source is unchanged after a scroll (likely end of content), or maxScrollAttempts is reached.\nAdjust distance with scrollDistance (0.05–1) or scrollDistancePreset (small/medium/large).\n- back: trigger system back navigation."
      • changedInput schema / properties / direction / description
        Previous value: -"Direction for scroll or swipe. Coordinates are auto-calculated from screen or element bounds. Either direction OR custom coordinates (x, y, endX, endY) must be provided for these actions."New value: +"Direction for scroll/swipe. Coordinates are calculated from the screen or element bounds. Provide either direction or custom coordinates (x, y, endX, endY); direction takes precedence if both are given. For scroll_to_element, use up/down; default down."
      • changedInput schema / properties / duration / description
        Previous value: -"Duration in milliseconds. long_press default 2000 (range 500-10000). scroll default 800. For swipe, prefer the speed parameter; duration overrides it if both are provided."New value: +"Duration in milliseconds. long_press defaults to 2000 (range 500–10000); scroll defaults to 800. For swipe, prefer speed unless a custom movement duration is needed. For W3C swipe, overrides movement time; speed still sets the initial hold. Ignored by iOS native mobile: swipe (direction, no elementUUID, speed != fast)."
      • changedInput schema / properties / elementUUID / description
        Previous value: -"UUID of the element to act on. Used by: tap, double_tap, long_press, pinch_zoom. For scroll/swipe, when provided with direction, the gesture is calculated relative to this element instead of the whole screen."New value: +"Element UUID for tap, double_tap, long_press, or pinch_zoom; overrides x/y for these actions. For scroll/swipe with direction, coordinates are calculated relative to this element instead of the whole screen."
      • changedInput schema / properties / endX / description
        Previous value: -"Ending X coordinate. Used by: scroll, swipe (custom-coordinate mode)."New value: +"Ending X coordinate in pixels for scroll/swipe; requires x, y, endY."
      • changedInput schema / properties / endY / description
        Previous value: -"Ending Y coordinate. Used by: scroll, swipe (custom-coordinate mode)."New value: +"Ending Y coordinate in pixels for scroll/swipe; requires x, y, endX."
      • changedInput schema / properties / maxScrollAttempts / description
        Previous value: -"scroll_to_element only: maximum scroll attempts after the element is not yet visible (default 10)."New value: +"scroll_to_element only: maximum scroll attempts after the initial lookup fails. Default 10."
      • changedInput schema / properties / scale / description
        Previous value: -"Pinch scale factor. < 1 = zoom out (pinch close), > 1 = zoom in (pinch open). Example: 0.5 = zoom out 50%, 2.0 = zoom in 2x. Required for: pinch_zoom."New value: +"Required for pinch_zoom. Scale < 1 zooms out (fingers close); scale > 1 zooms in (fingers spread). Examples: 0.5 zooms out; 2.0 zooms in 2x."
      • changedInput schema / properties / scrollDistance / description
        Previous value: -"scroll_to_element only: vertical swipe length as a fraction 0.05–1 (same scale as legacy scroll). Ignored when scrollDistancePreset is set. Default 0.45 if neither preset nor scrollDistance is set."New value: +"scroll_to_element only: vertical swipe distance fraction (0.05–1). Ignored when scrollDistancePreset is set. Default 0.45 when neither option is supplied."
      • changedInput schema / properties / scrollDistancePreset / description
        Previous value: -"scroll_to_element only: convenience preset — small ≈ light nudge (0.25), medium ≈ 0.45, large = full default swipe (1). When set, overrides scrollDistance."New value: +"scroll_to_element only: small is a light nudge (0.25), medium is 0.45, large is the full default swipe (1). Overrides scrollDistance when set."
      • changedInput schema / properties / sessionId / description
        Previous value: -"Session ID to target. If omitted, uses the active session."New value: +"Session ID; defaults to the active session."
      • changedInput schema / properties / speed / description
        Previous value: -"Swipe speed. slow = deliberate drag; normal = default navigation speed; fast = flick with no hold, use for pull-to-refresh and other velocity-sensitive UIs. Used by: swipe."New value: +"Swipe only. slow: deliberate drag; normal: default navigation speed; fast: flick without an initial hold. Use fast for pull-to-refresh and other velocity-sensitive interfaces."
      • changedInput schema / properties / strategy / description
        Previous value: -"Locator strategy. Required for: scroll_to_element. Priority: accessibility id > id > platform-native (-ios predicate string / -ios class chain on iOS, -android uiautomator on Android) > xpath (LAST RESORT — slow on iOS XCUITest, brittle) > name > class name > css selector (webview only). Same ranking as appium_find_element."New value: +"Required for scroll_to_element. Prefer accessibility id > id > platform-native (iOS: -ios predicate string / -ios class chain; Android: -android uiautomator) > xpath (last resort: slow/brittle). name is legacy; class name may match multiple elements; css selector is webview-only. Same priorities as appium_find_element."
      • changedInput schema / properties / velocity / description
        Previous value: -"Pinch velocity in scale factor per second. Default 2.2. Used by: pinch_zoom."New value: +"Pinch velocity in scale factor per second. Default 2.2. Used by pinch_zoom."
      • changedInput schema / properties / x / description
        Previous value: -"X coordinate. For tap/double_tap/long_press: tap location (alternative to elementUUID). For scroll/swipe: starting X for custom-coordinate mode (requires y, endX, endY). For pinch_zoom: center X of the pinch. Requires y. Ignored if elementUUID is set."New value: +"X coordinate in pixels. For tap/double_tap/long_press: tap location, paired with y. For scroll/swipe: starting X in custom-coordinate mode; requires y, endX, endY. For pinch_zoom: center X, paired with y. Tap/double_tap/long_press/pinch_zoom ignore x/y when elementUUID is set."
      • changedInput schema / properties / y / description
        Previous value: -"Y coordinate. For tap/double_tap/long_press: tap location. For scroll/swipe: starting Y for custom-coordinate mode. For pinch_zoom: center Y of the pinch. Requires x. Ignored if elementUUID is set."New value: +"Y coordinate in pixels, paired with x. For tap/double_tap/long_press: tap location. For scroll/swipe: starting Y in custom-coordinate mode. For pinch_zoom: center Y. The same elementUUID precedence as x applies."
    • Changedappium_get_active_element1 field changed
      • changedInput schema / properties / sessionId / description
        Previous value: -"Session ID to target. If omitted, uses the active session."New value: +"Session ID; defaults to the active session."
    • Changedappium_get_element_attribute1 field changed
      • changedInput schema / properties / sessionId / description
        Previous value: -"Session ID to target. If omitted, uses the active session."New value: +"Session ID; defaults to the active session."
    • Changedappium_get_page_source1 field changed
      • changedInput schema / properties / sessionId / description
        Previous value: -"Session ID to target. If omitted, uses the active session."New value: +"Session ID; defaults to the active session."
    • Changedappium_get_text1 field changed
      • changedInput schema / properties / sessionId / description
        Previous value: -"Session ID to target. If omitted, uses the active session."New value: +"Session ID; defaults to the active session."
    • Changedappium_get_window_size1 field changed
      • changedInput schema / properties / sessionId / description
        Previous value: -"Session ID to target. If omitted, uses the active session."New value: +"Session ID; defaults to the active session."
    • Changedappium_mobile_clipboard1 field changed
      • changedInput schema / properties / sessionId / description
        Previous value: -"Session ID to target. If omitted, uses the active session."New value: +"Session ID; defaults to the active session."
    • Changedappium_mobile_device_control1 field changed
      • changedInput schema / properties / sessionId / description
        Previous value: -"Session ID to target. If omitted, uses the active session."New value: +"Session ID; defaults to the active session."
    • Changedappium_mobile_device_info1 field changed
      • changedInput schema / properties / sessionId / description
        Previous value: -"Session ID to target. If omitted, uses the active session."New value: +"Session ID; defaults to the active session."
    • Changedappium_mobile_file1 field changed
      • changedInput schema / properties / sessionId / description
        Previous value: -"Session ID to target. If omitted, uses the active session."New value: +"Session ID; defaults to the active session."
    • Changedappium_mobile_keyboard1 field changed
      • changedInput schema / properties / sessionId / description
        Previous value: -"Session ID to target. If omitted, uses the active session."New value: +"Session ID; defaults to the active session."
    • Changedappium_mobile_permissions2 fields changed
      • changedInput schema / properties / access / additionalProperties
        Previous value: -falseNew value: +{
        +  "enum": [
        +    "yes",
        +    "no",
        +    "unset",
        +    "limited"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / sessionId / description
        Previous value: -"Session ID to target. If omitted, uses the active session."New value: +"Session ID; defaults to the active session."
    • Changedappium_mobile_press_key1 field changed
      • changedInput schema / properties / sessionId / description
        Previous value: -"Session ID to target. If omitted, uses the active session."New value: +"Session ID; defaults to the active session."
    • Changedappium_orientation1 field changed
      • changedInput schema / properties / sessionId / description
        Previous value: -"Session ID to target. If omitted, uses the active session."New value: +"Session ID; defaults to the active session."
    • Changedappium_perform_actions1 field changed
      • changedInput schema / properties / sessionId / description
        Previous value: -"Session ID to target. If omitted, uses the active session."New value: +"Session ID; defaults to the active session."
    • Changedappium_screen_recording4 fields changed
      • changedInput schema / properties / sessionId / description
        Previous value: -"Session ID to target. If omitted, uses the active session."New value: +"Session ID; defaults to the active session."
      • removedInput schema / properties / videoFilters
        Removed value: -{
        -  "description": "iOS only. FFMPEG video filters. Takes precedence over videoScale.",
        -  "type": "string"
        -}
      • changedInput schema / properties / videoScale / description
        Previous value: -"iOS only. Scaling value (e.g. 1280:720)."New value: +"iOS only. Width:height, each 1–16384 (e.g. 1280:720); one may be -1 or -2 to preserve aspect ratio."
      • addedInput schema / properties / videoScale / pattern
        Added value: +"^(?:[1-9]\\d{0,4}|-[12]):(?:[1-9]\\d{0,4}|-[12])(?![\\s\\S])"
    • Changedappium_screenshot4 fields changed
      • changedInput schema / properties / elementUUID / description
        Previous value: -"Optional element UUID. If provided, captures only this element. If omitted, captures full screen."New value: +"Capture this element; omit for the full screen."
      • changedInput schema / properties / maxWidth / description
        Previous value: -"Optional maximum width in pixels to resize the screenshot. The aspect ratio is preserved. Useful for reducing token usage when sending screenshots to LLMs."New value: +"Resize to at most this width in pixels, preserving aspect ratio."
      • changedInput schema / properties / returnRawBase64 / description
        Previous value: -"When true, returns the raw base64-encoded PNG image instead of saving it to disk. This should only be enabled when a human explicitly invokes the tool manually, typically to view the screenshot on a different machine (e.g. when the server runs on a remote machine and the saved file is not accessible). An LLM must always keep this false and rely on the saved file path."New value: +"Return inline PNG instead of saving, for explicit manual use when the server file is inaccessible. LLMs must keep false and use the saved path."
      • changedInput schema / properties / sessionId / description
        Previous value: -"Session ID to target. If omitted, uses the active session."New value: +"Session ID; defaults to the active session."
    • Changedappium_session_management4 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"Action to perform. create: Create a new Appium session with Android, iOS or any device/driver Appium supports.\n      DEFAULT MODE (no remoteServerUrl) — USE THIS UNLESS THE USER EXPLICITLY PROVIDES A SERVER URL:\n      - Drivers run embedded inside this MCP server; no separate Appium process is needed\n      - Use select_device tool FIRST to discover devices and let the user choose platform and device\n      - Then call action=create with the selected platform (do NOT pass remoteServerUrl)\n      - For iOS simulators, call prepare_ios_simulator before action=create\n      - DO NOT assume or default to any platform\n      - NEVER invent a localhost URL (e.g. http://localhost:4723) — omitting remoteServerUrl IS the local/embedded mode\n      REMOTE SERVER MODE (only when user explicitly provides a URL like http://localhost:4723):\n      - SKIP select_device tool entirely\n      - Infer the platform from the user's request (e.g., 'ios', 'android', or 'general')\n      - If platform is 'general', treat the provided capabilities as a pass-through W3C/Appium capability set (useful for non-Android/iOS drivers like Windows, macOS, or custom drivers)\n      - Infer device type from context when possible (e.g., 'simulator', 'real device')\n      - Call session with action=create directly with platform, remoteServerUrl, and any other capabilities from the user's request\n      - Example: User says 'start session with http://localhost:4723 for ios with iphone 17' → infer platform='ios' and call session(action=create) with remoteServerUrl and platform parametersattach: Attach MCP Appium to an existing remote Appium session without taking ownership of its lifecycle. Requires remoteServerUrl and sessionId. Always pass capabilities with at least platformName (e.g. '{\"platformName\":\"iOS\"}' or '{\"platformName\":\"Android\"}') so the client is configured with the correct protocol commands.detach: Remove an attached Appium session from MCP Appium without deleting the real remote session. Defaults to the active session.delete: Delete a mobile session and clean up resources. If sessionId is omitted, deletes the active session.list: List all active Appium sessions managed by this MCP server, including active flag, ownership, and current context.select: Set an existing Appium session as the active session for subsequent tool calls (requires sessionId)."New value: +"create: Create a new Appium session.\nDEFAULT MODE (no remoteServerUrl): use unless the user explicitly provides a server URL.\n- Drivers run embedded inside this MCP server; no separate Appium process is needed.\n- Use select_device tool FIRST to discover devices. Ask for platform/device if unknown; do not assume a platform.\n- For iOS simulators, run prepare_ios_simulator before creating the session.\n- Call appium_session_management action=create with the selected platform and any returned capabilitiesHint serialized as capabilities.\n- Do NOT pass remoteServerUrl for local/embedded mode. NEVER invent a localhost URL.\nREMOTE SERVER MODE (only when user explicitly provides a URL):\n- Skip local device selection and preparation; do not call select_device.\n- Infer platform and device type from the request when possible; ask if unclear.\n- Use platform=general for non-Android/iOS drivers (Windows, macOS, custom); capabilities pass through without platform defaults.\n- Call appium_session_management action=create with platform, remoteServerUrl, and the requested capabilities.\n- Example: \"create an iOS session at http://localhost:4723\" means platform=ios and remoteServerUrl=http://localhost:4723; do not discover local devices.\nattach: connect to an existing remote Appium session without taking ownership of its lifecycle. Requires remoteServerUrl and sessionId; capabilities are fetched from the remote server.\ndetach: remove an attached session from MCP without deleting the real remote session. Defaults to the active session.\ndelete: delete a session and clean up resources. Defaults to the active session.\nlist: list managed sessions with active flag, ownership, and current context.\nselect: set sessionId as the active session for subsequent calls; requires sessionId."
      • changedInput schema / properties / capabilities / description
        Previous value: -"Optional W3C capabilities for create. Provide as a JSON string (e.g. '{\"appium:app\":\"/path/to/app\",\"appium:platformVersion\":\"17.0\"}'). For create: applied on top of defaults for ios/android, or used as-is for general. Common: appium:app, appium:deviceName, appium:platformVersion, appium:bundleId. When passing from a capabilitiesHint result, serialize the full object to JSON — do NOT drop boolean or numeric values. For attach: always include platformName (\"iOS\" or \"Android\") so the WebDriver client loads the correct Appium protocol commands (e.g. '{\"platformName\":\"iOS\"}')."New value: +"Optional W3C capabilities as a JSON string, e.g. '{\"appium:app\":\"/path/to/app\",\"appium:platformVersion\":\"17.0\"}'. Create: overrides defaults for ios/android; passed through as-is for general. Common keys: appium:app, appium:deviceName, appium:udid, appium:platformVersion, appium:bundleId. When using capabilitiesHint from a preparation tool, serialize the full object to JSON; preserve boolean and numeric values. Attach: optional fallback values (e.g. '{\"platformName\":\"iOS\"}'); capabilities fetched from the server take precedence."
      • changedInput schema / properties / platform / description
        Previous value: -"Required for create. For local servers, must match the platform selected via select_device. Use \"general\" for non-Android/iOS drivers (Windows, macOS, custom). For remote servers, infer from context."New value: +"Required for create. For local sessions, match the platform selected via select_device. For remote sessions, infer from the request; general supports non-Android/iOS drivers (Windows, macOS, custom) and requires remoteServerUrl."
      • changedInput schema / properties / sessionId / description
        Previous value: -"For attach: existing session to connect to. For delete: session to remove (defaults to active). For detach: attached session to remove from MCP (defaults to active). For select: session to activate. Required for attach and select."New value: +"Required for attach and select: the existing session to connect to or activate. For delete: session to delete. For detach: attached session to forget without stopping it. Delete/detach default to the active session when omitted."
    • Changedappium_set_value1 field changed
      • changedInput schema / properties / sessionId / description
        Previous value: -"Session ID to target. If omitted, uses the active session."New value: +"Session ID; defaults to the active session."
    • Changedgenerate_locators1 field changed
      • changedInput schema / properties / sessionId / description
        Previous value: -"Session ID to target. If omitted, uses the active session."New value: +"Session ID; defaults to the active session."
    • Changedselect_device3 fields changed
      • changedInput schema / properties / deviceUdid / description
        Previous value: -"The UDID of the device selected by the user. If not provided, this tool will list available devices for the user to choose from."New value: +"User-selected UDID. Omit to discover devices."
      • changedInput schema / properties / iosDeviceType / description
        Previous value: -"For iOS only: Specify whether to use 'simulator' or 'real' device. REQUIRED when platform is 'ios'."New value: +"Required for ios: simulator or real device."
      • changedInput schema / properties / platform / description
        Previous value: -"The platform to list devices for (must match previously selected platform)"New value: +"Platform chosen by the user."
  2. 31 tool updatesv1.92.11
    • First observedappium_alert
    • First observedappium_app_lifecycle
    • First observedappium_context
    • First observedappium_drag_and_drop
    • First observedappium_driver_settings
    • First observedappium_find_element
    • First observedappium_generate_tests
    • First observedappium_geolocation
    • First observedappium_gesture
    • First observedappium_get_active_element
    • First observedappium_get_element_attribute
    • First observedappium_get_page_source
    • First observedappium_get_text
    • First observedappium_get_window_size
    • First observedappium_mobile_clipboard
    • First observedappium_mobile_device_control
    • First observedappium_mobile_device_info
    • First observedappium_mobile_file
    • First observedappium_mobile_keyboard
    • First observedappium_mobile_permissions
    • First observedappium_mobile_press_key
    • First observedappium_orientation
    • First observedappium_perform_actions
    • First observedappium_prepare_ios_real_device
    • First observedappium_screen_recording
    • First observedappium_screenshot
    • First observedappium_session_management
    • First observedappium_set_value
    • First observedgenerate_locators
    • First observedprepare_ios_simulator
    • First observedselect_device

TDQS

A3.7/5.0

Scored across 31 tools

Disambiguation5/5

Each tool targets a distinct resource/action and the descriptions actively cross-reference each other (e.g., appium_gesture defers to appium_drag_and_drop and appium_perform_actions; appium_find_element vs generate_locators vs appium_get_active_element carry priority guidance). Even potentially overlapping gesture and element-lookup tools are clearly separated, so an agent is unlikely to mis-select.

Naming Consistency4/5

The dominant appium_ + snake_case pattern is consistent across ~27 tools, but select_device, generate_locators, and prepare_ios_simulator break the prefix convention. Notably, generate_locators vs appium_generate_tests and prepare_ios_simulator vs appium_prepare_ios_real_device are internally inconsistent pairs in the same subdomains.

Tool Count2/5

With 31 tools, the surface exceeds the 25+ 'too many' threshold. While Appium's domain is broad, the set is dense and several tools could be consolidated (e.g., the three separate gesture tools, or device_info/orientation/control split across tools), making it heavier than needed for agent usability.

Completeness4/5

The surface covers the mobile automation lifecycle well: device selection, session management, element finding/interaction, gestures, app lifecycle, contexts, and device services (permissions, geolocation, clipboard, files, recording). Minor gaps exist — no element clear-text operation, no element location/size retrieval, and no explicit wait-for-element helper — but agents can work around these.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to automate Android mobile device testing through Appium, with automatic device detection, screen element inspection, and natural language test scenario execution.
    3
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI assistants to control mobile and desktop devices with natural language, including running automation tasks, taking screenshots, and managing devices.
    6
    5 npm
    MIT