Skip to main content
Glama

Inspect live page DOM

inspect-page
Read-onlyIdempotent

Open a URL in a fresh headless browser to capture unique Playwright locators, CSS selectors, visibility, text, console messages, DOM inventory, or ARIA snapshots for reliable E2E test authoring.

Instructions

Open a URL in a fresh headless browser and return its elements with Playwright locators proven unique on the page (role + name first), CSS selectors, visibility, text and console messages. Each call starts clean (no cookies kept): put every step to reach a state, login included, in actions, or open it signed in with storageState/headers. By default it returns the compact locator map; view 'elements' gives the full DOM inventory and view 'aria' returns the accessibility snapshot plus a ready toMatchAriaSnapshot assertion.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "url": "<url>"
    },
    "name": "inspect-page"
  }
}

Input Schema

NameRequiredDescriptionDefault
harNo
urlYesFull URL of the page to open (http/https)
viewNo'locators' (default): compact map of interactive elements; 'aria': accessibility snapshot + toMatchAriaSnapshot check (scoped by selector); 'elements': full DOM inventory with boxes and attributes
deviceNoPlaywright device preset, e.g. 'iPhone 15', 'Pixel 7', 'iPad Pro 11' (viewport, user agent, touch)
routesNoNetwork mocks, first match wins: json/body/status fulfil, abort fails, delayMs alone slows the real request
actionsNoSteps run in order after load to reach a state (modal, step 3). One call = one fresh browser, so include the login steps; end with a 'wait' on what the state shows
browserNoEngine (default chromium)
channelNoBranded Chromium to launch instead of the bundled one (must be installed)
connectNoRemote browser: Playwright ws(s):// endpoint or 'cdp:<url>'; keys as {{env:E2E_…}}
headersNoExtra HTTP headers, e.g. Authorization
offlineNoGo offline once the page has loaded, before steps run, to check offline and retry states
waitForNoWait for this selector first
selectorNoCSS selector: inspect matches instead of the whole DOM
viewportNo
timeoutMsNoOverall inspection limit in ms (default 45000)
waitUntilNoNavigation wait condition (default domcontentloaded)
blockWritesNoAbort POST/PUT/PATCH/DELETE requests no mock answers, so steps cannot change real data (default: PW_MCP_BLOCK_WRITES)
includeHtmlNoInclude the rendered HTML (truncated)
projectRootNoProject whose Playwright launches the browser (default: server root)
maxHtmlCharsNoHTML cap when includeHtml is set (default 20000)
storageStateNoLogged-in session: storageState JSON inside the project, e.g. playwright/.auth/user.json
blockResourcesNoSkip these requests for speed and privacy: image, media, font, stylesheet, trackers (known analytics/ad hosts); default PW_MCP_BLOCK_RESOURCES
actionTimeoutMsNoHow long each action waits for its element (default 10000); keep timeoutMs above the total

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changedv0.14.0
    • addedInput schema / properties / blockResources
      Added value: +{
      +  "description": "Skip these requests for speed and privacy: image, media, font, stylesheet, trackers (known analytics/ad hosts); default PW_MCP_BLOCK_RESOURCES",
      +  "items": {
      +    "enum": [
      +      "image",
      +      "media",
      +      "font",
      +      "stylesheet",
      +      "trackers"
      +    ],
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / offline
      Added value: +{
      +  "description": "Go offline once the page has loaded, before steps run, to check offline and retry states",
      +  "type": "boolean"
      +}
  2. Changed21 schema fields changedv0.13.0
    • removedInput schema / $schema
      Removed value: -"https://json-schema.org/draft/2020-12/schema"
    • removedInput schema / additionalProperties
      Removed value: -{}
    • changedInput schema / properties / actions / items / properties / type / enum
      Previous value: -[
      -  "goto",
      -  "click",
      -  "dblclick",
      -  "hover",
      -  "fill",
      -  "press",
      -  "check",
      -  "uncheck",
      -  "select",
      -  "wait"
      -]New value: +[
      +  "goto",
      +  "click",
      +  "dblclick",
      +  "hover",
      +  "fill",
      +  "press",
      +  "check",
      +  "uncheck",
      +  "select",
      +  "wait",
      +  "switchTab"
      +]
    • changedInput schema / properties / actions / items / properties / value / description
      Previous value: -"fill text, press key, select option"New value: +"fill text, press key, select option; switchTab: 'last' (default), 'first', a 1-based number, or text in the tab's URL or title"
    • removedInput schema / properties / actions / maxItems
      Removed value: -20
    • addedInput schema / properties / blockWrites
      Added value: +{
      +  "description": "Abort POST/PUT/PATCH/DELETE requests no mock answers, so steps cannot change real data (default: PW_MCP_BLOCK_WRITES)",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / connect
      Added value: +{
      +  "description": "Remote browser: Playwright ws(s):// endpoint or 'cdp:<url>'; keys as {{env:E2E_…}}",
      +  "type": "string"
      +}
    • removedInput schema / properties / device / maxLength
      Removed value: -60
    • removedInput schema / properties / device / minLength
      Removed value: -2
    • removedInput schema / properties / har / properties / path / maxLength
      Removed value: -500
    • removedInput schema / properties / har / properties / path / minLength
      Removed value: -1
    • removedInput schema / properties / har / properties / url / maxLength
      Removed value: -500
    • removedInput schema / properties / headers / propertyNames
      Removed value: -{
      -  "type": "string"
      -}
    • removedInput schema / properties / routes / items / properties / body / maxLength
      Removed value: -200000
    • removedInput schema / properties / routes / items / properties / contentType / maxLength
      Removed value: -100
    • removedInput schema / properties / routes / items / properties / headers / propertyNames
      Removed value: -{
      -  "type": "string"
      -}
    • removedInput schema / properties / routes / items / properties / method / maxLength
      Removed value: -10
    • removedInput schema / properties / routes / items / properties / url / maxLength
      Removed value: -500
    • removedInput schema / properties / routes / items / properties / url / minLength
      Removed value: -1
    • removedInput schema / properties / routes / maxItems
      Removed value: -20
    • changedInput schema / properties / view / description
      Previous value: -"'locators': compact map of interactive elements (cheapest); 'aria': accessibility snapshot + toMatchAriaSnapshot check (scoped by selector); 'elements' (default): DOM inventory"New value: +"'locators' (default): compact map of interactive elements; 'aria': accessibility snapshot + toMatchAriaSnapshot check (scoped by selector); 'elements': full DOM inventory with boxes and attributes"
  3. Changed10 schema fields changedv0.6.1
    • addedInput schema / additionalProperties
      Added value: +{}
    • addedInput schema / properties / actionTimeoutMs
      Added value: +{
      +  "description": "How long each action waits for its element (default 10000); keep timeoutMs above the total",
      +  "maximum": 120000,
      +  "minimum": 1000,
      +  "type": "integer"
      +}
    • changedInput schema / properties / actions / description
      Previous value: -"Steps run after load to reach a state (modal, step 3)"New value: +"Steps run in order after load to reach a state (modal, step 3). One call = one fresh browser, so include the login steps; end with a 'wait' on what the state shows"
    • addedInput schema / properties / browser
      Added value: +{
      +  "description": "Engine (default chromium)",
      +  "enum": [
      +    "chromium",
      +    "firefox",
      +    "webkit"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / channel
      Added value: +{
      +  "description": "Branded Chromium to launch instead of the bundled one (must be installed)",
      +  "enum": [
      +    "chrome",
      +    "chrome-beta",
      +    "msedge",
      +    "msedge-beta"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / device
      Added value: +{
      +  "description": "Playwright device preset, e.g. 'iPhone 15', 'Pixel 7', 'iPad Pro 11' (viewport, user agent, touch)",
      +  "maxLength": 60,
      +  "minLength": 2,
      +  "type": "string"
      +}
    • addedInput schema / properties / har
      Added value: +{
      +  "properties": {
      +    "mode": {
      +      "description": "'replay' (default) answers requests from the file; 'record' saves the traffic",
      +      "enum": [
      +        "replay",
      +        "record"
      +      ],
      +      "type": "string"
      +    },
      +    "notFound": {
      +      "description": "replay: requests missing from the file abort (default) or go to the network",
      +      "enum": [
      +        "abort",
      +        "fallback"
      +      ],
      +      "type": "string"
      +    },
      +    "path": {
      +      "description": ".har or .zip inside the project",
      +      "maxLength": 500,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "url": {
      +      "description": "Glob limiting the requests, e.g. '**/api/**'",
      +      "maxLength": 500,
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "path"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / routes
      Added value: +{
      +  "description": "Network mocks, first match wins: json/body/status fulfil, abort fails, delayMs alone slows the real request",
      +  "items": {
      +    "properties": {
      +      "abort": {
      +        "type": "boolean"
      +      },
      +      "body": {
      +        "maxLength": 200000,
      +        "type": "string"
      +      },
      +      "contentType": {
      +        "maxLength": 100,
      +        "type": "string"
      +      },
      +      "delayMs": {
      +        "maximum": 10000,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "headers": {
      +        "additionalProperties": {
      +          "type": "string"
      +        },
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "json": {},
      +      "method": {
      +        "maxLength": 10,
      +        "type": "string"
      +      },
      +      "status": {
      +        "maximum": 599,
      +        "minimum": 100,
      +        "type": "integer"
      +      },
      +      "url": {
      +        "description": "Glob, e.g. '**/api/cart'",
      +        "maxLength": 500,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "url"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 20,
      +  "type": "array"
      +}
    • changedInput schema / properties / view / description
      Previous value: -"'locators': compact map of interactive elements (cheapest); 'elements' (default): DOM inventory"New value: +"'locators': compact map of interactive elements (cheapest); 'aria': accessibility snapshot + toMatchAriaSnapshot check (scoped by selector); 'elements' (default): DOM inventory"
    • changedInput schema / properties / view / enum
      Previous value: -[
      -  "elements",
      -  "locators"
      -]New value: +[
      +  "elements",
      +  "locators",
      +  "aria"
      +]
  4. First observedv0.3.2

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds real value beyond the annotations: no cookie persistence between calls, console messages are returned, view modes change the shape of output, and an env-driven blockWrites default guards against form submissions changing real data. The one soft spot is that readOnlyHint=true sits uncomfortably with actions that can click/fill and with har 'record' writing a file; the description hints at this ('so steps cannot change real data') but never states plainly that the default guard is env-dependent.

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

Conciseness5/5

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

Three sentences, front-loaded with purpose and output shape, then the fresh-session constraint, then the view modes. The long third sentence is dense but every clause (element fields, view options, aria assertion readiness) carries distinct information.

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 23-parameter tool with no output schema, the description covers what comes back (locators, CSS selectors, visibility, text, console messages) and the state-freshness model. Minor gap: no mention of result size limits or truncation of the locator map, which matters for large pages given the HTML cap discussion elsewhere.

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 91%, so the schema already carries nearly all parameter meaning and the baseline is 3. The description reinforces the default view ('compact locator map') and the two alternate views plus the login mechanisms, but adds no new syntax or constraints beyond what the schema states.

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?

States a specific verb and resource ('Open a URL in a fresh headless browser') and quantifies the return value ('elements with Playwright locators proven unique on the page'). The 'proven unique' phrasing quietly separates it from validate-selector and the audit tools, so an agent can tell what this tool uniquely produces.

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

Usage Guidelines4/5

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

Gives clear operational context: every call is clean, so all steps including login must be supplied via actions or bypassed with storageState/headers, and actions should end with a wait on the target state. It lacks explicit exclusions or named alternatives (e.g. 'use validate-selector to check one locator'), so it stops short of full when/when-not guidance.

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