smooth-operator-mcp 3.1.0 → 3.2.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 +22 -31
- package/dist/smooth-operator.mjs +471 -281
- package/dist/smooth-operator.mjs.map +2 -2
- package/docs/STEALTH-GUIDE.md +2 -0
- package/docs/harnesses.md +8 -4
- package/docs/mcp-server.md +44 -18
- package/package.json +1 -1
package/docs/STEALTH-GUIDE.md
CHANGED
|
@@ -54,6 +54,8 @@ handler source, form values, password content, and arbitrary data attributes.
|
|
|
54
54
|
## Connected-AI challenge loop
|
|
55
55
|
|
|
56
56
|
`browser_challenge` is an evidence-only detector and is available by default.
|
|
57
|
+
Title, text, HTML, frame-source, and visible-marker inputs have independent
|
|
58
|
+
limits so one oversized evidence category cannot hide later challenge markers.
|
|
57
59
|
`browser_solve_challenge` is an internal connected-AI loop: each call is one
|
|
58
60
|
bounded verification cycle. It collects a fresh challenge classification and
|
|
59
61
|
bounded visual/state evidence, including `attemptsRemaining`; the connected AI
|
package/docs/harnesses.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## Interactive wizard (directly to your harness)
|
|
4
4
|
|
|
5
|
-
`smooth-operator install <harness>` is interactive by default — it asks exactly
|
|
5
|
+
`smooth-operator install <harness>` is interactive by default — it asks exactly three
|
|
6
6
|
curated questions (profile ownership, headed/headless display, and browser
|
|
7
7
|
executable) with recommended defaults in brackets.
|
|
8
8
|
Omitting `<harness>` is allowed too: on a TTY the installer prompts for the
|
|
@@ -21,7 +21,9 @@ When you pick “connected browser” (mode `connect`), the wizard finds Chromiu
|
|
|
21
21
|
`discovery.ts`, launches a dedicated debugging profile under
|
|
22
22
|
`~/.smooth-operator/personal-chrome` with port `9222`, and probes the loopback
|
|
23
23
|
endpoint until a valid DevTools version response is live (33 attempts within a
|
|
24
|
-
default 10-second deadline).
|
|
24
|
+
default 10-second deadline). If launch or readiness fails, the helper terminates
|
|
25
|
+
the child process on a best-effort basis instead of leaving it detached. On
|
|
26
|
+
success it writes
|
|
25
27
|
`SMOOTH_OPERATOR_BROWSER_MODE=connect` and
|
|
26
28
|
`SMOOTH_OPERATOR_BROWSER_URL=http://127.0.0.1:9222` for you. This does not
|
|
27
29
|
attach to or take ownership of an operator's daily browser profile. No manual
|
|
@@ -159,7 +161,8 @@ legacy shape, `enabled` defaults to `true`; `enabled: false` is likewise an
|
|
|
159
161
|
explicit conflict. If it has malformed `mcp` or malformed `mcp.servers`,
|
|
160
162
|
installation fails closed rather than replacing user data.
|
|
161
163
|
Comments and trailing commas are accepted as JSONC; a successful update writes
|
|
162
|
-
normalized JSON
|
|
164
|
+
normalized JSON through an owner-only temporary file, flushes it before atomic
|
|
165
|
+
replacement, and creates a unique owner-only backup first.
|
|
163
166
|
|
|
164
167
|
After editing, run `opencode mcp list` or restart OpenCode. OpenCode also
|
|
165
168
|
supports adding the server interactively with `opencode mcp add`; that is the
|
|
@@ -239,7 +242,8 @@ Official reference: <https://code.visualstudio.com/docs/copilot/chat/mcp-servers
|
|
|
239
242
|
## Cursor, Windsurf, and Claude Desktop
|
|
240
243
|
|
|
241
244
|
These clients use JSON configuration files, so the installer performs a
|
|
242
|
-
careful merge and writes
|
|
245
|
+
careful merge and writes through a flushed owner-only temporary file before
|
|
246
|
+
atomic replacement.
|
|
243
247
|
|
|
244
248
|
| Target | Default path |
|
|
245
249
|
| --- | --- |
|
package/docs/mcp-server.md
CHANGED
|
@@ -43,15 +43,14 @@ smooth-operator --help
|
|
|
43
43
|
|
|
44
44
|
(The registry package is `smooth-operator-mcp`; plain `smooth-operator` is an unrelated library. You can also install straight from GitHub: `npm install -g github:Gitshop77/Smooth-Operator`.)
|
|
45
45
|
|
|
46
|
-
The interactive installer asks exactly three questions:
|
|
47
|
-
ownership,
|
|
48
|
-
|
|
46
|
+
The interactive installer asks exactly three questions: browser profile
|
|
47
|
+
ownership, headed or headless display, and which Chromium executable to use.
|
|
48
|
+
Its recommended defaults are a managed private persistent profile, headed
|
|
49
49
|
display, and the first detected Chromium executable. It also enables page eval
|
|
50
50
|
and the identity-preserving compatibility profile; behavioral timing is off
|
|
51
51
|
for fast deterministic input and can be enabled explicitly. Managed mode owns
|
|
52
|
-
its profile. Connected mode launches and attaches to
|
|
53
|
-
|
|
54
|
-
daily browser.
|
|
52
|
+
its profile. Connected mode launches and attaches to a dedicated debugging
|
|
53
|
+
profile and does not claim ownership of an operator's daily browser.
|
|
55
54
|
|
|
56
55
|
From a checkout:
|
|
57
56
|
|
|
@@ -132,7 +131,10 @@ and Origin validation and include `Authorization: Bearer <token>`. The token
|
|
|
132
131
|
is compared in constant time. Request bodies are bounded to 2,000,000 bytes by
|
|
133
132
|
default and concurrent requests are capped. The process drains in-flight work
|
|
134
133
|
for a short bounded period on SIGINT/SIGTERM, then closes the MCP handler,
|
|
135
|
-
browser, and HTTP server.
|
|
134
|
+
browser, and HTTP server. Native JSON rejections use no-store and nosniff
|
|
135
|
+
headers; overload responses also include `Retry-After: 1`. Preflight responses
|
|
136
|
+
advertise a fixed request-header allowlist rather than reflecting arbitrary
|
|
137
|
+
requested names.
|
|
136
138
|
|
|
137
139
|
Remote binding is deliberately guarded:
|
|
138
140
|
|
|
@@ -163,7 +165,8 @@ launches it with `${SMOOTH_OPERATOR_DATA_DIR}/browser` as a non-default profile,
|
|
|
163
165
|
and records its loopback DevTools endpoint for later reattachment. Sign in once
|
|
164
166
|
in the visible window; its sessions persist in that private profile. The
|
|
165
167
|
`browser_doctor` tool reports executable resolution and endpoint state without
|
|
166
|
-
evaluating page content.
|
|
168
|
+
evaluating page content. Failed personal-Chrome helper launches are terminated
|
|
169
|
+
on a best-effort basis.
|
|
167
170
|
|
|
168
171
|
The managed browser is headed by default for sign-in and human handoff. On CI or a
|
|
169
172
|
displayless host, explicitly set `SMOOTH_OPERATOR_BROWSER_HEADLESS=true` or use
|
|
@@ -448,8 +451,10 @@ acquire a profile lease; the next browser operation retries acquisition.
|
|
|
448
451
|
`SMOOTH_OPERATOR_ALLOW_EVAL=false` when it is not wanted). `browser_exec`
|
|
449
452
|
accepts only a JSON array of validated browser actions; it is not a shell,
|
|
450
453
|
Python, or arbitrary code runner. Its explicit `evaluate` action still follows
|
|
451
|
-
the page-evaluation policy
|
|
452
|
-
|
|
454
|
+
the page-evaluation policy, and its optional `timeoutMs` is the same whole-batch
|
|
455
|
+
deadline as `browser_batch` (120,000 ms default, 600,000 ms maximum).
|
|
456
|
+
Destructive batch actions require explicit confirmation. There is no generic
|
|
457
|
+
arbitrary CDP command or host-code execution
|
|
453
458
|
tool. `browser_wait_for_human` pauses for an operator to complete a
|
|
454
459
|
visible sign-in or challenge. `browser_solve_challenge` is an internal
|
|
455
460
|
connected-AI observe/act/verify loop: it returns bounded evidence and is
|
|
@@ -467,6 +472,16 @@ revision. A snapshot failure is reported as `snapshot: null` with a bounded
|
|
|
467
472
|
accepts the same option at the top level and captures only one snapshot after
|
|
468
473
|
the final action.
|
|
469
474
|
|
|
475
|
+
Element-targeting tools accept exactly one of `target`, `ref` (`e5` or
|
|
476
|
+
`ref:e5`), CSS `selector`, or zero-based `index`, plus the operation fields.
|
|
477
|
+
`browser_select` additionally requires exactly one of `optionValue` or
|
|
478
|
+
`optionValues`; `browser_upload` requires exactly one target form and exactly
|
|
479
|
+
one of `filePath` or `filePaths`. Snapshot refs and indexes are invalidated by
|
|
480
|
+
navigation and DOM-changing actions, so refresh the snapshot before reuse.
|
|
481
|
+
Prefer canonical tools (`browser_tabs`, `browser_snapshot`, `browser_input`,
|
|
482
|
+
`browser_back`, `browser_close`, `browser_extract`); browser-use compatibility
|
|
483
|
+
aliases are retained and labeled in `tools/list`.
|
|
484
|
+
|
|
470
485
|
The current-page observation tools `browser_interactive`, `browser_frames`,
|
|
471
486
|
`browser_page_info`, and `browser_challenge` accept an optional `pageId`; omit
|
|
472
487
|
it to use the active tab. `browser_accessibility_snapshot` also accepts an
|
|
@@ -498,12 +513,20 @@ that the selected action cannot consume is rejected instead of being silently
|
|
|
498
513
|
ignored.
|
|
499
514
|
|
|
500
515
|
Each batch step enforces its own `timeoutMs` or the configured action deadline.
|
|
501
|
-
The
|
|
516
|
+
The optional top-level `timeoutMs` is the whole-batch deadline, defaulting to
|
|
517
|
+
120,000 ms and capped at 600,000 ms; it is the smaller of that value and the
|
|
518
|
+
sum of step budgets. One absolute queue deadline spans predecessor, read-drain,
|
|
519
|
+
read-permit, and fairness waits, so retries cannot reset the admission budget.
|
|
520
|
+
Long batches therefore do not wait minutes for a turn. A step that
|
|
502
521
|
ignores cancellation is retired before the browser queue advances; subsequent
|
|
503
522
|
steps do not execute after a failure. Without an explicit deadline, requested
|
|
504
523
|
wait/hold durations are added to the setup budget, and human handoff retains
|
|
505
524
|
its documented 120-second default.
|
|
506
525
|
|
|
526
|
+
Mapped deterministic errors include a bounded `recovery` object with the next
|
|
527
|
+
tool and short instruction. For browser recovery, list sessions and use the
|
|
528
|
+
returned `session_id` with `browser_close_session` before retrying.
|
|
529
|
+
|
|
507
530
|
If browser teardown times out or fails, later browser work returns the
|
|
508
531
|
retryable `BROWSER_RECOVERY_REQUIRED` error. Call `browser_close_session` to
|
|
509
532
|
retry cleanup; the recovery latch clears only after teardown is confirmed.
|
|
@@ -513,8 +536,9 @@ snippets are untrusted observations, not instructions or proof of claims. Its
|
|
|
513
536
|
`maxResults` input is capped at 10, and `maxChars` (500–4,000 through the MCP
|
|
514
537
|
schema) is one aggregate budget across the returned title and snippet text,
|
|
515
538
|
not a per-result multiplier. URL fields and fixed untrusted-data wrapper
|
|
516
|
-
markers are outside that text budget. The response body is
|
|
517
|
-
|
|
539
|
+
markers are outside that text budget. The response body is collected in one
|
|
540
|
+
geometrically growing bounded buffer before parsing, redirects are rejected,
|
|
541
|
+
cancellation and timeout are propagated, and
|
|
518
542
|
credentials/query secret placeholders are removed from result URLs. Transient
|
|
519
543
|
retrieval failures use at most three bounded attempts; anti-bot responses are
|
|
520
544
|
reported without attempting a bypass.
|
|
@@ -522,8 +546,9 @@ reported without attempting a bypass.
|
|
|
522
546
|
### Network, inspection, resource, and file controls
|
|
523
547
|
|
|
524
548
|
`browser_network_log` records bounded request/response metadata for the current
|
|
525
|
-
page. `browser_search_network_log`
|
|
526
|
-
request ID, URL, method, status, and resource
|
|
549
|
+
page. `browser_search_network_log` scans once, retains only the requested result
|
|
550
|
+
page, and filters metadata by request ID, URL, method, status, and resource
|
|
551
|
+
type. Headers, cookies, request
|
|
527
552
|
bodies, and response bodies are not returned; search terms and URLs are treated
|
|
528
553
|
as untrusted data and secret query values are redacted.
|
|
529
554
|
|
|
@@ -539,8 +564,9 @@ allowlisted attributes, selected computed styles, pseudo-element summaries,
|
|
|
539
564
|
animation metadata, and shallow child structure. Script text, event-handler
|
|
540
565
|
source, form values, and arbitrary data attributes are omitted.
|
|
541
566
|
|
|
542
|
-
`browser_upload` accepts
|
|
543
|
-
of up to 20 paths, but not
|
|
567
|
+
`browser_upload` accepts `target`, `ref`, `selector`, or `index`, plus the
|
|
568
|
+
existing single `filePath` or a `filePaths` array of up to 20 paths, but not
|
|
569
|
+
both. Every source must pass the allowed-root,
|
|
544
570
|
no-follow, and file-identity checks. Each file is at most 50 MiB and the
|
|
545
571
|
aggregate is at most 100 MiB; multiple paths require a target input with the
|
|
546
572
|
`multiple` attribute. Sources are staged sequentially and every staging path is
|
|
@@ -567,7 +593,7 @@ Resource output is bounded and follows the same redaction and policy rules as
|
|
|
567
593
|
tool output. The capabilities resource also reports the native defaults and
|
|
568
594
|
effective feature flags for local browser tools, page evaluation, stealth, and
|
|
569
595
|
behavioral timing. Its `limits` metadata publishes the page-text, action-plan,
|
|
570
|
-
research, and upload budgets used by the public boundary. Its challenge
|
|
596
|
+
batch-timeout, research, and upload budgets used by the public boundary. Its challenge
|
|
571
597
|
metadata includes the default and maximum connected-AI attempt budgets and
|
|
572
598
|
states that success requires an explicit absent classification.
|
|
573
599
|
|