mmjb-mcp
Uses Cloudflare Workers AI as the decision-model backend for the browser agent (Clef models, e.g. the 27B Clef and 9B clef-flash), answering the per-step multiple-choice questions about what to do next on a page. Requires CLOUDFLARE_API_TOKEN and CLOUDFLARE_ACCOUNT_ID.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mmjb-mcpopen localhost:3000 and test the signup form with a new user"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
multi-modal-jev-browser
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.

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 ( |
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 |
|
Check the setup |
|
Pick a decision model
you want | use | why |
the lowest cost per step | 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 ( | reads the numbered screenshot, so unlabeled icons and visual layout count |
no Clef or Jev account | any LiteLLM vision model ( | one key, slower and dearer per step |
something else | your own class ( |
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 fallbackQuick 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-writesmmjb 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-mcpMCP 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-mcpCopy-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 |
| runs the whole loop and returns the result plus the last numbered screenshot |
| the numbered screenshot as an image and the numbered element list as text |
| clicks an element from the last |
| types text into an element |
| picks a dropdown option |
| down, up, top or bottom |
| opens a URL in the agent's tab |
| goes back in the tab's history |
| Enter, ArrowDown, Tab, Escape and anything else, for menus that open from the keyboard |
| clicks a point of the viewport, in the pixels of the screenshot from |
| presses at one point, moves to another and releases |
| the current URL, the models in use and how much work has been done |
| the same report as |
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 |
| the numbered screenshot and the page |
|
Jev via OpenRouter |
| the element list and the page text, no image |
|
Any LiteLLM vision model | the provider's own key | the screenshot and the page |
|
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 worksmmjb 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 ( | a local canvas; the click lands where the model aimed |
drag and drop, sliders | the fallback drags from one point to another ( | a local drop zone |
a menu or dropdown that opens from the keyboard | the fallback clicks it, then sends key presses ( | 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 andset_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_writesis 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_writeson, 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 -qThe 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 -sResults
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 GIFCredits
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 toolsbackA
Go back to the previous page in the current tab.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | Yes | ||
| facts | No | ||
| max_steps | No | ||
| start_url | No | ||
| allow_writes | No |
TDQS
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.
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.
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.
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.
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.
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().
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | ||
| allow_writes | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | ||
| y | Yes | ||
| allow_writes | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | ||
| y | Yes | ||
| to_x | Yes | ||
| to_y | Yes | ||
| allow_writes | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| allow_writes | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| direction | No | down |
TDQS
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.
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.
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.
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.
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.
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().
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | ||
| option | Yes | ||
| allow_writes | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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().
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| index | Yes | ||
| allow_writes | No |
TDQS
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.
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.
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.
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.
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.
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.
13 tool updates
v0.1.0- First observed
back - First observed
browse - First observed
click - First observed
click_at - First observed
doctor - First observed
drag - First observed
goto - First observed
look - First observed
press - First observed
scroll - First observed
select - First observed
status - First observed
type
TDQS
Scored across 13 tools
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.
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.
13 tools is well-scoped for a browser automation server. Each tool covers a distinct capability needed for navigation, observation, interaction, or diagnostics.
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
Related MCP Connectors
Control a real browser from AI agents: navigate, click, type, screenshot, read the page.
Let your AI agent operate any website through a real, logged-in browser session.
AI-powered browser automation — navigate, click, fill forms, and extract data from any website.
E2LLM gives your AI eyes and hands in a real browser: structured perception (SiFR) plus action.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables 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
- AlicenseNot gradedqualityCmaintenanceEnables 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
- AlicenseNot gradedqualityCmaintenanceEnables 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
- AlicenseNot gradedqualityCmaintenanceEnables 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