Skip to main content
Glama

read_page

Read-onlyIdempotent

Return a page's markdown from the stored crawl output, without any network access. This is the counterpart to get_page: read_page serves the crawled copy that already had the site's content_selector applied, while get_page re-fetches the…

Instructions

Return a page's markdown from the stored crawl output, without any network access. This is the counterpart to get_page: read_page serves the crawled copy that already had the site's content_selector applied, while get_page re-fetches the URL live. Use list_pages to discover URLs, then read_page to read them. Pass a search_docs result's anchor to read only that section. Large pages are truncated at max_bytes; follow next_offset to read the rest.

Input Schema

NameRequiredDescriptionDefault
urlYesURL of a crawled page, as reported by list_pages
anchorNoHeading anchor, as in a search_docs result; returns only that section, subsections included
offsetNoByte offset into the page content, for reading a truncated page in parts (default: 0)
site_keyYesSite key from config (use list_sites to discover available keys)
max_bytesNoMaximum content bytes to return (default: 102400, max: 1048576; larger values are capped, 0 or less means the default)

Output Schema

NameRequiredDescriptionDefault
urlYes
depthYes
titleYes
offsetYes
sourceYes
contentYes
headingsYes
site_keyYes
truncatedYesMore of the page, or of the anchor's section, follows
crawled_atYes
next_offsetNoPass as offset to read the next part; present only when truncated
section_endNoByte offset where the anchor's section ends; present when anchor was given
content_hashYes
total_lengthYesBytes of the whole stored page
content_lengthYesBytes of content in this response

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed6 schema fields changedv2.21.0
    • addedInput schema / properties / anchor
      Added value: +{
      +  "description": "Heading anchor, as in a search_docs result; returns only that section, subsections included",
      +  "type": "string"
      +}
    • changedInput schema / properties / max_bytes / description
      Previous value: -"Maximum content bytes to return (default: 102400, max: 1048576)"New value: +"Maximum content bytes to return (default: 102400, max: 1048576; larger values are capped, 0 or less means the default)"
    • changedInput schema / properties / max_bytes / type
      Previous value: -"number"New value: +"integer"
    • changedInput schema / properties / offset / type
      Previous value: -"number"New value: +"integer"
    • addedOutput schema / properties / section_end
      Added value: +{
      +  "description": "Byte offset where the anchor's section ends; present when anchor was given",
      +  "type": [
      +    "null",
      +    "integer"
      +  ]
      +}
    • addedOutput schema / properties / truncated / description
      Added value: +"More of the page, or of the anchor's section, follows"
  2. Changed1 schema field changedv2.15.0
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "content": {
      +      "type": "string"
      +    },
      +    "content_hash": {
      +      "type": "string"
      +    },
      +    "content_length": {
      +      "description": "Bytes of content in this response",
      +      "type": "integer"
      +    },
      +    "crawled_at": {
      +      "type": "string"
      +    },
      +    "depth": {
      +      "type": "integer"
      +    },
      +    "headings": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": [
      +        "null",
      +        "array"
      +      ]
      +    },
      +    "next_offset": {
      +      "description": "Pass as offset to read the next part; present only when truncated",
      +      "type": [
      +        "null",
      +        "integer"
      +      ]
      +    },
      +    "offset": {
      +      "type": "integer"
      +    },
      +    "site_key": {
      +      "type": "string"
      +    },
      +    "source": {
      +      "type": "string"
      +    },
      +    "title": {
      +      "type": "string"
      +    },
      +    "total_length": {
      +      "description": "Bytes of the whole stored page",
      +      "type": "integer"
      +    },
      +    "truncated": {
      +      "type": "boolean"
      +    },
      +    "url": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "site_key",
      +    "url",
      +    "title",
      +    "content",
      +    "content_length",
      +    "total_length",
      +    "offset",
      +    "truncated",
      +    "depth",
      +    "crawled_at",
      +    "content_hash",
      +    "headings",
      +    "source"
      +  ],
      +  "type": "object"
      +}
  3. First observed

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, closed-world, non-destructive, so the safety profile is carried elsewhere. The description nevertheless adds real behavioral context: no network access, content_selector already applied, truncation at max_bytes, and continuation via the next_offset returned in the response. Minor gap: it does not mention that offset values are byte-based here, though the schema covers that.

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?

Five short sentences, each carrying distinct information: what it returns, how it differs from get_page, the discovery workflow, the anchor shortcut, and pagination. No filler and the differentiation is front-loaded.

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?

With an output schema present, return values need not be explained, yet the description still covers truncation and continuation. For a 5-parameter read tool with full schema coverage and annotations, nothing an agent needs to call it correctly is missing.

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 100%, so baseline is 3, but the description adds meaning beyond the schema: it links anchor to search_docs results, explains offset as continuation of a truncated page, and explains max_bytes truncation behavior. It also references a next_offset return field, which pairs with the offset parameter rather than duplicating it.

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 (return a page's markdown from stored crawl output) and immediately contrasts it with the sibling get_page, explaining the exact difference (crawled copy with content_selector applied vs live re-fetch). An agent can distinguish the two without opening either schema.

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?

Explicitly routes the agent: list_pages to discover URLs, read_page to read them, get_page for live fetching, and passing a search_docs anchor to read only a section. This covers both when to use it and which sibling to pick instead.

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