0.0 / 30
What changed in the harness
Selection accuracy 100→98, token cost up 13%, unconfirmed writes 0%→0%.
Category breakdown
Where the score comes from.
Earned points across the four signals Gradable measures. Safety and Legibility are scored out of 30; Economics and Discoverability are scored out of 20.
01Safety
02Legibility
20.9 / 30
03Economics
17.0 / 20
04Discoverability
12.0 / 20
Highest-impact fix
Estimated gain +30 pointsAdd explicit identity and permission preflight tools
Expose machine-readable principal/tenant confirmation and a non-mutating permission check so agents can verify both before destructive actions.
Description evidence
Defects and rewrites.
23 defects found across the exposed tool descriptions. Suggested rewrites make purpose, inputs, boundaries, and returns easier for an agent to understand.
| Tool | Defect types | Suggested rewrite |
|---|---|---|
close_page |
name_restates_behavior no_return_description |
Closes the page identified by pageId, obtained from list_pages. Use this tool when you no longer need a browser tab. The last open page cannot be closed. Returns a confirmation of the closed page and the remaining open pages. |
drag |
name_restates_behavior no_return_description |
Performs a drag-and-drop gesture by dragging the element with from_uid and dropping it on the element with to_uid. Returns an updated page snapshot if includeSnapshot is true, otherwise a confirmation of the drag operation. |
emulate |
name_restates_behavior no_return_description |
Applies browser emulation settings to the selected page, including network throttling, CPU slowdown, geolocation, user agent, color scheme, viewport, and extra HTTP headers, for testing responsive, offline, and mobile behavior. Omitting a parameter leaves or clears that override. Returns a confirmation of the applied emulation settings. |
fill |
no_return_description |
Type text into an input or text area, or select an option from a <select> element identified by uid. Use value 'true' or 'false' for checkboxes, toggles, and radio buttons. Returns an updated page snapshot if includeSnapshot is true. |
fill_form |
no_return_description |
Fills multiple form elements (inputs, selects, checkboxes, radios) in a single call using uids from the snapshot, where each value is set on its matching element. Use 'true' or 'false' for checkboxes, toggles, and radio buttons. Prefer this tool over repeated fill or click calls when interacting with forms. Returns an updated page snapshot if includeSnapshot is true. |
get_console_message |
no_return_description |
Retrieves a single console message by its msgid from the currently selected page. Use list_console_messages to obtain the available message ids. Returns the details of the requested console message, including its type and text. |
handle_dialog |
name_restates_behavior no_return_description |
Responds to a browser dialog (such as alert, confirm, or prompt) that was opened on the page, either accepting or dismissing it. If the dialog is a prompt, promptText can supply the text to enter. Returns a confirmation of how the dialog was handled. |
lighthouse_audit |
no_return_description |
Runs a Lighthouse audit on the currently selected page and returns score and reports for accessibility, SEO, best practices, and agentic browsing, excluding performance. Use mode 'navigation' to reload and audit, or 'snapshot' to analyze the current state, optionally emulating desktop or mobile. Reports are saved to outputDirPath, or to temporary files when omitted. For performance audits, use performance_start_trace instead. |
list_console_messages |
name_restates_behavior no_return_description |
Returns the console messages logged by the currently selected page since the last navigation, optionally filtered by type or service worker, with results paginated via pageSize and pageIdx. Set includePreservedMessages to also include messages preserved over the last 3 navigations. Returns the matching console messages. |
list_network_requests |
no_return_description |
Returns the network requests made by the currently selected page since the last navigation, optionally filtered by resource type, with results paginated via pageSize and pageIdx. Set includePreservedRequests to also include requests preserved over the last 3 navigations. Returns the matching network requests with their details. |
list_pages |
no_return_description |
Returns all pages currently open in the browser along with their pageId identifiers, for use with select_page, close_page, and other page-scoped tools. Omit parameters as none are required. |
navigate_page |
no_return_description |
Navigates the selected page to a URL, or moves back, forward, or reloads in history. Optionally bypasses cache, auto-handles beforeunload dialogs, injects a script before page scripts, and applies a timeout. Returns the result of the navigation, including the page's current URL and status. |
new_page |
no_return_description |
Opens a new tab and loads the given url, optionally in the background without bringing it to the front. If isolatedContext is given, the page runs in its own browser context with separate cookies and storage. Returns the pageId and details of the newly opened page. |
performance_start_trace |
no_return_description |
Starts a performance trace on the selected page to diagnose frontend performance issues and Core Web Vitals such as LCP, INP, and CLS. Optionally reloads the page when tracing begins, auto-stops the recording, and saves raw trace data to filePath. Returns a confirmation that the trace has started together with its identifier. |
performance_stop_trace |
name_restates_behavior no_return_description |
Ends the active performance trace recording on the selected page and returns the collected trace data for analysis. Optionally saves the raw trace data, for example as trace.json.gz or trace.json, to the given filePath. |
press_key |
no_return_description |
Presses a key or key combination on the selected page, such as 'Enter', 'Control+A', 'Control++', or 'Control+Shift+R', using modifiers Control, Shift, Alt, or Meta. Use this tool when other input methods like fill cannot be used, for example keyboard shortcuts, navigation keys, or special combinations. Returns an updated page snapshot if includeSnapshot is true. |
resize_page |
name_restates_behavior no_return_description |
Sets the selected page's window size to the specified width and height so the viewport matches the requested dimensions. Returns a confirmation of the new page dimensions. |
select_page |
name_restates_behavior no_return_description |
Sets the page identified by pageId as the context for subsequent tool calls, so actions apply to that page. Optionally brings the page to the front and focuses it. Use list_pages to get available page ids. Returns a confirmation of the selected page. |
take_heapsnapshot |
no_return_description |
Captures a heap snapshot of the currently selected page and saves it to filePath as a .heapsnapshot file, for analyzing the memory distribution of JavaScript objects and debugging memory leaks. Returns a confirmation of where the snapshot was saved. |
take_screenshot |
name_restates_behavior no_return_description |
Captures a screenshot of the currently selected page, or of a single element when uid is given, in png, jpeg, or webp format. Set fullPage to capture the entire page instead of the visible viewport, and quality (0-100) to control JPEG/WebP compression. If filePath is provided the screenshot is saved there instead of being attached. Returns the screenshot in the response. |
type_text |
name_restates_behavior no_return_description |
Type the given text into the input element that is currently focused on the page, then optionally press a key such as "Enter" or "Tab" via submitKey after typing. Use this after focusing an input, for example to fill a form field and submit. Returns the result of the typing/keypress action so the caller can confirm the input was accepted. |
upload_file |
no_return_description |
Upload the local file at filePath through the page element identified by uid — either a file input element or any element that opens the file chooser when interacted with in the page snapshot. Returns the upload result, and additionally attaches a page snapshot when includeSnapshot is true. |
wait_for |
name_restates_behavior no_return_description |
Block until any of the given texts appears anywhere on the selected page, resolving as soon as one is found; an optional timeout in milliseconds caps the wait (0 uses the default). Use it to synchronize after navigation or asynchronous page updates. Returns once the matching text is present, or fails if the timeout is exceeded. |
Selection evidence
Confusable tool pairs.
6 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
fill |
fill_form |
medium | Both names start with 'fill' and act on the same form elements (uid+value); a task like 'fill in the email and password fields' matches either, with only the single-element vs batch-form distinction in the descriptions separating them. |
get_console_message |
list_console_messages |
medium | Common phrasing like 'get the console messages' mirrors the get_* name even though list_* is the correct tool for multiple messages; the get tool's description points to list for all messages, but a hasty name match can mislead. |
get_network_request |
list_network_requests |
medium | A task like 'get the network requests for the page' matches the singular get_* name, while the correct choice is the plural list_*; only the descriptions clarify that get_* fetches one request by reqid/selection. |
take_heapsnapshot |
take_snapshot |
medium | Both names read as 'take a snapshot of the selected page'; the difference (memory distribution vs a11y text tree) lives only in the descriptions, so a vague request like 'take a snapshot to inspect the page' can select the wrong one. |
take_screenshot |
take_snapshot |
medium | Users often say 'take a screenshot' and 'take a snapshot' interchangeably for capturing a page, and take_snapshot's explicit 'prefer a snapshot over a screenshot' guidance can push an agent toward take_snapshot even when the user wants an image. |
navigate_page |
new_page |
medium | A terse request like 'open example.com' is natural phrasing for both navigating the current tab and opening a new tab with a URL; the definitions split on current-page navigation vs new tab, which such phrasing does not resolve. |
Compare the field