tabpilot-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
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
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| 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:
Args:
tab_id: Exact tab identifier (e.g. from 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 Do not use this to dump 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
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| Active tab | Markdown content of whichever tab currently has focus. |
TDQS
Scored across 17 tools
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.
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.
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.
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.