zenpilot
Control Zen browser tabs and interact with web pages.
List open tabs with IDs; the active tab is marked with
*.Open new tabs, optionally loading a URL.
Switch the active tab and close tabs.
Navigate a tab to a URL and wait for the page to load.
Read a page outline of visible interactive elements and text, with refs for clicking/typing.
Click elements by ref using real mouse events.
Type text into fields, optionally submitting with Enter.
Scroll the page by direction and pixel amount.
Take screenshots of the visible part of a tab.
Get readable main page text, up to a configurable character limit.
Allows driving a running Firefox (and Zen Browser) via WebDriver BiDi, providing tools to manage tabs, navigate URLs, read page outlines of interactive elements, click, type, scroll, take screenshots, and extract readable text.
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., "@zenpilotopen news.ycombinator.com and read the top stories"
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.
Let Claude use your Zen browser. Works with Claude Desktop and Claude Code, kind of like Claude in Chrome but for Zen.

There's no browser extension. zenpilot opens Zen with its remote control turned on and talks to it directly.
Alpha. Only tested on macOS with Zen 1.23.
Install
You need a Mac with Zen in /Applications.
Claude Desktop: download zenpilot-<version>.mcpb from the
latest release and open it. That's it.
Claude Code (or both): with uv installed, run:
uv tool install zenpilot
zenpilot setupSetup asks which Zen profile to use and which sites Claude may visit. Then it connects zenpilot to Claude Code (and Claude Desktop, if you have it) and opens Zen. Restart Claude Desktop afterwards.
Related MCP server: agentify-desktop
Use it
Just ask Claude: "order a large pizza with bacon on httpbin.org/forms/post for Sam, then submit it".
The first time, a few popups may show up. Only you see them, not Claude:
Which profile?
zenpilotis a fresh profile that isn't logged in to anything. Pick your own profile if you want Claude to use sites you're logged into.Reopen Zen? If Zen is already open without remote control, zenpilot offers to restart it. Your tabs come back.
Allow this site? Claude only works on sites you allow. Choose Don't Allow, Allow This Session or Always Allow.
Pressing Enter always picks the safe answer.
Claude can open, switch and close tabs, go to a URL, read the page, click, type, scroll and take screenshots. It can't touch cookies, passwords or downloads, and it can't run its own JavaScript.
Staying safe
Allowlist. Claude only works on sites you've allowed. Add one with
zenpilot allow github.com.Stick to the
zenpilotprofile if you can. It's logged out of everything. On your main profile, a shady page could try to trick Claude into doing stuff in your accounts, so only allow sites you trust.Read-only mode. Set
read_only = trueand Claude can look but not click or type.Log. Everything Claude does is written to
~/.local/state/zenpilot/audit.jsonl.Remote control is open while Zen runs this way. Other apps on your Mac could connect to it too, and some sites (banks, Cloudflare checks) may think you're a bot. When you're done, quit Zen and open it normally.
zenpilot also stops Zen from switching off its own protections (Safe Browsing, the popup blocker and so on), which would otherwise happen when remote control is on.
Commands
Command | What it does |
| Set everything up (see above) |
| Allow sites. |
| Open Zen with remote control on |
| Check your setup and say how to fix anything that's broken |
Settings
They live in ~/.config/zenpilot/config.toml, and changes apply right away.
allowlist = ["localhost", "127.0.0.1"] # "example.com" covers its subdomains too
read_only = false # true: Claude can look but not click or type
profile = "zenpilot" # which Zen profile Claude uses
auto_launch = true # open Zen when Claude needs it
prompts = true # show the popups above
port = 9222
audit_log = "~/.local/state/zenpilot/audit.jsonl"
dangerously_allow_all_sites = false # skips the allowlist. Please don't.Good to know
Only one Claude can drive Zen at a time. zenpilot lets go after 2 minutes of doing nothing, so Claude Desktop and Claude Code can take turns.
Zen can be hidden or behind other windows. It still works.
Zen loads restored tabs lazily, so Claude only sees an old tab once you've opened it.
Stuck? Run
zenpilot doctor. If Zen says it already has a session after a crash, restart Zen.
Hacking on it
git clone https://github.com/beSaif/zenpilot.git && cd zenpilot
uv sync && uv run zenpilot setup # points Claude at your clone
uv run pytest -m "not integration" # unit tests
uv run pytest # all tests, needs Zen running (zenpilot launch)Pushing a v* tag that matches pyproject.toml publishes to PyPI and makes a GitHub
release with the .mcpb.
License
Available Tools
11 toolsclickA
Click an element by ref (from read_page) with a real mouse event.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | 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 burden. 'With a real mouse event' is a genuinely useful disclosure that this dispatches actual input rather than a synthetic DOM event, but it omits consequences (navigation, form submission, waiting for load) and failure behavior.
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 sentence, action front-loaded, zero filler. Nothing could be removed 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-parameter browser interaction with no output schema, the description covers the operation, the target, and the source of the identifier. It could go further on post-click effects such as navigation or load-waiting, but it is sufficient to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single ref parameter, so the schema offers only a bare string. The description compensates by explaining what a ref is and where it originates (read_page), which is the key semantic the agent needs.
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) and resource (element identified by ref), which clearly separates it from siblings like type, scroll, or read_page. It does not explicitly name a sibling to contrast with, but the action is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
By noting the ref comes 'from read_page', it implies the precondition that read_page must run first to obtain a ref. However, it never states when to prefer click over alternatives (e.g., type for text entry) or what to do if the ref is stale.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_tabC
Close a tab.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, but it only says 'Close a tab.' It does not disclose whether the close is destructive/permanent, whether unsaved state is lost, whether the tab must exist, or what happens on invalid tab_id.
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 short, front-loaded sentence with no waste, but its brevity reflects under-specification rather than disciplined concision.
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-parameter mutation-with-no-annotations tool, the description is too thin: it omits tab_id sourcing, destructiveness, and error behavior, leaving the agent without enough to call it reliably.
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 the single tab_id parameter, and the description adds nothing about its format or where to obtain it (e.g., from list_tabs). It fails to compensate for the coverage gap.
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 (close) and resource (tab), so an agent understands this removes an existing browser tab. It implicitly contrasts with new_tab and switch_tab but does not name any sibling to differentiate scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to close vs. switch or navigate away, no exclusions, and no mention of any precondition. The agent must infer all usage context from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_textC
Readable main text of the page (prefers or a single ).
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | ||
| max_chars | 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 usefully discloses a content-selection heuristic (prefers <main>/single <article>), but omits fallback behavior, truncation via max_chars, and tab targeting.
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. It is appropriately sized for a simple extraction tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given two undocumented parameters, no annotations, and no output schema, the one-sentence description is too thin. It does not cover parameter behavior or expected return shape.
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%. Neither tab_id nor max_chars is explained in the description, leaving the agent to guess whether tab_id defaults to the active tab and how max_chars truncates the output.
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 what it returns: readable main text, with an extraction preference for <main> or a single <article>. This distinguishes it from broader siblings like read_page, though it does not explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus read_page, screenshot, or scroll. There are no prerequisites, exclusions, or alternative-routing hints.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tabsA
List open tabs with ids. The active tab is marked with *.
| 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. It does disclose the output convention that the active tab is marked with *, which is genuinely useful behavioral detail, but it says nothing about window scoping, ordering, permissions, or whether it reflects live browser state.
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 short sentences, zero waste, and the output-marker detail is front-loaded right after the core action. Nothing is padded.
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?
There is no output schema, so the description should carry the return-value burden. It partly does (ids plus active marker), but leaves unclear whether tabs are scoped per window, their ordering, and what identifying context beyond an id is returned.
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 schema has zero parameters and 100% coverage, so the baseline of 4 applies. There are no arguments for the description to explain.
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+resource (list open tabs) and even describes the output shape (ids, active marked with *). However, it offers no differentiation from siblings like get_text or read_page, which also surface page content, so an agent must infer when a tab listing is the right call.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not guidance, and no mention of the obvious companion tools (switch_tab, close_tab, new_tab). Usage is only implied — the agent must infer it should call this before switching or closing a tab.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
new_tabB
Open a new tab (it becomes active), optionally loading url.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose one genuinely useful side effect: the new tab 'becomes active' (a focus change). It does not say whether the previous tab's state is preserved, whether the response yields a tab identifier, or anything about popup-blocking/permission behavior.
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 wasted words; the activation behavior is called out inline rather than buried.
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-parameter tool with no annotations and no output schema, the description is adequate but thin: it does not indicate what the call returns (e.g., an identifier usable with switch_tab/close_tab), which is the main missing piece for correct follow-up 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?
Schema description coverage is 0%, so the description must compensate. 'Optionally loading url' correctly conveys that url is optional and what it does, but adds nothing about accepted format (absolute vs relative) or what loads when it is omitted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'Open a new tab' is unambiguous and clearly distinct from the siblings switch_tab, list_tabs, and close_tab, which deal with existing tabs. It stops short of naming or contrasting those siblings explicitly, so it lands at 4 rather than 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?
There is no guidance on when to open a new tab versus using switch_tab to reuse an existing one, or versus navigate. The use case is only implied by the verb; no prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_pageA
Outline of the page's visible interactive elements and text.
Interactive elements get refs like r12 for click and type. Checkboxes, radios and
switches show checked or unchecked. "clickable" marks an element with a pointer
cursor but no role, often a custom toggle; its label is usually the text before it.
Refs expire when you call read_page again or the page navigates.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No |
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 well: it discloses the ref format, that refs expire on re-call or navigation, how checked states are rendered, and how role-less 'clickable' elements are labeled. It does not say whether the call itself navigates or mutates page state, which is the main remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core statement is front-loaded in the first sentence and the remaining lines each carry distinct information about refs and element states. The 'clickable' explanation is slightly discursive but still 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?
With no output schema, the description must convey return shape, and it does: an outline of elements, ref tokens, and state markers. Missing details are the tab_id default behavior and whether text content is truncated or scoped to viewport.
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% and the single optional tab_id parameter is never explained in the description. An agent cannot tell from the text whether omitting tab_id targets the current tab or the active one, nor what format tab_id takes.
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 opens with a specific statement of the resource returned: an outline of visible interactive elements and text, with refs like r12. That is far more than a restatement of the name. It never contrasts itself with the close sibling get_text, so an agent must infer which of the two to call for plain text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the mention that elements 'get refs like r12 for click and type' hints that read_page is the prerequisite for click/type, but the description never says when to use it instead of get_text, screenshot, or scroll. No exclusions or alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screenshotC
Screenshot of the visible part of a tab.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | 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 disclosure burden. 'Visible part' usefully signals that off-screen content is excluded, but nothing is said about the return format (image data vs. path), permissions, or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no waste and the key scoping qualifier ('visible part') front-loaded. Its brevity, however, tips into under-specification rather than disciplined conciseness.
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 an undocumented parameter, the description is too thin for an agent to call this confidently—especially since the return format of a screenshot tool is a critical unknown.
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 (tab_id) with 0% schema description coverage and a null default. The description never mentions tab_id or explains what happens when it is omitted (e.g., capturing the active tab), so it does not compensate for the schema gap.
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 phrase 'Screenshot of the visible part of a tab' identifies the resource (a screenshot) and the scope (visible viewport of a tab), which distinguishes it from read_page/get_text. However, it's a noun phrase with no verb and no explicit statement of what the tool does (capture/return an image), leaving the action implied rather than stated.
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 guidance on when to use this tool versus siblings like read_page, get_text, or scroll. The word 'visible' hints at a viewport-only scope but never says to scroll first or when a screenshot beats text extraction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scrollC
Scroll the page with the mouse wheel by amount pixels.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | ||
| tab_id | No | ||
| 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 behavioral burden, yet it only names the input gesture (mouse wheel) and unit. It does not say which tab is affected when tab_id is null, whether the page must be focused, or whether scrolling is relative or absolute.
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 waste-free sentence, front-loaded with the action and unit. It is appropriately sized but too terse to cover the parameters the tool exposes.
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 3-parameter tool with zero annotation coverage, no output schema, and 0% schema description coverage, the description is inadequate: direction and tab targeting are never addressed, so an agent cannot reliably call 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%, so the description must compensate. It explains only 'amount' (in pixels), leaving the direction enum (up/down/left/right) and tab_id entirely undocumented in both the schema and 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 (scroll), resource (the page), and mechanism (mouse wheel) with a unit (pixels). It is clearly distinct from all siblings, none of which scroll, but it omits the direction dimension that the tool actually supports.
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 guidance on when to use this versus alternatives (e.g. read_page/get_text to inspect content) or any prerequisite such as needing an active tab. An agent must infer the usage context entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
switch_tabC
Make a tab the active one.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, yet it says nothing about what happens if tab_id is invalid, whether the previously active tab is affected, or whether this changes OS/browser focus. It conveys only the surface mutation of active state.
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, front-loaded sentence with no filler; sized appropriately for a simple single-parameter tool. It is arguably too terse given the semantic gaps elsewhere, but there is no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter action tool with no annotations and no output schema, the description still omits the essential detail of tab_id format and error/edge-case behavior. An agent can guess the intent but not call it reliably.
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 single required parameter tab_id has 0% schema description coverage, and the description provides no compensating detail—no indication whether tab_id is an index, an ID string, or a title, nor how to obtain one. This is a real gap the description should have filled.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb-like action on a specific resource: activating a tab. An agent can distinguish this from list_tabs, new_tab, and close_tab by the 'make active' phrasing, but the description never names those siblings or explicitly contrasts with them.
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 guidance on when to use this versus new_tab (create then focus) or list_tabs (discover a tab_id first), no prerequisites such as the tab needing to already exist, and no exclusions. Usage is left entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
typeA
Replace the content of a field (by ref) with text using real key events.
For a <select>, text picks the option starting with it. Date, time, color and range inputs take
their value format instead: date YYYY-MM-DD, time HH:MM (24-hour), datetime-local
YYYY-MM-DDTHH:MM, month YYYY-MM, week YYYY-Www, color #rrggbb. Newlines in text are typed as
Shift+Enter, so they don't send chat messages; submit=true presses Enter after.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | ||
| text | Yes | ||
| submit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the disclosure burden well: it says content is replaced (not appended), that real key events are emitted, that select/date/time/color/range inputs take their own value syntax, and that newlines become Shift+Enter so no accidental submit occurs. It omits edge behavior such as invalid refs, elements that reject typing, or rate/timing concerns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the format table, then the newline/submit nuance — every sentence adds information. The enumeration of input formats is dense but still readable; nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter, no-annotation, no-output-schema browser tool, this covers the tricky parts (value formats, select matching, Enter vs Shift+Enter) that would otherwise cause failed invocations. The unresolved 'ref' provenance and undefined failure behavior keep it from being fully 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%, so the description must compensate, and it does for two of three params: 'text' gets per-input-type format rules and newline handling, and 'submit' is defined as pressing Enter afterward. 'ref' is only glossed as 'by ref' with no indication of where refs come from, which is the one material gap.
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 ('replace the content of a field') plus the mechanism ('using real key events') and the target identifier ('by ref'), which is clearly distinct from siblings like click or get_text. It does not explicitly name a sibling or say it operates on the current page, so it falls just short of 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?
Usage is implied rather than stated: the input-format enumeration tells the agent this is for data-entry fields, but there is no explicit 'use this instead of click when…' guidance or precondition (e.g., that the field must already be visible/focused). The agent must infer the choice among read_page/click/type from context.
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.
11 tool updates
v0.1.0- First observed
click - First observed
close_tab - First observed
get_text - First observed
list_tabs - First observed
navigate - First observed
new_tab - First observed
read_page - First observed
screenshot - First observed
scroll - First observed
switch_tab - First observed
type
TDQS
Scored across 11 tools
Most tools have clearly distinct browser-automation purposes, especially tab management and navigation versus interaction. The main overlap is read_page vs get_text, since both extract page content, but the descriptions distinguish interactive outline/refs from readable main text.
All names use snake_case and are generally readable and predictable. There are minor deviations: several tools are single verbs (type, click, navigate, scroll) and screenshot is a noun, so it is not a uniform verb_noun convention.
The 11 tools are well-scoped for a browser automation server. Each covers a distinct common browser operation, and the count is neither bloated nor too thin.
Core browser workflows are covered: read page, get text, click, type, scroll, screenshot, navigate, and tab management. Some useful operations are missing, such as hover, general key presses beyond typing/Enter, waiting for selectors, and retrieving the current URL, but agents can work around many of these.
Maintenance
Related MCP Connectors
Official Browserless MCP server: browser automation, scraping, screenshots and PDFs for AI agents.
Hosted Web Crawler MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Hosted X (Twitter) MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Zenrows MCP server: Fetch, Extract, Batch, and Browser Sessions for AI agents
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceAn MCP Server for Chrome DevTools, following the Chrome DevTools Protocol. Integrates with Claude Desktop and Claude Code.312MIT

agentify-desktopofficial
AlicenseNot gradedqualityCmaintenanceMCP server that enables AI tools to control local browser sessions for ChatGPT, Claude, and other AI services, supporting querying, navigation, file uploads, and artifact management.21 npm567Mozilla Public 2.0- AlicenseCqualityDmaintenanceAn MCP server that gives Claude Code real browser control for web automation, testing, and screenshots.3227 npm156MIT
- AlicenseAqualityCmaintenanceA lean, LLM-first browser automation MCP server that gives Claude (or any MCP client) a real Chromium browser to navigate, interact with, and debug web apps.145 npm6MIT