cdp-mcp 0.2.1 → 0.4.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 +28 -303
- package/bin.js +23 -0
- package/contract.d.ts +1 -0
- package/contract.js +2 -0
- package/index.d.ts +1 -0
- package/index.js +2 -0
- package/package.json +31 -73
- package/dist/contract.d.ts +0 -11
- package/dist/contract.js +0 -11
- package/dist/contract.js.map +0 -1
- package/dist/index.d.ts +0 -18
- package/dist/index.js +0 -402
- package/dist/index.js.map +0 -1
- package/dist/locator.d.ts +0 -108
- package/dist/locator.js +0 -176
- package/dist/locator.js.map +0 -1
- package/dist/server.d.ts +0 -2
- package/dist/server.js +0 -41
- package/dist/server.js.map +0 -1
- package/dist/session/browser.d.ts +0 -29
- package/dist/session/browser.js +0 -409
- package/dist/session/browser.js.map +0 -1
- package/dist/session/buffers.d.ts +0 -48
- package/dist/session/buffers.js +0 -43
- package/dist/session/buffers.js.map +0 -1
- package/dist/session/pause.d.ts +0 -21
- package/dist/session/pause.js +0 -99
- package/dist/session/pause.js.map +0 -1
- package/dist/session/state.d.ts +0 -53
- package/dist/session/state.js +0 -93
- package/dist/session/state.js.map +0 -1
- package/dist/sourcemap/loader.d.ts +0 -4
- package/dist/sourcemap/loader.js +0 -138
- package/dist/sourcemap/loader.js.map +0 -1
- package/dist/sourcemap/normalize.d.ts +0 -2
- package/dist/sourcemap/normalize.js +0 -59
- package/dist/sourcemap/normalize.js.map +0 -1
- package/dist/sourcemap/store.d.ts +0 -57
- package/dist/sourcemap/store.js +0 -185
- package/dist/sourcemap/store.js.map +0 -1
- package/dist/tools/_locator_runtime.d.ts +0 -31
- package/dist/tools/_locator_runtime.js +0 -243
- package/dist/tools/_locator_runtime.js.map +0 -1
- package/dist/tools/_register.d.ts +0 -2
- package/dist/tools/_register.js +0 -30
- package/dist/tools/_register.js.map +0 -1
- package/dist/tools/breakpoints.d.ts +0 -4
- package/dist/tools/breakpoints.js +0 -164
- package/dist/tools/breakpoints.js.map +0 -1
- package/dist/tools/console.d.ts +0 -2
- package/dist/tools/console.js +0 -48
- package/dist/tools/console.js.map +0 -1
- package/dist/tools/dom.d.ts +0 -2
- package/dist/tools/dom.js +0 -309
- package/dist/tools/dom.js.map +0 -1
- package/dist/tools/execution.d.ts +0 -29
- package/dist/tools/execution.js +0 -89
- package/dist/tools/execution.js.map +0 -1
- package/dist/tools/forms.d.ts +0 -8
- package/dist/tools/forms.js +0 -256
- package/dist/tools/forms.js.map +0 -1
- package/dist/tools/inspect.d.ts +0 -2
- package/dist/tools/inspect.js +0 -178
- package/dist/tools/inspect.js.map +0 -1
- package/dist/tools/nav.d.ts +0 -2
- package/dist/tools/nav.js +0 -136
- package/dist/tools/nav.js.map +0 -1
- package/dist/tools/network.d.ts +0 -2
- package/dist/tools/network.js +0 -137
- package/dist/tools/network.js.map +0 -1
- package/dist/tools/session.d.ts +0 -2
- package/dist/tools/session.js +0 -76
- package/dist/tools/session.js.map +0 -1
- package/dist/tools/source.d.ts +0 -2
- package/dist/tools/source.js +0 -63
- package/dist/tools/source.js.map +0 -1
- package/dist/tools/storage.d.ts +0 -2
- package/dist/tools/storage.js +0 -296
- package/dist/tools/storage.js.map +0 -1
- package/dist/util/browser-resolve.d.ts +0 -19
- package/dist/util/browser-resolve.js +0 -263
- package/dist/util/browser-resolve.js.map +0 -1
- package/dist/util/errors.d.ts +0 -7
- package/dist/util/errors.js +0 -12
- package/dist/util/errors.js.map +0 -1
- package/dist/util/format.d.ts +0 -20
- package/dist/util/format.js +0 -65
- package/dist/util/format.js.map +0 -1
- package/dist/util/log.d.ts +0 -6
- package/dist/util/log.js +0 -34
- package/dist/util/log.js.map +0 -1
- package/docs/chromium-sandboxing.md +0 -197
- package/docs/known-chromium-gaps.md +0 -138
- package/docs/launchd-service.md +0 -217
- package/docs/local-l3-e2e-setup.md +0 -199
- package/docs/systemd-service.md +0 -233
package/dist/index.js
DELETED
|
@@ -1,402 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { createServer } from "node:http";
|
|
3
|
-
import { realpathSync } from "node:fs";
|
|
4
|
-
import { pathToFileURL } from "node:url";
|
|
5
|
-
import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
|
|
6
|
-
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
7
|
-
import { buildServer } from "./server.js";
|
|
8
|
-
import { getSession, sessionState } from "./session/state.js";
|
|
9
|
-
import { log } from "./util/log.js";
|
|
10
|
-
const LOOPBACK_HOSTS = new Set(["127.0.0.1", "localhost", "::1"]);
|
|
11
|
-
function isLoopbackHost(host) {
|
|
12
|
-
return LOOPBACK_HOSTS.has(host);
|
|
13
|
-
}
|
|
14
|
-
function parseArgs(args) {
|
|
15
|
-
let port;
|
|
16
|
-
let host = "127.0.0.1";
|
|
17
|
-
let allowRemote = process.env.CDP_MCP_ALLOW_REMOTE === "1";
|
|
18
|
-
for (let index = 0; index < args.length; index += 1) {
|
|
19
|
-
const arg = args[index];
|
|
20
|
-
if (!arg) {
|
|
21
|
-
continue;
|
|
22
|
-
}
|
|
23
|
-
if (arg === "--help" || arg === "-h") {
|
|
24
|
-
process.stderr.write([
|
|
25
|
-
"Usage:",
|
|
26
|
-
" cdp-mcp # stdio MCP transport",
|
|
27
|
-
" cdp-mcp --port 9719 # SSE MCP transport on 127.0.0.1:9719",
|
|
28
|
-
" cdp-mcp --host 0.0.0.0 --port 9719 --allow-remote",
|
|
29
|
-
"",
|
|
30
|
-
"SSE mode caveats:",
|
|
31
|
-
" - Single-client only: concurrent /sse connections race on a",
|
|
32
|
-
" shared browser session (sessionState is process-global).",
|
|
33
|
-
" - Non-loopback bind requires --allow-remote (or",
|
|
34
|
-
" CDP_MCP_ALLOW_REMOTE=1). MCP tools include in-page eval and",
|
|
35
|
-
" server-filesystem writes; exposing them remotely without",
|
|
36
|
-
" further auth is a deliberate operator decision.",
|
|
37
|
-
" - Host / Origin headers are validated against the loopback",
|
|
38
|
-
" aliases (127.0.0.1, localhost, [::1]) to block",
|
|
39
|
-
" DNS-rebinding. On non-loopback binds the operator has",
|
|
40
|
-
" accepted exposure via --allow-remote, and we cannot",
|
|
41
|
-
" enumerate every reachable hostname/IP, so the checks",
|
|
42
|
-
" are skipped — front the server with a reverse proxy if",
|
|
43
|
-
" you need per-Host policy.",
|
|
44
|
-
"",
|
|
45
|
-
].join("\n"));
|
|
46
|
-
process.exit(0);
|
|
47
|
-
}
|
|
48
|
-
if (arg === "--port") {
|
|
49
|
-
const value = args[index + 1];
|
|
50
|
-
if (!value)
|
|
51
|
-
throw new Error("--port requires a value");
|
|
52
|
-
port = parsePort(value);
|
|
53
|
-
index += 1;
|
|
54
|
-
continue;
|
|
55
|
-
}
|
|
56
|
-
if (arg.startsWith("--port=")) {
|
|
57
|
-
port = parsePort(arg.slice("--port=".length));
|
|
58
|
-
continue;
|
|
59
|
-
}
|
|
60
|
-
if (arg === "--host") {
|
|
61
|
-
const value = args[index + 1];
|
|
62
|
-
if (!value)
|
|
63
|
-
throw new Error("--host requires a value");
|
|
64
|
-
host = value;
|
|
65
|
-
index += 1;
|
|
66
|
-
continue;
|
|
67
|
-
}
|
|
68
|
-
if (arg.startsWith("--host=")) {
|
|
69
|
-
host = arg.slice("--host=".length);
|
|
70
|
-
continue;
|
|
71
|
-
}
|
|
72
|
-
if (arg === "--allow-remote") {
|
|
73
|
-
allowRemote = true;
|
|
74
|
-
continue;
|
|
75
|
-
}
|
|
76
|
-
throw new Error(`Unknown argument: ${arg}`);
|
|
77
|
-
}
|
|
78
|
-
if (port === undefined) {
|
|
79
|
-
return { transport: "stdio" };
|
|
80
|
-
}
|
|
81
|
-
if (!isLoopbackHost(host) && !allowRemote) {
|
|
82
|
-
throw new Error(`Refusing to bind SSE transport on non-loopback host '${host}' without --allow-remote (or CDP_MCP_ALLOW_REMOTE=1). MCP tools include in-page eval and server-filesystem writes; remote exposure is opt-in.`);
|
|
83
|
-
}
|
|
84
|
-
return {
|
|
85
|
-
transport: "sse",
|
|
86
|
-
host,
|
|
87
|
-
port,
|
|
88
|
-
allowRemote,
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
function parsePort(raw) {
|
|
92
|
-
const port = Number(raw);
|
|
93
|
-
if (!Number.isInteger(port) || port < 1 || port > 65535) {
|
|
94
|
-
throw new Error(`Invalid --port value: ${raw}`);
|
|
95
|
-
}
|
|
96
|
-
return port;
|
|
97
|
-
}
|
|
98
|
-
const DEFAULT_SSE_KEEPALIVE_MS = 25_000;
|
|
99
|
-
// SSE streams sit idle between tool calls, and HTTP clients enforce a
|
|
100
|
-
// body-idle timeout (e.g. undici inside GitHub Copilot CLI tears the stream
|
|
101
|
-
// down after ~12 min with "Body Timeout Error"). A periodic SSE comment frame
|
|
102
|
-
// (`: ...\n\n`) is a no-op per the spec but resets that idle timer. Tunable via
|
|
103
|
-
// CDP_MCP_SSE_KEEPALIVE_MS (non-negative integer ms; 0 disables). See issue #1.
|
|
104
|
-
function getKeepaliveMs() {
|
|
105
|
-
const raw = process.env.CDP_MCP_SSE_KEEPALIVE_MS;
|
|
106
|
-
if (raw === undefined || raw === "")
|
|
107
|
-
return DEFAULT_SSE_KEEPALIVE_MS;
|
|
108
|
-
const value = Number(raw);
|
|
109
|
-
if (!Number.isInteger(value) || value < 0) {
|
|
110
|
-
log.warn("invalid CDP_MCP_SSE_KEEPALIVE_MS; using default", { value: raw, default: DEFAULT_SSE_KEEPALIVE_MS });
|
|
111
|
-
return DEFAULT_SSE_KEEPALIVE_MS;
|
|
112
|
-
}
|
|
113
|
-
return value;
|
|
114
|
-
}
|
|
115
|
-
async function main() {
|
|
116
|
-
const mode = parseArgs(process.argv.slice(2));
|
|
117
|
-
if (mode.transport === "sse") {
|
|
118
|
-
await runSseServer(mode);
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
await runStdioServer();
|
|
122
|
-
}
|
|
123
|
-
async function runStdioServer() {
|
|
124
|
-
const server = buildServer();
|
|
125
|
-
const transport = new StdioServerTransport();
|
|
126
|
-
await server.connect(transport);
|
|
127
|
-
log.info("cdp-mcp server started", { pid: process.pid });
|
|
128
|
-
const shutdown = async (signal) => {
|
|
129
|
-
log.info(`shutdown signal: ${signal}`);
|
|
130
|
-
try {
|
|
131
|
-
const session = getSession();
|
|
132
|
-
if (session)
|
|
133
|
-
await sessionState.close();
|
|
134
|
-
}
|
|
135
|
-
catch (e) {
|
|
136
|
-
log.warn("error during shutdown", { error: String(e) });
|
|
137
|
-
}
|
|
138
|
-
try {
|
|
139
|
-
await server.close();
|
|
140
|
-
}
|
|
141
|
-
catch (e) {
|
|
142
|
-
log.warn("error closing server", { error: String(e) });
|
|
143
|
-
}
|
|
144
|
-
process.exit(0);
|
|
145
|
-
};
|
|
146
|
-
process.on("SIGINT", () => void shutdown("SIGINT"));
|
|
147
|
-
process.on("SIGTERM", () => void shutdown("SIGTERM"));
|
|
148
|
-
installProcessErrorHandlers();
|
|
149
|
-
}
|
|
150
|
-
async function runSseServer(mode) {
|
|
151
|
-
const clients = new Map();
|
|
152
|
-
// Host/Origin validation is a DNS-rebinding defense — it bites only
|
|
153
|
-
// on loopback binds, where an attacker page can be tricked into
|
|
154
|
-
// reaching 127.0.0.1 via a rebound DNS name. On non-loopback binds
|
|
155
|
-
// the operator has explicitly accepted exposure via --allow-remote,
|
|
156
|
-
// and we cannot statically enumerate every hostname/IP the host
|
|
157
|
-
// might be reached by (LAN IP, hostname, mDNS, VPN, …) — so we skip
|
|
158
|
-
// both checks and treat --allow-remote as the gate.
|
|
159
|
-
const validateHostOrigin = isLoopbackHost(mode.host);
|
|
160
|
-
const allowedHosts = validateHostOrigin ? buildAllowedHosts(mode.host, mode.port) : new Set();
|
|
161
|
-
const allowedOrigins = validateHostOrigin ? buildAllowedOrigins(mode.host, mode.port) : new Set();
|
|
162
|
-
const httpServer = createServer((req, res) => {
|
|
163
|
-
void handleSseRequest({
|
|
164
|
-
req,
|
|
165
|
-
res,
|
|
166
|
-
clients,
|
|
167
|
-
host: mode.host,
|
|
168
|
-
port: mode.port,
|
|
169
|
-
validateHostOrigin,
|
|
170
|
-
allowedHosts,
|
|
171
|
-
allowedOrigins,
|
|
172
|
-
});
|
|
173
|
-
});
|
|
174
|
-
await listen(httpServer, mode);
|
|
175
|
-
log.info("cdp-mcp SSE server started", {
|
|
176
|
-
pid: process.pid,
|
|
177
|
-
url: `http://${mode.host}:${mode.port}/sse`,
|
|
178
|
-
allowRemote: mode.allowRemote,
|
|
179
|
-
});
|
|
180
|
-
if (!isLoopbackHost(mode.host)) {
|
|
181
|
-
log.warn("SSE bound to non-loopback host — exposing in-page eval + filesystem-write tools without auth (operator opted in via --allow-remote)", { host: mode.host, port: mode.port });
|
|
182
|
-
}
|
|
183
|
-
// Close SSE transports BEFORE the HTTP server: Node's server.close()
|
|
184
|
-
// waits for in-flight requests to drain, and /sse connections are
|
|
185
|
-
// long-lived by design — closing the HTTP server first would hang
|
|
186
|
-
// SIGINT / SIGTERM indefinitely.
|
|
187
|
-
const shutdown = async (signal) => {
|
|
188
|
-
log.info(`shutdown signal: ${signal}`);
|
|
189
|
-
await closeSseClients(clients);
|
|
190
|
-
await closeHttpServer(httpServer);
|
|
191
|
-
try {
|
|
192
|
-
const session = getSession();
|
|
193
|
-
if (session)
|
|
194
|
-
await sessionState.close();
|
|
195
|
-
}
|
|
196
|
-
catch (e) {
|
|
197
|
-
log.warn("error during shutdown", { error: String(e) });
|
|
198
|
-
}
|
|
199
|
-
process.exit(0);
|
|
200
|
-
};
|
|
201
|
-
process.on("SIGINT", () => void shutdown("SIGINT"));
|
|
202
|
-
process.on("SIGTERM", () => void shutdown("SIGTERM"));
|
|
203
|
-
installProcessErrorHandlers();
|
|
204
|
-
}
|
|
205
|
-
function installProcessErrorHandlers() {
|
|
206
|
-
process.on("uncaughtException", (err) => {
|
|
207
|
-
log.error("uncaughtException", { error: String(err), stack: err.stack });
|
|
208
|
-
});
|
|
209
|
-
process.on("unhandledRejection", (reason) => {
|
|
210
|
-
log.error("unhandledRejection", { reason: String(reason) });
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
export async function handleSseRequest({ req, res, clients, host, port, validateHostOrigin, allowedHosts, allowedOrigins, }) {
|
|
214
|
-
try {
|
|
215
|
-
// DNS-rebinding defense for loopback binds: validate Host (and
|
|
216
|
-
// Origin if present) before the SDK touches the request. The MCP
|
|
217
|
-
// SDK's SSEServerTransport does not gate either header by default.
|
|
218
|
-
// Skipped on non-loopback binds — see runSseServer for rationale.
|
|
219
|
-
if (validateHostOrigin) {
|
|
220
|
-
const headerHost = req.headers.host;
|
|
221
|
-
if (!headerHost || !allowedHosts.has(headerHost)) {
|
|
222
|
-
log.warn("rejecting SSE request with disallowed Host header", {
|
|
223
|
-
host: headerHost,
|
|
224
|
-
bindHost: host,
|
|
225
|
-
});
|
|
226
|
-
respondText(res, 403, "forbidden\n");
|
|
227
|
-
return;
|
|
228
|
-
}
|
|
229
|
-
// Origin is only sent by browsers (and is `null` for sandboxed
|
|
230
|
-
// iframes / file://). Checking it when present is the
|
|
231
|
-
// cross-origin defense layer; the Host check above is what
|
|
232
|
-
// catches non-browser callers and Origin-omitting browsers.
|
|
233
|
-
const originHeader = req.headers.origin;
|
|
234
|
-
if (originHeader && !allowedOrigins.has(originHeader)) {
|
|
235
|
-
log.warn("rejecting SSE request with disallowed Origin header", { origin: originHeader });
|
|
236
|
-
respondText(res, 403, "forbidden\n");
|
|
237
|
-
return;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
const url = new URL(req.url ?? "/", `http://${req.headers.host ?? `${host}:${port}`}`);
|
|
241
|
-
if (req.method === "GET" && url.pathname === "/sse") {
|
|
242
|
-
await startSseConnection({ res, clients });
|
|
243
|
-
return;
|
|
244
|
-
}
|
|
245
|
-
if (req.method === "POST" && url.pathname === "/messages") {
|
|
246
|
-
await handleSseMessage({ req, res, clients, sessionId: url.searchParams.get("sessionId") });
|
|
247
|
-
return;
|
|
248
|
-
}
|
|
249
|
-
respondText(res, 404, "not found\n");
|
|
250
|
-
}
|
|
251
|
-
catch (e) {
|
|
252
|
-
log.error("SSE request failed", { error: String(e) });
|
|
253
|
-
if (!res.headersSent) {
|
|
254
|
-
respondText(res, 500, "internal server error\n");
|
|
255
|
-
}
|
|
256
|
-
else {
|
|
257
|
-
res.end();
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
// Called only on loopback binds (see runSseServer). The set covers the
|
|
262
|
-
// three loopback aliases a browser or CLI might use to reach a 127.0.0.1
|
|
263
|
-
// / localhost / ::1 server; anything else implies DNS-rebinding.
|
|
264
|
-
function buildAllowedHosts(bindHost, port) {
|
|
265
|
-
const hosts = new Set([
|
|
266
|
-
`${bindHost}:${port}`,
|
|
267
|
-
`127.0.0.1:${port}`,
|
|
268
|
-
`localhost:${port}`,
|
|
269
|
-
`[::1]:${port}`,
|
|
270
|
-
]);
|
|
271
|
-
return hosts;
|
|
272
|
-
}
|
|
273
|
-
function buildAllowedOrigins(bindHost, port) {
|
|
274
|
-
const origins = new Set();
|
|
275
|
-
for (const hostPort of buildAllowedHosts(bindHost, port)) {
|
|
276
|
-
origins.add(`http://${hostPort}`);
|
|
277
|
-
origins.add(`https://${hostPort}`);
|
|
278
|
-
}
|
|
279
|
-
return origins;
|
|
280
|
-
}
|
|
281
|
-
async function startSseConnection({ res, clients, }) {
|
|
282
|
-
const transport = new SSEServerTransport("/messages", res);
|
|
283
|
-
const server = buildServer();
|
|
284
|
-
// Assigned after connect() (below) so the keepalive never writes before the
|
|
285
|
-
// SDK has sent the SSE response headers; cleared here on disconnect.
|
|
286
|
-
let keepalive;
|
|
287
|
-
transport.onclose = () => {
|
|
288
|
-
if (keepalive)
|
|
289
|
-
clearInterval(keepalive);
|
|
290
|
-
const client = clients.get(transport.sessionId);
|
|
291
|
-
clients.delete(transport.sessionId);
|
|
292
|
-
void client?.server.close().catch((e) => {
|
|
293
|
-
log.warn("error closing MCP server for SSE client", { sessionId: transport.sessionId, error: String(e) });
|
|
294
|
-
});
|
|
295
|
-
};
|
|
296
|
-
transport.onerror = (e) => {
|
|
297
|
-
log.warn("SSE transport error", { sessionId: transport.sessionId, error: String(e) });
|
|
298
|
-
};
|
|
299
|
-
clients.set(transport.sessionId, { server, transport });
|
|
300
|
-
await server.connect(transport);
|
|
301
|
-
// connect() has now written the SSE headers + endpoint event, so it's safe
|
|
302
|
-
// to interleave keepalive comment frames on the stream.
|
|
303
|
-
const keepaliveMs = getKeepaliveMs();
|
|
304
|
-
if (keepaliveMs > 0) {
|
|
305
|
-
keepalive = setInterval(() => {
|
|
306
|
-
if (res.writableEnded)
|
|
307
|
-
return;
|
|
308
|
-
try {
|
|
309
|
-
res.write(": keepalive\n\n");
|
|
310
|
-
}
|
|
311
|
-
catch (e) {
|
|
312
|
-
log.warn("SSE keepalive write failed", { sessionId: transport.sessionId, error: String(e) });
|
|
313
|
-
}
|
|
314
|
-
}, keepaliveMs);
|
|
315
|
-
// Don't let the keepalive timer alone keep the process alive.
|
|
316
|
-
keepalive.unref();
|
|
317
|
-
}
|
|
318
|
-
log.info("SSE client connected", { sessionId: transport.sessionId });
|
|
319
|
-
}
|
|
320
|
-
async function handleSseMessage({ req, res, clients, sessionId, }) {
|
|
321
|
-
if (!sessionId) {
|
|
322
|
-
respondText(res, 400, "missing sessionId\n");
|
|
323
|
-
return;
|
|
324
|
-
}
|
|
325
|
-
const client = clients.get(sessionId);
|
|
326
|
-
if (!client) {
|
|
327
|
-
respondText(res, 404, "unknown sessionId\n");
|
|
328
|
-
return;
|
|
329
|
-
}
|
|
330
|
-
await client.transport.handlePostMessage(req, res);
|
|
331
|
-
}
|
|
332
|
-
async function listen(server, mode) {
|
|
333
|
-
await new Promise((resolve, reject) => {
|
|
334
|
-
const onError = (e) => {
|
|
335
|
-
server.off("listening", onListening);
|
|
336
|
-
reject(e);
|
|
337
|
-
};
|
|
338
|
-
const onListening = () => {
|
|
339
|
-
server.off("error", onError);
|
|
340
|
-
resolve();
|
|
341
|
-
};
|
|
342
|
-
server.once("error", onError);
|
|
343
|
-
server.once("listening", onListening);
|
|
344
|
-
server.listen(mode.port, mode.host);
|
|
345
|
-
});
|
|
346
|
-
}
|
|
347
|
-
async function closeHttpServer(server) {
|
|
348
|
-
await new Promise((resolve, reject) => {
|
|
349
|
-
server.close((e) => {
|
|
350
|
-
if (e) {
|
|
351
|
-
reject(e);
|
|
352
|
-
return;
|
|
353
|
-
}
|
|
354
|
-
resolve();
|
|
355
|
-
});
|
|
356
|
-
}).catch((e) => {
|
|
357
|
-
log.warn("error closing HTTP server", { error: String(e) });
|
|
358
|
-
});
|
|
359
|
-
}
|
|
360
|
-
async function closeSseClients(clients) {
|
|
361
|
-
const entries = [...clients.entries()];
|
|
362
|
-
clients.clear();
|
|
363
|
-
await Promise.all(entries.map(async ([sessionId, client]) => {
|
|
364
|
-
try {
|
|
365
|
-
await client.transport.close();
|
|
366
|
-
}
|
|
367
|
-
catch (e) {
|
|
368
|
-
log.warn("error closing SSE transport", { sessionId, error: String(e) });
|
|
369
|
-
}
|
|
370
|
-
try {
|
|
371
|
-
await client.server.close();
|
|
372
|
-
}
|
|
373
|
-
catch (e) {
|
|
374
|
-
log.warn("error closing MCP server", { sessionId, error: String(e) });
|
|
375
|
-
}
|
|
376
|
-
}));
|
|
377
|
-
}
|
|
378
|
-
function respondText(res, statusCode, body) {
|
|
379
|
-
res.writeHead(statusCode, { "Content-Type": "text/plain; charset=utf-8" });
|
|
380
|
-
res.end(body);
|
|
381
|
-
}
|
|
382
|
-
// Only run the server when executed as the CLI entry point — not when this
|
|
383
|
-
// module is imported (e.g. by the SSE transport tests). `realpathSync`
|
|
384
|
-
// resolves the npm bin symlink so the comparison holds for global installs.
|
|
385
|
-
function isRunAsMain() {
|
|
386
|
-
const entry = process.argv[1];
|
|
387
|
-
if (!entry)
|
|
388
|
-
return false;
|
|
389
|
-
try {
|
|
390
|
-
return import.meta.url === pathToFileURL(realpathSync(entry)).href;
|
|
391
|
-
}
|
|
392
|
-
catch {
|
|
393
|
-
return false;
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
if (isRunAsMain()) {
|
|
397
|
-
main().catch((err) => {
|
|
398
|
-
log.error("fatal", { error: String(err), stack: err?.stack });
|
|
399
|
-
process.exit(1);
|
|
400
|
-
});
|
|
401
|
-
}
|
|
402
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/locator.d.ts
DELETED
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Canonical `LocatorSpec` contract for cdp-mcp.
|
|
3
|
-
*
|
|
4
|
-
* This module is the single source of truth for the structured element-locator
|
|
5
|
-
* shape that `locate`, `wait_for`, and the form-driving tools accept. It is
|
|
6
|
-
* deliberately **side-effect free** and depends only on `zod`, so external
|
|
7
|
-
* consumers can import it (via `cdp-mcp/contract`) to produce and validate specs
|
|
8
|
-
* without pulling in the CLI/server. Tool code re-imports these symbols rather
|
|
9
|
-
* than redefining them, so the published contract can never silently drift from
|
|
10
|
-
* what the tools actually accept.
|
|
11
|
-
*/
|
|
12
|
-
import { z } from "zod";
|
|
13
|
-
/**
|
|
14
|
-
* Error thrown by {@link normalizeLocator} / {@link parseLocator} for an invalid
|
|
15
|
-
* spec. `code` mirrors the cdp-mcp tool error codes so tool handlers can re-wrap it
|
|
16
|
-
* structurally: `"missing_arg"` when a spec is under-specified for its strategy,
|
|
17
|
-
* `"invalid_locator"` for an unsupported strategy.
|
|
18
|
-
*/
|
|
19
|
-
export declare class LocatorError extends Error {
|
|
20
|
-
readonly code: string;
|
|
21
|
-
constructor(message: string, code?: string);
|
|
22
|
-
}
|
|
23
|
-
/** The locator strategies cdp-mcp understands. `css` is the default when a selector is given. */
|
|
24
|
-
export declare const locatorBySchema: z.ZodEnum<["css", "text", "role", "test_id", "testId", "label", "placeholder", "name"]>;
|
|
25
|
-
/**
|
|
26
|
-
* The raw Zod shape for a LocatorSpec. Spread into tool input schemas
|
|
27
|
-
* (`{ ...locatorShape, ... }`) so the field docs stay identical everywhere.
|
|
28
|
-
*/
|
|
29
|
-
export declare const locatorShape: {
|
|
30
|
-
by: z.ZodOptional<z.ZodEnum<["css", "text", "role", "test_id", "testId", "label", "placeholder", "name"]>>;
|
|
31
|
-
selector: z.ZodOptional<z.ZodString>;
|
|
32
|
-
css: z.ZodOptional<z.ZodString>;
|
|
33
|
-
text: z.ZodOptional<z.ZodString>;
|
|
34
|
-
role: z.ZodOptional<z.ZodString>;
|
|
35
|
-
name: z.ZodOptional<z.ZodString>;
|
|
36
|
-
test_id: z.ZodOptional<z.ZodString>;
|
|
37
|
-
testId: z.ZodOptional<z.ZodString>;
|
|
38
|
-
label: z.ZodOptional<z.ZodString>;
|
|
39
|
-
placeholder: z.ZodOptional<z.ZodString>;
|
|
40
|
-
exact: z.ZodOptional<z.ZodBoolean>;
|
|
41
|
-
};
|
|
42
|
-
/** A standalone `ZodObject` for a LocatorSpec — external consumers can `.parse()`/`.safeParse()`. */
|
|
43
|
-
export declare const locatorSchema: z.ZodObject<{
|
|
44
|
-
by: z.ZodOptional<z.ZodEnum<["css", "text", "role", "test_id", "testId", "label", "placeholder", "name"]>>;
|
|
45
|
-
selector: z.ZodOptional<z.ZodString>;
|
|
46
|
-
css: z.ZodOptional<z.ZodString>;
|
|
47
|
-
text: z.ZodOptional<z.ZodString>;
|
|
48
|
-
role: z.ZodOptional<z.ZodString>;
|
|
49
|
-
name: z.ZodOptional<z.ZodString>;
|
|
50
|
-
test_id: z.ZodOptional<z.ZodString>;
|
|
51
|
-
testId: z.ZodOptional<z.ZodString>;
|
|
52
|
-
label: z.ZodOptional<z.ZodString>;
|
|
53
|
-
placeholder: z.ZodOptional<z.ZodString>;
|
|
54
|
-
exact: z.ZodOptional<z.ZodBoolean>;
|
|
55
|
-
}, "strip", z.ZodTypeAny, {
|
|
56
|
-
css?: string | undefined;
|
|
57
|
-
text?: string | undefined;
|
|
58
|
-
role?: string | undefined;
|
|
59
|
-
test_id?: string | undefined;
|
|
60
|
-
testId?: string | undefined;
|
|
61
|
-
label?: string | undefined;
|
|
62
|
-
placeholder?: string | undefined;
|
|
63
|
-
name?: string | undefined;
|
|
64
|
-
exact?: boolean | undefined;
|
|
65
|
-
by?: "css" | "text" | "role" | "test_id" | "testId" | "label" | "placeholder" | "name" | undefined;
|
|
66
|
-
selector?: string | undefined;
|
|
67
|
-
}, {
|
|
68
|
-
css?: string | undefined;
|
|
69
|
-
text?: string | undefined;
|
|
70
|
-
role?: string | undefined;
|
|
71
|
-
test_id?: string | undefined;
|
|
72
|
-
testId?: string | undefined;
|
|
73
|
-
label?: string | undefined;
|
|
74
|
-
placeholder?: string | undefined;
|
|
75
|
-
name?: string | undefined;
|
|
76
|
-
exact?: boolean | undefined;
|
|
77
|
-
by?: "css" | "text" | "role" | "test_id" | "testId" | "label" | "placeholder" | "name" | undefined;
|
|
78
|
-
selector?: string | undefined;
|
|
79
|
-
}>;
|
|
80
|
-
export type LocatorBy = z.infer<typeof locatorBySchema>;
|
|
81
|
-
export interface LocatorSpec {
|
|
82
|
-
by?: LocatorBy;
|
|
83
|
-
selector?: string;
|
|
84
|
-
css?: string;
|
|
85
|
-
text?: string;
|
|
86
|
-
role?: string;
|
|
87
|
-
name?: string;
|
|
88
|
-
test_id?: string;
|
|
89
|
-
testId?: string;
|
|
90
|
-
label?: string;
|
|
91
|
-
placeholder?: string;
|
|
92
|
-
exact?: boolean;
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Validate and canonicalize a spec: infer `by` from selector/css, enforce the
|
|
96
|
-
* required field for the chosen strategy, and fold the `name` fallback into the
|
|
97
|
-
* strategy-specific field. Throws {@link LocatorError} on an under-specified spec.
|
|
98
|
-
*/
|
|
99
|
-
export declare function normalizeLocator(input: LocatorSpec): LocatorSpec;
|
|
100
|
-
/** Validate an unknown value as a LocatorSpec (shape + strategy requirements). */
|
|
101
|
-
export declare function parseLocator(input: unknown): LocatorSpec;
|
|
102
|
-
/**
|
|
103
|
-
* Serialize a LocatorSpec to a stable, normalized JSON string. Equivalent specs
|
|
104
|
-
* serialize identically regardless of which alias the caller used — e.g.
|
|
105
|
-
* `{ css: ".x" }` and `{ selector: ".x" }` both yield `{"by":"css","selector":".x"}`
|
|
106
|
-
* — so the output is safe to use as a cache key or for equality checks.
|
|
107
|
-
*/
|
|
108
|
-
export declare function serializeLocator(spec: LocatorSpec): string;
|