smooth-operator-mcp 3.0.4 → 3.0.6

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/docs/harnesses.md CHANGED
@@ -56,6 +56,13 @@ npm install -g .
56
56
  smooth-operator install --help
57
57
  ```
58
58
 
59
+ After installation, restart the harness and confirm the 64-tool registry is
60
+ visible. `server_health` reports the active capabilities; `browser_doctor`
61
+ reports whether the configured or discovered executable is launch-ready and
62
+ whether a managed DevTools endpoint is live. Optional idle cleanup is disabled
63
+ by default; set `SMOOTH_OPERATOR_BROWSER_IDLE_TIMEOUT_MS` only when an
64
+ inactive browser should be closed automatically while retaining its profile.
65
+
59
66
  The supported targets are `claude-code`, `opencode`, `copilot`, `codex`,
60
67
  `gemini`, `vscode`, `cursor`, `windsurf`, and `claude-desktop`. Aliases such as
61
68
  `claude`, `github-copilot`, `codex-cli`, `gemini-cli`, and `vs-code` are also
@@ -196,6 +196,14 @@ navigation policy guard is installed; targets whose attachment ownership
196
196
  cannot be determined are blocked or closed. These controls reduce races but do
197
197
  not make a host browser or network firewall trustworthy by themselves.
198
198
 
199
+ Managed startup preflights a regular executable when it needs to launch, and
200
+ launch startup performs the same check before invoking Chromium. Both wait for
201
+ browser launch readiness before returning a connection. The loopback
202
+ `/json/version` probe reads at most 64 KiB, including streamed-byte enforcement
203
+ before JSON parsing. Target auto-attach readiness is acknowledged before a
204
+ browser connection is returned; unsupported connections retain the safe
205
+ unavailable behavior.
206
+
199
207
  Managed and launch modes create owner-only data, files, downloads, and browser
200
208
  profile directories below `SMOOTH_OPERATOR_DATA_DIR` (unless an explicit profile
201
209
  path is supplied), reject unsafe symlink components, and hold a profile lease
@@ -307,6 +315,7 @@ variables include:
307
315
  | `SMOOTH_OPERATOR_BROWSER_TIMEOUT_MS` | `15000` | Per-action deadline |
308
316
  | `SMOOTH_OPERATOR_BROWSER_CONNECT_TIMEOUT_MS` | `30000` | Browser connection deadline |
309
317
  | `SMOOTH_OPERATOR_BROWSER_CDP_TIMEOUT_MS` | `30000` | DevTools command deadline |
318
+ | `SMOOTH_OPERATOR_BROWSER_IDLE_TIMEOUT_MS` | `0` | Idle browser cleanup in milliseconds; `0` disables it, maximum 24 hours |
310
319
  | `SMOOTH_OPERATOR_MAX_SCREENSHOT_BYTES` | `8000000` | Screenshot byte cap |
311
320
  | `SMOOTH_OPERATOR_MAX_HTML_CHARS` | `200000` | HTML output cap |
312
321
  | `SMOOTH_OPERATOR_ALLOWED_DOMAINS` | unset | Comma-separated allowlist |
@@ -359,9 +368,16 @@ are always applied, with explicit opt-ins where documented:
359
368
  the same policy checks; `about:blank` is allowed, data/blob URLs are limited
360
369
  to non-frame subresources, and file, browser-internal, extension, and
361
370
  unknown schemes are rejected.
371
+ - Resource blocking is page-scoped and limited to image, stylesheet, font,
372
+ media, and script subresources. Document and navigation requests cannot be
373
+ selected; matching requests are aborted once without a navigation error, and
374
+ non-blocked requests still receive the full URL policy check.
362
375
  - Upload and PDF destinations must stay within configured directory roots after
363
376
  realpath and symlink checks; an existing regular file cannot be configured as
364
- a root. Download paths and generated files are bounded.
377
+ a root. Upload staging accepts at most 20 files, caps each file at 50 MiB and
378
+ the aggregate at 100 MiB, requires `multiple` on the target input for more
379
+ than one file, and removes staged files on success and every failure path.
380
+ Download paths and generated files are bounded.
365
381
  - Page JavaScript is available in the native profile by default and can be
366
382
  disabled with `SMOOTH_OPERATOR_ALLOW_EVAL=false`; when enabled, page code can
367
383
  observe and mutate page state with the browser's privileges.
@@ -381,7 +397,7 @@ for confirming destructive calls.
381
397
 
382
398
  ### Tools
383
399
 
384
- The registry includes these groups of tools. Every input is schema-validated;
400
+ The registry exposes 64 public tools in these groups. Every input is schema-validated;
385
401
  individual descriptions and limits are returned by `tools/list`.
386
402
 
387
403
  **Observation and extraction:** `browser_snapshot`, `browser_tabs`,
@@ -390,7 +406,8 @@ individual descriptions and limits are returned by `tools/list`.
390
406
  `browser_accessibility_snapshot`, `browser_extract`, `browser_extract_content`,
391
407
  `browser_find_text`, `browser_search_page`, `browser_find_elements`,
392
408
  `browser_dropdown_options`, `browser_computed_style`, `browser_page_next`,
393
- `browser_get_html`, `browser_challenge`, `browser_doctor`, and `server_health`.
409
+ `browser_get_html`, `browser_search_network_log`, `browser_inspect_element`,
410
+ `browser_challenge`, `browser_doctor`, and `server_health`.
394
411
 
395
412
  **Navigation and interaction:** `browser_navigate`, `browser_back`,
396
413
  `browser_go_back`, `browser_forward`, `browser_reload`, `browser_switch_tab`,
@@ -402,7 +419,8 @@ individual descriptions and limits are returned by `tools/list`.
402
419
 
403
420
  **Available local capabilities:** `browser_screenshot`, `browser_pdf`,
404
421
  `browser_upload`, `browser_downloads`, `browser_network_log`,
405
- `browser_console_log`, `browser_dialog`, `browser_cookies`, `browser_storage`,
422
+ `browser_search_network_log`, `browser_resource_blocking`, `browser_console_log`,
423
+ `browser_dialog`, `browser_cookies`, `browser_storage`,
406
424
  `browser_batch`, `browser_exec`, `browser_wait_for_human`,
407
425
  `browser_solve_challenge`, and all other browser tools are available by default.
408
426
  `browser_close_session` remains a local lifecycle control and does not change
@@ -414,7 +432,8 @@ disabled explicitly with `SMOOTH_OPERATOR_ALLOW_EVAL=false`.
414
432
  accepts only a JSON array of validated browser actions; it is not a shell,
415
433
  Python, or arbitrary code runner. Its explicit `evaluate` action still follows
416
434
  the page-evaluation policy. Destructive batch actions require explicit
417
- confirmation. `browser_wait_for_human` pauses for an operator to complete a
435
+ confirmation. There is no generic arbitrary CDP command or host-code execution
436
+ tool. `browser_wait_for_human` pauses for an operator to complete a
418
437
  visible sign-in or challenge. `browser_solve_challenge` is an internal
419
438
  connected-AI observe/act/verify loop: it returns bounded evidence and is
420
439
  successful only when a fresh final classification explicitly reports the
@@ -461,6 +480,38 @@ credentials/query secret placeholders are removed from result URLs. Transient
461
480
  retrieval failures use at most three bounded attempts; anti-bot responses are
462
481
  reported without attempting a bypass.
463
482
 
483
+ ### Network, inspection, resource, and file controls
484
+
485
+ `browser_network_log` records bounded request/response metadata for the current
486
+ page. `browser_search_network_log` filters and paginates that metadata by
487
+ request ID, URL, method, status, and resource type. Headers, cookies, request
488
+ bodies, and response bodies are not returned; search terms and URLs are treated
489
+ as untrusted data and secret query values are redacted.
490
+
491
+ `browser_resource_blocking` is page-scoped with strict `get`, `set`, and
492
+ `clear` operations. Its only selectable types are `image`, `stylesheet`,
493
+ `font`, `media`, and `script`; `set` requires a non-empty de-duplicated list.
494
+ Only matching subresources are aborted once. Document and navigation requests
495
+ cannot be selected, data/blob subresources remain covered by the normal rules,
496
+ and non-blocked requests still run the full URL policy.
497
+
498
+ `browser_inspect_element` returns a bounded safe view of a selected element:
499
+ allowlisted attributes, selected computed styles, pseudo-element summaries,
500
+ animation metadata, and shallow child structure. Script text, event-handler
501
+ source, form values, and arbitrary data attributes are omitted.
502
+
503
+ `browser_upload` accepts the existing single `filePath` or a `filePaths` array
504
+ of up to 20 paths, but not both. Every source must pass the allowed-root,
505
+ no-follow, and file-identity checks. Each file is at most 50 MiB and the
506
+ aggregate is at most 100 MiB; multiple paths require a target input with the
507
+ `multiple` attribute. Sources are staged sequentially and every staging path is
508
+ removed on success, validation failure, target failure, cancellation, or upload
509
+ rejection.
510
+
511
+ `browser_cookies` scopes reads, writes, and deletes to a validated page URL.
512
+ Writes accept only the `Strict`, `Lax`, or `None` SameSite values, and cookie
513
+ values are omitted from read results.
514
+
464
515
  ### Resources
465
516
 
466
517
  The server publishes read-only resources:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "smooth-operator-mcp",
3
- "version": "3.0.4",
3
+ "version": "3.0.6",
4
4
  "type": "module",
5
5
  "packageManager": "npm@12.0.2",
6
6
  "description": "A lightweight, production-grade MCP server for secure browser automation.",
@@ -25,9 +25,10 @@
25
25
  "dev": "tsx watch src/server/main.ts",
26
26
  "build": "node scripts/build.mjs",
27
27
  "postbuild": "node scripts/set-executable.mjs dist/smooth-operator.mjs",
28
- "lint": "eslint .",
28
+ "lint": "eslint . --ignore-pattern scripts/benchmark-network-journal.ts",
29
29
  "typecheck": "tsc --noEmit",
30
30
  "test": "vitest run",
31
+ "benchmark:network": "tsx scripts/benchmark-network-journal.ts",
31
32
  "test:browser:live": "node scripts/test-browser-live.mjs",
32
33
  "test:watch": "vitest",
33
34
  "test:coverage": "vitest run --coverage",
@@ -41,11 +42,11 @@
41
42
  "prepare": "npm run build"
42
43
  },
43
44
  "dependencies": {
44
- "@modelcontextprotocol/node": "^2.0.0",
45
- "@modelcontextprotocol/server": "^2.0.0",
46
- "ghost-cursor": "^1.4.2",
47
- "puppeteer-core": "^25.9.0",
48
- "zod": "^4.4.3"
45
+ "@modelcontextprotocol/node": "2.0.0",
46
+ "@modelcontextprotocol/server": "2.0.0",
47
+ "ghost-cursor": "1.4.2",
48
+ "puppeteer-core": "25.9.0",
49
+ "zod": "4.4.3"
49
50
  },
50
51
  "devDependencies": {
51
52
  "@modelcontextprotocol/client": "^2.0.0",