Install @wdio/mcp from npm
Install exact version 3.12.0. No verified executable entrypoint is available, so use the package documentation to launch it.
npm install --save-exact @wdio/mcp@3.12.0Enables Claude Desktop to automate web browsers and mobile applications (iOS/Android) using WebDriverIO. Supports browser automation, mobile app testing, touch gestures, app lifecycle management, and hybrid app context switching through natural language
Installation and connection instructions are shown only when supported by retained package, repository, or endpoint evidence.
Install exact version 3.12.0. No verified executable entrypoint is available, so use the package documentation to launch it.
npm install --save-exact @wdio/mcp@3.12.0| Canonical slug | webdriverio-mcp-server-c662e2f4 | Deployment | Local Only |
|---|---|---|---|
| Canonical package | npm:@wdio/mcp | Repository | webdriverio/mcp |
| First published | — | Latest release | — |
| Last security verification | — | Classification confidence | 90% |
| Publication | Published | Official distribution | Yes |
| Channel | Identifier | Current version | Versions | Source |
|---|---|---|---|---|
| npm | @wdio/mcp | 3.12.0 | 45 | Repository |
| Package | Version | Published / observed | Inventory | Security scan |
|---|---|---|---|---|
| npm@wdio/mcp | 3.12.0Current | Sep 5, 2026 | 33 toolsSucceeded · 17 resources · 0 prompts | Failed |
Independently scan the exact version your agents use, receive alerts when its risk changes, and investigate every finding with retained version evidence.
| Provenance | artifact_hash_verified | Signature | — |
|---|---|---|---|
| MCP SDK | — | Artifact SHA-256 | a90a50f4abdd9e0f6d0c08e4168c36e27eacd44583f3034155e9094c2dda0eb7 |
| Scanner | mcp-proof-engine 0.1.0 | Scan completed | Sep 4, 2026 |
| Security rating | — | Methodology | — |
| Tool | Category | Annotations | Risk |
|---|---|---|---|
attach_sessionAttaches 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.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"sessionId": {
"type": "string",
"minLength": 1,
"description": "Existing remote WebDriver/Appium session ID"
},
"provider": {
"default": "local",
"description": "Provider hosting the existing session (default: local). Use \"external\" for a custom W3C WebDriver endpoint.",
"type": "string",
"enum": [
"local",
"browserstack",
"saucelabs",
"testmu",
"testingbot",
"digitalai",
"external"
]
},
"platform": {
"type": "string",
"enum": [
"browser",
"ios",
"android"
],
"description": "Existing session platform type (browser, ios, or android; Electron attachment is unsupported)."
},
"browser": {
"description": "Browser for local command registration (browser platform only, default: chrome)",
"type": "string",
"enum": [
"chrome",
"firefox",
"edge",
"safari"
]
},
"automationName": {
"description": "Appium automation driver for local command registration (mobile platforms only)",
"type": "string",
"enum": [
"XCUITest",
"UiAutomator2"
]
},
"webdriverConfig": {
"description": "Existing W3C WebDriver endpoint connection (provider: \"external\" only). Defaults to 127.0.0.1:4445/.",
"type": "object",
"properties": {
"protocol": {
"default": "http",
"type": "string"
},
"hostname": {
"default": "127.0.0.1",
"type": "string"
},
"port": {
"default": 4445,
"type": "number"
},
"path": {
"default": "/",
"type": "string"
}
}
},
"appiumConfig": {
"description": "Appium server connection (local provider only)",
"type": "object",
"properties": {
"host": {
"type": "string"
},
"port": {
"type": "number"
},
"path": {
"type": "string"
},
"protocol": {
"type": "string"
}
}
},
"region": {
"default": "eu-central-1",
"description": "Sauce Labs region (default: eu-central-1). Only used with provider: \"saucelabs\".",
"type": "string",
"enum": [
"us-west-1",
"eu-central-1",
"apac-southeast-1"
]
},
"trace": {
"description": "Enable trace recording for subsequent commands — produces a Playwright-compatible zip saved to .trace/ on close_session.",
"type": "boolean"
},
"capabilities": {
"description": "Capabilities used to register the correct browser or Appium command surface locally; they are not sent to the remote endpoint",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"required": [
"sessionId",
"platform"
]
}Annotations{
"title": "Attach Session",
"destructiveHint": false
} | — | Non-destructive | — |
click_elementWaits 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.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"selector": {
"type": "string",
"description": "Value 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\")"
},
"scrollToView": {
"description": "Whether to scroll the element into view before clicking",
"type": "boolean"
},
"timeout": {
"description": "Maximum time to wait for element in milliseconds",
"type": "number"
}
},
"required": [
"selector"
]
}Annotations{
"title": "Click Element",
"destructiveHint": false
} | — | Non-destructive | — |
close_sessionCloses 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.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"detach": {
"description": "If true, disconnect without terminating; if false, terminate. When omitted, externally managed and auto-detach sessions are preserved while other sessions are terminated.",
"type": "boolean"
}
}
}Annotations{
"title": "Close Session",
"destructiveHint": true
} | — | Destructive | — |
delete_cookiesDeletes all cookies or a single cookie by name from the current browser session. Irreversible — deleted cookies cannot be recovered.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"name": {
"description": "Optional cookie name to delete a specific cookie. If not provided, deletes all cookies",
"type": "string"
}
}
}Annotations{
"title": "Delete Cookies",
"destructiveHint": true,
"idempotentHint": true
} | — | DestructiveIdempotent | — |
drag_and_dropDrags 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.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"sourceSelector": {
"type": "string",
"description": "Source element selector to drag"
},
"targetSelector": {
"description": "Target element selector to drop onto",
"type": "string"
},
"x": {
"description": "Target X offset (if no targetSelector)",
"type": "number"
},
"y": {
"description": "Target Y offset (if no targetSelector)",
"type": "number"
},
"duration": {
"description": "Drag duration in milliseconds",
"type": "number",
"minimum": 100,
"maximum": 5000
}
},
"required": [
"sourceSelector"
]
}Annotations{
"title": "Drag and Drop",
"destructiveHint": false
} | — | Non-destructive | — |
emulate_deviceEmulates 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.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"device": {
"description": "Device preset name (e.g. \"iPhone 15\", \"Pixel 7\"). Omit to list available presets. Pass \"reset\" to restore desktop defaults.",
"type": "string"
}
}
}Annotations{
"title": "Emulate Device",
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
execute_electron_scriptExecutes arbitrary JavaScript in the Electron main process. This is privileged code execution with access to Electron APIs; use only with trusted scripts.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"script": {
"type": "string",
"minLength": 1,
"description": "JavaScript body executed in the Electron main process. Use `electron` for Electron APIs, `args` for supplied values, and `return` for a result."
},
"args": {
"description": "Values made available to the script as args[0], args[1], and so on.",
"type": "array",
"items": {}
}
},
"required": [
"script"
]
}Annotations{
"title": "Execute Electron Main-Process Script",
"destructiveHint": true
} | — | Destructive | — |
execute_scriptExecutes 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: <command>' syntax in script with args array (e.g. "mobile: pressKey", "mobile: activateApp"). Prefer click_element/set_value/get_elements for standard interactions.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"script": {
"type": "string",
"description": "JavaScript code (browser) or mobile command string like \"mobile: pressKey\" (Appium)"
},
"args": {
"description": "Arguments to pass to the script. For browser: element selectors or values. For mobile commands: command-specific parameters as objects.",
"type": "array",
"items": {}
}
},
"required": [
"script"
]
}Annotations{
"title": "Execute Script",
"destructiveHint": false
} | — | Non-destructive | — |
get_accessibility_treeReturns the page accessibility tree with roles, names, and selectors. Browser-only. Supports filtering by ARIA roles and pagination via limit/offset.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"limit": {
"default": 0,
"description": "Maximum number of nodes to return (0 = no limit)",
"type": "number"
},
"offset": {
"default": 0,
"description": "Number of nodes to skip for pagination",
"type": "number"
},
"roles": {
"description": "Filter by ARIA roles, e.g. [\"button\", \"link\", \"heading\"]",
"type": "array",
"items": {
"type": "string"
}
}
}
}Annotations{
"title": "Get Accessibility Tree",
"readOnlyHint": true,
"idempotentHint": true
} | — | Read onlyIdempotent | — |
get_app_stateReturns the current state of a mobile app: not installed, not running, background, or foreground. Mobile-only.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"bundleId": {
"type": "string",
"description": "App bundle ID (iOS) or package name (Android), e.g. \"com.example.app\""
}
},
"required": [
"bundleId"
]
}Annotations{
"title": "Get App State",
"readOnlyHint": true,
"idempotentHint": true
} | — | Read onlyIdempotent | — |
get_contextsReturns available automation contexts and the currently active one. Use before switch_context to discover NATIVE_APP and WEBVIEW_* targets. Mobile-only.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {}
}Annotations{
"title": "Get Automation Contexts",
"readOnlyHint": true,
"idempotentHint": true
} | — | Read onlyIdempotent | — |
get_cookiesReturns 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.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"name": {
"description": "Cookie name to retrieve a specific cookie. If omitted, returns all cookies.",
"type": "string"
}
}
}Annotations{
"title": "Get Cookies",
"readOnlyHint": true,
"idempotentHint": true
} | — | Read onlyIdempotent | — |
get_elementsReturns 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.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"inViewportOnly": {
"description": "Only return elements visible in the current viewport (default: false).",
"type": "boolean"
},
"includeContainers": {
"description": "Include container elements like divs and sections (default: false)",
"type": "boolean"
},
"includeBounds": {
"description": "Include element bounding box coordinates (default: false)",
"type": "boolean"
},
"limit": {
"default": 0,
"description": "Maximum number of elements to return (0 = no limit)",
"type": "number"
},
"offset": {
"default": 0,
"description": "Number of elements to skip (for pagination)",
"type": "number"
}
}
}Annotations{
"title": "Get Visible Elements",
"readOnlyHint": true,
"idempotentHint": true
} | — | Read onlyIdempotent | — |
get_screenshotTakes a screenshot of the current page or screen and returns a base64-encoded image, resized and compressed for model context limits.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {}
}Annotations{
"title": "Get Screenshot",
"readOnlyHint": true,
"idempotentHint": true
} | — | Read onlyIdempotent | — |
get_tabsLists all browser tabs with handle, title, URL, and which is active. Use before switch_tab to find the target handle or index. Browser-only.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {}
}Annotations{
"title": "Get Browser Tabs",
"readOnlyHint": true,
"idempotentHint": true
} | — | Read onlyIdempotent | — |
hide_keyboardDismisses the on-screen keyboard on mobile. Call after text entry when the keyboard obscures elements. No-op if already hidden. Mobile-only.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {}
}Annotations{
"title": "Hide Keyboard",
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
launch_chromeLaunches 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.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"port": {
"default": 9222,
"description": "Remote debugging port (default: 9222)",
"type": "number"
},
"mode": {
"default": "newInstance",
"description": "newInstance: open alongside existing Chrome | freshSession: clean profile",
"type": "string",
"enum": [
"newInstance",
"freshSession"
]
},
"copyProfileFiles": {
"description": "Copy your Default Chrome profile (cookies, logins) into the debug session.",
"type": "boolean"
}
}
}Annotations{
"title": "Launch Chrome",
"destructiveHint": false
} | — | Non-destructive | — |
list_appsList 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.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
"browserstack",
"saucelabs",
"testmu",
"testingbot",
"digitalai"
],
"description": "Cloud provider"
},
"sortBy": {
"default": "uploaded_at",
"description": "Sort order for results",
"type": "string",
"enum": [
"app_name",
"uploaded_at"
]
},
"organizationWide": {
"description": "(BrowserStack only) List apps uploaded by all users in the organization. Defaults to false (own uploads only).",
"type": "boolean"
},
"limit": {
"default": 20,
"description": "Maximum number of apps to return (only applies when organizationWide is true, default 20)",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"region": {
"default": "eu-central-1",
"description": "Sauce Labs region (default: eu-central-1)",
"type": "string",
"enum": [
"us-west-1",
"eu-central-1",
"apac-southeast-1"
]
}
},
"required": [
"provider"
]
}Annotations{
"title": "List Cloud Provider Apps",
"readOnlyHint": true,
"idempotentHint": true
} | — | Read onlyIdempotent | — |
navigateLoads a URL in the current tab and waits for the page load event. Resets page state — DOM, JS runtime, timers, and frame context are destroyed. Use instead of clicking links when the target URL is known.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"url": {
"type": "string",
"minLength": 1,
"description": "The URL to navigate to"
}
},
"required": [
"url"
]
}Annotations{
"title": "Navigate to URL",
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
open_web_extensionInstalls 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.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"extensionData": {
"oneOf": [
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "path"
},
"path": {
"type": "string",
"minLength": 1,
"description": "Path to an unpacked extension directory on the remote end."
}
},
"required": [
"type",
"path"
]
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "archivePath"
},
"path": {
"type": "string",
"minLength": 1,
"description": "Path to a packaged extension archive on the remote end."
}
},
"required": [
"type",
"path"
]
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "base64"
},
"value": {
"type": "string",
"minLength": 1,
"description": "Base64-encoded packaged extension archive."
}
},
"required": [
"type",
"value"
]
}
],
"description": "W3C BiDi webExtension.ExtensionData: unpacked directory path, archive path, or base64 archive."
},
"path": {
"type": "string",
"minLength": 1,
"description": "Path inside the extension package, such as options.html or popup.html. Leading slashes are ignored."
}
},
"required": [
"extensionData",
"path"
]
}Annotations{
"title": "Open Web Extension",
"destructiveHint": false
} | — | Non-destructive | — |
rotate_deviceRotates 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.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"orientation": {
"type": "string",
"enum": [
"PORTRAIT",
"LANDSCAPE"
],
"description": "Device orientation"
}
},
"required": [
"orientation"
]
}Annotations{
"title": "Rotate Device",
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
scrollScrolls the page vertically by a pixel amount. Browser-only — for mobile scrolling use swipe. Only supports up/down; no horizontal scrolling.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"direction": {
"type": "string",
"enum": [
"up",
"down"
],
"description": "Scroll direction"
},
"pixels": {
"default": 500,
"description": "Number of pixels to scroll",
"type": "number"
}
},
"required": [
"direction"
]
}Annotations{
"title": "Scroll Page",
"destructiveHint": false
} | — | Non-destructive | — |
set_cookieSets a browser cookie on the active session. The browser must already be on the target domain — cookies cannot be set cross-domain. Use to inject session tokens or feature flags without login flows.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Cookie name"
},
"value": {
"type": "string",
"description": "Cookie value"
},
"domain": {
"description": "Cookie domain (defaults to current domain)",
"type": "string"
},
"path": {
"description": "Cookie path (defaults to \"/\")",
"type": "string"
},
"expiry": {
"description": "Expiry date as Unix timestamp in seconds",
"type": "number"
},
"httpOnly": {
"description": "HttpOnly flag",
"type": "boolean"
},
"secure": {
"description": "Secure flag",
"type": "boolean"
},
"sameSite": {
"description": "SameSite attribute",
"type": "string",
"enum": [
"strict",
"lax",
"none"
]
}
},
"required": [
"name",
"value"
]
}Annotations{
"title": "Set Cookie",
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
set_geolocationOverrides GPS coordinates for the session. Affects navigator.geolocation in browsers and location services on mobile. Location permissions must already be granted to the app.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"latitude": {
"type": "number",
"minimum": -90,
"maximum": 90,
"description": "Latitude coordinate"
},
"longitude": {
"type": "number",
"minimum": -180,
"maximum": 180,
"description": "Longitude coordinate"
},
"altitude": {
"description": "Altitude in meters (optional)",
"type": "number"
}
},
"required": [
"latitude",
"longitude"
]
}Annotations{
"title": "Set Geolocation",
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
set_valueClears 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.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"selector": {
"type": "string",
"description": "Value for the selector, in the form of css selector or xpath (\"button.my-class\" or \"//button[@class='my-class']\")"
},
"value": {
"type": "string",
"description": "Text to enter into the element"
},
"scrollToView": {
"description": "Whether to scroll the element into view before typing",
"type": "boolean"
},
"timeout": {
"description": "Maximum time to wait for element in milliseconds",
"type": "number"
}
},
"required": [
"selector",
"value"
]
}Annotations{
"title": "Set Input Value",
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
start_sessionStarts 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.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"provider": {
"default": "local",
"description": "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.",
"type": "string",
"enum": [
"local",
"browserstack",
"saucelabs",
"testmu",
"testingbot",
"digitalai",
"external"
]
},
"platform": {
"type": "string",
"enum": [
"browser",
"electron",
"ios",
"android"
],
"description": "Session platform type"
},
"browser": {
"description": "Browser to launch (required for browser platform)",
"type": "string",
"enum": [
"chrome",
"firefox",
"edge",
"safari"
]
},
"browserVersion": {
"description": "Browser version (cloud providers only, default: latest)",
"type": "string"
},
"electronRootDir": {
"description": "Project root used by the Electron standalone service for Electron Builder/Electron Forge discovery. Electron-only.",
"type": "string",
"minLength": 1
},
"electronDeeplinkScheme": {
"description": "URI scheme allowed by trigger_electron_deeplink, without \":\" (for example, \"myapp\"). Electron-only and optional unless triggering deeplinks.",
"type": "string",
"pattern": "^[A-Za-z][A-Za-z0-9+.-]*$"
},
"os": {
"description": "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.",
"type": "string"
},
"osVersion": {
"description": "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.",
"type": "string"
},
"app": {
"description": "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)",
"type": "string"
},
"reporting": {
"description": "Cloud provider reporting labels (project, build, session)",
"type": "object",
"properties": {
"project": {
"type": "string"
},
"build": {
"type": "string"
},
"session": {
"type": "string"
}
}
},
"headless": {
"description": "Run browser in headless mode (default: true)",
"type": "boolean"
},
"windowWidth": {
"default": 1920,
"description": "Browser window width",
"type": "number",
"minimum": 400,
"maximum": 3840
},
"windowHeight": {
"default": 1080,
"description": "Browser window height",
"type": "number",
"minimum": 400,
"maximum": 2160
},
"deviceName": {
"description": "Mobile device/emulator/simulator name (required for ios/android)",
"type": "string"
},
"deviceQuery": {
"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"
},
"platformVersion": {
"description": "OS version for mobile sessions (e.g., \"17.0\", \"14\"). Mobile (ios/android) only.",
"type": "string"
},
"appPath": {
"description": "Path to app file (.app/.apk/.ipa)",
"type": "string"
},
"automationName": {
"description": "Automation driver",
"type": "string",
"enum": [
"XCUITest",
"UiAutomator2"
]
},
"autoGrantPermissions": {
"description": "Auto-grant app permissions (default: true)",
"type": "boolean"
},
"autoAcceptAlerts": {
"description": "Auto-accept alerts (default: true)",
"type": "boolean"
},
"autoDismissAlerts": {
"description": "Auto-dismiss alerts (default: false)",
"type": "boolean"
},
"appWaitActivity": {
"description": "Activity to wait for on Android launch",
"type": "string"
},
"udid": {
"description": "Unique Device Identifier for iOS real device",
"type": "string"
},
"noReset": {
"description": "Preserve app data between sessions",
"type": "boolean"
},
"fullReset": {
"description": "Uninstall app before/after session",
"type": "boolean"
},
"newCommandTimeout": {
"default": 300,
"description": "Appium command timeout in seconds",
"type": "number",
"minimum": 0
},
"trace": {
"description": "Enable trace recording — produces a Playwright-compatible zip saved to .trace/ on close_session, playable at player.vibium.dev.",
"type": "boolean"
},
"attach": {
"description": "Attach to existing Chrome instead of launching",
"type": "boolean"
},
"attachConfig": {
"description": "Chrome remote debugging connection (attach mode only, defaults: port 9222, host localhost)",
"type": "object",
"properties": {
"port": {
"default": 9222,
"type": "number"
},
"host": {
"default": "localhost",
"type": "string"
}
}
},
"webdriverConfig": {
"description": "Existing W3C WebDriver endpoint connection (provider: \"external\" only). Defaults to 127.0.0.1:4445/.",
"type": "object",
"properties": {
"protocol": {
"default": "http",
"type": "string"
},
"hostname": {
"default": "127.0.0.1",
"type": "string"
},
"port": {
"default": 4445,
"type": "number"
},
"path": {
"default": "/",
"type": "string"
}
}
},
"appiumConfig": {
"description": "Appium server connection (local provider only)",
"type": "object",
"properties": {
"host": {
"type": "string"
},
"port": {
"type": "number"
},
"path": {
"type": "string"
},
"protocol": {
"type": "string"
}
}
},
"region": {
"default": "eu-central-1",
"description": "Sauce Labs region (default: eu-central-1). Only used with provider: \"saucelabs\".",
"type": "string",
"enum": [
"us-west-1",
"eu-central-1",
"apac-southeast-1"
]
},
"tunnel": {
"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.",
"anyOf": [
{
"type": "string",
"const": "external"
},
{
"type": "boolean"
}
]
},
"tunnelName": {
"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"
},
"browserstackLocal": {
"description": "Deprecated: use \"tunnel\" instead. Enable BrowserStack Local tunnel routing.",
"anyOf": [
{
"type": "string",
"const": "external"
},
{
"type": "boolean"
}
]
},
"saucelabsLocal": {
"description": "Deprecated: use \"tunnel\" instead. Enable Sauce Connect tunnel routing.",
"anyOf": [
{
"type": "string",
"const": "external"
},
{
"type": "boolean"
}
]
},
"testmuLocal": {
"description": "Deprecated: use \"tunnel\" instead. Enable TestMu Tunnel routing.",
"anyOf": [
{
"type": "string",
"const": "external"
},
{
"type": "boolean"
}
]
},
"navigationUrl": {
"description": "URL to navigate to after starting",
"type": "string"
},
"capabilities": {
"description": "Additional capabilities to merge. For Electron, configure the official service under \"wdio:electronServiceOptions\" (for example appBinaryPath, appEntryPoint, appArgs, logDir, or captureRendererLogs).",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"required": [
"platform"
]
}Annotations{
"title": "Start Session",
"destructiveHint": false
} | — | Non-destructive | — |
swipePerforms 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.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"direction": {
"type": "string",
"enum": [
"up",
"down",
"left",
"right"
],
"description": "Swipe direction"
},
"duration": {
"description": "Swipe duration in milliseconds (default: 500)",
"type": "number",
"minimum": 100,
"maximum": 5000
},
"percent": {
"description": "Percentage of screen to swipe (0-1, default: 0.5 for up/down, 0.95 for left/right)",
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"direction"
]
}Annotations{
"title": "Swipe Screen",
"destructiveHint": false
} | — | Non-destructive | — |
switch_contextSwitches 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.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"context": {
"type": "string",
"description": "Context name to switch to (e.g., \"NATIVE_APP\", \"WEBVIEW_com.example.app\", or use index from wdio://session/current/contexts resource)"
}
},
"required": [
"context"
]
}Annotations{
"title": "Switch Context",
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
switch_frameSwitches 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.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"selector": {
"description": "CSS/XPath selector for the iframe element. Omit to switch back to the top-level frame.",
"type": "string"
}
}
}Annotations{
"title": "Switch Frame",
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
switch_tabFocuses 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.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"handle": {
"description": "Window handle to switch to",
"type": "string"
},
"index": {
"description": "0-based tab index to switch to",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
}
}Annotations{
"title": "Switch Browser Tab",
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
tap_elementTaps 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.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"selector": {
"description": "Element selector (CSS, XPath, accessibility ID, or UiAutomator)",
"type": "string"
},
"x": {
"description": "X coordinate for screen tap (if no selector provided)",
"type": "number"
},
"y": {
"description": "Y coordinate for screen tap (if no selector provided)",
"type": "number"
}
}
}Annotations{
"title": "Tap Element",
"destructiveHint": false
} | — | Non-destructive | — |
trigger_electron_deeplinkTriggers a deeplink through the active Electron application. The Electron session must be started with electronDeeplinkScheme matching the URL scheme. Packaged binaries are required for deeplinks on Windows and Linux.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Deeplink URI to trigger through the Electron service."
}
},
"required": [
"url"
]
}Annotations{
"title": "Trigger Electron Deeplink",
"destructiveHint": true
} | — | Destructive | — |
upload_appUpload 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.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
"browserstack",
"saucelabs",
"testmu",
"testingbot",
"digitalai"
],
"description": "Cloud provider"
},
"path": {
"type": "string",
"description": "Absolute path to the .apk or .ipa file"
},
"customId": {
"description": "Optional custom ID for the app (used to reference it later)",
"type": "string"
},
"region": {
"default": "eu-central-1",
"description": "Sauce Labs region (default: eu-central-1)",
"type": "string",
"enum": [
"us-west-1",
"eu-central-1",
"apac-southeast-1"
]
}
},
"required": [
"provider",
"path"
]
}Annotations{
"title": "Upload App to Cloud Provider",
"destructiveHint": false
} | — | Non-destructive | — |
wdio://browserstack/local-binaryBrowserStack Local binary download URL and daemon setup instructions for the current platform. MUST be read and followed before using browserstackLocal: true in start_session.
wdio://saucelabs/local-binarySauce Connect Proxy binary download URL and daemon setup instructions for the current platform. Only needed for tunnel: 'external' — when tunnel: true the SDK auto-manages Sauce Connect for you.
wdio://session/current/accessibilityAccessibility tree for the current page. Returns all elements by default.
wdio://session/current/capabilitiesRaw capabilities returned by the WebDriver/Appium server for the current session. Use for debugging — shows the actual values the driver accepted, including defaults applied by BrowserStack or Appium.
wdio://session/current/codeGenerated WebdriverIO JS code for the currently active session
wdio://session/current/contextCurrently active context
wdio://session/current/contextsAvailable contexts (NATIVE_APP, WEBVIEW)
wdio://session/current/cookiesCookies for the current session
wdio://session/current/elementsInteractable elements on the current page. Prefer this over screenshot — returns ready-to-use selectors, faster, and far fewer tokens. Only use screenshot for visual verification or debugging.
wdio://session/current/geolocationCurrent device geolocation
wdio://session/current/logsSession logs, console errors, and crash reports for the current session. Auto-detects session type — browser: console logs + JS exceptions via getLogs('browser'); Android: system/crash logs via getLogs('logcat'); iOS: crash/panic + system logs via getLogs('crashlog') and getLogs('syslog'). NOTE: Reading this resource clears the log buffer per protocol spec — subsequent reads return only entries accumulated since the last read. Browser logs require Chromium (Chrome/Edge).
wdio://session/current/screenshotScreenshot of the current page
wdio://session/current/stepsJSON step log for the currently active session
wdio://session/current/tabsBrowser tabs in the current session
wdio://sessionsJSON index of all browser and app sessions with metadata and step counts
wdio://testingbot/local-binaryTestingBot Tunnel download URL and daemon setup instructions. The tunnel is a single cross-platform Java JAR (requires Java 11+). MUST be read and followed before using tunnel: "external" in start_session with provider: testingbot.
wdio://testmu/local-binaryTestMu Tunnel binary download URL and daemon setup instructions for the current platform. MUST be read and followed before using tunnel: true in start_session with provider: testmu.
wdio://session/{sessionId}/codeGenerated WebdriverIO JS code for a specific session by ID
wdio://session/current/app-state/{bundleId}App state for a given bundle ID
wdio://session/{sessionId}/stepsJSON step log for a specific session by ID
| Endpoint | Transport | Authentication | Health | Observed |
|---|---|---|---|---|
| No verified remote endpoint is linked. | ||||
Install the selected package version with: npm install --save-exact @wdio/mcp@3.12.0
WebDriverIO MCP Server exposed 33 tools during independent protocol observation, including attach_session, click_element, close_session, delete_cookies, drag_and_drop, emulate_device, execute_electron_script, execute_script, and others.
Our scanner tested version 3.12.0 without proving a finding in the methods exercised. This is not a guarantee that every deployment is secure.
Curated product and capability guides containing this catalog record.