Skip to main content
Glama

browser_extract_list

Extract every row from long virtualized lists by automatically scrolling until all data loads. Use for mail, tables, or search results to capture complete, deduplicated content when standard page reads miss rows.

Instructions

Read EVERY row of a long or virtualised list by scrolling its container until no new rows appear. Use this instead of browser_get_page_content whenever a page shows a repeating list longer than the viewport - mail lists (Outlook, Gmail), invoice/billing tables, search results, transaction histories. Those UIs keep only ~7 rows in the DOM at a time, so a single page read returns a sliver and looks complete. Pass the CSS selector of one repeating row (e.g. '[role="option"]', 'tr', '[role="listitem"]'); the scrollable ancestor is found automatically. Returns deduplicated row text plus reached_end so you know whether you saw the whole list.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
wait_msNoWait after each scroll so new rows can render (default 350)
max_rowsNoStop after this many unique rows (default 500, max 5000)
selectorYesCSS selector matching ONE repeating row (e.g. '[role="option"]' in Outlook, 'tr' in a table)
containerNoOptional CSS selector for the scrollable container. Omit to auto-detect the row's nearest scrollable ancestor.
scroll_stepNoPixels per scroll. Omit for 85% of the container height.
stable_roundsNoConsecutive scrolls with no new rows before stopping (default 3)

Schema Changelog

Changes observed during successful MCP inspections.

  1. Addedv1.28.0

TDQS

A4.3/5.0
Behavior4/5

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 the scrolling behavior, the auto-detection of the scrollable ancestor, the deduplication of rows, and the reached_end flag. It also explains the underlying virtualisation problem. It doesn't mention side effects like page scroll position changes or network requests, but for a read-only extraction tool the disclosed behavior is substantial and accurate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense paragraph that front-loads the core behavior and the when-to-use guidance. It's longer than ideal but every sentence earns its place: the virtualisation explanation justifies the tool's existence, and the selector guidance is actionable. The structure could be improved with a short 'When to use' lead-in, but it's well-organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 6 parameters, no annotations, and no output schema, the description covers the core scenario well: what it does, when to use it, what to pass, and what you get back (deduplicated rows + reached_end). It doesn't describe the exact return format or error cases (e.g., what happens if the selector matches nothing), but the description is complete enough for an agent to select and invoke the tool correctly in the common case.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all 6 parameters. The description adds context for the key parameter (selector) with examples and explains the auto-detection behavior for container. However, it doesn't add much beyond the schema for wait_ms, max_rows, scroll_step, and stable_rounds, which are already well-described. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Read EVERY row'), a resource (long/virtualised lists), and the mechanism (scrolling until no new rows appear). It explicitly distinguishes itself from browser_get_page_content, which is the key sibling it competes with. The examples (mail lists, invoice tables, search results) make the target use case unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use this instead of browser_get_page_content whenever a page shows a repeating list longer than the viewport' and explains why (virtualised UIs keep only ~7 rows in the DOM). This is a clear when-to-use directive with a named alternative. It also tells the user what to pass (CSS selector of one repeating row) and what to expect (deduplicated rows plus reached_end).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.