Skip to main content
Glama

multi-modal-jev-browser

tests python license

A browser agent that asks a small, cheap decision model what to do next and calls a vision LLM only when that model is unsure. It runs as a CLI, a Python library and an MCP server, so Claude Code, opencode, Cursor and Codex can drive a real browser with one line of config.

The same form filled by three decision models, in real time sped up 2.5x

One form, three decision models, the same browser layer and the same loop. Left: Jev reading the element list, with an LLM fallback: 8 s and $0.0001. Middle: Clef reading the numbered screenshot: 13 s and $0.0053. Right: DeepSeek v4.1 Flash deciding every step: 35 s and $0.0019. All three submit the right values. Real time, played 2.5x faster. Reproduce it with examples/compare_deciders.py.

Why it is cheap

Most browser agents give every click to a large LLM: read the page, think, call a tool, repeat. mmjb splits the job.

  • A decision model answers typed multiple-choice and yes/no questions with probabilities, one call per step. Jev costs $0.000015 a call and answers in about a second. Clef, which also reads the screenshot, costs under a tenth of a cent a step.

  • An ordinary vision LLM takes one step only when the decision model is unsure, claims nothing can move, or the page stops changing.

On the benchmark below, a Jev run needed the LLM fallback in none of 15 tasks.

mmjb with Jev

mmjb with Clef

the same loop with an LLM deciding every step

cost of one form (8 steps)

$0.0001

$0.0060

$0.0015 (DeepSeek v4.1 Flash), $0.0043 (GPT-6 Luna)

cost of 1,000 forms

$0.12

$6.02

$1.48 (DeepSeek v4.1 Flash), $4.30 (GPT-6 Luna)

time for one form

8 s

15 s

53 s (DeepSeek v4.1 Flash), 47 s (GPT-6 Luna)

cost of a 60 step workflow

$0.0009

$0.05

$0.01 (DeepSeek v4.1 Flash), $0.03 (GPT-6 Luna)

sees the screenshot

no

yes, numbered

yes, numbered

The cost and time rows are the measured cost and time per step multiplied by the number of steps. The full tables, the method and the reproduction commands are under Results.

Related MCP server: Cloudflare Playwright MCP

At a glance

Runs as

a CLI (mmjb), a Python library (Agent) and an MCP server (mmjb-mcp, 13 tools)

Decision models

Clef on Cloudflare Workers AI, Jev on OpenRouter, any LiteLLM vision model, or your own class in 20 lines

Fallback

any LiteLLM model; default DeepSeek v4.1 Flash

Each step sends

a screenshot with a numbered box on every control, the element list with roles and values, the page text, your facts and what the last actions did

Handles

new tabs and popups, dropdowns with 40 options, checkboxes, radios, forms that scroll, buttons that stay disabled until the form is valid, confirmations that vanish on reload

Reaches

controls inside embedded frames, numbered like any other; canvases, drag and drop, sliders and menus that open from the keyboard, through click at a point, drag and key presses; tick-box and image-tile challenge widgets, by position

Safety

writes are off by default, destructive verbs are refused unless the goal names them, page text is treated as data

Install

uvx --from git+https://github.com/foklepoint/multi-modal-jev-browser mmjb-mcp

Check the setup

mmjb doctor prints a pass or fail per check with the exact fix

Pick a decision model

you want

use

why

the lowest cost per step

Jev (MMJB_DECIDER=jev)

about $0.000015 a call, about one second a step, enough for forms with clear labels

to see the page as a person does

Clef 27B (MMJB_DECIDER=clef)

reads the numbered screenshot, so unlabeled icons and visual layout count

no Clef or Jev account

any LiteLLM vision model (MMJB_DECIDER=llm)

one key, slower and dearer per step

something else

your own class (MMJB_DECIDER=package.module:Class)

see docs/extending.md

How a step works

  page            observe            one call            act             say what happened
  ──────  ────────────────────  ────────────────────  ─────────────  ────────────────────────
  tab  ─▶  numbered screenshot  ─▶  decision model    ─▶  click /     ─▶  "same url; the page
          + element list            operation            type /          text changed by +27
          + page text               click target         select /        characters"
          + facts                   goal_done            scroll          + the next step record
          + last 8 effects          no_move              back
                                     fact_for
                                          │
                              margin < 0.1, or no move,
                              or 3 dead clicks in a row
                                          ▼
                                 vision LLM fallback

Quick start

git clone https://github.com/foklepoint/multi-modal-jev-browser
cd multi-modal-jev-browser
uv venv --python 3.12
uv pip install -e ".[dev]"
uv run playwright install chromium
export CLOUDFLARE_API_TOKEN=...      # or OPENROUTER_API_KEY, see the table below
export CLOUDFLARE_ACCOUNT_ID=...
uv run mmjb doctor
uv run mmjb run --url https://example.com/contact \
  --goal "Fill in the contact form with the facts and send it." \
  --fact name="Ada Lovelace" --fact message="I would like to hear more." \
  --allow-writes

mmjb doctor checks Python, the browser, every decision model and the fallback, and prints the exact fix for anything that fails. It exits 0 only when the browser works and at least one decision model answers.

Without a clone, for an MCP server:

uvx --from git+https://github.com/foklepoint/multi-modal-jev-browser mmjb-mcp

MCP setup

The server keeps one browser open for the life of the session, so look, click, type and the rest all work on the same page.

claude mcp add mmjb --env CLOUDFLARE_API_TOKEN=your_token --env CLOUDFLARE_ACCOUNT_ID=your_account_id -- uvx --from git+https://github.com/foklepoint/multi-modal-jev-browser mmjb-mcp

Copy-paste config for opencode (opencode.json), for Cursor and Codex, and a generic mcpServers file are in examples/. Every one of them uses the same uvx --from git+https://github.com/foklepoint/multi-modal-jev-browser mmjb-mcp command.

Tools:

Tool

What it does

browse(goal, start_url, facts, allow_writes, max_steps)

runs the whole loop and returns the result plus the last numbered screenshot

look()

the numbered screenshot as an image and the numbered element list as text

click(index, allow_writes)

clicks an element from the last look()

type(index, text, allow_writes)

types text into an element

select(index, option, allow_writes)

picks a dropdown option

scroll(direction)

down, up, top or bottom

goto(url)

opens a URL in the agent's tab

back()

goes back in the tab's history

press(key, allow_writes)

Enter, ArrowDown, Tab, Escape and anything else, for menus that open from the keyboard

click_at(x, y, allow_writes)

clicks a point of the viewport, in the pixels of the screenshot from look()

drag(x, y, to_x, to_y, allow_writes)

presses at one point, moves to another and releases

status()

the current URL, the models in use and how much work has been done

doctor()

the same report as mmjb doctor, as a tool

Choosing and swapping the models

The decision model is the cheap one that makes the decisions. The fallback model is the expensive vision LLM that takes one step when the decision model is unsure. Swap either with one environment variable.

Decision model

Needs

Reads

Notes

Clef via Cloudflare Workers AI

CLOUDFLARE_API_TOKEN, CLOUDFLARE_ACCOUNT_ID

the numbered screenshot and the page

MMJB_CLEF_MODEL=clef is 27B and reads page text. clef-flash is 9B and is too weak to read page text, so it is not the default.

Jev via OpenRouter

OPENROUTER_API_KEY

the element list and the page text, no image

MMJB_JEV_MODEL=typesafe/jev-1.13. The cheapest option, and enough for most forms.

Any LiteLLM vision model

the provider's own key

the screenshot and the page

MMJB_DECIDER=llm and MMJB_DECIDER_MODEL=.... Works with no Clef or Jev account.

With nothing set, the choice is Clef when the Cloudflare variables exist, then Jev when OPENROUTER_API_KEY exists, then a LiteLLM model.

The fallback model is MMJB_FALLBACK_MODEL, default openrouter/deepseek/deepseek-v4.1-flash. Any LiteLLM model string works.

The cost of a step is one decision-model call. In practice most simple forms finish in six to ten steps with no fallback call at all.

Command line

mmjb run --goal "..." --url "..." --fact key=value --fact other=value \
         [--allow-writes] [--max-steps 40] [--budget 300] [--json] [--out shot.jpg]

mmjb look --url "..." [--out shot.jpg]     # one numbered screenshot and the element list
mmjb doctor                                 # check the setup, exit 0 only when it works

mmjb run --json prints one JSON object on stdout and everything else on stderr, so it can be piped straight into another tool. Exit codes: 0 verified, 2 blocked, 3 unverified, 4 step limit, 1 error.

Using it as a library

from mmjb import Agent

agent = Agent(
    goal="Fill in the contact form and send it",
    start_url="https://example.com/contact",
    facts={"name": "Ada Lovelace", "message": "I would like to hear more."},
    allow_writes=True,
)
result = await agent.run()
print(result.outcome, len(result.steps), f"${result.cost:.4f}", result.seconds)

from mmjb import Agent, Result, CloudflareClef, TypesafeJev, LLMDecider also works, and every tool and option has a one-sentence docstring that reads well as an MCP tool description.

Writing your own decision model

A class with one async method. Twenty lines is a working model.

from mmjb.deciders import Answer


class MyDecider:
    name = "mine"

    async def decide(self, state: dict, questions: dict, images: list[str]) -> dict[str, Answer]:
        ...
        return {"operation": Answer(key="operation", kind="choice", choice="CLICK",
                                    probabilities={"CLICK": 0.8, "WAIT": 0.2}, confidence=0.8)}
MMJB_DECIDER=mypackage.decider:MyDecider mmjb run --goal "..." --url "..."

The same works for a fallback (MMJB_FALLBACK=mypackage.fallback:MyFallback), a safety policy (MMJB_POLICY=mypackage.policies:allow_something) and a step hook (Agent(on_step=...)). Installed packages can publish deciders and fallbacks under the mmjb.deciders and mmjb.fallbacks entry point groups, so pip install some-plugin adds one with no change to this repository. Worked examples for all four are in docs/extending.md and in examples/.

What it reaches, and what it does not

The decision model works on numbered elements. Anything it cannot name that way goes to the fallback model, which sees the plain screenshot and can act on pixels and keys.

situation

how it is handled

tested

a control inside an embedded frame

read and numbered with the page's own controls, drawn on the screenshot, clicked and typed into like any other; the frame's text is part of the page text

a local page with a form in a frame; Jev fills and saves it in 3 steps

a canvas, or a page with no HTML controls

the fallback clicks a point (click_at) from the plain screenshot

a local canvas; the click lands where the model aimed

drag and drop, sliders

the fallback drags from one point to another (drag)

a local drop zone

a menu or dropdown that opens from the keyboard

the fallback clicks it, then sends key presses (press), one per step

a local keyboard-only menu; it picked the right item

a tick-box or image-tile challenge widget

by position, with the fallback model reading the tiles

a local red-squares grid, solved in 10 steps. Real CAPTCHA services are built to resist automation, so success depends on the model and the site, and invisible or behavioural checks can still block a run

What it does not do:

  • anything behind a login it has no credentials for

  • pages that need a second device, an email link or a phone code

  • a model that cannot see well enough to aim: coordinates come from the fallback model, so a weak model misses small targets

  • file uploads are implemented (a file: fact and set_input_files) but only covered by the safety tests, not by an end-to-end run

It works in the viewport. Content below the fold is listed as an offscreen control and reached by scrolling to it, one step at a time.

Safety

  • allow_writes is false by default. Nothing is typed, selected, uploaded, clicked at a point, dragged or sent as a key press, and no submit, send, save, post or publish button is clicked, until it is on.

  • Even with allow_writes on, delete, remove, log out, pay, buy, upgrade, subscribe and checkout are refused unless the goal itself contains that word.

  • A custom policy can replace these rules entirely.

  • Page text is untrusted data, never instructions, and the rules text handed to every model says so.

  • Keys are read only from environment variables. Nothing is ever written to a file.

Tests

uv run playwright install chromium
uv run pytest -q

The suite is offline: a local test site is served by http.server and a scripted decision model drives the real loop, so the tests make no network call and need no API key. Tests marked live run the same site against a real decision model and skip themselves unless the keys are set:

CLOUDFLARE_API_TOKEN=... CLOUDFLARE_ACCOUNT_ID=... uv run pytest -m live -q -s

Results

Five form tasks of rising difficulty, served from examples/bench_site: a contact form, a demo request that opens in a new tab and keeps its submit button disabled until the form is valid, a three step wizard, a long form that needs scrolling, and a sign up with a 40 country dropdown. Every page posts what was submitted to a local server, and a run counts as correct only when the exact expected values arrived, whatever the agent claims.

Accuracy, speed and cost on the benchmark

decision model

correct submissions

agent said verified

median steps

median seconds

median cost per task

runs that needed the LLM fallback

Jev + LLM fallback

15 of 15 (100%)

15 of 15

8

8.0

$0.0001

0 of 15

Clef 27B (screenshot + elements)

10 of 10 (100%)

10 of 10

8

14.0

$0.0051

1 of 10

DeepSeek v4.1 Flash only

3 of 3 (100%)

3 of 3

5

30.3

$0.0009

0 of 3

GPT-6 Luna only

4 of 4 (100%)

4 of 4

5

31.9

$0.0026

0 of 4

Correct submissions by task

task

Jev + LLM fallback

Clef 27B (screenshot + elements)

DeepSeek v4.1 Flash only

GPT-6 Luna only

contact form

3 of 3

3 of 3

3 of 3

3 of 3

demo request in a new tab

3 of 3

3 of 3

n/a

1 of 1

three step wizard

3 of 3

3 of 3

n/a

n/a

long form with scrolling

3 of 3

1 of 1

n/a

n/a

sign up with a 40 country dropdown

3 of 3

n/a

n/a

n/a

Median steps and seconds by task

task

Jev + LLM fallback

Clef 27B (screenshot + elements)

DeepSeek v4.1 Flash only

GPT-6 Luna only

contact form

5 steps, 5 s, $0.000075

5 steps, 9 s, $0.0031

5 steps, 30 s, $0.0009

5 steps, 31 s, $0.0025

demo request in a new tab

8 steps, 8 s, $0.0001

8 steps, 15 s, $0.0062

n/a

8 steps, 45 s, $0.0048

three step wizard

8 steps, 8 s, $0.0001

8 steps, 14 s, $0.0051

n/a

n/a

long form with scrolling

12 steps, 11 s, $0.0002

13 steps, 30 s, $0.01

n/a

n/a

sign up with a 40 country dropdown

8 steps, 8 s, $0.0001

n/a

n/a

n/a

What one step costs

decision model

cost per step

seconds per step

steps per dollar

Jev + LLM fallback

$0.000015

1.0

66,667

Clef 27B (screenshot + elements)

$0.0008

1.9

1,328

DeepSeek v4.1 Flash only

$0.0002

6.6

5,392

GPT-6 Luna only

$0.0005

5.9

1,861

The same models on longer tasks (measured cost per step, multiplied)

A cost per step measured above, times the number of steps. Real long tasks also hit more unsure steps, so treat the larger columns as a floor for the cheaper models.

decision model

one form (8 steps)

signup flow (25 steps)

complex workflow (60 steps)

1,000 forms (8 steps each)

10,000 workflow steps

Jev + LLM fallback

$0.0001

$0.0004

$0.0009

$0.12

$0.15

Clef 27B (screenshot + elements)

$0.0060

$0.02

$0.05

$6.02

$7.53

DeepSeek v4.1 Flash only

$0.0015

$0.0046

$0.01

$1.48

$1.85

GPT-6 Luna only

$0.0043

$0.01

$0.03

$4.30

$5.37

Time on longer tasks

decision model

one form (8 steps)

signup flow (25 steps)

complex workflow (60 steps)

Jev + LLM fallback

8 s

0.4 min

1.0 min

Clef 27B (screenshot + elements)

15 s

0.8 min

1.9 min

DeepSeek v4.1 Flash only

53 s

2.7 min

6.6 min

GPT-6 Luna only

47 s

2.5 min

5.9 min

Cost compared with GPT-6 Luna only

decision model

cost per step compared with the baseline

Jev + LLM fallback

35.8x cheaper

Clef 27B (screenshot + elements)

1.4x more expensive

DeepSeek v4.1 Flash only

2.9x cheaper

GPT-6 Luna only

1.0x more expensive

How to read these numbers

  • The pages are local and were written for this benchmark. Real sites are messier, so expect more unsure steps and more fallback calls there than here.

  • The LLM-only rows were run on the shortest tasks only, because they are slow. Their cost and time per step come from those runs.

  • Costs: Jev is $0.000015 a call at list price, Clef is the input tokens in the response times $0.24 per million, and the LLM rows and any fallback calls are the cost LiteLLM reports.

  • The tables for longer tasks multiply the measured cost and time per step by the number of steps. They assume the same share of unsure steps as the benchmark.

  • The first pass of this benchmark found that the done check did not recognise "Your account was created" as a confirmation. The word list was extended and the sign up task was run again; the tables use the shipped code.

Reproduce:

uv run python examples/bench.py run --label jev --decider jev --repeats 3
uv run python examples/bench.py run --label clef --decider clef --repeats 3
uv run python examples/bench.py run --label deepseek --decider llm --model openrouter/deepseek/deepseek-v4.1-flash --repeats 3
uv run python examples/bench.py report tmp/bench/*.jsonl
uv run python examples/compare_deciders.py --runs 3        # the three runs behind the GIF

Credits

  • Jev by TypeSafe, for the decision-model idea and the shape of the questions

  • Clef by Cloudflare, on Workers AI

  • inspired by browser-use and jev-ultrafast

  • LiteLLM, for the model-agnostic fallback

  • Playwright, for the browser

This project is unofficial. It is not affiliated with TypeSafe or Cloudflare.

Licence

MIT. See LICENSE.

Available Tools

13 tools
backA

Go back to the previous page in the current tab.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden, and it discloses only the navigation direction. It says nothing about failure when there is no history, whether the action waits for the page to load, or whether it can be blocked by the page — all traits an agent would need for a navigation tool with zero annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler or repetition of the tool name. Every word (direction, target, tab scope) earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, no-output navigation tool, the description is essentially sufficient: the agent knows the direction and the tab scope. The only missing piece is the no-history / failure edge case, which is minor given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter semantics to explain; the baseline for a parameterless tool is 4. Nothing in the description misleads about inputs, and the empty schema matches the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Go back') and target ('the previous page'), and scopes it to 'the current tab', which disambiguates from a browser-wide history action. It does not, however, explicitly contrast itself with siblings like 'goto' (forward/direct navigation), so an agent must infer the distinction from the names alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the navigation-history framing ('previous page'), which tells the agent this is history traversal rather than direct addressing. There is no explicit when-to-use vs when-to-prefer-'goto' guidance and no stated preconditions (e.g., behavior when no prior history exists), leaving the agent to infer the context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browseC

Run the whole loop until the goal is met or a limit is reached, and return the result with the last numbered screenshot.

NameRequiredDescriptionDefault
goalYes
factsNo
max_stepsNo
start_urlNo
allow_writesNo

TDQS

C2.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It does disclose two useful behavioral facts: the loop terminates on goal satisfaction or a step limit, and the return includes the last numbered screenshot. But it omits critical behavior for an autonomous agent — whether it can mutate state (allow_writes defaults false), cost/latency expectations, and what happens on failure — leaving major gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single compact sentence with the terminating condition front-loaded and no wasted words. It is appropriately sized for a one-line summary, though the brevity is a consequence of under-specification rather than deliberate economy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a complex autonomous tool with 5 parameters, no annotations, no output schema, and 0% schema coverage, yet the description is one sentence. It partially covers the return value ('last numbered screenshot') but leaves parameter meaning, write permissions, and failure behavior unexplained — insufficient for a tool of this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 5 parameters, so the description must compensate and largely does not. It obliquely covers 'goal' and 'a limit' (max_steps), but says nothing about facts, start_url, or the significant allow_writes flag, whose false default materially changes tool behavior. Three of five parameters are effectively undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description conveys that this is an autonomous multi-step loop ('run the whole loop until the goal is met') that returns a final screenshot, which contrasts implicitly with the primitive siblings (click, type, goto). However, it never names the resource being browsed — no mention of a browser, web page, or session — so the agent must infer the domain from sibling names. Purpose is vague rather than specific verb+resource.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool versus chaining the granular siblings (look, click, type, scroll). The phrase 'the whole loop' hints that it replaces manual stepping, but no condition or exclusion is stated. An agent gets no instruction about prerequisites or when the primitive tools are preferable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clickC

Click the element with this index, using the numbers from the last look().

NameRequiredDescriptionDefault
indexYes
allow_writesNo

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden, and it under-delivers: it never mentions that clicks may navigate away from the page, that writes are gated, or that allow_writes (default false) governs whether this action is permitted. For a potentially state-changing browser automation tool, the safety-relevant behavior is undisclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short sentence with no filler, and the operative action plus the index source are both front-loaded. Nothing extraneous, though there is very little content to structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No annotations and no output schema mean the description must stand alone, and it omits post-click behavior, the write-permission gate, and failure modes. An agent could plausibly invoke this and be confused by a blocked or unexpectedly navigating click.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for two parameters. The description partially explains 'index' by tying it to the last look() output, but says nothing about allow_writes, leaving an agent unable to know why a click would be rejected or that the parameter defaults to false.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb and resource ('Click the element with this index') and clarifies the index origin, which implicitly separates it from the coordinate-based sibling click_at. However it never explicitly contrasts itself with click_at, so full sibling differentiation is left to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'using the numbers from the last look()' establishes a prerequisite and implies this tool is used after look(), which is genuinely useful routing context. It does not state when NOT to use it or when click_at would be preferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

click_atA

Click a point of the viewport, in the pixels of the screenshot from look(). For canvases, challenge widgets and anything with no numbered element.

NameRequiredDescriptionDefault
xYes
yYes
allow_writesNo

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It says nothing about side effects, whether permission or gating is required, or what happens on a page that cannot be clicked. Critically, the schema exposes an allow_writes flag defaulting to false, and the description never explains what that gate does or when it must be enabled.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the action, then the coordinate frame, then the use case. No filler and no repetition of the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating click tool with no annotations, no output schema, and 0% parameter coverage, the description answers the most important question (what coordinate space) but omits the allow_writes gate and any statement of return/verification behavior. Adequate, not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% (bare titles only), so the description must compensate. It does define x/y meaningfully by tying them to the pixel space of the look() screenshot, but allow_writes — the one parameter with real behavioral consequence — is left completely unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (click) plus the exact target (a point of the viewport) and the coordinate space (pixels of the screenshot from look()). It implicitly separates itself from the sibling 'click' by scoping to 'anything with no numbered element', though it never names that sibling outright.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'For canvases, challenge widgets and anything with no numbered element' is an explicit when-to-use condition, and it implies the reciprocal condition for the numbered-element sibling. No hard exclusions or pitfalls are stated, but the routing intent is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

doctorA

Check Python, the browser, the decision models and the fallback, and say what to fix.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose what is inspected and that it returns remediation advice, implying a non-mutating read. It does not state side effects, whether any environment state is touched, or runtime cost, so the behavioral picture is only partial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero filler; the inspected targets and the promised output are packed into one clause without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-argument diagnostic with no output schema or annotations, the description covers what is checked and the nature of the result (fix recommendations), which is adequate. It could go further by clarifying the unexplained product terms or flagging that running it is safe/cheap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4. There are no argument semantics for the description to add, and none are missing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Check) and enumerates the resources inspected (Python, browser, decision models, fallback) plus the outcome (say what to fix), which clearly separates it from the browser-control siblings. However, domain jargon like "decision models" and "fallback" is left unexplained, so the exact scope isn't fully self-evident.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the phrase "say what to fix" signals a troubleshooting/diagnostic invocation. There is no explicit when-to-use condition, no prerequisites, and no mention of the sibling "status" tool that might otherwise be confused with it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dragB

Press at one point of the viewport, move to another and release: sliders, sortable lists, drag and drop.

NameRequiredDescriptionDefault
xYes
yYes
to_xYes
to_yYes
allow_writesNo

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It describes the mechanical gesture but says nothing about side effects, whether the drag can mutate the page, or how the required allow_writes flag (default false) gates the operation. A drag that reorders a sortable list is a state-changing action and that is left undisclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with the core gesture front-loaded before a short use-case list; there is no filler or repetition. It is appropriately sized for the gesture it describes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no annotations, no output schema, and 0% schema description coverage, the description is the only source of behavioral information, and it omits the allow_writes gating, coordinate conventions, and any error/failure behavior. It names the gesture but not enough of its semantics for confident invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 5 parameters, so the description must compensate. 'Press at one point... move to another' does implicitly map x/y to the start point and to_x/to_y to the destination, which is genuinely useful. But allow_writes is left unexplained in both the schema and the description, and no units or coordinate origin are given.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a concrete verb-and-mechanism: 'Press at one point of the viewport, move to another and release', immediately telling the agent this is a pointer-drag gesture. It names concrete use cases (sliders, sortable lists, drag and drop). It stops short of explicitly distinguishing itself from siblings like click_at or press, so a 4 rather than a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The trailing examples ('sliders, sortable lists, drag and drop') imply the situations where drag is appropriate, giving implied usage. However, it never states when NOT to use it or routes the agent to alternatives such as click_at, scroll, or press for simpler pointer actions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gotoC

Open a URL in the browser tab the agent is using.

NameRequiredDescriptionDefault
urlYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It clarifies only that navigation targets the agent's own tab, but says nothing about whether it waits for page load, replaces or preserves current page state, or what happens on an invalid/unreachable URL.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero filler; the essential action and target are stated immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a trivial one-string-parameter tool with no output schema this is close to sufficient, and no return-value documentation is required. Still missing: load/wait semantics and failure behavior, which matter because the tool mutates the agent's browsing context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

One parameter with 0% schema description coverage, so the schema supplies only a title ('Url'). The description adds no format guidance—absolute vs relative, required protocol scheme, or whether special values like 'about:blank' are accepted—beyond the word 'URL'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Open') and resource ('a URL in the browser tab the agent is using'), which is more precise than a bare name. However, it gives no signal to separate it from siblings like 'browse', 'look', or 'back', which plausibly overlap with navigation behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Contains no when-to-use guidance, no exclusions, and never names an alternative such as 'browse' or 'back'. The agent must infer from the name alone when navigation is the right call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lookB

Show the current page as a numbered screenshot and a list of the numbered elements on it.

NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral-disclosure burden. It describes the return format (numbered screenshot plus numbered element list) and implies a read-only observation, but omits permissions, side effects, and whether page state changes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence, front-loaded with the core output. Every word earns its place and there is no redundant or vague filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Without an output schema or annotations, the description must explain return behavior. It names the two components (screenshot and element list) but leaves gaps: how the numbering maps to elements and what the screenshot contains are unspecified, which could matter for a tool used to drive subsequent actions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so no parameter semantics are needed. Per the rules, a zero-parameter tool receives a baseline of 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Show') and resources ('current page', 'numbered screenshot', 'list of the numbered elements'). It distinguishes itself from action siblings implicitly by being the observation tool, but does not explicitly name alternatives like browse or click.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance, prerequisites, or alternatives are provided. The agent must infer that look is called before click/type to obtain element numbers, which is not stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pressC

Press a key such as Enter, ArrowDown, Tab or Escape on the current page, for menus and dropdowns that open from the keyboard.

NameRequiredDescriptionDefault
keyYes
allow_writesNo

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It does not disclose the presence or effect of the allow_writes gate, whether the press targets a focused element, or what happens on failure — all relevant for a keyboard-interaction tool that can trigger page mutations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single well-formed sentence with the action front-loaded and the use case trailing it. No filler, though it is arguably too short given the undocumented allow_writes gate.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no annotations, no output schema, and 0% schema coverage, the description is the only source of behavioral information, and it omits the write-safety model implied by allow_writes=false. For a tool that interacts with live page state, this leaves meaningful gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for two parameters. The key examples hint at the expected key-name format, but the allow_writes parameter — which defaults to false and clearly governs whether keyboard actions may trigger writes — is never explained anywhere in the definition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Press a key') on the current page, and the examples (Enter, ArrowDown, Tab, Escape) make the action unambiguous. It does not explicitly contrast with the sibling 'type' tool, which also sends keyboard input, so the boundary between pressing a named key and typing text is left implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The clause 'for menus and dropdowns that open from the keyboard' gives an implied usage context, which is better than nothing. However, there is no explicit when-to-use/when-not guidance and no mention of the alternative 'click' or 'type' tools, so the agent must infer the routing itself.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scrollB

Scroll the page; direction is down, up, top or bottom.

NameRequiredDescriptionDefault
directionNodown

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It says nothing about whether the scroll is smooth or instant, how far one invocation scrolls, whether it targets the page or a focused element, or whether any state is returned — all relevant for an agent deciding how many times to call it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; the operation comes first and the argument domain second. Nothing could be trimmed without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-optional-parameter tool with no output schema and no annotations, the description covers the basics (what it does, allowed directions) but omits scroll target, extent, and return behavior. Minimum viable rather than complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the schema declares no enum, so the description's enumeration of 'down, up, top or bottom' is the only place the valid values appear and is genuinely load-bearing. It still doesn't explain the semantic difference between relative directions (down/up) and absolute ones (top/bottom).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Scroll the page') and enumerates the valid directions, so an agent can tell it apart from the click/type/look/browse siblings without opening the schema. It stops short of explicitly naming a sibling or contrasting scope (element vs page), so it lands at clear-but-no-differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No statement of when to use this tool versus the alternatives (e.g. goto for navigation, press for keyboard paging) and no prerequisites or exclusions. The only guidance is the direction vocabulary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

selectC

Choose an option in the dropdown with this index, using the numbers from the last look().

NameRequiredDescriptionDefault
indexYes
optionYes
allow_writesNo

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It says nothing about whether selecting triggers navigation, what happens on failure, whether a browser must be attached, or how the allow_writes flag affects behavior — a notable gap for a mutation-style interaction tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler. The only cost is the ambiguity of "with this index", which slightly undercuts the otherwise efficient phrasing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A 3-parameter interactive tool with no annotations, no output schema, and 0% schema coverage needs the description to do more. It omits the option format, the allow_writes semantics, and the post-selection behavior, leaving real gaps for an agent to fill by guesswork.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% with 3 parameters. The description partially explains index by tying it to "the numbers from the last look()", but the option parameter's expected format and the allow_writes flag (default false, potentially gating the write) are entirely undocumented in both schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: "Choose an option in the dropdown with this index." This distinguishes it from most siblings like click and type, though it does not explicitly say why to prefer it over click for a dropdown. The phrase "with this index" is slightly ambiguous (dropdown index vs. option index) but recoverable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a sequencing prerequisite — use the numbers from the last look() — which implies the tool must be called after a look(). However, it names no alternative or exclusion, so an agent gets an implied workflow rather than explicit when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

statusB

Report the current URL, the configured decision and fallback models, and how much work has been done.

NameRequiredDescriptionDefault

No parameters

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It implies a read-only informational report, and the zero-parameter shape makes side effects unlikely, but it never explicitly states harmlessness, return format, or whether any state is mutated. Adequate but thin for a no-annotation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single efficient sentence that front-loads the verb and the primary output (current URL). No filler, though "how much work has been done" is looser than the rest.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must convey the return contents, and it does list three categories. However, "how much work has been done" is ambiguous and no format or field detail is given, leaving the return shape only partially specified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so per the baseline this scores 4. The description correctly implies no input is required and focuses on what is reported rather than on parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ("Report") and enumerates the resources returned: current URL, configured decision/fallback models, and progress. This is clearly a status/diagnostics read tool, distinguishably different from the action siblings (click, type, goto). Slightly weakened by the vague phrase "how much work has been done."

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to call this versus alternatives like `doctor` (also diagnostic) or `look`. There is no statement of context, prerequisites, or conditions that select this tool. The agent must infer usage entirely.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

typeC

Type text into the element with this index, using the numbers from the last look().

NameRequiredDescriptionDefault
textYes
indexYes
allow_writesNo

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden, and it omits key facts. It never mentions the allow_writes flag (default false) that appears to gate whether typing is permitted, nor whether existing text is replaced or appended, nor what happens on failure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One front-loaded sentence that gets to the action and the index source immediately, with no filler. It is efficient, though its brevity is also the source of the coverage gaps.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no annotations, no output schema, and 3 parameters at 0% schema coverage, the description should explain the write-gating flag and typing semantics. As written, an agent cannot know whether typing will succeed or how the allow_writes parameter affects it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 3 parameters. The description partially explains 'index' (it comes from look()) and implies 'text', but says nothing about allow_writes, which is the most behaviorally consequential parameter and defaults to false.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (type) and target (element with this index), which is clearly distinct from click, select, and scroll. However the generic name 'type' and the lack of explicit contrast with the sibling 'press' leave some ambiguity about key-entry vs text-entry.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'using the numbers from the last look()' gives a useful workflow hint (call look() first to obtain indexes), but it never states when to use this over press or select, nor any prerequisites such as the element being focused or editable.

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. 13 tool updatesv0.1.0
    • First observedback
    • First observedbrowse
    • First observedclick
    • First observedclick_at
    • First observeddoctor
    • First observeddrag
    • First observedgoto
    • First observedlook
    • First observedpress
    • First observedscroll
    • First observedselect
    • First observedstatus
    • First observedtype

TDQS

B3.2/5.0

Scored across 13 tools

Disambiguation4/5

Most tools have clearly distinct purposes: look observes, browse runs an autonomous loop, click/type/select target numbered elements, and click_at/drag/press handle special input. The only mild overlap is between browse and look, plus click vs click_at, but descriptions resolve these boundaries.

Naming Consistency4/5

Names are mostly consistent lowercase single-word actions (click, type, select, scroll, goto, back), with minor deviations like click_at and the noun-like status/doctor. No camelCase/snake_case chaos, but not a strict verb_noun pattern.

Tool Count5/5

13 tools is well-scoped for a browser automation server. Each tool covers a distinct capability needed for navigation, observation, interaction, or diagnostics.

Completeness4/5

The set covers the core browser agent lifecycle: navigation, observation, clicking, typing, selecting, scrolling, dragging, key presses, diagnostics, and a high-level browse loop. Minor gaps like hover, refresh, tab management, or waiting are missing but agents can often work around them.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to control a browser through a set of tools, allowing them to perform web automation tasks like navigation, typing, clicking, and taking screenshots.
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to control a browser through a set of tools, allowing them to perform web automation tasks like navigation, typing, clicking, and taking screenshots.
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to control a browser through a set of tools, allowing them to perform web automation tasks like navigation, typing, clicking, and taking screenshots.
    Apache 2.0