KitchenSink4Web
OfficialKitchenSink4Web is a local-browser MCP server for AI assistants to read, extract, monitor, and optionally act on websites.
Read pages with
get_page_viewunder a token budget, getting orientation, region costs, refs, completeness, and cheap delta reads viasince.Extract prose with
get_textand locate elements by text, role, description, CSS, or XPath withfind_elements.Navigate, scroll, wait for conditions, manage tabs/sessions, load saved auth, use contexts, and hand off for login/MFA.
Monitor one URL for deterministic changes while the server runs, with reports and forced checks.
Audit actions (
get_audit), read recipes (get_workflows), and inspect server capabilities (get_server_info).Load optional packs for tables/lists/links/article extraction to CSV/JSON, screenshots/PDF, network inspection, saved sessions, file upload/download, JS diagnostics, workflow record/replay, and accessibility checks.
Safety defaults: acting disabled unless allowed; passwords redacted; hidden text labeled; consequential actions confirmed; bot walls/CAPTCHAs reported, not solved.
Drives an installed Firefox browser in a separate profile for reading pages, extracting content, and performing browser actions; the Firefox lane is recommended for research-heavy work because it passes bot checks that block automated Chromium.
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., "@KitchenSink4WebNavigate to example.com and extract the article text"
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.
🌿 KitchenSink4Web
Read websites and extract data with your AI assistant. Read-only by default, with clicking and typing only when you allow it.
KitchenSink4Web is an MCP server that lets Claude Code, the Codex CLI, Copilot CLI, Claude Desktop and other local MCP clients read web pages through a browser on your computer. It returns each page within a size budget you choose, says what it left unread, and exports tables to CSV or JSON. It starts read-only: clicking, typing and form filling exist only when you switch them on. This is the free Community edition, licensed under the AGPL-3.0.
Product page · llms.txt · Changelog
Platform: Windows, macOS and Linux. Reading text from images uses Windows OCR. The first run may download a browser and some optional dependencies.
Install
The package needs Python 3.12 or newer. Run the commands below in PowerShell or a terminal, not in an AI chat.
Claude Code or Codex CLI. Install uv, run the line for your app, and start a new session:
claude mcp add web -s user -- uvx kitchensink4webcodex mcp add web -- uvx kitchensink4webClaude Desktop. Install uv and restart Claude Desktop. Download the .mcpb file from the latest release, then open Settings > Extensions > Advanced settings > Install extension and choose the file. The install screen lets you choose whether to allow clicking and typing, and which capability packs to load. The first launch downloads the Python package, so it needs a network connection.
Any other local MCP client. Use uvx as the command and kitchensink4web as its argument, or install the package and run kitchensink4web as the server command:
pip install kitchensink4webRelated MCP server: antibrowser-mcp
What it can do
Read a page within a size budget and see what was left unread.
Open one section or find one element without fetching the whole page again.
Extract tables, lists and article text, and export them as CSV or JSON.
Take screenshots or save a page as PDF.
Read only what changed since your last read of a page.
Watch a page for changes while the server runs.
Click, type and fill in forms, once you allow it.
Record a multi-step browser task and replay it with checks.
Run automated accessibility checks (optional extra).
The read-only startup set has 12 tools, 20 with clicking and typing allowed, and 53 with every pack enabled.
The first read
get_page_view returns the shape of a page: what it is, what each section contains, what each section would cost to open, and a sensible next call. You set the budget and the read never exceeds it. Every read ends with a completeness block that names what was left out and what it would cost to get it. The budget ladder has 16 rungs.
From there, reading gets cheaper. Open one region instead of raising the budget. Pass the token a read returns, and the next read covers only what changed. Elements come back as short-lived references your assistant can act on, and searches by text and role keep working after the page re-renders.
Open shadow roots are read and can be acted on like the rest of the page, which makes component-based sites readable. Closed shadow roots cannot be reached by any tool, so they are counted and reported. Same-origin iframes are read and searched like the page around them, each labeled with its origin; cross-origin frames are named but never entered.
An example. A raw dump of the Treaty of Versailles article on Wikipedia costs 33,073 tokens. The first read through get_page_view costs 4,445, and a delta read after one click costs 82.
Capability packs
The server starts with reading, navigation and session management. Packs are chosen at launch and stay fixed for the session, so a pack you did not load is absent, not just switched off.
Pack | What you get |
extract | Tables, lists, links and article text, with CSV and JSON export. |
capture | Screenshots (with password fields blurred), PDF export, and saving pages as files. |
network | The requests a page makes behind the scenes. Useful for debugging websites; most people leave it off. |
storage | Saves a signed-in session so your assistant does not have to log in each time. It saves the session, never your password, but treat the saved file like a password anyway. |
files | Downloads into one folder and uploads into page forms. Each one asks you first. |
diagnostics | Lets your assistant run JavaScript on a page, one script at a time, each shown to you for approval first. This is the most powerful setting here. Leave it off unless you need it. |
workflows | Record a multi-step task once and replay it later. Each replay checks that the page still matches before anything runs. |
accessibility | Checks a page against the WCAG rules with axe-core, groups the findings by rule, and says plainly what automated testing cannot check. Needs an optional extra; the tool explains how to install it. |
Tool definitions cost about 4.1k tokens for the read-only startup set, 6.9k with clicking and typing allowed, and 17.9k with every pack.
Browsers
By default the server drives its own bundled Chromium. It never touches your browser or your profile: each session starts in a fresh profile that is deleted on close, unless you explicitly save signed-in state to a file.
You can also choose a browser you already have installed (Chrome, Edge or Firefox). It still runs with its own separate profile, never yours. Some sites respond differently to different browsers, and manage_session(action='status') reports which browsers are installed and which one it recommends for the current page. It never switches for you. The server does not disguise what it is, and it reports bot checks and CAPTCHAs rather than trying to solve them.
Signed-in sessions are saved with save_auth_state and reloaded with auth_state= when you open a session. The saved file records when its cookies expire, and loading an expired one says so instead of letting the login fail without explanation.
Safety model
A browser holds your logins and your accounts, so safety is built into how the tools are offered.
Read-only unless you choose otherwise. By default, the tools that click, type and submit are not in the tool list at all, so no instruction on a web page can lead your assistant to use them. One setting at install (allow acting in the Claude Desktop bundle, KS4WEB_ALLOW_ACTING=true elsewhere) adds them.
Passwords stay out of the conversation. The server never reads what is typed into password fields. Secrets found in cookies and site storage are redacted before any text leaves the server.
Hidden text is treated as evidence, not instructions. Text a page hides from people is a common way to slip instructions to an AI. The server removes it from what your assistant reads, reports how much it removed, and labels everything a page says with where it came from.
Confirmation for consequential actions. Form submissions, payments and page scripts stop and ask you first, through your client's own confirmation prompt, and go ahead only when you choose Allow. An empty or automatic answer counts as no. Clients that cannot show the prompt refuse those actions instead of going ahead. The only exceptions are routine actions you have approved in advance through the consent scope, KS4WEB_PREAUTH, or the optional 30-minute Remember box.
Refusals that explain themselves. When something cannot be done, whether a login wall, a bot check or a page that crashed, the answer names what stood in the way and what to try next.
Two kinds of permission prompt
Your MCP client's own prompt names a tool (for example mcp__web__type_text). Approving the read-only tools there is safe and removes most prompts. A KitchenSink4Web confirmation describes the action itself ("submitting this form sends a password") and cannot be pre-approved for payments, credentials, posts, deletions or legal agreements.
Consent scope
The default scope is research: reading and navigation are free, search-style submissions (a search box) go ahead, and everything else asks first. The full scope lets ordinary form submissions go ahead without asking. Payments, credentials, posts, deletions and legal agreements ask under every scope.
Under full, a submit button whose wording the server does not recognize in any supported language is not gated. If that matters to you, stay on research.
Client compatibility
Client | What works |
Claude Desktop | Everything, with confirmations shown. |
Claude Code | Everything, with confirmations shown. |
claude.ai web | Reading, navigation and search. Actions that need confirmation are refused with |
Privacy
The server runs on your computer. KitchenSink4AI never receives your files, pages or usage data. The browser connects to the websites you ask it to use, and those sites see ordinary browsing requests. Your AI app may send prompts, page contents and tool results to its own provider under that app's settings and terms. A missing tokenizer table may be downloaded once; the text being measured is never sent. The optional update check contacts PyPI and sends nothing beyond the request itself. The Privacy Policy covers the product, purchases and support.
Configuration
Packs and read-only mode are chosen at launch with --packs, KS4WEB_MODE and KS4WEB_ALLOW_ACTING, and apply to every connection to the running server.
Update check. The server compares its version with PyPI only when you call manage_session(action='status'), never at startup or in the background, at most once every seven days, with a two-second timeout. The request sends no identifier, usage data, page content or session state, and the server never installs anything. KS4WEB_UPDATE_CHECK=off turns it off (KS4WEB_NO_UPDATE_CHECK=1 also works).
Fewer permission prompts: in Claude Desktop's tool permissions for this server, set the read-only tools to Always Allow. They cannot change anything on any page.
Subagents: tool results are capped more tightly inside a subagent, so start reads there at budget_tokens=2500.
Known limits
Cross-origin iframes are never entered; the completeness block names each one.
Closed shadow roots cannot be reached by any tool. They are counted, so you can tell a component-heavy page from an empty one.
Bot walls and CAPTCHAs are reported, never solved or evaded.
sendBeaconand ping requests bypass network routing rules, a limit of the underlying Playwright library.Accessibility checks find a minority of real-world issues. Deque, who build the axe-core engine, publish 57% as the share of issues their own automated tooling finds. A clean report means the automated checks passed, not that the page is accessible, and there is deliberately no score.
Monitors run only while the server runs. MCP clients do not yet deliver messages a server starts, so you ask the monitor report what happened. A monitor watches one URL for one defined change, checks no more often than every five minutes, cannot get past a login or bot wall, and pauses itself if it keeps failing.
content_hashis noisy on pages with clocks or counters, and a change that appears and reverts between checks is not seen. Everything stays on your machine.Session handoff works within one running server. A handle moves a live session to another conversation in the same running KitchenSink4Web. It is the same browser, so references from before may be stale, and the report says which. Handles work once, expire in an hour, and do not survive a restart.
Each extra identity is another browser process and profile, so it uses real memory. The action budget is shared across identities, so a second identity does not double what a session may do.
The browser choice list records which sites this computer visited with which browser (host names and dates only, nothing typed, no page content) so a site that refused one browser can be read with another. It stays on this machine, learning can be turned off, and one call erases it.
Testing
The suite has more than 2,000 tests, about 700 of which drive a real browser. Tests that need saved pages use small synthetic fixtures. Each release also re-runs regression tests for prompt injection through page content, hidden-text smuggling, credential theft, confirmation bypasses, workflow replay tampering and resource abuse.
Reporting problems
Please open an issue with the page (if it is public), what you asked for and what happened. The output of manage_session(action='status') is designed to be safe to share. For security issues, follow SECURITY.md.
Business edition
The Business edition pairs these tools with a Windows installer, a signed update channel and support under the Business terms. Update checks tell you when a covered release is available, and nothing installs on its own. See pricing. The Community edition stays free under the AGPL, including business use that meets its terms.
Contributing
Bug reports, fixes, tests and documentation are welcome. See CONTRIBUTING.md; first-time contributors agree to the Contributor License Agreement.
License
KitchenSink4Web is dual-licensed.
AGPL-3.0. Free for anyone, including businesses, for any use that complies with the AGPL. Its terms include sharing your source code, with your modifications, when you distribute the software or make it available over a network.
Commercial license. For organizations that want to build KitchenSink4Web into their own products or services without the AGPL's source-sharing obligations. Contact licensing@kitchensink4.ai.
Copyright (c) 2026 Alvut Consulting, LLC. KitchenSink4AI is a product line of Alvut Consulting, LLC. KitchenSink4AI tools are built with the help of AI coding assistants, and every release goes through the full test suite before it ships.
Not affiliated with or endorsed by Google, Mozilla, Microsoft, or any website this server visits. Chrome, Chromium, Firefox and Edge are trademarks of their respective owners, named only to identify the browsers this server can drive.
Available Tools
12 toolsfind_elementsFind ElementsARead-only
Find elements by text, role plus accessible name, natural-language
description, CSS, or XPath, and get back refs you can act on plus a note
on what was not searched. role='button' narrows any query to one
element role (field finding: 'Comment' alone matched 12; with the role
filter it matches the one button). This is the cheap targeted follow-up
that pairs with get_page_view: the page view tells you what string to
look for, and this retrieves it for a fraction of a full read.
Ambiguous results are listed rather than resolved, and zero results
come back with the nearest misses so a miss is a one-turn recovery.
The search covers the main document and every open shadow root in it,
and the matches it returns from a shadow root are actable like any
Same-origin iframes are searched too and the result says which ones
it entered. Two things stay out and the result counts both:
cross-origin iframes, which no tool here opens, and closed shadow
roots, which no tool can reach. XPath is the one kind that does not
enter a shadow root. location={'region': 'r7'} (or a ref, form, or table
from a read) narrows the search to that subtree, components inside it
included, and the first result line names the scope that was searched.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | auto | |
| page | Yes | ||
| role | No | ||
| limit | No | ||
| query | Yes | ||
| location | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true and openWorldHint=true, the annotations cover safety, but the description adds substantial behavioral detail: ambiguous results are listed rather than resolved, zero results return nearest misses, searches cover shadow roots and same-origin iframes, and XPath does not enter shadow roots. This goes far beyond the annotations and helps the agent predict edge-case 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?
The description is long but dense and front-loaded: the core purpose appears in the first sentence, followed by the role-filter example, pairing guidance, ambiguity behavior, scope limitations, and location narrowing. Each sentence earns its place, though the paragraph-style formatting and minor punctuation issues slightly hurt scannability.
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 six-parameter tool with no output schema, the description gives a strong picture of inputs, scope, limitations, and result behavior (refs, notes on what was not searched, nearest misses, scope named in the first result line). Missing details like what 'kind' does and how pagination/limit behaves keep it from being fully complete, but the essential invocation context 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 input schema has 0% description coverage, so the description carries the full burden for parameter explanation. It does explain query, role, and location well (including an example for role and a location example), but it never mentions the required 'page' parameter, nor does it explain 'kind' or 'limit' beyond the default. This is a meaningful gap for a tool with two required 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?
The description opens with a specific verb and resource: 'Find elements by text, role plus accessible name, natural-language description, CSS, or XPath.' It clearly distinguishes this tool from get_page_view by calling it a 'cheap targeted follow-up,' so an agent knows it is a retrieval/search action rather than a comprehensive read.
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 positions this tool relative to get_page_view: 'the page view tells you what string to look for, and this retrieves it for a fraction of a full read.' It also specifies scope exclusions (cross-origin iframes, closed shadow roots) and when XPath behaves differently, giving the agent concrete guidance on when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_auditRead the Action LogARead-only
Read the action log. Returns one record per call, paginated, carrying the timestamp, lane, page, URL, resolved target with its human label, redacted arguments, outcome, any rebind, any confirmation decision, and the budget counters at that moment. This is an operational record for the user, so you can always know exactly what was done even where a web action cannot be undone. It is not forensic and not evidence.
| Name | Required | Description | Default |
|---|---|---|---|
| tool | No | ||
| limit | No | ||
| session | No | ||
| start_index | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, but the description adds significant behavioral context: pagination, specific fields returned, and a clear caveat that the log is 'not forensic and not evidence.' It also explains the purpose of the log for undo scenarios, which goes beyond the annotation.
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 well-organized: it starts with the purpose, then lists the returned fields, then gives the operational rationale, and ends with a caveat. Every sentence adds value without redundancy, and it is appropriately sized for the complexity.
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?
Since there is no output schema, the description does explain the return content in detail, which is helpful. However, it omits any explanation of the input parameters, leaving agents to guess at filtering and pagination mechanics. For a tool with 4 parameters and no schema descriptions, this incompleteness is notable.
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?
With 0% schema description coverage, the description was expected to compensate for parameter meaning, but it does not mention any of the four parameters (tool, limit, session, start_index). It only implies pagination without explaining how the limit/start_index work. This is a critical gap for correct invocation.
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 and resource: 'Read the action log'. It elaborates on the content of each record, making it distinct from sibling tools like get_page_view or get_workflows. The purpose 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?
The description provides contextual guidance ('operational record for the user, so you can always know exactly what was done') but does not explicitly compare to alternatives or state when not to use it. The use case is implied rather than explicitly routed against siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_page_viewGet Page ViewARead-only
Read a page as an ORIENTATION, not a transcript, under a token budget
it never exceeds whatever the page size. Returns identity, landmark
regions each priced with the cost to expand it, the interactive surface
with refs you can act on, a digest or app skeleton, form and table
inventories, an account of what was NOT read and why, and the next call
for anything unexpanded. location scopes to one region ref,
budget_tokens=2500 suits a subagent, mode='links' includes in-prose
links at their real cost. since=<read_token> is the cheap repeat
read: only what changed, refs kept, a few hundred tokens instead of a
fresh read, and it falls back to a full read when the page navigated in
between and nothing survives to diff. Open shadow roots are read and
their contents get refs you can act on; closed roots cannot be reached
by any tool and are counted at creation, so the completeness block
reports both numbers rather than one confident zero. Same-origin
iframes are entered and read, and their contents get refs naming the
frame they came from; a cross-origin frame is never entered, because
its document belongs to an origin the page itself cannot read either,
and the completeness block counts every frame it did not open.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | auto | |
| page | Yes | ||
| view | No | auto | |
| since | No | ||
| detail | No | standard | |
| location | No | ||
| budget_tokens | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=true and openWorldHint=true, and the description reinforces both consistently while adding substantial context beyond them. It discloses the token-budget guarantee, what the completeness block reports for closed shadow roots and cross-origin frames (dual counts rather than a single zero), and the exact fallback behavior of the `since` read. None of this is derivable from the annotations, and it correctly explains the open-world behavior of reporting what was NOT read and why.
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?
Despite its length, every sentence earns its place: the core purpose is front-loaded, followed by return contents, then parameter guidance, then edge-case behavior. There is zero filler or tautology. The density is justified by the tool's genuine complexity, and the structure flows logically from what it returns to how to control it to what its limits are.
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 correctly explains the return payload (identity, landmark regions with expansion costs, interactive surface refs, digest/app skeleton, form/table inventories, unread account, and next call). It covers the complex edge cases of shadow roots and iframes thoroughly. The only incompleteness is the unexplained `view` and `detail` parameters, which leaves an agent guessing at part of the input surface. This is a small but real gap in an otherwise comprehensive definition.
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 carries the full parameter-documentation burden. It explains `location` (scopes to one region ref), `budget_tokens` (with a concrete subagent value), `mode` (links at real cost), and `since` (cheap repeat read). However, three of the seven parameters—the required `page`, plus `view` and `detail`—receive no explanation. While `page` is fairly self-evident from the name, `view` and `detail` are not obvious and their interaction with the orientation read is undocumented. This is a genuine gap given the zero schema coverage.
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 precise, specific purpose: 'Read a page as an ORIENTATION, not a transcript, under a token budget it never exceeds whatever the page size.' The verb-resource pair is unmistakable, and the 'not a transcript' contrast actively differentiates it from sibling tools like get_text. An agent immediately knows this is the high-level structural read, not a raw text extraction.
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 embeds strong usage direction: `budget_tokens=2500` suits a subagent, `mode='links'` includes in-prose links, and `since=<read_token>` is the cheap repeat-read strategy with explicit fallback semantics. The 'not a transcript' phrasing plus the open/closed shadow root and same-origin/cross-origin iframe rules tell an agent exactly when this tool is appropriate versus alternatives. It even specifies when the since-read fails over to a full read, which is precisely the kind of decision guidance that matters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_server_infoGet Server InfoARead-only
Report what this server is and what it is running: the product and PyPI package names, the version a client was handed at initialize, the homepage and repository, the sibling servers in the same suite, the tool surface registered in THIS process (how many tools, how many of them are the lite core, which capability packs are loaded and which exist, and the read-only grade and consent scope in force), the test figures measured for this release, and the host Python and platform. Counts come from the live registry, so they describe the process you are connected to rather than the product in general. Needs no browser, opens no page, and reveals no path or user name, so a bug report can carry the output as it stands.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint and openWorldHint, but the description adds meaningful behavior beyond that: it requires no browser, opens no page, leaks no path or username, and reads live registry state rather than reporting product-level generalities. These are exactly the kind of side-effect and privacy disclosures an agent needs before invoking the 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?
Three dense sentences, each earning its place: the first enumerates the full report scope, the second clarifies data freshness and provenance, and the third states safety/privacy implications. Although the first sentence is long, it is information-dense and well structured rather than 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?
With no parameters, no output schema, and only safety annotations, the description carries full responsibility for making the tool callable. It enumerates all return categories, clarifies that counts describe the live connected process, and reassures about side-effect and privacy boundaries. Nothing essential is missing for an agent to invoke and interpret the result.
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 and schema coverage is 100%, so there is nothing for the description to add about parameter meaning. The provided baseline of 4 applies, and the description instead spends its effort on return-content and behavioral detail, which is appropriate.
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 verb and resource: 'Report what this server is and what it is running.' It then enumerates a comprehensive, unique scope—product and package names, version, repo, tool surface, test figures, Python, platform—that clearly separates it from browser-action and workflow siblings. Even without naming other tools, the content makes the tool's distinct purpose unmistakable.
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 usage context: it is safe for bug reports because it 'needs no browser, opens no page, and reveals no path or user name.' It also clarifies that counts are live from the connected process, preventing misinterpretation. However, it does not explicitly name alternative tools or state when not to use it, stopping short of full 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.
get_textGet TextARead-only
Extract readable prose from a page or one region of it, paginated by
start_index so a long article is read in bounded pieces rather than
one unbounded dump. Text arrives as labeled data with its origin stated,
and hidden regions are stripped and counted rather than silently dropped
or silently included. Hidden content IS retrievable, deliberately:
include_hidden=true returns it in a separately labeled section with the
hiding technique named per block. There is no silent middle tier,
because display:none is a real injection channel; the labeled route is
the whole design. Prose inside open shadow roots is read, the same as
get_page_view reads it; closed roots are counted and stay unreadable.
Prose inside same-origin iframes is read after the main document, each
frame under a header naming it and its origin, because one page can
now deliver text from several documents and a single origin in the
label would be a claim about only one of them.
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | ||
| location | No | ||
| max_chars | No | ||
| start_index | No | ||
| include_hidden | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint. The description goes far beyond that: it explains pagination mechanics, how hidden content is handled (stripped, counted, and retrievable via include_hidden with per-block technique naming), the behavior for open vs closed shadow roots, and iframe handling with origin labels. It discloses the absence of a 'silent middle tier' and explains the design rationale. This is exceptionally transparent about side effects and edge cases.
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 dense paragraph, but every sentence adds meaningful behavioral information. It leads with the core purpose, then covers pagination, hidden content, shadow roots, and iframes. There is no filler or repetition, though it could be tightened by moving some design rationale to a separate note. It is front-loaded and structured logically.
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 5 parameters and no output schema, the description is remarkably thorough: it explains the return format (labeled data with origin), pagination, hidden content, shadow roots, and iframes. The main gap is the 'location' parameter, which is only vaguely referenced as 'one region of it' without defining its structure. Also, the exact interaction of max_chars with pagination isn't spelled out, but the general behavior is clear. Overall it covers most of what an agent needs.
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 description coverage for its 5 parameters. The description compensates for start_index (paginated) and include_hidden (returns hidden content in labeled section), and implicitly covers max_chars via 'bounded pieces'. However, the 'location' parameter is never explained beyond 'one region of it', leaving its structure and semantics undocumented. With 0% schema coverage, the description should have covered all parameters; it covers three partially and one not at all.
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 verb and resource: 'Extract readable prose from a page or one region of it'. It immediately distinguishes itself from siblings by mentioning pagination via start_index and explicitly comparing to get_page_view for shadow roots. This is far more specific than a generic 'get text' and leaves no doubt about what the tool does.
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 context for when to use the tool (for bounded, paginated prose extraction, including hidden content) and even references get_page_view to clarify shadow-root behavior. However, it never explicitly states 'use get_text when you need X, use get_page_view when you need Y' or lists exclusions. The guidance is implicit through behavioral description rather than an explicit decision rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workflowsGet WorkflowsARead-only
Get recipes for this server: the cheap-read-then-act pattern, the auth workflow (headed handoff plus saved state), reading strategy, budgeting, troubleshooting a page that will not read, the subagent budget setting, lanes, what each capability pack contains with the exact launch flag that loads it, what a site profile is and where it lives, and how to record and replay a multi-step flow. Packs are chosen at launch rather than at runtime, so this is where you learn which flag you need before restarting. Tool availability reflects the packs this server was started with.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers the safe read-only nature, and the description adds meaningful behavioral context: tool availability reflects the server's launch-time packs alarm, and flags must be discovered here before restart. It does not describe the response format or invalid-topic behavior, but the annotation burden is lower here.
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 purpose is front-loaded and the topic list is compact. The final two sentences about launch-time pack selection are useful but slightly redundant with each other, which costs a point.
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 read-only documentation tool, the description explains what it returns, why it matters, and when to call it. It lacks explicit return-format details and precise parameter behavior, but the optional-topic schema and readOnlyHint annotation make those gaps non-critical.
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, topic, has 0% schema coverage, so the description must compensate. The enumeration of concrete workflow topics gives the agent plausible values, but the description never explicitly maps these to the topic parameter or explains what happens when it is omitted or null. It partially compensates without fully documenting the parameter.
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-resource pair ('Get recipes for this server') and enumerates the specific workflow topics returned, so an agent can tell this is a documentation/how-to tool. It does not explicitly contrast itself with sibling tools like get_server_info, but the listed content is specific enough to prevent serious confusion.
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 when-to-use context: packs are chosen at launch, so this tool is where an agent learns which launch flag is needed before restarting. It does not explicitly name alternative tools or state when not to use it, 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.
manage_sessionManage SessionBDestructive
One session is one browser. open starts one on a chosen lane (the
first navigate of a conversation can open one for you, and says so when
it does); close ends the browser; with auth state saved, the login
survives; the session never does. status reads liveness first, so a
dead browser says so, then lists every session this server holds with its
pages, budgets, and what is shared: sessions belong to the server
process, not to a conversation. capabilities, budget, and
reset_budgets report and manage limits. handoff hands the window to
the human for a login, an MFA prompt, or a bot wall. export_handle and
import_handle move a live session between conversations on this
machine: see get_workflows(task='session-transfer'). lanes is the
local lane database (status, export, import, erase). profiles reloads
site profiles from disk. On open, auth_state loads a saved login,
contexts=2 gives one session two independent cookie jars, and device,
viewport, locale, and timezone set what pages in this session
believe about their environment.
| Name | Required | Description | Default |
|---|---|---|---|
| op | No | ||
| lane | No | ||
| note | No | ||
| path | No | ||
| site | No | ||
| token | No | ||
| action | No | status | |
| device | No | ||
| locale | No | ||
| reason | No | ||
| context | No | ||
| session | No | ||
| contexts | No | ||
| timezone | No | ||
| viewport | No | ||
| auth_state | No | ||
| expires_minutes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (destructiveHint=true, readOnlyHint=false) already flag mutation, and the description adds substantial value on top: close kills the session but saved auth survives, status reads liveness first so dead browsers are reported, and sessions belong to the server process, not the conversation. This ownership and persistence disclosure is exactly the kind of behavior an agent needs and that structured fields cannot convey.
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?
Every sentence is information-dense with no filler, and the core concept is front-loaded in the opening clause. However, the structure is a single unbroken prose paragraph mixing operation semantics, parameter effects, and cross-references; a dispatcher of this complexity would be far more scannable as bullets or an op-to-semantics table.
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 17 parameters, 11 sub-operations, no output schema, and no enums, the description provides substantial orientation: it discloses status output shape, session lifetime, liveness checking, and shared-state semantics. Yet it leaves major gaps — the op/action dispatch relationship, output of most operations, and the meaning of expires_minutes, note, reason, path, site, and token — so it is only partially complete 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 0%, so the description carries the full burden for 17 parameters, but it only explains a subset: auth_state, contexts, device, viewport, locale, timezone, and lane. Critical dispatcher parameters — op, action, session, note, reason, path, site, token, context, expires_minutes — are never mapped to their effects, leaving an agent to guess at the mechanics of calling this 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?
The description anchors on a strong core metaphor ('One session is one browser') and enumerates every sub-operation (open, close, status, handoff, lanes, profiles, etc.), which clearly distinguishes it from siblings like get_page_view, navigate, and monitor. However, 'manage session' is a generic dispatcher verb, and the purpose must be excavated from a dense wall of text rather than stated as a crisp mission.
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 real usage context: it tells the agent that the first navigate may auto-open a session, that handoff is for login/MFA/bot walls, and explicitly points to get_workflows(task='session-transfer') for session transfer. But it never states when NOT to use this tool versus siblings such as monitor or manage_tabs, and per-operation selection guidance is minimal for a dispatcher with 11 operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_tabsManage TabsADestructive
List, open, select, or close tabs, report which is focused, and
capture pages a click opened in a popup. Mints and returns the explicit
page handles every other tool accepts, which is how browser state
survives across calls without relying on protocol sessions. Closing a
page invalidates its refs and its delta read tokens, and the result says
so rather than leaving a later failure to explain it. On a session with
more than one cookie jar, context says which jar a new tab opens in
and every listed page says which jar it belongs to.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| page | No | ||
| action | No | list | |
| context | No | ||
| session | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already signal mutation and destructiveness (readOnlyHint=false, destructiveHint=true), and the description adds valuable behavioral detail: closing a page 'invalidates its refs and its delta read tokens,' and the result announces this instead of leaving a later failure. It also reveals the cookie-jar context behavior, going beyond the structured annotation hints.
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 dense but each sentence earns its place: the action list, the handle mechanism, the invalidation consequence, and the cookie-jar context. It is front-loaded with what the tool does, though the later sentences are somewhat intricate for the available parameter detail.
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 multi-operation, destructive tool with five parameters, no output schema, and no enum constraints, yet the description leaves the parameter model largely implicit. It does not explain the allowed `action` values or how to request 'report which is focused' or 'capture pages a click opened in a popup,' so an agent cannot reliably construct a correct call from the definition alone.
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, but it only meaningfully explains `context`. The description implies action-related behaviors and page/session concepts, but it never maps parameters like `action`, `url`, `page`, or `session` to concrete values or usage, leaving the agent to guess how to invoke each operation.
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 verb list and resource: 'List, open, select, or close tabs, report which is focused, and capture pages a click opened in a popup.' It also states the tool's unique role by explaining it mints 'explicit page handles every other tool accepts,' which distinguishes it from the sibling tools that consume those handles.
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 clearly conveys when to use the tool: to manage tabs and, importantly, to obtain the page handles that other tools depend on for state across calls. It does not explicitly name alternatives or give when-not-to-use guidance, 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.
monitorWatch a URL for ChangeADestructive
Watches one URL for one deterministic change while this server runs. Four conditions: content_hash, text_appears, text_gone, selector_count; the same page state always answers the same way. Nothing is pushed anywhere: report is how you ask what happened, and check_now forces a check. A monitor that could not check reports stale with the failure, never unchanged. Checks run in a dedicated headless session, never the caller's. There is a floor on the interval and caps on monitors and daily checks; a 429 is honored rather than retried; a monitor that keeps failing pauses itself.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| label | No | ||
| since | No | ||
| value | No | ||
| action | No | report | |
| monitor | No | ||
| selector | No | ||
| condition | No | ||
| check_interval_minutes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses deterministic evaluation, no push delivery, stale-on-failure reporting, dedicated headless session, interval floors and quotas, honoring 429s without retry, and auto-pause on repeated failure. This is exemplary behavioral disclosure and does not contradict readOnlyHint/destructiveHint.
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 text is dense but every sentence adds a distinct constraint or behavior, and the most important information about scope is front-loaded. No filler or redundant restatement 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?
The behavioral context is unusually complete for a 9-parameter tool with no output schema, and it even hints at report semantics. Yet an agent still cannot fully infer how to create/select a monitor, what `since` and `label` mean, or what the exact response shape is, leaving operational 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?
With 0% schema coverage, the description must carry parameter meaning, and it does name the four condition values and report/check_now actions while indirectly suggesting url, selector, value, and interval. However, label, since, and monitor remain unexplained, and no parameter requirements per condition are spelled out, so it only partially compensates.
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 opening line 'Watches one URL for one deterministic change while this server runs' states a specific action, resource, and scope, and the four condition names make the function concrete. It does not name a sibling for contrast, so it misses the explicit differentiation needed for 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 description makes the intended use implicit: a long-running watcher for one deterministic page change, with 'report' and 'check_now' as the query/force actions. It never says when to prefer this over siblings like wait_for or get_page_view, so the agent is left to infer tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scrollScrollA
Scroll by an amount, to a named element, to the end, or inside a specific container, plus a next-chunk mode that remembers position across calls so a long page is walked without re-reading it. Reports how much content is now reachable and how much remains below, and names virtualized containers where the DOM holds far fewer rows than the page claims, rather than presenting a partial list as complete.
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | ||
| action | No | by | |
| amount | No | ||
| location | No | ||
| timeout_ms | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description reveals meaningful behavior: it remembers scroll position across calls in next-chunk mode, reports reachable vs. remaining content, and explicitly identifies virtualized containers instead of presenting a partial view as complete. This is valuable transparency that annotations alone do not provide.
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 two dense sentences with no filler. It front-loads the primary action modes and then adds behavioral reporting details, making it easy to scan while still packing relevant 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?
It covers the main behaviors and high-level return information, but because there is no output schema, it lacks specifics about the exact response format. It also does not define the action enum values or the semantics of timeout_ms, leaving some gaps for an agent trying to invoke the tool precisely.
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 alludes to action modes and 'location' as a named element/container, but it never explains allowed action values, the exact meaning of amount, how page is used, or timeout behavior. The description gives only loose mapping to the five 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?
The description states a specific verb ('scroll') and enumerates distinct modes: by amount, to a named element, to the end, within a container, and a next-chunk mode. This makes the tool's purpose concrete and clearly distinguishes it from general navigation siblings like navigate or wait_for.
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 context for when the next-chunk mode is useful ('a long page is walked without re-reading it') and for virtualized-container handling. However, it does not explicitly state when to choose this tool over siblings such as get_page_view, navigate, or find_elements, nor does it provide exclusions or alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_forWait ForADestructive
Wait for text to appear or disappear, an element to reach a state, a URL
to match, or a JS predicate to hold. EVERY condition is checked against the
current state first and returns immediately when it already holds, so a
wait issued after the thing already happened costs nothing instead of
timing out (a URL wait could otherwise expire on a navigation that had
already finished). A url value without wildcards matches as a substring;
use * and ? for globbing. Real timeouts, and a failure that says what was
awaited and what was observed instead.
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | ||
| value | No | ||
| location | No | ||
| condition | Yes | ||
| timeout_ms | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly=false, openWorld=true, destructive=true; the description adds genuinely non-obvious traits beyond that: check-current-state-first semantics that prevent spurious timeouts, glob vs substring matching on URLs, enforcement of real (not clamped) timeouts, and failure output that names what was awaited versus observed. It does not reconcile the 'destructive' annotation, which is unexpected for a wait, but it does not contradict it either.
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 purpose is front-loaded in sentence one, and the remaining sentences carry distinct facts (check-first behavior, glob rule, failure reporting). It is somewhat dense, and the parenthetical about a URL wait expiring on a finished navigation could be trimmed without loss.
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 and annotations that say little about runtime behavior, the description does cover return/failure behavior and timing semantics well. However, for a five-parameter tool at 0% schema coverage, leaving 'value', 'location', and 'timeout_ms' unexplained leaves the agent to guess how each maps to a condition type.
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 bears the full param burden for five parameters. It clarifies condition semantics and the wildcard/substring rule for URL values, but 'value' and 'location' are never tied to their roles and timeout_ms is only alluded to via 'real timeouts', so compensation is partial.
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 opening sentence gives a precise verb and enumerates the four condition kinds the tool handles (text appear/disappear, element state, URL match, JS predicate), so the agent knows exactly what this is for. It never names or contrasts with siblings like find_elements or get_text, so it stops just short of full sibling 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?
The description gives real usage context: every condition is check-first and returns immediately when already satisfied, so a wait after the fact is free rather than a timeout. That's actionable guidance on when this is safe to use, but there is no explicit statement of when NOT to use it or which sibling to prefer for a plain immediate check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v1.0.1- Added
get_server_info
11 tool updates
v1.0.0- First observed
find_elements - First observed
get_audit - First observed
get_page_view - First observed
get_text - First observed
get_workflows - First observed
manage_session - First observed
manage_tabs - First observed
monitor - First observed
navigate - First observed
scroll - First observed
wait_for
TDQS
Scored across 12 tools
Most tools target clearly distinct operations (navigate, scroll, wait_for, monitor, manage_tabs, manage_session, get_audit, get_server_info, get_workflows), and the reading tools (get_page_view, find_elements, get_text) are carefully differentiated by purpose. However, get_page_view/find_elements/get_text all touch page content and could be confused by a less careful agent, with the descriptions doing the heavy lifting to separate them.
Nearly all names are snake_case and follow a verb_noun pattern (manage_tabs, get_audit, get_page_view, find_elements, get_text, manage_session, get_workflows, get_server_info). A few devolve to bare verbs (navigate, scroll, monitor) or a non-verb (wait_for), but the convention is predictable overall.
Twelve tools is well-scoped for a browser-automation server: navigation, reading, search, tab/session management, monitoring, waiting, and meta tools each earn a distinct place. No padding or obvious redundancy.
The surface covers navigation, reading, searching, tab/session lifecycle, monitoring, and meta info well, but it repeatedly promises 'refs you can act on' with no click, type/fill, screenshot, or evaluate/JS tool present. For a web-interaction server, missing the action primitives is a notable gap that would create dead ends.
Maintenance
Related MCP Connectors
Control a real browser from AI agents: navigate, click, type, screenshot, read the page.
1Web pages and PDFs as clean Markdown/JSON for agents, in far fewer tokens. Honest, uncharged errors.
Hosted browser for agents: open pages, search the web, extract data, read PDFs and take screenshots.
Web pages as clean Markdown and JSON for AI agents, in fewer tokens, with an Evidence Record.
Related MCP Servers
- AlicenseBqualityBmaintenanceEnables LLMs to interact with web pages, take screenshots, and execute JavaScript in a real browser environment10189 npm297MIT
- FlicenseAqualityDmaintenanceEnables LLM agents to browse and interact with web pages using a stealth Chromium browser, with an accessibility-tree interface for low token usage.12-
- AlicenseBqualityBmaintenanceEnables LLM agents to automate web browsers with token-efficient perception, stealth anti-detection, captcha solving, network interception, and isolated persistent sessions.51MIT
- AlicenseNot gradedqualityAmaintenanceEnables LLM agents to fetch web pages and receive clean, readable markdown with token budgeting and link extraction.1MIT