Skip to main content
Glama

query_selector

Extract element information from web pages using CSS selectors to locate and retrieve specific content during browser automation.

Instructions

Get information about an element matching a CSS selector

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
selectorYesCSS selector for the element
tabIdNoTab ID to operate on (uses active tab if not specified)

Implementation Reference

  • Handler function that executes the query_selector tool: retrieves the page, queries for the CSS selector, checks if element exists, and if so, extracts tag name, truncated text content, all attributes, and bounding box coordinates.
    async ({ selector, tabId }) => { const pageResult = await getPageForOperation(tabId); if (!pageResult.success) { return handleResult(pageResult); } const page = pageResult.data; try { const element = await page.$(selector); if (!element) { return handleResult(ok({ exists: false, selector, })); } const info = await element.evaluate((el) => { const rect = el.getBoundingClientRect(); const attributes: Record<string, string> = {}; for (let i = 0; i < el.attributes.length; i++) { const attr = el.attributes[i]; if (attr) { attributes[attr.name] = attr.value; } } return { tagName: el.tagName.toLowerCase(), textContent: el.textContent?.slice(0, 1000) ?? '', attributes, boundingBox: { x: rect.x, y: rect.y, width: rect.width, height: rect.height, }, }; }); return handleResult(ok({ exists: true, selector, ...info, })); } catch (error) { return handleResult(err(normalizeError(error))); } }
  • Registration of the 'query_selector' tool on the MCP server within registerContentTools, including name, description, schema, and handler.
    server.tool( 'query_selector', 'Get information about an element matching a CSS selector', querySelectorSchema.shape, async ({ selector, tabId }) => { const pageResult = await getPageForOperation(tabId); if (!pageResult.success) { return handleResult(pageResult); } const page = pageResult.data; try { const element = await page.$(selector); if (!element) { return handleResult(ok({ exists: false, selector, })); } const info = await element.evaluate((el) => { const rect = el.getBoundingClientRect(); const attributes: Record<string, string> = {}; for (let i = 0; i < el.attributes.length; i++) { const attr = el.attributes[i]; if (attr) { attributes[attr.name] = attr.value; } } return { tagName: el.tagName.toLowerCase(), textContent: el.textContent?.slice(0, 1000) ?? '', attributes, boundingBox: { x: rect.x, y: rect.y, width: rect.width, height: rect.height, }, }; }); return handleResult(ok({ exists: true, selector, ...info, })); } catch (error) { return handleResult(err(normalizeError(error))); } } );
  • Zod input schema for query_selector tool defining required CSS selector and optional tabId.
    export const querySelectorSchema = z.object({ selector: selectorSchema, tabId: tabIdSchema, });

Latest Blog Posts

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/andytango/puppeteer-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server