@diegosouzacdv/jev-browser-mcp 0.3.1 → 0.4.1
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 +132 -54
- package/config/ui-testing.json +18 -3
- package/docs/jev-browser-mcp.md +132 -54
- package/mcp_servers/jev-browser-npm/bin/jev-browser-mcp.cjs +1 -1
- package/mcp_servers/jev-browser-npm/src/config.mjs +55 -8
- package/mcp_servers/jev-browser-npm/src/flow.mjs +1125 -376
- package/mcp_servers/jev-browser-npm/src/jev-client.mjs +5 -4
- package/mcp_servers/jev-browser-npm/src/server.mjs +8 -12
- package/package.json +1 -1
|
@@ -16,8 +16,23 @@ const CONFIG_KEYS = {
|
|
|
16
16
|
"max_flow_steps",
|
|
17
17
|
"max_text_entry_chars",
|
|
18
18
|
],
|
|
19
|
-
nodeBrowser: [
|
|
20
|
-
"max_action_timeout_seconds",
|
|
19
|
+
nodeBrowser: [
|
|
20
|
+
"max_action_timeout_seconds",
|
|
21
|
+
"ready_timeout_seconds_default",
|
|
22
|
+
"max_ready_timeout_seconds",
|
|
23
|
+
"ready_network_idle_default",
|
|
24
|
+
"ready_stable_ms_default",
|
|
25
|
+
"max_ready_stable_ms",
|
|
26
|
+
"post_step_ready_timeout_seconds_default",
|
|
27
|
+
"max_step_timeout_seconds",
|
|
28
|
+
"key_delay_ms_default",
|
|
29
|
+
"reuse_page_default",
|
|
30
|
+
"stop_on_expected_default",
|
|
31
|
+
"snapshot_include_hidden_default",
|
|
32
|
+
"visibility_poll_interval_ms_default",
|
|
33
|
+
"capture_network_error_bodies_default",
|
|
34
|
+
"max_network_error_body_bytes",
|
|
35
|
+
"max_network_error_message_chars",
|
|
21
36
|
"max_upload_files",
|
|
22
37
|
"max_upload_path_chars",
|
|
23
38
|
"max_upload_file_bytes",
|
|
@@ -206,7 +221,7 @@ export function loadSettings({ env = process.env, configPath = CONFIG_PATH } = {
|
|
|
206
221
|
const uploadRoot = configuredUploadRoot
|
|
207
222
|
? configuredDirectory(configuredUploadRoot, `environment ${uploadRootEnv}`)
|
|
208
223
|
: null;
|
|
209
|
-
const snapshotScope = browserOptions.snapshot_scope_default;
|
|
224
|
+
const snapshotScope = browserOptions.snapshot_scope_default;
|
|
210
225
|
if (!new Set(["body", "main", "dialog"]).has(snapshotScope)) {
|
|
211
226
|
throw new JevBrowserError("config/ui-testing.json jev_browser_mcp.browser.snapshot_scope_default must be body, main, or dialog");
|
|
212
227
|
}
|
|
@@ -215,11 +230,28 @@ export function loadSettings({ env = process.env, configPath = CONFIG_PATH } = {
|
|
|
215
230
|
"jev_browser_mcp.browser.tracker_host_suffixes",
|
|
216
231
|
(host) => /^[a-z0-9.-]+$/i.test(host) && !host.startsWith(".") && !host.endsWith("."),
|
|
217
232
|
);
|
|
218
|
-
const blockedResourceTypes = stringList(
|
|
233
|
+
const blockedResourceTypes = stringList(
|
|
219
234
|
browserOptions.blocked_resource_types,
|
|
220
235
|
"jev_browser_mcp.browser.blocked_resource_types",
|
|
221
236
|
(type) => new Set(["font", "media", "image"]).has(type),
|
|
222
|
-
);
|
|
237
|
+
);
|
|
238
|
+
const maxReadyTimeoutSeconds = positiveNumber(browserOptions.max_ready_timeout_seconds, "jev_browser_mcp.browser.max_ready_timeout_seconds");
|
|
239
|
+
const readyTimeoutSecondsDefault = positiveNumber(browserOptions.ready_timeout_seconds_default, "jev_browser_mcp.browser.ready_timeout_seconds_default");
|
|
240
|
+
const maxReadyStableMs = positiveNumber(browserOptions.max_ready_stable_ms, "jev_browser_mcp.browser.max_ready_stable_ms", true);
|
|
241
|
+
const readyStableMsDefault = positiveNumber(browserOptions.ready_stable_ms_default, "jev_browser_mcp.browser.ready_stable_ms_default", true);
|
|
242
|
+
if (readyTimeoutSecondsDefault > maxReadyTimeoutSeconds) {
|
|
243
|
+
throw new JevBrowserError("config/ui-testing.json ready timeout default exceeds its configured maximum");
|
|
244
|
+
}
|
|
245
|
+
if (readyStableMsDefault > maxReadyStableMs) {
|
|
246
|
+
throw new JevBrowserError("config/ui-testing.json stable snapshot default exceeds its configured maximum");
|
|
247
|
+
}
|
|
248
|
+
const postStepReadyTimeoutSeconds = positiveNumber(
|
|
249
|
+
browserOptions.post_step_ready_timeout_seconds_default,
|
|
250
|
+
"jev_browser_mcp.browser.post_step_ready_timeout_seconds_default",
|
|
251
|
+
);
|
|
252
|
+
if (postStepReadyTimeoutSeconds > maxReadyTimeoutSeconds) {
|
|
253
|
+
throw new JevBrowserError("config/ui-testing.json post-step readiness timeout exceeds its configured maximum");
|
|
254
|
+
}
|
|
223
255
|
|
|
224
256
|
return Object.freeze({
|
|
225
257
|
env,
|
|
@@ -229,7 +261,15 @@ export function loadSettings({ env = process.env, configPath = CONFIG_PATH } = {
|
|
|
229
261
|
profileDir: profileDirectory(profileTemplate, channel, env.JEV_BROWSER_PROFILE),
|
|
230
262
|
maxFlowSteps: positiveNumber(document.browser.max_flow_steps, "browser.max_flow_steps", true),
|
|
231
263
|
maxTextEntryChars: positiveNumber(document.browser.max_text_entry_chars, "browser.max_text_entry_chars", true),
|
|
232
|
-
actionTimeoutMs: positiveNumber(browserOptions.max_action_timeout_seconds, "jev_browser_mcp.browser.max_action_timeout_seconds") * 1000,
|
|
264
|
+
actionTimeoutMs: positiveNumber(browserOptions.max_action_timeout_seconds, "jev_browser_mcp.browser.max_action_timeout_seconds") * 1000,
|
|
265
|
+
maxReadyTimeoutSeconds,
|
|
266
|
+
maxReadyStableMs,
|
|
267
|
+
postStepReadyTimeoutMs: postStepReadyTimeoutSeconds * 1000,
|
|
268
|
+
maxStepTimeoutSeconds: positiveNumber(browserOptions.max_step_timeout_seconds, "jev_browser_mcp.browser.max_step_timeout_seconds"),
|
|
269
|
+
keyDelayMs: positiveNumber(browserOptions.key_delay_ms_default, "jev_browser_mcp.browser.key_delay_ms_default", true),
|
|
270
|
+
visibilityPollMs: positiveNumber(browserOptions.visibility_poll_interval_ms_default, "jev_browser_mcp.browser.visibility_poll_interval_ms_default", true),
|
|
271
|
+
maxNetworkErrorBodyBytes: positiveNumber(browserOptions.max_network_error_body_bytes, "jev_browser_mcp.browser.max_network_error_body_bytes", true),
|
|
272
|
+
maxNetworkErrorMessageChars: positiveNumber(browserOptions.max_network_error_message_chars, "jev_browser_mcp.browser.max_network_error_message_chars", true),
|
|
233
273
|
maxUploadFiles: positiveNumber(browserOptions.max_upload_files, "jev_browser_mcp.browser.max_upload_files", true),
|
|
234
274
|
maxUploadPathChars: positiveNumber(browserOptions.max_upload_path_chars, "jev_browser_mcp.browser.max_upload_path_chars", true),
|
|
235
275
|
maxUploadFileBytes: positiveNumber(browserOptions.max_upload_file_bytes, "jev_browser_mcp.browser.max_upload_file_bytes", true),
|
|
@@ -246,8 +286,15 @@ export function loadSettings({ env = process.env, configPath = CONFIG_PATH } = {
|
|
|
246
286
|
screenshotOnFailure: booleanValue(browserOptions.screenshot_on_failure_default, "jev_browser_mcp.browser.screenshot_on_failure_default"),
|
|
247
287
|
traceOnFailure: booleanValue(browserOptions.trace_on_failure_default, "jev_browser_mcp.browser.trace_on_failure_default"),
|
|
248
288
|
captureConsoleErrors: booleanValue(browserOptions.capture_console_errors_default, "jev_browser_mcp.browser.capture_console_errors_default"),
|
|
249
|
-
captureNetworkErrors: booleanValue(browserOptions.capture_network_errors_default, "jev_browser_mcp.browser.capture_network_errors_default"),
|
|
250
|
-
|
|
289
|
+
captureNetworkErrors: booleanValue(browserOptions.capture_network_errors_default, "jev_browser_mcp.browser.capture_network_errors_default"),
|
|
290
|
+
captureNetworkErrorBodies: booleanValue(browserOptions.capture_network_error_bodies_default, "jev_browser_mcp.browser.capture_network_error_bodies_default"),
|
|
291
|
+
blockTrackers: booleanValue(browserOptions.block_trackers_default, "jev_browser_mcp.browser.block_trackers_default"),
|
|
292
|
+
readyNetworkIdle: booleanValue(browserOptions.ready_network_idle_default, "jev_browser_mcp.browser.ready_network_idle_default"),
|
|
293
|
+
reusePage: booleanValue(browserOptions.reuse_page_default, "jev_browser_mcp.browser.reuse_page_default"),
|
|
294
|
+
stopOnExpected: booleanValue(browserOptions.stop_on_expected_default, "jev_browser_mcp.browser.stop_on_expected_default"),
|
|
295
|
+
snapshotIncludeHidden: booleanValue(browserOptions.snapshot_include_hidden_default, "jev_browser_mcp.browser.snapshot_include_hidden_default"),
|
|
296
|
+
readyTimeoutSeconds: readyTimeoutSecondsDefault,
|
|
297
|
+
readyStableMs: readyStableMsDefault,
|
|
251
298
|
snapshotScope,
|
|
252
299
|
}),
|
|
253
300
|
trackerHostSuffixes: Object.freeze(trackerHostSuffixes),
|