Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault

No arguments

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
browser_statusA

Report which backend is connected, what it can do, and how many tabs are open.

list_tabsA

List open tabs with their ids, titles and URLs.

Args: url_pattern: Optional regex; only tabs whose URL matches are listed.

read_tabA

Read a tab's content, converted to markdown and capped in size.

Args: tab_id: Exact tab id from list_tabs. Prefer url_pattern. url_pattern: Regex matched against tab URLs. mode: 'readable' (markdown, boilerplate stripped), 'text', or 'html'. selector: Read only this element's subtree. Use it — it is the cheapest way to keep a read small and on-topic. max_chars: Character budget. Defaults to the server's --max-chars. include_links: Keep links as markdown in 'readable' mode.

query_domA

Inspect specific elements: tag, text, attributes, size, visibility.

Use this instead of reading the page when the question is about particular elements — form fields, buttons, error messages, option lists.

Args: selector: CSS selector. tab_id: Exact tab id. Prefer url_pattern. url_pattern: Regex matched against tab URLs. limit: Maximum elements to return. attrs: Only report these attributes. Defaults to a useful set (id, name, type, href, value, placeholder, role, aria-label, data-testid, class) plus disabled/checked/selected state. text_max: Truncate each element's text at this many characters. visible_only: Skip elements that are not rendered.

open_tabA

Open a URL in a new tab and return its id.

Args: url: Absolute URL to open. activate: Bring the new tab to the front. wait_for_load: Wait until the document finishes loading.

close_tabA

Close a tab.

Args: tab_id: Exact tab id. url_pattern: Regex matched against tab URLs. Must identify one tab.

navigateA

Point an existing tab at a new URL.

Args: url: Absolute URL to load. tab_id: Exact tab id. url_pattern: Regex matched against the tab's current URL. wait_for_load: Wait until the document finishes loading.

activate_tabA

Bring a target browser tab to the front and focus its window.

Side effects: Changes system window focus and switches the user's active tab viewport. Does not reload the page or alter DOM state.

Usage guidelines:

  • When to use: Use when a human user needs to observe the active page, or before capturing desktop-wide OS screenshots and video screencasts.

  • When NOT to use: Do NOT call this before reading or interacting with tabs. TabPilot tools (read_tab, query_dom, click, fill, eval_js, screenshot) work off-screen in background tabs without stealing focus.

Args: tab_id: Exact tab identifier (e.g. from list_tabs). If omitted, uses the frontmost tab or matches by url_pattern. url_pattern: Optional regex pattern matched against tab URLs (e.g. 'github.com').

Returns: Confirmation message containing the activated tab ID and title/URL. Returns an error message if no matching tab is found.

eval_jsA

Run a JavaScript expression in a tab and return its value as JSON.

The expression's value is returned, so write document.title, not return document.title. Promises are awaited on the CDP backend.

Do not use this to dump document.body.innerText — read_tab and query_dom answer those questions for a fraction of the tokens.

Args: expression: A JavaScript expression. tab_id: Exact tab id. url_pattern: Regex matched against tab URLs. timeout_ms: Per-call timeout.

clickA

Click an element, scrolling it into view first.

On the CDP backend this is a real mouse event at the element's centre, so widgets that only react to genuine mousedown behave correctly.

Args: selector: CSS selector. text: Visible text to match. Combined with selector it narrows within those matches; alone it searches clickable elements. Exact matches win over partial ones, and the innermost match wins. tab_id: Exact tab id. url_pattern: Regex matched against tab URLs. nth: Which match to click, 0-based.

fillA

Set a form field's value so React, Vue and jQuery all notice.

Works on text inputs, textareas, contenteditable, checkboxes and radios (pass 'true'/'false' for those).

Args: selector: CSS selector for the field. value: Value to set. tab_id: Exact tab id. url_pattern: Regex matched against tab URLs. clear: Empty the field first. nth: Which match to fill, 0-based. press_enter: Press Enter afterwards, for search boxes.

select_optionA

Choose option(s) in a native or a Select2 widget.

Pass several values for a multi-select. If the element turns out to be a React-Select style widget with no underlying , this says so and you should use select_option_ui instead.

Args: selector: CSS selector for the . values: Option values or labels to select. tab_id: Exact tab id. url_pattern: Regex matched against tab URLs. by: Match options by 'value', 'label', or 'auto' (either). nth: Which match to use, 0-based.

select_option_uiA

Choose an option in a React-Select / Headless UI dropdown by driving its UI.

These have no to set, so the menu is opened, awaited, and the option clicked — which cannot be done in a single JavaScript call because the menu does not exist yet when the click would fire.

Args: control_selector: CSS selector for the control that opens the menu. option_text: Visible text of the option to choose. tab_id: Exact tab id. url_pattern: Regex matched against tab URLs. option_selector: Override the option selector if the defaults miss. timeout_ms: How long to wait for the menu to appear.

scan_matrixA

List the matrix/grid questions on a page and which rows are unanswered.

Call this before fill_matrix to see the shape of the question and to confirm the row indices.

Args: tab_id: Exact tab id. url_pattern: Regex matched against tab URLs. selector: Override the matrix container selector.

fill_matrixA

Answer a matrix/grid question one row at a time, then verify the result.

Rows are clicked in separate JavaScript tasks with a delay between them. Clicking them in a loop instead makes React batch the updates and commit only the last row, leaving the rest blank and the page stuck failing validation.

Args: tab_id: Exact tab id. url_pattern: Regex matched against tab URLs. selector: Override the matrix container selector. question_index: Which matrix question, as numbered by scan_matrix. column_index: Which answer column to pick. Negative counts from the right, so -1 is the last column. rows: Specific row indices. Defaults to whichever rows need answering. only_unanswered: Skip rows that already have an answer. delay_ms: Delay between rows. Raise it to 150-250 if rows stay blank.

wait_forA

Poll until a condition holds, then return. Fails with what it last saw.

Args: selector: CSS selector to watch. state: 'visible', 'hidden', 'present', 'absent', 'enabled', or 'text' (with the text argument). text: Substring to look for when state is 'text'. predicate: A JavaScript expression to poll instead of a selector, e.g. "document.readyState === 'complete'". tab_id: Exact tab id. url_pattern: Regex matched against tab URLs. timeout_ms: How long to keep polling. poll_ms: Interval between checks, minimum 50.

screenshotA

Capture a tab and save it to disk.

Captures the tab that was asked for even if it is not frontmost, and works headless — so this is also how evidence gets captured on a server. Needs the CDP backend.

Args: tab_id: Exact tab id. url_pattern: Regex matched against tab URLs. full_page: Capture the whole scrollable page, not just the viewport. selector: Capture only this element. image_format: 'png' or 'jpeg'. quality: JPEG quality, 1-100. Ignored for PNG. label: Included in the filename, to make the file findable later. return_image: Inline the image in the result. Defaults on when the client is on another machine (TABPILOT_REMOTE / --return-images), since a saved path means nothing there.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription
Active tabMarkdown content of whichever tab currently has focus.

TDQS

A4.2/5.0

Scored across 17 tools

Disambiguation5/5

Each tool targets a distinct operation: reading page content (read_tab) vs inspecting specific elements (query_dom) vs running custom JS (eval_js), and interaction tools (click, fill, select_option, select_option_ui) have clear boundaries. Even similar tools like scan_matrix/fill_matrix and select_option/select_option_ui are explicitly distinguished by widget type and purpose.

Naming Consistency4/5

Most names follow a verb_noun pattern (list_tabs, read_tab, open_tab, activate_tab, fill_matrix), but a few deviate: navigate, click, fill, and screenshot are single verbs or nouns used as verbs, while browser_status and wait_for use different structures. The pattern is still predictable and readable.

Tool Count4/5

With 17 tools, the set is slightly larger than the ideal 3–15 range but each tool serves a concrete browser automation function (tab management, reading, interaction, waiting, screenshots, matrix handling). The count feels justified for the domain, not bloated.

Completeness4/5

The tool surface covers tab lifecycle (open, close, list, navigate), multiple read modes (markdown, DOM inspection, screenshots), form interaction (fill, click, select, matrix-specific tools), and synchronization (wait_for). Minor gaps exist like no explicit back/forward or keyboard shortcuts, but these can be worked around with navigate or eval_js.

Maintenance

ActivityMaintained
ResponsivenessNo issues