@saiden/browse 0.2.5
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.
Potentially problematic release.
This version of @saiden/browse might be problematic. Click here for more details.
- package/README.md +210 -0
- package/dist/browser.d.ts +48 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.integration.test.d.ts +2 -0
- package/dist/browser.integration.test.d.ts.map +1 -0
- package/dist/browser.integration.test.js +173 -0
- package/dist/browser.integration.test.js.map +1 -0
- package/dist/browser.js +250 -0
- package/dist/browser.js.map +1 -0
- package/dist/browser.test.d.ts +2 -0
- package/dist/browser.test.d.ts.map +1 -0
- package/dist/browser.test.js +73 -0
- package/dist/browser.test.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +247 -0
- package/dist/cli.js.map +1 -0
- package/dist/image.d.ts +21 -0
- package/dist/image.d.ts.map +1 -0
- package/dist/image.js +131 -0
- package/dist/image.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +41 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +103 -0
- package/dist/logger.js.map +1 -0
- package/dist/logger.test.d.ts +2 -0
- package/dist/logger.test.d.ts.map +1 -0
- package/dist/logger.test.js +146 -0
- package/dist/logger.test.js.map +1 -0
- package/dist/mcp.d.ts +3 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +541 -0
- package/dist/mcp.js.map +1 -0
- package/dist/server.d.ts +20 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +88 -0
- package/dist/server.js.map +1 -0
- package/dist/server.test.d.ts +2 -0
- package/dist/server.test.d.ts.map +1 -0
- package/dist/server.test.js +164 -0
- package/dist/server.test.js.map +1 -0
- package/dist/types.d.ts +125 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +74 -0
package/dist/mcp.js
ADDED
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
import { dirname, resolve } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
6
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { ClaudeBrowser } from './browser.js';
|
|
9
|
+
import * as image from './image.js';
|
|
10
|
+
import { stderrLogger as log } from './logger.js';
|
|
11
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
12
|
+
const pkg = JSON.parse(readFileSync(resolve(__dirname, '../package.json'), 'utf-8'));
|
|
13
|
+
const browser = new ClaudeBrowser({ headless: true, width: 1280, height: 800 });
|
|
14
|
+
let launched = false;
|
|
15
|
+
let currentScreenshotBuffer = null;
|
|
16
|
+
async function ensureLaunched() {
|
|
17
|
+
if (!launched) {
|
|
18
|
+
await browser.launch();
|
|
19
|
+
launched = true;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function textResult(text) {
|
|
23
|
+
return { content: [{ type: 'text', text }] };
|
|
24
|
+
}
|
|
25
|
+
function withLogging(cmd, fn) {
|
|
26
|
+
return async (args) => {
|
|
27
|
+
const cmdLike = { cmd, ...args };
|
|
28
|
+
log.command(cmdLike);
|
|
29
|
+
try {
|
|
30
|
+
const result = await fn(args);
|
|
31
|
+
const parsed = JSON.parse(result.content[0]?.text || '{}');
|
|
32
|
+
const resultLike = { ok: true, ...parsed };
|
|
33
|
+
log.result(cmdLike, resultLike);
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
log.result(cmdLike, { ok: false, error: err.message });
|
|
38
|
+
throw err;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
const server = new McpServer({
|
|
43
|
+
name: 'claude-browse',
|
|
44
|
+
version: pkg.version,
|
|
45
|
+
});
|
|
46
|
+
// Navigation
|
|
47
|
+
server.tool('goto', 'Navigate to a URL', { url: z.string().url() }, withLogging('goto', async ({ url }) => {
|
|
48
|
+
await ensureLaunched();
|
|
49
|
+
const result = await browser.goto(url);
|
|
50
|
+
return textResult(JSON.stringify(result));
|
|
51
|
+
}));
|
|
52
|
+
server.tool('back', 'Go back in browser history', {}, withLogging('back', async () => {
|
|
53
|
+
await ensureLaunched();
|
|
54
|
+
const result = await browser.back();
|
|
55
|
+
return textResult(JSON.stringify(result));
|
|
56
|
+
}));
|
|
57
|
+
server.tool('forward', 'Go forward in browser history', {}, withLogging('forward', async () => {
|
|
58
|
+
await ensureLaunched();
|
|
59
|
+
const result = await browser.forward();
|
|
60
|
+
return textResult(JSON.stringify(result));
|
|
61
|
+
}));
|
|
62
|
+
server.tool('reload', 'Reload the current page', {}, withLogging('reload', async () => {
|
|
63
|
+
await ensureLaunched();
|
|
64
|
+
const result = await browser.reload();
|
|
65
|
+
return textResult(JSON.stringify(result));
|
|
66
|
+
}));
|
|
67
|
+
// Interaction
|
|
68
|
+
server.tool('click', 'Click on an element', { selector: z.string() }, withLogging('click', async ({ selector }) => {
|
|
69
|
+
await ensureLaunched();
|
|
70
|
+
const result = await browser.click(selector);
|
|
71
|
+
return textResult(JSON.stringify(result));
|
|
72
|
+
}));
|
|
73
|
+
server.tool('type', 'Type text into an input field', { selector: z.string(), text: z.string() }, withLogging('type', async ({ selector, text }) => {
|
|
74
|
+
await ensureLaunched();
|
|
75
|
+
await browser.type(selector, text);
|
|
76
|
+
return textResult(JSON.stringify({ ok: true }));
|
|
77
|
+
}));
|
|
78
|
+
// Query
|
|
79
|
+
server.tool('query', 'Query elements by CSS selector, returns tag, text, and attributes', { selector: z.string() }, withLogging('query', async ({ selector }) => {
|
|
80
|
+
await ensureLaunched();
|
|
81
|
+
const elements = await browser.query(selector);
|
|
82
|
+
return textResult(JSON.stringify({ ok: true, count: elements.length, elements }));
|
|
83
|
+
}));
|
|
84
|
+
server.tool('url', 'Get current URL and page title', {}, withLogging('url', async () => {
|
|
85
|
+
await ensureLaunched();
|
|
86
|
+
const result = await browser.getUrl();
|
|
87
|
+
return textResult(JSON.stringify(result));
|
|
88
|
+
}));
|
|
89
|
+
server.tool('html', 'Get page HTML content', { full: z.boolean().optional().default(false) }, withLogging('html', async ({ full }) => {
|
|
90
|
+
await ensureLaunched();
|
|
91
|
+
const html = await browser.getHtml(full);
|
|
92
|
+
return textResult(JSON.stringify({ ok: true, html }));
|
|
93
|
+
}));
|
|
94
|
+
// Screenshot
|
|
95
|
+
server.tool('screenshot', 'Take a screenshot of the current page', {
|
|
96
|
+
path: z.string().optional().default('screenshots/screenshot.png'),
|
|
97
|
+
fullPage: z.boolean().optional().default(false),
|
|
98
|
+
}, withLogging('screenshot', async ({ path, fullPage }) => {
|
|
99
|
+
await ensureLaunched();
|
|
100
|
+
const result = await browser.screenshot(path, fullPage);
|
|
101
|
+
return textResult(JSON.stringify({ ok: true, path: result.path }));
|
|
102
|
+
}));
|
|
103
|
+
// Eval
|
|
104
|
+
server.tool('eval', 'Execute JavaScript in the browser context', { script: z.string() }, withLogging('eval', async ({ script }) => {
|
|
105
|
+
await ensureLaunched();
|
|
106
|
+
const result = await browser.eval(script);
|
|
107
|
+
return textResult(JSON.stringify({ ok: true, result }));
|
|
108
|
+
}));
|
|
109
|
+
// Utility
|
|
110
|
+
server.tool('wait', 'Wait for a specified time in milliseconds', { ms: z.number().optional().default(1000) }, withLogging('wait', async ({ ms }) => {
|
|
111
|
+
await ensureLaunched();
|
|
112
|
+
await browser.wait(ms);
|
|
113
|
+
return textResult(JSON.stringify({ ok: true }));
|
|
114
|
+
}));
|
|
115
|
+
// Session management
|
|
116
|
+
server.tool('close', 'Close the browser and end the current session', {}, withLogging('close', async () => {
|
|
117
|
+
if (launched) {
|
|
118
|
+
await browser.close();
|
|
119
|
+
launched = false;
|
|
120
|
+
}
|
|
121
|
+
return textResult(JSON.stringify({ ok: true, message: 'Browser closed' }));
|
|
122
|
+
}));
|
|
123
|
+
server.tool('session_save', 'Save the current session state (URL, cookies, localStorage, sessionStorage) to a JSON file', {
|
|
124
|
+
path: z.string().optional().default('session.json').describe('Path to save session file'),
|
|
125
|
+
}, withLogging('session_save', async ({ path }) => {
|
|
126
|
+
await ensureLaunched();
|
|
127
|
+
const { writeFile } = await import('node:fs/promises');
|
|
128
|
+
const { resolve } = await import('node:path');
|
|
129
|
+
const page = browser.getPage();
|
|
130
|
+
const context = browser.getContext();
|
|
131
|
+
if (!page || !context) {
|
|
132
|
+
return textResult(JSON.stringify({ ok: false, error: 'No active page' }));
|
|
133
|
+
}
|
|
134
|
+
const url = page.url();
|
|
135
|
+
const title = await page.title();
|
|
136
|
+
const cookies = await context.cookies();
|
|
137
|
+
// Get localStorage and sessionStorage (runs in browser context)
|
|
138
|
+
const storage = (await page.evaluate(`({
|
|
139
|
+
localStorage: Object.fromEntries(
|
|
140
|
+
Array.from({ length: localStorage.length }, (_, i) => localStorage.key(i))
|
|
141
|
+
.filter(k => k !== null)
|
|
142
|
+
.map(k => [k, localStorage.getItem(k) || ''])
|
|
143
|
+
),
|
|
144
|
+
sessionStorage: Object.fromEntries(
|
|
145
|
+
Array.from({ length: sessionStorage.length }, (_, i) => sessionStorage.key(i))
|
|
146
|
+
.filter(k => k !== null)
|
|
147
|
+
.map(k => [k, sessionStorage.getItem(k) || ''])
|
|
148
|
+
),
|
|
149
|
+
})`));
|
|
150
|
+
const sessionData = {
|
|
151
|
+
url,
|
|
152
|
+
title,
|
|
153
|
+
cookies,
|
|
154
|
+
localStorage: storage.localStorage,
|
|
155
|
+
sessionStorage: storage.sessionStorage,
|
|
156
|
+
savedAt: new Date().toISOString(),
|
|
157
|
+
};
|
|
158
|
+
const resolvedPath = resolve(path);
|
|
159
|
+
await writeFile(resolvedPath, JSON.stringify(sessionData, null, 2));
|
|
160
|
+
return textResult(JSON.stringify({ ok: true, path: resolvedPath, url, cookieCount: cookies.length }));
|
|
161
|
+
}));
|
|
162
|
+
server.tool('session_restore', 'Restore a previously saved session state from a JSON file', {
|
|
163
|
+
path: z.string().optional().default('session.json').describe('Path to session file'),
|
|
164
|
+
}, withLogging('session_restore', async ({ path }) => {
|
|
165
|
+
await ensureLaunched();
|
|
166
|
+
const { readFile } = await import('node:fs/promises');
|
|
167
|
+
const { resolve } = await import('node:path');
|
|
168
|
+
const resolvedPath = resolve(path);
|
|
169
|
+
const data = JSON.parse(await readFile(resolvedPath, 'utf-8'));
|
|
170
|
+
const page = browser.getPage();
|
|
171
|
+
const context = browser.getContext();
|
|
172
|
+
if (!page || !context) {
|
|
173
|
+
return textResult(JSON.stringify({ ok: false, error: 'No active page' }));
|
|
174
|
+
}
|
|
175
|
+
// Restore cookies first
|
|
176
|
+
if (data.cookies?.length > 0) {
|
|
177
|
+
await context.addCookies(data.cookies);
|
|
178
|
+
}
|
|
179
|
+
// Navigate to saved URL
|
|
180
|
+
if (data.url) {
|
|
181
|
+
await page.goto(data.url, { waitUntil: 'networkidle' });
|
|
182
|
+
}
|
|
183
|
+
// Restore storage (runs in browser context)
|
|
184
|
+
const local = data.localStorage || {};
|
|
185
|
+
const session = data.sessionStorage || {};
|
|
186
|
+
await page.evaluate(`((data) => {
|
|
187
|
+
for (const [k, v] of Object.entries(data.local)) localStorage.setItem(k, v);
|
|
188
|
+
for (const [k, v] of Object.entries(data.session)) sessionStorage.setItem(k, v);
|
|
189
|
+
})(${JSON.stringify({ local, session })})`);
|
|
190
|
+
return textResult(JSON.stringify({
|
|
191
|
+
ok: true,
|
|
192
|
+
url: data.url,
|
|
193
|
+
title: data.title,
|
|
194
|
+
cookiesRestored: data.cookies?.length || 0,
|
|
195
|
+
savedAt: data.savedAt,
|
|
196
|
+
}));
|
|
197
|
+
}));
|
|
198
|
+
// Image processing
|
|
199
|
+
server.tool('favicon', 'Generate a complete favicon set from an image (16x16, 32x32, 48x48, apple-touch-icon 180x180, android-chrome 192x192 and 512x512)', {
|
|
200
|
+
input: z.string().describe('Path to source image'),
|
|
201
|
+
outputDir: z.string().describe('Directory to output favicon files'),
|
|
202
|
+
}, withLogging('favicon', async ({ input, outputDir }) => {
|
|
203
|
+
const result = await image.createFavicon(input, outputDir);
|
|
204
|
+
return textResult(JSON.stringify({ ok: true, files: result.files, outputDir: result.outputDir }));
|
|
205
|
+
}));
|
|
206
|
+
server.tool('convert', 'Convert an image to a different format (png, jpeg, webp, avif)', {
|
|
207
|
+
input: z.string().describe('Path to source image'),
|
|
208
|
+
output: z.string().describe('Path for output image'),
|
|
209
|
+
format: z.enum(['png', 'jpeg', 'webp', 'avif']).describe('Target format'),
|
|
210
|
+
}, withLogging('convert', async ({ input, output, format }) => {
|
|
211
|
+
const result = await image.convert(input, output, format);
|
|
212
|
+
return textResult(JSON.stringify({ ok: true, ...result }));
|
|
213
|
+
}));
|
|
214
|
+
server.tool('resize', 'Resize an image to specified dimensions', {
|
|
215
|
+
input: z.string().describe('Path to source image'),
|
|
216
|
+
output: z.string().describe('Path for output image'),
|
|
217
|
+
width: z.number().describe('Target width in pixels'),
|
|
218
|
+
height: z
|
|
219
|
+
.number()
|
|
220
|
+
.optional()
|
|
221
|
+
.describe('Target height in pixels (optional, maintains aspect ratio if omitted)'),
|
|
222
|
+
fit: z
|
|
223
|
+
.enum(['cover', 'contain', 'fill', 'inside', 'outside'])
|
|
224
|
+
.optional()
|
|
225
|
+
.default('cover')
|
|
226
|
+
.describe('How to fit the image'),
|
|
227
|
+
}, withLogging('resize', async ({ input, output, width, height, fit }) => {
|
|
228
|
+
const result = await image.resize(input, output, width, height, fit);
|
|
229
|
+
return textResult(JSON.stringify({ ok: true, ...result }));
|
|
230
|
+
}));
|
|
231
|
+
server.tool('crop', 'Crop a region from an image', {
|
|
232
|
+
input: z.string().describe('Path to source image'),
|
|
233
|
+
output: z.string().describe('Path for output image'),
|
|
234
|
+
left: z.number().describe('Left edge position in pixels'),
|
|
235
|
+
top: z.number().describe('Top edge position in pixels'),
|
|
236
|
+
width: z.number().describe('Width of crop region in pixels'),
|
|
237
|
+
height: z.number().describe('Height of crop region in pixels'),
|
|
238
|
+
}, withLogging('crop', async ({ input, output, left, top, width, height }) => {
|
|
239
|
+
const result = await image.crop(input, output, left, top, width, height);
|
|
240
|
+
return textResult(JSON.stringify({ ok: true, ...result }));
|
|
241
|
+
}));
|
|
242
|
+
server.tool('compress', 'Compress an image to reduce file size', {
|
|
243
|
+
input: z.string().describe('Path to source image'),
|
|
244
|
+
output: z.string().describe('Path for output image'),
|
|
245
|
+
quality: z.number().min(1).max(100).optional().default(80).describe('Quality level 1-100'),
|
|
246
|
+
}, withLogging('compress', async ({ input, output, quality }) => {
|
|
247
|
+
const result = await image.compress(input, output, quality);
|
|
248
|
+
return textResult(JSON.stringify({ ok: true, ...result }));
|
|
249
|
+
}));
|
|
250
|
+
server.tool('thumbnail', 'Create a thumbnail from an image', {
|
|
251
|
+
input: z.string().describe('Path to source image'),
|
|
252
|
+
output: z.string().describe('Path for output image'),
|
|
253
|
+
size: z
|
|
254
|
+
.enum(['small', 'medium', 'large'])
|
|
255
|
+
.optional()
|
|
256
|
+
.default('medium')
|
|
257
|
+
.describe('Thumbnail size preset (small=150px, medium=300px, large=600px)'),
|
|
258
|
+
}, withLogging('thumbnail', async ({ input, output, size }) => {
|
|
259
|
+
const result = await image.thumbnail(input, output, size);
|
|
260
|
+
return textResult(JSON.stringify({ ok: true, ...result }));
|
|
261
|
+
}));
|
|
262
|
+
// ============================================================================
|
|
263
|
+
// MCP Resources - Browser state accessible via @ mentions
|
|
264
|
+
// ============================================================================
|
|
265
|
+
// Resource: browser://state - Current browser state (URL, title, launched status)
|
|
266
|
+
server.resource('Browser State', 'browser://state', {
|
|
267
|
+
description: 'Current browser state including URL, title, and status',
|
|
268
|
+
mimeType: 'application/json',
|
|
269
|
+
}, async () => {
|
|
270
|
+
if (!launched) {
|
|
271
|
+
return {
|
|
272
|
+
contents: [
|
|
273
|
+
{
|
|
274
|
+
uri: 'browser://state',
|
|
275
|
+
mimeType: 'application/json',
|
|
276
|
+
text: JSON.stringify({ launched: false, url: null, title: null }),
|
|
277
|
+
},
|
|
278
|
+
],
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
const state = await browser.getUrl();
|
|
282
|
+
return {
|
|
283
|
+
contents: [
|
|
284
|
+
{
|
|
285
|
+
uri: 'browser://state',
|
|
286
|
+
mimeType: 'application/json',
|
|
287
|
+
text: JSON.stringify({ launched: true, ...state }),
|
|
288
|
+
},
|
|
289
|
+
],
|
|
290
|
+
};
|
|
291
|
+
});
|
|
292
|
+
// Resource: browser://html - Current page HTML content
|
|
293
|
+
server.resource('Page HTML', 'browser://html', { description: 'HTML content of the current page (truncated to 10KB)', mimeType: 'text/html' }, async () => {
|
|
294
|
+
if (!launched) {
|
|
295
|
+
return {
|
|
296
|
+
contents: [
|
|
297
|
+
{
|
|
298
|
+
uri: 'browser://html',
|
|
299
|
+
mimeType: 'text/plain',
|
|
300
|
+
text: 'Browser not launched. Use goto tool first.',
|
|
301
|
+
},
|
|
302
|
+
],
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
const html = await browser.getHtml(false);
|
|
306
|
+
return {
|
|
307
|
+
contents: [
|
|
308
|
+
{
|
|
309
|
+
uri: 'browser://html',
|
|
310
|
+
mimeType: 'text/html',
|
|
311
|
+
text: html,
|
|
312
|
+
},
|
|
313
|
+
],
|
|
314
|
+
};
|
|
315
|
+
});
|
|
316
|
+
// Resource: browser://html/full - Full page HTML content
|
|
317
|
+
server.resource('Full Page HTML', 'browser://html/full', { description: 'Complete HTML content of the current page', mimeType: 'text/html' }, async () => {
|
|
318
|
+
if (!launched) {
|
|
319
|
+
return {
|
|
320
|
+
contents: [
|
|
321
|
+
{
|
|
322
|
+
uri: 'browser://html/full',
|
|
323
|
+
mimeType: 'text/plain',
|
|
324
|
+
text: 'Browser not launched. Use goto tool first.',
|
|
325
|
+
},
|
|
326
|
+
],
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
const html = await browser.getHtml(true);
|
|
330
|
+
return {
|
|
331
|
+
contents: [
|
|
332
|
+
{
|
|
333
|
+
uri: 'browser://html/full',
|
|
334
|
+
mimeType: 'text/html',
|
|
335
|
+
text: html,
|
|
336
|
+
},
|
|
337
|
+
],
|
|
338
|
+
};
|
|
339
|
+
});
|
|
340
|
+
// Resource: browser://screenshot - Current page screenshot (base64)
|
|
341
|
+
server.resource('Page Screenshot', 'browser://screenshot', { description: 'Screenshot of the current page as base64 PNG', mimeType: 'image/png' }, async () => {
|
|
342
|
+
if (!launched) {
|
|
343
|
+
return {
|
|
344
|
+
contents: [
|
|
345
|
+
{
|
|
346
|
+
uri: 'browser://screenshot',
|
|
347
|
+
mimeType: 'text/plain',
|
|
348
|
+
text: 'Browser not launched. Use goto tool first.',
|
|
349
|
+
},
|
|
350
|
+
],
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
const result = await browser.screenshot(undefined, false);
|
|
354
|
+
currentScreenshotBuffer = result.buffer || null;
|
|
355
|
+
return {
|
|
356
|
+
contents: [
|
|
357
|
+
{
|
|
358
|
+
uri: 'browser://screenshot',
|
|
359
|
+
mimeType: 'image/png',
|
|
360
|
+
blob: result.buffer?.toString('base64') || '',
|
|
361
|
+
},
|
|
362
|
+
],
|
|
363
|
+
};
|
|
364
|
+
});
|
|
365
|
+
// ============================================================================
|
|
366
|
+
// MCP Prompts - Common workflows accessible via / commands
|
|
367
|
+
// ============================================================================
|
|
368
|
+
// Prompt: Analyze current page
|
|
369
|
+
server.prompt('analyze_page', 'Analyze the current page content and structure', async () => {
|
|
370
|
+
if (!launched) {
|
|
371
|
+
return {
|
|
372
|
+
messages: [
|
|
373
|
+
{
|
|
374
|
+
role: 'user',
|
|
375
|
+
content: {
|
|
376
|
+
type: 'text',
|
|
377
|
+
text: 'The browser is not launched yet. Please use the goto tool to navigate to a URL first, then I can analyze the page.',
|
|
378
|
+
},
|
|
379
|
+
},
|
|
380
|
+
],
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
const state = await browser.getUrl();
|
|
384
|
+
const html = await browser.getHtml(false);
|
|
385
|
+
return {
|
|
386
|
+
messages: [
|
|
387
|
+
{
|
|
388
|
+
role: 'user',
|
|
389
|
+
content: {
|
|
390
|
+
type: 'text',
|
|
391
|
+
text: `Analyze the following webpage:
|
|
392
|
+
|
|
393
|
+
URL: ${state.url}
|
|
394
|
+
Title: ${state.title}
|
|
395
|
+
|
|
396
|
+
HTML Content (truncated):
|
|
397
|
+
\`\`\`html
|
|
398
|
+
${html}
|
|
399
|
+
\`\`\`
|
|
400
|
+
|
|
401
|
+
Please provide:
|
|
402
|
+
1. A summary of the page purpose and content
|
|
403
|
+
2. Key interactive elements (forms, buttons, links)
|
|
404
|
+
3. Any notable structure or patterns
|
|
405
|
+
4. Suggestions for what actions might be useful`,
|
|
406
|
+
},
|
|
407
|
+
},
|
|
408
|
+
],
|
|
409
|
+
};
|
|
410
|
+
});
|
|
411
|
+
// Prompt: Extract data from page
|
|
412
|
+
server.prompt('extract_data', 'Extract structured data from the current page', { selector: z.string().optional().describe('CSS selector to focus extraction (optional)') }, async ({ selector }) => {
|
|
413
|
+
if (!launched) {
|
|
414
|
+
return {
|
|
415
|
+
messages: [
|
|
416
|
+
{
|
|
417
|
+
role: 'user',
|
|
418
|
+
content: {
|
|
419
|
+
type: 'text',
|
|
420
|
+
text: 'The browser is not launched yet. Please use the goto tool to navigate to a URL first.',
|
|
421
|
+
},
|
|
422
|
+
},
|
|
423
|
+
],
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
const state = await browser.getUrl();
|
|
427
|
+
let elements = [];
|
|
428
|
+
if (selector) {
|
|
429
|
+
elements = await browser.query(selector);
|
|
430
|
+
}
|
|
431
|
+
return {
|
|
432
|
+
messages: [
|
|
433
|
+
{
|
|
434
|
+
role: 'user',
|
|
435
|
+
content: {
|
|
436
|
+
type: 'text',
|
|
437
|
+
text: `Extract structured data from this webpage:
|
|
438
|
+
|
|
439
|
+
URL: ${state.url}
|
|
440
|
+
Title: ${state.title}
|
|
441
|
+
${selector ? `\nSelector: ${selector}\nMatched Elements: ${elements.length}\n\nElements:\n${JSON.stringify(elements, null, 2)}` : ''}
|
|
442
|
+
|
|
443
|
+
Please:
|
|
444
|
+
1. Use the query tool to find relevant data elements
|
|
445
|
+
2. Extract and structure the data in a useful format (JSON, table, etc.)
|
|
446
|
+
3. Identify patterns that could help with similar pages`,
|
|
447
|
+
},
|
|
448
|
+
},
|
|
449
|
+
],
|
|
450
|
+
};
|
|
451
|
+
});
|
|
452
|
+
// Prompt: Navigate and interact
|
|
453
|
+
server.prompt('navigate_to', 'Navigate to a URL and describe what you find', { url: z.string().url().describe('URL to navigate to') }, async ({ url }) => {
|
|
454
|
+
return {
|
|
455
|
+
messages: [
|
|
456
|
+
{
|
|
457
|
+
role: 'user',
|
|
458
|
+
content: {
|
|
459
|
+
type: 'text',
|
|
460
|
+
text: `Please navigate to ${url} and:
|
|
461
|
+
|
|
462
|
+
1. Use the goto tool to navigate there
|
|
463
|
+
2. Take a screenshot to see the page
|
|
464
|
+
3. Describe what you see
|
|
465
|
+
4. Identify the main interactive elements
|
|
466
|
+
5. Suggest what actions might be useful
|
|
467
|
+
|
|
468
|
+
Start by navigating to the URL.`,
|
|
469
|
+
},
|
|
470
|
+
},
|
|
471
|
+
],
|
|
472
|
+
};
|
|
473
|
+
});
|
|
474
|
+
// Prompt: Fill form
|
|
475
|
+
server.prompt('fill_form', 'Help fill out a form on the current page', { formData: z.string().optional().describe('JSON object with field names and values to fill') }, async ({ formData }) => {
|
|
476
|
+
if (!launched) {
|
|
477
|
+
return {
|
|
478
|
+
messages: [
|
|
479
|
+
{
|
|
480
|
+
role: 'user',
|
|
481
|
+
content: {
|
|
482
|
+
type: 'text',
|
|
483
|
+
text: 'The browser is not launched yet. Please use the goto tool to navigate to a page with a form first.',
|
|
484
|
+
},
|
|
485
|
+
},
|
|
486
|
+
],
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
const state = await browser.getUrl();
|
|
490
|
+
return {
|
|
491
|
+
messages: [
|
|
492
|
+
{
|
|
493
|
+
role: 'user',
|
|
494
|
+
content: {
|
|
495
|
+
type: 'text',
|
|
496
|
+
text: `Help fill out a form on this page:
|
|
497
|
+
|
|
498
|
+
URL: ${state.url}
|
|
499
|
+
Title: ${state.title}
|
|
500
|
+
${formData ? `\nData to fill: ${formData}` : ''}
|
|
501
|
+
|
|
502
|
+
Please:
|
|
503
|
+
1. Use the query tool to find form inputs (input, textarea, select)
|
|
504
|
+
2. Identify required fields and their types
|
|
505
|
+
3. Use the type tool to fill in each field
|
|
506
|
+
4. Report what was filled and any issues encountered`,
|
|
507
|
+
},
|
|
508
|
+
},
|
|
509
|
+
],
|
|
510
|
+
};
|
|
511
|
+
});
|
|
512
|
+
// Prompt: Screenshot comparison
|
|
513
|
+
server.prompt('compare_screenshots', 'Take screenshots and compare changes', async () => {
|
|
514
|
+
return {
|
|
515
|
+
messages: [
|
|
516
|
+
{
|
|
517
|
+
role: 'user',
|
|
518
|
+
content: {
|
|
519
|
+
type: 'text',
|
|
520
|
+
text: `I'll help you compare page states:
|
|
521
|
+
|
|
522
|
+
1. Take an initial screenshot
|
|
523
|
+
2. Perform some action (click, navigate, etc.)
|
|
524
|
+
3. Take another screenshot
|
|
525
|
+
4. Describe the differences
|
|
526
|
+
|
|
527
|
+
What action would you like me to perform between screenshots?`,
|
|
528
|
+
},
|
|
529
|
+
},
|
|
530
|
+
],
|
|
531
|
+
};
|
|
532
|
+
});
|
|
533
|
+
// ============================================================================
|
|
534
|
+
// Start server
|
|
535
|
+
// ============================================================================
|
|
536
|
+
async function main() {
|
|
537
|
+
const transport = new StdioServerTransport();
|
|
538
|
+
await server.connect(transport);
|
|
539
|
+
}
|
|
540
|
+
main().catch(console.error);
|
|
541
|
+
//# 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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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { BrowserOptions } from './types.js';
|
|
2
|
+
export interface ServerOptions extends BrowserOptions {
|
|
3
|
+
port?: number;
|
|
4
|
+
}
|
|
5
|
+
export declare class BrowserServer {
|
|
6
|
+
private browser;
|
|
7
|
+
private app;
|
|
8
|
+
private server;
|
|
9
|
+
private port;
|
|
10
|
+
constructor(options?: ServerOptions);
|
|
11
|
+
private setupMiddleware;
|
|
12
|
+
private setupRoutes;
|
|
13
|
+
private handleCommand;
|
|
14
|
+
start(): Promise<void>;
|
|
15
|
+
stop(): Promise<void>;
|
|
16
|
+
getPort(): number;
|
|
17
|
+
getApp(): import("express-serve-static-core").Express;
|
|
18
|
+
}
|
|
19
|
+
export declare function startServer(options?: ServerOptions): Promise<BrowserServer>;
|
|
20
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAkB,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjE,MAAM,WAAW,aAAc,SAAQ,cAAc;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAuBD,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,GAAG,CAAa;IACxB,OAAO,CAAC,MAAM,CAAmD;IACjE,OAAO,CAAC,IAAI,CAAS;gBAET,OAAO,GAAE,aAAkB;IAOvC,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,WAAW;YAIL,aAAa;IAsBrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAWtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B,OAAO,IAAI,MAAM;IAIjB,MAAM;CAGP;AAED,wBAAsB,WAAW,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,aAAa,CAAC,CAIrF"}
|