Ghostlight
Ghostlight is a browser automation MCP server that lets AI agents control a real Chromium browser (with your existing session/cookies) in a visible, local, and governed manner. It provides:
Tab & Session Management: Create, list, focus, reload, close tabs in a dedicated group; resize window; get tab context.
Navigation: Navigate URLs, forward/back history.
Interaction & Input: Mouse (click, drag, hover, scroll, zoom), keyboard (type, key presses), and form filling (by ref or label, with submit); file/image uploads.
Page Analysis: Extract accessibility tree (with diffs), raw text, find elements by natural language, read console/network logs.
JavaScript Execution: Run arbitrary code in page context.
Workflow Automation: Execute scripted sequences of tool calls with batching, inter-step data flow, and dry-run; wait for conditions or settlement.
Monitoring & Debugging: Inspect/dismiss JavaScript dialogs, record sessions as animated GIFs.
User Feedback & Governance: Present plans for approval, show narration ribbons; apply capability policies, audit actions, protect sacred domains; no telemetry/subscription.
Provides browser automation and an agent workspace inside the Brave browser, enabling agents to navigate, read pages, fill forms, upload files, and interact with the signed-in session in a dedicated tab group.
Click on "Install 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., "@GhostlightFill out the expense report on our HR portal and submit it"
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.
Your agent needs a page you are signed in to. The usual answer is a second, empty browser that knows none of your sessions, driven by a model that has to learn Chrome internals to get anything done.
Ghostlight gives it a tab group inside the Chromium you already have open. The work happens in front of you: watch it, pause it, take the wheel, or end the session. The model says what it wants, and Ghostlight does the browser part.
Ask an agent to read a page, complete a form, handle a file, follow a popup, or investigate a failed web workflow. Ghostlight carries the task across tabs and browser changes while keeping the browser work and its controls on your machine.
A light left burning, so the halls stay safe.
Where it stands today
The published release is 1.3. It is available as the GitHub release
v1.3.2, the npm package
ghostlight@1.3.2, the Chrome Web Store adapter v1.0.0 (adapter 1.1.0 is in review), and the
MCP Registry record org.sylin/ghostlight 1.3.2, all observed on 2026-09-02 and recorded in
docs/public-status.json.
Related MCP server: Scout
What you get
24 catalog tools: 23 browser tools covering tabs, navigation, reading a page, screenshots, semantic clicks and hovers, form input, file upload, scripts, waits, short sequences, and dialogs, plus one policy tool that explains the authority in force. One call carries the intent; Ghostlight performs the browser steps behind it.
One truthful answer per call: what happened, what changed in the browser, what is ready, and whether running it again is safe. Ghostlight writes that answer, never the page, and adds at most two recovery steps of its own. When an effect is uncertain it says so rather than guessing, and never proposes a replay that could submit a form twice.
A desktop workbench in the tray that shows work as it happens.
Your machine, and only your machine. Ghostlight runs as you, reaches your browser over local IPC, and keeps a payload-free local record. No account, no telemetry, no activation service, no update ping, no hosted control plane, and no second hidden browser. The only network traffic is the browsing you asked for.
Your first five minutes
You need Chrome, Edge, Brave, or Chromium 116+, an MCP client, and Node.js for the installer. The service you run afterward is native Rust.
Install Ghostlight and register the MCP clients it finds:
npx -y ghostlight installAdd Ghostlight in Browser from the Chrome Web Store.
Restart an MCP client if it does not hot-reload tools.
Give it one small, read-only task:
Open https://example.com/ in a new Ghostlight tab, summarize the page, and tell me which tab you used. Do not click, type, submit, or change the page.
A sky-blue Ghostlight group should appear in your browser. The agent opens the page, reads it, and names the exact tab it used. That one prompt proves the whole connection without authorizing a click or write. Next time, it reuses that group and the nearest tab it already owns on that site, so repeated work stops littering your tab strip.
If a step needs attention, run:
npx -y ghostlight doctordoctor checks the client entry, local service, browser connection, and extension, then names the
next action. The installation guide covers targeted clients, source
builds, updates, uninstall, and symptom-led recovery.
From one page to a whole workflow
Ghostlight is at its best when browser work has a thread to follow:
Pick up where you are signed in. Open an application in the Chromium profile you chose and work with the session already there. Credentials stay with the browser.
Finish the interaction. Navigate, fill forms, upload files, resolve dialogs, wait for page state, and carry results from one step into the next.
Follow the browser. Keep working when a site opens a supported child tab or when a known workspace changes underneath the task.
See what failed. Bring page state, console messages, and network requests together so the next debugging step comes from evidence instead of guesswork.
Use the same browser capability from Codex, Claude Code, Claude Desktop, Cursor, VS Code, Windsurf, Zed, OpenCode, Crush, or another compatible stdio MCP client. Agents receive structured page reads, exact element references, bounded action receipts, and specific recovery guidance. They can ask the policy tool to explain the authority in force at any moment.
The browser stays a shared space
Ghostlight works in a dedicated sky-blue tab group inside the browser window you chose. Page scans, clicks, typing, drags, and longer phases share one visual language, so the movement on screen has an explanation.
Pause the workspace, take over for a delicate step, or stop it. Move its tabs where you want them; Ghostlight follows the workspace instead of snapping it back. Ordinary tabs remain outside the agent's owned set.
Closing a tab needs two independent yes votes: the orchestrator's authority, and the browser's own preserve-tabs setting, which ships on. That keeps the evidence of what happened in front of you. Closing a tab yourself always works.
Personal use is complete without a policy manifest. Start with the full browser engine and get
useful work done. When a workflow needs stronger boundaries, grant read, action, write, and
execute capabilities by MCP identity and domain. Add sacred domains, dry-run preflight, and
structured audit while the browser experience stays the same. The
governance guide shows the operating model, and the
Trust Center carries the security, privacy, continuity, deployment, and
procurement evidence.
What it will and will not do
With no policy configured, ordinary remote HTTP(S) browsing is allowed. Loopback addresses, link-local metadata endpoints, non-HTTP schemes, credential fields, and stale handles stay protected regardless. Optional local and managed policy layers can only take capability away, and per-request restrictions narrow things further. Nothing hands access back.
Credential-class fields come to you. Ghostlight does not type secrets.
The audit record holds identifiers, decisions, and content-minimized measurements: which tool ran,
whether authority allowed it, how long it took, and what it did -- 3 fields, 1,240 words, 1280x720.
The site an action landed on is named, because that answers where your agent went and is already in
your own tab strip. Paths, queries, fragments, page text, field values, screenshots, selectors, and
dialog text never enter it. docs/guides/siem-integration.md is
the exact record shape.
The full catalog is in docs/1.0/LANGUAGE.md, and the exact policy schema
is in docs/guides/governance-configuration.md.
The workbench
Open the tray icon and you land At a glance: the action running right now in full, finished actions stacking below it, newest first, each in Ghostlight's own words -- "Opened example.com.", "Read 1,240 words.", "Filled 3 fields and submitted the form." -- never the page's. Beside it sit MCP integrations, which connects the coding clients you already have and merges into their configuration with a backup; Status, which answers whether the stack is healthy; Policy, which states what the current rules allow, one plain line per capability, naming the layer that decided each one; and About, which carries the promise underneath it: it never phones home.
Pause and resume sit in the header beside the lamp, the same control the tray offers. Closing the window returns it to the tray and leaves the authority running. If the desktop shell cannot start, Ghostlight exits instead of leaving an invisible authority.
Build it from source
Rust 1.82 or newer, plus Chromium 116 or newer for browser validation.
cargo build --workspaceThree executables land side by side:
ghostlight-- the orchestrator and the desktop workbench;ghostlight-mcp-connector-- the MCP stdio edge;ghostlight-browser-connector-- the Chromium native-messaging relay.
target/debug/ghostlight openThat shows the workbench, or focuses the one already running. Then open MCP integrations,
connect the client you want, and restart or reconnect it. docs/DEV-LOOP.md
covers browser registration and the full validation loop.
After that first setup there is no startup ritual: launching a connected MCP client or Chromium demand-starts Ghostlight when it is not already running. There is no service-only launch mode.
The one-command install is the primary journey:
npx -y ghostlight installSigned-checksum native packages, portable archives, and a self-contained Claude Desktop MCPB are equivalent release routes. Every route uses the matching store adapter and the same three native executables.
Platform state. Windows and Linux are the supported 1.0 platforms, verified against live browsers on development hosts; the clean installed-product evidence lanes continue after publication. macOS has no 1.0 artifact yet.
Extension state. The Chrome Web Store listing serves adapter v1.0.0, matching the published 1.0.0 service line.
The service and Chrome adapter version independently. The compatibility map is authoritative, and the public status file owns current release, platform, and store state.
The MCP edge negotiates a compatible stdio revision per client; the compatibility map records them. See the changelog for release changes and upgrade consequences.
MCP Client <--stdio--> ghostlight-mcp-connector <--typed IPC--> ghostlight orchestrator
<--browser IPC--> ghostlight-browser-connector <--native messaging--> Extension <--CDP--> BrowserThe orchestrator makes every product decision and owns everything the model reads. The two connectors carry protocol and relay lifecycle, nothing more. The extension owns Chromium, the page, and the drawing, and never policy. Adding a feature normally means changing the orchestrator alone; that is a contract the shores are held to, not a happy accident.
The desktop is a presentation adapter inside the same process, not a second service. It has no GUI
protocol, command runner, filesystem access, or browser primitives.
ADR-0102 records why.
docs/SPEC.md gives the deeper governance model.
Choose your next step
I want to... | Start here |
Install, verify, update, recover, or uninstall | |
Let an AI client perform setup | |
Try a complete visible workflow | |
Build from source and test locally | |
Understand which browser operating model fits | |
Add boundaries or review trust evidence | |
Read the product promise and journeys | |
Read the complete model-facing language | |
Read the architecture and acceptance contracts | |
See where the candidate stands | |
Contribute code, docs, testing, or ideas | |
Read every decision, and why |
License and continuity
Ghostlight is entirely free and open source: everything in this repository, including the
governance module, is Apache-2.0 OR MIT. LICENSING.md explains what that
covers. The former open-core split and its paid tiers were withdrawn by
ADR-0140.
License state never reaches runtime -- there is no license check to reach it. An installed copy keeps working on its own terms, with no check-in and no expiry. The Continuity Promise carries the durable version of that.
Questions and contributions
GitHub Issues for reproducible defects, GitHub Discussions for questions and ideas, and hello@sylin.org for security, licensing, or anything that should not be public.
I build Ghostlight in partnership with AI coding agents.
CONTRIBUTING.md explains the current boundaries and the gates every change
passes.
Available Tools
25 toolsact_onA
Resolve one visible element by ref or accessible meaning, perform one action, and return a bounded observation receipt. Use this when the target should be unique and you want to avoid a separate find, action, and wait loop. Ambiguous semantic matches are reported without acting.
| Name | Required | Description | Default |
|---|---|---|---|
| tabId | Yes | Tab ID containing the target. Use tabs_context first if you do not have one. | |
| value | No | Value for set_value only. | |
| action | Yes | One interaction to perform after unique target resolution. | |
| expect | No | Optional postcondition. Provide exactly one of selector or text; the action and observation remain one governed call. | |
| target | Yes | Exactly one of ref, query, or name. A semantic tie is returned without acting. |
Output Schema
| Name | Required | Description |
|---|---|---|
| wait | No | |
| candidates | No | |
| provenance | No | |
| interactionReceipt | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It discloses that exactly one action is performed, a bounded observation receipt is returned, and ambiguity prevents action. However, it does not elaborate on side effects, permissions, or failure modes beyond ambiguity, which keeps it from a 5.
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 consists of three concise sentences, with the purpose front-loaded. Every sentence adds value—defining the action, usage context, and ambiguity behavior—with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 5 parameters, nested objects, an action enum, and an optional expect postcondition. The description covers unique targeting, ambiguity handling, and the bounded receipt, which are the non-obvious behaviors. The schema and output schema handle the remaining parameter and return details, so the description is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% description coverage for all parameters, including detailed notes on target ('Exactly one of ref, query, or name') and expect. The description only reinforces the concept of 'ref or accessible meaning' without adding new parameter-level syntax or constraints.
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 tool's function: 'Resolve one visible element by ref or accessible meaning, perform one action, and return a bounded observation receipt.' It uses a specific verb (resolve, perform, return) and resource (visible element), and distinguishes itself from a separate find, action, and wait loop.
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?
Explicit guidance is given: 'Use this when the target should be unique and you want to avoid a separate find, action, and wait loop.' It also signals a when-not case by stating that ambiguous semantic matches are reported without acting.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_batchA
Execute a sequence of browser tool calls in ONE round trip. Each item is {name, input} where input is exactly what you'd pass to that tool standalone. Actions execute SEQUENTIALLY (not in parallel) and stop on the first error. Use this tool extensively to quickly execute work whenever you can predict two or more steps ahead -- e.g. navigate, click a field, type, press Return, screenshot. Each tool's own permission check runs per item -- if an action navigates to a domain without permission, the next item's check fails and the batch stops. Screenshots and other images are returned interleaved with outputs; coordinates you write in THIS batch refer to the screenshot taken BEFORE this call. browser_batch cannot be nested.
| Name | Required | Description | Default |
|---|---|---|---|
| actions | Yes | List of tool calls to execute sequentially. Example: [{"name":"computer","input":{"action":"left_click","coordinate":[100,200],"tabId":123}}, {"name":"computer","input":{"action":"type","text":"hello","tabId":123}}, {"name":"navigate","input":{"url":"https://example.com","tabId":123}}] |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the burden and excels. It discloses sequential execution, stopping on first error, per-item permission checks, interleaved image outputs, and the critical detail that coordinates refer to the pre-batch screenshot.
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, well-organized paragraph. Every sentence conveys essential operational or usage information, and it is front-loaded with the core purpose before diving into details.
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 the tool's complexity and absence of output schema, the description thoroughly covers operational semantics, usage context, error behavior, and image handling. It provides everything an agent needs to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaning beyond the schema by defining the input contract: each item is {name, input} where input is exactly what you'd pass standalone. It also adds the coordinate-reference caveat, which is not present in the schema.
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 'Execute a sequence of browser tool calls in ONE round trip' and explains the item structure. This specific verb+resource combination distinguishes it from sibling tools like navigate or computer by emphasizing batching.
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?
Explicit guidance says 'Use this tool extensively to quickly execute work whenever you can predict two or more steps ahead' with examples. It also notes a key limitation ('browser_batch cannot be nested'), helping agents decide when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
computerB
Use a mouse and keyboard to interact with a web browser, and take screenshots. If you don't have a valid tab ID, use tabs_context first to get available tabs.
Whenever you intend to click on an element like an icon, you should consult a screenshot to determine the coordinates of the element before moving the cursor.
If you tried clicking on a program or link but it failed to load, even after waiting, try adjusting your click location so that the tip of the cursor visually falls on the element that you want to click.
Make sure to click any buttons, links, icons, etc with the cursor tip in the center of the element. Don't click boxes on their edges unless asked.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element reference ID from read_page or find tools (e.g., "ref_1", "ref_2"). Required for `scroll_to` action. Can be used as alternative to `coordinate` for click actions. | |
| text | No | The text to type (for `type` action) or the key(s) to press (for `key` action). For `key` action: Provide space-separated keys (e.g., "Backspace Backspace Delete"). Supports keyboard shortcuts using the platform's modifier key (use "cmd" on Mac, "ctrl" on Windows/Linux, e.g., "cmd+a" or "ctrl+a" for select all). | |
| tabId | Yes | Tab ID to execute the action on. Must be a tab in the current group. Use tabs_context first if you don't have a valid tab ID. | |
| action | Yes | The action to perform: * `left_click`: Click the left mouse button at the specified coordinates. * `right_click`: Click the right mouse button at the specified coordinates to open context menus. * `double_click`: Double-click the left mouse button at the specified coordinates. * `triple_click`: Triple-click the left mouse button at the specified coordinates. * `type`: Type a string of text. * `screenshot`: Take a screenshot of the screen. * `wait`: Wait for a specified number of seconds. * `scroll`: Scroll up, down, left, or right at the specified coordinates. * `key`: Press a specific keyboard key. * `left_click_drag`: Drag from start_coordinate to coordinate. * `zoom`: Take a screenshot of a specific region for closer inspection. * `scroll_to`: Scroll an element into view using its element reference ID from read_page or find tools. * `hover`: Move the mouse cursor to the specified coordinates or element without clicking. Useful for revealing tooltips, dropdown menus, or triggering hover states. | |
| region | No | (x0, y0, x1, y1): The rectangular region to capture for `zoom`. Coordinates define a rectangle from top-left (x0, y0) to bottom-right (x1, y1) in pixels from the viewport origin. Required for `zoom` action. Useful for inspecting small UI elements like icons, buttons, or text. | |
| repeat | No | Number of times to repeat the key sequence. Only applicable for `key` action. Must be a positive integer between 1 and 100. Default is 1. Useful for navigation tasks like pressing arrow keys multiple times. | |
| duration | No | The number of seconds to wait. Required for `wait`. Maximum 10 seconds. | |
| modifiers | No | Modifier keys for click actions. Supports: "ctrl", "shift", "alt", "cmd" (or "meta"), "win" (or "windows"). Can be combined with "+" (e.g., "ctrl+shift", "cmd+alt"). Optional. | |
| coordinate | No | (x, y): The x (pixels from the left edge) and y (pixels from the top edge) coordinates. Required for `left_click`, `right_click`, `double_click`, `triple_click`, and `scroll`. For `left_click_drag`, this is the end position. | |
| scroll_amount | No | The number of scroll wheel ticks. Optional for `scroll`, defaults to 3. | |
| scroll_direction | No | The direction to scroll. Required for `scroll`. | |
| start_coordinate | No | (x, y): The starting coordinates for `left_click_drag`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| provenance | No | |
| interactionReceipt | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It reveals that operations are coordinate-driven and require screenshots for positioning, as seen in the bullet about consulting a screenshot before clicking. It also hints at potential failure and recovery ('try adjusting your click location'). This is useful context, but it doesn't cover other behavioral aspects like how failed actions are returned, whether actions are asynchronous, or any side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately concise, with a high-level opening sentence followed by three focused bullet points that provide actionable tips. Each sentence earns its place, and the structure makes it easy to scan. It avoids redundancy with 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?
Given the tool's complexity (12 parameters, many actions, broad capabilities), the description provides a reasonable overview but leaves several aspects implied rather than explicit. It covers the core interaction pattern and prerequisite (tab ID), but doesn't discuss how to choose among actions or handle different scenarios. The presence of an output schema reduces the need to explain return values, so completeness is adequate but not rich.
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 100%, so the parameters are already well-documented in the schema. The description adds minimal extra parameter meaning beyond reinforcing the use of tabs_context for tabId and the need for coordinates when clicking. The baseline of 3 applies because the schema does the heavy lifting; the description doesn't need to compensate and doesn't add substantial value.
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 tool's role: using a mouse and keyboard to interact with a web browser and take screenshots. It distinguishes itself from sibling tools like navigate or read_page by focusing on low-level input actions. However, it could be more explicit about the set of actions (click, type, scroll) rather than relying on the schema.
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 some guidance on when to use the tool, especially related to handling tab IDs: 'If you don't have a valid tab ID, use tabs_context first'. It also gives practical tips for click accuracy (consulting screenshots, adjusting click position, clicking centers). However, it doesn't explicitly compare to alternatives like act_on or form_fill, so the 'when vs alternatives' aspect is only partially addressed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dialogA
Inspect or explicitly resolve the JavaScript dialog blocking one owned tab. Use status when the dialog state is unknown. Never accept, dismiss, or respond without intent from the current task.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Prompt response text. Required only for respond. | |
| tabId | Yes | Tab ID to inspect or resolve. The tab must belong to this Ghostlight session. | |
| action | Yes | Inspect the current dialog or explicitly resolve it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral disclosure. It reveals that the tool can inspect or resolve dialogs, that dialogs 'block' a tab, and that acceptance/dismissal/response should only occur with task intent. This highlights the safety implications of the mutating actions, though it does not detail what status returns or what happens if no dialog is present.
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 sentences, immediately front-loaded with the core functionality, and a follow-up safety guideline. There is no wasted wording, and every clause contributes either to purpose or proper use.
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 the moderate complexity (3 params, conditional text, no annotations) and the presence of an output schema, the description covers the essential use cases and safety rules. It could mention edge cases like absent dialogs or the standalone behavior of accept/dismiss, but it is sufficiently complete for an experienced agent to operate 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 coverage is 100%, so the baseline is 3. The description adds semantic value by framing the action parameter: 'status' for inspection, and the other actions as explicit resolution steps requiring intent. This clarifies the enum values beyond their schema descriptions, even though the text parameter is not elaborated beyond the schema.
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 tool's purpose with specific verb and resource: 'Inspect or explicitly resolve the JavaScript dialog blocking one owned tab.' It distinguishes the tool from siblings by focusing on JavaScript dialogs and adds scoping ('one owned tab') that clarifies its domain.
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 explicit usage guidance: 'Use status when the dialog state is unknown' and 'Never accept, dismiss, or respond without intent from the current task.' This gives clear direction on when to use the status action vs. mutating actions, though it does not explicitly name alternatives or when not to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explainA
Returns this server's action directory: every available action, the capability it requires (read, action, write, or execute; some require none), and a short description of what it does, plus definitions of the capability vocabulary. Use it to learn what you are allowed to do in this session. It does not read, summarize, or explain web pages.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly indicates this is a passive, read-only introspection tool by describing its output and stating it does not access web pages. It could be more explicit about not modifying anything, but the wording strongly implies a non-destructive operation.
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 extremely concise, consisting of two sentences that front-load the core purpose. The first sentence details the output, and the second provides usage guidance and a key distinction from sibling tools. Every word earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters and no output schema, the description fully explains what it returns (the action directory, capabilities, and definitions) and what it does not do. It is sufficient for an agent to select and invoke the tool appropriately without further clarification.
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 nothing for the description to explain. The baseline score of 4 applies since no parameter information is needed. The description adds no parameter details, but that is appropriate for a parameterless 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 clearly states the tool returns the server's action directory, including available actions, required capabilities, and short descriptions. It also explicitly distinguishes itself from web-content tools by stating it does not read, summarize, or explain web pages, which sets it apart from sibling tools like get_page_text or narrate.
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 says to use it to learn what you are allowed to do in this session, providing a clear use case. It also gives an exclusion ('does not read, summarize, or explain web pages'), which implies when not to use it, effectively steering users toward alternative tools for web content tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
file_uploadA
Upload one or multiple files to a file input element on the page. Do not click on file upload buttons or file inputs -- clicking opens a native file picker dialog that you cannot see or interact with. Instead, use read_page or find to locate the file input element, then use this tool with its ref to upload files directly.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | Element reference ID of the file input from read_page or find tools (e.g., "ref_1", "ref_2"). | |
| files | No | Files to upload, as base64-encoded bytes. | |
| paths | No | DEPRECATED. Use `files` instead. | |
| tabId | Yes | Tab ID where the file input is located. Use tabs_context first if you don't have a valid tab ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| provenance | No | |
| interactionReceipt | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It reveals the key pitfall: clicking on file upload buttons/inputs opens a native dialog the agent cannot interact with, and that direct upload via ref is the intended method. It does not discuss other behaviors such as file size limits or event triggering, but the output schema covers return values.
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 sentences, front-loaded with the action, and every sentence contributes value. The first sentence states the function, the second gives essential guidance and a warning.
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 a 100% schema coverage and an output schema, the description sufficiently covers the tool's usage: it tells the agent how to obtain the ref, what to avoid, and how to perform the upload. It does not leave major gaps for the agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds no additional parameter semantics beyond what the schema provides; it only references 'ref' conceptually, which the schema already defines. The 'files' and 'paths' parameters are not elaborated in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('upload') with a clear resource ('file input element on the page') and scope (one or multiple files). It also distinguishes from sibling tools by explicitly instructing not to click the file input button, which would open a native picker, and directing to use read_page/find to locate the element first.
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 provides explicit when-to-use guidance: locate the file input with read_page or find, then use this tool with the ref. It also tells what to avoid (clicking), which is crucial for the agent. While it doesn't enumerate alternative upload tools, the context of file inputs makes the usage unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
findA
Find elements on the page using natural language. Can search for elements by their purpose (e.g., "search bar", "login button") or by text content (e.g., "organic mango product"). Returns up to 20 matching elements with references that can be used with other tools. If more than 20 matches exist, you'll be notified to use a more specific query. If you don't have a valid tab ID, use tabs_context first to get available tabs.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Natural language description of what to find (e.g., "search bar", "add to cart button", "product title containing organic") | |
| tabId | Yes | Tab ID to search in. Must be a tab in the current group. Use tabs_context first if you don't have a valid tab ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| more | Yes | |
| results | Yes | |
| provenance | 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 of behavioral disclosure. It transparently states the 20-match limit and the notification for more specific queries, as well as the prerequisite for a valid tab ID. It does not explicitly mention whether the operation is read-only or describe the format of the returned references, leaving some ambiguity.
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, well-structured paragraph that front-loads the purpose. It includes examples, return limits, and a prerequisite, with every sentence adding value. There is no redundancy or unnecessary 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?
Given the simple two-parameter schema and an output schema that likely defines return values, the description covers all essential context: what the tool does, how to query, result limits, and the prerequisite for tab IDs. No significant gaps are apparent for an effective selection and 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 input schema provides 100% coverage with detailed descriptions and examples for both parameters (query and tabId). The description adds natural language examples and the tabs_context referral, but this primarily reinforces usage rather than contributing new parameter-level semantics. Baseline 3 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 clearly defines the tool's purpose: 'Find elements on the page using natural language.' It specifies search by purpose or text content, distinguishing it from sibling tools like act_on or form_input which interact with elements. The verb-resource pairing is specific and 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 explains when to use the tool (searching for elements via natural language) and provides refinement guidance when more than 20 matches exist. It also directs users to use tabs_context first if no valid tab ID is available. However, it does not explicitly exclude alternative tools for similar tasks, such as get_page_text for reading text content.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
form_fillA
Fill a form by field labels in one call. Provide fields as a map from a label, placeholder, or name attribute to the value (string, number, or boolean for checkboxes). Matching is case-insensitive and specificity-ordered; ambiguous keys are returned unmatched with candidates instead of guessed. submit:true clicks the form's own submit control after filling. Passwords are masked in the result. Falls back cleanly: anything unmatched can be filled with form_input using the refs in the result.
| Name | Required | Description | Default |
|---|---|---|---|
| tabId | Yes | Tab ID the form lives in. Use tabs_context first if you don't have a valid tab ID. | |
| fields | Yes | Map from a field's label, placeholder, or name attribute to the value to set (string, number, or boolean for checkboxes). | |
| submit | No | Click the form's own submit control after filling. Default false (fill only). |
Output Schema
| Name | Required | Description |
|---|---|---|
| filled | Yes | |
| skipped | Yes | |
| submitted | Yes | |
| unmatched | Yes | |
| provenance | No | |
| submit_ref | No | |
| duration_ms | Yes | |
| observation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden and does so admirably: it discloses case-insensitive matching, specificity ordering, ambiguous-key handling, submit behavior, password masking, and the fallback behavior. This goes well beyond a basic 'fill a form' statement.
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 every sentence earns its place. It front-loads the primary purpose, then covers matching, submit, security, and fallback in a logical order. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the description is complete: it covers prerequisites (tabId from tabs_context), input format, matching behavior, submit option, password masking, and fallback. It even mentions refs in the result for fallback, aligning with the output schema. No gaps identified.
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 100%, but the description adds substantial meaning beyond the schema: it explains the fields map semantics (labels, placeholders, name attributes), value types, matching logic (case-insensitive, specificity-ordered, ambiguous keys returned unmatched), and the result's refs for fallback. This enriches the schema's bare parameter list.
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+resource+method: 'Fill a form by field labels in one call.' It clearly distinguishes from sibling tools like form_input by describing the one-call batch-fill approach and the fallback to form_input for unmatched fields.
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?
Explicitly names an alternative tool (form_input) for unmatched fields and instructs to use tabs_context first for a valid tabId. It also clarifies when submit:true is relevant and how the matching works, giving clear context for when to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
form_inputA
Set values in form elements using element reference ID from the read_page or find tools. If you don't have a valid tab ID, use tabs_context first to get available tabs.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | Element reference ID from the read_page or find tools (e.g., "ref_1", "ref_2") | |
| tabId | Yes | Tab ID to set form value in. Must be a tab in the current group. Use tabs_context first if you don't have a valid tab ID. | |
| value | Yes | The value to set. For checkboxes use boolean, for selects use option value or text, for other inputs use appropriate string/number |
Output Schema
| Name | Required | Description |
|---|---|---|
| provenance | No | |
| interactionReceipt | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must fully disclose behavioral traits. It only states the action and the tab prerequisite, but omits any detail about side effects (e.g., whether setting values triggers change events, submit, or requires specific page states). For a mutation tool, this is insufficient.
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 sentences, with the core action in the first and a conditional prerequisite in the second. No wasted words; all information is relevant.
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 tool has a simple structure with three well-documented parameters and an output schema (per context). The description covers the essential workflow – obtaining ref and valid tab ID – which is sufficient for an experienced agent. It lacks some behavioral nuance, but that is more transparency than completeness.
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 already provides descriptions for all three parameters (100% coverage), but the description adds cross-references: ref comes from read_page/find, and tabId from tabs_context. This enhances understanding of how to populate the 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 clearly states a specific action: 'Set values in form elements using element reference ID from the read_page or find tools.' It also distinguishes the tool by specifying the required input source (ref from read_page/find), which differentiates it from broader form filling tools like form_fill.
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 workflow guidance: use read_page/find to obtain a ref, and use tabs_context if a valid tab ID is not available. However, it does not explicitly compare itself to sibling tools like form_fill or act_on, nor does it state when NOT to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_page_textA
Extract raw text content from the page, prioritizing article content. Ideal for reading articles, blog posts, or other text-heavy pages. Returns plain text without HTML formatting. If you don't have a valid tab ID, use tabs_context first to get available tabs. Output is limited to 50000 characters by default; if it exceeds the limit it is truncated with a note giving the full size.
| Name | Required | Description | Default |
|---|---|---|---|
| tabId | Yes | Tab ID to extract text from. Must be a tab in the current group. Use tabs_context first if you don't have a valid tab ID. | |
| max_chars | No | Maximum characters for output (default: 50000). Set to a higher value if your client can handle large outputs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| provenance | 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 the output type (plain text), the default output limit (50000 chars), and the truncation behavior including the note with full size. It does not cover all possible edge cases, but it provides substantial behavioral context for a read operation.
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 but information-dense: purpose, use case, prerequisite, and output limitation are each covered in a single sentence. No wasted words, and the most important information is front-loaded.
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 text extraction tool with an output schema and 100% parameter coverage, the description provides all essential context: what it does, when to use it, how to handle missing tab IDs, and output limits/truncation. It is fully sufficient for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value beyond the schema by clarifying that tabId should be obtained via tabs_context if unknown and by explaining the truncation behavior for max_chars, which the schema only states as a default.
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 raw text content from the page,' and adds a distinguishing feature, 'prioritizing article content' and 'without HTML formatting.' This clearly differentiates it from sibling tools like read_page and find.
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 explicitly states when to use the tool ('Ideal for reading articles, blog posts, or other text-heavy pages') and instructs to use tabs_context first if no valid tab ID. It does not explicitly mention alternatives or exclusions, but the guidance is clear and practical.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gif_creatorA
Create a short, memory-only GIF of browser work. Call start_recording, use browser tools normally, then call export; export stops capture automatically. Recording also auto-stops after 30 seconds idle or 120 seconds total. Use status to inspect state, stop_recording for an optional explicit boundary, or clear to erase immediately. Export can return the GIF to the client (download:true) or place it on the page with ref or coordinate.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element reference for upload to a file input. For 'export' action only; mutually exclusive with coordinate. | |
| tabId | Yes | Tab ID to identify which tab group this operation applies to | |
| action | Yes | Action to perform. The usual flow is start_recording, normal browser work, then export. | |
| options | No | Optional GIF enhancement options for 'export' action. All default to true. | |
| download | No | If true, download the GIF instead of drag/drop upload. For 'export' action only. | |
| filename | No | Optional filename for exported GIF (default: 'recording-[timestamp].gif'). For 'export' action only. | |
| coordinate | No | Viewport coordinates [x, y] for drag & drop upload. Required for 'export' action unless 'download' is true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| provenance | 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 meets it: it discloses memory-only storage, auto-stop after 30s idle or 120s total, export stopping capture, and clear erasing immediately. This is far beyond typical tool descriptions.
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 compact 4 sentences that front-load the purpose and then systematically cover lifecycle and export options. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex, stateful tool with 5 actions, yet the description covers the full lifecycle, timeout behavior, and export paths. An output schema exists, so return-value documentation is unnecessary.
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 100%, so the baseline is 3. The description repeats the action flow already in the schema and only lightly summarizes export/drag-drop semantics; it adds little beyond the schema's detailed parameter descriptions.
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 'Create a short, memory-only GIF of browser work,' clearly stating the tool's purpose and key characteristic (memory-only). This distinguishes it from all sibling browser automation tools, none of which record GIFs.
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 provides an explicit workflow: 'Call start_recording, use browser tools normally, then call export' and clarifies that export auto-stops capture. It also explains when to use status, stop_recording, and clear, giving clear action boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
javascript_toolA
Execute JavaScript code in the context of the current page. The code runs in the page's context and can interact with the DOM, window object, and page variables. Returns the result of the last expression or any thrown errors. If you don't have a valid tab ID, use tabs_context first to get available tabs.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The JavaScript code to execute. Evaluated in the page context with REPL semantics: top-level `await` works, and the result of the last expression is returned automatically -- write the expression you want (e.g. `window.myData.value`, or `await fetch(url).then(r=>r.json())`) rather than `return ...`. You can access and modify the DOM, call page functions, and interact with page variables. | |
| tabId | Yes | Tab ID to execute the code in. Must be a tab in the current group. Use tabs_context first if you don't have a valid tab ID. | |
| action | Yes | Must be set to 'javascript_exec' |
Output Schema
| Name | Required | Description |
|---|---|---|
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses execution context ('runs in the page's context'), interaction capabilities ('interact with the DOM, window object, and page variables'), and return behavior ('Returns the result of the last expression or any thrown errors'). The schema further adds REPL semantics and top-level await support, providing comprehensive behavioral transparency.
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 three sentences, front-loaded with the core purpose, followed by behavioral details and a practical prerequisite. Every sentence earns its place with no redundancy or fluff.
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 the tool's complexity and the presence of a detailed schema and output schema, the description covers purpose, execution context, interactions, return values, and prerequisites. It is complete for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides extensive descriptions for all three parameters (100% coverage), including REPL semantics, tabId prerequisites, and the fixed action value. The description itself adds no information beyond the schema, so a baseline score of 3 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 precise verb+resource: 'Execute JavaScript code in the context of the current page.' It further specifies interaction with DOM, window object, and page variables, clearly distinguishing this from navigation or read-only tools. The return behavior is also stated, leaving no ambiguity about the tool's 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?
The description provides a clear prerequisite: 'If you don't have a valid tab ID, use tabs_context first to get available tabs.' This implies when the tool is appropriate (having a tab context) and directs the agent to a supporting tool. However, it doesn't explicitly contrast with alternatives like 'script' or state when not to use this tool, 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.
narrateA
Show a short, temporary narration ribbon in the controlled browser tab so the person watching understands the current workflow phase. Use it for meaningful phase changes, not routine clicks or keystrokes. A new narration replaces the current one.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | One short, user-visible sentence describing the current workflow phase. | |
| tabId | Yes | Tab ID in which to show the narration. Must be a tab owned by this session. | |
| position | No | Which viewport edge holds the narration ribbon. Auto avoids recent interaction and scroll activity; defaults to auto. | auto |
| duration_ms | No | How long to show the narration, in milliseconds. Defaults to 5000. |
Output Schema
| Name | Required | Description |
|---|---|---|
| shown | Yes | |
| reason | No | |
| position | Yes | |
| replaced | Yes | |
| provenance | No | |
| duration_ms | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It adds useful behavioral details: the narration is temporary, replaces the current one, and targets the controlled browser tab. It doesn't cover edge cases like invalid tab handling, but for a simple UI feedback tool, it provides adequate transparency.
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 three tight sentences: purpose, usage guidance, and behavior. Every sentence earns its place with no redundancy or filler, and the most important info is front-loaded.
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 the tool's simplicity, the rich schema (100% parameter coverage, output schema present), and the clear behavioral context, the description is complete enough. Return values are covered by the output schema, so no further explanation is needed.
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 description coverage is 100%, with each parameter already well-described (e.g., text is 'one short, user-visible sentence'). The tool description adds no additional parameter-specific meaning, so the baseline of 3 applies.
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 'Show a short, temporary narration ribbon in the controlled browser tab so the person watching understands the current workflow phase,' which specifies a clear verb, resource (narration ribbon), and purpose. This distinctly separates it from sibling tools like navigate or form_input, which perform different actions.
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 explicitly states when to use ('meaningful phase changes') and when not to ('not routine clicks or keystrokes'). However, it does not name alternative tools, so while the guidance is clear, it stops short of the 'alternatives' component required for a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_console_messagesA
Read browser console messages (console.log, console.error, console.warn, etc.) from a specific tab. Useful for debugging JavaScript errors, viewing application logs, or understanding what's happening in the browser console. Returns console messages from the current domain only. If you don't have a valid tab ID, use tabs_context first to get available tabs. IMPORTANT: Always provide a pattern to filter messages - without a pattern, you may get too many irrelevant messages.
| Name | Required | Description | Default |
|---|---|---|---|
| clear | No | If true, clear the console messages after reading to avoid duplicates on subsequent calls. Default is false. | |
| limit | No | Maximum number of messages to return. Defaults to 100. Increase only if you need more results. | |
| tabId | Yes | Tab ID to read console messages from. Must be a tab in the current group. Use tabs_context first if you don't have a valid tab ID. | |
| pattern | No | Regex pattern to filter console messages. Only messages matching this pattern will be returned (e.g., 'error|warning' to find errors and warnings, 'MyApp' to filter app-specific logs). You should always provide a pattern to avoid getting too many irrelevant messages. | |
| onlyErrors | No | If true, only return error and exception messages. Default is false (return all message types). |
Output Schema
| Name | Required | Description |
|---|---|---|
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the transparency burden. It discloses that results are limited to the current domain and warns about retrieving too many irrelevant messages without a pattern. These are meaningful behavioral traits beyond what the schema offers, though it doesn't discuss side effects of the 'clear' parameter (but that is covered in the schema).
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 front-loaded with the core action, then adds use cases, a domain limitation, and a clear IMPORTANT note. It is concise with no redundant phrases, though the use case sentence could be seen as extra but is helpful rather than 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?
Given the tool has 5 parameters and an output schema, the description covers the essential context: what it does, when to use it, and critical constraints (domain filter, pattern requirement). The output schema handles return details, so the description is sufficiently complete for effective tool selection and 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 coverage is 100%, so baseline is 3, but the description enriches parameter understanding by emphasizing 'Always provide a pattern' and advising to use tabs_context for tabId. This adds practical usage context not explicitly in the schema descriptions.
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 tool's function with a specific verb 'Read' and resource 'browser console messages', including examples of message types. It distinguishes itself from related tools like read_network_requests by focusing on console messages and specifying it reads from a specific tab.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear use cases (debugging JavaScript errors, viewing logs) and prerequisite guidance ('use tabs_context first to get available tabs'). It also gives a strong recommendation to always provide a pattern, which helps avoid overwhelming results. No explicit exclusions, but contextual guidance is solid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_network_requestsA
Read HTTP network requests (XHR, Fetch, documents, images, etc.) from a specific tab. Useful for debugging API calls, monitoring network activity, or understanding what requests a page is making. Returns all network requests made by the current page, including cross-origin requests. Requests are automatically cleared when the page navigates to a different domain. If you don't have a valid tab ID, use tabs_context first to get available tabs.
| Name | Required | Description | Default |
|---|---|---|---|
| clear | No | If true, clear the network requests after reading to avoid duplicates on subsequent calls. Default is false. | |
| limit | No | Maximum number of requests to return. Defaults to 100. Increase only if you need more results. | |
| tabId | Yes | Tab ID to read network requests from. Must be a tab in the current group. Use tabs_context first if you don't have a valid tab ID. | |
| urlPattern | No | Optional URL pattern to filter requests. Only requests whose URL contains this string will be returned (e.g., '/api/' to filter API calls, 'example.com' to filter by domain). |
Output Schema
| Name | Required | Description |
|---|---|---|
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses that requests are automatically cleared on page navigation to a different domain and that cross-origin requests are included, which are non-obvious behaviors. This adds valuable context beyond the schema.
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 about four sentences and front-loads the purpose. There is slight redundancy between 'Read HTTP network requests' and 'Returns all network requests made by the current page,' but overall it is concise and each sentence contributes meaningful 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?
The description provides sufficient context for an agent to select and invoke the tool: what it does, when to use it, the automatic clearing behavior, and how to obtain a valid tab ID. With an output schema present, return values need not be detailed. It lacks only explicit alternative comparisons, but that is not critical here.
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 covers all 4 parameters with descriptions, so the description does not need to add parameter semantics. It only ties tabId to the tabs_context prerequisite, but this is already implied in the schema. Baseline 3 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 clearly states the tool reads HTTP network requests (XHR, Fetch, documents, images) from a specific tab, which distinguishes it from sibling tools like read_console_messages or get_page_text. It also specifies scope (cross-origin included), making the purpose 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 clear use cases (debugging API calls, monitoring network activity) and a prerequisite (use tabs_context if no valid tab ID). However, it does not explicitly mention when not to use the tool or directly compare with alternatives, so it lacks exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_pageA
Get an accessibility tree representation of elements on the page. By default returns all elements including non-visible ones. Can optionally filter for only interactive elements, limit tree depth, or focus on a specific element. Returns a structured tree that represents how screen readers see the page content. If you don't have a valid tab ID, use tabs_context first to get available tabs. Output is limited to 50000 characters -- if exceeded, the tree is truncated at a line boundary with a note giving the full size; pass a larger max_chars, or use depth/ref_id to focus.
| Name | Required | Description | Default |
|---|---|---|---|
| diff | No | Return only changes since your previous read_page on this tab (+ added, - removed, ~ changed). | |
| depth | No | Maximum depth of the tree to traverse (default: 15). Use a smaller depth if output is too large. | |
| tabId | Yes | Tab ID to read from. Must be a tab in the current group. Use tabs_context first if you don't have a valid tab ID. | |
| filter | No | Filter elements: "interactive" for buttons/links/inputs only, "all" for all elements including non-visible ones (default: all elements) | |
| ref_id | No | Reference ID of a parent element to read. Will return the specified element and all its children. Use this to focus on a specific part of the page when output is too large. | |
| max_chars | No | Maximum characters for output (default: 50000). Set to a higher value if your client can handle large outputs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| target | No | |
| provenance | 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 so well. It discloses that all elements (including non-visible ones) are returned by default, the 50000-character output limit, truncation at a line boundary, and the note about full size. These are non-obvious behaviors beyond the schema.
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 moderately long (about five sentences) but each sentence carries necessary information: what it does, defaults, prerequisites, and output limitations. It is front-loaded with the core purpose, and the troubleshooting guidance is relevant and non-redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has six parameters, no annotations, and a rich output schema, the description covers all key operational aspects: purpose, default behavior, prerequisite steps, output size limits, and mitigation strategies. Return values are already represented by the output schema, so not repeating them is appropriate.
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 100%, so the baseline is 3. The description adds value by explaining practical parameter usage: default depth, default max_chars, truncation behavior, and how depth/ref_id can narrow focus when output is too large. It also clarifies the filter default ('all elements').
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: 'Get an accessibility tree representation of elements on the page.' It clearly distinguishes this from sibling tools like get_page_text by emphasizing how screen readers see the page content, not just raw text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage guidance: it tells the agent to use tabs_context first if there's no valid tab ID, and offers strategies for when output is too large (increase max_chars or use depth/ref_id). It does not explicitly name alternative tools, but the accessibility-tree framing makes the intended use clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resize_windowA
Resize the current browser window to specified dimensions. Useful for testing responsive designs or setting up specific screen sizes. If you don't have a valid tab ID, use tabs_context first to get available tabs.
| Name | Required | Description | Default |
|---|---|---|---|
| tabId | Yes | Tab ID to get the window for. Must be a tab in the current group. Use tabs_context first if you don't have a valid tab ID. | |
| width | Yes | Target window width in pixels | |
| height | Yes | Target window height in pixels |
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 discloses that the action is a resize (a mutation) and that it operates on the current browser window, but it does not mention potential side effects, permission requirements, or behavior on failure. For a simple tool, this is adequate but not comprehensive.
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 sentences long and front-loads the primary purpose. The second sentence adds a use case and a practical prerequisite. Every word earns its place, with no redundant 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?
The tool is simple with three well-described parameters and no output schema. The description covers the purpose, typical use cases, and a necessary prerequisite for obtaining a tab ID. This is complete for an agent to select and invoke the tool correctly without requiring further clarification.
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 100%, so the baseline is 3. The description does not add any additional meaning beyond the schema; it even repeats the tabId guidance already present in the schema. No extra semantics are provided for width or height.
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 tool's function: 'Resize the current browser window to specified dimensions.' This is a specific verb ('resize') with a clear resource ('browser window') and scope (current window). It distinguishes itself from siblings like navigate or tab_control by focusing on resizing rather than navigation or tab management.
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: 'Useful for testing responsive designs or setting up specific screen sizes.' It also gives a conditional prerequisite by advising to use tabs_context first if the user lacks a valid tab ID. However, it does not explicitly state when not to use this tool or mention alternative tools for resizing, so it lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scriptA
Run a sequence of tool calls in one request. Steps execute in order; each step is validated, authorized, and audited exactly as if called individually. Step arguments may reference a prior step's structured result: $prev.field for the previous step, $N.field for step N (1-indexed), with .0-style numeric segments indexing arrays (example: $prev.results.0.ref after find). Write $$ for a literal leading $. Only tools with structured results (find, tabs_context, tabs_create, navigate, wait_for) can be referenced. Steps may not include script itself. Use wait_for between navigate and reads on dynamic pages.
| Name | Required | Description | Default |
|---|---|---|---|
| steps | Yes | Ordered tool calls to execute sequentially. | |
| tabId | No | Tab ID the steps run against. Steps inherit this tabId when their own args omit it. Use tabs_context first if you don't have a valid tab ID. | |
| dry_run | No | When true, run every step through the real governance decision (registry, schema, sacred, authorize) but do not dispatch. Each step reports would_allow or would_deny with the reason a live run would produce; no mutations, no step audit records. | |
| onError | No | "stop" (default) halts the chain on the first non-ok step; "continue" runs remaining steps. A held step always stops the chain regardless. | |
| budget_ms | No | Total wall-clock budget for the whole script in milliseconds. Lowers (never raises) the configured ceiling; remaining steps report not_run on exhaustion. |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes | |
| summary | Yes | |
| provenance | No | |
| duration_ms | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does well. It discloses that each step is 'validated, authorized, and audited exactly as if called individually,' explains the variable reference syntax, the literal '$' escape, and the restriction on referencing tools. It does not mention failure handling (e.g., onError behavior), but that detail is covered by the schema, and the description adds valuable behavioral nuance.
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 and information-packed without redundancy. The first sentence states the core purpose, and subsequent sentences add necessary details about syntax, limitations, and a practical usage tip. Every sentence contributes meaningful content, and it remains concise given the tool's 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?
This is a complex meta-tool with five parameters and an output schema. The description explains the execution model, parameter reference syntax, tool restrictions, and includes a usage tip for dynamic pages. The schema covers parameter-level details, and the output schema covers return values, so the description is sufficiently complete for an agent to select and use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds significant value by giving concrete examples of the reference syntax (e.g., '$prev.results.0.ref after find') and the '$$' escape, which are not detailed in the schema parameter descriptions. It also clarifies which tools can be referenced, enhancing understanding beyond the schema alone.
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 'Run a sequence of tool calls in one request,' a specific verb and object that clearly defines the tool's function. It goes beyond a simple statement by explaining sequential execution and explicitly prohibiting nesting script itself, which distinguishes it from single-action sibling tools like navigate or find.
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 on when to use the tool (for multi-step sequences) and includes a specific tip: 'Use wait_for between navigate and reads on dynamic pages.' It also states constraints like which tools can be referenced and that script cannot be nested. However, it does not explicitly contrast this tool with sibling alternatives such as browser_batch, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tab_controlA
Focus, reload, or close one tab owned by this Ghostlight session. Close is always explicit and never affects a user-owned tab or automatically deletes the containing tab group.
| Name | Required | Description | Default |
|---|---|---|---|
| tabId | Yes | Tab ID to control. The tab must belong to this Ghostlight session. | |
| action | Yes | Focus the tab, reload its page, or explicitly close that one tab. |
Output Schema
| Name | Required | Description |
|---|---|---|
| provenance | No | |
| interactionReceipt | 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 important behavioral constraints: close is always explicit, never affects user-owned tabs, and never deletes the containing tab group. This adds value beyond the schema by highlighting safety semantics.
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 concise (two sentences) and front-loaded with the main purpose. The additional safety note about close is essential and earns its place without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with only two parameters and an output schema, the description covers the core functionality and one important behavioral nuance (close safety). It omits edge-case handling or failure behavior, but the presence of an output schema compensates. Overall, it is sufficient but not exhaustive.
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 100% with both parameters clearly described in the input schema. The description adds marginal behavior context (e.g., session ownership, explicit close) but does not meaningfully enhance parameter-level meaning beyond what the schema already provides.
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 tool's function with a specific verb ('Focus, reload, or close') and a specific resource ('one tab owned by this Ghostlight session'). It lists all three actions and differentiates from sibling tools like tabs_create_mcp (creation) and tabs_context_mcp (context) by focusing on tab control rather than creation or context.
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 usage context by mentioning session-owned tabs and explicit close behavior, but it does not explicitly state when to use this tool over alternatives (e.g., tabs_create_mcp, tabs_context_mcp). It also lacks any 'when not to use' guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tabs_context_mcpA
Get context information about the current MCP tab group. Returns all tab IDs inside the group if it exists. CRITICAL: You must get the context at least once before using other browser automation tools so you know what tabs exist. Each new conversation should create its own new tab (using tabs_create) rather than reusing existing tabs, unless the user explicitly asks to use an existing tab.
| Name | Required | Description | Default |
|---|---|---|---|
| createIfEmpty | No | Creates a new MCP tab group if none exists, creates a new Window with a new tab group containing an empty tab (which can be used for this conversation). If a MCP tab group already exists, this parameter has no effect. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tabs | Yes | |
| mcpGroupId | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavior. It states that the tool returns tab IDs but only 'if [the group] exists,' leaving unspecified what happens when no group exists (e.g., empty result, error, or creation behavior). The description does not mention the createIfEmpty parameter that controls creation, which 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 appropriately sized and front-loaded with the main purpose. Each additional sentence provides critical usage rules (mandatory before other tools, new-tab policy) without waste. It is concise and impactful.
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 tool is simple (one optional parameter) and has an output schema. The description covers the core functionality and usage context well. The only gap is the ambiguous default behavior when no group exists and createIfEmpty is false, but the schema and output schema largely compensate for this, making the description nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage for the single parameter, with a detailed description of createIfEmpty and its effects. The description text adds no additional parameter semantics, so the baseline score of 3 applies.
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 action ('Get context information'), the resource ('current MCP tab group'), and the output ('Returns all tab IDs inside the group if it exists'). It distinguishes itself from sibling tools like tabs_create_mcp by focusing on reading context rather than creating tabs.
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 says when to use this tool ('before using other browser automation tools') and provides a clear alternative ('Each new conversation should create its own new tab using tabs_create') with an exception ('unless the user explicitly asks to use an existing tab'). This is definitive usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tabs_create_mcpA
Creates a new empty tab in the MCP tab group.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| tabs | Yes | |
| tabId | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden of behavioral disclosure. It states that a new empty tab is created but does not disclose whether the tab becomes active/focused, what the return value contains (though an output schema exists), or any side effects. This is a significant gap for a browser automation 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 a single front-loaded sentence that says exactly what the tool does in 10 words. There is no redundancy or unnecessary detail; every word contributes to the meaning.
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 tool is simple (no params, output schema exists), but the description omits important behavioral context such as tab activation or focus behavior. It is minimally sufficient for an agent to invoke the tool, but not fully complete for understanding the post-conditions of that 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 tool has zero parameters, so parameter semantics are trivially satisfied. Per the rubric, a zero-parameter tool gets a baseline score of 4. The schema also reflects this with an empty properties object, so the description need not add parameter 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?
The description uses a specific verb ('Creates') and identifies a clear resource ('a new empty tab') and location ('in the MCP tab group'). This clearly distinguishes it from sibling tools like tabs_context_mcp (context) and tab_control (manipulating existing tabs).
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 does not provide any guidance on when to use this tool versus alternatives such as navigate or tab_control. It simply states what the tool does, leaving the agent to infer usage from sibling tool names. No exclusions, prerequisites, or alternative recommendations are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_planA
Present a plan to the user for approval before taking actions. The user will see the domains you intend to visit and your approach. Once approved, you can proceed with actions on the approved domains without additional permission prompts.
| Name | Required | Description | Default |
|---|---|---|---|
| domains | Yes | List of domains you will visit (e.g., ['github.com', 'stackoverflow.com']). These domains will be approved for the session when the user accepts the plan. | |
| approach | Yes | High-level description of what you will do. Focus on outcomes and key actions, not implementation details. Be concise - aim for 3-7 items. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It discloses the approval requirement and session-level domain approval, which is key behavioral context. It doesn't cover rejection behavior or plan updates, but for a planning tool this is adequate.
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 sentences, front-loaded with the core purpose, then explaining the approval flow. No wasted words, well-structured for quick comprehension.
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 planning tool with two parameters and no output schema, the description covers the purpose, usage timing, and post-approval behavior. It doesn't explain failure/rejection handling, but that's not critical for this tool 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 coverage is 100%, so baseline is 3. The description adds a bit of context (e.g., domains get approved for the session, approach should be high-level), but these are already in the schema parameter descriptions. No additional semantic value beyond that.
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 tool's purpose: to present a plan for user approval before actions. It specifies the resources (domains and approach) and the approval flow, distinguishing it from the sibling tools which are direct action tools.
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 explicitly says to use 'before taking actions' and explains that after approval, actions proceed without additional prompts. This gives clear context, though it doesn't name alternative tools or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_imageA
Upload a previously captured screenshot to a file input or drag & drop target. Supports two approaches: (1) ref -- for targeting specific elements, especially hidden file inputs, (2) coordinate -- for drag & drop to visible locations like Google Docs. Provide either ref or coordinate, not both.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element reference ID from read_page or find tools (e.g., "ref_1", "ref_2"). Use this for file inputs (especially hidden ones). Provide either ref or coordinate, not both. | |
| tabId | Yes | Tab ID where the target element is located. This is where the image will be uploaded to. | |
| imageId | Yes | ID of a previously captured screenshot (from the computer tool's screenshot action), e.g. "img_..." as reported in the screenshot result. | |
| filename | No | Optional filename for the uploaded file (default: "image.png"). | |
| coordinate | No | Viewport coordinates [x, y] for drag & drop to a visible location like Google Docs. Provide either ref or coordinate, not both. |
Output Schema
| Name | Required | Description |
|---|---|---|
| provenance | No | |
| interactionReceipt | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the two behavioral modes, the prerequisite of a previously captured screenshot, and the mutually exclusive ref/coordinate constraint. It stops short of detailing side effects or failure behavior, but covers the essential traits for safe invocation.
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 three sentences that front-load the core purpose, then succinctly explain the two approaches and the exclusivity constraint. Every sentence earns its place, with no filler or redundant restatement of the tool name.
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 the tool's moderate complexity, a 100% schema-covered parameter set, and the presence of an output schema, the description is complete enough: it specifies prerequisites, target types, usage modes, and a key constraint. The agent has sufficient context to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description reinforces the ref/coordinate distinction and the 'not both' rule, but does not add new semantic information beyond what the schema already provides for each 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 uses a specific verb ('Upload') and resource ('previously captured screenshot to a file input or drag & drop target'), clearly distinguishing it from sibling upload tools. It also outlines two concrete approaches, making the tool's scope 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?
Provides clear guidance on when to use 'ref' (hidden file inputs) versus 'coordinate' (drag & drop to visible locations like Google Docs), and explicitly warns not to provide both. However, it does not name alternative sibling tools or explicitly state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_forA
Wait until the page is ready. By default waits for BOTH your condition and page settlement (DOM mutation rate decayed). Provide selector (CSS) or text (visible substring) with state visible|present|gone, or call with neither to wait for settlement alone. min_ms sets a minimum elapsed time; settle:false gates on the condition only. Returns elapsed_ms, settle diagnostics, and the matched element's ref for follow-up clicks. Times out with an error naming what WAS on the page.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | A visible-text substring to wait for (matched against accessible names and nearby text). Provide at most one of selector or text. | |
| state | No | visible (default): the selector/text is present and rendered. present: in the DOM. gone: absent or hidden. settled: wait for the page to stop churning; valid only with no selector/text. | |
| tabId | Yes | Tab ID to wait on. Must be a tab in the current group. Use tabs_context first if you don't have a valid tab ID. | |
| min_ms | No | Minimum elapsed time before returning, even if the condition and settlement are already satisfied. Default 0. | |
| settle | No | Whether to also wait for page settlement (DOM mutation rate decay). Default true; set false to gate on the condition alone. | |
| selector | No | A CSS selector to wait for. Provide at most one of selector or text. With state visible (default) the element must be present AND rendered; present only requires it be in the DOM; gone waits for its absence. | |
| timeout_ms | No | Maximum wait in milliseconds. Default 10000, hard cap 30000. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ref | No | |
| found | Yes | |
| settled | No | |
| elapsed_ms | Yes | |
| final_rate | No | |
| provenance | No | |
| peak_mutations | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well. It discloses the default dual wait (condition + DOM mutation decay), the meaning of each state, the effect of min_ms and settle, and error behavior ('Times out with an error naming what WAS on the page'). It also mentions the returned diagnostics and element ref. This goes well beyond a bare statement of purpose.
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 six sentences but each is dense with information. It front-loads the purpose and then procedurally explains parameters, return values, and failure mode. No fluff or repetition. The only slight drawback is length, but it remains immediately scannable due to clear grouping.
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 wait tool with 7 parameters and no annotations, this description is remarkably complete. It covers all major usage modes, state semantics, default behavior, configurable conditions, timeout behavior, and return values. The presence of an output schema is acknowledged but the description already explains the key outputs (elapsed_ms, settle diagnostics, element ref). It leaves little unanswered.
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 100%, giving baseline 3. The description adds value by clarifying semantic details beyond schema: it explicitly explains how min_ms and settle modify the wait, interprets state values in context, and reinforces the exclusivity constraint ('at most one of selector or text'). This additional context enhances parameter understanding.
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 clear verb+resource ('Wait until the page is ready') and elaborates on the specific scopes (condition + settlement). It distinguishes itself from sibling navigation/action tools by detailing its waiting semantics (selector/text, states, settlement) and return diagnostics.
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 concrete usage patterns: 'Provide selector (CSS) or text (visible substring) with state visible|present|gone, or call with neither to wait for settlement alone.' It explains how to combine conditions with settlement ('settle:false gates on the condition only') and mentions the timeout behavior. It lacks explicit exclusions (e.g., when NOT to use), but the implied context is clear.
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. Dates show when Glama detected each change.
25 tool updates
v0.7.2- First observed
act_on - First observed
browser_batch - First observed
computer - First observed
dialog - First observed
explain - First observed
file_upload - First observed
find - First observed
form_fill - First observed
form_input - First observed
get_page_text - First observed
gif_creator - First observed
javascript_tool - First observed
narrate - First observed
navigate - First observed
read_console_messages - First observed
read_network_requests - First observed
read_page - First observed
resize_window - First observed
script - First observed
tab_control - First observed
tabs_context_mcp - First observed
tabs_create_mcp - First observed
update_plan - First observed
upload_image - First observed
wait_for
TDQS
Multiple tools have overlapping purposes (script vs browser_batch, file_upload vs upload_image, form_input vs form_fill), but descriptions include enough detail to distinguish them with careful reading. An agent may still hesitate on which to choose.
Tool names follow no consistent pattern: some are verb_noun (read_page, upload_image), some are noun_verb (file_upload, form_fill), some are single verbs (navigate, find), and some nouns (computer, dialog). The _mcp suffix appears on only two tab-related tools, while tab_control omits it. This mix makes the naming chaotic.
At 25 tools, the server is on the heavy side of the 16-25 borderline range. However, the broad scope of full browser automation justifies most tools, and each serves a distinct purpose within that domain.
The tool set comprehensively covers the browser automation lifecycle: navigation, reading, interaction, form filling, waiting, tab management, JavaScript execution, network/console inspection, screenshots, dialogs, and even recording. There are no obvious dead ends; the presence of update_plan and explain covers agent coordination and discoverability.
Maintenance
Related MCP Connectors
Browser MCP for logged-in tasks. Uses your Chrome — credentials stay local. Zero-token replay.
Live browser debugging for AI assistants — DOM, console, network via MCP.
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP server + Chrome extension that gives AI coding agents control of your real browser with existing sessions, logins, and cookies. Works with Cursor, Claude, Windsurf.1810449MIT
- AlicenseBqualityCmaintenanceBrowser MCP server that connects to your existing browser, preserving sessions, passwords, and extensions, enabling AI agents to interact with web pages without bot detection.31121MIT
- FlicenseNot gradedqualityBmaintenanceMCP server that enables AI agents to automate browser testing via Chromium, providing tools for navigation, interaction, and inspection.-
- AlicenseAqualityDmaintenanceSelf-hosted MCP server for AI browser automation. Connects to your own Chromium instance via CDP, providing tools for browser control, navigation, interaction, and content extraction.191MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/sylin-org/ghostlight'
If you have feedback or need assistance with the MCP directory API, please join our Discord server