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/.env.example +3 -0
- package/README.md +16 -0
- package/dist/smooth-operator.mjs +1399 -110
- package/dist/smooth-operator.mjs.map +3 -3
- package/docs/harnesses.md +7 -0
- package/docs/mcp-server.md +56 -5
- package/package.json +8 -7
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
|
package/docs/mcp-server.md
CHANGED
|
@@ -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.
|
|
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
|
|
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`, `
|
|
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
|
-
`
|
|
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.
|
|
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.
|
|
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": "
|
|
45
|
-
"@modelcontextprotocol/server": "
|
|
46
|
-
"ghost-cursor": "
|
|
47
|
-
"puppeteer-core": "
|
|
48
|
-
"zod": "
|
|
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",
|