io.github.webdriverio/mcp
NPM · @WDIO/MCP
MCP server with WebdriverIO for browser and mobile app automation (iOS/Android via Appium)
Available components
Last scanned (21 hours ago)
Scores higher than 76% of npm servers
Category Browser Automation
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security88
- No malware found by supply-chain analysis.Pass
- CVE check failed: a known medium-severity CVE affects glob 10.5.0, reached via @wdio/electron-service > webdriverio > @wdio/config > glob. A fixed version is available. View diagnostics → Fail
- No install/post-install scripts declared.Pass
- Dependency health was assessed across the 400 of 591 dependencies we could resolve, so this covers what we could see, not the whole tree. View diagnostics → Partial
Provenance & Transparency97
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to webdriverio/mcp). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 4 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability83
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (good).Pass
- Tool/resource definitions use about 3289 tokens (~93/item across 35 items; 17 tools + 18 resources), lean.Pass
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management32
- Stability check failed: the tool surface changed between 3.14.0 and 4.1.0: 25 tool removals, 0 breaking changes, 5 additions. See how to fix → Fail
Tool Coverage94
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 83% of tool parameters carry a description.Partial
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 19 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 31 Oct 26 +23
- CVE-2026-118764 affects this package: medium ▼ security
- CVE-2026-118773 affects this package: medium ▼ security
- Known CVEs: unverified → fail ▼ security
- CVE-2023-54404 no longer affects this package ▲ security
- Malware scan: unverified → pass ▲ security
- Dependency health: unverified → partial ▲ functional
- 30 Oct 26 −22
- Malware scan: pass → unverified ▼ security
- Known CVEs: fail → unverified ▼ security
- Schema quality: 79 → 93 ▼ functional
- Dependency health: partial → unverified ▼ functional
- Tool coverage: 78% → 83% ▲ functional
- Package version: 4.0.1 → 4.1.0 functional
- 25 Oct 26 −11
- Stability: pass → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Stability: pass → fail ▼ security
- CVE-2026-40345 no longer affects this package ▲ security
- Tool coverage: 99% → 78% ▼ functional
- Security disclosure: unverified → fail ▼ functional
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: 100 → unverified ▼ functional
- Schema quality: fail → pass ▲ functional
- Schema quality: excellent → good functional
- Package version: 3.14.0 → 4.0.1 functional
- 24 Oct 26 0
- CVE-2023-54404 affects this package: high ▼ security
- Security disclosure: fail → unverified ▼ functional
- 22 Oct 26 +1
- Stability: 0.97 → pass security
- 21 Oct 26 −1
- Stability: pass → 0.97 functional
- 17 Oct 26 +3
- Stability: 0.80 → pass security
- 16 Oct 26 −3
- Stability: pass → 0.80 functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 4 Nov 2026 · Analysed npm/@wdio/mcp@4.1.0
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | npm |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | webdriverio/mcp |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/webdriverio/mcp/.github/workflows/release.yml@refs/heads/main |
| Rekor log index | 3591541453 |
| Predicate type | SLSA build provenance https://slsa.dev/provenance/v1 |
| Subject digest | sha512:c291d3d9ce2b30553ec8577c00a1466304e162a5c06cbfa2febaf0eae367bab933335b0286bfddb8b54d4aa4907dea7b27a16b9f81239d3fd7c4f5b08 |
Background: How many MCP packages publish verified provenance →
Vulnerabilities 2 findings
| ID | CVE | Severity | Vector | Fix available |
|---|---|---|---|---|
| GHSA-3g3m-2fjr-6pw4 | CVE-2026-118773 | medium | yes | |
| GHSA-g3hv-75wg-m249 | CVE-2026-118764 | medium | yes |
Background: What a vulnerability scan can and cannot prove →
Dependencies 400 packages
| Packages resolved | 400 |
|---|---|
| Deprecated | 1 |
| Stale | 109 |
| Tree resolution | Partial |
The dependency tree was only partially resolved, so these counts may be incomplete.
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
click_element ~111
Clicks an element. On web pages the result lists what changed (new elements with refs, or the new page). In apps it does not: take a snapshot to see the new screen. Several steps in a row: perform_actions.
| Name | Type | Req | Description |
|---|---|---|---|
| selector | string | yes | Ref from snapshot (e12) or selector: CSS, XPath, "button=Exact text", "a*=Partial text" |
| session | string | – | Target session: map name or sessionId. Omit to use the default session. |
No output schema declared.
No examples provided.
close_session ~71
Closes the session, or with detach: true disconnects and leaves it running. Attached sessions and Appium sessions with noReset are detached unless detach: false.
| Name | Type | Req | Description |
|---|---|---|---|
| detach | boolean | – | – |
| session | string | – | Target session: map name or sessionId. Omit to use the default session. |
No output schema declared.
No examples provided.
enable_tools ~111
Adds more tools: mocks (mock network requests or Electron APIs); cookies (read, set and delete cookies); device (emulate a phone or tablet, fake the location); extensions (install and open a browser extension); attach (launch Chrome with remote debugging, attach to a running WebDriver or Appium session); elements (raw element list with bounds); cloud-apps (upload and list mobile apps on BrowserStack, Sauce Labs, TestMu, TestingBot, Digital.ai).
| Name | Type | Req | Description |
|---|---|---|---|
| groups | array | yes | – |
No output schema declared.
No examples provided.
execute_script ~115
Runs JavaScript in the page (`return` a value; string args that match a selector are passed as elements) or, on Appium, a "mobile: <command>" with args. Prefer the dedicated tools for clicks and typing.
| Name | Type | Req | Description |
|---|---|---|---|
| args | array | – | Script arguments, or the mobile command's parameters |
| script | string | yes | JavaScript, or "mobile: <command>" on Appium |
| session | string | – | Target session: map name or sessionId. Omit to use the default session. |
No output schema declared.
No examples provided.
get_screenshot ~58
Takes a screenshot of the current page or screen and returns a base64-encoded image, resized and compressed for model context limits.
| Name | Type | Req | Description |
|---|---|---|---|
| session | string | – | Target session: map name or sessionId. Omit to use the default session. |
No output schema declared.
No examples provided.
get_tabs ~62
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.
| Name | Type | Req | Description |
|---|---|---|---|
| session | string | – | Target session: map name or sessionId. Omit to use the default session. |
No output schema declared.
No examples provided.
navigate ~87
Loads 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.
| Name | Type | Req | Description |
|---|---|---|---|
| session | string | – | Target session: map name or sessionId. Omit to use the default session. |
| url | string | yes | The URL to navigate to |
No output schema declared.
No examples provided.
perform_actions ~144
Runs several actions in one call, e.g. fill a form and submit it, on the page or app screen, and returns what each one changed on web pages. Steps the current session does not support are rejected before any step runs. Stops at the first failure, when a step loads a new page, or before a key press that follows a click, select, check or uncheck that changed the page (continue with the new refs). value is the text for fill, the option for select and the keys for press.
| Name | Type | Req | Description |
|---|---|---|---|
| actions | array | yes | – |
| session | string | – | Target session: map name or sessionId. Omit to use the default session. |
No output schema declared.
No examples provided.
press_key ~102
Presses a key or combination in the focused element, e.g. Enter, Tab, Escape, Control+a. The result lists what changed on the page. Several steps in a row: perform_actions.
| Name | Type | Req | Description |
|---|---|---|---|
| keys | string | yes | Key or combination |
| session | string | – | Target session: map name or sessionId. Omit to use the default session. |
| times | integer | – | Press it this many times, e.g. to move a slider |
No output schema declared.
No examples provided.
query_docs ~269
Search the official WebdriverIO documentation and return the most relevant excerpts with page, section and source URL. Use before answering any question about WebdriverIO APIs, configuration, services, reporters, selectors, or debugging. Query with 2-3 distinctive keywords, never a sentence: "appium setup", "devtools trace.zip" and "allure reporter" each return the right page first, while "how do I wire up appium in my config file" does not. A word can also collide with an unrelated page — `wire` matches Wire Protocol — so if a query misses, retry with the exact page title, which beats any paraphrase. Set fullPage for the whole page. To browse instead, read wdio://docs/index for every page title and its slug, then wdio://docs/page/{slug} for one page in full. Cite the `path` of any page you rely on.
| Name | Type | Req | Description |
|---|---|---|---|
| fullPage | boolean | – | Return the full matched pages instead of excerpts |
| limit | integer | – | – |
| query | string | yes | 2-3 distinctive keywords: an API name, config key, page title or feature (e.g. "appium setup", "devtools trace.zip", "browserstack capabilities"). A sentence dilutes the ranking. |
No output schema declared.
No examples provided.
scroll ~79
Scrolls the page vertically by a pixel amount. Browser-only — for mobile scrolling use swipe. Only supports up/down; no horizontal scrolling.
| Name | Type | Req | Description |
|---|---|---|---|
| direction | string | yes | Scroll direction |
| pixels | number | – | Number of pixels to scroll |
| session | string | – | Target session: map name or sessionId. Omit to use the default session. |
No output schema declared.
No examples provided.
select_option ~91
Selects an option of a <select> by its text. The result lists what changed on the page. Several steps in a row: perform_actions.
| Name | Type | Req | Description |
|---|---|---|---|
| selector | string | yes | Ref from snapshot (e12) or selector of the <select> |
| session | string | – | Target session: map name or sessionId. Omit to use the default session. |
| value | string | yes | Option text |
No output schema declared.
No examples provided.
set_value ~136
Replaces the text of an input or textarea. On web pages the result lists what changed (new elements with refs, or the new page). In apps it does not: take a snapshot to see the new screen. To fill several fields or fill and then click, use one perform_actions call.
| Name | Type | Req | Description |
|---|---|---|---|
| selector | string | yes | Ref from snapshot (e12) or selector: CSS, XPath, "button=Exact text", "a*=Partial text" |
| session | string | – | Target session: map name or sessionId. Omit to use the default session. |
| value | string | yes | Text to enter into the element |
No output schema declared.
No examples provided.
snapshot ~183
The page or app screen as an accessibility tree with refs, e.g. `button "Save" [ref=e3]`. Pass refs to perform_actions for several steps, or to click_element/set_value/select_option for one. Default: interactive elements only, plain text is dropped; full: true shows it. find returns only the parts of the page that contain the text (with their refs); full: true includes all text; viewport: true limits it to what is on screen (not together with find).
| Name | Type | Req | Description |
|---|---|---|---|
| find | string | – | Text to look for |
| full | boolean | – | Include text, not just interactive elements |
| scope | string | – | Only below this ref or selector |
| session | string | – | Target session: map name or sessionId. Omit to use the default session. |
| viewport | boolean | – | Only what is on screen |
No output schema declared.
No examples provided.
start_session ~773
Starts a browser, Electron app or mobile app session (closes the active one unless onExisting: "keep"). Browsers run headless at 1280x800 by default; pass navigationUrl to open a page right away. attach: true connects to a running Chrome via CDP.
| Name | Type | Req | Description |
|---|---|---|---|
| app | string | – | Cloud app URL from upload_app (bs://, storage:filename=, lt://, tb://, cloud:<name>) |
| appPath | string | – | Mobile: local .app/.apk/.ipa |
| appWaitActivity | string | – | Android launch activity to wait for |
| appiumConfig | object | – | Local Appium server |
| attach | boolean | – | Attach to a running Chrome (attachConfig, default localhost:9222) |
| attachConfig | object | – | – |
| autoAcceptAlerts | boolean | – | Mobile, default true |
| autoDismissAlerts | boolean | – | – |
| autoGrantPermissions | boolean | – | Mobile, default true |
| automationName | string | – | – |
| browser | string | – | Required for platform browser |
| browserVersion | string | – | Cloud only |
| browserstackLocal | – | – | Deprecated: tunnel |
| capabilities | object | – | Extra capabilities to merge, e.g. "wdio:electronServiceOptions" |
| deviceName | string | – | Mobile: device, emulator or simulator name (required) |
| deviceQuery | string | – | Digital.ai mobile device query |
| electronDeeplinkScheme | string | – | Electron: URI scheme (no ":") allowed for trigger_electron_deeplink |
| electronRootDir | string | – | Electron: project root for Builder/Forge discovery |
| fullReset | boolean | – | – |
| headless | boolean | – | – |
| name | string | – | Name for this session, unique among live sessions. Target it from other tools with session: <name>. |
| navigationUrl | string | – | URL to open after starting |
| networkLogs | string | – | Local Chromium performance log capture (default from WDIO_MCP_NETWORK_LOGS or "none") |
| newCommandTimeout | number | – | Appium, seconds |
| noReset | boolean | – | – |
| onExisting | string | – | close (default) replaces the active session. keep is an explicit opt-in to run this session alongside the existing ones; the new session is NOT made the default when one exists, so target it with ses… |
| os | string | – | Cloud browser OS, provider-native, passed as-is: BrowserStack "OS X"/"Windows", Sauce Labs and TestMu "macOS"/"Windows", TestingBot "SEQUOIA"/"WIN11" |
| osVersion | string | – | Cloud browser OS version, provider-native: BrowserStack and TestMu "Sequoia", Sauce Labs "15", Windows "11"; omit for TestingBot |
| platform | string | yes | – |
| platformVersion | string | – | Mobile OS version, e.g. "17.0" |
| provider | string | – | Default local. Cloud providers read credentials from env. external: a W3C WebDriver endpoint (webdriverConfig). |
| region | string | – | Sauce Labs only |
| reporting | object | – | Cloud reporting labels |
| saucelabsLocal | – | – | Deprecated: tunnel |
| testmuLocal | – | – | Deprecated: tunnel |
| trace | boolean | – | Save a Playwright-compatible trace zip to .trace/ on close_session |
| tunnel | – | – | Cloud: true starts a tunnel, "external" uses a running one |
| tunnelName | string | – | – |
| udid | string | – | iOS real device UDID |
| webdriverConfig | object | – | provider external only |
| windowHeight | number | – | – |
| windowWidth | number | – | – |
No output schema declared.
No examples provided.
switch_frame ~88
Switches into an iframe (ref or selector), or back to the top page when selector is omitted. Later tools act inside the frame until you switch back. Returns the frame's elements.
| Name | Type | Req | Description |
|---|---|---|---|
| selector | string | – | Ref or selector of the iframe; omit for the top page |
| session | string | – | Target session: map name or sessionId. Omit to use the default session. |
No output schema declared.
No examples provided.
switch_tab ~82
Switches to a tab by handle or 0-based index (see get_tabs). Later tools act on that tab.
| Name | Type | Req | Description |
|---|---|---|---|
| handle | string | – | Window handle to switch to |
| index | integer | – | 0-based tab index to switch to |
| session | string | – | Target session: map name or sessionId. Omit to use the default session. |
No output schema declared.
No examples provided.
How do I install the io.github.webdriverio/mcp server?
io.github.webdriverio/mcp runs locally as an npm package, launched with npx -y @wdio/mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · @wdio/mcp
claude mcp add webdriverio-mcp -- npx -y @wdio/mcp
What is the io.github.webdriverio/mcp server?
io.github.webdriverio/mcp is listed in the public MCP registry as io.github.webdriverio/mcp. MCP server with WebdriverIO for browser and mobile app automation (iOS/Android via Appium). This page covers its npm package (@wdio/mcp).
Is the io.github.webdriverio/mcp server safe to use?
io.github.webdriverio/mcp scores 83 out of 100 on VerifyMCP. We recorded 2 known advisories against it as of 4 November 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the io.github.webdriverio/mcp server expose?
io.github.webdriverio/mcp exposes 17 tools: start_session, close_session, navigate, switch_tab, switch_frame, and 12 more. Their descriptions and schemas cost roughly 2,562 tokens of context every time the server is loaded.
Is the io.github.webdriverio/mcp server still maintained?
io.github.webdriverio/mcp is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the io.github.webdriverio/mcp server under?
io.github.webdriverio/mcp declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.