ultrabrowse
Ultrabrowse is an MCP server that lets an AI agent delegate end-to-end web tasks to a fast, Jev-driven Chrome browser, plus inspect and manually control pages.
browse: accomplish a plain-English goal on a page (open a URL or continue current tab); returns status, steps, and final page snapshot.extract: get structured JSON from a page, optionally after browsing to it, using a schema description.browse_many: run multiple url+goal tasks in parallel tabs with configurable concurrency.snapshot: fast, key-free read of visible page text and numbered interactive elements.Manual controls:
click,type_text,press_key,scroll,backto take over or fine-tune browsing.screenshot: capture a JPEG of the current tab.close: close the current tab (plusclose_allis mentioned in the README).
Supports Brave as an alternative Chromium-based browser, providing the same automated browsing capabilities as Chrome.
Drives a real Google Chrome instance via the Chrome DevTools Protocol to automate web browsing, including clicking, typing, extracting data, and completing goals.
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., "@ultrabrowseFind the yearly price of the Pro plan on the pricing page"
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.
ultrabrowse
Ultra-fast browsing for Claude Code, Codex, Cursor and any MCP client.
Hand your agent a goal ("find the yearly price of the Pro plan", "search for X and open the first result") and a real Chrome on your machine does the clicking, driven by TypeSafe's Jev (a small action-selection model that returns one indexed choice per call, not text) at about 300 ms per decision. Your big model makes one tool call and gets the result. It never spends tokens or seconds on the intermediate pages.
Independent open-source project; not affiliated with TypeSafe (makers of Jev) or browser-use. The engine is the jev-ultrafast policy rebuilt in plain JavaScript over raw Chrome DevTools Protocol. No Playwright, no Python, no native modules.
per step | 10-step task | what your model sees | |
Model driving a browser tool click by click | seconds | 30–90 s | every page, every step |
| ~0.3 s | 3–10 s | one result |
Install
Needs Node 22+ and Google Chrome (Chromium, Brave or Edge also work). Two API keys:
TYPESAFE_API_KEYpicks every click. Get one at https://typesafe.aiTEXT_MODEL_API_KEYis an OpenAI-compatible key used whenever text has to be typed and forextract. Default provider is OpenRouter (https://openrouter.ai/keys); any/chat/completionsendpoint works viaTEXT_MODEL_BASE_URL.
Pass them like any other MCP server, in the env block. If you prefer a file, put them in
~/.ultrabrowse/.env (template: .env.example); the env block always takes precedence.
Claude Code
claude mcp add ultrabrowse -e TYPESAFE_API_KEY=… -e TEXT_MODEL_API_KEY=… -- npx -y ultrabrowse@latestOr install the plugin, which adds the server plus a skill that teaches Claude to delegate whole web
tasks instead of clicking step by step (keys then go in ~/.ultrabrowse/.env):
/plugin marketplace add narekgevorgyan/ultrabrowse
/plugin install ultrabrowse@ultrabrowseCodex CLI
codex mcp add ultrabrowse --env TYPESAFE_API_KEY=… --env TEXT_MODEL_API_KEY=… -- npx -y ultrabrowse@latestor in ~/.codex/config.toml (raise the tool timeout: Codex defaults to 60 s and a browse can take longer):
[mcp_servers.ultrabrowse]
command = "npx"
args = ["-y", "ultrabrowse@latest"]
tool_timeout_sec = 300
[mcp_servers.ultrabrowse.env]
TYPESAFE_API_KEY = "…"
TEXT_MODEL_API_KEY = "…"Add to AGENTS.md: "For any web task, call the ultrabrowse MCP browse tool with a goal instead of driving a browser click by click."
Cursor, Windsurf, Claude Desktop
{
"mcpServers": {
"ultrabrowse": {
"command": "npx",
"args": ["-y", "ultrabrowse@latest"],
"env": { "TYPESAFE_API_KEY": "…", "TEXT_MODEL_API_KEY": "…" }
}
}
}VS Code (.vscode/mcp.json)
{
"servers": {
"ultrabrowse": {
"command": "npx",
"args": ["-y", "ultrabrowse@latest"],
"env": { "TYPESAFE_API_KEY": "…", "TEXT_MODEL_API_KEY": "…" }
}
}
}From a clone
The bundle dist/cli.cjs is committed, so a clone needs no npm install:
git clone https://github.com/narekgevorgyan/ultrabrowse
claude mcp add ultrabrowse -- node "$PWD/ultrabrowse/dist/cli.cjs"
node ultrabrowse/dist/cli.cjs doctor # checks keys and Chrome (opens a Chrome window; add --no-launch to skip)Related MCP server: OpenChrome
Tools
Tool | What it does |
| The one to use. Opens the URL (or continues in the current tab when |
| No-model read in ~0.5 s: on-screen text (plus same-origin iframe text) and numbered elements, one line each ( |
| Browse (optional), then return JSON shaped like |
| Goal-driven runs across many sites in parallel tabs. |
| Manual control over the numbered elements, for taking over when a |
| JPEG of the current tab; close this server's tab; close every page in ultrabrowse's Chrome (tabs left by other processes too). Tabs are also closed when the MCP client disconnects. |
Chrome
By default ultrabrowse launches a dedicated Chrome with its own profile under
~/.ultrabrowse/chrome-profile and reuses it across calls, restarts and clients: Claude Code and
Codex (or several sessions) running at once all share the one Chrome; whoever starts first launches it
and the others join it. The profile persists
(cookies and logins survive), so treat it like a browser profile; rm -rf ~/.ultrabrowse/chrome-profile
resets it. Set ULTRABROWSE_HEADLESS=1 to hide the window.
To browse as yourself (logged-in sessions, internal tools), start a Chrome with remote debugging and point ultrabrowse at it:
# macOS example; a separate profile dir so it doesn't fight your everyday Chrome
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --remote-debugging-port=9222 --user-data-dir="$HOME/.ultrabrowse/my-chrome"ULTRABROWSE_CDP_URL=http://127.0.0.1:9222What leaves your machine
api.typesafe.ai, on every step: the current page's URL, title, visible text, the labels and values of interactive elements, your goal, and the last 10 actions. No cookies, no screenshots, no password fields.
openrouter.ai (or your
TEXT_MODEL_BASE_URL), only when text has to be typed or you callextract: the goal, the schema, and up to 14 000 characters of page text.Nothing else. No telemetry, no update checks.
Safety
Model output is only ever an index into elements the page snapshot observed. It cannot produce a selector, a URL, or code that runs.
The snapshot skips
password,fileandhiddeninputs, so ultrabrowse cannot type a password.Every click is hit-tested at execution time (visible, not covered, still the same element).
Bot challenges (Cloudflare and friends) are reported as
challenge: true, never solved.Runs are bounded by an action budget, wall time, and no-progress detection.
Develop
npm install
npm run build # regenerates the inlined snapshot and bundles to dist/cli.cjs
node scripts/smoke.js dist # live end-to-end test over stdio (needs keys + Chrome)
claude plugin validate . # checks the plugin manifestssrc/snapshot.js is the in-page atomic snapshot (from jev-ultrafast, plus React-clickable divs);
src/engine.js the bounded loop; src/browser.js the CDP tab; src/model.js the TypeSafe and
text-model client; src/server.js the tools.
MIT.
Available Tools
11 toolsbackA
Go back one page in the current tab's history and return the new snapshot.
| 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 burden of behavioral disclosure. It discloses the state-changing navigation and return of a snapshot, but it does not describe behavior when history is empty, how it handles pending loads, or the structure of the returned snapshot.
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 leads with the action and ends with the expected result, containing no filler or redundant 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?
For a zero-parameter tool, the description conveys the operation and return value sufficiently. It is slightly incomplete on edge-case behavior and snapshot specifics, but these gaps are 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 schema coverage is complete and no parameter-level explanation is needed. The baseline of 4 applies because there is nothing for the description to add.
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 names a specific verb-resource pair ('Go back one page in the current tab's history') and states the outcome ('return the new snapshot'). This clearly distinguishes it from sibling navigation and interaction tools like click, scroll, and browse.
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 usage condition is clear: use this tool when the agent needs to move one step backward in the current tab's history. It does not explicitly mention alternatives or edge-case exclusions, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browseA
Accomplish a plain-English goal on a web page end to end: a Jev-driven Chrome picks and executes every click and field at ~300 ms per step. Pass url to open a page, or omit it to continue in the current tab. Returns status (done | blocked | stuck | budget | timeout | error), the steps taken, and the final page: url, title, visible text, numbered elements. One call replaces a whole click-by-click session. Needs TYPESAFE_API_KEY and TEXT_MODEL_API_KEY.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Page to open. Omit to continue in the current tab. | |
| goal | Yes | What to do and when to stop, e.g. 'Find the yearly price of the Pro plan; stop when it is visible'. | |
| timeout_s | No | ||
| screenshot | No | Also return a JPEG of the final page. | |
| max_actions | 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 that the tool autonomously picks and executes clicks/fields, operates at roughly 300 ms per step, returns several statuses, and requires two API keys. It could add side-effect warnings for actions like form submissions or purchases, but it is substantially transparent.
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 description is compact and well structured: purpose first, then usage mode, return values, and prerequisites. Each sentence earns its place without repeating schema information unnecessarily.
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 there is no output schema, the description usefully enumerates the return statuses and final-page fields, and it names the required API keys. It could further clarify the meaning of statuses like blocked/stuck/budget, but the overall picture is serviceable for a complex tool.
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 60%, and the description adds useful semantics for `url` by explaining that omitting it continues in the current tab. However, it does not add meaning for `timeout_s` or `max_actions`, leaving those to their names and schema defaults.
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 clearly states a specific capability: accomplishing a plain-English goal on a web page end to end via an autonomous Chrome agent. It also distinguishes itself from lower-level siblings by saying 'One call replaces a whole click-by-click session.'
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 description gives clear usage context: pass `url` to open a page or omit it to continue in the current tab, and use it for end-to-end goals rather than individual click/type operations. It does not explicitly name alternatives or give when-not-to-use cases, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browse_manyA
Run several url+goal tasks in parallel tabs and return all results (compact). Use for checking many sites or pages at once.
| Name | Required | Description | Default |
|---|---|---|---|
| tasks | Yes | ||
| concurrency | No | ||
| max_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that tasks run in parallel tabs and that results are returned compactly. It does not mention side effects, error handling, or rate limits, but for a straightforward browser automation tool these are not critical. The disclosed behavior aligns with expectations.
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 concise sentences with zero waste. The first sentence front-loads the core function and output, the second gives usage context. No redundancy or 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?
For a multi-task browsing tool, the description covers the essential aspects: what it does, how it operates (parallel), and what to expect (compact results). It does not detail the return structure or all parameter semantics, but the schema provides constraints and defaults. The description is adequate for an agent to understand the tool's purpose and call it 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%, so the description must compensate. It mentions 'url+goal tasks' which clarifies the structure of the 'tasks' parameter, but it does not explain 'concurrency' or 'max_actions'. The description only partially compensates for the missing schema documentation.
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 specific verb (run), resource (several url+goal tasks), mode (in parallel tabs), and output (return all results, compact). It also explicitly frames usage as 'checking many sites or pages at once', which clearly distinguishes it from sibling tools like 'browse' that handle a single page.
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 description provides clear context with 'Use for checking many sites or pages at once', which implies it is for multi-task scenarios. However, it does not explicitly name alternatives or state when NOT to use it, though the sibling list (e.g., 'browse') makes the distinction apparent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clickA
Click element [index] from the last snapshot/browse. Returns the new snapshot.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose the return behavior ('Returns the new snapshot'). However, it does not mention side effects such as navigation, page changes, invalidating the previous snapshot, or failure conditions, leaving some behavioral uncertainty for a mutating 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?
Two short sentences deliver the action, the source of the index, and the return value with no filler. The phrasing is front-loaded and every word contributes 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 tool with no output schema, the description covers the core invocation and return value, and even points to the prerequisite browse/snapshot state. It is incomplete only around edge cases such as stale snapshot, invalid index, or click failures, which a competent agent would have to discover elsewhere.
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?
Despite zero schema description coverage, the description explains that 'index' refers to an element's position in the last snapshot/browse, which is essential meaning the schema lacks. It stops short of specifying whether the index is zero-based or one-based, but this is a minor omission for a single-parameter tool.
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?
Opens with the imperative 'Click', names the resource ('element [index]'), and anchors it to 'the last snapshot/browse', which makes the operation distinct from sibling tools like type_text or press_key. A single sentence gives an agent enough to know exactly what action is being described.
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 description explicitly states the prerequisite context: the element comes from 'the last snapshot/browse', so an agent knows to call browse or snapshot first. It does not spell out when not to click versus using alternatives, but the one-parameter action is unambiguous enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
closeA
Close 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 burden of behavioral disclosure. The description only states what it does (closes the tab) but does not mention whether this is destructive, whether it requires confirmation, or whether the tab's state is lost. Since closing a tab is a mutation with potential data loss, this is a significant omission.
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 description is a single, concise sentence that conveys the complete action. There is no unnecessary information or repetition, and the verb is front-loaded. Perfectly concise.
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 tool with no parameters and a simple action, the description is largely complete. It identifies the target (current tab) and the action (close). However, given the lack of annotations, it could note the destructive nature of closing a tab, but the tool's simplicity and lack of parameters make it adequate. Overall, an agent can call it correctly without ambiguity.
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, which sets a baseline of 4 per the rubric. Since there are no parameters to explain, the description does not need to add parameter details. It correctly omits any parameter discussion.
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 clearly states the verb 'close' and the resource 'current tab', making the action unambiguous. It is distinct from sibling tools (click, browse, back) as none of them perform closing. A specific action with no ambiguity.
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 alternatives. However, the action is self-explanatory and the context of 'current tab' implies it is used for closing a browsing tab. No exclusions or alternatives are mentioned, so the usage context is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extractA
Get structured JSON from a page. With goal, browses there first; without it, extracts from the current page. Describe the shape in schema, e.g. '{plans:[{name, monthly_price, yearly_price}]}'.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| goal | No | Navigation goal before extracting; omit to use the current page. | |
| schema | Yes | Plain-English or JSON-like description of the object you want. |
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 usefully discloses that providing `goal` triggers navigation before extraction and that output is schema-driven. However, it does not clarify what happens when `url` is supplied without `goal`, whether extraction leaves page state changed, or what error/response behavior to expect.
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?
Three short sentences, front-loaded with purpose, followed by behavioral mode and a concrete example. Every sentence earns its place and there is no filler or repetition of schema content.
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 and no output schema, the description must do more than it does. It covers the core purpose and main usage pattern, but the relationship between `url`, `goal`, and the current page is underspecified, which is material for correct 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 67%, so the schema documents `goal` and `schema` but not `url`. The description adds value by explaining `goal`'s conditional behavior and giving a concrete `schema` example, but it leaves the `url` parameter ambiguous and does not fully compensate for that 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 first sentence, 'Get structured JSON from a page,' states a specific verb, resource, and output type. This clearly differentiates it from navigation and visual siblings like click, browse, snapshot, and screenshot, so an agent can identify it as the extraction tool.
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 description gives explicit conditional usage: with `goal` it browses first; without it, it extracts from the current page. It also tells the caller to describe the desired shape in `schema`. It does not explicitly name alternative tools or exclusion cases, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
press_keyA
Press a key in the current tab: Enter, Escape, Tab, Backspace, ArrowUp/Down/Left/Right, PageDown, Home, End, or a single character. Returns the new snapshot.
| Name | Required | Description | Default |
|---|---|---|---|
| key | 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 does disclose that the tool returns a new snapshot after pressing the key, which is valuable. However, it does not mention potential side effects such as navigation, form submission, or the requirement that the intended element have focus.
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, each earning its place: the first states the action and valid inputs, the second states the return value. The content is front-loaded and contains no 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?
For a single-parameter tool with no output schema and no annotations, the description covers the core requirements: what the tool does, what input values are supported, and what is returned. It could be slightly more complete by noting focus requirements or post-keypress page changes, but the essential information is present.
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 only defines 'key' as a string with zero percent description coverage, so the description must compensate. It does so thoroughly by enumerating the valid special keys and clarifying that a single character is also accepted, removing ambiguity about expected input format.
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 uses a specific verb (press), states the resource (current tab), and enumerates the exact set of accepted keys. This clearly distinguishes it from siblings like click (mouse action) and type_text (multi-character text input).
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 key list and 'single character' wording imply this is for discrete key presses, but the description does not explicitly say when to use this tool versus type_text or click, nor does it mention any exclusions or alternatives. Usage context is implied rather than directly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screenshotB
JPEG screenshot of the current tab.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations and no output schema, the description carries the full burden of explaining behavior. It discloses that the result is a JPEG screenshot of the current tab, but does not say how the image is returned (e.g., path vs. data URL), whether it captures the visible viewport or full page, or whether any side effects occur.
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 description is a single tightly worded sentence: 'JPEG screenshot of the current tab.' Every word earns its place, and the key facts are front-loaded without any 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?
For a zero-parameter tool, this is nearly sufficient, but it leaves gaps that an agent must guess: the return format of the screenshot and the distinction from the sibling 'snapshot' tool. The absence of an output schema makes these gaps more significant.
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 there is no parameter semantics to document. The schema coverage is trivially 100%, and the description adds relevant context by specifying the JPEG output format.
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 specific action (screenshot), a specific resource (current tab), and the output format (JPEG). The tool is easy to understand, but it does not distinguish itself from the sibling tool 'snapshot', which could plausibly overlap in function.
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 about when to use this tool versus alternatives like 'snapshot', 'browse', or 'extract'. The description only says what it does, not when an agent should prefer it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scrollB
Scroll the current tab down (or up) and return the new snapshot.
| 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 burden of explaining behavior. It discloses that scrolling occurs in the current tab and that a new snapshot is returned, but it does not mention scroll increments, end-of-page behavior, or handling of lazy-loaded content. This is adequate but not richly transparent.
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 description is a single, front-loaded sentence with no filler. Every word contributes to stating the action and the return value.
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 tool with one optional parameter and no output schema, the description covers the core action and result. It omits edge cases and boundary behavior, but the low complexity means this is unlikely to block correct 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?
The only parameter, direction, is referenced in the description ('down (or up)') with values matching the schema enum. However, with 0% schema description coverage, the description adds little beyond restating the enum and does not explain default behavior or scrolling amount.
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 uses a specific verb and resource ('Scroll the current tab down (or up)') and states the returned result ('return the new snapshot'). It is distinguishable from siblings like click, type_text, and browse, though it does not explicitly contrast itself with the related snapshot tool.
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 is provided about when to use scroll versus browse, snapshot, or extract. The description only states the action itself, leaving the agent to infer appropriate usage from the tool name and sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
snapshotA
Fast, no-model read of a page (~0.5 s): visible text plus numbered interactive elements you can pass to click/type_text. Pass a url to open it, or omit to re-read the current tab. Needs no API keys.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses performance (~0.5s), model-free operation, lack of API key requirements, and the nature of the returned content. It does not explicitly mention whether opening a URL navigates/changes the current tab, which is a minor side-effect 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 description is compact and front-loaded. It starts with the core value proposition, then covers parameter behavior, and ends with the API-key note. Every sentence adds necessary information with no 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?
For a simple one-parameter tool with no output schema, the description provides enough to invoke it correctly: what it returns, how to use the parameter, expected speed, and authentication requirements. The missing navigation side-effect detail is minor and does not prevent correct use.
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 explain the only parameter, url. It does: 'Pass a url to open it, or omit to re-read the current tab.' This is clear and complete for a single optional string parameter, though it stops short of specifying URL formats or edge cases.
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 names a specific action ('read'), a target resource ('a page'), and a distinctive return type ('visible text plus numbered interactive elements'). This clearly separates it from siblings like screenshot, extract, and browse, even without naming 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?
It gives operational guidance: pass a URL to open it, or omit to re-read the current tab. It also hints at downstream usage with click/type_text. However, it does not explicitly explain when to choose snapshot over browse or extract, so selection guidance is mostly implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
type_textA
Type text into editable element [index] (replaces its content). Set submit=true to press Enter afterwards. Returns the new snapshot.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| index | Yes | ||
| submit | No | Press Enter after typing |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the behavioral burden. It discloses three meaningful behaviors: content replacement, optional Enter submission, and returning a new snapshot. It omits edge-case behaviors like invalid index handling or whether the element must be visible, but the disclosed behaviors are substantive for a simple 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?
The description is compact and front-loaded: the main action appears first, followed by the optional submit behavior and return value. Every clause earns its place with no filler or repeated schema content.
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 three-parameter tool with no output schema, the description covers the core action, replacement semantics, optional submission, and return snapshot. Minor gaps such as behavior on invalid indexes or focus requirements keep it from being fully complete, but nothing essential for a normal call is missing.
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 only 33%, so the description needs to compensate. It gives useful context for index ('editable element [index]') and text ('Type text'), and restates the submit behavior. However, it adds little beyond the schema's own submit description and does not clarify index format, zero-based indexing, or text handling details.
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 clear verb+resource pair ('Type text into editable element [index]') and distinguishes itself from siblings like press_key by targeting an element and typing text rather than simulating a key press. The parenthetical 'replaces its content' further sharpens the tool's exact 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?
The description implies this is for entering text into an editable element, but it never explicitly says when to use this tool versus alternatives such as press_key or click. No exclusions or conditional routing are provided, so the agent must infer the appropriate 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.1- First observed
back - First observed
browse - First observed
browse_many - First observed
click - First observed
close - First observed
extract - First observed
press_key - First observed
screenshot - First observed
scroll - First observed
snapshot - First observed
type_text
TDQS
Scored across 11 tools
Most tools are clearly distinct: click, type_text, press_key, scroll, back, close, snapshot, screenshot, and extract each have a specific role. Some overlap exists between browse, browse_many, and extract with a goal, since all can perform autonomous browsing, but their outputs and parallelism distinguish them.
Tool names mostly follow an imperative command style with snake_case for multi-word names like type_text, press_key, and browse_many. Minor deviations like snapshot, screenshot, and back are noun/adverb-style rather than verb_ noun, but the overall pattern is readable and predictable.
11 tools is well-scoped for a browser automation server. Each tool covers a distinct aspect of browsing, reading, interacting, or tab management without excessive redundancy or an overwhelming surface.
The core browser lifecycle is well covered: navigation via browse/back, reading via snapshot/screenshot/extract, interaction via click/type_text/press_key/scroll, and tab handling via close. Minor gaps like reload or forward navigation are absent, but the high-level browse tool can work around many of those cases.
Related MCP Connectors
AI-powered web automation. Navigate websites using AI agents for one page or a thousand
AI-powered web automation. Navigate websites using AI agents for one page or a thousand
Headless browser primitives for AI agents when sites need real JS rendering.
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Related MCP Servers
- AlicenseBqualityFmaintenanceEnables AI agents to directly control your real Chrome browser with full context including login sessions, cookies, and open tabs. It provides tools for page scanning, JavaScript execution, CDP control, screenshots, and physical mouse/keyboard input for authentic browser automation.20243MIT
- AlicenseBqualityAmaintenanceControls a real Chrome browser for AI agents, enabling authenticated automation with parallel lanes, token-efficient page reads, and robust recovery mechanisms.121665 npm236MIT
- AlicenseBqualityDmaintenanceEnables AI agents to fully control Google Chrome: navigate, click, fill forms, inspect DevTools, and manage tabs with parallel execution and session isolation.244 npmMIT
- FlicenseNot gradedqualityBmaintenanceEnables AI agents to declaratively control web pages using real mouse and keyboard events via Chrome DevTools Protocol, without executing page JavaScript.9 npm1-