Skip to main content
Glama
andytango
by andytango

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