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

  1. Use a known channel name (e.g. `chrome`, `msedge`, `chromium`, `chrome-for-testing`) or pass an explicit `--executable-path`.
  2. Upgrade/downgrade Playwright so its registry knows the channel you need.
  3. 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

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


AI-assisted analysis of microsoft/playwright@c8fc3bf8d3 (2026-08-12). Data as JSON: /api/errors/6a2889b85b5bf962. Report an issue: GitHub.