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.
@@ -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 3
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). On success it writes
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 and creates a unique owner-only backup first.
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 atomically.
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
  | --- | --- |
@@ -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: (1) browser profile
47
- ownership, (2) headed or headless display, and (3) which Chromium executable to
48
- use. Its recommended defaults are a managed private persistent profile, headed
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
- a dedicated debugging profile and does not claim ownership of an operator's
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. Destructive batch actions require explicit
452
- confirmation. There is no generic arbitrary CDP command or host-code execution
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 total batch budget includes the individual step budgets. A step that
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 bounded before
517
- parsing, redirects are rejected, cancellation and timeout are propagated, and
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` filters and paginates that metadata by
526
- request ID, URL, method, status, and resource type. Headers, cookies, request
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 the existing single `filePath` or a `filePaths` array
543
- of up to 20 paths, but not both. Every source must pass the allowed-root,
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
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "smooth-operator-mcp",
3
- "version": "3.1.0",
3
+ "version": "3.2.0",
4
4
  "type": "module",
5
5
  "packageManager": "npm@12.0.2",
6
6
  "description": "A lightweight, production-grade MCP server for secure browser automation.",