Skip to main content
Glama
webdriverio

WebDriverIO MCP Server

Official
by webdriverio

WebDriverIO MCP Server

A Model Context Protocol (MCP) server that enables AI assistants to interact with web browsers, local Electron applications, and mobile applications using WebdriverIO. Automate Chrome, Firefox, Edge, Safari, Electron, iOS, and Android through a unified interface.

Installation

mcp MCP server

Add the following configuration to your MCP client settings:

Standard config (works in most clients):

{
  "mcpServers": {
    "wdio-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@wdio/mcp@latest"
      ]
    }
  }
}

Install in VS Code Install in VS Code Insiders

Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS), %APPDATA%\Claude\claude_desktop_config.json (Windows), or ~/.config/Claude/claude_desktop_config.json (Linux):

{
  "mcpServers": {
    "wdio-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@wdio/mcp@latest"
      ]
    }
  }
}
claude mcp add wdio-mcp -- npx -y @wdio/mcp@latest

Add to your VS Code settings.json or cline_mcp_settings.json file:

{
  "mcpServers": {
    "wdio-mcp": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "@wdio/mcp@latest"
      ]
    }
  }
}

Go to Cursor SettingsMCPAdd new MCP Server, or create .cursor/mcp.json:

{
  "mcpServers": {
    "wdio-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@wdio/mcp@latest"
      ]
    }
  }
}

Use the Codex CLI:

codex mcp add wdio-mcp npx "@wdio/mcp@latest"

Or edit ~/.codex/config.toml:

[mcp_servers.wdio-mcp]
command = "npx"
args = ["@wdio/mcp@latest"]

Go to Advanced settingsExtensionsAdd custom extension, or run:

goose configure

Or edit ~/.config/goose/config.yaml:

extensions:
  wdio-mcp:
    name: WebDriverIO MCP
    cmd: npx
    args: [ -y, "@wdio/mcp@latest" ]
    enabled: true
    type: stdio

Edit ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "wdio-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@wdio/mcp@latest"
      ]
    }
  }
}

Edit Zed settings (~/.config/zed/settings.json):

{
  "context_servers": {
    "wdio-mcp": {
      "source": "custom",
      "command": "npx",
      "args": [
        "-y",
        "@wdio/mcp@latest"
      ]
    }
  }
}
code --add-mcp '{"name":"wdio-mcp","command":"npx","args":["-y","@wdio/mcp@latest"]}'

⚠️ Restart Required: After adding the configuration, fully restart your MCP client to apply the changes.

Option 2: Global Installation

If you prefer to install globally:

npm install -g @wdio/mcp

Then use wdio-mcp as the command:

{
  "mcpServers": {
    "wdio-mcp": {
      "command": "wdio-mcp"
    }
  }
}

📖 Need help? Follow the MCP install guide.

HTTP Transport (for non-subprocess clients)

By default the server uses stdio (subprocess) transport. For clients that cannot launch subprocesses (e.g. llama.cpp, OpenAI Codex secure mode), enable HTTP transport:

npx @wdio/mcp --http --port 3000

Flag

Default

Description

--http

Enable HTTP transport mode

--port

3000

Port to listen on

--allowedHosts

localhost,127.0.0.1,::1

Allowed Host header values (DNS rebinding protection)

--allowedOrigins

(none — browser clients blocked)

Allowed Origin values for CORS. Use * to allow all.

Then point your MCP client at http://localhost:3000/mcp.

Prerequisites For Mobile App Automation

  • Appium Server: Install globally with npm install -g appium

  • Platform Drivers:

    • iOS: appium driver install xcuitest (requires Xcode on macOS)

    • Android: appium driver install uiautomator2 (requires Android Studio)

  • Devices/Emulators:

    • iOS Simulator (macOS) or physical device

    • Android Emulator or physical device

  • For iOS Real Devices: You'll need the device's UDID (Unique Device Identifier)

    • Find UDID on macOS: Connect device → Open Finder → Select device → Click device name/model to reveal UDID

    • Find UDID on Windows: Connect device → iTunes or Apple Devices app → Click device icon → Click "Serial Number" to reveal UDID

    • Xcode method: Window → Devices and Simulators → Select device → UDID shown as "Identifier"

Start the Appium server before using mobile features:

appium
# Server runs at http://127.0.0.1:4723 by default

Related MCP server: Selenium MCP Server

Cloud Providers

Run browser and mobile app tests on cloud real devices and browsers without any local setup. Currently supports BrowserStack, Sauce Labs, LambdaTest, TestingBot, and Digital.ai Testing.

Prerequisites

Set your provider credentials as environment variables or in your MCP client config:

export BROWSERSTACK_USERNAME=your_username
export BROWSERSTACK_ACCESS_KEY=your_access_key
{
  "mcpServers": {
    "wdio-mcp": {
      "command": "npx",
      "args": ["-y", "@wdio/mcp@latest"],
      "env": {
        "BROWSERSTACK_USERNAME": "your_username",
        "BROWSERSTACK_ACCESS_KEY": "your_access_key"
      }
    }
  }
}
export SAUCE_USERNAME=your_username
export SAUCE_ACCESS_KEY=your_access_key
{
  "mcpServers": {
    "wdio-mcp": {
      "command": "npx",
      "args": ["-y", "@wdio/mcp@latest"],
      "env": {
        "SAUCE_USERNAME": "your_username",
        "SAUCE_ACCESS_KEY": "your_access_key"
      }
    }
  }
}

| SAUCE_USERNAME | Sauce Labs username (required) | | SAUCE_ACCESS_KEY | Sauce Labs access key (required) |

The data center is set per-session via the region parameter in start_session (defaults to eu-central-1).

export TESTMU_USERNAME=your_username
export TESTMU_ACCESS_KEY=your_access_key
{
  "mcpServers": {
    "wdio-mcp": {
      "command": "npx",
      "args": ["-y", "@wdio/mcp@latest"],
      "env": {
        "TESTMU_USERNAME": "your_username",
        "TESTMU_ACCESS_KEY": "your_access_key"
      }
    }
  }
}

| TESTMU_USERNAME | LambdaTest username (required) | | TESTMU_ACCESS_KEY | LambdaTest access key (required) |

export TESTINGBOT_KEY=your_key
export TESTINGBOT_SECRET=your_secret
{
  "mcpServers": {
    "wdio-mcp": {
      "command": "npx",
      "args": ["-y", "@wdio/mcp@latest"],
      "env": {
        "TESTINGBOT_KEY": "your_key",
        "TESTINGBOT_SECRET": "your_secret"
      }
    }
  }
}

| TESTINGBOT_KEY | TestingBot key (required) | | TESTINGBOT_SECRET | TestingBot secret (required) |

export DIGITALAI_CLOUD_URL=https://your-cloud.example.com
export DIGITALAI_ACCESS_KEY=your_access_key
{
  "mcpServers": {
    "wdio-mcp": {
      "command": "npx",
      "args": ["-y", "@wdio/mcp@latest"],
      "env": {
        "DIGITALAI_CLOUD_URL": "https://your-cloud.example.com",
        "DIGITALAI_ACCESS_KEY": "your_access_key"
      }
    }
  }
}

| DIGITALAI_CLOUD_URL | Digital.ai cloud host, e.g. https://your-cloud.example.com (required) | | DIGITALAI_ACCESS_KEY | Digital.ai access key (required) |

The access key is sent via the digitalai:options capability (mobile) or the flat digitalai:accessKey capability (web).

Report pass/fail status: WebdriverIO defaults to the BiDi protocol, over which Digital.ai's cloud cannot observe command failures — so reports default to "Passed". To make the cloud reflect actual pass/fail, opt in to classic WebDriver per session:

start_session({
  provider: 'digitalai', platform: 'browser', browser: 'chrome', os: 'Windows 10',
  capabilities: { 'wdio:enforceWebDriverClassic': true }
})

(Pure client-side assertion failures still report as "Passed" — only failures that reach the cloud as WebDriver command errors are detected.)

Mobile (Appium): configure your Digital.ai project for Appium-server execution and pick its default Appium version via the project's "Manage default Appium server version" setting — the version is chosen at the project level (and tracks the versions your cloud supports), so this MCP does not pin one. See Appium Server Test Execution.

Browser Sessions

Run a browser on a specific OS/version combination:

// BrowserStack
start_session({
    provider: 'browserstack',
    platform: 'browser',
    browser: 'chrome',           // chrome | firefox | edge | safari
    browserVersion: 'latest',    // default: latest
    os: 'Windows',               // e.g. "Windows", "OS X"
    osVersion: '11',             // e.g. "11", "Sequoia"
    reporting: {
        project: 'My Project',
        build: 'v1.2.0',
        session: 'Login flow'
    }
})

// Sauce Labs
start_session({
    provider: 'saucelabs',
    platform: 'browser',
    browser: 'chrome',
    os: 'Windows',               // combined with osVersion → platformName
    osVersion: '11',             // e.g. "11", "15" (numbered Mac naming)
    region: 'eu-central-1',      // default: eu-central-1
    reporting: {
        build: 'v1.2.0',
        session: 'Login flow'
    }
})

// LambdaTest
start_session({
    provider: 'testmu',
    platform: 'browser',
    browser: 'chrome',
    os: 'Windows',               // combined with osVersion → platformName
    osVersion: '11',             // e.g. "11", "Sequoia" (optional)
    reporting: {
        project: 'My Project',
        build: 'v1.2.0',
        session: 'Login flow'
    }
})

// TestingBot
start_session({
    provider: 'testingbot',
    platform: 'browser',
    browser: 'chrome',
    os: 'Windows',               // combined with osVersion → platformName (default: Windows 11)
    osVersion: '11',
    reporting: {
        build: 'v1.2.0',
        session: 'Login flow'
    }
})

// Digital.ai
start_session({
    provider: 'digitalai',
    platform: 'browser',
    browser: 'chrome',
    os: 'Windows',               // combined with osVersion → digitalai:osName (optional)
    osVersion: '11',
    reporting: {
        session: 'Login flow'    // → digitalai:testName (flat capability, not nested)
    }
})

Provider-specific os / osVersion behavior:

  • BrowserStackos and osVersion map to separate bstack:options.os / bstack:options.osVersion fields.

  • Sauce Labs / LambdaTest / TestingBotos and osVersion are combined into the W3C platformName capability (e.g., os: 'Windows' + osVersion: '11'platformName: 'Windows 11'). These providers use platformName values like "Windows 11", "MacOS Sequoia", or "Linux". TestingBot defaults to Windows 11 when os is omitted.

  • Digital.aios and osVersion are combined into the flat digitalai:osName capability (NOT platformName), e.g. os: 'Windows' + osVersion: '11'digitalai:osName: 'Windows 11'.

Mobile App Sessions

Test on cloud real devices. First upload your app (or use an existing app URL):

// BrowserStack: returns bs:// URL
upload_app({ provider: 'browserstack', path: '/path/to/app.apk' })

// Sauce Labs: returns storage:filename= reference
upload_app({ provider: 'saucelabs', path: '/path/to/app.apk' })

// LambdaTest: returns lt:// URL
upload_app({ provider: 'testmu', path: '/path/to/app.apk' })

// TestingBot: returns tb:// URL
upload_app({ provider: 'testingbot', path: '/path/to/app.apk' })

// Digital.ai: returns cloud:<package-or-bundle> reference
upload_app({ provider: 'digitalai', path: '/path/to/app.apk' })

// Start a session
start_session({
    provider: 'browserstack',
    platform: 'android',
    app: 'bs://abc123...',
    deviceName: 'Samsung Galaxy S23',
    platformVersion: '13.0'
})

// Sauce Labs native app
start_session({
    provider: 'saucelabs',
    platform: 'android',
    app: 'storage:filename=myapp.apk',
    deviceName: 'Samsung.*',
    platformVersion: '16'
})

// LambdaTest native app
start_session({
    provider: 'testmu',
    platform: 'android',
    app: 'lt://abc123...',
    deviceName: 'Pixel 7',
    platformVersion: '13'
})

// TestingBot native app
start_session({
    provider: 'testingbot',
    platform: 'android',
    app: 'tb://abc123...',
    deviceName: 'Pixel 7',
    platformVersion: '13'
})

// Digital.ai native app — devices are selected via a deviceQuery
start_session({
    provider: 'digitalai',
    platform: 'android',
    app: 'cloud:com.example.app',
    deviceQuery: "@os='android' and @version='14' and @name='.*Pixel.*'"
    // or omit deviceQuery and pass deviceName / platformVersion to build one
})

Mobile Browser Sessions

Run a browser on a cloud mobile device — real device or emulator/simulator — without uploading an app:

// BrowserStack — Chrome on Android emulator
start_session({
    provider: 'browserstack',
    platform: 'android',
    browser: 'chrome',
    deviceName: 'Google Pixel 7',
    platformVersion: '13'
})

// Sauce Labs — Safari on iOS simulator
start_session({
    provider: 'saucelabs',
    platform: 'ios',
    browser: 'safari',
    deviceName: 'iPhone 15',
    platformVersion: '18',
    region: 'eu-central-1'
})

// LambdaTest — Chrome on Android emulator
start_session({
    provider: 'testmu',
    platform: 'android',
    browser: 'chrome',
    deviceName: 'Pixel 7',
    platformVersion: '13'
})

// TestingBot — Chrome on Android emulator
start_session({
    provider: 'testingbot',
    platform: 'android',
    browser: 'chrome',
    deviceName: 'Pixel 7',
    platformVersion: '13'
})

// Digital.ai — Chrome on an Android device (real or emulator; selected via a deviceQuery)
start_session({
    provider: 'digitalai',
    platform: 'android',
    browser: 'chrome',
    deviceName: 'Pixel 7',
    platformVersion: '13'
    // or omit deviceName / platformVersion and pass deviceQuery directly, e.g.
    // deviceQuery: "@os='android' and @emulator='true'" to force an emulator
})

Note: Mobile browser sessions do not require app, appPath, or noReset. The provider launches a browser directly on the selected device — real or emulator/simulator.

Use list_apps to see previously uploaded apps:

list_apps({ provider: 'browserstack' })
list_apps({ provider: 'saucelabs', sortBy: 'app_name' })
list_apps({ provider: 'testmu' })
list_apps({ provider: 'testingbot' })
list_apps({ provider: 'digitalai' })
list_apps({ provider: 'browserstack', organizationWide: true })

Local Tunnel

To test against URLs that are only accessible on your local machine or internal network, enable a local tunnel:

// Auto-start tunnel (provider manages lifecycle)
start_session({
    provider: 'saucelabs',
    platform: 'browser',
    tunnel: true                  // auto-starts tunnel before session
})

// Use an already-running tunnel
start_session({
    provider: 'saucelabs',
    platform: 'browser',
    tunnel: 'external'            // uses existing tunnel
})

The tunnel parameter replaces the deprecated browserstackLocal, saucelabsLocal, and testmuLocal params. Set it to true to auto-start the tunnel (stopped automatically after the session), or 'external' to use a tunnel already running on your machine.

Note: With tunnel: true the provider downloads and manages the tunnel binary for you. For tunnel: 'external' you run it yourself — the wdio://saucelabs/local-binary, wdio://testmu/local-binary, and wdio://testingbot/local-binary resources provide download URLs and setup instructions. The TestingBot Tunnel is a single cross-platform Java JAR (requires Java 11+) rather than a per-platform binary.

Reporting Labels

All session types support reporting labels that appear in the provider dashboard:

Field

Description

reporting.project

Group sessions under a project name

reporting.build

Tag sessions with a build/version label

reporting.session

Name for the individual test session

Cloud Provider Tools

Tool

Description

upload_app

Upload a local .apk or .ipa to the provider; returns an app URL/reference

list_apps

List apps previously uploaded to the provider's app storage

Both tools require a provider parameter ('browserstack', 'saucelabs', 'testmu', 'testingbot', or 'digitalai').

Features

Browser Automation

  • Session Management: Start and close browser sessions (Chrome, Firefox, Edge, Safari) with headless/headed modes

  • Navigation & Interaction: Navigate URLs, click elements, fill forms, and retrieve content

  • Page Analysis: Get visible elements, accessibility trees, take screenshots

  • Cookie Management: Get, set, and delete cookies

  • Scrolling: Smooth scrolling with configurable distances

  • Attach to running Chrome: Connect to an existing Chrome window via --remote-debugging-port — ideal for testing authenticated or pre-configured sessions

  • Connect to existing WebDriver endpoints: Reuse an already-running Selenium-compatible WebDriver endpoint, such as a framework-managed browser or a desktop webview automation bridge (like Tauri)

  • Device emulation: Apply mobile/tablet presets (iPhone 15, Pixel 7, etc.) to simulate responsive layouts without a physical device

  • Session Recording: All tool calls are automatically recorded and exportable as runnable WebdriverIO JS

Mobile App Automation (iOS/Android)

  • Native App Testing: Test iOS (.app/.ipa) and Android (.apk) apps via Appium

  • Touch Gestures: Tap, swipe, long-press, drag-and-drop

  • App Lifecycle: Launch, background, terminate, check app state

  • Context Switching: Seamlessly switch between native and webview contexts for hybrid apps

  • Device Control: Rotate, lock/unlock, geolocation, keyboard control, notifications

  • Cross-Platform Selectors: Accessibility IDs, XPath, UiAutomator (Android), Predicates (iOS)

Available Tools

Session Management

Tool

Description

start_session

Start a browser, local Electron application, or mobile app session; attach: true retains the existing Chrome CDP connection mode

attach_session

Attach to an existing remote WebDriver/Appium session by ID without creating a new session

launch_chrome

Launch a new Chrome instance with remote debugging enabled (for use with start_session({ attach: true }))

close_session

Close or detach from the current session (supports detach: true to disconnect without terminating)

emulate_device

Emulate a mobile/tablet device preset (viewport, DPR, UA, touch); requires BiDi session

open_web_extension

Install a web extension through WebDriver BiDi and open one of its extension pages so normal page tools can drive its UI

Navigation & Page Interaction (Web & Mobile)

Tool

Description

navigate

Navigate to a URL

get_elements

Get visible, interactable elements on the page. Supports inViewportOnly (default: true) to filter viewport elements, and includeContainers (default: false) to include layout containers on mobile

get_accessibility_tree

Get the page accessibility tree with roles, names, and selectors. Supports filtering by role and pagination. Browser-only.

get_screenshot

Take a screenshot of the current page or screen (base64-encoded, auto-resized to max 2000px / 1MB)

get_tabs

List all open browser tabs with handle, title, URL, and active status. Browser-only.

scroll

Scroll in a direction (up/down) by specified pixels. Browser-only.

execute_script

Execute arbitrary JavaScript in the browser, or Appium mobile commands on devices

execute_electron_script

Execute privileged JavaScript in the Electron main process (Electron sessions only)

trigger_electron_deeplink

Trigger an Electron deeplink whose scheme was explicitly configured at session start

mock

Configure a session-scoped mock by kind (currently Electron API functions)

get_mock_calls

Inspect call arguments for a session-scoped mock

manage_mock

Clear, reset, or restore a session-scoped mock

switch_tab

Switch to a different browser tab by handle or 0-based index. Browser-only.

switch_frame

Switch into an iframe by CSS/XPath selector, or back to the top-level frame if no selector is given. Browser-only.

Element Interaction (Web & Mobile)

Tool

Description

click_element

Click an element

set_value

Type text into input fields

Tool

Description

get_cookies

Get all cookies for the current session, or a single cookie by name

set_cookie

Set a cookie with name, value, and optional attributes

delete_cookies

Delete all cookies or a specific cookie

Mobile Gestures (iOS/Android)

Tool

Description

tap_element

Tap an element by selector or coordinates

swipe

Swipe in a direction (up/down/left/right)

drag_and_drop

Drag from one location to another

Context Switching (Hybrid Apps)

Tool

Description

get_contexts

List available automation contexts (NATIVE_APP, WEBVIEW_*) and the currently active one

switch_context

Switch between native and webview contexts

Device Control (iOS/Android)

Tool

Description

get_app_state

Get the current lifecycle state of a mobile app (not installed / not running / background / foreground)

rotate_device

Rotate to portrait or landscape

hide_keyboard

Hide on-screen keyboard

set_geolocation

Set device GPS location

MCP Resources (read-only, no tool call needed)

Resource

Description

wdio://sessions

Index of all recorded sessions

wdio://session/current/steps

Step log for the active session

wdio://session/current/code

Generated runnable WebdriverIO JS for the active session

wdio://session/{id}/steps

Step log for any past session by ID

wdio://session/{id}/code

Generated JS for any past session by ID

wdio://session/current/elements

Interactable elements (viewport-only by default)

wdio://session/current/accessibility

Accessibility tree

wdio://session/current/screenshot

Screenshot (base64)

wdio://session/current/cookies

Browser cookies

wdio://session/current/tabs

Open browser tabs

wdio://session/current/contexts

Native/webview contexts (mobile)

wdio://session/current/context

Currently active context (mobile)

wdio://session/current/app-state/{bundleId}

Mobile app lifecycle state for a given bundle ID

wdio://session/current/geolocation

Device geolocation

wdio://session/current/capabilities

Resolved WebDriver capabilities for the active session

wdio://session/current/logs

Crash/console logs for the current session. Auto-detects session type — browser: console logs + JS exceptions; Android: logcat; iOS: crashlog + syslog

wdio://browserstack/local-binary

BrowserStack Local binary download URL and start command

wdio://saucelabs/local-binary

Sauce Connect binary download URL and start command

wdio://testmu/local-binary

TestMu Tunnel binary download URL and start command

wdio://testingbot/local-binary

TestingBot Tunnel JAR download URL and start command (Java 11+)

Usage Examples

Real-World Test Cases

Example 1: Testing Demo Android App (Book Scanning)

Test the Demo Android app at C:\Users\demo-liveApiGbRegionNonMinifiedRelease-3018788.apk on emulator-5554:
1. Start the app with auto-grant permissions
2. Get visible elements on the onboarding screen
3. Tap "Skip" to bypass onboarding
4. Verify main screen loads
5. Take a screenshot

Example 2: Testing World of Books E-commerce Site

You are a Testing expert, and want to assess the basic workflows of worldofbooks.com:
- Open World of Books (accept all cookies)
- Get visible elements to see navigation structure
- Search for a fiction book
- Choose one and validate if there are NEW and used book options
- Report your findings at the end

Browser Automation

Basic web testing prompt:

You are a Testing expert, and want to assess the basic workflows of a web application:
- Open World of Books (accept all cookies)
- Search for a fiction book
- Choose one and validate if there are NEW and used book options
- Report your findings at the end

Browser configuration options:

// Default settings (headed mode, 1280x1080)
start_session({platform: 'browser'})

// Firefox
start_session({platform: 'browser', browser: 'firefox'})

// Edge
start_session({platform: 'browser', browser: 'edge'})

// Safari (headed only; requires macOS)
start_session({platform: 'browser', browser: 'safari'})

// Headless mode
start_session({platform: 'browser', headless: true})

// Custom dimensions
start_session({platform: 'browser', windowWidth: 1920, windowHeight: 1080})

// Pass custom capabilities (e.g. Chrome extensions, profile, prefs)
start_session({
    platform: 'browser',
    headless: false,
    capabilities: {
        'goog:chromeOptions': {
            args: ['--user-data-dir=/tmp/wdio-mcp-profile', '--load-extension=/path/to/unpacked-extension']
        }
    }
})

Electron applications

Electron support is local-only and uses the official @wdio/electron-service standalone lifecycle. It requires Node.js 22.12 or newer. Put service options such as appBinaryPath, appEntryPoint, and appArgs in capabilities['wdio:electronServiceOptions']; use top-level electronRootDir for the service's Electron Builder/Electron Forge discovery. When testing a binary outside the project, set browserVersion to the Electron version so the service can select a compatible Chromedriver.

start_session({
  platform: 'electron',
  browserVersion: '33.2.1',
  capabilities: {
    'wdio:electronServiceOptions': {
      appBinaryPath: '/path/to/MyApp.app/Contents/MacOS/MyApp',
      appArgs: ['--disable-gpu']
    }
  }
})

// Privileged: this code runs in the Electron main process, not the renderer.
execute_electron_script({ script: 'return electron.app.getName()' })

Existing browser DOM tools work against the Electron renderer. close_session always tears down MCP-managed Electron sessions; detach: true is intentionally unsupported. Main/renderer log capture can be enabled with captureMainProcessLogs or captureRendererLogs plus logDir. Electron function mocks are available through mock, get_mock_calls, and manage_mock.

mock({
  mockType: 'electron', apiName: 'dialog', funcName: 'showOpenDialog',
  behavior: 'mockResolvedValue', value: { canceled: false, filePaths: ['/tmp/example.txt'] }
})
// Interact with the renderer to open the application's file picker, then inspect its calls.
get_mock_calls({ mockType: 'electron', apiName: 'dialog', funcName: 'showOpenDialog' })
manage_mock({ mockType: 'electron', apiName: 'dialog', funcName: 'showOpenDialog', action: 'restore' })

mockType accepts 'electron' or 'browser'. WebDriver browser sessions default to 'browser' when omitted. Electron sessions require an explicit selection because they can target both types of mocks. Use mockType: 'electron' with apiName and funcName for main-process API functions in an active Electron session. Browser mocking is not implemented yet and returns a clear error for either runtime. iOS/Android Appium sessions do not support mocking.

behavior defaults to mockReturnValue; mockResolvedValue and mockRejectedValue support async APIs. Each has a Once variant for queued responses. Repeated configuration preserves the existing mock and call history. Values must be JSON; omit value for undefined. clear removes call history, reset also removes behavior and queued responses, and restore reinstates the original function. Handles belong to the active browser session and cannot be reused after it closes or is replaced. These tools support individual API functions; class mocks and arbitrary mock implementations are not exposed. All three tools participate in tracing and generated replay.

To trigger an app deeplink, explicitly configure its URI scheme when starting the Electron session. The scheme has no colon and only URLs with that exact scheme can be dispatched:

start_session({
  platform: 'electron',
  electronDeeplinkScheme: 'myapp',
  capabilities: {
    'wdio:electronServiceOptions': {
      appBinaryPath: '/path/to/MyApp.app/Contents/MacOS/MyApp'
    }
  }
})
trigger_electron_deeplink({ url: 'myapp://open/item' })

Attach to a running Chrome instance:

// First, launch Chrome with remote debugging enabled:
//
//   macOS (must quit Chrome first — open -a ignores args if Chrome is already running):
//     pkill -x "Google Chrome" && sleep 1
//     /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \
//       --remote-debugging-port=9222 \
//       --user-data-dir=/tmp/chrome-debug &
//
//   Linux:
//     google-chrome --remote-debugging-port=9222 --user-data-dir=/tmp/chrome-debug &
//
//   Verify it's ready: curl http://localhost:9222/json/version
start_session({attach: true})
start_session({attach: true, port: 9333})
start_session({attach: true, port: 9222, navigationUrl: 'https://app.example.com'})

Connect to an existing WebDriver endpoint:

Use provider: 'external' when another process already owns the browser or webview lifecycle and exposes a W3C WebDriver endpoint. This is useful for Selenium Grid sessions, externally managed browser drivers, or desktop apps like Tauri apps that embed a webview and expose WebDriver separately. The MCP server connects to the endpoint; it does not launch or stop the target application, start tunnels, or manage framework-specific setup.

// Defaults to http://127.0.0.1:4445/ and browserName: 'chrome'
start_session({provider: 'external', platform: 'browser'})

// Custom WebDriver endpoint and capabilities
start_session({
    provider: 'external',
    platform: 'browser',
    webdriverConfig: {
        protocol: 'http',
        hostname: '127.0.0.1',
        port: 4445,
        path: '/'
    },
    capabilities: {
        browserName: 'tauri'
    }
})

For desktop webview apps such as Tauri, first start the app and its WebDriver bridge outside of this MCP server, then pass the endpoint and the required capabilities. For example, a Tauri WebDriver bridge may require capabilities: {browserName: 'tauri'}.

Attach to an existing WebDriver or Appium session:

Use attach_session when the session has already been created by another process. The MCP reuses the selected provider's endpoint and credentials, registers the appropriate browser/mobile command set locally, and does not issue a new-session request. Attached sessions are externally managed: close_session() detaches by default, while close_session({detach: false}) explicitly terminates the remote session.

// Existing BrowserStack App Automate session
attach_session({
    provider: 'browserstack',
    platform: 'ios',
    sessionId: 'existing-browserstack-session-id',
    capabilities: {
        'appium:deviceName': 'iPhone 15',
        'appium:automationName': 'XCUITest'
    }
})

// Existing session on a local Appium server
attach_session({
    provider: 'local',
    platform: 'android',
    sessionId: 'existing-appium-session-id',
    appiumConfig: {
        protocol: 'http',
        host: '127.0.0.1',
        port: 4723,
        path: '/'
    }
})

// Existing mobile session on a custom W3C WebDriver endpoint
attach_session({
    provider: 'external',
    platform: 'ios',
    sessionId: 'existing-grid-session-id',
    webdriverConfig: {
        protocol: 'https',
        hostname: 'grid.example.com',
        port: 443,
        path: '/wd/hub'
    }
})

An existing cloud session must keep using the tunnel it was created with. attach_session never starts or stops a tunnel, so keep the original tunnel process alive for as long as the session needs it.

Device emulation (requires BiDi session):

// Device emulation (requires BiDi session)
start_session({capabilities: {webSocketUrl: true}})
emulate_device()                         // list available presets
emulate_device({device: 'iPhone 15'})    // activate emulation
emulate_device({device: 'Pixel 7'})      // switch device
emulate_device({device: 'reset'})        // restore desktop defaults

Web extensions (requires BiDi session):

start_session({platform: 'browser', browser: 'chrome', capabilities: {webSocketUrl: true}})

open_web_extension({
    extensionData: {type: 'path', path: '/path/to/unpacked-extension'},
    path: 'options.html'
})

// Drive the extension UI with the normal page tools.
get_elements()
click_element({selector: '#save'})

// For remote/cloud sessions, send a packaged extension archive as base64.
open_web_extension({
    extensionData: {type: 'base64', value: '<base64-encoded-zip>'},
    path: 'options.html'
})

Mobile App Automation

Testing an iOS app on simulator:

Test my iOS app located at /path/to/MyApp.app on iPhone 15 Pro simulator:
1. Start the app session
2. Tap the login button
3. Enter "testuser" in the username field
4. Take a screenshot of the home screen
5. Close the session

Preserving app state between sessions:

Test my Android app without resetting data:
1. Start app session with noReset: true and fullReset: false
2. App launches with existing login state and user data preserved
3. Run test scenarios
4. Close session (app remains installed with data intact)

Testing an iOS app on real device:

Test my iOS app on my physical iPhone:
1. Start app session with:
   - platform: iOS
   - appPath: /path/to/MyApp.ipa
   - deviceName: My iPhone
   - udid: 00008030-001234567890ABCD (your device's UDID)
   - platformVersion: 17.0
2. Run your test scenario
3. Close the session

Testing an Android app:

Test my Android app /path/to/app.apk on the Pixel_6_API_34 emulator:
1. Start the app with auto-grant permissions
2. Get visible elements (use inViewportOnly: false to see all elements)
3. Swipe up to scroll
4. Tap on the "Settings" button using text matching
5. Verify the settings screen is displayed

Advanced element detection:

Test my app and debug layout issues:
1. Start the app session
2. Get visible elements with includeContainers: true to see the layout hierarchy
3. Analyze ViewGroup, FrameLayout, and ScrollView containers
4. Use inViewportOnly: false to find off-screen elements that need scrolling

Hybrid app testing (switching contexts):

Test my hybrid app:
1. Start the Android app session
2. Tap "Open Web" button in native context
3. List available contexts
4. Switch to WEBVIEW context
5. Click the login button using CSS selector
6. Switch back to NATIVE_APP context
7. Verify we're back on the home screen

Important Notes

⚠️ Session Management:

  • Only one session (browser OR app) can be active at a time

  • Always close sessions when done to free system resources

  • To switch between browser and mobile, close the current session first

  • Use close_session({ detach: true }) to disconnect without terminating the session on the Appium server

  • State preservation can be controlled with noReset and fullReset parameters during session creation

  • Sessions created with noReset: true or without appPath will automatically detach on close

  • Sessions adopted with attach_session always detach on close unless detach: false is explicitly requested

⚠️ Task Planning:

  • Break complex automation into smaller, focused operations

  • Claude may consume message limits quickly with extensive automation

⚠️ Mobile Automation:

  • Appium server must be running before starting mobile sessions

  • Ensure emulators/simulators are running and devices are connected

  • iOS automation requires macOS with Xcode installed

  • iOS Real Devices: Testing on physical iOS devices requires the device's UDID (40-character unique identifier). See Prerequisites section for how to find your UDID

Selector Syntax Quick Reference

Web (CSS/XPath):

  • CSS: button.my-class, #element-id

  • XPath: //button[@class='my-class']

  • Text: button=Exact text, a*=Contains text

Mobile (Cross-Platform):

  • Accessibility ID: ~loginButton (works on both iOS and Android)

  • Android UiAutomator: android=new UiSelector().text("Login")

  • iOS Predicate: -ios predicate string:label == "Login" AND visible == 1

  • XPath: //android.widget.Button[@text="Login"]

Advanced Features

App State Preservation

State Preservation with noReset/fullReset: Control app state when creating new sessions using the noReset and fullReset parameters:

noReset

fullReset

Behavior

true

false

Preserve state: App stays installed, data preserved

false

false

Clear app data but keep app installed (default)

false

true

Full reset: Uninstall and reinstall app (clean slate)

Example with state preservation:

// Preserve login state between test runs
start_session({
    platform: 'android',
    appPath: '/path/to/app.apk',
    deviceName: 'emulator-5554',
    noReset: true,         // Don't reset app state
    fullReset: false,      // Don't uninstall
    autoGrantPermissions: true,
    capabilities: {
        'appium:chromedriverExecutable': '/path/to/chromedriver',
        'appium:autoWebview': true
    }
})
// App launches with existing user data, login tokens, preferences intact

Detach from Sessions: The close_session tool supports a detach parameter that disconnects from the session without terminating it on the Appium server:

// Detach without killing the session
close_session({detach: true})

// Explicit session termination (closes the app and removes session)
close_session({detach: false})

Sessions created with noReset: true or without appPath will automatically detach on close. Sessions adopted with attach_session are externally managed and also detach by default; pass detach: false only when the MCP should deliberately terminate the existing remote session.

This is particularly useful when:

  • Preserving app state for manual testing continuation

  • Debugging multi-step workflows (leave session running between tool invocations)

  • Testing scenarios where you want the app to remain installed and in current state

Smart Element Detection

  • Platform-specific element classification: Automatically identifies interactable elements vs layout containers

    • Android: Button, EditText, CheckBox vs ViewGroup, FrameLayout, ScrollView

    • iOS: Button, TextField, Switch vs View, StackView, CollectionView

  • Multiple locator strategies: Each element provides accessibility ID, resource ID, text, XPath, and platform-specific selectors

  • Viewport filtering: Control whether to get only visible elements or all elements including off-screen

  • Layout debugging: Optionally include container elements to understand UI hierarchy

Automatic Permission & Alert Handling

Both iOS and Android sessions now support automatic handling of system permissions and alerts:

  • autoGrantPermissions (default: true): Automatically grants app permissions (camera, location, etc.)

  • autoAcceptAlerts (default: true): Automatically accepts system alerts and dialogs

  • autoDismissAlerts (optional): Set to true to dismiss alerts instead of accepting them

This eliminates the need to manually handle permission popups during automated testing.

Technical Details

  • Built with: TypeScript, WebDriverIO, Appium

  • Browser Support: Chrome, Firefox, Edge (headed/headless, automated driver management), Safari (headed only; macOS)

  • Mobile Support: iOS (XCUITest) and Android (UiAutomator2/Espresso)

  • Protocol: Model Context Protocol (MCP) for Claude Desktop integration

  • Session Model: Single active session (browser or mobile app)

  • Data Format: TOON (Token-Oriented Object Notation) for efficient LLM communication

  • Element Detection: XML-based page source parsing with intelligent filtering and multi-strategy locator generation

Session Recording & Code Export

Every tool call is automatically recorded to a session history. You can inspect sessions and export runnable code via MCP resources — no extra tool calls needed:

  • wdio://sessions — lists all recorded sessions with type, timestamps, and step count

  • wdio://session/current/steps — step log for the active session

  • wdio://session/current/code — generated runnable WebdriverIO JS for the active session

  • wdio://session/{sessionId}/steps — step log for any past session by ID

  • wdio://session/{sessionId}/code — generated JS for any past session by ID

The generated script reconstructs the full session — including capabilities, navigation, clicks, and inputs — as a standalone import { remote } from 'webdriverio' file. For cloud provider sessions it includes the full try/catch/finally with automatic session result marking via the provider's REST API.

Trace Recording

Passing trace: true to start_session produces a Playwright-compatible .trace zip in the .trace/ directory when the session closes. The zip is playable at player.vibium.dev and shows a filmstrip of screenshots alongside the action timeline.

How screenshots are timed

Appium's takeScreenshot round-trip takes 700–1300 ms on a local emulator, which is long enough for the previous action's animations to settle. We exploit this: each screenshot is captured before the next action fires, so what the Appium server returns is already the settled result of the prior action.

The tricky part is making the trace player show that screenshot under the right action. The player associates a screencast-frame event with whichever action's time window contains the frame's timestamp field. If the timestamp is set to "now" (capture time), it falls before the current action's startTime and the player labels it as the before state of the next action — one action out of sync.

The fix: stamp each screencast-frame with lastAfterEndTime — the endTime of the action that just completed. That places the frame inside the previous action's window, so the player shows it as the result of that action, not the precursor to the next one.

Timeline (monotonic ms):

  prev.endTime ← frame timestamp stamped here
        │
        │   [screenshot captured here — shows settled state after prev action]
        │
  curr.startTime
        │
        │   [action executes]
        │
  curr.endTime ← next frame will be stamped here

The final screenshot at session close is stamped with the last action's endTime, so it renders under that action rather than appearing as an orphaned frame after the timeline ends.

Session Logs

The wdio://session/current/logs resource returns crash reports, console errors, and system logs for the current session, auto-detecting the session type to fetch the right log buffer:

Session Type

Log Sources

Contents

Browser

getLogs('browser')

Console output + uncaught JS exceptions

Android

getLogs('logcat')

System logs, crash dumps, fatal exceptions

iOS

getLogs('crashlog') + getLogs('syslog')

Crash/panic reports + system diagnostics

Note: Reading this resource clears the log buffer (per the WebDriver spec). Subsequent reads return only entries accumulated since the last read. Browser logs require Chromium (Chrome/Edge) — Firefox and Safari do not support the getLogs command.

The response is JSON with sessionType, logTypes (available log types), and entries — each entry includes level, message, timestamp (Unix ms), and timestampISO.

Troubleshooting

Browser automation not working?

  • Ensure Chrome, Firefox, Edge, or Safari is installed (Safari requires macOS)

  • Try restarting Claude Desktop completely

  • Check that no other WebDriver instances are running

Mobile automation not working?

  • Verify Appium server is running: appium

  • Check device/emulator is running: adb devices (Android) or Xcode Devices (iOS)

  • Ensure correct platform drivers are installed

  • Verify app path is correct and accessible

Found issues or have suggestions? Please share your feedback!

Available Tools

36 tools
attach_sessionA

Attaches to an existing remote WebDriver or Appium session by ID without creating a new session. Only one session can be active at a time. The externally managed session is detached, not terminated, by default on close.

ParametersJSON Schema
NameRequiredDescriptionDefault
traceNoEnable trace recording for subsequent commands — produces a Playwright-compatible zip saved to .trace/ on close_session.
regionNoSauce Labs region (default: eu-central-1). Only used with provider: "saucelabs".eu-central-1
browserNoBrowser for local command registration (browser platform only, default: chrome)
platformYesExisting session platform type (browser, ios, or android; Electron attachment is unsupported).
providerNoProvider hosting the existing session (default: local). Use "external" for a custom W3C WebDriver endpoint.local
sessionIdYesExisting remote WebDriver/Appium session ID
appiumConfigNoAppium server connection (local provider only)
capabilitiesNoCapabilities used to register the correct browser or Appium command surface locally; they are not sent to the remote endpoint
automationNameNoAppium automation driver for local command registration (mobile platforms only)
webdriverConfigNoExisting W3C WebDriver endpoint connection (provider: "external" only). Defaults to 127.0.0.1:4445/.

TDQS

A4.3/5.0
Behavior3/5

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

The description discloses that the session is detached (not terminated) on close, which is helpful. However, it does not explain the impact on the currently active session when attaching (e.g., whether the previous session is automatically detached). With only destructiveHint=false in annotations, the description carries the transparency burden and falls short of full clarity.

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 sentences, direct, and free of fluff. It communicates the key action and a critical behavioral note without redundancy.

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, combined with the schema, covers the essential aspects of the tool: purpose, key behavior (single active session, non-terminating close), and parameter nuances. However, it does not mention when to choose this over alternatives (like start_session) or how the prior active session is handled, leaving a slight gap in overall context.

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?

The description adds meaningful context beyond the schema: it clarifies that 'capabilities' are used only for local command registration and not sent to the remote endpoint, explains the default for webdriverConfig, and notes that Electron attachment is unsupported. All parameters are described in the schema, and the description enhances understanding of ambiguous fields.

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 tool attaches to an existing remote WebDriver/Appium session by ID, and explicitly notes it does not create a new session. This distinguishes it from start_session and other session-related 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 implies when to use it (when you have an existing session ID) and mentions the 'only one session active at a time' constraint, but does not explicitly contrast with start_session or close_session. The context is clear enough, but a direct 'use when' statement would improve guidance.

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

click_elementA

Waits for an element, scrolls it into view, and fires element.click(). May trigger navigation, form submission, or modals. Browser sessions only — on iOS element.click() is silently ignored; use tap_element instead. Default timeout: 3000ms.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeoutNoMaximum time to wait for element in milliseconds
selectorYesValue for the selector, in the form of css selector or xpath ("button.my-class" or "//button[@class='my-class']" or "button=Exact text with spaces" or "a*=Link containing text")
scrollToViewNoWhether to scroll the element into view before clicking

TDQS

A4.9/5.0
Behavior5/5

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

The description discloses that clicking may trigger navigation, form submission, or modals — side effects not implied by the destructiveHint=false annotation. It also reveals the default timeout (3000ms) and the wait/scroll behavior, adding valuable context beyond structured 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?

Three sentences, each earning its place: the core action, the side effects, and the platform-specific caveat with alternative. Front-loaded with the action, no redundancy or fluff.

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 tool with 3 parameters, no output schema, and a sibling that must be disambiguated, this description covers the core behavior, potential side effects, platform constraints, timeout default, and alternative routing. Nothing essential is missing for an agent to invoke it correctly.

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 parameters are already documented. The description adds the default timeout value, which is not in the schema, and clarifies that scrolling is part of the click behavior (relating to scrollToView). It does not explain each parameter in depth, but the baseline of 3 is raised because the default timeout is extra useful info.

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 action (waits, scrolls, clicks) on a web element, and explicitly contrasts with tap_element for iOS, distinguishing it from a sibling. It also implies browser-only usage, so an agent can tell it apart from native interactions.

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?

It gives an explicit platform constraint ('Browser sessions only') and names the exact alternative (tap_element) with the condition ('on iOS element.click() is silently ignored'). This is unambiguous guidance for when to use this tool vs its sibling.

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

close_sessionA
Destructive

Closes the current session or detaches without terminating. Detach preserves app state on the Appium server — sessions with noReset: true auto-detach by default. Closing a browser attach session terminates chromedriver but the Chrome process spawned by launch_chrome remains running.

ParametersJSON Schema
NameRequiredDescriptionDefault
detachNoIf true, disconnect without terminating; if false, terminate. When omitted, externally managed and auto-detach sessions are preserved while other sessions are terminated.

TDQS

A3.5/5.0
Behavior4/5

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

The description adds significant context beyond the destructiveHint annotation: it clarifies detaching preserves state, auto-detach behavior, and side effects on chromedriver and Chrome processes. This helps the agent understand the tool's impact.

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 three sentences, concise and front-loaded with the main action. No redundant information, though some details could be more compact.

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 covers key scenarios (detach, auto-detach, browser attach sessions) and explains side effects. With a simple single parameter and no output schema, this is sufficient completeness.

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%, and the schema already provides a thorough description of the 'detach' parameter. The tool description adds no extra meaning to the parameter, so baseline 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 clearly states the tool closes or detaches the current session, using specific verbs ('closes', 'detaches') and the resource ('session'). It distinguishes from sibling tools like start_session or attach_session implicitly, but no explicit differentiation is provided.

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 explains behavioral nuances for different session types but does not explicitly advise when to use this tool versus alternatives like detach vs. close, or when to prefer a sibling tool.

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

delete_cookiesA
DestructiveIdempotent

Deletes all cookies or a single cookie by name from the current browser session. Irreversible — deleted cookies cannot be recovered.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoOptional cookie name to delete a specific cookie. If not provided, deletes all cookies

TDQS

A4.3/5.0
Behavior5/5

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

The description adds significant behavioral context beyond annotations: it states the operation is irreversible and affects the current browser session. Annotations already indicate destructiveHint=true, but the description elaborates on the permanence and scope, which is valuable for an agent.

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 sentences: the first clearly states the action and scope, the second highlights irreversibility. There is no irrelevant information, and it is front-loaded with the core functionality.

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 tool with one optional parameter and no output schema, the description covers the essential aspects: what it does, how to specify a target cookie, and the irreversible nature. No additional details are necessary 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% for the single parameter 'name', which already explains its optional use for deleting a specific cookie. The description does not add new semantic information beyond what the schema provides, so 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 clearly states the tool deletes cookies, with specific scope ('all or a single cookie by name'). The tool name 'delete_cookies' matches this, and it is easily distinguished from sibling tools like 'get_cookies' which is read-only.

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 for deleting cookies, but does not explicitly state when to use this tool versus alternatives. The parameter guidance (optional name for specific cookie, omit for all) is provided, but no exclusions or prerequisites are mentioned.

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

drag_and_dropA

Drags an element to another element or to relative x/y offsets. x and y are offsets from the source element, not absolute screen coordinates (unlike tap_element). Provide targetSelector OR both x and y. Mobile-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNoTarget X offset (if no targetSelector)
yNoTarget Y offset (if no targetSelector)
durationNoDrag duration in milliseconds
sourceSelectorYesSource element selector to drag
targetSelectorNoTarget element selector to drop onto

TDQS

A4.4/5.0
Behavior4/5

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

Describes coordinate offsets as relative to source element (not absolute), and mobile-only constraint. Annotations only provide destructiveHint=false, so description adds value by disclosing these behaviors. Does not mention duration defaults or whether operation is blocking.

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, no wasted words. Front-loaded with main action. Every sentence adds essential information.

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?

Covers core behavior, two modes, coordinate clarification, and mobile restriction. Lacks detail on duration default, visibility requirements, and error behavior. No output schema so return value is implied as void.

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 baseline is 3. Description adds meaning by clarifying that x/y are offsets from source (not absolute), enforcing exclusivity of targetSelector vs x/y, and stating mobile-only constraint.

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?

Clearly states the tool drags an element to another element or to relative x/y offsets. Distinguishes from sibling tool tap_element by clarifying coordinate system. Mentions mobile-only scope.

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?

Explicitly states two usage modes (targetSelector or x/y) and contrasts coordinate system with tap_element. Implicitly indicates mobile-only use. Does not cover when to prefer over other sibling tools like scroll or set_value.

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

emulate_deviceA
Idempotent

Emulates a mobile or tablet device in the current browser session by setting viewport, DPR, user-agent, and touch events. Requires a BiDi-enabled session (start_session with capabilities: { webSocketUrl: true }). Omit device to list available presets. Pass "reset" to restore desktop defaults. Changes persist for all subsequent tool calls until reset or session close. Browser-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceNoDevice preset name (e.g. "iPhone 15", "Pixel 7"). Omit to list available presets. Pass "reset" to restore desktop defaults.

TDQS

A4.4/5.0
Behavior5/5

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

Goes beyond annotations (idempotentHint, destructiveHint) by detailing which settings are modified (viewport, DPR, user-agent, touch events), persist behavior, and the ability to list presets or reset. No contradictions 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?

Four sentences covering purpose, prerequisite, special values, and persistence. No redundancy, front-loaded, and every sentence adds value.

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?

Covers main action, prerequisites, and behaviors well. Lacks details on error handling or return format (e.g., when listing presets), but sufficient for effective use given the simple parameter.

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% and the schema description already fully explains the parameter (omit to list, pass 'reset', preset names). The tool description repeats this but adds no 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?

Description explicitly states it emulates mobile/tablet devices by setting viewport, DPR, user-agent, and touch events. Clearly distinguishes from sibling tools (no other emulation tool present) and adds context like 'Browser-only' and required BiDi session.

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: requires BiDi-enabled session, omit device to list presets, pass 'reset' to restore defaults, changes persist until reset or session close. Does not explicitly mention alternatives, but no direct alternatives exist among siblings.

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

execute_electron_scriptA
Destructive

Executes arbitrary JavaScript in the Electron main process. This is privileged code execution with access to Electron APIs; use only with trusted scripts.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNoValues made available to the script as args[0], args[1], and so on.
scriptYesJavaScript body executed in the Electron main process. Use `electron` for Electron APIs, `args` for supplied values, and `return` for a result.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true, but the description adds valuable context by calling out that this is privileged code execution with access to Electron APIs and emphasizing trust requirements. This goes beyond the annotation by explaining the nature and risk of the operation, though it does not enumerate potential side effects or error behaviors.

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 sentences with no filler. The core function is stated first, and the essential security warning follows immediately. Every word earns its place, and the structure is front-loaded for quick comprehension.

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 covers the core function and security risk, and the schema covers parameters, but there is no output schema and the description does not explain the return value format or behavior on errors. For a privileged execution tool, an agent might need more clarity on what the `return` produces or how failures surface, so the description is slightly incomplete.

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 descriptions already cover both parameters thoroughly: script explains the body and usage of `electron`, `args`, and `return`, and args explains array indexing. The tool description adds no additional parameter semantics beyond what the schema provides, so it meets the baseline for full schema coverage.

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 explicitly states the action ('Executes arbitrary JavaScript') and the target resource ('in the Electron main process'), making its purpose immediately clear. It also distinguishes itself from the sibling tool `execute_script` by specifying the Electron main process context, so an agent can tell them apart without inspecting schemas.

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 establishes the intended context (Electron main process) and adds a critical caution ('use only with trusted scripts'), which guides usage. However, it does not explicitly name alternatives like `execute_script` for page context or state when not to use this tool, so it stops short of full routing guidance.

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

execute_scriptA

Executes arbitrary JavaScript in browser page context or Appium mobile: commands. Can read/modify DOM, trigger events, terminate apps, or run Android shell commands — use only when no dedicated tool covers the action. Browser: pass JS in script, use 'return' for values, string args matching selectors auto-resolve to elements. Mobile: use 'mobile: ' syntax in script with args array (e.g. "mobile: pressKey", "mobile: activateApp"). Prefer click_element/set_value/get_elements for standard interactions.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNoArguments to pass to the script. For browser: element selectors or values. For mobile commands: command-specific parameters as objects.
scriptYesJavaScript code (browser) or mobile command string like "mobile: pressKey" (Appium)

TDQS

A4.5/5.0
Behavior4/5

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

With destructiveHint=false, the description expands on behavior: can read/modify DOM, trigger events, terminate apps, run shell commands. It also explains mobile syntax specifics. While not exhaustive (e.g., potential side-effects), it covers key behaviors 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.

Conciseness4/5

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

The description is front-loaded with purpose and well-structured, but somewhat lengthy. However, every sentence adds value, covering browser/mobile distinctions and alternatives. Could be slightly more concise, but effective.

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?

Despite lack of output schema, the description covers return value usage ('return' for browser values) and mobile command syntax. It addresses the tool's complexity adequately, though mobile return values are not specified.

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% but description adds context: script parameter explained for both browser and mobile, args parameter detailed for element selectors or command-specific objects. This adds meaning beyond the schema's basic descriptions.

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 tool executes arbitrary JavaScript in browser or Appium mobile commands, specifying distinct use cases. It distinguishes from dedicated tools by advising to use only when no dedicated tool covers the action, making the purpose precise and well-differentiated from siblings.

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?

Explicitly states when to use (only when no dedicated tool covers the action) and provides detailed examples for browser vs mobile. It also advises preferring click_element/set_value/get_elements for standard interactions, offering clear alternatives.

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

get_accessibility_treeA
Read-onlyIdempotent

Returns the page accessibility tree with roles, names, and selectors. Browser-only. Supports filtering by ARIA roles and pagination via limit/offset.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of nodes to return (0 = no limit)
rolesNoFilter by ARIA roles, e.g. ["button", "link", "heading"]
offsetNoNumber of nodes to skip for pagination

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already provide readOnlyHint and idempotentHint. The description adds value by detailing the content (roles, names, selectors), filtering by ARIA roles, and pagination (limit/offset). There is no contradiction.

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, front-loaded with the primary purpose, no redundant words. Every sentence adds value.

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 no output schema, the description describes return contents (roles, names, selectors) and covers filtering/pagination. For a simple read-only tool, this is quite 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 baseline is 3. The description mentions filtering by ARIA roles and pagination, which aligns with the schema but adds minimal extra meaning. It does not elaborate beyond what parameters imply.

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 'Returns the page accessibility tree with roles, names, and selectors.' This specifies a specific verb (returns) and resource (accessibility tree), and distinguishes itself from sibling tools like get_elements by mentioning 'Browser-only' and focusing on accessibility roles.

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 includes 'Browser-only,' which provides clear context for when to use (in a browser session). However, it does not explicitly state when not to use or suggest alternatives among siblings. The context is helpful but not comprehensive.

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

get_app_stateA
Read-onlyIdempotent

Returns the current state of a mobile app: not installed, not running, background, or foreground. Mobile-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
bundleIdYesApp bundle ID (iOS) or package name (Android), e.g. "com.example.app"

TDQS

A4.3/5.0
Behavior4/5

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

The annotations already declare readOnly and idempotent hints, and the description's 'Returns' aligns with a read-only operation. The description adds value by enumerating the possible states, but it does not mention error behavior or side effects, which are already covered by 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, concise sentence. It conveys all necessary information without redundancy or unnecessary detail. Excellent structure.

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 state-checking tool, the description covers the action, the subject (mobile app), the possible results, and a platform constraint. No output schema exists, but the description's enumeration of states effectively communicates the return value. Complete for its 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?

The input schema provides a full description for the single parameter 'bundleId' (including an example). Since schema coverage is 100%, the tool description does not need to add extra parameter context. 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 clearly states the tool's purpose: to return the current state of a mobile app, listing the possible states. It also specifies 'Mobile-only', which helps distinguish it from web-oriented tools. No ambiguity.

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 'Mobile-only' note provides a usage constraint. However, it does not explicitly say when to use this tool over alternatives (e.g., when you need to check app installation status). Still, the condition is clear enough for a simple tool.

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

get_contextsA
Read-onlyIdempotent

Returns available automation contexts and the currently active one. Use before switch_context to discover NATIVE_APP and WEBVIEW_* targets. Mobile-only.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and idempotentHint. Description adds specific behavioral context: mobile-only, returns NATIVE_APP and WEBVIEW_* targets, which adds value 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?

Two sentences, no filler. Front-loaded with purpose, then usage advice. 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?

For a zero-parameter tool with annotations, the description is complete. It explains what is returned, when to use it, and the mobile-only context. No gaps.

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?

No parameters defined, so baseline 4 per guidelines. Description does not need to add parameter info as schema is empty and coverage is 100%.

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?

Clearly states it returns available automation contexts and the active one. Specifies the resource (automation contexts) and action (returns). Differentiates from sibling 'switch_context' by being a discovery tool.

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?

Explicitly advises use before switch_context and notes mobile-only context. Provides clear when-to-use guidance and domain restriction.

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

get_cookiesA
Read-onlyIdempotent

Returns all cookies for the current session, or a single cookie by name. Use to verify auth state, session tokens, or feature flags after login flows.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoCookie name to retrieve a specific cookie. If omitted, returns all cookies.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already state read-only and idempotent. Description adds that it returns cookies and can filter by name, plus usage context like auth verification, which goes 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?

Two sentences, no fluff. Every sentence adds value: first states function, second gives usage guidance.

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 read-only tool with one optional parameter and no output schema, the description fully covers purpose, usage context, and behavior. No gaps.

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%, and the description reiterates the parameter behavior (all vs. single cookie). No additional semantic details beyond what the schema provides.

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?

Clearly states the tool returns cookies (all or by name) and provides specific use cases like verifying auth state, session tokens, or feature flags. Differentiates from write siblings like delete_cookies.

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?

Explicitly advises using the tool after login flows for verification, giving context on when to use. Does not explicitly mention alternatives or when not to use, but the description is clear enough.

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

get_elementsA
Read-onlyIdempotent

Returns interactable elements on the current page with selectors, text, and bounding boxes. Supports filtering by element type, viewport visibility, and pagination. Use when the wdio://session/current/elements resource does not return desired elements.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of elements to return (0 = no limit)
offsetNoNumber of elements to skip (for pagination)
includeBoundsNoInclude element bounding box coordinates (default: false)
inViewportOnlyNoOnly return elements visible in the current viewport (default: false).
includeContainersNoInclude container elements like divs and sections (default: false)

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and idempotentHint, so the description's main behavioral additions are the return data (selectors, text, bounding boxes) and filtering capabilities. It does not contradict annotations and adds useful context beyond the structured fields.

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 sentences long, front-loading the purpose and return value, followed by a usage hint. Every sentence adds value with no redundancy or fluff.

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 no output schema, the description adequately indicates the return shape (selectors, text, bounding boxes) and covers the key filtering options. It is complete enough for a read-only tool with optional parameters, though additional details on return format or pagination behavior could be added.

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 input schema has 100% description coverage, so the baseline is 3. The description groups parameters into high-level concepts (element type, viewport visibility, pagination) but does not add significant new meaning beyond the schema. Minor mismatch: 'element type' is not fully aligned with the 'includeContainers' parameter.

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 it returns interactable elements with selectors, text, and bounding boxes, and supports filtering. It distinguishes itself by mentioning when to use it over the native wdio resource, making the purpose specific and differentiated from siblings.

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 a direct usage condition ('Use when the wdio://session/current/elements resource does not return desired elements'), which helps the agent decide when to invoke this tool. However, it does not list explicit exclusions or compare to other sibling tools like get_tabs or get_accessibility_tree.

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

get_mock_callsA
Read-only

Read current call arguments for a mock in the active session. Use the same target as mock. mockType defaults to browser in WebDriver sessions and is required in Electron sessions. Electron mocks require apiName and funcName. Browser mocking is not implemented yet; Appium sessions are unsupported.

ParametersJSON Schema
NameRequiredDescriptionDefault
apiNameNoRequired for mockType electron: API module, such as dialog, app, or clipboard.
funcNameNoRequired for mockType electron: API function, such as showOpenDialog or getName.
mockTypeNoMock type: electron or browser. Defaults to browser in WebDriver sessions; required in Electron sessions. Browser mocking is not implemented yet. Appium sessions are unsupported.

TDQS

A4.1/5.0
Behavior4/5

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

The readOnlyHint annotation already signals a safe read operation, and the description adds valuable behavioral constraints: active session scope, mockType default behavior, Electron-specific parameter requirements, and unsupported browser/Appium cases. It does not contradict the annotation and gives enough detail to set expectations.

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 purpose is front-loaded in the first sentence, followed by concise usage and limitation notes. Some details repeat the schema descriptions, but the description remains compact and scannable.

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 that this is a read-only inspection tool with well-documented parameters, the description covers target selection, defaults, required conditions, and unsupported sessions. It does not specify the exact return shape, but the return behavior is implied clearly by the stated purpose.

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 schema already documents that apiName and funcName are required for electron and that mockType has defaults and limitations. The description reinforces these points but does not add significant 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 states a specific action, 'Read current call arguments for a mock', tied to a clear resource and scope ('in the active session'). This clearly differentiates it from sibling tools like mock and manage_mock, which create or modify mocks rather than inspect them.

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 practical guidance: use the same target as mock, understand that mockType defaults to browser in WebDriver and is required in Electron, and that Electron mocks need apiName and funcName. It also states unsupported contexts. It does not explicitly name alternatives, but the context is sufficient for correct use.

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

get_screenshotA
Read-onlyIdempotent

Takes a screenshot of the current page or screen and returns a base64-encoded image, resized and compressed for model context limits.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

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

The description discloses that it returns a base64 image and that the image is resized and compressed for model context limits, which adds useful behavioral context. The readOnlyHint and idempotentHint annotations already cover safety, and the description does not contradict them.

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 concise sentence that directly conveys purpose and output format without unnecessary detail. It is well-structured and easy to 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?

The description provides enough context for the agent to understand what the tool does and what output to expect. It mentions the return format and processing, which is sufficient for a tool with no parameters and no output schema. Minor details like image format are not essential.

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 tool has no parameters, so there is no parameter semantics burden on the description. The absence of parameters is already clear from the empty schema, and the description appropriately focuses on behavior rather than inputs.

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?

Description clearly states the tool captures a screenshot of the current page or screen and returns a base64-encoded image. The verb 'Takes' and the resource 'current page or screen' make the purpose unambiguous and distinguish it from sibling tools like get_accessibility_tree or get_elements.

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 the tool is for capturing visual state, but it does not explicitly state when to use it versus alternatives or when not to use it. There is no direct guidance on choosing this tool over get_accessibility_tree or get_elements for inspection tasks.

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

get_tabsA
Read-onlyIdempotent

Lists all browser tabs with handle, title, URL, and which is active. Use before switch_tab to find the target handle or index. Browser-only.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and idempotentHint, so the description adds value by specifying the output fields (handle, title, URL, active). This clarifies the behavioral output 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?

Two sentences with no wasted words. The first sentence provides the core functionality, and the second offers usage guidance. Well-structured and front-loaded.

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 zero parameters and no output schema, the description is fully complete: lists what the tool returns and when to use it. No gaps or missing information.

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?

No parameters exist; schema coverage is 100%. Baseline score of 4 is appropriate as the description does not need to add parameter details.

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 tool lists browser tabs with specific fields (handle, title, URL, active). It uses the verb 'Lists' and specifies the resource, distinguishing it from siblings like switch_tab.

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?

Explicitly says 'Use before switch_tab to find the target handle or index', providing a clear when-to-use directive and referencing a sibling tool for context.

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

hide_keyboardA
Idempotent

Dismisses the on-screen keyboard on mobile. Call after text entry when the keyboard obscures elements. No-op if already hidden. Mobile-only.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

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

The annotations already include idempotentHint=true and destructiveHint=false, which convey key behavioral traits. The description adds that it is a no-op if already hidden and is mobile-only, which are additional behaviors not fully captured by the annotations. This is a good complement to the hints, so a 4 is appropriate.

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 concise, with three short sentences that pack in the key information: what it does, when to use it, and edge cases. No fluff or redundancy. It is front-loaded with the primary action and then provides context. This is an exemplary concise description.

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 tool is simple (no parameters, no output schema), and the description covers the essential context: the action, timing, and caveats (no-op, mobile-only). It doesn't mention the return value or error cases, but for a simple UI action, that may not be necessary. 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.

Parameters4/5

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

The tool has no parameters, so the schema coverage is 100% trivially. The description doesn't need to explain parameters, but it could have mentioned that there are no arguments. The description's context about use cases indirectly implies no parameters are needed. Given that there are no params to misinterpret, this is adequate.

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 tool dismisses the on-screen keyboard on mobile, identifying the resource (keyboard) and action (dismiss). It also adds context about when to use it (after text entry when keyboard obscures elements), which differentiates it from other UI interaction tools. However, it doesn't explicitly name sibling tools that might be confused with it, but the action is specific enough.

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 guidance on when to use the tool: after text entry when the keyboard obscures elements. It also notes that it is a no-op if already hidden and is mobile-only, which helps the agent decide when to call it. It doesn't explicitly say when not to use it (e.g., on desktop), but the mobile-only qualifier covers that.

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

launch_chromeA

Launches Chrome with remote debugging enabled. Wipes and recreates a temporary profile directory on each call. Mode "newInstance" (default) runs alongside existing Chrome; "freshSession" starts with an empty profile. Set copyProfileFiles to copy cookies/logins from your Default profile — changes do not sync back. After launch, call start_session with attach: true to connect. Spawns a detached Chrome process that persists if the server exits.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNonewInstance: open alongside existing Chrome | freshSession: clean profilenewInstance
portNoRemote debugging port (default: 9222)
copyProfileFilesNoCopy your Default Chrome profile (cookies, logins) into the debug session.

TDQS

A4.6/5.0
Behavior5/5

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

The description reveals key behaviors beyond annotations: wipes and recreates temporary profile directory each call, spawns a detached Chrome process persisting after server exit, and copyProfileFiles limitations. Annotations only provide destructiveHint=false, so the description adds substantial value.

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 concise (4 sentences), front-loaded with the main purpose, and each sentence adds necessary information without redundancy. No fluff or extraneous details.

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 no output schema, the description adequately covers the launch process, including lifecycle (call start_session next). It could mention what the return value is (e.g., success message or port), but for a launch tool, the current information is sufficient.

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%, but the description enriches understanding by explaining mode semantics in plain language and clarifying copyProfileFiles behavior (no sync back). It adds context beyond schema, though schema already describes parameters adequately.

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 it launches Chrome with remote debugging enabled, specifying the verb 'launches' and the resource 'Chrome'. It distinguishes between two modes and references sibling tools like start_session, making purpose 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 explains when to use each mode (newInstance vs freshSession) and the behavior of copyProfileFiles, including a critical caveat that changes do not sync back. It also advises calling start_session after launch. However, it does not explicitly list when not to use the tool or contrast with alternatives like attach_session.

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

list_appsA
Read-onlyIdempotent

List apps uploaded to a cloud provider (BrowserStack App Automate, Sauce Labs App Storage, TestMu Real Device Cloud, TestingBot Storage, or Digital.ai Applications). Reads provider-specific credentials from environment.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of apps to return (only applies when organizationWide is true, default 20)
regionNoSauce Labs region (default: eu-central-1)eu-central-1
sortByNoSort order for resultsuploaded_at
providerYesCloud provider
organizationWideNo(BrowserStack only) List apps uploaded by all users in the organization. Defaults to false (own uploads only).

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnly and idempotent behavior. The description adds useful information that provider-specific credentials are read from the environment, providing context beyond the annotations without contradicting them.

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 concise sentence that conveys the tool's purpose and provider scope without unnecessary detail. It is well-structured and easy to 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 read-only listing tool with no output schema, the description provides enough operational context: what it lists, which providers it supports, and where credentials come from. It could mention expected result shape, but that is not required given no 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% and each parameter already has a description, so the baseline applies. The description adds provider full names and credential sourcing context, but does not meaningfully clarify individual parameters 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?

Description clearly states the action ('List apps uploaded to a cloud provider') and explicitly enumerates the supported providers, distinguishing this from the sibling upload_app tool.

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 use case is implied by 'List apps' but there is no explicit guidance on when to use this instead of alternatives such as upload_app, or any exclusions or prerequisites beyond reading credentials from the environment.

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

manage_mockA
Destructive

Manage a mock in the active session. mockType defaults to browser in WebDriver sessions and is required in Electron sessions. Electron mocks require apiName and funcName. Browser mocking is not implemented yet; Appium sessions are unsupported. For Electron: clear removes call history, reset also removes configured behavior and queued values, restore reinstates the original function and releases the mock.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes
apiNameNoRequired for mockType electron: API module, such as dialog, app, or clipboard.
funcNameNoRequired for mockType electron: API function, such as showOpenDialog or getName.
mockTypeNoMock type: electron or browser. Defaults to browser in WebDriver sessions; required in Electron sessions. Browser mocking is not implemented yet. Appium sessions are unsupported.

TDQS

A4.3/5.0
Behavior5/5

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

The description goes well beyond the destructiveHint annotation by specifying exactly what each action does: clear removes call history, reset also removes configured behavior and queued values, and restore reinstates the original function and releases the mock. This is clear, detailed, and consistent with the annotation.

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 purpose before moving to constraints and per-action behavior. Three dense sentences convey the necessary information without fluff, and the structured enumeration for Electron actions is efficient.

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 covers the essential invocation details: required action values, mockType defaults and requirements, Electron parameter dependencies, and unsupported environments. It does not mention output or what happens if no mock exists, but for a state-changing management tool the provided context is largely sufficient.

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 already documents apiName, funcName, and mockType, and the description reinforces the Electron dependency while adding meaning to the action enum by explaining what clear, reset, and restore do. This compensates for the missing per-enum descriptions in the schema, though some duplication with the schema remains.

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 that the tool manages a mock in the active session and details the three actions clear, reset, and restore with their effects. It identifies the resource and scope, though 'manage a mock' is somewhat generic and it does not explicitly contrast the tool with sibling tools like mock or get_mock_calls.

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 concrete usage context: mockType defaults to browser in WebDriver, is required in Electron, Electron mocks need apiName and funcName, browser mocking is not implemented, and Appium sessions are unsupported. It gives clear exclusions and prerequisites, but does not explicitly tell an agent when to choose this tool over sibling tools.

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

mockA
Destructive

Configure a session-scoped mock. mockType defaults to browser in WebDriver sessions and is required in Electron sessions. Browser mocking is not implemented yet; Appium sessions are unsupported. Electron mocks require apiName and funcName. Repeated calls preserve history and queued once values. Use resolved/rejected behaviors for async APIs.

ParametersJSON Schema
NameRequiredDescriptionDefault
valueNoJSON value to return, resolve, or reject with. Omit for undefined.
apiNameNoRequired for mockType electron: API module, such as dialog, app, or clipboard.
behaviorNoDefault: mockReturnValue. Once behaviors queue a value for the next call.
funcNameNoRequired for mockType electron: API function, such as showOpenDialog or getName.
mockTypeNoMock type: electron or browser. Defaults to browser in WebDriver sessions; required in Electron sessions. Browser mocking is not implemented yet. Appium sessions are unsupported.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations only supply destructiveHint=true, so the description carries the burden of behavioral context. It adds session scoping, default mockType behavior, unsupported session types, the persistence of history across repeated calls, and queued once-value semantics. No contradiction with the annotations exists.

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?

Four sentences, front-loaded with the core purpose, and every sentence earns its place by adding a constraint, a requirement, or a usage nuance. There is no repetition of the schema or 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?

The description covers defaults, unsupported cases, required parameter combinations, and cumulative behavior, which is strong for a tool with five optional-looking parameters. The main gap is that it does not state what the call returns, and its relationship to manage_mock remains implicit.

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?

Schema coverage is 100%, but the description meaningfully enriches parameter understanding: it explains mockType defaults, conditional requirements for apiName/funcName in Electron sessions, behavior enum semantics, and async API guidance. This goes well beyond the baseline expected from complete schema 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 opens with 'Configure a session-scoped mock,' giving a specific verb, resource, and scope that goes well beyond the bare name 'mock' and title. It clearly defines what the tool does, though it does not explicitly distinguish itself from the sibling manage_mock.

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?

It gives useful contextual guidance: mockType defaults and requirements, Electron-only constraints, unsupported Appium/browser mocking, and the advice to use resolved/rejected behaviors for async APIs. However, it never names alternatives like manage_mock or get_mock_calls nor explains when to prefer one over the other.

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

open_web_extensionA

Installs a web extension through WebDriver BiDi and opens one of its extension pages so existing MCP tools can inspect and drive its UI. Requires a BiDi-enabled browser session. Use base64 for cloud/remote sessions where the browser driver cannot read the MCP server filesystem.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesPath inside the extension package, such as options.html or popup.html. Leading slashes are ignored.
extensionDataYesW3C BiDi webExtension.ExtensionData: unpacked directory path, archive path, or base64 archive.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations only set destructiveHint=false. The description explains the core behavior (installing and opening an extension page) and adds the important nuance about base64 for remote sessions. It does not mention error conditions or side effects, but given the minimal annotations, it provides sufficient transparency beyond the structured fields.

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: the first defines the core function, the second adds a critical usage condition. Every sentence earns its place with no redundancy or fluff.

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

Completeness4/5

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

For a simple tool with 2 required parameters, no output schema, and no nested objects, the description covers the primary behavior, prerequisite, and a key usage scenario. It could briefly mention that after invocation the extension page becomes available for interaction via other tools, but overall it is sufficiently complete.

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 input schema has 100% coverage, so the schema already documents both parameters. The description adds value by specifying 'Use base64 for cloud/remote sessions', which provides practical context for one of the extensionData options beyond the schema's generic description.

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 verb ('installs', 'opens') and the resource ('web extension through WebDriver BiDi') and explains the purpose ('so existing MCP tools can inspect and drive its UI'). It is distinct from sibling tools like start_session or navigate which deal with sessions or navigation.

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 explicitly states a prerequisite ('Requires a BiDi-enabled browser session') and provides a specific guidance for cloud/remote sessions ('Use base64'). While it does not list when not to use or alternatives, the context is clear and helpful.

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

rotate_deviceA
Idempotent

Rotates a mobile device to portrait or landscape orientation. Waits for the OS rotation animation to complete. Use to test orientation-dependent layouts. Mobile-only; no effect in browser sessions.

ParametersJSON Schema
NameRequiredDescriptionDefault
orientationYesDevice orientation

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already indicate idempotent and non-destructive behavior. The description adds that the tool waits for the rotation animation to complete, which is a meaningful behavioral detail. The 'no effect in browser sessions' also clarifies its scope 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 concise, using two sentences that directly convey the action, behavior, purpose, and constraints. There is no extraneous information, and the structure is easy to parse.

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 tool with no output schema, the description covers all necessary context: what it does, when to use it, its platform restriction, and its blocking behavior. It is sufficiently complete for an agent 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?

The schema provides full coverage for the single 'orientation' parameter, including an enum with values and a description. The tool description reiterates the same values without adding additional semantic detail, so it does not go 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 clearly states the tool's function: rotating a mobile device to portrait or landscape orientation. It also specifies the resource (mobile device) and the action (rotate), and notes it is for testing orientation-dependent layouts. This distinguishes it from other tools without ambiguity.

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 a specific use case ('Use to test orientation-dependent layouts') and a clear constraint ('Mobile-only; no effect in browser sessions'). While it doesn't explicitly name alternative tools, it provides enough context for an agent to decide when to invoke it.

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

scrollA

Scrolls the page vertically by a pixel amount. Browser-only — for mobile scrolling use swipe. Only supports up/down; no horizontal scrolling.

ParametersJSON Schema
NameRequiredDescriptionDefault
pixelsNoNumber of pixels to scroll
directionYesScroll direction

TDQS

A4.6/5.0
Behavior4/5

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

The description adds context beyond annotations: it specifies browser-only behavior, direction limitations, and pixel-based scrolling. While it doesn't detail scrolling smoothness or wait behavior, it provides sufficient behavioral context for a simple action.

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 wasted words. The first sentence delivers the core purpose, the second adds essential constraints. Perfectly front-loaded and efficient.

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 scroll tool with two parameters and no output schema, the description covers the key aspects: vertical scrolling, pixel amount, direction limits, and platform scope. It lacks mention of relative vs absolute scrolling but is otherwise complete.

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% with descriptions for both parameters. The description adds meaning by connecting 'pixel amount' to the pixels parameter and confirming the direction enum. This is a slight but helpful enhancement over the schema alone.

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 'Scrolls the page vertically by a pixel amount,' which is a specific verb+resource+attribute. It also distinguishes from swipe and notes no horizontal support, making the purpose crystal clear.

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 says 'Browser-only — for mobile scrolling use swipe,' giving direct when-not-to-use and an alternative. It also clarifies that only up/down scrolling is supported, guiding appropriate usage.

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

set_geolocationA
Idempotent

Overrides GPS coordinates for the session. Affects navigator.geolocation in browsers and location services on mobile. Location permissions must already be granted to the app.

ParametersJSON Schema
NameRequiredDescriptionDefault
altitudeNoAltitude in meters (optional)
latitudeYesLatitude coordinate
longitudeYesLongitude coordinate

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds valuable context: it overrides GPS for the session, affects both browser and mobile location services, and requires pre-granted permissions. This goes beyond the annotations without contradicting them.

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 concise sentences with no redundancy. The primary action and scope are front-loaded, followed by the prerequisite. 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?

For a simple mutation tool with no output schema, the description covers the action, scope, effect, and a key prerequisite. Nothing an agent needs to invoke it correctly is missing, and the sibling set contains no competing tool for this action.

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 latitude, longitude, and altitude are already documented. The description does not add syntax or format details beyond what the schema provides, but it does clarify the overall scope ('for the session'), which is not parameter-specific. Baseline 3 is appropriate given the schema's completeness.

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 verb 'overrides' and the resource 'GPS coordinates', and specifies the effect on navigator.geolocation and location services. It is unambiguous and distinct from sibling tools like set_value or set_cookie, which operate on different resources.

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 explicitly mentions a prerequisite (location permissions must be granted) and implies the use case: overriding geolocation for a session. It does not explicitly state when not to use it, but no sibling tool provides an alternative for geolocation override, so the guidance is adequate.

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

set_valueA
Idempotent

Clears an input or textarea then types the given text character by character. Always replaces existing content — clearValue() runs first. Triggers input, change, and key events which may fire validation or autocomplete. Scrolls into view by default.

ParametersJSON Schema
NameRequiredDescriptionDefault
valueYesText to enter into the element
timeoutNoMaximum time to wait for element in milliseconds
selectorYesValue for the selector, in the form of css selector or xpath ("button.my-class" or "//button[@class='my-class']")
scrollToViewNoWhether to scroll the element into view before typing

TDQS

A4/5.0
Behavior4/5

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

Adds value beyond annotations: clarifies clearing behavior, event triggering, scrolling default. Annotations already indicate idempotent/non-destructive, description enriches 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?

Three concise sentences, each providing distinct, useful information. No redundant or missing elements.

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?

Covers main behavioral aspects (clear, type, events, scroll) for a simple action. No return value needed. Minor omission: no mention of timeout behavior.

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 covers all 4 parameters with descriptions. Description adds default for scrollToView and reiterates value replacement, but does not significantly extend beyond 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?

Clearly states the action: clears and types character by character into input/textarea. Distinguishes from sibling tools which are mostly navigation/scripting related.

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?

Implies usage for simulating keystrokes with events, but does not explicitly advise when to use this tool versus alternatives like execute_script for direct value setting.

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

start_sessionA

Starts a new browser, local Electron application, or mobile automation session. Only one active session at a time — starting another session closes or detaches from the existing session first. Use attach: true to connect to a running Chrome via CDP.

ParametersJSON Schema
NameRequiredDescriptionDefault
osNoOperating system for cloud provider browser sessions (e.g. "Windows", "Mac", "macOS", "Linux"). BrowserStack: sets bstack:options.os separately. TestMu/Sauce Labs/TestingBot: combined with osVersion into W3C platformName. Digital.ai: combined with osVersion into the digitalai:osName capability (e.g. "Mac OS Sequoia", "Windows 10") — required for the grid to match a node. Browser platform only.
appNoApp URL (bs://... for BrowserStack, storage:filename= for Sauce Labs, lt://... for TestMu, tb://... for TestingBot, cloud:<package-or-bundle> for Digital.ai mobile sessions)
udidNoUnique Device Identifier for iOS real device
traceNoEnable trace recording — produces a Playwright-compatible zip saved to .trace/ on close_session, playable at player.vibium.dev.
attachNoAttach to existing Chrome instead of launching
regionNoSauce Labs region (default: eu-central-1). Only used with provider: "saucelabs".eu-central-1
tunnelNoEnable local tunnel routing (cloud providers only, default: false). true = auto-start tunnel before session and stop on close. "external" = tunnel already running externally.
appPathNoPath to app file (.app/.apk/.ipa)
browserNoBrowser to launch (required for browser platform)
noResetNoPreserve app data between sessions
headlessNoRun browser in headless mode (default: true)
platformYesSession platform type
providerNoSession provider (default: local). Use "external" to connect to an externally managed W3C WebDriver endpoint. "digitalai" requires DIGITALAI_CLOUD_URL + DIGITALAI_ACCESS_KEY env vars.local
fullResetNoUninstall app before/after session
osVersionNoOS version for cloud provider browser sessions (e.g. "11", "15", "Monterey"). BrowserStack: sets bstack:options.osVersion separately. TestMu/Sauce Labs/TestingBot: combined with os into W3C platformName. Digital.ai: combined with os into digitalai:osName. Browser platform only.
reportingNoCloud provider reporting labels (project, build, session)
deviceNameNoMobile device/emulator/simulator name (required for ios/android)
tunnelNameNoTunnel identifier name. With tunnel: "external" this must match the running tunnel. With tunnel: true a unique name is auto-generated if not provided.
deviceQueryNoDigital.ai device selection query for dynamic allocation, e.g. "@os='android' and @version='14' and @name='.*Pixel.*'". Only used with provider: "digitalai" mobile sessions; if omitted, one is built from deviceName/platformVersion.
testmuLocalNoDeprecated: use "tunnel" instead. Enable TestMu Tunnel routing.
windowWidthNoBrowser window width
appiumConfigNoAppium server connection (local provider only)
attachConfigNoChrome remote debugging connection (attach mode only, defaults: port 9222, host localhost)
capabilitiesNoAdditional capabilities to merge. For Electron, configure the official service under "wdio:electronServiceOptions" (for example appBinaryPath, appEntryPoint, appArgs, logDir, or captureRendererLogs).
windowHeightNoBrowser window height
navigationUrlNoURL to navigate to after starting
automationNameNoAutomation driver
browserVersionNoBrowser version (cloud providers only, default: latest)
saucelabsLocalNoDeprecated: use "tunnel" instead. Enable Sauce Connect tunnel routing.
appWaitActivityNoActivity to wait for on Android launch
electronRootDirNoProject root used by the Electron standalone service for Electron Builder/Electron Forge discovery. Electron-only.
platformVersionNoOS version for mobile sessions (e.g., "17.0", "14"). Mobile (ios/android) only.
webdriverConfigNoExisting W3C WebDriver endpoint connection (provider: "external" only). Defaults to 127.0.0.1:4445/.
autoAcceptAlertsNoAuto-accept alerts (default: true)
autoDismissAlertsNoAuto-dismiss alerts (default: false)
browserstackLocalNoDeprecated: use "tunnel" instead. Enable BrowserStack Local tunnel routing.
newCommandTimeoutNoAppium command timeout in seconds
autoGrantPermissionsNoAuto-grant app permissions (default: true)
electronDeeplinkSchemeNoURI scheme allowed by trigger_electron_deeplink, without ":" (for example, "myapp"). Electron-only and optional unless triggering deeplinks.

TDQS

A4/5.0
Behavior4/5

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

Annotations only carry destructiveHint=false, so the behavioral burden falls on the description. The description adds valuable side-effect information: starting a new session closes or detaches the existing session, and attach: true uses an already-running Chrome via CDP. There is no contradiction with the annotations because the description does not falsely claim a write or delete operation beyond what 'start' implies.

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 only three sentences, with the main purpose stated first. The one-session constraint and CDP attach option are focused high-value details. No sentence is wasted, and the length is appropriate for a high-level session-launch tool whose parameter details live in the schema.

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 rich 100%-covered schema, the description and annotations are mostly sufficient for correct invocation. It covers the core lifecycle caveats (single active session, close/detach on new start, CDP attach) and side effects. It lacks explicit sibling routing for launch_chrome/attach_session, but the schema owns the parameter complexity.

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 every one of 39 parameters is already documented in the input schema. The description adds no real semantic detail beyond the schema and does not compensate for any missing parameter context. This matches baseline score 3 for high schema coverage.

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 (starts) and specific resources (browser, local Electron application, mobile automation session), which makes the core purpose unambiguous. It also distinguishes attaching via CDP from fresh launches, but it does not explicitly differentiate from sibling tools like launch_chrome or attach_session, so it stops short of a 5.

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 practical guidance: only one active session is allowed, and starting another closes or detaches the existing one, which is important when an agent decides whether to start a session. It also tells the agent when to use attach: true for an existing Chrome over CDP. However, it does not describe when to prefer sibling tools like attach_session or launch_chrome, so it lacks explicit disambiguation.

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

swipeA

Performs a full-screen swipe gesture. Direction is content movement — "up" scrolls content upward (finger moves down). For browser scrolling use scroll; for dragging a specific element use drag_and_drop. No error if content cannot scroll further. Mobile-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
percentNoPercentage of screen to swipe (0-1, default: 0.5 for up/down, 0.95 for left/right)
durationNoSwipe duration in milliseconds (default: 500)
directionYesSwipe direction

TDQS

A4.7/5.0
Behavior4/5

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

Beyond the destructiveHint annotation, the description adds useful behavioral context such as full-screen scope, direction semantics, and that no error occurs if content cannot scroll further.

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?

Three concise sentences with no redundancy; key differentiators and edge-case behavior are included without excess detail.

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 description fully equips an agent to invoke the tool correctly, including the mobile-only constraint and alternatives, and no output schema exists to require return-value documentation.

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% with descriptions for all parameters, and the description adds valuable clarification that direction refers to content movement, not finger movement.

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 ('Performs a full-screen swipe gesture') and resource, and explicitly distinguishes itself from related tools like scroll and drag_and_drop.

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 when-to-use guidance: 'For browser scrolling use scroll; for dragging a specific element use drag_and_drop' and notes it is mobile-only.

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

switch_contextA
Idempotent

Switches between native and webview automation contexts in a hybrid mobile app. In NATIVE_APP context, use accessibility IDs; in WEBVIEW_* context, use CSS/XPath. Changes persist for all subsequent commands. Accepts context name or 1-based index. Use get_contexts to discover available targets. Mobile-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
contextYesContext name to switch to (e.g., "NATIVE_APP", "WEBVIEW_com.example.app", or use index from wdio://session/current/contexts resource)

TDQS

A4.7/5.0
Behavior4/5

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

Annotations indicate idempotent and non-destructive behavior. The description adds persistence detail and parameter flexibility (name or index). No contradiction.

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?

Four sentences, each adding distinct value: purpose, per-context guidance, persistence, parameter details, dependency reference, and scope. No redundancy.

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 one parameter, 100% schema coverage, and no output schema, the description is thorough. Minor gap: no mention of error behavior for invalid context, but generally sufficient.

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?

Schema coverage is 100% but the description adds meaning: explains the parameter accepts context name or 1-based index, provides examples, and references the wdio resource for index use.

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 the specific action ('switches between native and webview automation contexts'), identifies the resource (automation context), and distinguishes from sibling tools like get_contexts and navigate.

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?

It provides explicit guidance: when to use each context type (accessibility IDs vs CSS/XPath), states that changes persist, and recommends using get_contexts to discover targets. Also notes 'Mobile-only' to limit scope.

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

switch_frameA
Idempotent

Switches WebDriver frame context into an iframe by CSS/XPath selector, or back to top-level if selector is omitted. Changes persist — all subsequent click_element, set_value, get_elements calls operate within the switched frame until you switch back. Waits up to 5s for the iframe. Browser-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
selectorNoCSS/XPath selector for the iframe element. Omit to switch back to the top-level frame.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already provide idempotentHint and destructiveHint. The description adds valuable behavioral details: wait of up to 5 seconds for the iframe, browser-only constraint, and persistence of frame context. This goes beyond the annotations and helps the agent understand state implications.

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 extremely concise: two sentences that front-load the purpose and essential usage details. Every word serves a purpose, making it efficient and easy to parse.

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 tool with one optional parameter and no output schema, the description comprehensively covers the main use case (switching to iframe and back), persistence behavior, wait time, and environment constraint (browser-only). No gaps are apparent.

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% with the parameter description explaining 'selector'. The description reinforces that omitting the selector switches back to top-level, which is already in the schema. It adds no new semantic depth beyond what the schema provides, so a 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 clearly specifies the tool's function: switching WebDriver frame context into an iframe or back to top-level. It uses a specific verb 'Switches' and resource 'WebDriver frame context', and distinguishes itself from sibling tools like 'switch_context' by specifying browser-only and iframe 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?

The description provides clear context on when to use the tool: for iframe switching and back to top-level. It explains that changes persist and affect subsequent calls, but does not explicitly state when not to use it or mention alternatives. This is adequate but not exhaustive.

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

switch_tabA
Idempotent

Focuses a browser tab by window handle or 0-based index. All subsequent tool calls operate on the active tab. Provide handle OR index — use get_tabs to find them. Browser-only; use switch_context for mobile webviews.

ParametersJSON Schema
NameRequiredDescriptionDefault
indexNo0-based tab index to switch to
handleNoWindow handle to switch to

TDQS

A4.3/5.0
Behavior4/5

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

Annotations idempotentHint=true and destructiveHint=false indicate safety. The description adds that subsequent tool calls affect the active tab, which is key behavioral context. No contradictions; it accurately describes a non-destructive focus action.

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?

Three sentences, no wasted words. The key action is front-loaded, and each sentence adds distinct value (action, effect, guidance, alternative). Highly efficient.

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 tab-switching operation, the description covers the purpose, input options, effect on subsequent calls, and context boundaries (browser vs. mobile). No output schema is needed; the behavioral impact is well explained.

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% with parameter descriptions already provided. The description reinforces mutual exclusivity ('Provide handle OR index') but adds no new semantic details beyond what the schema offers. Baseline 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 uses the specific verb 'Focuses' and resource 'browser tab', clearly stating the action. It distinguishes from the sibling tool 'switch_context' by noting 'Browser-only; use switch_context for mobile webviews.'

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 instructs to provide handle OR index and references get_tabs to find them. It also notes that subsequent calls operate on the active tab. The alternative switch_context is explicitly mentioned for mobile webviews, though it doesn't list specific when-not-to-use scenarios.

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

tap_elementA

Taps a matched element via element.tap() or at absolute screen coordinates (x, y). No scroll-into-view or wait — element must already be visible on screen. Use instead of click_element on iOS where element.click() is ignored. Provide selector OR both x and y. Mobile-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNoX coordinate for screen tap (if no selector provided)
yNoY coordinate for screen tap (if no selector provided)
selectorNoElement selector (CSS, XPath, accessibility ID, or UiAutomator)

TDQS

A5/5.0
Behavior5/5

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

Even though annotations are minimal, the description discloses important behavioral details: it does not scroll or wait, so the element must already be visible. It also clarifies the native tap mechanism, which is valuable context beyond the destructiveHint annotation.

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 concise, using only three sentences to convey purpose, usage constraints, and platform/behavioral notes. There is no redundancy or unnecessary elaboration.

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 simplicity of the operation and the absence of an output schema, the description provides sufficient context: what it does, when to use it, preconditions (element visible), and input alternatives. The agent can confidently decide when to call this tool.

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?

All three parameters are described in the schema, and the description adds the critical exclusivity constraint: 'selector OR both x and y'. This extra guidance goes beyond the schema and clarifies how the parameters relate.

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 (taps), the target (matched element or absolute coordinates), and distinguishes it from click_element on iOS, which helps an agent understand its specific use case.

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?

It explicitly tells when to use it ('Use instead of click_element on iOS where element.click() is ignored'), provides the input constraint ('Provide selector OR both x and y'), and notes the platform restriction ('Mobile-only').

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

upload_appA

Upload a local .apk or .ipa to a cloud provider (BrowserStack, Sauce Labs, TestMu, TestingBot, or Digital.ai). Returns the app URL for use in start_session.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesAbsolute path to the .apk or .ipa file
regionNoSauce Labs region (default: eu-central-1)eu-central-1
customIdNoOptional custom ID for the app (used to reference it later)
providerYesCloud provider

TDQS

A4/5.0
Behavior3/5

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

Annotations provide destructiveHint: false. The description adds that it uploads a local file (non-destructive locally) and returns a URL. No additional behavioral details like auth or limits are given, but it does not contradict 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?

One sentence that front-loads the main action and includes essential output info. No wasted words.

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?

Describes purpose, providers, and return value. Lacks mention of optional parameters (region, customId) but schema covers them. Reasonably complete for a 4-param tool with no 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 covers all 4 parameters with descriptions (100% coverage). The description reiterates file types and providers but does not add new parameter-level insights. 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 clearly states the verb 'upload' and the resource 'local .apk or .ipa', lists the cloud providers, and mentions the return value for use in start_session. It effectively distinguishes from sibling tools which deal with sessions, navigation, etc.

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 implies when to use: when needing to upload an app file for later use in start_session. It lacks explicit when-not or alternatives, but 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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 3 tool updatesv3.13.0
    • Addedget_mock_calls
    • Addedmanage_mock
    • Addedmock
  2. 14 tool updatesv3.12.0
    • Changedattach_session1 field changed
      • changedInput schema / properties / platform / description
        Previous value: -"Existing session platform type"New value: +"Existing session platform type (browser, ios, or android; Electron attachment is unsupported)."
    • Addedclick_element
    • Addedexecute_electron_script
    • Addedget_app_state
    • Addedget_screenshot
    • Addedhide_keyboard
    • Addedlist_apps
    • Addedrotate_device
    • Addedset_cookie
    • Addedset_geolocation
    • Changedstart_session4 fields changed
      • changedInput schema / properties / capabilities / description
        Previous value: -"Additional capabilities to merge"New value: +"Additional capabilities to merge. For Electron, configure the official service under \"wdio:electronServiceOptions\" (for example appBinaryPath, appEntryPoint, appArgs, logDir, or captureRendererLogs)."
      • addedInput schema / properties / electronDeeplinkScheme
        Added value: +{
        +  "description": "URI scheme allowed by trigger_electron_deeplink, without \":\" (for example, \"myapp\"). Electron-only and optional unless triggering deeplinks.",
        +  "pattern": "^[A-Za-z][A-Za-z0-9+.-]*$",
        +  "type": "string"
        +}
      • addedInput schema / properties / electronRootDir
        Added value: +{
        +  "description": "Project root used by the Electron standalone service for Electron Builder/Electron Forge discovery. Electron-only.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "browser",
        -  "ios",
        -  "android"
        -]New value: +[
        +  "browser",
        +  "electron",
        +  "ios",
        +  "android"
        +]
    • Addedswipe
    • Addedtap_element
    • Addedtrigger_electron_deeplink
  3. 22 tool updatesv3.11.1
    • Addedattach_session
    • Addedclose_session
    • Addeddelete_cookies
    • Addeddrag_and_drop
    • Addedemulate_device
    • Addedexecute_script
    • Addedget_accessibility_tree
    • Addedget_contexts
    • Addedget_cookies
    • Addedget_elements
    • Addedget_tabs
    • Addedlaunch_chrome
    • Addednavigate
    • Addedopen_web_extension
    • Addedscroll
    • Removedset_cookie
    • Addedset_value
    • Addedstart_session
    • Addedswitch_context
    • Addedswitch_frame
    • Addedswitch_tab
    • Addedupload_app
  4. 29 tool updatesv3.11.0
    • Removedclick_element
    • Removedclose_session
    • Removeddelete_cookies
    • Removeddrag_and_drop
    • Removedemulate_device
    • Removedexecute_script
    • Removedget_accessibility_tree
    • Removedget_app_state
    • Removedget_contexts
    • Removedget_cookies
    • Removedget_elements
    • Removedget_screenshot
    • Removedget_tabs
    • Removedhide_keyboard
    • Removedlaunch_chrome
    • Removedlist_apps
    • Removednavigate
    • Removedopen_web_extension
    • Removedrotate_device
    • Removedscroll
    • Removedset_geolocation
    • Removedset_value
    • Removedstart_session
    • Removedswipe
    • Removedswitch_context
    • Removedswitch_frame
    • Removedswitch_tab
    • Removedtap_element
    • Removedupload_app
  5. 1 tool updatev3.10.1
    • Changedstart_session3 fields changed
      • changedInput schema / properties / provider / description
        Previous value: -"Session provider (default: local). \"digitalai\" requires DIGITALAI_CLOUD_URL + DIGITALAI_ACCESS_KEY env vars."New value: +"Session provider (default: local). Use \"external\" to connect to an externally managed W3C WebDriver endpoint. \"digitalai\" requires DIGITALAI_CLOUD_URL + DIGITALAI_ACCESS_KEY env vars."
      • changedInput schema / properties / provider / enum
        Previous value: -[
        -  "local",
        -  "browserstack",
        -  "saucelabs",
        -  "testmu",
        -  "testingbot",
        -  "digitalai"
        -]New value: +[
        +  "local",
        +  "browserstack",
        +  "saucelabs",
        +  "testmu",
        +  "testingbot",
        +  "digitalai",
        +  "external"
        +]
      • addedInput schema / properties / webdriverConfig
        Added value: +{
        +  "description": "Existing W3C WebDriver endpoint connection (provider: \"external\" only). Defaults to 127.0.0.1:4445/.",
        +  "properties": {
        +    "hostname": {
        +      "default": "127.0.0.1",
        +      "type": "string"
        +    },
        +    "path": {
        +      "default": "/",
        +      "type": "string"
        +    },
        +    "port": {
        +      "default": 4445,
        +      "type": "number"
        +    },
        +    "protocol": {
        +      "default": "http",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
  6. 4 tool updatesv3.9.0
    • Changedlist_apps1 field changed
      • changedInput schema / properties / provider / enum
        Previous value: -[
        -  "browserstack",
        -  "saucelabs",
        -  "testmu",
        -  "testingbot"
        -]New value: +[
        +  "browserstack",
        +  "saucelabs",
        +  "testmu",
        +  "testingbot",
        +  "digitalai"
        +]
    • Addedopen_web_extension
    • Changedstart_session6 fields changed
      • changedInput schema / properties / app / description
        Previous value: -"App URL (bs://... for BrowserStack, storage:filename= for Sauce Labs, lt://... for TestMu, tb://... for TestingBot mobile sessions)"New value: +"App URL (bs://... for BrowserStack, storage:filename= for Sauce Labs, lt://... for TestMu, tb://... for TestingBot, cloud:<package-or-bundle> for Digital.ai mobile sessions)"
      • addedInput schema / properties / deviceQuery
        Added value: +{
        +  "description": "Digital.ai device selection query for dynamic allocation, e.g. \"@os='android' and @version='14' and @name='.*Pixel.*'\". Only used with provider: \"digitalai\" mobile sessions; if omitted, one is built from deviceName/platformVersion.",
        +  "type": "string"
        +}
      • changedInput schema / properties / os / description
        Previous value: -"Operating system for cloud provider browser sessions (e.g. \"Windows\", \"Mac\", \"macOS\", \"Linux\"). BrowserStack: sets bstack:options.os separately. TestMu/Sauce Labs/TestingBot: combined with osVersion into W3C platformName. Browser platform only."New value: +"Operating system for cloud provider browser sessions (e.g. \"Windows\", \"Mac\", \"macOS\", \"Linux\"). BrowserStack: sets bstack:options.os separately. TestMu/Sauce Labs/TestingBot: combined with osVersion into W3C platformName. Digital.ai: combined with osVersion into the digitalai:osName capability (e.g. \"Mac OS Sequoia\", \"Windows 10\") — required for the grid to match a node. Browser platform only."
      • changedInput schema / properties / osVersion / description
        Previous value: -"OS version for cloud provider browser sessions (e.g. \"11\", \"15\", \"Monterey\"). BrowserStack: sets bstack:options.osVersion separately. TestMu/Sauce Labs/TestingBot: combined with os into W3C platformName. Browser platform only."New value: +"OS version for cloud provider browser sessions (e.g. \"11\", \"15\", \"Monterey\"). BrowserStack: sets bstack:options.osVersion separately. TestMu/Sauce Labs/TestingBot: combined with os into W3C platformName. Digital.ai: combined with os into digitalai:osName. Browser platform only."
      • changedInput schema / properties / provider / description
        Previous value: -"Session provider (default: local)"New value: +"Session provider (default: local). \"digitalai\" requires DIGITALAI_CLOUD_URL + DIGITALAI_ACCESS_KEY env vars."
      • changedInput schema / properties / provider / enum
        Previous value: -[
        -  "local",
        -  "browserstack",
        -  "saucelabs",
        -  "testmu",
        -  "testingbot"
        -]New value: +[
        +  "local",
        +  "browserstack",
        +  "saucelabs",
        +  "testmu",
        +  "testingbot",
        +  "digitalai"
        +]
    • Changedupload_app1 field changed
      • changedInput schema / properties / provider / enum
        Previous value: -[
        -  "browserstack",
        -  "saucelabs",
        -  "testmu",
        -  "testingbot"
        -]New value: +[
        +  "browserstack",
        +  "saucelabs",
        +  "testmu",
        +  "testingbot",
        +  "digitalai"
        +]
  7. 3 tool updatesv3.7.0
    • Changedlist_apps1 field changed
      • changedInput schema / properties / provider / enum
        Previous value: -[
        -  "browserstack",
        -  "saucelabs",
        -  "testmu"
        -]New value: +[
        +  "browserstack",
        +  "saucelabs",
        +  "testmu",
        +  "testingbot"
        +]
    • Changedstart_session4 fields changed
      • changedInput schema / properties / app / description
        Previous value: -"App URL (bs://... for BrowserStack, storage:filename= for Sauce Labs, lt://... for TestMu mobile sessions)"New value: +"App URL (bs://... for BrowserStack, storage:filename= for Sauce Labs, lt://... for TestMu, tb://... for TestingBot mobile sessions)"
      • changedInput schema / properties / os / description
        Previous value: -"Operating system for cloud provider browser sessions (e.g. \"Windows\", \"Mac\", \"macOS\", \"Linux\"). BrowserStack: sets bstack:options.os separately. TestMu/Sauce Labs: combined with osVersion into W3C platformName. Browser platform only."New value: +"Operating system for cloud provider browser sessions (e.g. \"Windows\", \"Mac\", \"macOS\", \"Linux\"). BrowserStack: sets bstack:options.os separately. TestMu/Sauce Labs/TestingBot: combined with osVersion into W3C platformName. Browser platform only."
      • changedInput schema / properties / osVersion / description
        Previous value: -"OS version for cloud provider browser sessions (e.g. \"11\", \"15\", \"Monterey\"). BrowserStack: sets bstack:options.osVersion separately. TestMu/Sauce Labs: combined with os into W3C platformName. Browser platform only."New value: +"OS version for cloud provider browser sessions (e.g. \"11\", \"15\", \"Monterey\"). BrowserStack: sets bstack:options.osVersion separately. TestMu/Sauce Labs/TestingBot: combined with os into W3C platformName. Browser platform only."
      • changedInput schema / properties / provider / enum
        Previous value: -[
        -  "local",
        -  "browserstack",
        -  "saucelabs",
        -  "testmu"
        -]New value: +[
        +  "local",
        +  "browserstack",
        +  "saucelabs",
        +  "testmu",
        +  "testingbot"
        +]
    • Changedupload_app1 field changed
      • changedInput schema / properties / provider / enum
        Previous value: -[
        -  "browserstack",
        -  "saucelabs",
        -  "testmu"
        -]New value: +[
        +  "browserstack",
        +  "saucelabs",
        +  "testmu",
        +  "testingbot"
        +]
  8. 3 tool updatesv3.6.0
    • Changedlist_apps4 fields changed
      • changedInput schema / properties / organizationWide / description
        Previous value: -"List apps uploaded by all users in the organization (uses recent_group_apps endpoint). Defaults to false (own uploads only)."New value: +"(BrowserStack only) List apps uploaded by all users in the organization. Defaults to false (own uploads only)."
      • addedInput schema / properties / provider
        Added value: +{
        +  "description": "Cloud provider",
        +  "enum": [
        +    "browserstack",
        +    "saucelabs",
        +    "testmu"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / region
        Added value: +{
        +  "default": "eu-central-1",
        +  "description": "Sauce Labs region (default: eu-central-1)",
        +  "enum": [
        +    "us-west-1",
        +    "eu-central-1",
        +    "apac-southeast-1"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "provider"
        +]
    • Changedstart_session14 fields changed
      • changedInput schema / properties / app / description
        Previous value: -"BrowserStack app URL (bs://...) or custom_id for mobile sessions"New value: +"App URL (bs://... for BrowserStack, storage:filename= for Sauce Labs, lt://... for TestMu mobile sessions)"
      • changedInput schema / properties / browserVersion / description
        Previous value: -"Browser version (BrowserStack only, default: latest)"New value: +"Browser version (cloud providers only, default: latest)"
      • changedInput schema / properties / browserstackLocal / anyOf
        Previous value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "const": "external",
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "const": "external",
        +    "type": "string"
        +  },
        +  {
        +    "type": "boolean"
        +  }
        +]
      • changedInput schema / properties / browserstackLocal / description
        Previous value: -"Enable BrowserStack Local tunnel routing (BrowserStack only, default: false). true = auto-start tunnel before session and stop on close. \"external\" = tunnel already running externally, set local: true in capabilities only."New value: +"Deprecated: use \"tunnel\" instead. Enable BrowserStack Local tunnel routing."
      • changedInput schema / properties / os / description
        Previous value: -"Operating system (BrowserStack browser only, e.g. \"Windows\", \"OS X\")"New value: +"Operating system for cloud provider browser sessions (e.g. \"Windows\", \"Mac\", \"macOS\", \"Linux\"). BrowserStack: sets bstack:options.os separately. TestMu/Sauce Labs: combined with osVersion into W3C platformName. Browser platform only."
      • changedInput schema / properties / osVersion / description
        Previous value: -"OS version (BrowserStack browser only, e.g. \"11\", \"Sequoia\")"New value: +"OS version for cloud provider browser sessions (e.g. \"11\", \"15\", \"Monterey\"). BrowserStack: sets bstack:options.osVersion separately. TestMu/Sauce Labs: combined with os into W3C platformName. Browser platform only."
      • changedInput schema / properties / platformVersion / description
        Previous value: -"OS version (e.g., \"17.0\", \"14\")"New value: +"OS version for mobile sessions (e.g., \"17.0\", \"14\"). Mobile (ios/android) only."
      • changedInput schema / properties / provider / enum
        Previous value: -[
        -  "local",
        -  "browserstack"
        -]New value: +[
        +  "local",
        +  "browserstack",
        +  "saucelabs",
        +  "testmu"
        +]
      • addedInput schema / properties / region
        Added value: +{
        +  "default": "eu-central-1",
        +  "description": "Sauce Labs region (default: eu-central-1). Only used with provider: \"saucelabs\".",
        +  "enum": [
        +    "us-west-1",
        +    "eu-central-1",
        +    "apac-southeast-1"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / reporting / description
        Previous value: -"BrowserStack reporting labels (project, build, session)"New value: +"Cloud provider reporting labels (project, build, session)"
      • addedInput schema / properties / saucelabsLocal
        Added value: +{
        +  "anyOf": [
        +    {
        +      "const": "external",
        +      "type": "string"
        +    },
        +    {
        +      "type": "boolean"
        +    }
        +  ],
        +  "description": "Deprecated: use \"tunnel\" instead. Enable Sauce Connect tunnel routing."
        +}
      • addedInput schema / properties / testmuLocal
        Added value: +{
        +  "anyOf": [
        +    {
        +      "const": "external",
        +      "type": "string"
        +    },
        +    {
        +      "type": "boolean"
        +    }
        +  ],
        +  "description": "Deprecated: use \"tunnel\" instead. Enable TestMu Tunnel routing."
        +}
      • addedInput schema / properties / tunnel
        Added value: +{
        +  "anyOf": [
        +    {
        +      "const": "external",
        +      "type": "string"
        +    },
        +    {
        +      "type": "boolean"
        +    }
        +  ],
        +  "description": "Enable local tunnel routing (cloud providers only, default: false). true = auto-start tunnel before session and stop on close. \"external\" = tunnel already running externally."
        +}
      • addedInput schema / properties / tunnelName
        Added value: +{
        +  "description": "Tunnel identifier name. With tunnel: \"external\" this must match the running tunnel. With tunnel: true a unique name is auto-generated if not provided.",
        +  "type": "string"
        +}
    • Changedupload_app3 fields changed
      • addedInput schema / properties / provider
        Added value: +{
        +  "description": "Cloud provider",
        +  "enum": [
        +    "browserstack",
        +    "saucelabs",
        +    "testmu"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / region
        Added value: +{
        +  "default": "eu-central-1",
        +  "description": "Sauce Labs region (default: eu-central-1)",
        +  "enum": [
        +    "us-west-1",
        +    "eu-central-1",
        +    "apac-southeast-1"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "path"
        -]New value: +[
        +  "provider",
        +  "path"
        +]
  9. 29 tool updates
    • Addedclick_element
    • Addedclose_session
    • Addeddelete_cookies
    • Addeddrag_and_drop
    • Addedemulate_device
    • Addedexecute_script
    • Addedget_accessibility_tree
    • Addedget_app_state
    • Addedget_contexts
    • Addedget_cookies
    • Addedget_elements
    • Addedget_screenshot
    • Addedget_tabs
    • Addedhide_keyboard
    • Addedlaunch_chrome
    • Addedlist_apps
    • Addednavigate
    • Addedrotate_device
    • Addedscroll
    • Addedset_cookie
    • Addedset_geolocation
    • Addedset_value
    • Addedstart_session
    • Addedswipe
    • Addedswitch_context
    • Addedswitch_frame
    • Addedswitch_tab
    • Addedtap_element
    • Addedupload_app
  10. 29 tool updatesv3.5.1
    • Removedclick_element
    • Removedclose_session
    • Removeddelete_cookies
    • Removeddrag_and_drop
    • Removedemulate_device
    • Removedexecute_script
    • Removedget_accessibility_tree
    • Removedget_app_state
    • Removedget_contexts
    • Removedget_cookies
    • Removedget_elements
    • Removedget_screenshot
    • Removedget_tabs
    • Removedhide_keyboard
    • Removedlaunch_chrome
    • Removedlist_apps
    • Removednavigate
    • Removedrotate_device
    • Removedscroll
    • Removedset_cookie
    • Removedset_geolocation
    • Removedset_value
    • Removedstart_session
    • Removedswipe
    • Removedswitch_context
    • Removedswitch_frame
    • Removedswitch_tab
    • Removedtap_element
    • Removedupload_app
  11. 29 tool updatesv3.4.4
    • Addedclick_element
    • Addedclose_session
    • Addeddelete_cookies
    • Addeddrag_and_drop
    • Addedemulate_device
    • Addedexecute_script
    • Addedget_accessibility_tree
    • Addedget_app_state
    • Addedget_contexts
    • Addedget_cookies
    • Addedget_elements
    • Addedget_screenshot
    • Addedget_tabs
    • Addedhide_keyboard
    • Addedlaunch_chrome
    • Addedlist_apps
    • Addednavigate
    • Addedrotate_device
    • Addedscroll
    • Addedset_cookie
    • Addedset_geolocation
    • Addedset_value
    • Addedstart_session
    • Addedswipe
    • Addedswitch_context
    • Addedswitch_frame
    • Addedswitch_tab
    • Addedtap_element
    • Addedupload_app
  12. 29 tool updatesv3.4.1
    • Removedclick_element
    • Removedclose_session
    • Removeddelete_cookies
    • Removeddrag_and_drop
    • Removedemulate_device
    • Removedexecute_script
    • Removedget_accessibility_tree
    • Removedget_app_state
    • Removedget_contexts
    • Removedget_cookies
    • Removedget_elements
    • Removedget_screenshot
    • Removedget_tabs
    • Removedhide_keyboard
    • Removedlaunch_chrome
    • Removedlist_apps
    • Removednavigate
    • Removedrotate_device
    • Removedscroll
    • Removedset_cookie
    • Removedset_geolocation
    • Removedset_value
    • Removedstart_session
    • Removedswipe
    • Removedswitch_context
    • Removedswitch_frame
    • Removedswitch_tab
    • Removedtap_element
    • Removedupload_app
  13. 2 tool updatesv3.4.0
    • Changedstart_session1 field changed
      • addedInput schema / properties / appiumConfig / properties / protocol
        Added value: +{
        +  "type": "string"
        +}
    • Addedswitch_frame
  14. 6 tool updatesv3.3.0
    • Addedget_accessibility_tree
    • Addedget_app_state
    • Addedget_contexts
    • Addedget_cookies
    • Addedget_screenshot
    • Addedget_tabs
  15. 21 tool updatesv3.2.3
    • Removedattach_browser
    • Changedclick_element1 field changed
      • removedInput schema / properties / scrollToView / default
        Removed value: -true
    • Changedclose_session1 field changed
      • changedInput schema / properties / detach / description
        Previous value: -"If true, disconnect from session without terminating it (preserves app state). Default: false"New value: +"If true, disconnect without terminating (preserves app state). Default: false"
    • Removedget_accessibility
    • Removedget_app_state
    • Removedget_contexts
    • Removedget_cookies
    • Removedget_current_context
    • Addedget_elements
    • Removedget_geolocation
    • Removedget_visible_elements
    • Changedlaunch_chrome1 field changed
      • removedInput schema / properties / copyProfileFiles / default
        Removed value: -false
    • Addedlist_apps
    • Changedset_value1 field changed
      • removedInput schema / properties / scrollToView / default
        Removed value: -true
    • Removedstart_app_session
    • Removedstart_browser
    • Addedstart_session
    • Changedswitch_context1 field changed
      • changedInput schema / properties / context / description
        Previous value: -"Context name to switch to (e.g., \"NATIVE_APP\", \"WEBVIEW_com.example.app\", or use index from get_contexts)"New value: +"Context name to switch to (e.g., \"NATIVE_APP\", \"WEBVIEW_com.example.app\", or use index from wdio://session/current/contexts resource)"
    • Addedswitch_tab
    • Removedtake_screenshot
    • Addedupload_app

TDQS

A3.8/5.0

Scored across 36 tools

Disambiguation4/5

Most tools target distinct platform/context combinations (browser vs mobile vs Electron), and descriptions clarify boundaries. However, pairs like click_element/tap_element, scroll/swipe, and start_session/attach_session create some risk of misselection, even if the descriptions resolve the ambiguity.

Naming Consistency4/5

The naming is broadly consistent: lowercase snake_case with verb_noun patterns like get_tabs, set_cookie, and switch_frame. Minor deviations exist, such as one-word verbs (navigate, scroll, swipe) and the bare 'mock' tool alongside manage_mock/get_mock_calls, but the overall convention is predictable.

Tool Count2/5

At 36 tools, the server exceeds the 25+ threshold for 'too many' and feels heavy even for a multi-platform automation server spanning browser, mobile, Electron, and cloud app storage. The count is justifiable by the broad domain, but it imposes a large selection surface on agents.

Completeness3/5

The toolset covers session lifecycle, navigation, element interaction, cookies, screenshots, mobile gestures, webviews, and cloud app uploads. Notable gaps include no explicit reload/back/forward, wait-for-element, hover/double-click, or element-state assertion tools, though execute_script can work around some of these.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    A
    maintenance
    Enables AI assistants to automate mobile app testing and development for iOS and Android through natural language interactions. Supports intelligent element identification, session management, automated test generation, and comprehensive device interactions including clicks, swipes, screenshots, and app management.
    31
    5,170 npm
    477
    Apache 2.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to automate browser interactions using Selenium WebDriver, supporting multiple browsers and tools for navigation, clicking, typing, screenshots, and more.
    635 npm
    MIT