playwriter 0.0.0 → 0.0.2
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 +60 -0
- package/bin.js +3 -0
- package/dist/browser-config.d.ts +2 -0
- package/dist/browser-config.d.ts.map +1 -0
- package/dist/browser-config.js +59 -0
- package/dist/browser-config.js.map +1 -0
- package/dist/mcp-client.d.ts +16 -0
- package/dist/mcp-client.d.ts.map +1 -0
- package/dist/mcp-client.js +52 -0
- package/dist/mcp-client.js.map +1 -0
- package/dist/mcp.d.ts +2 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +596 -0
- package/dist/mcp.js.map +1 -0
- package/dist/mcp.test.d.ts +2 -0
- package/dist/mcp.test.d.ts.map +1 -0
- package/dist/mcp.test.js +205 -0
- package/dist/mcp.test.js.map +1 -0
- package/dist/prompt.md +539 -0
- package/package.json +23 -7
- package/src/browser-config.ts +66 -0
- package/src/mcp-client.ts +73 -0
- package/src/mcp.test.ts +240 -0
- package/src/mcp.ts +751 -0
- package/src/prompt.md +539 -0
- package/src/snapshots/hacker-news-focused-accessibility.md +202 -0
- package/src/snapshots/hacker-news-initial-accessibility.md +202 -0
- package/src/snapshots/hacker-news-tabbed-accessibility.md +202 -0
- package/src/snapshots/shadcn-ui-accessibility.md +553 -0
- package/src/index.test.ts +0 -9
- package/src/index.ts +0 -0
package/dist/mcp.js
ADDED
|
@@ -0,0 +1,596 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { chromium } from 'patchright-core';
|
|
5
|
+
import fs from 'node:fs';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import os from 'node:os';
|
|
8
|
+
import { spawn } from 'child_process';
|
|
9
|
+
import { getBrowserExecutablePath } from './browser-config.js';
|
|
10
|
+
const state = {
|
|
11
|
+
isConnected: false,
|
|
12
|
+
page: null,
|
|
13
|
+
browser: null,
|
|
14
|
+
chromeProcess: null,
|
|
15
|
+
consoleLogs: new Map(),
|
|
16
|
+
networkRequests: new Map(),
|
|
17
|
+
};
|
|
18
|
+
const CDP_PORT = 9922;
|
|
19
|
+
// Check if CDP is available on the specified port
|
|
20
|
+
async function isCDPAvailable() {
|
|
21
|
+
try {
|
|
22
|
+
const response = await fetch(`http://127.0.0.1:${CDP_PORT}/json/version`);
|
|
23
|
+
return response.ok;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// Launch Chrome with CDP enabled
|
|
30
|
+
async function launchChromeWithCDP() {
|
|
31
|
+
const userDataDir = path.join(os.homedir(), '.playwriter');
|
|
32
|
+
if (!fs.existsSync(userDataDir)) {
|
|
33
|
+
fs.mkdirSync(userDataDir, { recursive: true });
|
|
34
|
+
}
|
|
35
|
+
const executablePath = getBrowserExecutablePath();
|
|
36
|
+
const chromeArgs = [
|
|
37
|
+
`--remote-debugging-port=${CDP_PORT}`,
|
|
38
|
+
`--user-data-dir=${userDataDir}`,
|
|
39
|
+
'--no-first-run',
|
|
40
|
+
'--no-default-browser-check',
|
|
41
|
+
'--disable-session-crashed-bubble',
|
|
42
|
+
'--disable-features=DevToolsDebuggingRestrictions',
|
|
43
|
+
'--disable-blink-features=AutomationControlled',
|
|
44
|
+
'--no-sandbox',
|
|
45
|
+
'--disable-web-security',
|
|
46
|
+
'--disable-infobars',
|
|
47
|
+
'--disable-translate',
|
|
48
|
+
'--disable-features=AutomationControlled', // disables --enable-automation
|
|
49
|
+
'--disable-background-timer-throttling',
|
|
50
|
+
'--disable-popup-blocking',
|
|
51
|
+
'--disable-backgrounding-occluded-windows',
|
|
52
|
+
'--disable-renderer-backgrounding',
|
|
53
|
+
'--disable-window-activation',
|
|
54
|
+
'--disable-focus-on-load',
|
|
55
|
+
'--no-startup-window',
|
|
56
|
+
'--window-position=0,0',
|
|
57
|
+
'--disable-site-isolation-trials',
|
|
58
|
+
'--disable-features=IsolateOrigins,site-per-process',
|
|
59
|
+
];
|
|
60
|
+
const chromeProcess = spawn(executablePath, chromeArgs, {
|
|
61
|
+
detached: true,
|
|
62
|
+
stdio: 'ignore',
|
|
63
|
+
});
|
|
64
|
+
// Unref the process so it doesn't keep the parent process alive
|
|
65
|
+
chromeProcess.unref();
|
|
66
|
+
// Give Chrome time to start up
|
|
67
|
+
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
68
|
+
return chromeProcess;
|
|
69
|
+
}
|
|
70
|
+
// Ensure connection to Chrome via CDP
|
|
71
|
+
async function ensureConnection() {
|
|
72
|
+
if (state.isConnected && state.browser && state.page) {
|
|
73
|
+
return { browser: state.browser, page: state.page };
|
|
74
|
+
}
|
|
75
|
+
// Check if CDP is already available
|
|
76
|
+
const cdpAvailable = await isCDPAvailable();
|
|
77
|
+
if (!cdpAvailable) {
|
|
78
|
+
// Launch Chrome with CDP
|
|
79
|
+
const chromeProcess = await launchChromeWithCDP();
|
|
80
|
+
state.chromeProcess = chromeProcess;
|
|
81
|
+
}
|
|
82
|
+
// Connect to Chrome via CDP
|
|
83
|
+
const browser = await chromium.connectOverCDP(`http://127.0.0.1:${CDP_PORT}`);
|
|
84
|
+
// Get the default context
|
|
85
|
+
const contexts = browser.contexts();
|
|
86
|
+
let context;
|
|
87
|
+
if (contexts.length > 0) {
|
|
88
|
+
context = contexts[0];
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
context = await browser.newContext();
|
|
92
|
+
}
|
|
93
|
+
// Generate user agent and set it on context
|
|
94
|
+
const ua = require('user-agents');
|
|
95
|
+
const userAgent = new ua({
|
|
96
|
+
platform: 'MacIntel',
|
|
97
|
+
deviceCategory: 'desktop',
|
|
98
|
+
});
|
|
99
|
+
// Get or create page
|
|
100
|
+
const pages = context.pages();
|
|
101
|
+
let page;
|
|
102
|
+
if (pages.length > 0) {
|
|
103
|
+
page = pages[0];
|
|
104
|
+
// Set user agent on existing page
|
|
105
|
+
await page.setExtraHTTPHeaders({
|
|
106
|
+
'User-Agent': userAgent.toString(),
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
page = await context.newPage();
|
|
111
|
+
// Set user agent on new page
|
|
112
|
+
await page.setExtraHTTPHeaders({
|
|
113
|
+
'User-Agent': userAgent.toString(),
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
// Set up event listeners if not already set
|
|
117
|
+
if (!state.isConnected) {
|
|
118
|
+
page.on('console', (msg) => {
|
|
119
|
+
// Get or create logs array for this page
|
|
120
|
+
let pageLogs = state.consoleLogs.get(page);
|
|
121
|
+
if (!pageLogs) {
|
|
122
|
+
pageLogs = [];
|
|
123
|
+
state.consoleLogs.set(page, pageLogs);
|
|
124
|
+
}
|
|
125
|
+
// Add new log
|
|
126
|
+
pageLogs.push({
|
|
127
|
+
type: msg.type(),
|
|
128
|
+
text: msg.text(),
|
|
129
|
+
timestamp: Date.now(),
|
|
130
|
+
location: msg.location(),
|
|
131
|
+
});
|
|
132
|
+
// Keep only last 1000 logs
|
|
133
|
+
if (pageLogs.length > 1000) {
|
|
134
|
+
pageLogs.shift();
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
// Clean up logs and network requests when page is closed
|
|
138
|
+
page.on('close', () => {
|
|
139
|
+
state.consoleLogs.delete(page);
|
|
140
|
+
state.networkRequests.delete(page);
|
|
141
|
+
});
|
|
142
|
+
page.on('request', (request) => {
|
|
143
|
+
const startTime = Date.now();
|
|
144
|
+
const entry = {
|
|
145
|
+
url: request.url(),
|
|
146
|
+
method: request.method(),
|
|
147
|
+
headers: request.headers(),
|
|
148
|
+
timestamp: startTime,
|
|
149
|
+
};
|
|
150
|
+
request
|
|
151
|
+
.response()
|
|
152
|
+
.then((response) => {
|
|
153
|
+
if (response) {
|
|
154
|
+
entry.status = response.status();
|
|
155
|
+
entry.duration = Date.now() - startTime;
|
|
156
|
+
entry.size = response.headers()['content-length']
|
|
157
|
+
? parseInt(response.headers()['content-length'])
|
|
158
|
+
: 0;
|
|
159
|
+
// Get or create requests array for this page
|
|
160
|
+
let pageRequests = state.networkRequests.get(page);
|
|
161
|
+
if (!pageRequests) {
|
|
162
|
+
pageRequests = [];
|
|
163
|
+
state.networkRequests.set(page, pageRequests);
|
|
164
|
+
}
|
|
165
|
+
// Add new request
|
|
166
|
+
pageRequests.push(entry);
|
|
167
|
+
// Keep only last 1000 requests
|
|
168
|
+
if (pageRequests.length > 1000) {
|
|
169
|
+
pageRequests.shift();
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
})
|
|
173
|
+
.catch(() => {
|
|
174
|
+
// Handle response errors silently
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
state.browser = browser;
|
|
179
|
+
state.page = page;
|
|
180
|
+
state.isConnected = true;
|
|
181
|
+
return { browser, page };
|
|
182
|
+
}
|
|
183
|
+
// Initialize MCP server
|
|
184
|
+
const server = new McpServer({
|
|
185
|
+
name: 'playwriter',
|
|
186
|
+
title: 'Playwright MCP Server',
|
|
187
|
+
version: '1.0.0',
|
|
188
|
+
});
|
|
189
|
+
// Tool 1: New Page - Creates a new browser page
|
|
190
|
+
server.tool('new_page', 'Create a new browser page in the shared Chrome instance', {}, async () => {
|
|
191
|
+
try {
|
|
192
|
+
const { browser, page } = await ensureConnection();
|
|
193
|
+
// Always create a new page
|
|
194
|
+
const context = browser.contexts()[0] || await browser.newContext();
|
|
195
|
+
const newPage = await context.newPage();
|
|
196
|
+
// Set user agent on new page
|
|
197
|
+
const ua = require('user-agents');
|
|
198
|
+
const userAgent = new ua({
|
|
199
|
+
platform: 'MacIntel',
|
|
200
|
+
deviceCategory: 'desktop',
|
|
201
|
+
});
|
|
202
|
+
await newPage.setExtraHTTPHeaders({
|
|
203
|
+
'User-Agent': userAgent.toString()
|
|
204
|
+
});
|
|
205
|
+
// Update state to use the new page
|
|
206
|
+
state.page = newPage;
|
|
207
|
+
// Set up event listeners on the new page
|
|
208
|
+
newPage.on('console', (msg) => {
|
|
209
|
+
// Get or create logs array for this page
|
|
210
|
+
let pageLogs = state.consoleLogs.get(newPage);
|
|
211
|
+
if (!pageLogs) {
|
|
212
|
+
pageLogs = [];
|
|
213
|
+
state.consoleLogs.set(newPage, pageLogs);
|
|
214
|
+
}
|
|
215
|
+
// Add new log
|
|
216
|
+
pageLogs.push({
|
|
217
|
+
type: msg.type(),
|
|
218
|
+
text: msg.text(),
|
|
219
|
+
timestamp: Date.now(),
|
|
220
|
+
location: msg.location(),
|
|
221
|
+
});
|
|
222
|
+
// Keep only last 1000 logs
|
|
223
|
+
if (pageLogs.length > 1000) {
|
|
224
|
+
pageLogs.shift();
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
// Clean up logs and network requests when page is closed
|
|
228
|
+
newPage.on('close', () => {
|
|
229
|
+
state.consoleLogs.delete(newPage);
|
|
230
|
+
state.networkRequests.delete(newPage);
|
|
231
|
+
});
|
|
232
|
+
newPage.on('request', (request) => {
|
|
233
|
+
const startTime = Date.now();
|
|
234
|
+
const entry = {
|
|
235
|
+
url: request.url(),
|
|
236
|
+
method: request.method(),
|
|
237
|
+
headers: request.headers(),
|
|
238
|
+
timestamp: startTime,
|
|
239
|
+
};
|
|
240
|
+
request
|
|
241
|
+
.response()
|
|
242
|
+
.then((response) => {
|
|
243
|
+
if (response) {
|
|
244
|
+
entry.status = response.status();
|
|
245
|
+
entry.duration = Date.now() - startTime;
|
|
246
|
+
entry.size = response.headers()['content-length']
|
|
247
|
+
? parseInt(response.headers()['content-length'])
|
|
248
|
+
: 0;
|
|
249
|
+
// Get or create requests array for this page
|
|
250
|
+
let pageRequests = state.networkRequests.get(newPage);
|
|
251
|
+
if (!pageRequests) {
|
|
252
|
+
pageRequests = [];
|
|
253
|
+
state.networkRequests.set(newPage, pageRequests);
|
|
254
|
+
}
|
|
255
|
+
// Add new request
|
|
256
|
+
pageRequests.push(entry);
|
|
257
|
+
// Keep only last 1000 requests
|
|
258
|
+
if (pageRequests.length > 1000) {
|
|
259
|
+
pageRequests.shift();
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
})
|
|
263
|
+
.catch(() => {
|
|
264
|
+
// Handle response errors silently
|
|
265
|
+
});
|
|
266
|
+
});
|
|
267
|
+
return {
|
|
268
|
+
content: [
|
|
269
|
+
{
|
|
270
|
+
type: 'text',
|
|
271
|
+
text: `Created new page. URL: ${newPage.url()}. Total pages: ${context.pages().length}`,
|
|
272
|
+
},
|
|
273
|
+
],
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
catch (error) {
|
|
277
|
+
return {
|
|
278
|
+
content: [
|
|
279
|
+
{
|
|
280
|
+
type: 'text',
|
|
281
|
+
text: `Failed to create new page: ${error.message}`,
|
|
282
|
+
},
|
|
283
|
+
],
|
|
284
|
+
isError: true,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
// Tool 2: Console Logs
|
|
289
|
+
server.tool('console_logs', 'Retrieve console messages from the page', {
|
|
290
|
+
limit: z
|
|
291
|
+
.number()
|
|
292
|
+
.default(50)
|
|
293
|
+
.describe('Maximum number of messages to return'),
|
|
294
|
+
type: z
|
|
295
|
+
.enum(['log', 'info', 'warning', 'error', 'debug'])
|
|
296
|
+
.optional()
|
|
297
|
+
.describe('Filter by message type'),
|
|
298
|
+
offset: z.number().default(0).describe('Start from this index'),
|
|
299
|
+
}, async ({ limit, type, offset }) => {
|
|
300
|
+
try {
|
|
301
|
+
const { page } = await ensureConnection(); // Ensure we're connected first
|
|
302
|
+
// Get logs for current page
|
|
303
|
+
const pageLogs = state.consoleLogs.get(page) || [];
|
|
304
|
+
// Filter and paginate logs
|
|
305
|
+
let logs = [...pageLogs];
|
|
306
|
+
if (type) {
|
|
307
|
+
logs = logs.filter((log) => log.type === type);
|
|
308
|
+
}
|
|
309
|
+
const paginatedLogs = logs.slice(offset, offset + limit);
|
|
310
|
+
// Format logs to look like Chrome console output
|
|
311
|
+
let consoleOutput = '';
|
|
312
|
+
if (paginatedLogs.length === 0) {
|
|
313
|
+
consoleOutput = 'No console messages';
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
consoleOutput = paginatedLogs
|
|
317
|
+
.map((log) => {
|
|
318
|
+
const timestamp = new Date(log.timestamp).toLocaleTimeString();
|
|
319
|
+
const location = log.location
|
|
320
|
+
? ` ${log.location.url}:${log.location.lineNumber}:${log.location.columnNumber}`
|
|
321
|
+
: '';
|
|
322
|
+
return `[${log.type}]: ${log.text}${location}`;
|
|
323
|
+
})
|
|
324
|
+
.join('\n');
|
|
325
|
+
if (logs.length > paginatedLogs.length) {
|
|
326
|
+
consoleOutput += `\n\n(Showing ${paginatedLogs.length} of ${logs.length} total messages)`;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
return {
|
|
330
|
+
content: [
|
|
331
|
+
{
|
|
332
|
+
type: 'text',
|
|
333
|
+
text: consoleOutput,
|
|
334
|
+
},
|
|
335
|
+
],
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
catch (error) {
|
|
339
|
+
return {
|
|
340
|
+
content: [
|
|
341
|
+
{
|
|
342
|
+
type: 'text',
|
|
343
|
+
text: `Failed to get console logs: ${error.message}`,
|
|
344
|
+
},
|
|
345
|
+
],
|
|
346
|
+
isError: true,
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
});
|
|
350
|
+
// Tool 3: Network History
|
|
351
|
+
server.tool('network_history', 'Get history of network requests', {
|
|
352
|
+
limit: z
|
|
353
|
+
.number()
|
|
354
|
+
.default(50)
|
|
355
|
+
.describe('Maximum number of requests to return'),
|
|
356
|
+
urlPattern: z
|
|
357
|
+
.string()
|
|
358
|
+
.optional()
|
|
359
|
+
.describe('Filter by URL pattern (supports wildcards)'),
|
|
360
|
+
method: z
|
|
361
|
+
.enum(['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])
|
|
362
|
+
.optional()
|
|
363
|
+
.describe('Filter by HTTP method'),
|
|
364
|
+
statusCode: z
|
|
365
|
+
.object({
|
|
366
|
+
min: z.number().optional(),
|
|
367
|
+
max: z.number().optional(),
|
|
368
|
+
})
|
|
369
|
+
.optional()
|
|
370
|
+
.describe('Filter by status code range'),
|
|
371
|
+
includeBody: z
|
|
372
|
+
.boolean()
|
|
373
|
+
.default(false)
|
|
374
|
+
.describe('Include request/response bodies'),
|
|
375
|
+
}, async ({ limit, urlPattern, method, statusCode, includeBody }) => {
|
|
376
|
+
try {
|
|
377
|
+
const { page } = await ensureConnection();
|
|
378
|
+
// Get requests for current page
|
|
379
|
+
const pageRequests = state.networkRequests.get(page) || [];
|
|
380
|
+
// If includeBody is requested, we need to fetch bodies for existing requests
|
|
381
|
+
if (includeBody && pageRequests.length > 0) {
|
|
382
|
+
// Note: In a real implementation, you'd store bodies during capture
|
|
383
|
+
console.warn('Body capture not implemented in this example');
|
|
384
|
+
}
|
|
385
|
+
// Filter requests
|
|
386
|
+
let requests = [...pageRequests];
|
|
387
|
+
if (urlPattern) {
|
|
388
|
+
const pattern = new RegExp(urlPattern.replace(/\*/g, '.*'));
|
|
389
|
+
requests = requests.filter((req) => pattern.test(req.url));
|
|
390
|
+
}
|
|
391
|
+
if (method) {
|
|
392
|
+
requests = requests.filter((req) => req.method === method);
|
|
393
|
+
}
|
|
394
|
+
if (statusCode) {
|
|
395
|
+
requests = requests.filter((req) => {
|
|
396
|
+
if (statusCode.min && req.status < statusCode.min)
|
|
397
|
+
return false;
|
|
398
|
+
if (statusCode.max && req.status > statusCode.max)
|
|
399
|
+
return false;
|
|
400
|
+
return true;
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
const limitedRequests = requests.slice(-limit);
|
|
404
|
+
return {
|
|
405
|
+
content: [
|
|
406
|
+
{
|
|
407
|
+
type: 'text',
|
|
408
|
+
text: JSON.stringify({
|
|
409
|
+
total: requests.length,
|
|
410
|
+
requests: limitedRequests,
|
|
411
|
+
}, null, 2),
|
|
412
|
+
},
|
|
413
|
+
],
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
catch (error) {
|
|
417
|
+
return {
|
|
418
|
+
content: [
|
|
419
|
+
{
|
|
420
|
+
type: 'text',
|
|
421
|
+
text: `Failed to get network history: ${error.message}`,
|
|
422
|
+
},
|
|
423
|
+
],
|
|
424
|
+
isError: true,
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
});
|
|
428
|
+
// Tool 4: Accessibility Snapshot - Get page accessibility tree as JSON
|
|
429
|
+
server.tool('accessibility_snapshot', 'Get the accessibility snapshot of the current page as JSON', {}, async ({}) => {
|
|
430
|
+
try {
|
|
431
|
+
const { page } = await ensureConnection();
|
|
432
|
+
// Check if the method exists
|
|
433
|
+
if (typeof page._snapshotForAI !== 'function') {
|
|
434
|
+
// Fall back to regular accessibility snapshot
|
|
435
|
+
const snapshot = await page.accessibility.snapshot({
|
|
436
|
+
interestingOnly: true,
|
|
437
|
+
root: undefined,
|
|
438
|
+
});
|
|
439
|
+
return {
|
|
440
|
+
content: [
|
|
441
|
+
{
|
|
442
|
+
type: 'text',
|
|
443
|
+
text: JSON.stringify(snapshot, null, 2),
|
|
444
|
+
},
|
|
445
|
+
],
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
const snapshot = await page._snapshotForAI();
|
|
449
|
+
return {
|
|
450
|
+
content: [
|
|
451
|
+
{
|
|
452
|
+
type: 'text',
|
|
453
|
+
text: snapshot,
|
|
454
|
+
},
|
|
455
|
+
],
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
catch (error) {
|
|
459
|
+
console.error('Accessibility snapshot error:', error);
|
|
460
|
+
return {
|
|
461
|
+
content: [
|
|
462
|
+
{
|
|
463
|
+
type: 'text',
|
|
464
|
+
text: `Failed to get accessibility snapshot: ${error.message}`,
|
|
465
|
+
},
|
|
466
|
+
],
|
|
467
|
+
isError: true,
|
|
468
|
+
};
|
|
469
|
+
}
|
|
470
|
+
});
|
|
471
|
+
// Tool 5: Execute - Run arbitrary JavaScript code with page and context in scope
|
|
472
|
+
const promptContent = fs.readFileSync(path.join(path.dirname(new URL(import.meta.url).pathname), 'prompt.md'), 'utf-8');
|
|
473
|
+
server.tool('execute', promptContent, {
|
|
474
|
+
code: z
|
|
475
|
+
.string()
|
|
476
|
+
.describe('JavaScript code to execute with page and context in scope. Should be one line, using ; to execute multiple statements. To execute complex actions call execute multiple times. '),
|
|
477
|
+
timeout: z
|
|
478
|
+
.number()
|
|
479
|
+
.default(3000)
|
|
480
|
+
.describe('Timeout in milliseconds for code execution (default: 3000ms)'),
|
|
481
|
+
}, async ({ code, timeout }) => {
|
|
482
|
+
const { page } = await ensureConnection();
|
|
483
|
+
const context = page.context();
|
|
484
|
+
console.error('Executing code:', code);
|
|
485
|
+
try {
|
|
486
|
+
// Collect console logs during execution
|
|
487
|
+
const consoleLogs = [];
|
|
488
|
+
// Create a custom console object that collects logs
|
|
489
|
+
const customConsole = {
|
|
490
|
+
log: (...args) => {
|
|
491
|
+
consoleLogs.push({ method: 'log', args });
|
|
492
|
+
},
|
|
493
|
+
info: (...args) => {
|
|
494
|
+
consoleLogs.push({ method: 'info', args });
|
|
495
|
+
},
|
|
496
|
+
warn: (...args) => {
|
|
497
|
+
consoleLogs.push({ method: 'warn', args });
|
|
498
|
+
},
|
|
499
|
+
error: (...args) => {
|
|
500
|
+
consoleLogs.push({ method: 'error', args });
|
|
501
|
+
},
|
|
502
|
+
debug: (...args) => {
|
|
503
|
+
consoleLogs.push({ method: 'debug', args });
|
|
504
|
+
},
|
|
505
|
+
};
|
|
506
|
+
// Create a function that has page, context, and console in scope
|
|
507
|
+
const executeCode = new Function('page', 'context', 'console', `
|
|
508
|
+
return (async () => {
|
|
509
|
+
${code}
|
|
510
|
+
})();
|
|
511
|
+
`);
|
|
512
|
+
// Execute the code with page, context, and custom console with timeout
|
|
513
|
+
const result = await Promise.race([
|
|
514
|
+
executeCode(page, context, customConsole),
|
|
515
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error(`Code execution timed out after ${timeout}ms`)), timeout))
|
|
516
|
+
]);
|
|
517
|
+
// Format the response with both console output and return value
|
|
518
|
+
let responseText = '';
|
|
519
|
+
// Add console logs if any
|
|
520
|
+
if (consoleLogs.length > 0) {
|
|
521
|
+
responseText += 'Console output:\n';
|
|
522
|
+
consoleLogs.forEach(({ method, args }) => {
|
|
523
|
+
const formattedArgs = args
|
|
524
|
+
.map((arg) => {
|
|
525
|
+
if (typeof arg === 'object') {
|
|
526
|
+
return JSON.stringify(arg, null, 2);
|
|
527
|
+
}
|
|
528
|
+
return String(arg);
|
|
529
|
+
})
|
|
530
|
+
.join(' ');
|
|
531
|
+
responseText += `[${method}] ${formattedArgs}\n`;
|
|
532
|
+
});
|
|
533
|
+
responseText += '\n';
|
|
534
|
+
}
|
|
535
|
+
// Add return value if any
|
|
536
|
+
if (result !== undefined) {
|
|
537
|
+
responseText += 'Return value:\n';
|
|
538
|
+
responseText += JSON.stringify(result, null, 2);
|
|
539
|
+
}
|
|
540
|
+
else if (consoleLogs.length === 0) {
|
|
541
|
+
responseText += 'Code executed successfully (no output)';
|
|
542
|
+
}
|
|
543
|
+
return {
|
|
544
|
+
content: [
|
|
545
|
+
{
|
|
546
|
+
type: 'text',
|
|
547
|
+
text: responseText.trim(),
|
|
548
|
+
},
|
|
549
|
+
],
|
|
550
|
+
};
|
|
551
|
+
}
|
|
552
|
+
catch (error) {
|
|
553
|
+
return {
|
|
554
|
+
content: [
|
|
555
|
+
{
|
|
556
|
+
type: 'text',
|
|
557
|
+
text: `Error executing code: ${error.message}\n${error.stack}`,
|
|
558
|
+
},
|
|
559
|
+
],
|
|
560
|
+
isError: true,
|
|
561
|
+
};
|
|
562
|
+
}
|
|
563
|
+
});
|
|
564
|
+
// Start the server
|
|
565
|
+
async function main() {
|
|
566
|
+
const transport = new StdioServerTransport();
|
|
567
|
+
await server.connect(transport);
|
|
568
|
+
console.error('Playwright MCP server running on stdio');
|
|
569
|
+
}
|
|
570
|
+
// Cleanup function
|
|
571
|
+
async function cleanup() {
|
|
572
|
+
console.error('Shutting down MCP server...');
|
|
573
|
+
if (state.browser) {
|
|
574
|
+
try {
|
|
575
|
+
// Close the browser connection but not the Chrome process
|
|
576
|
+
// Since we're using CDP, closing the browser object just closes
|
|
577
|
+
// the connection, not the actual Chrome instance
|
|
578
|
+
await state.browser.close();
|
|
579
|
+
}
|
|
580
|
+
catch (e) {
|
|
581
|
+
// Ignore errors during browser close
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
// Don't kill the Chrome process - let it continue running
|
|
585
|
+
// The process was started with detached: true and unref()
|
|
586
|
+
// so it will persist after this process exits
|
|
587
|
+
process.exit(0);
|
|
588
|
+
}
|
|
589
|
+
// Handle process termination
|
|
590
|
+
process.on('SIGINT', cleanup);
|
|
591
|
+
process.on('SIGTERM', cleanup);
|
|
592
|
+
process.on('exit', () => {
|
|
593
|
+
// Browser cleanup is handled by the async cleanup function
|
|
594
|
+
});
|
|
595
|
+
main().catch(console.error);
|
|
596
|
+
//# sourceMappingURL=mcp.js.map
|
package/dist/mcp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.test.d.ts","sourceRoot":"","sources":["../src/mcp.test.ts"],"names":[],"mappings":""}
|