Electron Stagewright
Electron Stagewright is an MCP server for driving and testing real Electron apps through accessibility-oriented automation, assertions, diagnostics, and session management.
Launch an Electron app, attach to a running CDP endpoint, or inject into a running process; stop, detach, or force-kill sessions.
Snapshot renderer accessibility trees in full, diff, compact-text, capped, or subtree form; find elements semantically by role, name, and state.
List and switch windows and renderer surfaces; reload and resize windows.
Read element state, text, value, attributes, bounding box, computed styles, and the focused element.
Interact by ref or selector: click, hover, drag, scroll, check/uncheck, select dropdown options, set/drop files, type text, send keys/chords/sequences, and type into code editors.
Wait for DOM events, selector states, and element states; assert text, value, URL, count, state, and text/attribute patterns with retrying expectations.
Capture screenshots, read console logs, handle native dialogs, and inspect app/runtime/environment status.
Optionally load plugins for accessibility audits, visual baselines, traces, IPC/network/storage/clock control, native menus/trays/notifications, and packaged-app validation; arbitrary JS eval is available only when explicitly enabled.
Allows AI agents to control real Electron desktop applications: launch apps, inspect the accessibility tree, click, type, select elements, read state, take screenshots, handle dialogs, and assert UI state using stable refs or selectors.
Electron Stagewright
Agentic UX testing for real Electron apps. Cue the app, prove the experience, and return bounded evidence through MCP.
Electron Stagewright is a Model Context Protocol (MCP) server that lets Claude Code, Codex, Cursor, Cline, Aider, and any MCP-compatible agent operate real Electron applications. Launch or attach, inspect the accessibility tree, interact through stable refs, assert behavior with retrying expectations, and capture diagnostics without turning every check into another agent round-trip.
Why this exists
Browser automation already has mature agent tooling. Electron adds a different boundary: the main process, renderer surfaces, native menus and dialogs, multiple windows, packaged runtimes, and signed release artifacts. A browser API exposed through MCP does not cover that whole product.
Electron Stagewright is designed agent-first from the primitive level up:
Errors carry hints, suggested next actions, and similar-ref alternatives — agents recover without an extra round-trip asking for context.
Every response reports its own token cost — agents budget in real time, not after the fact.
get_statereturns the full state envelope in one call — visible, enabled, checked, focused, disabled, aria-expanded, aria-busy, aria-invalid. No 4-call chain to decide if a button is clickable.wait_for_stateaccepts composite predicates —{ visible: true, enabled: true, focused: false }evaluated atomically by the server. One call replaces three.Snapshots flag
recently_changedelements — agents focus reasoning on what differs from the last view instead of reprocessing the whole tree.Snapshot diffs are a parameter, not a separate tool —
electron_snapshot({ since: 'last' })returns only deltas. Fewer APIs to remember.Compact text encoding on demand —
electron_snapshot({ format: 'text' })renders one line per element ([3] textbox "Email" value="" focused) with only non-default state, cutting snapshot tokens 5-10x versus the JSON shape when the agent just needs to look.expect_*primitives replace read-compare-retry chains —electron_expect_text({ ref, equals: 'Welcome', timeoutMs: 5000 })is one call, not five.electron_findqueries the accessibility tree semantically —{ role: 'button', name_contains: 'Submit', visible: true }— no CSS selectors, no XPath, no guessing.Hot-reload-aware — snapshot and find responses report when the renderer reloaded since the previous baseline, so agents know refs may need refreshing.
Framework-agnostic snapshot — built on accessibility roles and ARIA instead of framework-internal properties. Current fixtures cover vanilla, React, Vue, and Angular; the broader renderer matrix is still expanding.
Related MCP server: mcp-electron-driver
Electron-deep workflows
The server treats three Electron-specific workflows as first-class:
Attach to a running dev server without restarting it.
electron_attachconnects to apps exposing a loopback CDP endpoint, andelectron_injectcan attach to a running main process via the Node Inspector handshake when no debug flag was arranged up front.Session traces with deterministic replay and per-tool token budgets. Inspired by Playwright's
trace.zipbut designed for LLM agent sessions: a timeline of tool calls, arguments, results, timings, and token estimates — replayable against a fresh app instance, with budgets so agents can cap runaway loops.End-to-end validation of signed, notarized, packaged
.appbundles —codesign, Gatekeeper assessment, autoUpdater feed inspection, URL-scheme declaration checks, and crash reporter machinery. The full production surface, not just dev.
Microsoft's official Playwright MCP team explicitly declined to support Electron ("you can release your own server for Electron" — Pavel Feldman, lead). This project takes the invitation seriously.
Quick start
Requires Node.js 24 or newer (node -v); on Linux the server also needs a display (DISPLAY,
WAYLAND_DISPLAY, or xvfb-run -a). The default launch transport uses Playwright and an
Electron runtime. For a private setup in the current project, keep the server local to that project
and pin the release-tested package set.
Before configuring an MCP host, prepare the same package set once in a terminal. Electron downloads
its binary the first time something loads it, not during install, and that download prints a
progress line to stdout; inside an MCP session the line would land in the protocol stream. Fetch the
binary with Electron's install-electron bin, then run doctor, which reports "ok": true and
exits 0 when every required check passes:
npx -y --prefix ~/ --package @electron-stagewright/core@0.8.1 \
--package playwright@1.63.0 --package electron@42.11.10 install-electron
npx -y --prefix ~/ --package @electron-stagewright/core@0.8.1 \
--package playwright@1.63.0 --package electron@42.11.10 electron-stagewright doctor --jsonclaude mcp add electron-stagewright -- \
npx -y --prefix ~/ --package @electron-stagewright/core@0.8.1 \
--package playwright@1.63.0 --package electron@42.11.10 \
electron-stagewright --tool-profile essentialclaude mcp list should then show the server as connected (or run /mcp inside a session), and
its tools appear as mcp__electron-stagewright__electron_launch and so on. Keep the --package
list identical across all three commands: npx caches each list separately, so adding the demo or
a plugin package means running install-electron and doctor again with the new list. Keep
--prefix ~/ too: without it, npx skips any listed package the current project already has at
that version (an Electron app often has both Playwright and Electron), and the server, which runs
from npx's cache, cannot load it. The server still runs in the current directory. To move to
a newer release later, follow
Update to a new release.
The default Claude Code scope is local: it is available only in the current project and stays out
of unrelated workspaces. To share a reviewed configuration with a team, use --scope project,
which writes the same mcpServers shape to .mcp.json. See the
Claude Code MCP scopes for the host-specific behavior.
To verify a host before pointing it at your app, add the pinned
@electron-stagewright/demo@0.1.0 package and use the demo guide. The demo
is opt-in, so a normal core installation neither loads nor depends on it.
For local development, build the checkout and point your MCP host at the built CLI:
pnpm install
pnpm build
claude mcp add electron-stagewright -- \
node /abs/path/to/electron-stagewright/packages/core/dist/cli.jsShared project .mcp.json shape:
{
"mcpServers": {
"electron-stagewright": {
"command": "npx",
"args": [
"-y",
"--prefix",
"~/",
"--package",
"@electron-stagewright/core@0.8.1",
"--package",
"playwright@1.63.0",
"--package",
"electron@42.11.10",
"electron-stagewright",
"--tool-profile",
"essential"
]
}
}
}Then from any MCP-compatible agent (tool names as Claude Code shows them; other hosts prefix them differently):
// Launch
mcp__electron-stagewright__electron_launch({
main: "/abs/path/to/.vite/build/main.js",
env: { MY_ENV_VAR: "value" }
})
// Inspect with full state per ref
mcp__electron-stagewright__electron_snapshot()
// → [1] button "Open File" enabled=true visible=true
// [2] button "Settings" enabled=true visible=true
// [3] textbox "Email" value="" focused=false
// [4] heading "Welcome"
// Interact by ref
mcp__electron-stagewright__electron_click({ ref: 2 })
// Wait for a composite state in one call
mcp__electron-stagewright__electron_wait_for_state({
ref: 3, state: { focused: true, enabled: true }, timeoutMs: 2000
})
// Assert + retry in one call instead of read-compare-retry chain
mcp__electron-stagewright__electron_expect_text({ ref: 4, equals: "Welcome back" })
// Stop
mcp__electron-stagewright__electron_stop()The full tool list — every tool, its parameters, and operation type — is in
TOOL-REFERENCE.md, generated from the live dispatcher manifest
(pnpm docs:tools).
Documentation
Getting started — from a clean checkout to a complete driven session against the bundled example app.
Try the packaged demo — verify a published MCP host setup against a local, multi-window Electron task board without supplying your own app path.
Connect your MCP client — wire the published package into Claude Code, Codex, Claude Desktop, Cursor, VS Code, opencode, or any MCP host, confirm it connected, update it, or remove it.
Launch, attach, or inject — getting a session against YOUR app, including apps that are already running.
Assert UI state — refs vs selectors, the
expect_*family, waits, and snapshot diffs.Type into code editors — the reliable Monaco / EditContext typing path,
replace, the auto-pairing caveat, and how to verify the text landed.Capture diagnostics — screenshots, console, dialogs, and session traces.
Load, configure, and diagnose plugins — explicitly load plugins, grant their narrowest gates, and inspect enabled tools and safe config with
electron_plugins.Migrate from electron-driver — tool-by-tool mapping and the conceptual shifts.
Choose an Electron MCP server — compare Electron automation workflows by capability, trust boundary, recovery evidence, and your own app.
Compatibility — see which Node, Electron, operating-system, and transport combinations are verified by unit tests or real-runtime CI.
Concepts — the agent-native model and why the server is shaped the way it is: the response envelope, refs, snapshots, retrying assertions, sessions, and the eval/plugin trust model, each linked to the decision that set it.
Security model — the trust model, the controls behind
--allow-eval, and a deployment checklist.Guides index · TOOL-REFERENCE.md · Architecture Decision Records.
Server flags
Pass these after the CLI path in your MCP host config (the args array). All default to the safe
option; diagnostics go to stderr (stdout is reserved for the JSON-RPC protocol channel).
Flag | Effect |
| Register the |
| Confine host paths to within |
| Default directory |
| Per-dispatch backstop timeout (ms); a handler that never settles resolves as a retryable |
| Select the core tool surface: |
| Resolve an installed |
| Run preflight checks without starting MCP stdio: Node, Playwright, Electron, Linux display, configured paths, eval policy, project runtime alignment, and the exact serve configuration. Pass the same plugin/config/profile/timeout/demo flags you plan to serve with; doctor imports and briefly sets up only those explicitly trusted plugins, validates the complete server object graph, then tears it down. JSON mode includes bounded runtime/configuration facts and exits non-zero when a required check fails. Run it as |
| Validate a packaged macOS |
| Load a plugin by package name, first-party short name, or file path. Repeatable; a single value may be comma-separated. e.g. |
| Supply a plugin's config as inline JSON, validated against its schema. Keyed by plugin name; invalid input reports its Zod field path and correction input. |
The server exits 0 after a clean shutdown (SIGINT, SIGTERM, or the host closing stdin), 1 when
startup or shutdown teardown fails, and 2 for invalid usage such as an unknown flag.
Security defaults worth knowing when wiring this into another project: arbitrary JS (the
--allow-eval policy) and host-path launches (--app-root) are opt-in; electron_launch refuses
runtime-altering env vars (ELECTRON_RUN_AS_NODE, NODE_OPTIONS, LD_*, DYLD_*); and
user-supplied regex / text / key arguments are length- and complexity-bounded so a hostile tool call
cannot wedge the server.
Use --tool-profile essential when an agent needs the common launch, snapshot, interaction, wait,
and assertion workflow with a smaller initial manifest. Choose testing for the broader interaction,
read, and screenshot-evidence surface, or debug for attach, discovery, window, console, screenshot,
and dialog work.
full stays the default until the profile benchmark demonstrates equivalent task success with a
material context saving. See ADR-021 for the
measured budget policy.
What each response looks like (the agent-UX detail)
Success, for example from electron_expect_text:
{
"ok": true,
"session_id": "pw-...",
"matched": true,
"actual": "Welcome back",
"_meta": {
"estimated_tokens": 24,
"elapsed_ms": 142,
"session_id": "pw-...",
},
}Error:
{
"ok": false,
"error": "ref 7 not found in current snapshot",
"code": "REF_NOT_FOUND",
"hint": "The DOM may have rerendered since the last snapshot.",
"next_actions": ["electron_snapshot()", "electron_find({ role: \"button\" })"],
"similar_refs": [
{ "ref": 9, "role": "button", "name": "Submit" },
{ "ref": 12, "role": "button", "name": "Cancel" },
],
"retryable": false,
"http": 404,
"_meta": { "estimated_tokens": 89, "elapsed_ms": 23 },
}The agent has everything to decide its next move without asking for context.
Architecture
Three transport implementations behind a single ITransport interface, so the project survives if Playwright's experimental _electron API changes or gets deprecated:
PlaywrightElectronTransport—_electron.launch(), fast path (default).CDPTransport— Chrome DevTools Protocol direct, no Playwright dependency; launches packaged executables through a managed loopback endpoint or attaches to an existing one, with iframe, webview andWebContentsViewsurface targeting plus snapshot/find, eval, observe, and interaction on the selected surface.InjectorTransport— Node Inspector handshake into a running process; supports main-process eval, window discovery, and console capture when an app was not started with a CDP endpoint.
Plugin model: a small core, with domain capabilities shipped as separate @electron-stagewright/plugin-* packages loaded explicitly via --plugin (the core never auto-scans). Shipped today: plugin-a11y (surface-scoped axe-core audits with bounded violations and incomplete checks; a fixed engine, not agent JavaScript, so no --allow-eval grant), plugin-visual (BrowserWindow visual baselines with explicit update confirmation, environment metadata, confined artifact roots, and actual/diff evidence), plugin-trace (session trace + deterministic replay + per-tool token budget), plugin-ipc (capture / invoke / stub Electron IPC, gated behind main eval: --allow-eval=main, or bare --allow-eval), plugin-production (validate packaged macOS, Windows, and Linux artifacts through MCP, a public library API, or a CI JSON CLI: bundle integrity, update/crash machinery, macOS signing/notarization/Gatekeeper, Windows Authenticode, and AppImage embedded signatures), plugin-network (renderer request/response capture, bodies, and stubbing via the transport seam), plugin-clock (deterministic renderer virtual time via the Playwright clock seam), plugin-storage (read, seed, and assert cookies, storage snapshots and per-key localStorage / sessionStorage through the no-eval transport seam, and IndexedDB records through a renderer-eval gate; cookie values are redacted by default, IndexedDB values can be redacted with config), and plugin-native-ui (read, assert, and invoke the application menu — the macOS menu bar — capture the notifications the app shows including startup ones, and read system-tray state plus fire tray events via launch-time instrumentation, all via the transport native-UI seam, no eval).
Dogfooding targets
The MCP is built against two real Electron applications maintained by the author, covering distinct verticals so the design doesn't accidentally bias to one shape:
Code-editor shape — a code editor with runtime sandboxes, licensing, and IPC-heavy state. Stresses keyboard-driven flows, editor state, and license verification.
POS shape — a multi-tenant Point of Sale desktop app with embedded Fastify server and SQLite. Stresses forms, large tables, embedded backend, auto-updater feeds.
If your Electron app has a shape these don't cover, open an issue — we'd love to add it as an example fixture.
Security
The server is a privileged local tool, not a sandbox: it drives a real app and, under an eval opt-in (--allow-eval or a target-specific variant), runs arbitrary JavaScript inside it, so only a trusted agent host should invoke it. The security model covers the trust boundaries, the controls (eval opt-in + blocklist, channel allowlists, launch confinement, structured redaction), and a deployment checklist; the posture is recorded in ADR-014. To report a vulnerability, see SECURITY.md.
Contributing
This project is in its earliest days. Issues and discussions welcome. See CONTRIBUTING.md for the workflow, and GOVERNANCE.md for how the project is run and the path to becoming a co-maintainer.
Selecting test projects
pnpm test and pnpm test:coverage select the ordinary unit project, retained across
all six OS/Node CI cells. pnpm test:real selects the serialized real-electron project
and checks actual JSON results against scripts/real-test-inventory.json (25 reviewed files,
36 scenarios). It refuses missing binaries/required native-addon fixture inputs and rejects
missing, skipped or zero execution on every platform. Prepare the native-addon inputs with
node scripts/prepare-native-addon-fixture.mjs and export the variables it prints (on Windows it
also fetches Electron's node.lib and points at npm's bundled node-gyp, which needs MSVC).
Packed CLI qualification stays separate.
License
MIT — see LICENSE.
Available Tools
57 toolselectron_assert_patternAssert a text or attribute patternARead-only
Validate, in a single check (no polling), that an element's text or a named attribute matches a pattern. Target by ref or selector. With attribute set, reads that attribute; otherwise reads the element's trimmed text. Provide exactly one of: equals, contains, matches_regex. Optional flags (any of i, m, s, u) apply to matches_regex; g and y are rejected as stateful. Returns: { ok, session_id, matched, actual }. Errors: EXPECTATION_FAILED (element found but its value did not match the pattern — details carry expected + actual; a missing attribute reads as actual: null), SELECTOR_NO_MATCH (no element matched — this is one-shot, so a missing element is a precondition failure, not a retry; carries similar_refs), REF_NOT_FOUND (stale ref), TRANSPORT_UNSUPPORTED, NOT_RUNNING, BAD_ARGUMENT (no/multiple predicates, invalid regex or flags, or ref+selector both/neither).
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| flags | No | Optional regex flags (any of i, m, s, u) applied to the regex predicate; g and y are rejected as stateful. Only valid alongside a regex predicate. | |
| equals | No | The value must equal this exactly. | |
| contains | No | The value must contain this substring. | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| attribute | No | Attribute name to read (e.g. "value", "aria-label"). Omit to read text. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| matches_regex | No | The value must match this JavaScript regular expression. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral context beyond the readOnlyHint=true annotation, including that it is a single check without polling, details about missing attributes returning null, and that a missing element is a precondition failure (not a retry). It also specifies all error types and constraints on regex flags. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and information-dense, starting with the core purpose, then detailing targeting, matching, return value, and errors. Every sentence adds value, though it could be slightly trimmed without losing clarity. It is appropriately front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 8 parameters, no output schema, and no nested objects, the description compensates thoroughly: it explains targeting, matching options, flags, return fields, and all error types. It is complete enough for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema already provides descriptions for all 8 parameters (100% coverage), the tool description adds meaningful semantics: explaining that exactly one predicate must be provided, the effect of the attribute parameter on the value read, and the constraints on regex flags (g and y rejected as stateful). This goes beyond the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Validate, in a single check (no polling), that an element's text or a named attribute matches a pattern.' It specifies the verb (validate) and resource (element text/attribute) and distinguishes it from sibling tools like electron_expect_text or electron_get_text by emphasizing the single-shot nature and pattern matching.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear instructions on how to target elements (by ref or selector), how to choose between text and attribute validation, and the requirement to provide exactly one of equals/contains/matches_regex. However, it does not explicitly mention when this tool should be used over alternatives or when not to use it, such as when polling is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_attachAttach to running Electron appA
Attach to an already-running Electron app exposing a CDP debug endpoint (use electron_discover_running to find one, or start the app with --remote-debugging-port). Provide port (+ optional loopback host) or a loopback cdpUrl; pid alone is not attachable over CDP but, when supplied alongside, lets stop escalate to SIGKILL. The CDP transport supports eval/read/observe and core interaction surfaces against the attached app. The selected CDP page is also the default snapshot/find surface; explicit iframe/webview surface targeting remains unavailable. Returns: { ok, session_id, transport, windows, capabilities }. Errors: TRANSPORT_UNSUPPORTED (no attach-capable transport), CDP_DISCONNECTED (endpoint unreachable; a dropped session reconnects on its next call; retryable), CDP_TIMEOUT (handshake/method timeout; retryable), BAD_ARGUMENT (missing target selector or non-loopback endpoint).
| Name | Required | Description | Default |
|---|---|---|---|
| pid | No | Process id of the running app. | |
| host | No | Loopback host for port-based attach. Defaults to localhost. | |
| port | No | CDP port; the endpoint is resolved from /json/version. | |
| cdpUrl | No | Full CDP WebSocket URL on a loopback host. | |
| timeoutMs | No | Max wait for the attach handshake. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the readOnlyHint=false / openWorldHint=false annotations: it documents the loopback restriction, that a dropped session reconnects on its next call, that pid enables stop to escalate to SIGKILL, the unsupported iframe/webview surface targeting, and the full error taxonomy with retryability. This is unusually rich operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then selector rules, then capabilities/limits, then returns and errors—a sensible order. The prose is dense and packs several clauses per sentence (returns plus five error codes in one paragraph), which is efficient but slightly heavy for a description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description supplies the return shape (ok, session_id, transport, windows, capabilities) as well as the error cases. Combined with the disclosed capability limits, an agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuinely new semantics: pid is not a standalone attach selector and only affects stop escalation, and port/host versus cdpUrl are alternative selectors with a loopback-only constraint enforced as BAD_ARGUMENT. That meaning is not derivable from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Attach to an already-running Electron app exposing a CDP debug endpoint') and immediately distinguishes itself from the launch path and from electron_discover_running. An agent can tell exactly what this does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to electron_discover_running for finding a target and to --remote-debugging-port for starting one, and warns that pid alone is not attachable over CDP. Alternatives and preconditions are named, not implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_checkCheck a checkbox or radioA
Check the checkbox/radio identified by ref or selector (no-op if already checked). Options: force, timeoutMs. Returns: { ok, session_id, target, checked: true }. Errors: REF_NOT_FOUND / SELECTOR_NO_MATCH (carries similar_refs), ELEMENT_NOT_VISIBLE (retryable), ELEMENT_DISABLED, NOT_RUNNING, BAD_ARGUMENT.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| force | No | Bypass actionability checks (visibility/enabled/stable). Default false. | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| timeoutMs | No | Actionability budget in ms (default 5000, clamped to 30000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses behavioral traits: no-op if already checked, and lists error types including retryable ones. Annotations confirm mutation, no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences plus a concise list of options and errors, front-loaded with the main action. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 5 parameters, no output schema, the description covers the main action, return format, and errors. Could explain the 'target' field in return, but adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by specifying return format, error types, and the no-op condition, going beyond schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The title and description clearly state the tool checks a checkbox/radio, with explicit mention of no-op if already checked. It distinguishes from sibling tools like electron_uncheck.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for checkbox/radio elements and mentions no-op behavior, but does not explicitly state when to use this over alternatives like electron_click or electron_uncheck.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_clear_inputClear an inputA
Clear the value of the input/textarea identified by ref or selector (sets it to empty). Options: force, timeoutMs. Returns: { ok, session_id, target, cleared }. Errors: REF_NOT_FOUND / SELECTOR_NO_MATCH (carries similar_refs), ELEMENT_NOT_VISIBLE (retryable), ELEMENT_DISABLED, NOT_RUNNING, BAD_ARGUMENT.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| force | No | Bypass actionability checks (visibility/enabled/stable). Default false. | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| timeoutMs | No | Actionability budget in ms (default 5000, clamped to 30000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false, aligning with the mutation behavior. The description adds details about options (force bypasses actionability checks), return structure, and specific error types with retryability hints, going beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences plus compact lists of options, returns, and errors. Every element is essential and informative with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers core action, identification options, options, return shape, and errors. Does not mention event firing or mutual exclusivity of ref/selector explicitly, but the schema covers the latter. Sufficient for a clear-input tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description summarizes parameters (ref/selector, force, timeoutMs) and lists errors, but adds little new meaning beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb-resource pair: 'Clear the value of the input/textarea' and distinguishes it from sibling tools like electron_type or electron_get_value.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context that the tool clears an input to empty, but does not explicitly contrast with alternatives like electron_type ' ' or electron_press_sequence. The context is sufficient for an agent to infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_clickClick an elementA
Click the element identified by ref (from a snapshot) or selector. Options: button (left|right|middle, default left), clickCount (2 = double-click), force (bypass actionability), timeoutMs. Returns: { ok, session_id, target }. Errors: REF_NOT_FOUND / SELECTOR_NO_MATCH (no such element — re-snapshot; not retryable, carries similar_refs), ELEMENT_NOT_VISIBLE (retryable), ELEMENT_DISABLED (not retryable), POINTER_NOT_DELIVERED (the click landed on another element or frame; retryable), NOT_RUNNING, BAD_ARGUMENT (ref+selector both/neither).
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| force | No | Bypass actionability checks (visibility/enabled/stable). Default false. | |
| button | No | Mouse button. Default left. | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| timeoutMs | No | Actionability budget in ms (default 5000, clamped to 30000). | |
| clickCount | No | Number of clicks (2 for a double-click). Default 1. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and openWorldHint=false, so the description carries most of the burden — and it delivers: force is disclosed as bypassing actionability checks, timeoutMs is clamped, and each error code is labeled retryable or not with the specific remedy and extra payload (similar_refs on REF_NOT_FOUND). POINTER_NOT_DELIVERED explaining that a click 'landed on another element or frame' is exactly the kind of failure semantics an agent cannot get from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what the tool does, then options, then return shape, then error taxonomy — a logical order with no filler sentences. The error list is long but every entry carries distinct retry/remediation information, though the single dense paragraph could be broken into clearer segments.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly supplies the return shape ({ ok, session_id, target }) and a complete error contract including retryability. Together with the fully documented 7-parameter schema and the mutation annotation, an agent has everything needed to invoke and recover from this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents ref, selector, force, button, clickCount, timeoutMs, and sessionId in comparable detail. The description largely restates that information (clickCount 2 = double-click, force bypasses actionability) rather than adding syntax or format knowledge beyond it — the correct baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource — 'Click the element identified by ref (from a snapshot) or selector' — and immediately names the two targeting mechanisms. The verb is unambiguous next to siblings like electron_hover, electron_drag, and electron_type, so an agent can select it without reading any other tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong operational context: ref vs selector targeting, default values for every option, and per-error remediation ('re-snapshot' for REF_NOT_FOUND, retryable vs not retryable for each failure). It never names an alternative sibling (e.g. when to prefer hover or press_sequence instead), so it stops short of explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_console_logsRead console logsARead-only
Read the captured renderer console output for the session, newest-relevant entries last. Filters (all optional, ANDed): type (one or more of log/info/warning/error/debug/...), match (a regular expression the text must match), since (epoch ms — only entries at/after it), limit (max entries, default 200, max 1000 — the most recent are kept). Returns: { ok, session_id, entries: [{ type, text, timestamp, windowId?, location? }], count, overflowed }. overflowed is the number of older entries the buffer dropped. Errors: NOT_RUNNING, BAD_ARGUMENT (invalid regex, or multiple sessions).
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Console level(s) to include, e.g. "error" or ["warning", "error"]. | |
| limit | No | Max entries to return (default 200, max 1000); keeps the most recent. | |
| match | No | Regular expression the entry text must match. | |
| since | No | Only entries with timestamp >= this (epoch ms). | |
| sessionId | No | Target session id. Omit when a single session is running. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true. Description adds value by detailing ordering, overflow behavior, error conditions (NOT_RUNNING, BAD_ARGUMENT). This goes beyond what annotations provide, making behavior fully transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise yet comprehensive, using parentheses and bullet-like structure. It front-loads the purpose, then lists filters and returns. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, description fully details return structure (entries with fields, count, overflowed) and lists errors. For a tool with 5 optional parameters and filtering logic, this is complete and covers all relevant context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. Description adds extra context: 'ANDed' for filters, 'epoch ms' for since, 'most recent are kept' for limit. This enhances understanding beyond raw schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states 'Read the captured renderer console output for the session' with a specific verb and resource. It also clarifies ordering ('newest-relevant entries last'), distinguishing it from sibling tools that perform different actions like clicking or waiting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description explains all optional filters and their effects (ANDed, regex, epoch ms, limit). It implies usage for reading logs, but doesn't explicitly state when not to use or compare with alternatives. However, the context is clear enough for most use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_detachDetach from Electron appA
Disconnect from an attached or injected app without stopping it. A launch-owned session cannot detach because its transport owns the process; this includes Playwright development launches and packaged CDP launches. Use electron_stop for that case. Returns: { ok, session_id, detached: true }. Errors: TRANSPORT_UNSUPPORTED (launch-owned session; not retryable), NOT_RUNNING (no such session), BAD_ARGUMENT (multiple sessions).
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | No | Target session id. Omit when a single session is running. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give readOnlyHint=false and openWorldHint=false, so the description carries the real burden and does so: it discloses that launch-owned transports cannot detach, enumerates the error codes with retryability (TRANSPORT_UNSUPPORTED not retryable), and specifies the success payload. That is far more than the annotations supply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Ordered as purpose, constraint, alternative, return shape, then error taxonomy. It is dense but every sentence carries a distinct piece of decision-relevant information, with the exclusion front-loaded before the alternative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema, the description supplies the return shape ({ ok, session_id, detached: true }) and the full error set, plus the operational constraint that determines success. Nothing an agent needs to call this correctly or interpret failure is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already explains sessionId including the 'omit when a single session is running' rule, so baseline is 3. The description only indirectly touches the parameter via the BAD_ARGUMENT (multiple sessions) error, adding a little disambiguation but no format or syntax detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and object ('Disconnect from an attached or injected app') and adds the non-obvious qualifier 'without stopping it', which immediately separates it from the kill/stop family. An agent can distinguish it from electron_stop and electron_force_kill without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the when-not case (launch-owned sessions, including Playwright development launches and packaged CDP launches) and routes the agent to the correct alternative, electron_stop. This is exactly the when/when-not/alternative guidance the dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_dialog_handlerHandle native dialogsA
Arm the auto-responder for native JS dialogs (alert/confirm/prompt/beforeunload) and read which dialogs fired. Dialogs block the renderer, so the policy is applied automatically the instant one appears. Arming args (all optional): action (accept|dismiss — the default for every dialog), perType (per-kind overrides, e.g. {"confirm":"accept","beforeunload":"dismiss"}, falls back to action), promptText (text submitted to prompt() when it is accepted), oneShot (apply to exactly the next dialog, then revert to dismiss). With NO arming args the call is inspect-only and leaves the policy unchanged. Read args (all optional): type (one or more kinds to include), since (epoch ms), limit (max events, default 50, max 200 — most recent kept), clear (flush the whole buffer after reading). Until armed, the default policy is dismiss, so dialogs never hang the app. Returns: { ok, session_id, policy, entries: [{ type, message, action, defaultValue?, promptText?, timestamp, windowId? }], count, overflowed }. overflowed counts dropped events across the whole buffer, not just the returned (type/since/limit-filtered) subset. Errors: NOT_RUNNING, BAD_ARGUMENT (promptText without an accepting prompt policy, or oneShot without a policy to arm).
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Dialog kind(s) to include when reading, e.g. "confirm" or ["confirm","prompt"]. | |
| clear | No | Flush the entire dialog buffer after reading (not just the returned subset). | |
| limit | No | Max events to return (default 50, max 200); keeps the most recent. | |
| since | No | Only events with timestamp >= this (epoch ms). | |
| action | No | Default response for every dialog. Omit (with no perType) for an inspect-only call. | |
| oneShot | No | Apply the policy to exactly the next dialog, then revert to dismiss. | |
| perType | No | Per-kind response overrides; a kind not listed falls back to action. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| promptText | No | Text submitted to prompt() dialogs when they are accepted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description fully discloses behavior: dialogs block the renderer, policy is applied automatically, default is dismiss to prevent hangs, overflow behavior, and error conditions (NOT_RUNNING, BAD_ARGUMENT). It does not contradict annotations (readOnlyHint=false).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear separation of arming and reading arguments. It is fairly long but every sentence adds value, explaining modes, defaults, and edge cases. Slightly verbose but efficient for the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description fully documents the return object (ok, session_id, policy, entries, count, overflowed). It covers all modes, parameter interactions, and errors. Given the tool's complexity (two modes, 9 params), the description is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds essential context: action is the default, perType overrides, promptText requires accepting prompt, oneShot is for next dialog then revert, limit defaults/max, clear flushes whole buffer, overflowed counts across full buffer. This goes far beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's dual function: arming an auto-responder for native dialogs and reading fired dialogs. It distinguishes between the two modes and explains the default policy. No sibling tool handles dialogs, so it is distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use arming vs. reading (e.g., 'With NO arming args the call is inspect-only'). It mentions that dialogs block the renderer and why the default policy is dismiss. It does not explicitly exclude alternatives, but no siblings exist for this purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_discover_runningDiscover running Electron appsARead-only
Scan the conventional CDP debug ports (9222-9225 by default) for already-running, debuggable Electron apps on loopback only. No session required. Returns: { ok, targets, count, scanned } where each target is { targetId, port, appName, pid } and scanned reports { host, ports, elapsed_ms } so an empty result is unambiguous. Errors: BAD_ARGUMENT (non-loopback host, invalid port list, or timeout outside bounds). A failed probe is simply "no target on that port".
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Loopback host to scan. Defaults to 127.0.0.1. | |
| ports | No | Ports to scan. Defaults to 9222-9225. Max 64. | |
| timeoutMs | No | Per-port timeout in ms. Defaults to 300. Max 5000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, indicating safe read. The description adds detailed behavior: scans specified ports, returns diagnostic structure, reports errors (BAD_ARGUMENT for invalid inputs), and clarifies that a failed probe is simply 'no target'. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact (3-4 sentences) and front-loaded: purpose first, then return format, error types, and failure behavior. Every sentence adds value, no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description fully specifies the return structure (ok, targets, count, scanned with subfields) and error cases. Given 0 required parameters and clear defaults, the agent can use this tool without ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, but the description adds extra constraints: default values (9222-9225, 127.0.0.1, 300ms), maximum port count (64), maximum timeout (5000ms), and host enum restriction to loopback. This adds meaningful context beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Scan' and the resource 'already-running, debuggable Electron apps', specifying the scope 'on loopback only' and default port range. This distinguishes it from sibling tools like electron_launch or electron_attach.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates this tool requires no session, implying it's a preliminary diagnostic step. It mentions error types and failure behavior, but does not explicitly compare to alternatives or state when not to use it. The context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_doctorDiagnose Electron Stagewright environmentARead-only
Run non-mutating preflight checks without starting an Electron session: Node version, Playwright, Electron, Linux display, configured app root and screenshot directory, eval policy, and project Electron runtime alignment. Returns: { ok, doctor_ok, checks, runtime }, where runtime includes server and, with --app-root, target Electron/Node/V8/ABI facts plus a bounded native-addon inventory. Inspect failed checks and warnings before electron_launch. Errors: none.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes tool as non-mutating, which aligns with readOnlyHint annotation. Additionally details what checks are performed and the return structure (including runtime facts and native-addon inventory), going well beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences with high information density: purpose, checks, return value, usage guidance, and error handling. No redundant words; every sentence serves a clear function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter diagnostic tool, the description fully explains the checks performed, the return structure, usage context, and error behavior. There is no missing information needed for correct invocation or interpretation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has zero parameters with 100% coverage. Description adds no parameter info but doesn't need to; baseline of 4 is appropriate as the description cannot add value over an empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it runs non-mutating preflight checks for the Electron Stagewright environment, listing specific resources checked (Node, Playwright, Electron, etc.). This distinctively separates it from siblings that perform actions like launching, clicking, or attaching.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises to inspect results before electron_launch, providing clear temporal guidance. While it doesn't name alternatives, the sibling list includes electron_launch and other tools, making the pre-launch use case unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_dragDrag one element onto anotherA
Drag the source element (ref or selector) onto the target element (targetRef or targetSelector), using the real mouse API. Options: force, timeoutMs. Returns: { ok, session_id, source, target }. Errors: SELECTOR_NO_MATCH / REF_NOT_FOUND (carries similar_refs), ELEMENT_NOT_VISIBLE (retryable), POINTER_NOT_DELIVERED (retryable), NOT_RUNNING, BAD_ARGUMENT (a side missing or both ref+selector given).
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| force | No | Bypass actionability checks (visibility/enabled/stable). Default false. | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| targetRef | No | Drop-target ref. Provide targetRef OR targetSelector. | |
| timeoutMs | No | Actionability budget in ms (default 5000, clamped to 30000). | |
| targetSelector | No | Drop-target CSS/text selector. Provide targetRef OR targetSelector. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and openWorldHint=false, so the description carries the rest and does so well: it documents the return shape, enumerates error codes, and flags which errors are retryable (ELEMENT_NOT_VISIBLE, POINTER_NOT_DELIVERED) versus terminal. It also explains that BAD_ARGUMENT fires when a side is missing or both ref+selector are supplied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and argument contract in one dense sentence, then appends a compact returns/errors block. Nearly every clause earns its place, though the error list is terse enough to feel telegraphic.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still supplies the return fields and a full error taxonomy with retryability, plus argument exclusivity rules. For a 7-parameter mutation tool, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter including defaults, clamps, and the ref-OR-selector rule. The description merely lists 'force, timeoutMs' by name without adding format or behavior meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (drag) plus both the source and target resources, and names the exact argument pairs (ref/selector, targetRef/targetSelector). It is clearly distinguishable from siblings like electron_click or electron_hover.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'using the real mouse API' implies when this differs from synthetic-event siblings, but there is no explicit when-to-use guidance, no exclusions, and no routing to alternatives such as electron_drop_file for file drops. Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_drop_fileDrop files onto an elementA
Simulate dropping OS files onto the element identified by ref or selector. Web DataTransfer mode: reads each path on the host running the server, rebuilds the files in the renderer, and dispatches dragenter/dragover/drop with a real DataTransfer — engaging standard web drop handlers. Paths must be ABSOLUTE (max 10 files, 5242880 bytes each). default_prevented reports whether a drop handler engaged (called preventDefault); false usually means the target has no web drop handler. Apps that resolve dropped files to native OS paths need an app-specific IPC convention this tool does not simulate. Options: mimeType, timeoutMs. Returns: { ok, session_id, target, files, default_prevented }. Errors: ABSOLUTE_PATH_REQUIRED, FILE_NOT_FOUND, BAD_ARGUMENT (too many/large files, or ref+selector both), SELECTOR_NO_MATCH / REF_NOT_FOUND (carries similar_refs), NOT_RUNNING.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| paths | Yes | Absolute file paths to drop. | |
| mimeType | No | MIME type override applied to every file (defaults to extension-based). | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| timeoutMs | No | Actionability budget in ms (default 5000, clamped to 30000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only indicate readOnlyHint=false, but the description extensively covers behavior: dispatches dragenter/dragover/drop events with a real DataTransfer, explains default_prevented meaning, details file size and path restrictions, and lists possible errors. This goes well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with the core purpose first, followed by mechanism, constraints, and error enumeration. It is comprehensive but slightly lengthy; some redundancy exists (e.g., file counts repeated). Still, it earns its sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description fully documents the return object fields (ok, session_id, target, files, default_prevented) and all error types. It also clarifies edge cases (default_prevented false). For a complex tool, this provides complete guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, but the description adds critical constraints not in the schema: absolute paths required, max 10 files, 5242880 bytes each. It also explains the mimeType override behavior and clarifies that ref and selector are mutually exclusive. This adds significant value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool simulates dropping OS files onto an element identified by ref or selector. It distinguishes itself from sibling tools by detailing the DataTransfer mechanism and contrasting with apps needing native IPC paths. The verb 'simulate dropping' and the resource 'OS files onto an element' are specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use (simulate file drops) and when not to (apps requiring native OS paths via IPC). It also provides constraints like absolute paths, file limits, and timeout. However, it does not directly compare to sibling tools like electron_drag or electron_set_files, so some implicit guidance is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_elements_listList elements matching a selectorARead-only
Return every element matching a CSS selector as { ref, role, name, bbox }, capped at limit (default 50, max 200). When more matched than returned, truncated is the number dropped and count is the true total. Returns: { ok, session_id, matches, count, truncated }. Errors: TRANSPORT_UNSUPPORTED, NOT_RUNNING, BAD_ARGUMENT (invalid selector, limit, or multiple sessions).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max matches to return (default 50, max 200). | |
| selector | Yes | CSS selector to match (e.g. "button", "[role=tab]"). | |
| sessionId | No | Target session id. Omit when a single session is running. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the readOnlyHint annotation by detailing the truncation behavior, default/max limit, error types, and return structure. This provides sufficient behavioral transparency for a read-only listing tool without adding contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (4 sentences), front-loaded with the main purpose, and contains no extraneous information. Each sentence adds essential detail (return shape, limit, truncation, errors).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 3 parameters, readOnlyHint annotation, and no output schema, the description fully explains the return value structure, error conditions, and query parameter semantics. It is self-contained for an agent to understand and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Since the schema documentation covers 100% of parameters, the description adds marginal value. It restates the limit default and max, which are already in the schema. No new meaning is added beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns every element matching a CSS selector, specifying the output fields (ref, role, name, bbox). It distinguishes from siblings like 'electron_find' which likely returns a single element, and other list tools by emphasizing 'every' element.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly provide guidance on when to use this tool versus alternatives such as 'electron_exists' or 'electron_find'. The context of use is implied by the purpose (listing all matching elements), but no when-to-use or when-not-to-use instructions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_existsCheck whether an element existsARead-only
Return whether the element identified by ref or selector is present in the DOM. A no-match is a normal result (exists: false), NOT an error — so an agent can poll for appearance/disappearance. Returns: { ok, session_id, exists }. Errors: TRANSPORT_UNSUPPORTED, NOT_RUNNING, BAD_ARGUMENT (invalid selector or ref+selector both/neither).
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint=true, description reveals that no-match is a normal result (exists: false) not an error, and enumerates all error types. This provides significant behavioral clarity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences: purpose, key behavior (no-match non-error), then returns/errors. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description fully covers return format, error types, and use case (polling). With annotations and high schema coverage, no gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. Description mentions 'ref OR selector' but schema already specifies this. No additional semantic detail beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the verb 'return' and resource 'whether element exists'. Distinguishes from siblings like electron_find (which returns element data) and visibility checks. No-match clarification clarifies scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly suggests polling use case for appearance/disappearance. Lists error conditions but omits when not to use (e.g., when needing visibility or text).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_expect_countExpect a match countARead-only
Assert how many elements match, polling until the count satisfies the predicate or timeoutMs elapses. Target EITHER by selector (counts querySelectorAll; visible:true counts visible only, visible:false counts hidden only) OR by accessibility role/name filters (role, name_contains, name_exact, visible, enabled, interactive). Provide at least one of equals, min, max. Returns: { ok, session_id, matched, actual }. Errors: EXPECTATION_FAILED (count predicate not met within timeoutMs — details carry expected + actual; retryable), TRANSPORT_UNSUPPORTED, NOT_RUNNING, BAD_ARGUMENT (no count predicate, or selector mixed with role filters).
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | The match count must be <= this. | |
| min | No | The match count must be >= this. | |
| role | No | Accessibility role to match (role mode). | |
| equals | No | The match count must equal this. | |
| enabled | No | Restrict to enabled (or disabled) matches (role mode). | |
| visible | No | Count only visible (or hidden) matches. | |
| selector | No | CSS selector to count. Omit to count by role/name. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| timeoutMs | No | Max poll time in ms before EXPECTATION_FAILED (default 5000, clamped to 60000). 0 = check once. | |
| name_exact | No | Exact accessible name to match (role mode). | |
| interactive | No | Restrict to interactive matches (role mode). | |
| name_contains | No | Substring the accessible name must contain (role mode). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses polling behavior, timeout clamping, error types (EXPECTATION_FAILED with details, retryable), and the return structure. This adds significant behavioral context beyond the readOnlyHint annotation, which only indicates read-only nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently structured: first sentence states core functionality, then explains modes, then requirements, then returns and errors. No redundant sentences, all information is necessary and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (12 parameters, no output schema), the description covers purpose, parameter usage, return values, and error scenarios. It provides enough context for an agent to invoke the tool correctly without additional documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, baseline is 3. The description adds meaning by grouping parameters into selector vs role modes, clarifying visible behavior (counts visible only or hidden only), and explaining count predicates. This adds value beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Assert how many elements match, polling until the count satisfies the predicate or timeoutMs elapses.' It specifies the verb (assert), resource (element count), and distinguishes from sibling tools like electron_expect_state and electron_expect_text by focusing on count assertions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the two modes (by selector or role/name) and requires at least one of equals, min, or max. It does not explicitly exclude cases or mention alternatives, but the context is clear enough for an agent to decide when to use this tool over others.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_expect_stateExpect an element stateARead-only
Assert the element identified by ref or selector matches the given state flags (any of visible, enabled, disabled, checked, selected, expanded, pressed, focused, readonly, required, invalid, busy), evaluated atomically and polled until they hold or timeoutMs elapses. Returns: { ok, session_id, matched, state }. Errors: EXPECTATION_FAILED (state not reached within timeoutMs — details carry expected + the last observed actual state; retryable), REF_NOT_FOUND (stale ref; carries similar_refs), TRANSPORT_UNSUPPORTED, NOT_RUNNING, BAD_ARGUMENT (invalid selector, no state flags, or ref+selector both/neither).
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| state | Yes | ||
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| timeoutMs | No | Max poll time in ms before EXPECTATION_FAILED (default 5000, clamped to 60000). 0 = check once. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description adds significant behavioral details: atomic polling, timeout mechanism, error types (EXPECTATION_FAILED, REF_NOT_FOUND), and return format. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is comprehensive but slightly verbose with error details. It is well-structured, starting with the core action and then listing errors. Could be slightly trimmed without losing value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully explains the return format and all error types. It covers the complex nested state parameter, multiple identification methods, and timeout behavior, making it complete for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, and the description compensates by explaining the state flags and mutual exclusivity of ref/selector. While schema describes most parameters, the description adds clarity on state flag usage and error conditions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool asserts element state flags, identifies the element via ref/selector, and polls until timeout. It distinguishes from siblings like electron_expect_visible by supporting multiple state flags atomically.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the polling behavior and error conditions but lacks explicit guidance on when to use this tool versus alternatives for single state checks. It implies usage for multi-flag assertions but does not provide exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_expect_textExpect element textARead-only
Assert the text of the element identified by ref or selector matches a predicate, polling until it holds or timeoutMs elapses. Provide exactly one of: equals, contains, regex, not_equals, not_contains. Optional flags (any of i, m, s, u) apply to regex; g and y are rejected as stateful. Returns: { ok, session_id, matched, actual }. Errors: EXPECTATION_FAILED (predicate not met within timeoutMs — details carry expected + actual; retryable), REF_NOT_FOUND (stale ref; carries similar_refs), TRANSPORT_UNSUPPORTED, NOT_RUNNING, BAD_ARGUMENT (no/multiple predicates, invalid regex or flags, or ref+selector both/neither).
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| flags | No | Optional regex flags (any of i, m, s, u) applied to the regex predicate; g and y are rejected as stateful. Only valid alongside a regex predicate. | |
| regex | No | The text must match this JavaScript regular expression. | |
| equals | No | The text must equal this exactly. | |
| contains | No | The text must contain this substring. | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| timeoutMs | No | Max poll time in ms before EXPECTATION_FAILED (default 5000, clamped to 60000). 0 = check once. | |
| not_equals | No | The text must NOT equal this. | |
| not_contains | No | The text must NOT contain this substring. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=true and openWorldHint=false, indicating a read-only side-effect-free operation. The description adds extensive behavioral context: polling semantics, timeout clamping, exact predicate matching, rejection of stateful regex flags (g, y), and detailed error payloads (similar_refs for stale refs, expected+actual for assertion failure). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently structured: front-loaded with core purpose and polling behavior, then a clear bullet of predicate options, followed by flags and error categories. Each sentence serves a distinct purpose without redundancy. Length is justified by the parameter count and error complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description fully documents the return object ({ ok, session_id, matched, actual }) and all possible errors with sufficient detail for an agent to handle failures. It covers polling timeout, predicate constraints, and the ref/selector duality. For a tool with 10 parameters, this is comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the baseline is 3. However, the description adds critical semantic constraints beyond the schema: the mutual exclusivity of predicates ('exactly one'), the relationship between 'flags' and 'regex', and the behavior of timeoutMs (0 = check once). This enriches the agent's understanding of parameter interactions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: asserting text of an element via ref/selector with polling. It identifies the specific verb ('Assert'), resource ('text of the element'), and mechanism ('polling until it holds or timeoutMs elapses'). This distinguishes it from siblings like electron_get_text (retrieval without assertion) and other expect_ tools (e.g., expect_url, expect_state) which target different resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit selection constraints: 'Provide exactly one of: equals, contains, regex, not_equals, not_contains' and clarifies flags applicability only to regex. It also details error types (EXPECTATION_FAILED, REF_NOT_FOUND, etc.) and their retryability. However, it does not explicitly contrast with alternatives like electron_get_text for cases where the agent might want to fetch text without assertion, though the sibling list implies differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_expect_urlExpect the window URLARead-only
Assert the active window's URL (location.href) satisfies a predicate, polling until it does or timeoutMs elapses. Provide exactly one of: contains (substring) or matches (JavaScript regex). Optional flags (any of i, m, s, u) apply to matches; g and y are rejected as stateful. Returns: { ok, session_id, matched, actual }. Errors: EXPECTATION_FAILED (URL did not match within timeoutMs — details carry expected + actual; retryable), TRANSPORT_UNSUPPORTED, NOT_RUNNING, BAD_ARGUMENT (no/both predicates, or invalid regex or flags).
| Name | Required | Description | Default |
|---|---|---|---|
| flags | No | Optional regex flags (any of i, m, s, u) applied to the regex predicate; g and y are rejected as stateful. Only valid alongside a regex predicate. | |
| matches | No | The URL must match this JavaScript regular expression. | |
| contains | No | The URL must contain this substring. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| timeoutMs | No | Max poll time in ms before EXPECTATION_FAILED (default 5000, clamped to 60000). 0 = check once. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=true and openWorldHint=false, and the description adds polling behavior, timeout clamping, and detailed error types including retryability of EXPECTATION_FAILED. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences covering purpose, predicates, flags, returns, and errors—every sentence carries essential information with no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description explicitly lists return fields and error types. For a polling assertion tool, this provides complete context for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds important usage semantics like mutually exclusive predicates, flag restrictions ('g and y are rejected'), and meaning of timeoutMs = 0. This goes beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'asserts the active window's URL satisfies a predicate' and specifies the supported predicates (contains, matches) and flags. This differentiates it from sibling tools that operate on other aspects like text, state, or count.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly requires providing exactly one of 'contains' or 'matches' and explains optional flags and timeout behavior. While it doesn't explicitly compare with alternatives, the purpose is specific enough for an agent to infer appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_expect_valueExpect form control valueARead-only
Assert the value of the element identified by ref or selector matches a predicate, polling until it holds or timeoutMs elapses. Provide exactly one of: equals, contains, regex, not_equals, not_contains. Optional flags (any of i, m, s, u) apply to regex; g and y are rejected as stateful. Returns: { ok, session_id, matched, actual }. Errors: EXPECTATION_FAILED (predicate not met within timeoutMs — details carry expected + actual; retryable), REF_NOT_FOUND (stale ref; carries similar_refs), TRANSPORT_UNSUPPORTED, NOT_RUNNING, BAD_ARGUMENT (no/multiple predicates, invalid regex or flags, or ref+selector both/neither).
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| flags | No | Optional regex flags (any of i, m, s, u) applied to the regex predicate; g and y are rejected as stateful. Only valid alongside a regex predicate. | |
| regex | No | The text must match this JavaScript regular expression. | |
| equals | No | The text must equal this exactly. | |
| contains | No | The text must contain this substring. | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| timeoutMs | No | Max poll time in ms before EXPECTATION_FAILED (default 5000, clamped to 60000). 0 = check once. | |
| not_equals | No | The text must NOT equal this. | |
| not_contains | No | The text must NOT contain this substring. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds rich behavioral details: polling until timeout, the exact error types (EXPECTATION_FAILED, REF_NOT_FOUND, etc.) with their semantics and retryability, and timeout clamping. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph but front-loaded with the primary purpose. It could be slightly more structured (e.g., bullet points for predicates and errors), but every sentence adds value and there is no redundancy. Slightly lower for readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (10 parameters, no output schema), the description sufficiently covers return values (ok, session_id, matched, actual), all error types with conditions, and predicate rules. It is complete enough for an agent to use correctly without additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. However, the description adds significant value beyond the schema: it explains mutual exclusivity of predicates, valid regex flags (rejecting stateful ones), the meaning of timeoutMs=0, and the return format. This is excellent parameter-level guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool asserts the value of an element against a predicate, with polling. It uses specific verbs ('assert') and resource ('form control value'), and distinguishes well from sibling tools like electron_expect_text or electron_expect_state which handle different checks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description specifies that exactly one predicate from a list must be provided, and explains flags for regex. However, it does not explicitly contrast with alternatives like electron_expect_text for text content, leaving some ambiguity about when to use this vs similar tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_expect_visibleExpect an element visibleARead-only
Assert the element identified by ref or selector is visible, polling until it is or timeoutMs elapses. Visible means attached, laid out, and not visibility:hidden. Returns: { ok, session_id, matched }. Errors: EXPECTATION_FAILED (not visible within timeoutMs; retryable), REF_NOT_FOUND (stale ref; carries similar_refs), TRANSPORT_UNSUPPORTED, NOT_RUNNING, BAD_ARGUMENT (invalid selector, or ref+selector both/neither).
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| timeoutMs | No | Max poll time in ms before EXPECTATION_FAILED (default 5000, clamped to 60000). 0 = check once. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains polling behavior, timeout clamping, return structure, and error conditions. It adds significant behavioral context beyond the annotations, which only state readOnlyHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (4 sentences) with a clear front-loaded main action, followed by definition, return, and errors. Every sentence serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 4 parameters and no output schema, the description adequately covers purpose, behavior, return fields, and all possible errors. No critical information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline 3 is appropriate. The description adds no new information beyond the schema's property descriptions, though it does restate the ref/selector exclusivity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool asserts an element's visibility, defines 'visible' precisely, and distinguishes it from other expect tools like expect_text or expect_state. The verb 'assert' and resource 'element visibility' are specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description covers the tool's behavior but does not explicitly guide when to use it versus siblings like electron_exists or other expect tools. Usage is implied through the definition of visibility.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_findFind elements by role and nameARead-only
Find elements in the renderer by accessibility role + name + state — no CSS selectors. Filters: role (exact), name_contains, name_exact, visible, enabled, interactive; limit caps the matches returned (count still reports the true total). Returns: { ok, surface_id, matches: [{ ref, role, name, bbox }], count, truncated, renderer_reloaded }. A ref may be null for non-interactive landmarks. On zero matches, hints may explain why: similar_names, without_state_filters, other_roles, roles_present, text_matches (text content, not accessible name, with a selector for electron_get_text / electron_exists) and next_actions. Errors: NOT_RUNNING (no session — call electron_launch first; not retryable), BAD_ARGUMENT (multiple sessions live — pass sessionId).
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | Accessibility role to match exactly (e.g. "button"). | |
| limit | No | Cap the matches returned (in document order); count still reports the true total so a truncation is detectable. Unset returns every match. | |
| enabled | No | Restrict to enabled (or disabled) elements. | |
| visible | No | Restrict to visible (or hidden) elements. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| name_exact | No | Exact accessible name to match. | |
| interactive | No | Restrict to interactive (or non-interactive) elements. | |
| name_contains | No | Substring the accessible name must contain. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover readOnlyHint and openWorldHint; the description adds substantial behavioral detail beyond that — limit truncation semantics with count still reporting the true total, the truncated flag, null refs for non-interactive landmarks, and the exact zero-match hint payload (similar_names, without_state_filters, other_roles, roles_present, text_matches). It also names the two error codes, marks NOT_RUNNING non-retryable, and explains multi-session BAD_ARGUMENT.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and constraint in the first clause, and every later sentence carries non-redundant payload (returns shape, null refs, hint keys, errors). It is dense and slightly run-on — the long parenthetical enumerating hint fields is heavy — but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return contract itself and does so fully: the result envelope, matches shape, count/truncated relationship, and the optional zero-match hints object. Error behavior and recovery paths are also covered, leaving nothing material an agent needs before calling it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter is already documented, so the baseline is 3. The description's filter list largely restates schema fields (role exact, name_contains, name_exact, visible, enabled, interactive, limit) and omits sessionId from that list, adding little semantic weight beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Find elements in the renderer by accessibility role + name + state") and immediately draws the boundary against the CSS-selector approach used by siblings like electron_wait_for_selector and electron_exists. An agent can distinguish this from electron_elements_list or electron_snapshot without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"No CSS selectors" plus the NOT_RUNNING remediation ("call electron_launch first") give clear entry conditions and steer away from selector-based siblings. However, it never names a concrete alternative for state-polling cases (electron_wait_for_state, electron_expect_visible) or says when a cheaper tool suffices, so alternatives are implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_focused_elementGet the focused elementARead-only
Return the element that currently has focus as { ref, role, name }, or focused: null when nothing (or only the body) is focused. Useful after a Tab press or to confirm focus moved. Returns: { ok, session_id, focused }. Errors: TRANSPORT_UNSUPPORTED, NOT_RUNNING, BAD_ARGUMENT (multiple sessions).
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | No | Target session id. Omit when a single session is running. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses the return format, null case (body only focus), and possible error types (TRANSPORT_UNSUPPORTED, NOT_RUNNING, BAD_ARGUMENT). No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences with no redundancy. Information is front-loaded and every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one optional parameter, the description covers purpose, return format, edge case (null focus), and errors. No output schema exists, but the description sufficiently explains the response structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already covers the single parameter (sessionId) with a clear description. The tool description adds minimal extra meaning about parameter usage, but mentions a BAD_ARGUMENT error for multiple sessions, providing slight context beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Return' and the resource 'element that currently has focus', specifying the output format as { ref, role, name }. It distinguishes itself from sibling tools by its specific focus-retrieval purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage context: 'Useful after a Tab press or to confirm focus moved.' This helps the agent know when to apply. However, it does not mention when not to use or provide alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_force_killForce-kill Electron appADestructive
Forcefully kill a session (SIGKILL) and release it — the escape hatch when stop hangs. Pass sessionId to target a specific session. Returns: { ok, session_id, killed: true }. Errors: NOT_RUNNING (no such session; not retryable), BAD_ARGUMENT (multiple sessions live — pass sessionId).
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | No | Target session id. Omit when a single session is running. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructive nature. Description adds specific details: uses SIGKILL, returns {ok, session_id, killed: true}, lists error types. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: first captures purpose and use case, second covers return and errors. Every word earns its place; no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple destructive tool with one parameter, the description covers purpose, usage, return format, and error handling. Annotations handle safety profile. Complete for agent decision-making.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single parameter 'sessionId' with 100% schema coverage. Description adds value by explaining that omission works when single session is active and that errors include BAD_ARGUMENT for multiple sessions without sessionId.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Describes a specific verb ('force kill'), resource ('session'), and context ('escape hatch when stop hangs'). Clearly distinguishes from sibling 'electron_stop' by stating it's the hard kill option.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States when to use ('when stop hangs') and lists error conditions (NOT_RUNNING, BAD_ARGUMENT). Could be improved by explicitly stating when NOT to use (e.g., prefer stop first).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_get_attributeGet an element attributeARead-only
Return the value of attribute name on the element identified by ref or selector (null when the attribute is absent — that is not an error). Returns: { ok, session_id, value }. Errors: REF_NOT_FOUND / SELECTOR_NO_MATCH (carries similar_refs), TRANSPORT_UNSUPPORTED, NOT_RUNNING, BAD_ARGUMENT.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| name | Yes | Attribute name, e.g. "href" or "aria-label". | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and openWorldHint=false. The description adds behavioral detail beyond annotations: returns null for absent attribute (not an error), lists specific error types, and describes the return format. This provides helpful context for safe operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is relatively concise with core purpose upfront. It includes error list and return format in a single paragraph. A bit dense but not overly verbose. Could be slightly more structured, but overall effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (4 parameters, no output schema, no nested objects), the description covers return values, error types, null behavior, and the element identification methods. It does not mention the mutual exclusivity of ref and selector, which is in the schema, but still provides sufficient context for correct usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers all 4 parameters with descriptions (100% coverage). The description itself does not add new parameter-level information beyond what the schema provides. Baseline 3 is appropriate as schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns the value of an attribute on an element, distinguishing it from sibling tools like get_text or get_value. It specifies the verb (return), resource (attribute on element), and handles the null case for absent attributes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains how to use it (by ref or selector) and mentions null behavior, but does not provide explicit guidance on when to use this tool over alternatives or when not to use it. Sibling tools are not referenced.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_get_bboxGet an element’s bounding boxARead-only
Return the bounding box (CSS pixels) of the element identified by ref or selector. Returns: { ok, session_id, bbox: { x, y, w, h } }. Errors: REF_NOT_FOUND / SELECTOR_NO_MATCH (carries similar_refs), TRANSPORT_UNSUPPORTED, NOT_RUNNING, BAD_ARGUMENT.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description adds detailed error types and return format, going beyond the annotation. It provides context about the operation's safety and possible failures.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences efficiently convey purpose, return format, and errors. No unnecessary information; front-loaded with the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description fully specifies the return object and all possible error types. For a simple read operation, this is complete and sufficient for agent invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already fully describes parameters. The description adds little beyond noting 'ref OR selector' and a brief mention of sessionId, but this is already covered in schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns the bounding box in CSS pixels for an element identified by ref or selector, which is a specific verb and resource. This distinguishes it from sibling tools like electron_get_attribute or electron_get_state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use when needing bounding box geometry but does not explicitly state when to prefer this over alternatives like electron_get_state or electron_get_computed_style. No exclusions or when-not guidance are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_get_computed_styleGet computed CSS propertiesARead-only
Return the computed value of each requested CSS property (kebab-case, e.g. "background-color") for the element identified by ref or selector (max 50 properties). Only the requested properties are returned, never the full declaration. Returns: { ok, session_id, style: { : } }. Errors: REF_NOT_FOUND / SELECTOR_NO_MATCH (carries similar_refs), TRANSPORT_UNSUPPORTED, NOT_RUNNING, BAD_ARGUMENT.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| properties | Yes | CSS properties to read, kebab-case (e.g. ["display", "background-color"]). Max 50. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds behavioral details: it only returns requested properties (never full style), returns a structured object with ok, session_id, style, and enumerates specific error types. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured paragraph. It front-loads the core action, then details constraints and output format, followed by error types. Every sentence adds information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description fully explains the return format and error scenarios. With 4 parameters (all documented) and the complexity of getting computed styles, the description leaves no ambiguity for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% parameter coverage, but the description adds value by explaining kebab-case for properties, mutual exclusion of ref/selector, and maximum items of 50. This goes beyond the schema's basic descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Return the computed value of each requested CSS property' for an element identified by ref or selector. It specifies kebab-case notation and a max of 50 properties, distinguishing it from sibling tools like electron_get_attribute or electron_get_state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly indicates when to use (when needing computed CSS values) and provides guidance on providing ref OR selector. It lists possible errors that help an agent decide if it's the right tool, though explicit comparison to alternatives is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_get_stateGet an element’s full stateARead-only
Return the full state envelope of the element identified by ref or selector: { visible, enabled, disabled, checked, selected, expanded, pressed, focused, readonly, required, invalid, busy } plus its role and name. One call answers "is this clickable / checked / focused". Returns: { ok, session_id, ref, role, name, state }. Errors: REF_NOT_FOUND / SELECTOR_NO_MATCH (carries similar_refs), TRANSPORT_UNSUPPORTED, NOT_RUNNING, BAD_ARGUMENT (invalid selector or ref+selector both/neither).
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description adds value by detailing the return shape (list of states, role, name) and listing possible errors (REF_NOT_FOUND, etc.). No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is highly concise: three sentences that front-load the main purpose, then list states and error types. Every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description fully explains the return value structure and all possible errors. For a simple read-only tool, this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description does not need to add much. It reiterates that ref or selector should be provided, not both, which is already implied by the schema descriptions. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool returns the full state envelope of an element, listing all boolean properties plus role and name. It clearly distinguishes from sibling tools like electron_expect_state or electron_get_attribute by being a comprehensive state query.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a strong usage hint: 'One call answers is this clickable / checked / focused'. It implies use when multiple state properties are needed. However, it does not explicitly contrast with siblings like electron_expect_state (which asserts a state) or electron_exists, leaving some ambiguity about when to prefer this over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_get_textGet an element’s textARead-only
Return the text of the element identified by ref or selector: its trimmed textContent, or — when that is empty — the accessible label that electron_find matches on (aria-labelledby/aria-label, native labels, alt, title, placeholder), so a find-by-name then get_text chain works on labelled controls. Returns: { ok, session_id, text }. Errors: REF_NOT_FOUND / SELECTOR_NO_MATCH (no such element; carries similar_refs), TRANSPORT_UNSUPPORTED, NOT_RUNNING, BAD_ARGUMENT (invalid selector or ref+selector both/neither).
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond annotations: it explains the fallback logic (trimmed textContent then accessible label), enumerates all error types, and confirms the tool is read-only, consistent with annotations. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact but includes necessary details (behavior, errors, return shape). It is front-loaded with the core action. Minor redundancy in error listing but still efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description covers return format and errors. Parameters are fully explained via schema. Sibling tools are many but the tool's purpose is distinct. Completeness is high for a read-only text retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are already documented. The description reiterates the 'ref OR selector' constraint but does not add new semantics beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Return the text of the element identified by ref or selector' with a specific verb and resource. It distinguishes from siblings like electron_get_value and electron_get_attribute by focusing on text content and accessible labels.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use (to get text content, especially for find-by-name chains) but does not explicitly exclude scenarios or mention alternatives among the many sibling tools. However, the context is clear enough for most agents.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_get_valueGet a form control’s valueARead-only
Return the .value of the input/textarea/select identified by ref or selector (null if the element has no value). Returns: { ok, session_id, value }. Errors: REF_NOT_FOUND / SELECTOR_NO_MATCH (carries similar_refs), TRANSPORT_UNSUPPORTED, NOT_RUNNING, BAD_ARGUMENT.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses return format ({ ok, session_id, value }), null handling, and specific error types (REF_NOT_FOUND, SELECTOR_NO_MATCH, etc.). Annotations (readOnlyHint=true) are consistent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very concise: one sentence with essential details front-loaded, followed by return and error notes. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Explanation of usage, return format, errors, and optional sessionId is sufficient for a simple getter. No output schema needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions, but the description adds behavioral context (element types, null return). Minor gap: no clarification on value type (string? number?).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns the .value of form controls (input/textarea/select) by ref or selector. It distinguishes from siblings like electron_get_attribute or electron_get_text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for form control values, but doesn't explicitly contrast with alternative getters. It clearly explains the ref/selector choice and sessionId optionality.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_hoverHover an elementA
Hover the element identified by ref or selector (e.g. to reveal a tooltip or menu). Options: force, timeoutMs. Returns: { ok, session_id, target }. Errors: REF_NOT_FOUND / SELECTOR_NO_MATCH (carries similar_refs), ELEMENT_NOT_VISIBLE (retryable), POINTER_NOT_DELIVERED (retryable), NOT_RUNNING, BAD_ARGUMENT.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| force | No | Bypass actionability checks (visibility/enabled/stable). Default false. | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| timeoutMs | No | Actionability budget in ms (default 5000, clamped to 30000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and openWorldHint=false; the description adds substantial value beyond that by enumerating error codes with retryable semantics (ELEMENT_NOT_VISIBLE, POINTER_NOT_DELIVERED) and a return shape. It omits any note on auth/permissions, but for a non-destructive UI interaction the error and return disclosure is meaningful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then options, returns, and errors in compact labeled segments. The error list is dense but every entry earns its place; nothing is redundant padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by giving the return shape and the full error taxonomy, which is what an agent needs to handle this interaction tool. Coverage is strong, with only minor omissions like permission requirements.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters (including sessionId, which the description omits). The description's 'Options: force, timeoutMs' merely echoes a subset of what the schema fully specifies, adding little. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Hover) and target (element identified by ref or selector), and adds the motivation ('e.g. to reveal a tooltip or menu') that distinguishes it from click/press siblings. An agent can tell exactly what this does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear usage context (reveal a tooltip or menu) that orients the agent toward when hovering is appropriate rather than clicking. It stops short of naming alternatives or explicit when-not conditions, but the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_infoElectron app infoARead-only
Report the running Electron app environment: runtime versions (electron/node/chrome/v8), app name/version/paths, packaged flag, code-signature status (verified for packaged macOS apps; "unknown" for unpackaged/dev apps, "unsupported" off macOS), the active transport, and its capability matrix. Pass sessionId to target a specific session when several are running. Versions and app fields are null when the transport cannot evaluate in the main process (CDP sessions). Returns: { ok, session_id, transport, versions, app, signature, capabilities }. Errors: NOT_RUNNING (no session — call electron_launch first; not retryable), BAD_ARGUMENT (multiple sessions live — pass sessionId; not retryable).
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | No | Target session id. Omit when a single session is running. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, but the description adds substantial undisclosed behavior: signature status semantics per packaging and OS, null returns for versions/app under CDP transports, and error codes with explicit retryability. This is exactly the kind of context structured fields cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense but well-ordered paragraph: purpose first, then enumeration, then the targeting rule, then return shape, then errors. No filler sentences, and every clause carries information an agent would otherwise have to probe for.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return object shape and the error taxonomy itself, plus the null-field caveats for CDP sessions. For a read-only diagnostic tool, nothing an agent needs to call it correctly or interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the single sessionId parameter is already documented; the description still adds meaning by tying omission to the single-session case and by naming the BAD_ARGUMENT failure when multiple sessions are live. Marginal but genuine added value above baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Report') and resource ('running Electron app environment') and then enumerates exactly what is reported: versions, app identity/paths, packaged flag, code-signature status, transport, and capability matrix. An agent can distinguish this from sibling probes like electron_status or electron_discover_running from the content list alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete conditional ('Pass sessionId to target a specific session when several are running') and routes the NOT_RUNNING case to electron_launch first. It stops short of naming a sibling as the preferred alternative for, say, a quick liveness check, so it is clear context rather than full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_injectInject into running Electron appA
Attach to a running Electron process that was NOT started with a debug flag, by injecting the Node inspector. Provide pid. Returns: { ok, session_id, transport, windows, capabilities }. Errors: INJECT_FAILED (handshake failed or inspector belongs to another process; retryable — try electron_attach when the app already exposes a debug endpoint), TRANSPORT_UNSUPPORTED, BAD_ARGUMENT.
| Name | Required | Description | Default |
|---|---|---|---|
| pid | Yes | Process id of the running Electron app. | |
| timeoutMs | No | Max wait for the inspector handshake. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give readOnlyHint=false and openWorldHint=false; the description goes well beyond by disclosing the return shape ({ ok, session_id, transport, windows, capabilities }) and three named error conditions with retryability and a remediation path. This is exactly the extra context annotations cannot supply for an injection/mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the key precondition and mechanism in the first clause, then compresses return shape and errors into a tight list. Dense but every element earns its place; slightly runs together as one long block without visual separation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description still names the return fields and enumerates failure modes with retry guidance, so an agent knows both what comes back and how to recover. Nothing needed to invoke this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both params (pid, timeoutMs) are already documented there. The description only restates 'Provide pid', adding no format, range, or default detail beyond the schema. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (attach), the resource (a running Electron process), and the decisive precondition (NOT started with a debug flag) plus the mechanism (injecting the Node inspector). This immediately distinguishes it from the sibling electron_attach, which targets apps already exposing a debug endpoint.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the selection condition (app lacks a debug flag) and routes to the alternative in the error guidance: 'try electron_attach when the app already exposes a debug endpoint'. Both the when and the when-not are stated, along with the retryable nature of INJECT_FAILED.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_keyPress a key or chordA
Press a key or chord (e.g. 'Enter', 'Control+A', 'ArrowDown'). Focuses ref/selector first when given; otherwise presses against the active element. For editors, click the visible content area first; reserve force:true for offscreen inputs that truly accept focus. Options: force, timeoutMs, waitForFocusMs, requireEditable. Returns: { ok, session_id, key, focused }. Errors: SELECTOR_NO_MATCH / REF_NOT_FOUND (carries similar_refs), ELEMENT_NOT_VISIBLE (retryable), NO_FOCUSED_EDITABLE, NOT_RUNNING, BAD_ARGUMENT (ref+selector both).
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Key or chord, e.g. 'Enter' or 'Control+A'. | |
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| force | No | Bypass actionability checks (visibility/enabled/stable). Default false. | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| timeoutMs | No | Actionability budget in ms (default 5000, clamped to 30000). | |
| waitForFocusMs | No | No target: wait up to this many ms for an editable element to take focus. | |
| requireEditable | No | Fail with NO_FOCUSED_EDITABLE unless keys go to an editable element. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly=false and openWorld=false, so the description carries the real burden and does: it discloses the return shape { ok, session_id, key, focused }, enumerates failure modes (SELECTOR_NO_MATCH/REF_NOT_FOUND with similar_refs, ELEMENT_NOT_VISIBLE retryable, NO_FOCUSED_EDITABLE, NOT_RUNNING, BAD_ARGUMENT), and explains focus/force behavior. It stops short of stating whether the key press is dispatched as down+up or how modifiers are handled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and examples, then scoping rule, then editor caveat, then returns and errors. Dense but every clause carries usable information; the only filler is the short options enumeration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, no-output-schema tool, the description supplies the missing pieces: return object keys, error taxonomy, and target-resolution rules. An agent can call it and interpret failures without further documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description earns above that by explaining the ref-vs-selector precedence ('Focuses ref/selector first when given') and the intent behind force:true rather than merely restating its definition. The 'Options:' list itself is redundant with the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource with concrete key/chord examples ('Control+A', 'ArrowDown'). It does not explicitly name the sibling it displaces (electron_type, electron_type_into_editor, electron_press_sequence), so an agent must infer that boundary from the editor hint rather than from an explicit routing statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operating context: focuses ref/selector first when provided, otherwise targets the active element; for editors, click the visible content area first; reserve force:true for offscreen inputs that truly accept focus. Clear when-to-use guidance, but no explicit when-not or named alternative for multi-key sequences.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_keyboard_typeType text as real keystrokesA
Type text as real per-character keystrokes (fires keydown/keypress/input/keyup per char), unlike electron_type which sets the value directly. Focuses ref/selector first when given; otherwise types into the active element. For a code editor (Monaco / EditContext), the reliable path is electron_type_into_editor (it clicks the editor content area, e.g. '.monaco-editor .view-lines', then types into the focused editor) — do NOT target the hidden textarea, which modern editors ignore. force:true focuses an offscreen/aria-hidden input but a swallowed keystroke returns TYPE_NO_EFFECT. Options: force, timeoutMs, waitForFocusMs, requireEditable. Returns: { ok, session_id, typed, focused: { role, name, editable } | null } (where the keys went). Errors: SELECTOR_NO_MATCH / REF_NOT_FOUND (carries similar_refs), ELEMENT_NOT_VISIBLE (retryable), TYPE_NO_EFFECT (typing changed nothing — use electron_type_into_editor), NO_FOCUSED_EDITABLE, NOT_RUNNING, BAD_ARGUMENT.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| text | Yes | The text to type, character by character. | |
| force | No | Bypass actionability checks (visibility/enabled/stable). Default false. | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| timeoutMs | No | Actionability budget in ms (default 5000, clamped to 30000). | |
| waitForFocusMs | No | No target: wait up to this many ms for an editable element to take focus. | |
| requireEditable | No | Fail with NO_FOCUSED_EDITABLE unless keys go to an editable element. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false/openWorldHint=false, so the description carries the real burden and does: it explains focus behavior with and without a target, the force bypass semantics, the TYPE_NO_EFFECT failure mode, retryability of ELEMENT_NOT_VISIBLE, and enumerates error codes. It even documents the return payload shape despite no output schema existing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core verb/mechanism contrast in the first sentence, and every subsequent sentence carries actionable information (alternative tool, focus behavior, force caveat, return shape, errors). It is a dense single block with a long error enumeration that is slightly over-packed for readability, but nothing is truly wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter interaction tool with no output schema, the description covers focus resolution, actionability/force semantics, failure modes with remediation hints, and the exact return shape including the focused element descriptor. An agent has everything needed to call it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning beyond the schema for force (focuses offscreen/aria-hidden inputs, keystroke may be swallowed) and explains the no-target focus path governed by waitForFocusMs. It only lists timeoutMs and requireEditable by name without adding semantics, so it stops short of full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and mechanism ('type text as real per-character keystrokes') and immediately distinguishes it from the sibling electron_type ('sets the value directly'). The distinction from electron_type_into_editor for editors is also spelled out, so an agent can pick the right tool without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: use electron_type for value-setting, use this for real keystrokes, use electron_type_into_editor for Monaco/EditContext, and an explicit 'do NOT target the hidden textarea' exclusion. The force caveat ('swallowed keystroke returns TYPE_NO_EFFECT') adds a when-not condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_launchLaunch Electron appA
Launch an Electron app and start a driving session. Provide main (absolute path to the main-process entry) or executablePath. When the server has --app-root, a main launch uses the Electron installed in that project (runtime_source "project"); if the project has none it uses the server's Electron and says why in runtime_fallback. runtime:"server" always uses the server's, runtime:"project" requires the project's; an explicit executablePath takes precedence. Executable-only launches are treated as packaged apps and use a transport-owned, loopback CDP endpoint; main-based development launches use Playwright. A server started with --demo supplies its packaged demo entry when both are omitted. Returns: { ok, session_id, transport, windows, renderer_ready, runtime_source, runtime_fallback?, launch_mode, capabilities }. credentialStore defaults to "testing": macOS receives --use-mock-keychain and Linux receives --password-store=basic so OS credential prompts cannot wedge automation. Use credentialStore:"system" when assertions must verify genuine safeStorage sealing. Waits (up to readyTimeoutMs, default 5000) for the renderer DOM to finish its initial render, so a snapshot/find right after launch sees a populated app; renderer_ready:false means it was not confirmed in time (the session is still usable — retry the read, or wait_for_selector on an expected element). By default refuses a second launch while a session is live (pass allowMultiple: true to override). Errors: ALREADY_RUNNING (a session is live, or the concurrent-session cap is reached — stop one or pass allowMultiple; not retryable), ABSOLUTE_PATH_REQUIRED / FILE_NOT_FOUND (preflight; not retryable), BAD_ARGUMENT (neither main nor executablePath given; runtime:"project" without main when no executablePath is given, or without --app-root when resolving that runtime; a runtime-altering env var like NODE_OPTIONS; instrumentNative without main; or, when the server set --app-root, a main/executablePath/cwd outside that root), FUSES_BLOCK_LAUNCH (a main-based development launch selected a binary that disables the Node CLI inspect channel Playwright requires; not retryable — use executablePath without main for packaged CDP launch, attach over CDP, or use a compatible development build), ELECTRON_RUNTIME_MISSING (a main-based launch without executablePath found no downloaded Electron binary or no electron package for the server; not retryable — run install-electron with the server's npx --package list, pass executablePath, or use runtime:"project"), SINGLE_INSTANCE_LOCK (another app instance holds the lock; not retryable), LAUNCH_FAILED (the packaged app could not start or exited before a driveable renderer; not retryable), LAUNCH_TIMEOUT (first window did not appear, often a main process blocked on an OS prompt or dialog; retryable), TRANSPORT_UNSUPPORTED (no launch-capable transport).
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | Working directory for the spawned process. | |
| env | No | Environment variables for the spawned process. | |
| args | No | Extra CLI args appended after the entry. | |
| main | No | Absolute path to the app main-process JS entry. Required unless executablePath is given or the server configured a default demo entry. | |
| runtime | No | "project" uses Electron resolved from the operator-configured --app-root and requires main; "server" uses the server's own Electron. An explicit executablePath takes precedence. Default: "project" when --app-root is set and the project has Electron, otherwise "server". | |
| timeoutMs | No | Max wait (ms) for the app to start and show its first window. Capped at 50000 so it plus readyTimeoutMs stays under the dispatch timeout backstop. | |
| allowMultiple | No | Allow launching when a session already exists. Default false (single instance). | |
| executablePath | No | Absolute path to an Electron/app binary. Defaults to the bundled Electron. | |
| readyTimeoutMs | No | Max wait (ms) for the renderer DOM to finish its initial render before returning. Default 5000; 0 returns immediately with renderer_ready reflecting the instantaneous state. Capped at 60000 to stay under the dispatch timeout backstop. | |
| credentialStore | No | Default "testing" avoids blocking credential prompts with --use-mock-keychain on macOS or --password-store=basic on Linux. Use "system" to verify genuine safeStorage behavior. | |
| instrumentNative | No | Wrap the app main entry with fixed hooks installed before it runs, so startup Tray state is readable/invokable (native_trays / native_tray_invoke) and startup notifications can be captured with beforeArm. Off by default; runs no agent code. Requires main; executablePath-only launches cannot be instrumented. Launch transport only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the readOnlyHint:false / openWorldHint:false annotations: it discloses which transport is used per launch mode (Playwright vs loopback CDP), how runtime resolution and fallback work, the single-instance refusal default, side effects of the credential store mock flags on macOS/Linux, and what renderer_ready:false actually means. Error taxonomy with retryability flags gives the agent a recovery plan.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is nearly all load-bearing, but it is delivered as one dense ~250-word paragraph with no bullets, and several clauses duplicate schema descriptions word-for-word (credentialStore's mock-keychain behavior, the 5000ms readyTimeoutMs default). The error list is valuable but reads as a run-on rather than scannable structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter, zero-required launch tool with no output schema, the description supplies the return shape ({ ok, session_id, transport, renderer_ready, runtime_source, ... }), the waiting semantics, and a full error catalogue with retryability. Nothing an agent needs to call it correctly or recover from failure is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning: precedence between executablePath and runtime, the default runtime resolution logic, the demo-entry fallback when both are omitted, and the operational consequence of readyTimeoutMs via renderer_ready. Some sentences restate schema text verbatim (credentialStore flags, readyTimeoutMs default), which caps this below 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Launch an Electron app and start a driving session') and immediately distinguishes the two launch modes (main-based development vs executable-only packaged app). An agent can tell this apart from electron_attach or electron_discover_running without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit conditions for the main choices: when to pass main vs executablePath, when runtime:'project' applies and its requirements, when to use credentialStore:'system', and when to override with allowMultiple. Sibling routing (attach to an already-running app rather than launch) is only implied through the ALREADY_RUNNING error rather than stated as an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_press_sequencePress a sequence of keysA
Press each key in keys, in order (e.g. ['Control+A', 'Delete', 'Enter']). Focuses ref/selector first when given. For editors, click the visible content area first; reserve force:true for offscreen inputs that truly accept focus. Options: force, timeoutMs, waitForFocusMs, requireEditable (checked before the first key). Returns: { ok, session_id, keys, focused }. Errors: SELECTOR_NO_MATCH / REF_NOT_FOUND (carries similar_refs), ELEMENT_NOT_VISIBLE (retryable), NO_FOCUSED_EDITABLE, NOT_RUNNING, BAD_ARGUMENT (empty keys or ref+selector both).
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| keys | Yes | Ordered keys/chords to press. | |
| force | No | Bypass actionability checks (visibility/enabled/stable). Default false. | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| timeoutMs | No | Actionability budget in ms (default 5000, clamped to 30000). | |
| waitForFocusMs | No | No target: wait up to this many ms for an editable element to take focus. | |
| requireEditable | No | Fail with NO_FOCUSED_EDITABLE unless keys go to an editable element. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare not-read-only and closed-world, so the description carries the burden and does so well: it discloses focus behavior, that requireEditable is checked before the first key, the return object shape, and a full error taxonomy including which errors are retryable (ELEMENT_NOT_VISIBLE) and what BAD_ARGUMENT covers (empty keys or ref+selector both).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action plus example, then tucks usage cautions, options, returns, and errors into short trailing segments. The 'Options: force, timeoutMs, ...' enumeration largely restates schema property names and is the one slightly wasteful line.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return shape and the error contract, and it covers focus targeting, editor caveats, and validation for all 8 parameters. An agent needs nothing further to decide to call it and interpret failures.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description adds value beyond it by clarifying timing semantics ('requireEditable checked before the first key') and the intended role of force as a last resort. It does not add format details for selector/ref beyond the schema's 'ref OR selector' constraint.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb and resource ('Press each key in `keys`, in order') and gives a concrete example array, making the sequential semantics unmistakable. It does not name the close siblings electron_key or electron_keyboard_type, so the distinction from a single-key press or a text-typing tool must be inferred from the 'sequence' framing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives practical usage conditions: 'For editors, click the visible content area first' and 'reserve force:true for offscreen inputs that truly accept focus', which tells the agent when to escalate to force. It stops short of explicit when-not-to-use this tool versus electron_key/electron_keyboard_type.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_reloadReload a windowA
Reload the active window (or windowId, which also selects it) and wait, within readyTimeoutMs (default 5000), for the new page to render, like electron_launch; then optionally for waitForSelector to be visible. Use it instead of location.reload() in eval. ignoreCache does a hard reload. Refs from before the reload are gone. Returns: { ok, session_id, renderer_ready, url }. Errors: WAIT_TIMEOUT (waitForSelector not visible in time; retryable), REF_NOT_FOUND (no such window), TRANSPORT_UNSUPPORTED, NOT_RUNNING, BAD_ARGUMENT (invalid selector).
| Name | Required | Description | Default |
|---|---|---|---|
| windowId | No | Window to reload and select. Default: active. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| ignoreCache | No | Bypass the HTTP cache (hard reload). | |
| readyTimeoutMs | No | Budget in ms for the new page and waitForSelector. Default 5000. | |
| waitForSelector | No | Once the page is ready, wait for this selector to be visible. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only mark it non-read-only and closed-world; the description adds the real behavioral payload: prior refs are invalidated by the reload, the page-render wait happens before the selector wait, the default 5000ms budget is shared, and it enumerates the failure modes including which one is retryable (WAIT_TIMEOUT). This is exactly the state-destruction and retry information an agent cannot infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then the timing rule, then the anti-pattern, then the state warning, then the return and error contract — no filler and each clause carries a distinct fact. Dense but never redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Five optional parameters, no output schema, no enum guidance — yet the description supplies the return shape, the error taxonomy, the invalidation caveat, and the timeout default in prose. Nothing material is missing for an agent to call this correctly on the first attempt.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description still adds value beyond it by stating that windowId both targets and selects the window (a side effect the schema does not mention) and that readyTimeoutMs is a single shared budget rather than per-phase. It does not explain sessionId disambiguation further, keeping it at 4 rather than 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb and resource ('Reload the active window ... or windowId') with explicit scope including the readiness wait and optional selector wait. It distinguishes itself from the two nearest siblings by name, noting the wait semantics are 'like electron_launch' and that the pending selector is what electron_wait_for_selector would otherwise handle.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use it instead of location.reload() in eval' is an explicit routing rule against a competing approach, and the readyTimeoutMs budget covering both the render wait and waitForSelector tells the agent not to stack an extra wait tool. No explicit when-not-to-use case (e.g. full navigation vs. reload) is given, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_screenshotCapture a screenshotARead-only
Capture a screenshot to an image file and return its path (the image is written on the server host; the bytes are NOT returned inline). With ref/selector, captures just that element; otherwise the targeted window (windowId > windowTitle > windowIndex, default the active window) with optional fullPage or clip. Options: format (png|jpeg), quality (jpeg), path (absolute file) or dir (absolute directory, generated filename). With neither, writes to the server --screenshot-dir if configured, else the OS temp dir — pass dir or set --screenshot-dir for a stable, retrievable artifact location. Before capturing it waits settleMs (optional), then for the active window to paint a new frame (waitForFrame, default true). Returns: { ok, session_id, path, bytes, format, width?, height?, content_sha256, same_as_previous (same bytes as the last capture of this target), overwrote (path existed; a viewer may show a cached copy), frame_waited }. When portable delivery is available, artifact metadata and an MCP resource_link let the client read the generated bytes before expires_at; otherwise artifact_unavailable explains the limit. Errors: ABSOLUTE_PATH_REQUIRED (relative path), REF_NOT_FOUND (no such window), SELECTOR_NO_MATCH (element not found), SURFACE_UNSUPPORTED (iframe element crops are not window-relative), NOT_RUNNING, BAD_ARGUMENT (invalid selector/options), RENDERER_NAVIGATED (the page was navigating).
| Name | Required | Description | Default |
|---|---|---|---|
| dir | No | Absolute output DIRECTORY; the filename is generated. Use this (or the server --screenshot-dir default) for a stable, per-session artifact location instead of the OS temp dir. Mutually exclusive with path. | |
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| clip | No | Explicit capture rectangle in CSS pixels (window capture only). | |
| path | No | Absolute output file path. Takes precedence over dir / the server default. | |
| format | Yes | Image format. Default png. | png |
| quality | No | JPEG quality 0-100 (jpeg only). | |
| fullPage | No | Capture the full scrollable page (window capture only). | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| settleMs | No | Extra wait in ms before capturing, e.g. for animations. | |
| windowId | No | Target window transport id (highest precedence). | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| windowIndex | No | Target window by 0-based index. | |
| windowTitle | No | Target window by exact title. | |
| waitForFrame | Yes | Wait for the active window to paint a new frame before capturing. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states that the image is written on the server host, that path can be overwritten, and that an existing file may be overwritten; this conflicts with the readOnlyHint=true annotation, which implies no environment modification. The description itself is highly transparent, but it contradicts the structured safety annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and output-model constraint are front-loaded, and the density is justified by the tool's 14 parameters and rich return values. However, the single long paragraph is hard to scan and could be structured more cleanly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex screenshot tool with annotations, a full input schema, and an output schema, the description is complete. It covers targeting, output location, waiting behavior, return fields, and common errors, leaving little ambiguity for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds meaningful semantics beyond the schema: window target precedence, default active window, default output locations, path/dir interaction, element-vs-window constraints, and settle/frame waiting behavior. It enhances rather than merely repeats parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ("Capture a screenshot") and immediately clarifies the output model: an image file path, not inline bytes. It also distinguishes element captures from window captures and identifies the targeted window precedence, so an agent can tell exactly what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage conditions: ref/selector captures an element, otherwise a window is targeted, and path/dir/default behavior is explained. It does not explicitly state when not to use the tool or name alternatives, but the context is otherwise unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_scrollScroll the page or an element into viewA
Scroll: with ref/selector, centre that element into view; otherwise dispatch a wheel delta (dx/dy). Options: timeoutMs. Returns: { ok, session_id, target } (into-view) or { ok, session_id, dx, dy } (wheel). Errors: SELECTOR_NO_MATCH / REF_NOT_FOUND (no element matched the selector; carries similar_refs), NOT_RUNNING, BAD_ARGUMENT (ref+selector both).
| Name | Required | Description | Default |
|---|---|---|---|
| dx | No | Horizontal wheel delta in CSS px (used when no ref/selector). | |
| dy | No | Vertical wheel delta in CSS px (used when no ref/selector). | |
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| timeoutMs | No | Actionability budget in ms (default 5000, clamped to 30000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are minimal (readOnlyHint=false, openWorldHint=false), so the description carries the burden. It discloses return formats, error types (with similar_refs information), and the timeoutMs parameter for actionability. While it doesn't detail scroll animation or waiting behavior, it provides sufficient context for understanding side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is highly concise: two sentences covering functionality, options, returns, and errors. Information is front-loaded with the primary behavior first. No superfluous content; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 6 parameters, no output schema, and minimal annotations, the description fully covers the two modes, parameter relationships (mutual exclusivity), return objects for each case, and all possible errors. It is complete enough for an agent to understand and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by grouping parameters into modes (element vs wheel), clarifying the purpose of timeoutMs, and indicating when ref/selector are required together or conflicting. This extra context justifies a score above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states two distinct modes: scrolling an element into view using ref/selector, or dispatching a wheel delta with dx/dy. It also specifies the return format and errors, making the tool's purpose unambiguous. It distinguishes itself from siblings like electron_scroll_into_view by covering both cases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear guidance on when to use ref/selector vs dx/dy, and notes mutual exclusivity of ref and selector. However, it does not explicitly differentiate this tool from the sibling electron_scroll_into_view or provide when-not-to-use advice, which would be helpful given the similar sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_scroll_into_viewScroll an element into viewA
Centre the element identified by ref or selector into the viewport. Options: timeoutMs. Returns: { ok, session_id, target }. Errors: SELECTOR_NO_MATCH / REF_NOT_FOUND (carries similar_refs), NOT_RUNNING, BAD_ARGUMENT (ref+selector both/neither).
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| timeoutMs | No | Actionability budget in ms (default 5000, clamped to 30000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide minimal behavioral cues (readOnlyHint: false). Description discloses common errors (SELECTOR_NO_MATCH, REF_NOT_FOUND) and mentions return format, but does not detail scoping behavior (e.g., scrollable container) or conditions for element actionability.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise: two sentences plus a compact error list. Main action is front-loaded. Every element serves a purpose; no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description adequately covers return shape and error types. However, it omits details about centering alignment (e.g., top, bottom) and behavior on hidden elements. Still, it is reasonably complete for a scroll tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so descriptions already define parameters well. The tool description adds only a summary ('Options: timeoutMs') and implicitly reinforces the ref/selector mutual exclusivity, but adds no new semantic depth beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the verb (centre/scroll), resource (element), and action (into viewport). The description distinctively identifies the tool from siblings like electron_scroll and explicitly mentions that it targets elements by ref or selector.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. The description lists options and errors but does not specify scenarios, prerequisites, or compare to other scroll tools like electron_scroll.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_select_optionSelect option(s) in a dropdownA
Select option(s) by value in the identified by ref or selector. Options: force, timeoutMs. Returns: { ok, session_id, target, selected } (selected = the values actually chosen). Errors: REF_NOT_FOUND / SELECTOR_NO_MATCH (carries similar_refs), ELEMENT_NOT_VISIBLE (retryable), ELEMENT_DISABLED, NOT_RUNNING, BAD_ARGUMENT.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| force | No | Bypass actionability checks (visibility/enabled/stable). Default false. | |
| values | Yes | Option values to select. | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| timeoutMs | No | Actionability budget in ms (default 5000, clamped to 30000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false) indicate a state-modifying operation, which aligns with the description. The return format and error types are listed, providing transparency beyond annotations. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences: first states the core action, second lists options, returns, and errors. It is concise and front-loaded with essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description specifies return fields and error types. All parameters are documented in the schema, and the tool's purpose is fully covered for its complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds value by summarizing key options (force, timeoutMs) and listing return fields and errors, which supplements the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The title and first sentence clearly state the tool's action: selecting option(s) in a dropdown by value. It is distinct from sibling tools like electron_click or electron_check because it specifically targets <select> elements.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides constraints such as providing ref or selector (not both) and mentions error conditions like REF_NOT_FOUND and SELECTOR_NO_MATCH. However, it does not explicitly compare to alternative tools or indicate when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_set_filesSet files on a file inputA
Set the files of the identified by ref or selector. Paths must be ABSOLUTE and exist on the host running the server (max 20 files, 52428800 bytes each). Options: timeoutMs. Returns: { ok, session_id, target, files }. Errors: ABSOLUTE_PATH_REQUIRED (relative path; not retryable), FILE_NOT_FOUND (missing path), BAD_ARGUMENT (too many/large files, or ref+selector both), SELECTOR_NO_MATCH / REF_NOT_FOUND (carries similar_refs), NOT_RUNNING.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| paths | Yes | Absolute file paths to attach. | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| timeoutMs | No | Actionability budget in ms (default 5000, clamped to 30000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate mutation (readOnlyHint=false). Description discloses size limits, host requirements, and return structure. Missing explicit statement on whether setting files replaces or appends, but typical behavior is replacement. Good overall transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences followed by a compact error listing. No redundant information; every sentence adds value. Front-loaded with action and constraints.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 5 parameters (1 required), no output schema, and moderate complexity, the description covers purpose, constraints, options, return format, and errors. Minor gap on whether files are replaced or appended, but technically complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions. The description adds crucial constraints (absolute paths, max files, size) and explains return/errors, going beyond schema details. Baseline 3, elevated for meaningful additions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Set files') and the resource ('<input type=file>'), and specifies identification methods ('ref or selector'). It uniquely distinguishes from sibling tools like electron_drop_file which handles drag-and-drop.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit constraints (absolute paths, max files/size), options (timeoutMs), and detailed error conditions. While it doesn't name alternative tools, the error list helps agents decide when to use this tool. Could be improved by mentioning electron_drop_file for alternative file actions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_set_window_sizeSet a window’s sizeA
Resize the active window (or windowId) to width x height, of the whole window or, with area "content", of its web content, without eval. Waits for the size to settle and reports what the window really got: an app minimum/maximum size or the screen can clamp it. A maximized or fullscreen window is restored first. Returns: { ok, session_id, window_id, requested, actual, clamped, clamped_by?, window, content, min_size, max_size, restored_from?, method }; clamped_by is minimum_size, maximum_size or window_system; min_size/max_size are null when unset or unknown. CDP attach resizes from the page: it cannot read the limits, and content is the page viewport in CSS pixels (scaled by page zoom). Errors: REF_NOT_FOUND (no such window), TRANSPORT_UNSUPPORTED, NOT_RUNNING, BAD_ARGUMENT.
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | Size the whole window (default) or only its web content area. | |
| width | Yes | Width in device-independent pixels. | |
| height | Yes | Height in device-independent pixels. | |
| windowId | No | Window to resize (from electron_windows_list). Default: active. | |
| sessionId | No | Target session id. Omit when a single session is running. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond annotations: waits for settling, reports clamping by app min/max or screen, restores maximized/fullscreen windows first, documents CDP-attach limitations, and lists specific errors. These details are highly relevant for a mutating tool with readOnlyHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and scope, and every clause carries useful information. It is dense and semicolon-packed, especially the return/error section, but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description supplies the return shape and error cases directly. With annotations sparse and the operation complex, the definition provides enough detail for an agent to call it correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds meaningful semantics: width/height may be clamped, area "content" means page viewport in CSS pixels under CDP, and windowId defaults to active. It goes beyond the schema's terse parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: resize the active window or windowId to width x height, with window vs content-area scope. This is clearly distinguishable from sibling window-management tools such as electron_switch_window or electron_windows_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the key usage context: resizing the active window by default or a specific windowId, and choosing area "content" for the web content. It also notes that maximized/fullscreen windows are restored first, but it does not explicitly compare against alternative tools or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_snapshotSnapshot renderer accessibility treeARead-only
Capture the selected renderer surface accessibility tree: interactive elements (and landmarks) with role, name, state, bbox, and a stable ref. Pass since:"last" for only what changed since the previous snapshot (added/removed/changed + ref_map), interactiveOnly to drop landmarks, maxEntries to cap, root to return one subtree. format:"text" returns a compact one-line-per-entry rendering instead of JSON (5-10x fewer tokens): [ref] role "name" value=… flags, ~ marks recently-changed, [-] marks landmarks. Diffs default to a compact encoding (changed fields only; diffFormat:"full" restores complete prev/curr entries) and accept budgetTokens for server-side truncation that keeps interactive entries first. Each response carries renderer_reloaded so stale refs are detectable (P10). Refs are tagged on the DOM (data-sw-ref) so later interaction tools can act by ref. Closed shadow roots are opaque unless the app opts in: push each root onto window.__stagewright_closedShadowRoots at attachShadow time (or implement window.__stagewright_inspectShadow); their entries carry state.shadow_closed: true. Returns: { ok, surface_id, kind: "full" | "diff", snapshot?, diff?, snapshot_text?, diff_text?, diff_format?, renderer_reloaded, truncated }. Errors: NOT_RUNNING (no session — call electron_launch first; not retryable), BAD_ARGUMENT (multiple sessions live — pass sessionId; bad root), REF_NOT_FOUND / SELECTOR_NO_MATCH (root missing).
| Name | Required | Description | Default |
|---|---|---|---|
| root | No | Return only this element subtree (one of ref/selector; refs exist only on interactive elements, so use selector for dialogs/panels). Diffs scope too; refs stay global. | |
| since | No | Return only the delta since the previous snapshot for this session. | |
| format | No | Payload encoding. 'json' (default) returns the structured snapshot/diff objects. 'text' returns a compact one-line-per-entry rendering (5-10x fewer tokens): ref, role, quoted name, non-empty value/placeholder, and only NON-default state flags; ~ prefixes recently-changed entries, [-] marks non-targetable landmarks. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| diffFormat | No | Encoding for since:'last' diffs. 'compact' (default) carries only the changed fields per entry; 'full' carries complete prev/curr entries. Ignored when format:'text'. | |
| maxEntries | No | Cap the number of entries returned. Defaults to 2000. | |
| budgetTokens | No | Server-side token cap for a since:'last' diff payload: the char/4 estimate of the added/removed/changed arrays (ref_map and _meta are not counted). Lowest-value entries (non-interactive removed/changed first) are dropped until the estimate fits; _meta.truncated_entries reports how many were omitted. | |
| interactiveOnly | No | Return only interactive elements (drops landmarks) to save tokens. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the readOnly/openWorld annotations: how refs are tagged on the DOM (data-sw-ref), that renderer_reloaded detects stale refs, that closed shadow roots are opaque unless the app opts in, and precise error codes with retryability. Annotations are consistent with the read semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and return shape, then layers mode-specific detail. It is dense and long, but for an 8-parameter tool with a nested root object and no output schema, nearly every sentence carries operational value; only minor density costs it a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully specifies the return object ({ ok, surface_id, kind, snapshot?, diff?, ... truncated }) and enumerates error conditions. Edge cases (stale refs, closed shadow roots, truncation) are all covered, so an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, but the description still enriches semantics: it explains since, format:'text' rendering syntax, diffFormat default/override, and budgetTokens' server-side drop order. It meaningfully exceeds the schema rather than merely restating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Capture the selected renderer surface accessibility tree') and enumerates what it returns (role, name, state, bbox, ref). It's clearly distinguishable from siblings like electron_elements_list or electron_screenshot, which an agent can tell apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditional usage for its modes: since:"last" for deltas, interactiveOnly to drop landmarks, format:"text" to save tokens, budgetTokens for truncation. It also names electron_launch as the prerequisite for the NOT_RUNNING case. It stops short of explicitly contrasting against sibling listing tools, so a 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_statusElectron Stagewright statusARead-only
Return compact orientation for this server: version, start time, uptime, the last stable failure not tied to a live session, active-session count, and each live session's transport, renderer readiness, selected surface, last stable error code, and non-default dialog policy. It never returns arguments, paths, window arrays, logs, stack traces, dialog entries, prompt text, or plugin payloads. Use electron_windows_list, electron_surfaces_list, or the relevant plugin tool for detailed state. Returns: { ok, server: { version, started_at, uptime_ms, last_error? }, active_sessions, sessions }. Errors: none.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint and openWorldHint, and the description goes well beyond them by listing specific never-returned data (arguments, paths, logs, stack traces, prompt text, plugin payloads), which tells the agent what privacy/safety envelope it operates within. It also discloses error behavior ('Errors: none').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what it returns, then the negative spec, then alternatives, then the return shape – a logical order. The long enumerations are dense but each clause carries distinct, useful information; nothing is obviously padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden and provides the return shape explicitly ({ ok, server, active_sessions, sessions }) plus a nested field list. An agent can call and interpret it without further info.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is nothing to document and the baseline is 4. The description does not need to explain inputs, and it spends its words on the return shape instead.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Return compact orientation') and resource ('this server'), then enumerates exactly what it returns: version, uptime, session count, per-session transport/readiness/surface/error code. It explicitly distinguishes itself from electron_windows_list, electron_surfaces_list, and plugin tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternatives explicitly ('Use electron_windows_list, electron_surfaces_list, or the relevant plugin tool for detailed state'), so an agent knows this tool is for a compact overview and those siblings are for detail. Clear when-to-use routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_stopStop Electron appADestructive
Gracefully stop a session and release it. If the app ignores the close within timeoutMs (default 10s) the stop auto-escalates to SIGKILL, so the process is always reaped and never left orphaned; the response reports escalated: true when that happened. Pass sessionId to target a specific session. Returns: { ok, session_id, stopped: true, escalated }. Errors: NOT_RUNNING (no such session; not retryable), BAD_ARGUMENT (multiple sessions live — pass sessionId).
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | No | Target session id. Omit when a single session is running. | |
| timeoutMs | No | Graceful-close budget in ms before escalating to SIGKILL. Defaults to 10000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructive behavior, but the description adds vital details: auto-escalation to SIGKILL, timeout, response fields, and specific errors, providing thorough behavioral insight.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loaded with the primary action, and efficiently covers details, return values, and errors in a structured manner.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all necessary context: usage, parameters, return values, escalation behavior, and errors, making it complete for a stop tool with no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline 3. The description adds meaning for 'sessionId' (omit if single session) and 'timeoutMs' (graceful closing budget), raising the score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'stop' and resource 'session', and distinguishes it from siblings like 'electron_force_kill' by emphasizing graceful stop with auto-escalation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context for when to use (stop a session) and error conditions (NOT_RUNNING, BAD_ARGUMENT). It could explicitly mention when to use 'electron_force_kill' instead, but the graceful vs force distinction is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_surfaces_listList Electron renderer surfacesARead-only
List the session renderer surfaces in parent-first order: BrowserWindow roots, WebContentsViews, webview guests, and iframe children. Each opaque id is stable only while its surface stays live; select it with electron_switch_surface before snapshot/find/renderer interactions. Returns: { ok, session_id, surfaces, active_surface_id, count }. Existing window tools remain compatible for window-only flows. Errors: TRANSPORT_UNSUPPORTED (surface targeting is unavailable on this transport; not retryable), NOT_RUNNING, BAD_ARGUMENT (multiple sessions).
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | No | Target session id. Omit when a single session is running. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and openWorldHint=false. Description adds that opaque ids are stable only while surface is live, need to select with switch_surface, and details return structure. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five sentences front-loaded with purpose, then usage, return, and errors. Every sentence adds value; no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given one optional parameter and no output schema, description provides return structure, error conditions, and usage guidance. Sufficient for agent to understand invocation and results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers sessionId with description; description adds 'Omit when a single session is running' and mentions errors for multiple sessions, adding context beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb 'List', resource 'session renderer surfaces', and specifies order and types (BrowserWindow roots, WebContentsViews, etc.). Differentiates from sibling tools by mentioning relationship to electron_switch_surface and existing window tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (before snapshot/find/renderer interactions) and when not to use (window-only flows). Lists error conditions with guidance on retryability and provides context for optional sessionId.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_switch_surfaceSwitch active renderer surfaceA
Select a live renderer surface by the opaque id returned by electron_surfaces_list. Following snapshot, find, renderer reads/eval, waits, expectations, and interactions target that surface; a ref from a different surface is rejected rather than reused. Returns: { ok, session_id, active, active_surface_id }. Errors: SURFACE_NOT_FOUND (the id was never observed in this session), SURFACE_CLOSED (it detached or closed), SURFACE_UNSUPPORTED (the live surface cannot be driven), TRANSPORT_UNSUPPORTED, NOT_RUNNING, BAD_ARGUMENT.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | No | Target session id. Omit when a single session is running. | |
| surfaceId | Yes | Opaque id returned by electron_surfaces_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that the surface must be from electron_surfaces_list, that old refs from other surfaces are rejected, and lists possible errors. Since annotations only indicate not read-only, the description provides necessary behavioral details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise: three sentences covering purpose, effect, return, and errors. No redundant information, all sentences earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given two parameters, no output schema, and minimal annotations, the description explains the effect on subsequent operations and error conditions well. Some context about state management could be added, but sufficient for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions, providing baseline 3. Description adds value by clarifying surfaceId's source and sessionId's optionality, enhancing understanding beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it selects a live renderer surface using an opaque ID from electron_surfaces_list. Explains that subsequent operations target that surface, distinguishing it from sibling tools like electron_surfaces_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies when to use by stating that operations like snapshot and interactions target the switched surface. Explicitly notes that references from different surfaces are rejected. Could be more precise about when not to use, but adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_switch_windowSwitch active Electron windowA
Select the active window by precedence targetId > windowTitle > index > default. The selection changes Stagewright's renderer target; it does not promise native OS foreground focus. Returns: { ok, session_id, active, active_window_id } on success. Errors: REF_NOT_FOUND (no window matched; not retryable), TRANSPORT_UNSUPPORTED (transport has no renderer window target; not retryable), NOT_RUNNING, BAD_ARGUMENT (multiple sessions).
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | 0-based window index (third precedence). | |
| targetId | No | Transport window id (highest precedence). | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| windowTitle | No | Exact window title (second precedence). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false, and the description adds that it changes the renderer target without promising OS focus. It also lists error types. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences and an error list, front-loaded with the main purpose. No superfluous text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given moderate complexity, the description covers return format, errors, and behavioral nuance. It is nearly complete for agent invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all 4 parameters with descriptions. The tool description adds the precedence order and notes that sessionId can be omitted for single sessions, adding value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it selects the active window with a defined precedence order. It distinguishes the tool's action from siblings like electron_switch_surface but does not explicitly differentiate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool does and does not do (no OS focus guarantee) and lists errors. However, it does not specify when to use this tool vs sibling tools like electron_switch_surface.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_typeType text into an inputA
Set the value of the input/textarea identified by ref or selector (fires an input event). For a code editor (Monaco / EditContext, CodeMirror) use electron_type_into_editor — setting .value on an editor host does not update its model. Options: force, timeoutMs. Returns: { ok, session_id, target }. Errors: REF_NOT_FOUND / SELECTOR_NO_MATCH (carries similar_refs), ELEMENT_NOT_VISIBLE (retryable), ELEMENT_DISABLED, TYPE_NO_EFFECT (value did not change — wrong target), NOT_RUNNING, BAD_ARGUMENT.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| text | Yes | The text to set as the element value. | |
| force | No | Bypass actionability checks (visibility/enabled/stable). Default false. | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| timeoutMs | No | Actionability budget in ms (default 5000, clamped to 30000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint=false), the description adds critical behavioral details: it mentions that the tool 'fires an input event', lists possible error types with their meanings (e.g., TYPE_NO_EFFECT indicates wrong target), and notes that the force option bypasses actionability checks. This significantly helps an agent understand side effects and handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: one paragraph that front-loads the main action, then provides alternative usage, options summary, return shape, and error list. Every sentence is informative with no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (6 parameters, 1 required, no output schema), the description covers the core behavior, element identification (ref/selector), options (force, timeout), return value, and error cases. It is nearly complete, but it does not explicitly state that the text replaces existing content (implied by 'Set the value') or mention the maximum text length from the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with each parameter already described. The description adds minimal extra meaning: it groups 'force' and 'timeoutMs' as options and clarifies the ref/selector mutual exclusivity, but does not provide deeper semantics beyond what the schema already offers. Baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Set the value of the input/textarea identified by ref or selector (fires an input event)', specifying the verb ('Set the value') and resource ('input/textarea'). It also explicitly distinguishes from the sibling tool `electron_type_into_editor` for code editors, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit instructions: use for standard input/textarea, and for code editors use `electron_type_into_editor` instead. It explains why (setting .value on editor host does not update its model). However, it does not address other potentially confusing siblings like `electron_keyboard_type` or `electron_press_sequence`, so some guidance is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_type_into_editorType into a code editorA
Type into a code editor (Monaco / EditContext, CodeMirror, contenteditable) the reliable way: click the editor's content area identified by ref or selector (e.g. '.monaco-editor .view-lines'), then type the text into the now-focused editor as real keystrokes. Use this instead of typing into an editor's hidden textarea, which modern EditContext editors ignore (returns TYPE_NO_EFFECT). Pass replace:true to REPLACE the editor contents: after the focusing click it selects all (Meta/Control+A, platform-aware) and types over the selection — no second click that would collapse the selection; with empty text it clears the editor (select-all + Delete). Editor auto-pairing caveat: real keystrokes trigger auto-closing of quotes/brackets, so typed source can gain debris like a trailing }') — type pairing-safe fragments, or use replace:true and include the full intended contents. Returns: { ok, session_id, target, typed, replaced }. Errors: REF_NOT_FOUND / SELECTOR_NO_MATCH (carries similar_refs), ELEMENT_NOT_VISIBLE (retryable), TYPE_NO_EFFECT, NOT_RUNNING, BAD_ARGUMENT.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| text | Yes | The text to type into the focused editor. | |
| replace | No | Select all before typing, replacing the editor contents instead of appending. | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| timeoutMs | No | Actionability budget in ms (default 5000, clamped to 30000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses behavioral traits beyond annotations: it clicks the content area, types real keystrokes, and for replace mode uses Meta/Control+A for select-all with platform awareness. Covers the auto-pairing caveat where real keystrokes trigger auto-closing of quotes/brackets, causing debris. Describes return structure and error types with details like similar_refs. Annotations only indicate readOnlyHint=false, so description adds significant value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with main purpose and mechanism. Each sentence earns its place: purpose, replace behavior, auto-pairing caveat, return/errors. No redundant text. Well-structured with clear sections for different aspects.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 6 parameters and no output schema, the description covers usage, behavior, caveats, return structure (ok, session_id, target, typed, replaced), and error codes with retryable flags. Addresses edge cases like empty text clearing the editor. Sufficient for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for all 6 parameters. The description adds meaning beyond schema: explains how ref resolves to data-sw-ref attribute, how replace triggers select-all and typing, and how text interacts with auto-pairing. However, timeoutMs and sessionId are standard and not further elaborated. Overall enhances understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states it types into a code editor (Monaco/EditContext, CodeMirror, contenteditable) the reliable way, distinguishing it from typing into a hidden textarea that fails for modern editors. The verb 'type into' and resource 'code editor' are specific, and it differentiates from siblings like 'electron_type' which likely targets regular inputs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use this instead of typing into an editor's hidden textarea due to the TYPE_NO_EFFECT error. Provides guidance on when to use replace:true (replace contents, clear editor). Implicitly suggests not using this for non-editor inputs, but doesn't name alternatives beyond the hidden textarea distinction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_uncheckUncheck a checkboxA
Uncheck the checkbox identified by ref or selector (no-op if already unchecked). Options: force, timeoutMs. Returns: { ok, session_id, target, checked: false }. Errors: REF_NOT_FOUND / SELECTOR_NO_MATCH (carries similar_refs), ELEMENT_NOT_VISIBLE (retryable), ELEMENT_DISABLED, NOT_RUNNING, BAD_ARGUMENT.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| force | No | Bypass actionability checks (visibility/enabled/stable). Default false. | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| timeoutMs | No | Actionability budget in ms (default 5000, clamped to 30000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses no-op behavior, options (force, timeoutMs), return shape, and error types with retryability hints. Annotations are minimal, so description fully carries behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence covering purpose, options, returns, and errors. Concise but could benefit from structured sections for clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Includes return value shape and key errors given no output schema. Covers most behavioral aspects, though 'actionability checks' could be elaborated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline 3. Description lists options but doesn't add new semantics beyond what schema already provides for each parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states verb 'uncheck' and resource 'checkbox', with identification via ref or selector. Distinguishes from sibling tool 'electron_check' which does the opposite.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not-to-use guidance. The 'no-op if already unchecked' implies idempotency, but no differentiation from alternatives like 'electron_click'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_waitWait a fixed durationARead-only
Pause for ms milliseconds (clamped to 60000). Prefer electron_wait_for_state or electron_wait_for_selector — a fixed wait is slower and more brittle than waiting on a condition. Returns: { ok, session_id, waited_ms }. Errors: NOT_RUNNING (no session), BAD_ARGUMENT (multiple sessions).
| Name | Required | Description | Default |
|---|---|---|---|
| ms | Yes | Milliseconds to wait (clamped to the max). | |
| sessionId | No | Target session id. Omit when a single session is running. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses return format, error types (NOT_RUNNING, BAD_ARGUMENT), and clamping behavior. Annotations already indicate readOnlyHint=true, and description adds context on error conditions and return value, with no contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no redundant text. Front-loads purpose, then usage guidance, then return/errors. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple fixed-wait tool, the description covers purpose, alternatives, parameters, return value, and error cases. No output schema needed; return format is described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers both parameters (ms, sessionId). Description adds 'clamped to 60000' for ms and guidance for sessionId: 'Omit when a single session is running.' Also explains BAD_ARGUMENT error related to sessionId.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Pause for ms milliseconds' and distinguishes from siblings by recommending electron_wait_for_state and electron_wait_for_selector. It specifies verb (pause), resource (milliseconds), and scope (clamped).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises against using this tool for condition-based waiting: 'Prefer electron_wait_for_state or electron_wait_for_selector — a fixed wait is slower and more brittle.' Also notes error conditions for multiple sessions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_wait_for_eventWait for a DOM eventARead-only
Wait until a named DOM event (e.g. "transitionend", "load", a custom event) fires on the element identified by ref or selector — or on document when neither is given. Returns: { ok, session_id, fired, event }. Errors: WAIT_TIMEOUT (event did not fire within timeoutMs; retryable), SELECTOR_NO_MATCH (target element not present), REF_NOT_FOUND (stale ref; carries similar_refs), TRANSPORT_UNSUPPORTED, NOT_RUNNING, BAD_ARGUMENT (invalid selector, or ref+selector both).
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| eventName | Yes | DOM event name to wait for, e.g. "transitionend". | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| timeoutMs | No | Max wait in ms (default 5000, clamped to 60000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint: true, and the description adds behavioral details: target element resolution (ref/selector/document), return structure ({ ok, session_id, fired, event }), and specific error types. It does not mention event listener cleanup, but the added context is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single paragraph with a clear structure: first sentence states the purpose, then details returns and errors. It is concise, front-loaded, and every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without an output schema, the description specifies the return shape and enumerates all possible errors. It covers targeting options and parameter constraints comprehensively for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description adds critical context: mutual exclusivity of ref and selector, default target of document when neither is given, and omission of sessionId for single sessions. This goes beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'wait' and the resource 'named DOM event' on an element or document. It includes examples like 'transitionend' and custom events, and distinguishes from sibling tools by focusing on event-driven waiting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use the tool (waiting for a specific DOM event) and lists error conditions like WAIT_TIMEOUT and SELECTOR_NO_MATCH. However, it does not explicitly contrast with siblings like electron_wait or electron_wait_for_selector, which would enhance guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_wait_for_selectorWait for a selector stateARead-only
Wait until the element identified by ref or selector reaches state: attached (in the DOM), visible (laid out + not visibility:hidden), hidden (absent or not visible), or detached (removed). Default state: visible. For an intentionally offscreen / aria-hidden element (e.g. a code editor's hidden textarea like Monaco), wait for state:'attached' — state:'visible' will time out because the element is never laid out. Returns: { ok, session_id, matched, state }. Errors: WAIT_TIMEOUT (condition not met within timeoutMs; retryable — for offscreen editor inputs use state:'attached'), REF_NOT_FOUND (stale ref; carries similar_refs), RENDERER_NAVIGATED, TRANSPORT_UNSUPPORTED, NOT_RUNNING, BAD_ARGUMENT (invalid selector, or ref+selector both/neither).
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| state | Yes | Target state to wait for. Default visible. | visible |
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| timeoutMs | No | Max wait in ms (default 5000, clamped to 60000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint annotation by disclosing the return shape ({ ok, session_id, matched, state }) and enumerating five error conditions with their meaning and retryability (WAIT_TIMEOUT retryable, REF_NOT_FOUND carries similar_refs, BAD_ARGUMENT for ref+selector conflicts). No annotation is contradicted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core wait semantics, then the offscreen caveat, then return and error details — a logical order with no filler. The final error sentence is dense and slightly run-on, but each clause carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates fully by stating the return object's keys and the complete error taxonomy, plus the timeout/retry behavior an agent needs to recover. Nothing required to invoke or handle failures is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description still adds value by explaining which state value to choose for offscreen elements and by restating the ref-XOR-selector rule and default state in prose. The timeout clamp and sessionId behavior are left to the schema, keeping it above baseline rather than at ceiling.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('wait until') and resource (element by ref or selector) and enumerates the four target states with definitions, so the agent knows exactly what is being awaited. It does not, however, differentiate itself from close siblings such as electron_wait_for_state or electron_expect_visible, which an agent could easily confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit, actionable when-to-use rule: for intentionally offscreen / aria-hidden elements (e.g. Monaco's hidden textarea) use state:'attached' because 'visible' will time out. That is real guidance beyond the schema. It stops short of naming alternative tools or stating when not to use this one at all.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_wait_for_stateWait for an element stateARead-only
Wait until the element identified by ref or selector matches the given state flags (any of visible, enabled, disabled, checked, selected, expanded, pressed, focused, readonly, required, invalid, busy), evaluated atomically. Returns: { ok, session_id, matched, state }. Errors: WAIT_TIMEOUT (state not reached within timeoutMs — details.last_state shows the last observed state; retryable), REF_NOT_FOUND (stale ref; carries similar_refs), TRANSPORT_UNSUPPORTED, NOT_RUNNING, BAD_ARGUMENT (invalid selector, no state flags, or ref+selector both/neither).
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a snapshot (resolves to [data-sw-ref="N"]). Provide ref OR selector. | |
| state | Yes | ||
| selector | No | CSS selector. Provide ref OR selector, not both. | |
| sessionId | No | Target session id. Omit when a single session is running. | |
| timeoutMs | No | Max wait in ms (default 5000, clamped to 60000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=true, consistent with a non-modifying wait. The description adds details about atomic evaluation, full return value structure, and specific errors with contextual info (e.g., last_state for timeout). No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two well-structured sentences. The first sentence covers the primary action, and the second lists errors efficiently. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of an output schema, the description adequately explains the return format and error conditions. It covers edge cases like timeout, stale ref, and invalid arguments. Some minor gaps (e.g., how state flags interact in the return) but overall thorough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (80%), and the description does not add significant meaning beyond the schema. It clarifies that state flags are evaluated as a set, but this is implied by the schema structure. Parameters are already well-documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (Wait), resource (element by ref/selector), and condition (matches state flags). It distinguishes from sibling tools like electron_wait and electron_wait_for_selector by specifying state-based waiting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool does but does not provide explicit guidance on when to use it vs. alternatives like electron_expect_state or electron_wait_for_selector. No 'when-to-use' or 'when-not-to-use' is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
electron_windows_listList Electron windowsARead-only
List the app windows with their id, index, title, url, and visibility. Pass sessionId to target a specific session. Returns: { ok, session_id, windows, active_window_id, count }. Errors: NOT_RUNNING (no such session; not retryable), BAD_ARGUMENT (multiple sessions — pass sessionId).
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | No | Target session id. Omit when a single session is running. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real value beyond that: the exact return shape and two named error conditions, including the non-retryable nature of NOT_RUNNING.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly front-loaded sentences with zero filler; purpose, session targeting, return shape, and errors are all delivered without repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description supplies the return shape and error taxonomy, and the single optional parameter is fully documented. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the sessionId description already says 'Omit when a single session is running.' The description restates that session targeting intent but adds no syntax or format detail beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (app windows) and enumerates the returned fields (id, index, title, url, visibility), which cleanly separates it from nearby siblings like electron_surfaces_list and electron_switch_window.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives conditional usage for the sessionId parameter ('target a specific session') and clarifies error-driven cases (multiple sessions — pass sessionId). It does not, however, contrast this tool against alternative listing tools such as electron_surfaces_list, so the sibling-routing guidance is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.8.1- Changed
electron_launch5 fields changed- changed
Input schema / properties / credentialStore / descriptionPrevious value: -"Packaged executable only. Default \"testing\" avoids blocking credential prompts with --use-mock-keychain on macOS or --password-store=basic on Linux. Use \"system\" to verify genuine safeStorage behavior."New value: +"Default \"testing\" avoids blocking credential prompts with --use-mock-keychain on macOS or --password-store=basic on Linux. Use \"system\" to verify genuine safeStorage behavior." - changed
Input schema / properties / runtime / descriptionPrevious value: -"Use Electron resolved from the operator-configured --app-root. Resolving that runtime requires main; an explicit executablePath takes precedence. Default: the launch transport runtime."New value: +"\"project\" uses Electron resolved from the operator-configured --app-root and requires main; \"server\" uses the server's own Electron. An explicit executablePath takes precedence. Default: \"project\" when --app-root is set and the project has Electron, otherwise \"server\"." - changed
Input schema / properties / runtime / enumPrevious value: -[ - "project" -]New value: +[ + "project", + "server" +] - changed
Input schema / properties / timeoutMs / descriptionPrevious value: -"Max wait for the first window."New value: +"Max wait (ms) for the app to start and show its first window. Capped at 50000 so it plus readyTimeoutMs stays under the dispatch timeout backstop." - changed
Input schema / properties / timeoutMs / maximumPrevious value: -9007199254740991New value: +50000
6 tool updates
v0.7.0- Changed
electron_key2 fields changed- added
Input schema / properties / requireEditableAdded value: +{ + "description": "Fail with NO_FOCUSED_EDITABLE unless keys go to an editable element.", + "type": "boolean" +} - added
Input schema / properties / waitForFocusMsAdded value: +{ + "description": "No target: wait up to this many ms for an editable element to take focus.", + "maximum": 10000, + "minimum": 0, + "type": "integer" +}
- Changed
electron_keyboard_type2 fields changed- added
Input schema / properties / requireEditableAdded value: +{ + "description": "Fail with NO_FOCUSED_EDITABLE unless keys go to an editable element.", + "type": "boolean" +} - added
Input schema / properties / waitForFocusMsAdded value: +{ + "description": "No target: wait up to this many ms for an editable element to take focus.", + "maximum": 10000, + "minimum": 0, + "type": "integer" +}
- Changed
electron_press_sequence2 fields changed- added
Input schema / properties / requireEditableAdded value: +{ + "description": "Fail with NO_FOCUSED_EDITABLE unless keys go to an editable element.", + "type": "boolean" +} - added
Input schema / properties / waitForFocusMsAdded value: +{ + "description": "No target: wait up to this many ms for an editable element to take focus.", + "maximum": 10000, + "minimum": 0, + "type": "integer" +}
- Added
electron_reload - Changed
electron_screenshot4 fields changed- added
Input schema / properties / settleMsAdded value: +{ + "description": "Extra wait in ms before capturing, e.g. for animations.", + "maximum": 5000, + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / waitForFrameAdded value: +{ + "default": true, + "description": "Wait for the active window to paint a new frame before capturing.", + "type": "boolean" +} - changed
Input schema / requiredPrevious value: -[ - "format" -]New value: +[ + "format", + "waitForFrame" +] - changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": {}, - "properties": { - "_meta": { - "additionalProperties": {}, - "properties": { - "elapsed_ms": { - "minimum": 0, - "type": "number" - }, - "estimated_tokens": { - "minimum": 0, - "type": "number" - }, - "session_id": { - "type": "string" - } - }, - "required": [ - "estimated_tokens", - "elapsed_ms" - ], - "type": "object" - }, - "artifact": { - "additionalProperties": false, - "properties": { - "expires_at": { - "type": "string" - }, - "mimeType": { - "enum": [ - "image/png", - "image/jpeg", - "application/x-ndjson", - "application/json", - "text/html" - ], - "type": "string" - }, - "name": { - "type": "string" - }, - "size": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "uri": { - "type": "string" - } - }, - "required": [ - "uri", - "name", - "mimeType", - "size", - "expires_at" - ], - "type": "object" - }, - "artifact_unavailable": { - "enum": [ - "too_large", - "capacity", - "closed", - "unsupported_type" - ], - "type": "string" - }, - "bytes": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "format": { - "enum": [ - "png", - "jpeg" - ], - "type": "string" - }, - "height": { - "type": "number" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "path": { - "type": "string" - }, - "session_id": { - "type": "string" - }, - "width": { - "type": "number" - } - }, - "required": [ - "session_id", - "path", - "bytes", - "format", - "ok", - "_meta" - ], - "type": "object" - }, - { - "additionalProperties": {}, - "properties": { - "_meta": { - "additionalProperties": {}, - "properties": { - "elapsed_ms": { - "minimum": 0, - "type": "number" - }, - "estimated_tokens": { - "minimum": 0, - "type": "number" - }, - "session_id": { - "type": "string" - } - }, - "required": [ - "estimated_tokens", - "elapsed_ms" - ], - "type": "object" - }, - "code": { - "type": "string" - }, - "error": { - "type": "string" - }, - "hint": { - "type": "string" - }, - "http": { - "type": "number" - }, - "ok": { - "const": false, - "type": "boolean" - }, - "retryable": { - "type": "boolean" - } - }, - "required": [ - "ok", - "error", - "code", - "hint", - "retryable", - "http", - "_meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": { + "_meta": { + "additionalProperties": {}, + "properties": { + "elapsed_ms": { + "minimum": 0, + "type": "number" + }, + "estimated_tokens": { + "minimum": 0, + "type": "number" + }, + "session_id": { + "type": "string" + } + }, + "required": [ + "estimated_tokens", + "elapsed_ms" + ], + "type": "object" + }, + "artifact": { + "additionalProperties": false, + "properties": { + "expires_at": { + "type": "string" + }, + "mimeType": { + "enum": [ + "image/png", + "image/jpeg", + "application/x-ndjson", + "application/json", + "text/html" + ], + "type": "string" + }, + "name": { + "type": "string" + }, + "size": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "uri": { + "type": "string" + } + }, + "required": [ + "uri", + "name", + "mimeType", + "size", + "expires_at" + ], + "type": "object" + }, + "artifact_unavailable": { + "enum": [ + "too_large", + "capacity", + "closed", + "unsupported_type" + ], + "type": "string" + }, + "bytes": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "content_sha256": { + "type": "string" + }, + "format": { + "enum": [ + "png", + "jpeg" + ], + "type": "string" + }, + "frame_waited": { + "type": "boolean" + }, + "height": { + "type": "number" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "overwrote": { + "type": "boolean" + }, + "path": { + "type": "string" + }, + "same_as_previous": { + "type": "boolean" + }, + "session_id": { + "type": "string" + }, + "width": { + "type": "number" + } + }, + "required": [ + "session_id", + "path", + "bytes", + "format", + "content_sha256", + "same_as_previous", + "overwrote", + "frame_waited", + "ok", + "_meta" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "_meta": { + "additionalProperties": {}, + "properties": { + "elapsed_ms": { + "minimum": 0, + "type": "number" + }, + "estimated_tokens": { + "minimum": 0, + "type": "number" + }, + "session_id": { + "type": "string" + } + }, + "required": [ + "estimated_tokens", + "elapsed_ms" + ], + "type": "object" + }, + "code": { + "type": "string" + }, + "error": { + "type": "string" + }, + "hint": { + "type": "string" + }, + "http": { + "type": "number" + }, + "ok": { + "const": false, + "type": "boolean" + }, + "retryable": { + "type": "boolean" + } + }, + "required": [ + "ok", + "error", + "code", + "hint", + "retryable", + "http", + "_meta" + ], + "type": "object" + } +]
- Added
electron_set_window_size
28 tool updates
v0.6.0- Added
electron_detach - Added
electron_drag - Added
electron_elements_list - Added
electron_expect_count - Added
electron_expect_state - Added
electron_expect_url - Added
electron_expect_visible - Added
electron_find - Added
electron_focused_element - Added
electron_get_bbox - Added
electron_get_computed_style - Added
electron_get_text - Added
electron_get_value - Added
electron_info - Added
electron_inject - Changed
electron_launch1 field changed- added
Input schema / properties / credentialStoreAdded value: +{ + "description": "Packaged executable only. Default \"testing\" avoids blocking credential prompts with --use-mock-keychain on macOS or --password-store=basic on Linux. Use \"system\" to verify genuine safeStorage behavior.", + "enum": [ + "testing", + "system" + ], + "type": "string" +}
- Changed
electron_screenshot1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "anyOf": [ + { + "additionalProperties": {}, + "properties": { + "_meta": { + "additionalProperties": {}, + "properties": { + "elapsed_ms": { + "minimum": 0, + "type": "number" + }, + "estimated_tokens": { + "minimum": 0, + "type": "number" + }, + "session_id": { + "type": "string" + } + }, + "required": [ + "estimated_tokens", + "elapsed_ms" + ], + "type": "object" + }, + "artifact": { + "additionalProperties": false, + "properties": { + "expires_at": { + "type": "string" + }, + "mimeType": { + "enum": [ + "image/png", + "image/jpeg", + "application/x-ndjson", + "application/json", + "text/html" + ], + "type": "string" + }, + "name": { + "type": "string" + }, + "size": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "uri": { + "type": "string" + } + }, + "required": [ + "uri", + "name", + "mimeType", + "size", + "expires_at" + ], + "type": "object" + }, + "artifact_unavailable": { + "enum": [ + "too_large", + "capacity", + "closed", + "unsupported_type" + ], + "type": "string" + }, + "bytes": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "format": { + "enum": [ + "png", + "jpeg" + ], + "type": "string" + }, + "height": { + "type": "number" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "path": { + "type": "string" + }, + "session_id": { + "type": "string" + }, + "width": { + "type": "number" + } + }, + "required": [ + "session_id", + "path", + "bytes", + "format", + "ok", + "_meta" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "_meta": { + "additionalProperties": {}, + "properties": { + "elapsed_ms": { + "minimum": 0, + "type": "number" + }, + "estimated_tokens": { + "minimum": 0, + "type": "number" + }, + "session_id": { + "type": "string" + } + }, + "required": [ + "estimated_tokens", + "elapsed_ms" + ], + "type": "object" + }, + "code": { + "type": "string" + }, + "error": { + "type": "string" + }, + "hint": { + "type": "string" + }, + "http": { + "type": "number" + }, + "ok": { + "const": false, + "type": "boolean" + }, + "retryable": { + "type": "boolean" + } + }, + "required": [ + "ok", + "error", + "code", + "hint", + "retryable", + "http", + "_meta" + ], + "type": "object" + } + ], + "type": "object" +}
- Added
electron_scroll - Added
electron_scroll_into_view - Added
electron_select_option - Added
electron_set_files - Changed
electron_snapshot2 fields changed- changed
Input schema / properties / budgetTokens / descriptionPrevious value: -"Server-side token cap for a since:'last' diff payload. Lowest-value entries (non-interactive removed/changed first) are dropped until the estimate fits; _meta.truncated_entries reports how many were omitted."New value: +"Server-side token cap for a since:'last' diff payload: the char/4 estimate of the added/removed/changed arrays (ref_map and _meta are not counted). Lowest-value entries (non-interactive removed/changed first) are dropped until the estimate fits; _meta.truncated_entries reports how many were omitted." - added
Input schema / properties / rootAdded value: +{ + "additionalProperties": false, + "description": "Return only this element subtree (one of ref/selector; refs exist only on interactive elements, so use selector for dialogs/panels). Diffs scope too; refs stay global.", + "properties": { + "ref": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "selector": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" +}
- Added
electron_type - Added
electron_type_into_editor - Added
electron_wait_for_event - Added
electron_wait_for_selector - Added
electron_wait_for_state - Added
electron_windows_list
30 tool updates
v0.4.1- Removed
electron_detach - Added
electron_doctor - Removed
electron_drag - Removed
electron_elements_list - Removed
electron_expect_count - Removed
electron_expect_state - Removed
electron_expect_url - Removed
electron_expect_visible - Removed
electron_find - Removed
electron_focused_element - Removed
electron_get_bbox - Removed
electron_get_computed_style - Removed
electron_get_text - Removed
electron_get_value - Removed
electron_info - Removed
electron_inject - Changed
electron_launch2 fields changed- changed
Input schema / properties / main / descriptionPrevious value: -"Absolute path to the app main-process JS entry. Required unless executablePath is given."New value: +"Absolute path to the app main-process JS entry. Required unless executablePath is given or the server configured a default demo entry." - added
Input schema / properties / runtimeAdded value: +{ + "description": "Use Electron resolved from the operator-configured --app-root. Resolving that runtime requires main; an explicit executablePath takes precedence. Default: the launch transport runtime.", + "enum": [ + "project" + ], + "type": "string" +}
- Removed
electron_scroll - Removed
electron_scroll_into_view - Removed
electron_select_option - Removed
electron_set_files - Added
electron_status - Added
electron_surfaces_list - Added
electron_switch_surface - Removed
electron_type - Removed
electron_type_into_editor - Removed
electron_wait_for_event - Removed
electron_wait_for_selector - Removed
electron_wait_for_state - Removed
electron_windows_list
3 tool updates
v0.2.0- Changed
electron_find1 field changed- added
Input schema / properties / limitAdded value: +{ + "description": "Cap the matches returned (in document order); count still reports the true total so a truncation is detectable. Unset returns every match.", + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" +}
- Changed
electron_launch2 fields changed- changed
Input schema / properties / readyTimeoutMs / descriptionPrevious value: -"Max wait (ms) for the renderer DOM to finish its initial render before returning. Default 5000; 0 returns immediately with renderer_ready reflecting the instantaneous state."New value: +"Max wait (ms) for the renderer DOM to finish its initial render before returning. Default 5000; 0 returns immediately with renderer_ready reflecting the instantaneous state. Capped at 60000 to stay under the dispatch timeout backstop." - changed
Input schema / properties / readyTimeoutMs / maximumPrevious value: -9007199254740991New value: +60000
- Changed
electron_snapshot2 fields changed- changed
Input schema / properties / diffFormat / descriptionPrevious value: -"Encoding for since:'last' diffs. 'compact' (default) carries only the changed fields per entry; 'full' carries complete prev/curr entries."New value: +"Encoding for since:'last' diffs. 'compact' (default) carries only the changed fields per entry; 'full' carries complete prev/curr entries. Ignored when format:'text'." - added
Input schema / properties / formatAdded value: +{ + "description": "Payload encoding. 'json' (default) returns the structured snapshot/diff objects. 'text' returns a compact one-line-per-entry rendering (5-10x fewer tokens): ref, role, quoted name, non-empty value/placeholder, and only NON-default state flags; ~ prefixes recently-changed entries, [-] marks non-targetable landmarks.", + "enum": [ + "json", + "text" + ], + "type": "string" +}
51 tool updates
v0.0.0- First observed
electron_assert_pattern - First observed
electron_attach - First observed
electron_check - First observed
electron_clear_input - First observed
electron_click - First observed
electron_console_logs - First observed
electron_detach - First observed
electron_dialog_handler - First observed
electron_discover_running - First observed
electron_drag - First observed
electron_drop_file - First observed
electron_elements_list - First observed
electron_exists - First observed
electron_expect_count - First observed
electron_expect_state - First observed
electron_expect_text - First observed
electron_expect_url - First observed
electron_expect_value - First observed
electron_expect_visible - First observed
electron_find - First observed
electron_focused_element - First observed
electron_force_kill - First observed
electron_get_attribute - First observed
electron_get_bbox - First observed
electron_get_computed_style - First observed
electron_get_state - First observed
electron_get_text - First observed
electron_get_value - First observed
electron_hover - First observed
electron_info - First observed
electron_inject - First observed
electron_key - First observed
electron_keyboard_type - First observed
electron_launch - First observed
electron_press_sequence - First observed
electron_screenshot - First observed
electron_scroll - First observed
electron_scroll_into_view - First observed
electron_select_option - First observed
electron_set_files - First observed
electron_snapshot - First observed
electron_stop - First observed
electron_switch_window - First observed
electron_type - First observed
electron_type_into_editor - First observed
electron_uncheck - First observed
electron_wait - First observed
electron_wait_for_event - First observed
electron_wait_for_selector - First observed
electron_wait_for_state - First observed
electron_windows_list
TDQS
Scored across 57 tools
Most tools target a distinct action, but several pairs are near-duplicates: electron_expect_state vs electron_wait_for_state, electron_expect_visible vs electron_wait_for_selector(state:visible), and electron_scroll (with a ref, it centres the element) vs electron_scroll_into_view. Typing tools (electron_type, electron_keyboard_type, electron_type_into_editor, electron_key, electron_press_sequence) and the launch/stop/force_kill/detach lifecycle cluster also require careful reading of long descriptions to pick correctly. The documentation is thorough enough to resolve most of this, but selection errors remain plausible.
All tools use snake_case under a uniform electron_ prefix, with clear verb-based names (electron_click, electron_get_text, electron_expect_url). The only deviation is a handful of noun-first names (electron_surfaces_list, electron_elements_list, electron_windows_list) that invert the verb_noun order used elsewhere. Readable and predictable overall.
At 57 tools this is far past a comfortable surface for one server, and the count is inflated by parallel families (six electron_expect_* tools, three electron_wait_for_* plus electron_wait, two scroll tools) that could be consolidated. The domain is genuinely large (launch, inspect, interact, assert, artifacts), so not every tool is gratuitous, but the surface is heavy enough that an agent must triage before acting.
Coverage of driving an Electron app is broad: launch/attach/inject, session lifecycle, surfaces and windows, snapshot/find/read, full interaction set, waits/asserts, console logs, dialogs, and screenshots. However, several descriptions repeatedly reference an 'eval' capability (doctor's eval policy, switch_surface's 'renderer reads/eval', reload's 'instead of location.reload() in eval') yet no eval tool exists in the set, and there is no network/interception or clipboard tool. Those gaps will block some otherwise natural workflows.
Maintenance
Related MCP Connectors
Browser-based QA for AI-built software. Test pages with real browsers via agents.
Hosted browser for AI agents: screenshots, post-JS DOM, console, WCAG. No install, no API key.
Autonomous cloud agent tasks: real browser + your tools, structured evidence-backed results.
Write, run and check natural-language browser tests of your web app from your AI assistant.
Related MCP Servers
- AlicenseAqualityBmaintenancePlaywright for the entire OS. Give AI agents eyes and hands on any desktop app — find, click, type, and read UI elements across Linux, macOS, and Windows.2718 PyPI47MIT
- AlicenseAqualityDmaintenanceDrive Electron apps from AI agents via MCP - click, type, drag, screenshot, eval JS, and more.3925 npm3MIT
- AlicenseCqualityDmaintenanceEnables AI coding tools to interact with Electron applications for automated testing, including app lifecycle, element interaction, and visual testing.4814 npm1MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to safely and truthfully control local desktop applications via native accessibility trees, supporting element inspection and automation without proprietary binaries or fake success responses.Apache 2.0