Skip to main content
Glama

Web page to Markdown

scrape_markdown
Read-onlyIdempotent

Use it when an agent needs to read a web page, article, documentation, PDF, blog post, product or pricing page, news story or RSS feed. Returns the main content as clean Markdown ready for an LLM: navigation, ads, footers and sidebars removed (or mode: "full" for the whole page), real tables as Markdown tables, code blocks with their language, math as TeX, the real (not lazy-loaded placeholder) images, absolute links without same-page anchors, and no needless escaping. Also returns metadata from meta tags and JSON-LD (description, author, published and modified time, language, site name, canonical URL, image, schema.org type), the HTTP status, word and token counts, and optionally the page's links. PDFs come back as text by page (up to 100 pages, 15 MB; no OCR), RSS/Atom feeds as item lists, JSON pretty-printed, and JavaScript-built pages that embed their content as data (JSON-LD articleBody, Next.js) are read from it. Long pages are returned in parts of up to 100,000 characters: pass next_offset back as offset; strip_link_urls saves tokens. Bot checks ("Just a moment...") and pages with no readable text answer 422 and are not charged; JavaScript is not executed. No account or API key. You are only charged when a result is returned: invalid input (400) and upstream failures (4xx/5xx) are not settled. Costs $0.002 USDC per call via x402. Paid per call with x402 inside MCP (see the server instructions).

Input Schema

NameRequiredDescriptionDefault
urlYesPublic http(s) URL to read: a web page, PDF, text, JSON or RSS/Atom feed, e.g. https://example.com/article.
viaNoOptional: the tool whose next_calls suggested this call (filled in for you).
modeNomain (default): the article or main content only. full: the whole page, including navigation and footers.main
offsetNoStart at this character of the Markdown; pass the previous response's next_offset to read a long page in parts.
max_charsNoReturn at most this many characters (1,000-100,000, default 100,000).
include_linksNoAlso return the page's links as a list (url, text, internal). Default false.
strip_link_urlsNoWrite links as plain text in the Markdown (keeps the text, drops the URLs) to save tokens. Default false.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / via
      Added value: +{
      +  "description": "Optional: the tool whose next_calls suggested this call (filled in for you).",
      +  "maxLength": 64,
      +  "type": "string"
      +}
  2. Changed6 schema fields changed
    • addedInput schema / properties / include_links
      Added value: +{
      +  "default": false,
      +  "description": "Also return the page's links as a list (url, text, internal). Default false.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / max_chars
      Added value: +{
      +  "default": 100000,
      +  "description": "Return at most this many characters (1,000-100,000, default 100,000).",
      +  "maximum": 100000,
      +  "minimum": 1000,
      +  "type": "integer"
      +}
    • addedInput schema / properties / mode
      Added value: +{
      +  "default": "main",
      +  "description": "main (default): the article or main content only. full: the whole page, including navigation and footers.",
      +  "enum": [
      +    "main",
      +    "full"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / offset
      Added value: +{
      +  "default": 0,
      +  "description": "Start at this character of the Markdown; pass the previous response's next_offset to read a long page in parts.",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedInput schema / properties / strip_link_urls
      Added value: +{
      +  "default": false,
      +  "description": "Write links as plain text in the Markdown (keeps the text, drops the URLs) to save tokens. Default false.",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / url / description
      Previous value: -"Public http(s) URL of the page to convert, e.g. https://example.com/article."New value: +"Public http(s) URL to read: a web page, PDF, text, JSON or RSS/Atom feed, e.g. https://example.com/article."
  3. First observed

TDQS

A4.2/5.0
Behavior5/5

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

Far exceeds the annotations: it discloses that JS is not executed, that bot-check/empty pages return 422 and are not charged, that invalid input (400) and upstream failures are not settled, the exact cost ($0.002 USDC via x402), PDF limits (100 pages, 15 MB, no OCR), and JSON-LD/Next.js fallback behavior. This is exactly the value-add the annotations cannot carry.

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

Conciseness3/5

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

The single

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?

No output schema exists, so the description must describe returns, and it does thoroughly: Markdown body, extracted metadata fields, HTTP status, word/token counts, optional links, and pagination parts. Nothing an agent needs in order to call it and interpret results 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 the baseline is 3. The description goes further by explaining the cross-parameter pagination flow (pass next_offset back as offset) and the token-saving intent of strip_link_urls, which adds workflow meaning beyond the per-field schema text.

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?

States a precise verb+resource ('read a web page...') and enumerates the input types (article, documentation, PDF, RSS feed) plus the exact output (clean Markdown). Very clear. It does not, however, name or contrast any sibling such as web_search_read or scrape_batch, so the agent gets no explicit differentiation.

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?

The opening sentence gives a clear when-to-use trigger ('when an agent needs to read a web page...'). It does not state when NOT to use it or point to alternatives, so routing to siblings is left to inference.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources