@winstonfassett/webdev-gateway 0.1.0-alpha.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/CHANGELOG.md +16 -0
- package/LICENSE +21 -0
- package/README.md +78 -0
- package/dist/adapter-helpers.d.ts +64 -0
- package/dist/adapter-helpers.d.ts.map +1 -0
- package/dist/adapter-helpers.js +297 -0
- package/dist/adapter-helpers.js.map +1 -0
- package/dist/admin/assets/index-DEDI8OIx.css +2 -0
- package/dist/admin/assets/index-DaI40ww1.js +70 -0
- package/dist/admin/assets/tinykeys.module-CjuTRcEz.js +1 -0
- package/dist/admin/index.html +13 -0
- package/dist/admin-rpc.d.ts +27 -0
- package/dist/admin-rpc.d.ts.map +1 -0
- package/dist/admin-rpc.js +147 -0
- package/dist/admin-rpc.js.map +1 -0
- package/dist/admin.d.ts +10 -0
- package/dist/admin.d.ts.map +1 -0
- package/dist/admin.js +202 -0
- package/dist/admin.js.map +1 -0
- package/dist/auto-register.d.ts +10 -0
- package/dist/auto-register.d.ts.map +1 -0
- package/dist/auto-register.js +145 -0
- package/dist/auto-register.js.map +1 -0
- package/dist/cdp-relay.d.ts +110 -0
- package/dist/cdp-relay.d.ts.map +1 -0
- package/dist/cdp-relay.js +616 -0
- package/dist/cdp-relay.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +95 -0
- package/dist/cli.js.map +1 -0
- package/dist/doctor.d.ts +6 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +149 -0
- package/dist/doctor.js.map +1 -0
- package/dist/element-grab-client.js +305 -0
- package/dist/element-grab.d.ts +15 -0
- package/dist/element-grab.d.ts.map +1 -0
- package/dist/element-grab.js +102 -0
- package/dist/element-grab.js.map +1 -0
- package/dist/gateway.d.ts +5 -0
- package/dist/gateway.d.ts.map +1 -0
- package/dist/gateway.js +534 -0
- package/dist/gateway.js.map +1 -0
- package/dist/installer.d.ts +48 -0
- package/dist/installer.d.ts.map +1 -0
- package/dist/installer.js +637 -0
- package/dist/installer.js.map +1 -0
- package/dist/libs/element-source.js +35 -0
- package/dist/libs/modern-screenshot.js +14 -0
- package/dist/log-reader.d.ts +30 -0
- package/dist/log-reader.d.ts.map +1 -0
- package/dist/log-reader.js +174 -0
- package/dist/log-reader.js.map +1 -0
- package/dist/mcp-server.d.ts +22 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +115 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/mcp-tools-core.d.ts +30 -0
- package/dist/mcp-tools-core.d.ts.map +1 -0
- package/dist/mcp-tools-core.js +375 -0
- package/dist/mcp-tools-core.js.map +1 -0
- package/dist/mcp-tools-full.d.ts +4 -0
- package/dist/mcp-tools-full.d.ts.map +1 -0
- package/dist/mcp-tools-full.js +141 -0
- package/dist/mcp-tools-full.js.map +1 -0
- package/dist/playwright-commands.d.ts +33 -0
- package/dist/playwright-commands.d.ts.map +1 -0
- package/dist/playwright-commands.js +356 -0
- package/dist/playwright-commands.js.map +1 -0
- package/dist/registry.d.ts +83 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +205 -0
- package/dist/registry.js.map +1 -0
- package/dist/rpc-server.d.ts +54 -0
- package/dist/rpc-server.d.ts.map +1 -0
- package/dist/rpc-server.js +207 -0
- package/dist/rpc-server.js.map +1 -0
- package/dist/session.d.ts +13 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +61 -0
- package/dist/session.js.map +1 -0
- package/dist/types.d.ts +76 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/webdev-client.js +20 -0
- package/dist/writers/base.d.ts +24 -0
- package/dist/writers/base.d.ts.map +1 -0
- package/dist/writers/base.js +98 -0
- package/dist/writers/base.js.map +1 -0
- package/dist/writers/console.d.ts +8 -0
- package/dist/writers/console.d.ts.map +1 -0
- package/dist/writers/console.js +14 -0
- package/dist/writers/console.js.map +1 -0
- package/dist/writers/dev-events.d.ts +28 -0
- package/dist/writers/dev-events.d.ts.map +1 -0
- package/dist/writers/dev-events.js +53 -0
- package/dist/writers/dev-events.js.map +1 -0
- package/dist/writers/errors.d.ts +8 -0
- package/dist/writers/errors.d.ts.map +1 -0
- package/dist/writers/errors.js +14 -0
- package/dist/writers/errors.js.map +1 -0
- package/dist/writers/network.d.ts +9 -0
- package/dist/writers/network.d.ts.map +1 -0
- package/dist/writers/network.js +17 -0
- package/dist/writers/network.js.map +1 -0
- package/dist/writers/server-console.d.ts +8 -0
- package/dist/writers/server-console.d.ts.map +1 -0
- package/dist/writers/server-console.js +14 -0
- package/dist/writers/server-console.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { McpContext } from './mcp-server.js';
|
|
3
|
+
import type { RegisteredServer } from './registry.js';
|
|
4
|
+
/**
|
|
5
|
+
* Resolve a project target to a server. Accepts:
|
|
6
|
+
* - server ID (projectId:type)
|
|
7
|
+
* - projectId (basename-hash4) — picks first server
|
|
8
|
+
* - full directory path — picks first server
|
|
9
|
+
* - undefined — uses session currentServer, or auto if only one
|
|
10
|
+
*/
|
|
11
|
+
declare function resolveServer(ctx: McpContext, target?: string): RegisteredServer | null;
|
|
12
|
+
declare function getLogPaths(ctx: McpContext, projectArg?: string): Record<string, string>;
|
|
13
|
+
declare function errResult(err: any): {
|
|
14
|
+
content: {
|
|
15
|
+
type: "text";
|
|
16
|
+
text: string;
|
|
17
|
+
}[];
|
|
18
|
+
isError: boolean;
|
|
19
|
+
};
|
|
20
|
+
declare function jsonResult(data: any): {
|
|
21
|
+
content: {
|
|
22
|
+
type: "text";
|
|
23
|
+
text: string;
|
|
24
|
+
}[];
|
|
25
|
+
};
|
|
26
|
+
/** Send a command to the session's locked browser. Tries Playwright (CDP) first, falls back to RPC. */
|
|
27
|
+
declare function cmd(ctx: McpContext, method: string, params?: any): Promise<any>;
|
|
28
|
+
export { resolveServer, getLogPaths, errResult, jsonResult, cmd };
|
|
29
|
+
export declare function registerCoreTools(mcp: McpServer, ctx: McpContext): void;
|
|
30
|
+
//# sourceMappingURL=mcp-tools-core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-tools-core.d.ts","sourceRoot":"","sources":["../src/mcp-tools-core.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAQrD;;;;;;GAMG;AACH,iBAAS,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAmChF;AAED,iBAAS,WAAW,CAAC,GAAG,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGjF;AAED,iBAAS,SAAS,CAAC,GAAG,EAAE,GAAG;;;;;;EAE1B;AAED,iBAAS,UAAU,CAAC,IAAI,EAAE,GAAG;;;;;EAE5B;AAED,uGAAuG;AACvG,iBAAe,GAAG,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,gBAQ/D;AAGD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,CAAA;AAIjE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,QAwXhE"}
|
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
// Core MCP tools: browser_connect, browser_disconnect, browser_list, browser_projects,
|
|
2
|
+
// browser_eval, browser_screenshot, browser_a11y_snapshot, browser_query, browser_debug, logs
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { truncateChannelFiles } from './session.js';
|
|
6
|
+
import { getDiagnostics } from './log-reader.js';
|
|
7
|
+
import { browserCommand, getAllBrowsers } from './rpc-server.js';
|
|
8
|
+
import { tryPlaywrightCommand } from './playwright-commands.js';
|
|
9
|
+
// --- Project/Server Resolution ---
|
|
10
|
+
/**
|
|
11
|
+
* Resolve a project target to a server. Accepts:
|
|
12
|
+
* - server ID (projectId:type)
|
|
13
|
+
* - projectId (basename-hash4) — picks first server
|
|
14
|
+
* - full directory path — picks first server
|
|
15
|
+
* - undefined — uses session currentServer, or auto if only one
|
|
16
|
+
*/
|
|
17
|
+
function resolveServer(ctx, target) {
|
|
18
|
+
const registry = ctx.registry;
|
|
19
|
+
if (!registry)
|
|
20
|
+
return null;
|
|
21
|
+
const lookupTarget = target ?? ctx.currentServer ?? ctx.currentProject;
|
|
22
|
+
if (lookupTarget) {
|
|
23
|
+
// Try exact server ID match
|
|
24
|
+
let server = registry.get(lookupTarget);
|
|
25
|
+
if (server)
|
|
26
|
+
return server;
|
|
27
|
+
// Try directory match
|
|
28
|
+
let servers = registry.getByDirectory(lookupTarget);
|
|
29
|
+
if (servers.length > 0)
|
|
30
|
+
return servers[0];
|
|
31
|
+
// Try projectId match
|
|
32
|
+
servers = registry.getByProjectId(lookupTarget);
|
|
33
|
+
if (servers.length > 0)
|
|
34
|
+
return servers[0];
|
|
35
|
+
// Try parent/child directory match
|
|
36
|
+
for (const s of registry.getAll()) {
|
|
37
|
+
if (s.directory.startsWith(lookupTarget + '/') || lookupTarget.startsWith(s.directory + '/')) {
|
|
38
|
+
return s;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
// No target — auto-resolve if exactly one server
|
|
44
|
+
if (registry.size() === 1) {
|
|
45
|
+
return registry.getAll()[0];
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
function getLogPaths(ctx, projectArg) {
|
|
50
|
+
const server = resolveServer(ctx, projectArg);
|
|
51
|
+
return server?.logPaths ?? ctx.session.files;
|
|
52
|
+
}
|
|
53
|
+
function errResult(err) {
|
|
54
|
+
return { content: [{ type: 'text', text: JSON.stringify({ error: err.message ?? String(err) }) }], isError: true };
|
|
55
|
+
}
|
|
56
|
+
function jsonResult(data) {
|
|
57
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
58
|
+
}
|
|
59
|
+
/** Send a command to the session's locked browser. Tries Playwright (CDP) first, falls back to RPC. */
|
|
60
|
+
async function cmd(ctx, method, params) {
|
|
61
|
+
const server = resolveServer(ctx);
|
|
62
|
+
const serverPort = server?.endpoints[0]?.port;
|
|
63
|
+
const pwResult = await tryPlaywrightCommand(ctx.cdpRelay, method, params, serverPort);
|
|
64
|
+
if (pwResult !== null)
|
|
65
|
+
return pwResult;
|
|
66
|
+
return browserCommand({ browserId: ctx.currentBrowser, serverId: ctx.currentServer }, method, params);
|
|
67
|
+
}
|
|
68
|
+
// Re-export for full tools
|
|
69
|
+
export { resolveServer, getLogPaths, errResult, jsonResult, cmd };
|
|
70
|
+
// --- Tool Registration ---
|
|
71
|
+
export function registerCoreTools(mcp, ctx) {
|
|
72
|
+
// --- browser_connect ---
|
|
73
|
+
mcp.tool('browser_connect', 'Connect to a browser for this session. Locks the session to a specific server and browser. Required before using browser commands when multiple projects are registered.', {
|
|
74
|
+
project: z.string().optional().describe('Project: server ID (projectId:type), projectId, or directory path'),
|
|
75
|
+
browser: z.string().optional().describe('Browser ID to connect to. Default: latest browser for the server.'),
|
|
76
|
+
}, async (args) => {
|
|
77
|
+
const registry = ctx.registry;
|
|
78
|
+
if (!registry) {
|
|
79
|
+
return errResult(new Error('No server registry available'));
|
|
80
|
+
}
|
|
81
|
+
// Resolve server
|
|
82
|
+
const server = resolveServer(ctx, args.project);
|
|
83
|
+
if (!server) {
|
|
84
|
+
const all = registry.getAll();
|
|
85
|
+
if (all.length === 0) {
|
|
86
|
+
return errResult(new Error('No dev servers registered. Start a dev server with the webdev adapter.'));
|
|
87
|
+
}
|
|
88
|
+
if (all.length > 1 && !args.project) {
|
|
89
|
+
return jsonResult({
|
|
90
|
+
error: 'Multiple servers registered. Specify a project.',
|
|
91
|
+
servers: all.map(s => ({
|
|
92
|
+
id: s.id,
|
|
93
|
+
projectId: s.projectId,
|
|
94
|
+
directory: s.directory,
|
|
95
|
+
type: s.type,
|
|
96
|
+
endpoints: s.endpoints,
|
|
97
|
+
browsers: getAllBrowsers().filter(b => b.serverId === s.id).length,
|
|
98
|
+
})),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return errResult(new Error(`No server found matching "${args.project}"`));
|
|
102
|
+
}
|
|
103
|
+
// Lock server
|
|
104
|
+
ctx.currentProject = server.directory;
|
|
105
|
+
ctx.currentServer = server.id;
|
|
106
|
+
// Find browser
|
|
107
|
+
const serverBrowsers = getAllBrowsers().filter(b => b.serverId === server.id);
|
|
108
|
+
let browser;
|
|
109
|
+
if (args.browser) {
|
|
110
|
+
browser = serverBrowsers.find(b => b.browserId === args.browser);
|
|
111
|
+
if (!browser) {
|
|
112
|
+
return jsonResult({
|
|
113
|
+
error: `Browser "${args.browser}" not found for server ${server.id}`,
|
|
114
|
+
available: serverBrowsers.map(b => ({ id: b.browserId, url: b.url, title: b.title })),
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
// Latest browser
|
|
120
|
+
browser = serverBrowsers[serverBrowsers.length - 1];
|
|
121
|
+
}
|
|
122
|
+
if (browser?.browserId) {
|
|
123
|
+
ctx.currentBrowser = browser.browserId;
|
|
124
|
+
}
|
|
125
|
+
// CDP status
|
|
126
|
+
const cdpStatus = ctx.cdpRelay ? {
|
|
127
|
+
available: ctx.cdpRelay.canActivate,
|
|
128
|
+
active: ctx.cdpRelay.isAvailable,
|
|
129
|
+
} : { available: false, active: false };
|
|
130
|
+
return jsonResult({
|
|
131
|
+
server: {
|
|
132
|
+
id: server.id,
|
|
133
|
+
projectId: server.projectId,
|
|
134
|
+
directory: server.directory,
|
|
135
|
+
type: server.type,
|
|
136
|
+
name: server.name,
|
|
137
|
+
endpoints: server.endpoints,
|
|
138
|
+
},
|
|
139
|
+
browser: browser ? {
|
|
140
|
+
id: browser.browserId,
|
|
141
|
+
url: browser.url,
|
|
142
|
+
title: browser.title,
|
|
143
|
+
} : null,
|
|
144
|
+
other_browsers: Math.max(0, serverBrowsers.length - 1),
|
|
145
|
+
cdp: cdpStatus,
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
// --- browser_disconnect ---
|
|
149
|
+
mcp.tool('browser_disconnect', 'Disconnect from the current browser session. Clears server and browser locks.', {}, async () => {
|
|
150
|
+
const prev = { server: ctx.currentServer, browser: ctx.currentBrowser };
|
|
151
|
+
ctx.currentServer = undefined;
|
|
152
|
+
ctx.currentBrowser = undefined;
|
|
153
|
+
ctx.currentProject = undefined;
|
|
154
|
+
return jsonResult({ disconnected: true, previous: prev });
|
|
155
|
+
});
|
|
156
|
+
// --- browser_list ---
|
|
157
|
+
mcp.tool('browser_list', 'List all connected browsers, optionally filtered by server.', {
|
|
158
|
+
server: z.string().optional().describe('Server ID to filter by'),
|
|
159
|
+
}, async (args) => {
|
|
160
|
+
const allBrowsers = getAllBrowsers();
|
|
161
|
+
const browsers = args.server
|
|
162
|
+
? allBrowsers.filter(b => b.serverId === args.server)
|
|
163
|
+
: allBrowsers;
|
|
164
|
+
const result = browsers.map(b => {
|
|
165
|
+
const server = b.serverId && ctx.registry ? ctx.registry.get(b.serverId) : undefined;
|
|
166
|
+
return {
|
|
167
|
+
id: b.browserId,
|
|
168
|
+
connId: b.connId,
|
|
169
|
+
server: b.serverId,
|
|
170
|
+
project: server?.projectId ?? null,
|
|
171
|
+
directory: server?.directory ?? null,
|
|
172
|
+
url: b.url,
|
|
173
|
+
title: b.title,
|
|
174
|
+
connectedAt: b.connectedAt,
|
|
175
|
+
current: b.browserId === ctx.currentBrowser,
|
|
176
|
+
};
|
|
177
|
+
});
|
|
178
|
+
return jsonResult({
|
|
179
|
+
browsers: result,
|
|
180
|
+
current_server: ctx.currentServer ?? null,
|
|
181
|
+
current_browser: ctx.currentBrowser ?? null,
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
// --- browser_projects ---
|
|
185
|
+
mcp.tool('browser_projects', 'List all registered dev server projects.', {}, async () => {
|
|
186
|
+
const projects = [];
|
|
187
|
+
if (ctx.registry) {
|
|
188
|
+
const browsers = getAllBrowsers();
|
|
189
|
+
for (const server of ctx.registry.getAll()) {
|
|
190
|
+
const browserCount = browsers.filter(b => b.serverId === server.id).length;
|
|
191
|
+
projects.push({
|
|
192
|
+
id: server.id,
|
|
193
|
+
projectId: server.projectId,
|
|
194
|
+
directory: server.directory,
|
|
195
|
+
type: server.type,
|
|
196
|
+
name: server.name,
|
|
197
|
+
endpoints: server.endpoints,
|
|
198
|
+
browsers: browserCount,
|
|
199
|
+
current: ctx.currentServer === server.id,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return jsonResult({
|
|
204
|
+
projects,
|
|
205
|
+
current_server: ctx.currentServer ?? null,
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
// --- browser_debug ---
|
|
209
|
+
mcp.tool('browser_debug', 'Start or stop CDP debugging via the Chrome extension. When active, browser commands use Playwright for pixel-perfect screenshots and ref-based element targeting.', {
|
|
210
|
+
action: z.enum(['start', 'stop', 'status']).describe('Start/stop CDP debugging, or check status'),
|
|
211
|
+
}, async (args) => {
|
|
212
|
+
const relay = ctx.cdpRelay;
|
|
213
|
+
if (!relay) {
|
|
214
|
+
return jsonResult({ error: 'CDP relay not available. Chrome extension not connected.' });
|
|
215
|
+
}
|
|
216
|
+
if (args.action === 'status') {
|
|
217
|
+
return jsonResult({
|
|
218
|
+
available: relay.canActivate,
|
|
219
|
+
active: relay.isAvailable,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
if (args.action === 'start') {
|
|
223
|
+
if (!relay.canActivate) {
|
|
224
|
+
return jsonResult({ error: 'Cannot activate debugging. Chrome extension not connected or no tabs detected.' });
|
|
225
|
+
}
|
|
226
|
+
const activated = await relay.ensureDebugging();
|
|
227
|
+
return jsonResult({ active: activated });
|
|
228
|
+
}
|
|
229
|
+
if (args.action === 'stop') {
|
|
230
|
+
relay.releaseDebugging();
|
|
231
|
+
return jsonResult({ active: false });
|
|
232
|
+
}
|
|
233
|
+
return errResult(new Error(`Unknown action: ${args.action}`));
|
|
234
|
+
});
|
|
235
|
+
// --- browser_eval ---
|
|
236
|
+
mcp.tool('browser_eval', 'Run JavaScript in the connected browser. Full DOM access, supports await. Persistent `state` object across calls. `browser.*` helpers available.', {
|
|
237
|
+
code: z.union([z.string(), z.array(z.string())]).describe('JavaScript code. Array = auto-waited pipeline (DOM settles between steps). Promises auto-awaited.'),
|
|
238
|
+
project: z.string().optional().describe('Override project for this call'),
|
|
239
|
+
}, async (args) => {
|
|
240
|
+
try {
|
|
241
|
+
if (!ctx.currentServer && !args.project) {
|
|
242
|
+
// Try auto-resolve
|
|
243
|
+
const server = resolveServer(ctx);
|
|
244
|
+
if (!server) {
|
|
245
|
+
return errResult(new Error('No browser connected. Call browser_connect first.'));
|
|
246
|
+
}
|
|
247
|
+
ctx.currentServer = server.id;
|
|
248
|
+
ctx.currentProject = server.directory;
|
|
249
|
+
}
|
|
250
|
+
const start = Date.now();
|
|
251
|
+
let result = await cmd(ctx, 'eval', { code: args.code });
|
|
252
|
+
// Intercept screenshot results from browser.screenshot()
|
|
253
|
+
let parsed = result;
|
|
254
|
+
if (typeof result === 'string' && result.includes('data:image/')) {
|
|
255
|
+
try {
|
|
256
|
+
parsed = JSON.parse(result);
|
|
257
|
+
}
|
|
258
|
+
catch { }
|
|
259
|
+
}
|
|
260
|
+
if (parsed && typeof parsed === 'object' && typeof parsed.data === 'string'
|
|
261
|
+
&& parsed.data.startsWith('data:image/')) {
|
|
262
|
+
const data = parsed.data;
|
|
263
|
+
const mimeType = data.startsWith('data:image/png') ? 'image/png' : 'image/jpeg';
|
|
264
|
+
const base64 = data.replace(/^data:image\/\w+;base64,/, '');
|
|
265
|
+
const server = resolveServer(ctx, args.project);
|
|
266
|
+
const logDir = server?.logDir ?? ctx.session.logDir;
|
|
267
|
+
const screenshotDir = join(logDir, 'screenshots');
|
|
268
|
+
const { mkdirSync, writeFileSync } = await import('node:fs');
|
|
269
|
+
mkdirSync(screenshotDir, { recursive: true });
|
|
270
|
+
const filename = `screenshot-${Date.now()}.${mimeType === 'image/png' ? 'png' : 'jpg'}`;
|
|
271
|
+
const filepath = join(screenshotDir, filename);
|
|
272
|
+
writeFileSync(filepath, Buffer.from(base64, 'base64'));
|
|
273
|
+
result = JSON.stringify({ screenshot: filepath, width: parsed.width, height: parsed.height });
|
|
274
|
+
}
|
|
275
|
+
const serialized = typeof result === 'string' ? result
|
|
276
|
+
: result === undefined ? 'undefined'
|
|
277
|
+
: result === null ? 'null'
|
|
278
|
+
: JSON.stringify(result, null, 2);
|
|
279
|
+
return jsonResult({ result: serialized, duration_ms: Date.now() - start });
|
|
280
|
+
}
|
|
281
|
+
catch (err) {
|
|
282
|
+
return errResult(err);
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
// --- browser_screenshot ---
|
|
286
|
+
mcp.tool('browser_screenshot', 'Take a screenshot of the connected browser page.', {
|
|
287
|
+
selector: z.string().optional().describe('CSS selector to screenshot. Default: full page.'),
|
|
288
|
+
preset: z.enum(['full', 'viewport']).optional().describe('full = full page, viewport = visible area'),
|
|
289
|
+
format: z.enum(['jpeg', 'png']).optional().describe('Image format. Default: jpeg.'),
|
|
290
|
+
}, async (args) => {
|
|
291
|
+
try {
|
|
292
|
+
const result = await cmd(ctx, 'screenshot', args);
|
|
293
|
+
if (result && typeof result === 'object' && result.data) {
|
|
294
|
+
const data = result.data;
|
|
295
|
+
const mimeType = data.startsWith('data:image/png') ? 'image/png' : 'image/jpeg';
|
|
296
|
+
const base64 = data.replace(/^data:image\/\w+;base64,/, '');
|
|
297
|
+
const server = resolveServer(ctx);
|
|
298
|
+
const logDir = server?.logDir ?? ctx.session.logDir;
|
|
299
|
+
const screenshotDir = join(logDir, 'screenshots');
|
|
300
|
+
const { mkdirSync, writeFileSync } = await import('node:fs');
|
|
301
|
+
mkdirSync(screenshotDir, { recursive: true });
|
|
302
|
+
const filename = `screenshot-${Date.now()}.${mimeType === 'image/png' ? 'png' : 'jpg'}`;
|
|
303
|
+
const filepath = join(screenshotDir, filename);
|
|
304
|
+
writeFileSync(filepath, Buffer.from(base64, 'base64'));
|
|
305
|
+
return jsonResult({ screenshot: filepath, width: result.width, height: result.height });
|
|
306
|
+
}
|
|
307
|
+
return jsonResult(result);
|
|
308
|
+
}
|
|
309
|
+
catch (err) {
|
|
310
|
+
return errResult(err);
|
|
311
|
+
}
|
|
312
|
+
});
|
|
313
|
+
// --- browser_a11y_snapshot ---
|
|
314
|
+
mcp.tool('browser_a11y_snapshot', 'Get an accessibility tree snapshot of the page. Interactive elements get ref IDs for use with click/fill (ref=eN).', {}, async () => {
|
|
315
|
+
try {
|
|
316
|
+
const result = await cmd(ctx, 'a11ySnapshot');
|
|
317
|
+
return jsonResult(result);
|
|
318
|
+
}
|
|
319
|
+
catch (err) {
|
|
320
|
+
return errResult(err);
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
// --- browser_query ---
|
|
324
|
+
mcp.tool('browser_query', 'Query the DOM. Returns matching elements with attributes and text content.', {
|
|
325
|
+
selector: z.string().describe('CSS selector'),
|
|
326
|
+
visible_only: z.boolean().optional().describe('Only return visible elements. Default: true.'),
|
|
327
|
+
}, async (args) => {
|
|
328
|
+
try {
|
|
329
|
+
const result = await cmd(ctx, 'queryDom', { selector: args.selector, visibleOnly: args.visible_only ?? true });
|
|
330
|
+
return jsonResult(result);
|
|
331
|
+
}
|
|
332
|
+
catch (err) {
|
|
333
|
+
return errResult(err);
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
// --- logs ---
|
|
337
|
+
mcp.tool('logs', 'Get or clear project logs. Channels: console, errors, server-console, dev-events, network. Includes build status.', {
|
|
338
|
+
project: z.string().optional().describe('Project (server ID, projectId, or directory). Default: current.'),
|
|
339
|
+
action: z.enum(['get', 'clear']).optional().describe('get (default) or clear'),
|
|
340
|
+
channels: z.array(z.string()).optional().describe('Filter to specific channels'),
|
|
341
|
+
since_checkpoint: z.boolean().optional().describe('Only events since last clear'),
|
|
342
|
+
since_ts: z.number().optional().describe('Only events after this Unix ms timestamp'),
|
|
343
|
+
limit: z.number().optional().describe('Max events per channel (default: 50, max: 200)'),
|
|
344
|
+
level: z.string().optional().describe('Filter by level (error, warn, etc.)'),
|
|
345
|
+
search: z.string().optional().describe('Text search across payloads'),
|
|
346
|
+
browser_id: z.string().optional().describe('Filter by browser ID'),
|
|
347
|
+
}, async (args) => {
|
|
348
|
+
try {
|
|
349
|
+
const logPaths = getLogPaths(ctx, args.project);
|
|
350
|
+
if (args.action === 'clear') {
|
|
351
|
+
const channelsToClear = args.channels ?? Object.keys(logPaths);
|
|
352
|
+
const countsBefore = truncateChannelFiles(logPaths, channelsToClear);
|
|
353
|
+
ctx.session.checkpointTs = Date.now();
|
|
354
|
+
return jsonResult({
|
|
355
|
+
checkpoint_ts: ctx.session.checkpointTs,
|
|
356
|
+
logs_cleared: countsBefore,
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
// Default: get
|
|
360
|
+
const result = getDiagnostics(logPaths, ctx.session, {
|
|
361
|
+
since_checkpoint: args.since_checkpoint,
|
|
362
|
+
since_ts: args.since_ts,
|
|
363
|
+
limit: args.limit,
|
|
364
|
+
level: args.level,
|
|
365
|
+
search: args.search,
|
|
366
|
+
browserId: args.browser_id,
|
|
367
|
+
}, ctx.devEventsWriter);
|
|
368
|
+
return jsonResult(result);
|
|
369
|
+
}
|
|
370
|
+
catch (err) {
|
|
371
|
+
return errResult(err);
|
|
372
|
+
}
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
//# sourceMappingURL=mcp-tools-core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-tools-core.js","sourceRoot":"","sources":["../src/mcp-tools-core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-tools-full.d.ts","sourceRoot":"","sources":["../src/mcp-tools-full.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAGjD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,QAsIhE"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
// Full MCP tool set: browser interaction tools for MCP-only agents (Cursor, Windsurf, etc.)
|
|
2
|
+
// Registered in addition to core tools when ?tools=full is set.
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { cmd, errResult, jsonResult } from './mcp-tools-core.js';
|
|
5
|
+
export function registerFullTools(mcp, ctx) {
|
|
6
|
+
// --- browser_click ---
|
|
7
|
+
mcp.tool('browser_click', 'Click an element. Supports CSS selector, text= prefix, or ref= from a11y snapshot.', { selector: z.string().describe('CSS selector, text=..., or ref=eN') }, async (args) => {
|
|
8
|
+
try {
|
|
9
|
+
return jsonResult(await cmd(ctx, 'click', { selector: args.selector }));
|
|
10
|
+
}
|
|
11
|
+
catch (err) {
|
|
12
|
+
return errResult(err);
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
// --- browser_fill ---
|
|
16
|
+
mcp.tool('browser_fill', 'Fill an input/textarea. Dispatches input and change events.', { selector: z.string().describe('CSS selector, text=..., or ref=eN'), value: z.string().describe('Value to fill') }, async (args) => {
|
|
17
|
+
try {
|
|
18
|
+
return jsonResult(await cmd(ctx, 'fill', { selector: args.selector, value: args.value }));
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
return errResult(err);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
// --- browser_select ---
|
|
25
|
+
mcp.tool('browser_select', 'Select an option in a <select> element.', { selector: z.string().describe('CSS selector'), value: z.string().describe('Option value or text') }, async (args) => {
|
|
26
|
+
try {
|
|
27
|
+
return jsonResult(await cmd(ctx, 'selectOption', { selector: args.selector, value: args.value }));
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
return errResult(err);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
// --- browser_hover ---
|
|
34
|
+
mcp.tool('browser_hover', 'Hover over an element.', { selector: z.string().describe('CSS selector, text=..., or ref=eN') }, async (args) => {
|
|
35
|
+
try {
|
|
36
|
+
return jsonResult(await cmd(ctx, 'hover', { selector: args.selector }));
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
return errResult(err);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
// --- browser_key ---
|
|
43
|
+
mcp.tool('browser_key', 'Press a keyboard key, optionally with modifiers.', {
|
|
44
|
+
key: z.string().describe('Key (e.g. "Enter", "Escape", "a")'),
|
|
45
|
+
modifiers: z.object({ ctrl: z.boolean().optional(), shift: z.boolean().optional(), alt: z.boolean().optional(), meta: z.boolean().optional() }).optional(),
|
|
46
|
+
selector: z.string().optional().describe('Target element. Default: active element.'),
|
|
47
|
+
}, async (args) => {
|
|
48
|
+
try {
|
|
49
|
+
return jsonResult(await cmd(ctx, 'pressKey', { key: args.key, modifiers: args.modifiers, selector: args.selector }));
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
return errResult(err);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
// --- browser_navigate ---
|
|
56
|
+
mcp.tool('browser_navigate', 'Navigate the browser to a URL. Browser may disconnect briefly — wait before next call.', { url: z.string().describe('URL to navigate to') }, async (args) => {
|
|
57
|
+
try {
|
|
58
|
+
return jsonResult(await cmd(ctx, 'navigate', { url: args.url }));
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
return errResult(err);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
// --- browser_back ---
|
|
65
|
+
mcp.tool('browser_back', 'Navigate back in browser history.', async () => {
|
|
66
|
+
try {
|
|
67
|
+
await cmd(ctx, 'eval', { code: 'history.back()' });
|
|
68
|
+
return jsonResult({ action: 'back' });
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
return errResult(err);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
// --- browser_forward ---
|
|
75
|
+
mcp.tool('browser_forward', 'Navigate forward in browser history.', async () => {
|
|
76
|
+
try {
|
|
77
|
+
await cmd(ctx, 'eval', { code: 'history.forward()' });
|
|
78
|
+
return jsonResult({ action: 'forward' });
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
return errResult(err);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
// --- browser_scroll ---
|
|
85
|
+
mcp.tool('browser_scroll', 'Scroll to an element or coordinates.', { selector: z.string().optional(), x: z.number().optional(), y: z.number().optional() }, async (args) => {
|
|
86
|
+
try {
|
|
87
|
+
return jsonResult(await cmd(ctx, 'scroll', { selector: args.selector, x: args.x, y: args.y }));
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
return errResult(err);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
// --- browser_text ---
|
|
94
|
+
mcp.tool('browser_text', 'Get visible text content of an element or the whole page.', { selector: z.string().optional().describe('CSS selector. Default: body.') }, async (args) => {
|
|
95
|
+
try {
|
|
96
|
+
return jsonResult(await cmd(ctx, 'getVisibleText', { selector: args.selector }));
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
return errResult(err);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
// --- browser_markdown ---
|
|
103
|
+
mcp.tool('browser_markdown', 'Convert page DOM to markdown with links, headings, form elements.', { selector: z.string().optional().describe('CSS selector. Default: body.') }, async (args) => {
|
|
104
|
+
try {
|
|
105
|
+
const r = await cmd(ctx, 'getPageMarkdown', { selector: args.selector });
|
|
106
|
+
if (r.error)
|
|
107
|
+
return errResult(new Error(r.error));
|
|
108
|
+
return { content: [{ type: 'text', text: r.markdown }] };
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
return errResult(err);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
// --- browser_wait ---
|
|
115
|
+
mcp.tool('browser_wait', 'Poll browser condition until true or timeout.', {
|
|
116
|
+
check: z.string().describe('JS expression (must return truthy)'),
|
|
117
|
+
timeout: z.number().optional().describe('Timeout ms (default: 5000)'),
|
|
118
|
+
interval: z.number().optional().describe('Poll interval ms (default: 100)'),
|
|
119
|
+
}, async (args) => {
|
|
120
|
+
const timeout = args.timeout ?? 5000;
|
|
121
|
+
const interval = args.interval ?? 100;
|
|
122
|
+
const startTs = Date.now();
|
|
123
|
+
while (true) {
|
|
124
|
+
const elapsed = Date.now() - startTs;
|
|
125
|
+
if (elapsed >= timeout) {
|
|
126
|
+
return jsonResult({ matched: false, duration_ms: elapsed, error: 'Timeout' });
|
|
127
|
+
}
|
|
128
|
+
try {
|
|
129
|
+
const result = await cmd(ctx, 'eval', { code: `return (${args.check})` });
|
|
130
|
+
if (result && result !== 'undefined' && result !== 'null' && result !== 'false') {
|
|
131
|
+
return jsonResult({ matched: true, duration_ms: Date.now() - startTs });
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// Browser not connected yet, keep polling
|
|
136
|
+
}
|
|
137
|
+
await new Promise(r => setTimeout(r, interval));
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=mcp-tools-full.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-tools-full.js","sourceRoot":"","sources":["../src/mcp-tools-full.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Playwright command implementations — used when Chrome extension CDP is available.
|
|
3
|
+
* Falls back to injected client RPC commands when extension is not connected.
|
|
4
|
+
*
|
|
5
|
+
* Each function maps an MCP tool command to the equivalent Playwright API call.
|
|
6
|
+
* Based on @xmorse/playwright-core with getExistingCDPSession pattern from Playwriter.
|
|
7
|
+
*/
|
|
8
|
+
import type { Page } from '@xmorse/playwright-core';
|
|
9
|
+
import type { CDPRelay } from './cdp-relay.js';
|
|
10
|
+
/**
|
|
11
|
+
* Try to execute a browser command via Playwright.
|
|
12
|
+
* Returns the result if CDP is available, or null to signal fallback to RPC.
|
|
13
|
+
*
|
|
14
|
+
* @param serverPort - dev server port to match against page URLs for multi-tab targeting
|
|
15
|
+
*/
|
|
16
|
+
export declare function tryPlaywrightCommand(relay: CDPRelay | undefined, method: string, params?: any, serverPort?: number): Promise<any | null>;
|
|
17
|
+
/** Cached ref entry for resolving ref-based actions */
|
|
18
|
+
export interface RefEntry {
|
|
19
|
+
role: string;
|
|
20
|
+
name: string;
|
|
21
|
+
backendDOMNodeId?: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Take an a11y snapshot with ref IDs for interactive elements.
|
|
25
|
+
* Caches refs on the relay for subsequent ref-based actions.
|
|
26
|
+
*/
|
|
27
|
+
export declare function pwA11ySnapshot(relay: CDPRelay, page: Page, params?: any): Promise<any>;
|
|
28
|
+
/**
|
|
29
|
+
* Resolve a ref (e.g. "e3") to a Playwright locator action.
|
|
30
|
+
* Uses cached refs from the last a11y_snapshot call.
|
|
31
|
+
*/
|
|
32
|
+
export declare function resolveRef(relay: CDPRelay, page: Page, ref: string): Promise<any>;
|
|
33
|
+
//# sourceMappingURL=playwright-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playwright-commands.d.ts","sourceRoot":"","sources":["../src/playwright-commands.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAA;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE9C;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,QAAQ,GAAG,SAAS,EAC3B,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,GAAG,EACZ,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAuDrB;AAsKD,uDAAuD;AACvD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAuHD;;;GAGG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAmB5F;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CASvF"}
|