@playwright-repl/mcp 0.13.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -6
- package/dist/index.js +64 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -20,7 +20,7 @@ It consists of two parts working together: **Dramaturg** (a Chrome extension tha
|
|
|
20
20
|
|
|
21
21
|
| | `@playwright-repl/mcp` | Playwright MCP | Playwriter |
|
|
22
22
|
|---|:---:|:---:|:---:|
|
|
23
|
-
| MCP tools exposed | **
|
|
23
|
+
| MCP tools exposed | **2** (`run_command` + `run_script`) | ~70 tools | **1** `execute` |
|
|
24
24
|
| Uses your real session | ✅ | ❌ | ✅ |
|
|
25
25
|
| Playwright runs inside browser | ✅ | ❌ | ❌ |
|
|
26
26
|
| `expect()` assertions | ✅ | ❌ | ❌ |
|
|
@@ -36,7 +36,7 @@ Claude Desktop / Claude Code (or any MCP client)
|
|
|
36
36
|
↕ MCP (stdio)
|
|
37
37
|
playwright-repl MCP server
|
|
38
38
|
↕ WebSocket bridge
|
|
39
|
-
Chrome extension (
|
|
39
|
+
Chrome extension (offscreen document → service worker)
|
|
40
40
|
↕ CDP / chrome.debugger
|
|
41
41
|
Playwright running in your real Chrome session
|
|
42
42
|
```
|
|
@@ -82,16 +82,17 @@ claude mcp add playwright-repl playwright-repl-mcp
|
|
|
82
82
|
|
|
83
83
|
### 4. Connect
|
|
84
84
|
|
|
85
|
-
|
|
85
|
+
The extension connects to the MCP server automatically — no need to open the side panel. Just make sure Chrome is running with the Dramaturg extension installed.
|
|
86
86
|
|
|
87
87
|
## Dramaturg — The Extension
|
|
88
88
|
|
|
89
|
-
Dramaturg is the other half of the system — it's what gives the MCP server access to your real browser session.
|
|
89
|
+
Dramaturg is the other half of the system — it's what gives the MCP server access to your real browser session.
|
|
90
90
|
|
|
91
91
|
### What the extension does
|
|
92
92
|
|
|
93
93
|
- **Runs Playwright inside Chrome** — uses `playwright-crx` and `chrome.debugger` to execute commands directly in your existing session, no separate browser needed. Because Playwright runs inside the browser rather than relaying through an external process, the entire AI → command → result loop is faster.
|
|
94
|
-
- **Connects automatically** —
|
|
94
|
+
- **Connects automatically** — a persistent offscreen document maintains the WebSocket connection to the MCP server; reconnects if the connection drops. No side panel needed.
|
|
95
|
+
- **Auto-attaches** — on the first command, automatically attaches to the active Chrome tab
|
|
95
96
|
- **Executes commands** — receives `run_command` calls from the AI and runs them against the active tab
|
|
96
97
|
|
|
97
98
|
### Using the extension alongside AI
|
|
@@ -108,7 +109,7 @@ The extension panel is more than just a bridge — it's a full REPL you can use
|
|
|
108
109
|
|
|
109
110
|
The extension connects to the MCP server on port `9876` by default. To check or change the port: extension icon → **Options** → **Bridge Port**. Changes take effect after reopening the panel.
|
|
110
111
|
|
|
111
|
-
When the
|
|
112
|
+
When the extension is connected, the MCP server logs `Extension connected` to stderr. When Chrome is not open or the extension is not installed, `run_command` returns: `Browser not connected. Open Chrome with Dramaturg — it connects automatically.`
|
|
112
113
|
|
|
113
114
|
## Tool: `run_command`
|
|
114
115
|
|
|
@@ -147,6 +148,46 @@ window.location.href
|
|
|
147
148
|
document.querySelectorAll('a').length
|
|
148
149
|
```
|
|
149
150
|
|
|
151
|
+
## Tool: `run_script`
|
|
152
|
+
|
|
153
|
+
Batch execution for multi-line scripts. Two language modes:
|
|
154
|
+
|
|
155
|
+
### Keyword script (`language="pw"`)
|
|
156
|
+
|
|
157
|
+
Splits by line, runs each command sequentially, returns ✓/✗ per line:
|
|
158
|
+
|
|
159
|
+
```
|
|
160
|
+
goto https://demo.playwright.dev/todomvc/
|
|
161
|
+
fill "What needs to be done?" "Buy groceries"
|
|
162
|
+
press Enter
|
|
163
|
+
verify-text "Buy groceries"
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### JavaScript (`language="javascript"`)
|
|
167
|
+
|
|
168
|
+
Runs the entire block as one evaluation — use for Playwright API with assertions:
|
|
169
|
+
|
|
170
|
+
```js
|
|
171
|
+
await page.goto('https://demo.playwright.dev/todomvc/');
|
|
172
|
+
await page.getByPlaceholder('What needs to be done?').fill('Buy groceries');
|
|
173
|
+
await page.keyboard.press('Enter');
|
|
174
|
+
await expect(page.getByText('Buy groceries')).toBeVisible();
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Prompt: `generate-test`
|
|
178
|
+
|
|
179
|
+
A prompt template that guides the AI to generate a passing Playwright test from a described scenario.
|
|
180
|
+
|
|
181
|
+
**Args:**
|
|
182
|
+
- `steps` (required) — describe the test scenario, e.g. "log in with email/password, verify the dashboard loads". Also accepts pasted `.pw` scripts.
|
|
183
|
+
- `url` (optional) — URL to navigate to first.
|
|
184
|
+
|
|
185
|
+
**In Claude Desktop:** click "+" → select `generate-test` → fill in the form → send.
|
|
186
|
+
|
|
187
|
+
**In Claude Code:** `/mcp__playwright-repl__generate-test`
|
|
188
|
+
|
|
189
|
+
The AI navigates the page, takes snapshots, writes Playwright assertions, runs them via `run_script(language="javascript")`, and iterates until all pass.
|
|
190
|
+
|
|
150
191
|
## Tips for AI agents
|
|
151
192
|
|
|
152
193
|
- **Call `snapshot` to understand the page** — it returns the accessibility tree with element refs (`e1`, `e5`, …) that you can use with `click`, `fill`, etc. Useful before interacting with an unfamiliar page.
|
package/dist/index.js
CHANGED
|
@@ -67,6 +67,70 @@ server.registerTool('run_command', {
|
|
|
67
67
|
isError: result.isError,
|
|
68
68
|
};
|
|
69
69
|
});
|
|
70
|
+
const RUN_SCRIPT_DESCRIPTION = `\
|
|
71
|
+
Run a multi-line script, returning combined pass/fail results.
|
|
72
|
+
Useful for replaying a known script without per-step round trips.
|
|
73
|
+
Prefer run_command for AI-driven exploration where you need to observe and adapt after each step.
|
|
74
|
+
|
|
75
|
+
language='pw': each line is a .pw keyword command, run sequentially. Lines starting with # are skipped. Stops on first error.
|
|
76
|
+
language='javascript': the entire script is run as a single JavaScript/Playwright block.`;
|
|
77
|
+
server.registerTool('run_script', {
|
|
78
|
+
description: RUN_SCRIPT_DESCRIPTION,
|
|
79
|
+
inputSchema: {
|
|
80
|
+
script: z.string().describe('The script to execute'),
|
|
81
|
+
language: z.enum(['pw', 'javascript']).describe("'pw' for keyword commands (one per line), 'javascript' for a JS/Playwright block"),
|
|
82
|
+
},
|
|
83
|
+
}, async ({ script, language }) => {
|
|
84
|
+
if (!srv.connected) {
|
|
85
|
+
return {
|
|
86
|
+
content: [{ type: 'text', text: 'Browser not connected. Open Chrome with the playwright-repl extension — it connects automatically.' }],
|
|
87
|
+
isError: true,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
const result = await srv.runScript(script, language);
|
|
91
|
+
return {
|
|
92
|
+
content: [{ type: 'text', text: result.text || 'Done' }],
|
|
93
|
+
isError: result.isError,
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
const GENERATE_TEST_PROMPT = (steps, url) => `\
|
|
97
|
+
Generate a passing Playwright test for the following scenario:
|
|
98
|
+
${steps}
|
|
99
|
+
|
|
100
|
+
Workflow:
|
|
101
|
+
1. ${url ? `Navigate to ${url} using run_command('goto ${url}').` : 'Navigate to the target URL using run_command.'}
|
|
102
|
+
2. Take a snapshot using run_command('snapshot') to understand the page structure.
|
|
103
|
+
3. Interact with the page as needed (click, fill, press) using run_command.
|
|
104
|
+
4. After each interaction, take another snapshot to verify the state before asserting.
|
|
105
|
+
5. Write assertions using \`expect\`.
|
|
106
|
+
|
|
107
|
+
Example pattern:
|
|
108
|
+
await page.goto('https://example.com');
|
|
109
|
+
await expect(page).toHaveTitle('Example', { exact: true });
|
|
110
|
+
await expect(page.getByRole('heading', { name: 'Welcome' })).toBeVisible();
|
|
111
|
+
await page.getByRole('link', { name: 'Get started', exact: true }).click();
|
|
112
|
+
await expect(page.getByRole('heading', { name: 'Installation' })).toBeVisible();
|
|
113
|
+
|
|
114
|
+
Code constraints:
|
|
115
|
+
- Use only \`page\` and \`expect\` — available as globals, do NOT import them
|
|
116
|
+
- Plain \`await\` statements only — no \`import\`, no \`test()\` wrapper, no \`describe()\`
|
|
117
|
+
- Use \`exact: true\` when a locator text might match multiple elements
|
|
118
|
+
|
|
119
|
+
Once you have the code, run it with run_script(language="javascript").
|
|
120
|
+
If any assertion fails, read the error, fix the code, and run again until all pass.
|
|
121
|
+
Show the final passing code.`;
|
|
122
|
+
server.registerPrompt('generate-test', {
|
|
123
|
+
description: 'Generate a passing Playwright test from a described scenario',
|
|
124
|
+
argsSchema: {
|
|
125
|
+
steps: z.string().describe('Describe the test scenario, e.g. "log in with email/password, verify the dashboard loads"'),
|
|
126
|
+
url: z.string().optional().describe('URL to navigate to first (optional)'),
|
|
127
|
+
},
|
|
128
|
+
}, ({ steps, url }) => ({
|
|
129
|
+
messages: [{
|
|
130
|
+
role: 'user',
|
|
131
|
+
content: { type: 'text', text: GENERATE_TEST_PROMPT(steps, url) },
|
|
132
|
+
}],
|
|
133
|
+
}));
|
|
70
134
|
const transport = new StdioServerTransport();
|
|
71
135
|
await server.connect(transport);
|
|
72
136
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AACvC,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAE3E,MAAM,GAAG,GAAG,IAAI,YAAY,EAAE,CAAC;AAC/B,IAAI,CAAC;IACD,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAAC,OAAO,GAAQ,EAAE,CAAC;IAChB,IAAI,GAAG,EAAE,IAAI,KAAK,YAAY,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,eAAe,IAAI,yHAAyH,CAAC,CAAC;QAC5J,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IACD,MAAM,GAAG,CAAC;AACd,CAAC;AACD,OAAO,CAAC,KAAK,CAAC,sDAAsD,IAAI,EAAE,CAAC,CAAC;AAE5E,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;AAC1D,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;AAEhE,MAAM,6BAA6B,GAAG;;;oEAG8B,CAAC;AAErE,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;uHAgBuF,CAAC;AAExH,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;AAE7E,MAAM,CAAC,YAAY,CACf,aAAa,EACb;IACI,WAAW,EAAE,uBAAuB;IACpC,WAAW,EAAE;QACT,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;KAC9D;CACJ,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;IAClB,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACjB,OAAO;YACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,oGAAoG,EAAE,CAAC;YAChJ,OAAO,EAAE,IAAI;SAChB,CAAC;IACN,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QAC5E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,OAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACrE,CAAC;IACD,OAAO;QACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,MAAM,EAAE,CAAC;QACjE,OAAO,EAAE,MAAM,CAAC,OAAO;KAC1B,CAAC;AACN,CAAC,CACJ,CAAC;AAEF,MAAM,sBAAsB,GAAG;;;;;;yFAM0D,CAAC;AAE1F,MAAM,CAAC,YAAY,CACf,YAAY,EACZ;IACI,WAAW,EAAE,sBAAsB;IACnC,WAAW,EAAE;QACT,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QACpD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,kFAAkF,CAAC;KACtI;CACJ,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC3B,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACjB,OAAO;YACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,oGAAoG,EAAE,CAAC;YAChJ,OAAO,EAAE,IAAI;SAChB,CAAC;IACN,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACrD,OAAO;QACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,MAAM,EAAE,CAAC;QACjE,OAAO,EAAE,MAAM,CAAC,OAAO;KAC1B,CAAC;AACN,CAAC,CACJ,CAAC;AAGF,MAAM,oBAAoB,GAAG,CAAC,KAAa,EAAE,GAAY,EAAE,EAAE,CAAC;;EAE5D,KAAK;;;KAGF,GAAG,CAAC,CAAC,CAAC,eAAe,GAAG,4BAA4B,GAAG,KAAK,CAAC,CAAC,CAAC,+CAA+C;;;;;;;;;;;;;;;;;;;;6BAoBtF,CAAC;AAE9B,MAAM,CAAC,cAAc,CACnB,eAAe,EACf;IACE,WAAW,EAAE,8DAA8D;IAC3E,UAAU,EAAE;QACV,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2FAA2F,CAAC;QACvH,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;KAC3E;CACF,EACD,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IACnB,QAAQ,EAAE,CAAC;YACT,IAAI,EAAE,MAAe;YACrB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,oBAAoB,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE;SAC3E,CAAC;CACH,CAAC,CACH,CAAC;AAEF,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
|