browser_install
Install the required browser for Playwright MCP to interact with web pages through structured accessibility snapshots, resolving browser not installed errors.
Instructions
Install the browser specified in the config. Call this if you get an error about the browser not being installed.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Implementation Reference
- src/tools/install.ts:34-53 (handler)The handler function for the 'browser_install' tool that forks the Playwright CLI to install the specified browser channel, captures stdout/stderr, awaits completion, and handles errors by rejecting with output.handle: async (context, params, response) => { const channel = context.config.browser?.launchOptions?.channel ?? context.config.browser?.browserName ?? 'chrome'; const cliUrl = import.meta.resolve('playwright/package.json'); const cliPath = path.join(fileURLToPath(cliUrl), '..', 'cli.js'); const child = fork(cliPath, ['install', channel], { stdio: 'pipe', }); const output: string[] = []; child.stdout?.on('data', data => output.push(data.toString())); child.stderr?.on('data', data => output.push(data.toString())); await new Promise<void>((resolve, reject) => { child.on('close', code => { if (code === 0) resolve(); else reject(new Error(`Failed to install browser: ${output.join('')}`)); }); }); response.setIncludeTabs(); },
- src/tools/install.ts:26-32 (schema)Tool schema defining name 'browser_install', description, empty input schema (no parameters), and destructive type.schema: { name: 'browser_install', title: 'Install the browser specified in the config', description: 'Install the browser specified in the config. Call this if you get an error about the browser not being installed.', inputSchema: z.object({}), type: 'destructive', },
- src/tools.ts:36-52 (registration)Central registration of all tools by importing and spreading individual tool modules (including install) into the allTools array, which is filtered and used by the browser server backend.export const allTools: Tool<any>[] = [ ...common, ...console, ...dialogs, ...evaluate, ...files, ...install, ...keyboard, ...navigate, ...network, ...mouse, ...pdf, ...screenshot, ...snapshot, ...tabs, ...wait, ];
- src/browserServerBackend.ts:24-50 (registration)The browser server backend imports filteredTools from tools.ts and assigns filtered tools to this._tools during construction, providing tools() and callTool for MCP server integration.import { filteredTools } from './tools.js'; import { packageJSON } from './package.js'; import { defineTool } from './tools/tool.js'; import type { Tool } from './tools/tool.js'; import type { BrowserContextFactory } from './browserContextFactory.js'; import type * as mcpServer from './mcp/server.js'; import type { ServerBackend } from './mcp/server.js'; type NonEmptyArray<T> = [T, ...T[]]; export type FactoryList = NonEmptyArray<BrowserContextFactory>; export class BrowserServerBackend implements ServerBackend { name = 'Playwright'; version = packageJSON.version; private _tools: Tool[]; private _context: Context | undefined; private _sessionLog: SessionLog | undefined; private _config: FullConfig; private _browserContextFactory: BrowserContextFactory; constructor(config: FullConfig, factories: FactoryList) { this._config = config; this._browserContextFactory = factories[0]; this._tools = filteredTools(config);