Skip to main content
Glama

browser_content

Read-onlyIdempotent

Extracts web page content as clickable elements, plain text, or HTML for inspection and automation, while masking passwords, one-time codes, and card values.

Instructions

Extracts the web page content. Modes: interactive (clickable elements/inputs), text (plain text), html (DOM). The value of a password, a one-time code or a bank card is never returned: "[masked value]" appears in its place.

Input Schema

NameRequiredDescriptionDefault
modeNointeractive
tab_idYesYour tab's id (from browser_new_tab, or a tab adopted with browser_adopt_tab).

Output Schema

NameRequiredDescriptionDefault
dataYes
statusYes
warningNoEmergency stop hotkey not held, or similar notice
untrusted_noteNoPage text that looks like instructions aimed at an AI

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed10 schema fields changedv2.31.6
    • addedOutput schema / $defs
      Added value: +{
      +  "Box": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "height": {
      +        "type": "number"
      +      },
      +      "width": {
      +        "type": "number"
      +      },
      +      "x": {
      +        "type": "number"
      +      },
      +      "y": {
      +        "type": "number"
      +      }
      +    },
      +    "title": "Box",
      +    "type": "object"
      +  },
      +  "ContentElement": {
      +    "additionalProperties": true,
      +    "description": "Interactive element. value only for a sensitive field: \"[masked value]\".",
      +    "properties": {
      +      "className": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "crossOriginFrame": {
      +        "type": "boolean"
      +      },
      +      "frame": {
      +        "type": "string"
      +      },
      +      "id": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "index": {
      +        "type": "integer"
      +      },
      +      "rect": {
      +        "$ref": "#/$defs/Box"
      +      },
      +      "tag": {
      +        "type": "string"
      +      },
      +      "text": {
      +        "type": "string"
      +      },
      +      "type": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "value": {
      +        "type": "string"
      +      }
      +    },
      +    "title": "ContentElement",
      +    "type": "object"
      +  },
      +  "ContentFrame": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "frame": {
      +        "type": "string"
      +      },
      +      "url": {
      +        "type": "string"
      +      }
      +    },
      +    "title": "ContentFrame",
      +    "type": "object"
      +  },
      +  "InteractiveContent": {
      +    "additionalProperties": true,
      +    "description": "mode=\"interactive\". Modes \"text\" and \"html\" answer a plain string instead.",
      +    "properties": {
      +      "dialog": {
      +        "$ref": "#/$defs/PageDialog"
      +      },
      +      "dialogOpened": {
      +        "type": "boolean"
      +      },
      +      "elements": {
      +        "items": {
      +          "$ref": "#/$defs/ContentElement"
      +        },
      +        "type": "array"
      +      },
      +      "frames": {
      +        "items": {
      +          "$ref": "#/$defs/ContentFrame"
      +        },
      +        "type": "array"
      +      },
      +      "message": {
      +        "type": "string"
      +      },
      +      "pendingDialogs": {
      +        "items": {
      +          "$ref": "#/$defs/PageDialog"
      +        },
      +        "type": "array"
      +      },
      +      "title": {
      +        "type": "string"
      +      },
      +      "url": {
      +        "type": "string"
      +      }
      +    },
      +    "title": "InteractiveContent",
      +    "type": "object"
      +  },
      +  "PageDialog": {
      +    "additionalProperties": true,
      +    "description": "Dialog opened by the page (never accepted by the agent: browser_handle_dialog).",
      +    "properties": {
      +      "defaultPrompt": {
      +        "type": "string"
      +      },
      +      "message": {
      +        "type": "string"
      +      },
      +      "tabId": {
      +        "type": "integer"
      +      },
      +      "type": {
      +        "type": "string"
      +      },
      +      "url": {
      +        "type": "string"
      +      }
      +    },
      +    "title": "PageDialog",
      +    "type": "object"
      +  }
      +}
    • addedOutput schema / additionalProperties
      Added value: +true
    • addedOutput schema / description
      Added value: +"Page content: elements, or the text or HTML."
    • addedOutput schema / properties / data
      Added value: +{
      +  "anyOf": [
      +    {
      +      "$ref": "#/$defs/InteractiveContent"
      +    },
      +    {
      +      "type": "string"
      +    }
      +  ]
      +}
    • removedOutput schema / properties / result
      Removed value: -{
      -  "title": "Result",
      -  "type": "string"
      -}
    • addedOutput schema / properties / status
      Added value: +{
      +  "const": "success",
      +  "type": "string"
      +}
    • addedOutput schema / properties / untrusted_note
      Added value: +{
      +  "description": "Page text that looks like instructions aimed at an AI",
      +  "type": "string"
      +}
    • addedOutput schema / properties / warning
      Added value: +{
      +  "description": "Emergency stop hotkey not held, or similar notice",
      +  "type": "string"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "result"
      -]New value: +[
      +  "status",
      +  "data"
      +]
    • changedOutput schema / title
      Previous value: -"browser_contentOutput"New value: +"ContentAnswer"
  2. First observedv0.1.0

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false. The description adds important behavioral context beyond those annotations: sensitive values such as passwords, one-time codes, and bank card numbers are always masked as '[masked value]'. It does not discuss pagination, rate limits, or auth, but the masking disclosure is a meaningful addition.

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?

The description is two sentences, front-loaded with purpose and then mode semantics, followed by the important masking caveat. There is no redundant or wasted language.

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

Completeness5/5

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

Given the presence of an output schema and annotations covering safety and idempotency, the description supplies the essential missing context: extraction modes and sensitive-value masking. An agent can call the tool correctly without needing more from the description.

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

Parameters4/5

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

Schema coverage is 50%; the required tab_id parameter is documented in the schema, while the mode parameter has no schema description. The description compensates by defining the three mode values and what each returns, making the mode parameter semantically clear despite the schema gap.

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

Purpose4/5

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

The description gives a specific verb and resource: 'Extracts the web page content.' It also enumerates the three extraction modes (interactive, text, html), so the agent understands what the tool returns. It does not explicitly differentiate this tool from siblings such as browser_screenshot, browser_axtree, or browser_vision_inspect.

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

Usage Guidelines3/5

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

The description explains the mode options and their meanings, which implies when an agent might choose interactive versus text versus html. However, it does not state when to use browser_content instead of sibling tools like browser_axtree or browser_screenshot, nor does it give exclusions or prerequisites.

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