跳到主要内容

Transport

The WebdriverIO MCP server supports two transport modes: stdio (default) and HTTP.

stdio (default)

stdio is the standard MCP transport. The AI client launches the server as a child process and communicates over stdin/stdout.

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

Use stdio for local setups with Claude Desktop, Claude Code, Cursor, and similar clients that manage the server lifecycle themselves.


HTTP (Streamable HTTP)

HTTP mode runs the server as a standalone process that listens on a port. Clients connect to it over HTTP rather than launching it as a subprocess. Use this when:

  • Your client doesn't support subprocess-based MCP (e.g. llama.cpp's web UI)
  • You want to share one server instance across multiple clients
  • You're running in Codex secure mode where subprocess execution is restricted
  • You want to keep the server running across multiple client sessions

Starting in HTTP mode

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

The server exposes a single endpoint: http://localhost:<port>/mcp

Full options

npx @wdio/mcp --http \
--port 3000 \
--allowedHosts "localhost,127.0.0.1,::1" \
--allowedOrigins "http://localhost:5173,https://myapp.example.com"
FlagDefaultDescription
--httpEnable HTTP transport mode
--port3000Port to listen on
--allowedHostslocalhost,127.0.0.1,::1Comma-separated allowed Host header values (DNS rebinding protection)
--allowedOrigins(none — browsers blocked)Comma-separated allowed Origin values for CORS. Use * to allow all origins.

Security

--allowedHosts — Protects against DNS rebinding attacks. Only requests with a Host header matching this list are accepted. The default (localhost,127.0.0.1,::1) is safe for local use. If you expose the server on a public interface, add your hostname here.

--allowedOrigins — Controls which browser origins can make cross-origin requests (CORS). By default, no browser origins are allowed. This blocks access from arbitrary websites while still allowing non-browser clients (CLI tools, API clients). Set to * to allow all origins, or list specific origins.

Requests from non-browser clients (no Origin header) are not subject to the CORS check; only --allowedHosts applies.


Use Cases

llama.cpp web UI

llama.cpp's web UI runs in the browser and sends an Origin header on every request. Start the server with --allowedOrigins matching the UI's origin:

# llama.cpp web UI runs at http://localhost:8080
npx @wdio/mcp --http --port 3000 --allowedOrigins "http://localhost:8080"

# Or allow all local origins
npx @wdio/mcp --http --port 3000 --allowedOrigins "*"

In llama.cpp's settings, add an MCP server pointing to http://localhost:3000/mcp.


Codex secure mode

OpenAI Codex runs in a sandboxed environment without subprocess support. Use HTTP transport so Codex can reach the MCP server running on your host machine:

# Start on your host
npx @wdio/mcp --http --port 3000

In your Codex MCP configuration, set the server URL to http://localhost:3000/mcp (or your host's IP if Codex runs in a VM).


Per-request architecture

Each HTTP request creates a fresh MCP server instance. This means:

  • Clients can reconnect after dropping a connection without errors.
  • Multiple clients can connect simultaneously (each gets an independent MCP session).
  • Session state (the active browser/app) is shared via global state, not transport state.

There is no mutex; requests are handled concurrently. MCP protocol statefulness (initialize → tool calls) is handled per-request.

Welcome! How can I help?

WebdriverIO AI Copilot