microsoft/playwright · critical · Error
Unsupported channel: "${this._browserChannel}"
Error message
Unsupported channel: "${this._browserChannel}" What it means
Thrown by CdpRelay's `_openConnectPageInBrowser` when `registry.findExecutable(channel)` returns nothing for the resolved channel — i.e. the channel/browser name is not a known registry entry. The relay needs a real executable to spawn the browser that hosts the extension, so an unrecognized channel is fatal.
Source
Thrown at packages/playwright-core/src/tools/mcp/cdpRelay.ts:154
url.searchParams.set('mcpRelayUrl', mcpRelayEndpoint);
const client = {
name: clientName,
// Not used anymore.
version: undefined,
};
url.searchParams.set('client', JSON.stringify(client));
url.searchParams.set('protocolVersion', this._protocolVersion.toString());
const token = process.env.PLAYWRIGHT_MCP_EXTENSION_TOKEN;
if (token)
url.searchParams.set('token', token);
const href = url.toString();
const channel = registry.isChromiumAlias(this._browserChannel) ? 'chromium' : this._browserChannel;
let executablePath = this._executablePath;
if (!executablePath) {
const executableInfo = registry.findExecutable(channel);
if (!executableInfo)
throw new Error(`Unsupported channel: "${this._browserChannel}"`);
executablePath = executableInfo.executablePath();
if (!executablePath)
throw new Error(`"${this._browserChannel}" executable not found. Make sure it is installed at a standard location.`);
}
const args: string[] = [];
// The default profile dir is not passed explicitly, the browser resolves it on its own.
if (this._customUserDataDir)
args.push(`--user-data-dir=${this._customUserDataDir}`);
if (this._profileDirectory)
args.push(`--profile-directory=${this._profileDirectory}`);
if (os.platform() === 'linux' && channel === 'chromium')
args.push('--no-sandbox');
args.push(href);
spawn(executablePath, args, {
windowsHide: true,
detached: true,
shell: false,View on GitHub (pinned to c8fc3bf8d3)
Solutions
- Use a known channel name (e.g. `chrome`, `msedge`, `chromium`, `chrome-for-testing`) or pass an explicit `--executable-path`.
- Upgrade/downgrade Playwright so its registry knows the channel you need.
- If using a custom build, supply `executablePath` directly to bypass registry lookup.
Example fix
# before playwright mcp --extension --browser crome # after playwright mcp --extension --browser chrome # or playwright mcp --extension --executable-path /opt/my-chrome/chrome
Defensive patterns
Strategy: validation
Validate before calling
import * as registry from '@tools/mcp/registry';
function assertChannelSupported(channel: string) {
const c = registry.isChromiumAlias(channel) ? 'chromium' : channel;
if (!registry.findExecutable(c))
throw new Error(`Unsupported channel: ${channel}. Use a known channel or pass --executable-path.`);
} Prevention
- Use a well-known channel name (chrome, msedge, chromium, chrome-for-testing).
- Provide --executable-path for custom/unaligned builds.
- Keep Playwright version current so the registry knows your channel.
When it happens
Trigger: Passing a `browserChannel` that is neither a Chromium alias (which normalizes to `chromium`) nor a registry-known channel (e.g. a typo like `crome`, an unbundled build name, or a channel not registered in this Playwright version).
Common situations: Typo in `--browser`/`PLAYWRIGHT_MCP_BROWSER`; selecting a channel that exists in a newer/older Playwright registry; environment pointing to a custom build whose channel name was not registered.
Related errors
- "${this._browserChannel}" executable not found. Make sure it
- Failed to create tab
- Extension not connected
- Unexpected WebSocket state: ${this._ws.readyState}
- ${path}: expected channel ${names.toString()}
AI-assisted analysis of microsoft/playwright@c8fc3bf8d3 (2026-08-12).
Data as JSON: /api/errors/6a2889b85b5bf962.
Report an issue: GitHub.