Public leaderboard

Public assessment

freema/firefox-devtools-mcp (@mozilla/firefox-devtools-mcp)

mozilla-firefox-devtools-mcp · v0.9.15 · scanned

What changed in the harness

Selection accuracy 94→100, token cost up 18%, 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

0.0 / 30

0.0 out of 30
02Legibility

20.4 / 30

20.4 out of 30
03Economics

18.4 / 20

18.4 out of 20
04Discoverability

12.5 / 20

12.5 out of 20

Highest-impact fix

Estimated gain +30 points

Add 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.

24 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
list_pages
no_return_description
List the open tabs and return each one's index, title, and URL, with the currently selected tab marked so you can see which tab subsequent tab-level commands will act on.
navigate_page
no_return_description
Navigate the currently selected tab to the given URL, loading the target page in the same tab and returning once the page has finished loading.
select_page
no_return_description
Make the tab matching the given index, URL substring, or title substring the active (selected) tab that subsequent commands operate on; index takes precedence when more than one criterion matches. Returns once the selection has changed.
close_page
no_return_description
Close the tab at the given page index, freeing that tab from the browser session, and return once the tab has been closed.
take_snapshot
no_return_description
Capture a DOM snapshot of the current page, returning stable UIDs for elements so later commands can target them by UID, with optional text, attributes, and depth controls; retake the snapshot after any navigation because UIDs go stale. By default returns the snapshot inline up to maxLines, or saves the full snapshot to a file when saveTo is set.
resolve_uid_to_selector
name_restates_behavior no_return_description
Turn a UID taken from a snapshot into a CSS selector that addresses the same element, which lets you reuse element targets in selector-based commands; the conversion fails if the UID is stale because the page changed after the snapshot. Returns the resolved CSS selector.
clear_snapshot
name_restates_behavior no_return_description
Discard the cached DOM snapshot and its UIDs so stale elements can no longer be referenced; usually not needed, but do this before taking a fresh snapshot when the page has changed. Returns after the cache is cleared.
click_by_uid
no_return_description
Click the element identified by the given UID, dispatching a normal click or a double-click when dblClick is set, to trigger the on-page interaction before reading the resulting state; returns once the click has been processed.
hover_by_uid
name_restates_behavior no_return_description
Position the mouse over the element identified by the given UID to trigger its hover state, for example to reveal dropdowns or tooltips, before taking a snapshot or performing further interactions; returns once the hover is applied.
fill_by_uid
name_restates_behavior no_return_description
Set the text of the input or textarea identified by the given UID to the supplied value, replacing whatever the field currently contains, so the form reflects the new value when read or submitted; returns after the value is entered.
drag_by_uid_to_uid
no_return_description
Drag the element with fromUid onto the element with toUid, firing the HTML5 drag-and-drop events the page listens for so reordering and drop targets respond; returns when the drag completes.
fill_form_by_uid
no_return_description
Fill several form fields in a single call by mapping each field's UID to the value to enter, which is more efficient than repeated fill_by_uid calls for multi-field forms; returns after all fields are filled.
upload_file_by_uid
name_restates_behavior no_return_description
Attach the local file at filePath to the file input identified by the given UID so the chosen file is submitted with the form, for example after submitting the page; returns once the file is attached.
screenshot_page
name_restates_behavior no_return_description
Take a screenshot of the whole visible page and return it as a base64-encoded PNG, or pass saveTo to write the image to a file and optionally preview it inline instead of receiving image data in the response.
screenshot_by_uid
name_restates_behavior no_return_description
Take a screenshot of only the element identified by the given UID, cropped to that element's area, and return it as a base64-encoded PNG, or pass saveTo to write the image to a file instead of receiving inline image data.
list_downloads
name_restates_behavior no_return_description
Return the downloads that Firefox has tracked since the server started, giving each download's status (in_progress, complete, or canceled) and the path where the file was saved; filter the listing by status, URL substring, or a maximum count, and choose text or JSON output.
clear_downloads
name_restates_behavior no_return_description
Empty the buffer of tracked downloads so that subsequent list_downloads calls show only downloads that start after this point, which is useful between test runs to reset the view; returns after the buffer is cleared.
set_download_behavior
no_return_description
Choose how downloads are handled: allowed saves files silently to the default download directory, denied cancels them, and default returns to the browser's normal handling, sidestepping the native save-file dialog during automation (requires a recent Firefox); returns once the behavior is applied.
dismiss_dialog
name_restates_behavior no_return_description
Close the currently displayed browser dialog by answering it negatively (cancel), for example to get past an unexpected alert or confirmation so page scripts can continue; use accept_dialog instead when you need to confirm or supply prompt text. Returns once the dialog is dismissed.
navigate_history
name_restates_behavior no_return_description
Move the selected tab one step backward or forward through its session history, like pressing the browser's back or forward button; note that UIDs from snapshots taken before this navigation become stale, so retake a snapshot afterwards. Returns once the page has loaded.
set_viewport_size
no_return_description
Resize the browser viewport to the given width and height in pixels, which is useful for testing how the page's responsive layout behaves at different screen sizes or for controlling what is visible in screenshots; returns once the resize is applied.
restart_firefox
no_return_description
Restart Firefox with a different configuration, closing all current tabs. You can change the binary path, profile path, environment variables in KEY=VALUE format, headless mode, start URL, and startup preferences (prefs values are auto-typed, and prefs requires MOZ_REMOTE_ALLOW_SYSTEM_ACCESS=1). Returns the result of the restart once the browser is available again.
install_extension
no_return_description
Install a Firefox extension using the WebDriver BiDi webExtension.install command, either from an archive (.xpi/.zip), base64-encoded data, or an unpacked directory. Choose the source with the type parameter and provide the matching path or value; by default the extension is installed temporarily unless permanent is set (which requires a signed extension). Returns the extension ID, which can be passed to uninstall_extension or matched against list_extensions.
evaluate_script
no_return_description
Execute a JS function in the page and return its result. Pass element UIDs from a snapshot as function arguments. Use saveTo to write the result to a file as JSON instead of returning it inline, and optionally preview characters of the saved result with the preview parameter. Prefer the UID tools for interactions.

Selection evidence

Confusable tool pairs.

3 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.

Tool A Tool B Confidence Why they collide
fill_by_uid fill_form_by_uid high Both fill text inputs by UID and are semantically near-identical in descriptions ('Fill text input/textarea by UID' vs 'Fill multiple form fields at once'). A task like 'fill in the form' or 'fill the fields' could cause an agent to pick fill_by_uid when a single field is named or fill_form_by_uid when describing one input, selecting the wrong member.
get_firefox_output get_firefox_info medium Both return 'information about Firefox' in broad terms: one retrieves logs/output, the other retrieves instance configuration. A vague task like 'get info about what Firefox is doing' or 'check Firefox output' could plausibly make the agent pick the wrong one, since the output file location overlaps both descriptions.
screenshot_page screenshot_by_uid medium Both capture base64 PNG screenshots, differing only by scope (whole page vs element by UID). A task like 'take a screenshot of the search bar' or 'screenshot the form' requires resolving element vs page scope; without a UID context an agent could pick screenshot_page for an element-focused task or screenshot_by_uid for a full-page request.

Compare the field

One score is useful.
The evidence makes it actionable.

Back to the leaderboard