Compare commits

...

7 Commits

Author SHA1 Message Date
Pavel Feldman
f639130aef chore: update the skills install help 2026-02-05 17:27:34 -08:00
Pavel Feldman
e39e83bb13 chore: mark v0.0.64 (#1371) 2026-02-05 17:11:02 -08:00
Pavel Feldman
de6776f318 update cli readme
Added installation instructions for skills and updated CLI commands.
2026-02-03 15:59:09 -08:00
Pavel Feldman
822d81e02b restoring readme 2026-02-03 15:52:13 -08:00
Pavel Feldman
fed2475a86 Enhance README with installation and feature details 2026-02-03 15:43:17 -08:00
Pavel Feldman
34679cc689 Update readme for new skills 2026-02-03 15:39:45 -08:00
Pavel Feldman
c83315e4c9 chore: mark v0.0.63 (#1365) 2026-02-03 15:21:11 -08:00
15 changed files with 259 additions and 131 deletions

View File

@@ -0,0 +1,4 @@
# How to roll skills
- Read skill file at node_modules/playwright/lib/skill/SKILL.md
- Update README.md at packages/playwright-cli/README.md with the new relevant information from skill.

View File

@@ -21,7 +21,7 @@ jobs:
- name: Ensure no changes
run: git diff --exit-code
test_mcp:
test:
strategy:
fail-fast: false
matrix:
@@ -38,9 +38,24 @@ jobs:
run: npm ci
- name: Playwright install
run: npx playwright install --with-deps
- name: Run tests
run: npm run test
working-directory: ./packages/playwright-mcp
- name: Build
run: npm run build
- name: Run playwright-mcp tests
id: test-mcp
run: npm run test --workspace=packages/playwright-mcp
continue-on-error: true
- name: Run playwright-cli tests
id: test-cli
run: npm run test --workspace=packages/playwright-cli
continue-on-error: true
- name: Run extension tests
id: test-extension
if: matrix.os == 'macos-15'
run: npm run test --workspace=packages/extension
continue-on-error: true
- name: Check test results
if: steps.test-mcp.outcome == 'failure' || steps.test-cli.outcome == 'failure' || steps.test-extension.outcome == 'failure'
run: exit 1
test_mcp_docker:
runs-on: ubuntu-latest
@@ -73,35 +88,3 @@ jobs:
working-directory: ./packages/playwright-mcp
env:
MCP_IN_DOCKER: 1
test_extension:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: Use Node.js 20
uses: actions/setup-node@v4
with:
node-version: '20' # crypto.randomUUID(); stalls in v18.20.8
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Playwright install
run: npx playwright install --with-deps
- name: Build extension
run: npm run build
working-directory: ./packages/extension
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: extension
path: ./extension/dist
retention-days: 7
- name: Run tests
run: |
if [[ "$(uname)" == "Linux" ]]; then
xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- npm run test
else
npm run test
fi
shell: bash
working-directory: ./packages/extension

View File

@@ -343,6 +343,7 @@ Playwright MCP server supports following arguments. They can be provided in the
| --caps <caps> | comma-separated list of additional capabilities to enable, possible values: vision, pdf, devtools.<br>*env* `PLAYWRIGHT_MCP_CAPS` |
| --cdp-endpoint <endpoint> | CDP endpoint to connect to.<br>*env* `PLAYWRIGHT_MCP_CDP_ENDPOINT` |
| --cdp-header <headers...> | CDP headers to send with the connect request, multiple can be specified.<br>*env* `PLAYWRIGHT_MCP_CDP_HEADER` |
| --cdp-timeout <timeout> | timeout in milliseconds for connecting to CDP endpoint, defaults to 30000ms<br>*env* `PLAYWRIGHT_MCP_CDP_TIMEOUT` |
| --codegen <lang> | specify the language to use for code generation, possible values: "typescript", "none". Default is "typescript".<br>*env* `PLAYWRIGHT_MCP_CODEGEN` |
| --config <path> | path to the configuration file.<br>*env* `PLAYWRIGHT_MCP_CONFIG` |
| --console-level <level> | level of console messages to return: "error", "warning", "info", "debug". Each level includes the messages of more severe levels.<br>*env* `PLAYWRIGHT_MCP_CONSOLE_LEVEL` |

93
package-lock.json generated
View File

@@ -1,19 +1,19 @@
{
"name": "playwright-mcp-internal",
"version": "0.0.62",
"version": "0.0.65",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "playwright-mcp-internal",
"version": "0.0.62",
"version": "0.0.65",
"license": "Apache-2.0",
"workspaces": [
"packages/*"
],
"devDependencies": {
"@modelcontextprotocol/sdk": "^1.25.2",
"@playwright/test": "1.59.0-alpha-1769819922000",
"@playwright/test": "1.59.0-alpha-1770338664000",
"@types/node": "^24.3.0"
}
},
@@ -806,13 +806,13 @@
"link": true
},
"node_modules/@playwright/test": {
"version": "1.59.0-alpha-1769819922000",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.59.0-alpha-1769819922000.tgz",
"integrity": "sha512-Oc24xlFGpqs+fUqnLXLbfVTIaN/+ws2Nb9R7B1laIXn1ZpI42UT5b3Bu1Lh3DiyKQStO2Il+ljwL9+ZF5rLFLQ==",
"version": "1.59.0-alpha-1770338664000",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.59.0-alpha-1770338664000.tgz",
"integrity": "sha512-GRgwREMJ36Ici5lV/16ZHMd+HEh4XuT4jSHPlvOyNBcefPi8JsBFI/kMl7BChjOpitrDOxhZJAgdHvQkPeQu0w==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"playwright": "1.59.0-alpha-1769819922000"
"playwright": "1.59.0-alpha-1770338664000"
},
"bin": {
"playwright": "cli.js"
@@ -2562,12 +2562,12 @@
}
},
"node_modules/playwright": {
"version": "1.59.0-alpha-1769819922000",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.0-alpha-1769819922000.tgz",
"integrity": "sha512-SVy14jHP15zyxPHfQSnpA628sRG/dX5SSR9VymG6aI9tRUlBhInQgmeW0YcX65aaMrmhIdo50BUYtDn+kcjYEQ==",
"version": "1.59.0-alpha-1770338664000",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.0-alpha-1770338664000.tgz",
"integrity": "sha512-YKR5ko/eQFtcvlZPTJN3BmVFRrIxuzKw8sqZgP9XY+JvQEDlAsGDNsBd7/TxWLZYzCC8HHETB7cW6Ru2DEkTWA==",
"license": "Apache-2.0",
"dependencies": {
"playwright-core": "1.59.0-alpha-1769819922000"
"playwright-core": "1.59.0-alpha-1770338664000"
},
"bin": {
"playwright": "cli.js"
@@ -2584,9 +2584,9 @@
"link": true
},
"node_modules/playwright-core": {
"version": "1.59.0-alpha-1769819922000",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.0-alpha-1769819922000.tgz",
"integrity": "sha512-mHxFU9XPUiC1HWkZWuTG1tbZxjSWkjHhsHFyrxRs3KDTBsSrsRwaa/lw6awSzubLqDI7OsuqXptnO/AB7ozhoQ==",
"version": "1.59.0-alpha-1770338664000",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.0-alpha-1770338664000.tgz",
"integrity": "sha512-Qlaafyf5T1GN/ynNJVVdJyD26HjzqvgRC62jNdfaFoMkTvqSlV4of9O6BV7c1x5ZJpplKXHecAPWKSWNdea7Dw==",
"license": "Apache-2.0",
"bin": {
"playwright-core": "cli.js"
@@ -3306,7 +3306,7 @@
},
"packages/extension": {
"name": "@playwright/mcp-extension",
"version": "0.0.62",
"version": "0.0.65",
"license": "Apache-2.0",
"devDependencies": {
"@types/chrome": "^0.0.315",
@@ -3325,12 +3325,12 @@
},
"packages/playwright-cli": {
"name": "@playwright/cli",
"version": "0.0.62",
"version": "0.0.65",
"license": "Apache-2.0",
"dependencies": {
"minimist": "^1.2.5",
"playwright": "1.59.0-alpha-1769819922000",
"playwright-core": "1.59.0-alpha-1769819922000"
"playwright": "1.59.0-alpha-1770338664000",
"playwright-core": "1.59.0-alpha-1770338664000"
},
"bin": {
"playwright-cli": "playwright-cli.js"
@@ -3341,67 +3341,20 @@
},
"packages/playwright-cli-stub": {
"name": "playwright-cli",
"version": "0.0.62",
"version": "0.0.65",
"license": "Apache-2.0",
"dependencies": {
"@playwright/cli": "0.0.61"
"@playwright/cli": "0.0.65"
},
"devDependencies": {}
},
"packages/playwright-cli-stub/node_modules/@playwright/cli": {
"version": "0.0.61",
"resolved": "https://registry.npmjs.org/@playwright/cli/-/cli-0.0.61.tgz",
"integrity": "sha512-TFovFfiKCQHuNhZCVHySPHkcvWXQFuKDSXYPexFzwoJ/aHJjpfBIs6Srlv3aowtZ3MQ1A0/Krq7aUMNnFvhUkA==",
"license": "Apache-2.0",
"dependencies": {
"minimist": "^1.2.5",
"playwright": "1.59.0-alpha-1769452054000",
"playwright-core": "1.59.0-alpha-1769452054000"
},
"bin": {
"playwright-cli": "playwright-cli.js"
},
"engines": {
"node": ">=18"
}
},
"packages/playwright-cli-stub/node_modules/playwright": {
"version": "1.59.0-alpha-1769452054000",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.0-alpha-1769452054000.tgz",
"integrity": "sha512-emHM/Pt6ACb0zZOOZNNQg6ahAbpiRKgWxmXeqhcmXWYbZ8zk+GIXavyBHYe5O3KC7GEHizECu83x1EldD3vs7Q==",
"license": "Apache-2.0",
"dependencies": {
"playwright-core": "1.59.0-alpha-1769452054000"
},
"bin": {
"playwright": "cli.js"
},
"engines": {
"node": ">=18"
},
"optionalDependencies": {
"fsevents": "2.3.2"
}
},
"packages/playwright-cli-stub/node_modules/playwright-core": {
"version": "1.59.0-alpha-1769452054000",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.0-alpha-1769452054000.tgz",
"integrity": "sha512-JulA7CBOf/Ks/MrXVpylMn9NLKRI933ZOR7A6lqW+VsAgSxrAE+j5BsxArSBaO1dUI1EfrVl0hDzVs4ftnWhaw==",
"license": "Apache-2.0",
"bin": {
"playwright-core": "cli.js"
},
"engines": {
"node": ">=18"
}
},
"packages/playwright-mcp": {
"name": "@playwright/mcp",
"version": "0.0.62",
"version": "0.0.65",
"license": "Apache-2.0",
"dependencies": {
"playwright": "1.59.0-alpha-1769819922000",
"playwright-core": "1.59.0-alpha-1769819922000"
"playwright": "1.59.0-alpha-1770338664000",
"playwright-core": "1.59.0-alpha-1770338664000"
},
"bin": {
"playwright-mcp": "cli.js"

View File

@@ -1,6 +1,6 @@
{
"name": "playwright-mcp-internal",
"version": "0.0.62",
"version": "0.0.65",
"private": true,
"repository": {
"type": "git",
@@ -25,7 +25,7 @@
],
"devDependencies": {
"@modelcontextprotocol/sdk": "^1.25.2",
"@playwright/test": "1.59.0-alpha-1769819922000",
"@playwright/test": "1.59.0-alpha-1770338664000",
"@types/node": "^24.3.0"
}
}

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 3,
"name": "Playwright MCP Bridge",
"version": "0.0.61",
"version": "0.0.65",
"description": "Share browser tabs with Playwright MCP server",
"key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9nMS2b0WCohjVHPGb8D9qAdkbIngDqoAjTeSccHJijgcONejge+OJxOQOMLu7b0ovt1c9BiEJa5JcpM+EHFVGL1vluBxK71zmBy1m2f9vZF3HG0LSCp7YRkum9rAIEthDwbkxx6XTvpmAY5rjFa/NON6b9Hlbo+8peUSkoOK7HTwYnnI36asZ9eUTiveIf+DMPLojW2UX33vDWG2UKvMVDewzclb4+uLxAYshY7Mx8we/b44xu+Anb/EBLKjOPk9Yh541xJ5Ozc8EiP/5yxOp9c/lRiYUHaRW+4r0HKZyFt0eZ52ti2iM4Nfk7jRXR7an3JPsUIf5deC/1cVM/+1ZQIDAQAB",
"permissions": [

View File

@@ -1,6 +1,6 @@
{
"name": "@playwright/mcp-extension",
"version": "0.0.62",
"version": "0.0.65",
"description": "Playwright MCP Browser Extension",
"private": true,
"repository": {

View File

@@ -400,7 +400,7 @@ test.describe('CLI with extension', () => {
const confirmationPage = await confirmationPagePromise;
// Click the Allow button
await confirmationPage.getByRole('button', { name: 'Allow' }).click();
await confirmationPage.getByRole('button', { name: 'Connect' }).first().click();
// Wait for the CLI command to complete
const { output } = await cliPromise;

View File

@@ -1,6 +1,6 @@
{
"name": "playwright-cli",
"version": "0.0.62",
"version": "0.0.65",
"description": "Playwright CLI",
"repository": "github:Microsoft/playwright-cli",
"homepage": "https://playwright.dev",
@@ -14,7 +14,7 @@
},
"license": "Apache-2.0",
"dependencies": {
"@playwright/cli": "0.0.61"
"@playwright/cli": "0.0.65"
},
"devDependencies": {}
}

View File

@@ -27,6 +27,23 @@ npm install -g @playwright/cli@latest
playwright-cli --help
```
### Installing skills
Claude Code, GitHub Copilot and others will use the locally installed skills.
```bash
playwright-cli install --skills
```
### Skills-less operation
Point your agent at the CLI and let it cook. It'll read the skill off `playwright-cli --help` on its own:
```
Test the "add todo" flow on https://demo.playwright.dev/todomvc using playwright-cli.
Check playwright-cli --help for available commands.
```
## Demo
```
@@ -88,13 +105,13 @@ Playwright CLI will use a dedicated persistent profile by default. It means that
your cookies and other storage state will be preserved between the calls. You can use different
instances of the browser for different projects with sessions.
Following will result in two browsers with separate profiles being available. Pass `--session` to
Following will result in two browsers with separate profiles being available. Pass `-s=` to
the invocation to talk to a specific browser.
```bash
playwright-cli open https://playwright.dev
playwright-cli --session=example open https://example.com
playwright-cli session-list
playwright-cli -s=example open https://example.com
playwright-cli list
```
You can run your coding agent with the `PLAYWRIGHT_CLI_SESSION` environment variable:
@@ -103,15 +120,14 @@ You can run your coding agent with the `PLAYWRIGHT_CLI_SESSION` environment vari
PLAYWRIGHT_CLI_SESSION=todo-app claude .
```
Or instruct it to prepend `--session` to the calls.
Or instruct it to prepend `-s=` to the calls.
Manage your sessions as follows:
```bash
playwright-cli session-list # list all sessions
playwright-cli session-stop [name] # stop session
playwright-cli session-stop-all # stop all sessions
playwright-cli session-delete [name] # delete session data along with the profiles
playwright-cli list # list all sessions
playwright-cli close-all # close all browsers
playwright-cli kill-all # forcefully kill all browser processes
```
<!-- BEGIN GENERATED CLI HELP -->
@@ -134,6 +150,7 @@ playwright-cli upload <file> # upload one or multiple files
playwright-cli check <ref> # check a checkbox or radio button
playwright-cli uncheck <ref> # uncheck a checkbox or radio button
playwright-cli snapshot # capture page snapshot to obtain element ref
playwright-cli snapshot --filename=f # save snapshot to specific file
playwright-cli eval <func> [ref] # evaluate javascript expression on page or element
playwright-cli dialog-accept [prompt] # accept a dialog
playwright-cli dialog-dismiss # dismiss a dialog
@@ -169,7 +186,9 @@ playwright-cli mousewheel <dx> <dy> # scroll mouse wheel
```bash
playwright-cli screenshot [ref] # screenshot of the current page or element
playwright-cli screenshot --filename=f # save screenshot with specific filename
playwright-cli pdf # save page as pdf
playwright-cli pdf --filename=page.pdf # save pdf with specific filename
```
### Tabs
@@ -181,6 +200,42 @@ playwright-cli tab-close [index] # close a browser tab
playwright-cli tab-select <index> # select a browser tab
```
### Storage
```bash
playwright-cli state-save [filename] # save storage state
playwright-cli state-load <filename> # load storage state
# Cookies
playwright-cli cookie-list [--domain] # list cookies
playwright-cli cookie-get <name> # get a cookie
playwright-cli cookie-set <name> <val> # set a cookie
playwright-cli cookie-delete <name> # delete a cookie
playwright-cli cookie-clear # clear all cookies
# LocalStorage
playwright-cli localstorage-list # list localStorage entries
playwright-cli localstorage-get <key> # get localStorage value
playwright-cli localstorage-set <k> <v> # set localStorage value
playwright-cli localstorage-delete <k> # delete localStorage entry
playwright-cli localstorage-clear # clear all localStorage
# SessionStorage
playwright-cli sessionstorage-list # list sessionStorage entries
playwright-cli sessionstorage-get <k> # get sessionStorage value
playwright-cli sessionstorage-set <k> <v> # set sessionStorage value
playwright-cli sessionstorage-delete <k> # delete sessionStorage entry
playwright-cli sessionstorage-clear # clear all sessionStorage
```
### Network
```bash
playwright-cli route <pattern> [opts] # mock network requests
playwright-cli route-list # list active routes
playwright-cli unroute [pattern] # remove route(s)
```
### DevTools
```bash
@@ -189,6 +244,39 @@ playwright-cli network # list all network requests since loadin
playwright-cli run-code <code> # run playwright code snippet
playwright-cli tracing-start # start trace recording
playwright-cli tracing-stop # stop trace recording
playwright-cli video-start # start video recording
playwright-cli video-stop [filename] # stop video recording
```
### Install
```bash
playwright-cli install --skills # install skills
playwright-cli install-browser # install browser
```
### Configuration
```bash
playwright-cli config [options] # configure session settings
playwright-cli open --browser=chrome # use specific browser
playwright-cli open --extension # connect via browser extension
playwright-cli open --persistent # use persistent profile
playwright-cli open --profile=<path> # use custom profile directory
playwright-cli open --config=file.json # use config file
playwright-cli close # close the browser
playwright-cli delete-data # delete user data for default session
```
### Sessions
```bash
playwright-cli -s=name <cmd> # run command in named session
playwright-cli -s=name close # stop a named browser
playwright-cli -s=name delete-data # delete user data for named browser
playwright-cli list # list all sessions
playwright-cli close-all # close all browsers
playwright-cli kill-all # forcefully kill all browser processes
```
<!-- END GENERATED CLI HELP -->
@@ -343,7 +431,8 @@ Playwright CLI will load config from `playwright-cli.json` by default so that yo
</details>
## Environment
<details>
<summary>Configuration via env</summary>
| Environment |
|-------------|
@@ -389,3 +478,4 @@ Playwright CLI will load config from `playwright-cli.json` by default so that yo
| `PLAYWRIGHT_MCP_USER_AGENT` specify user agent string |
| `PLAYWRIGHT_MCP_USER_DATA_DIR` path to the user data directory. If not specified, a temporary directory will be created. |
| `PLAYWRIGHT_MCP_VIEWPORT_SIZE` specify browser viewport size in pixels, for example "1280x720" |
</details>

View File

@@ -1,6 +1,6 @@
{
"name": "@playwright/cli",
"version": "0.0.62",
"version": "0.0.65",
"description": "Playwright CLI",
"repository": {
"type": "git",
@@ -17,12 +17,12 @@
"scripts": {
"lint": "echo OK",
"build": "echo OK",
"test": "echo OK"
"test": "playwright test"
},
"dependencies": {
"minimist": "^1.2.5",
"playwright": "1.59.0-alpha-1769819922000",
"playwright-core": "1.59.0-alpha-1769819922000"
"playwright": "1.59.0-alpha-1770338664000",
"playwright-core": "1.59.0-alpha-1770338664000"
},
"bin": {
"playwright-cli": "playwright-cli.js"

View File

@@ -16,8 +16,8 @@
*/
const { program } = require('playwright/lib/mcp/terminal/program');
const packageJSON = require('./package.json');
program({ version: packageJSON.version }).catch(e => {
const packageLocation = require.resolve('./package.json');
program(packageLocation).catch(e => {
console.error(e.message);
process.exit(1);
});

View File

@@ -0,0 +1,25 @@
/**
* Copyright (c) Microsoft Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { defineConfig } from '@playwright/test';
export default defineConfig({
testDir: './tests',
fullyParallel: true,
forbidOnly: !!process.env.CI,
workers: process.env.CI ? 2 : undefined,
reporter: 'list',
});

View File

@@ -0,0 +1,72 @@
/**
* Copyright (c) Microsoft Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import path from 'path';
import { spawn } from 'child_process';
import { test, expect } from '@playwright/test';
type CliResult = {
output: string;
error: string;
exitCode: number | null;
};
async function runCli(...args: string[]): Promise<CliResult> {
const cliPath = path.join(__dirname, '../playwright-cli.js');
return new Promise<CliResult>((resolve, reject) => {
let stdout = '';
let stderr = '';
const childProcess = spawn(process.execPath, [cliPath, ...args], {
env: {
...process.env,
PLAYWRIGHT_CLI_INSTALLATION_FOR_TEST: test.info().outputPath(),
},
cwd: test.info().outputPath(),
});
childProcess.stdout?.on('data', (data) => {
stdout += data.toString();
});
childProcess.stderr?.on('data', (data) => {
stderr += data.toString();
});
childProcess.on('close', (code) => {
resolve({
output: stdout.trim(),
error: stderr.trim(),
exitCode: code,
});
});
childProcess.on('error', reject);
});
}
test('open data URL', async ({}) => {
expect(await runCli('open', 'data:text/html,hello', '--persistent')).toEqual(expect.objectContaining({
output: expect.stringContaining('hello'),
exitCode: 0,
}));
expect(await runCli('delete-data')).toEqual(expect.objectContaining({
output: expect.stringContaining('Deleted user data for'),
exitCode: 0,
}));
});

View File

@@ -1,6 +1,6 @@
{
"name": "@playwright/mcp",
"version": "0.0.62",
"version": "0.0.65",
"description": "Playwright Tools for MCP",
"repository": {
"type": "git",
@@ -34,8 +34,8 @@
}
},
"dependencies": {
"playwright": "1.59.0-alpha-1769819922000",
"playwright-core": "1.59.0-alpha-1769819922000"
"playwright": "1.59.0-alpha-1770338664000",
"playwright-core": "1.59.0-alpha-1770338664000"
},
"bin": {
"playwright-mcp": "cli.js"