Skip to main content
Glama

Fetch a web page as Markdown

fetch_page
Read-onlyIdempotent

Read one public web page and return its main content as clean Markdown: headings, paragraphs, lists, quotes, code blocks, tables and absolute links, without menus, footers, scripts or cookie banners. Also returns the title, description, language, canonical address and up to 100 links from the content. robots.txt is checked first and a disallowed page is skipped with the reason. It never signs in, passes a paywall, solves a CAPTCHA or runs page scripts. Pass max_chars for more than 20000 characters. Not for what is said in a video: a YouTube video's transcript comes from transcribe_media in Transcript Kit.

Input Schema

NameRequiredDescriptionDefault
urlYesFull address of one public web page, such as "https://example.com/docs/intro". http is upgraded to https.
linksNoSet false to leave out the link list. Default true: up to 100 distinct links from the main content.
max_charsNoLongest Markdown to return, cut at a block end. Default 20000, from 1000 to 100000: a value outside that range is moved into it, with a note.

Output Schema

NameRequiredDescriptionDefault
urlYes
langNo
noteYes
as_ofYesISO 8601 time the data was published by its source or fetched from it. A cached answer keeps the time of its fetch.
charsNo
linksNo
notesNo
titleNo
wordsNo
reasonNo
sourceYesWho the data comes from, to cite and to check it against.
statusYes
messageNo
markdownNo
canonicalNo
final_urlNo
truncatedNo
fetched_atNo
from_cacheNo
descriptionNo
links_totalNo
content_typeNo
untrusted_sourceYes
retry_after_secondsNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • changedInput schema / properties / max_chars / description
      Previous value: -"Longest Markdown to return, cut at a block end. Default 20000, most 100000: a larger value returns 100000 with a note."New value: +"Longest Markdown to return, cut at a block end. Default 20000, from 1000 to 100000: a value outside that range is moved into it, with a note."
    • removedInput schema / properties / max_chars / minimum
      Removed value: -1000
    • changedInput schema / properties / url / maxLength
      Previous value: -400New value: +2000
  2. Changed3 schema fields changed
    • addedOutput schema / properties / as_of
      Added value: +{
      +  "description": "ISO 8601 time the data was published by its source or fetched from it. A cached answer keeps the time of its fetch.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / source
      Added value: +{
      +  "description": "Who the data comes from, to cite and to check it against.",
      +  "properties": {
      +    "name": {
      +      "type": "string"
      +    },
      +    "url": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "name",
      +    "url"
      +  ],
      +  "type": "object"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "url",
      -  "status",
      -  "untrusted_source",
      -  "note"
      -]New value: +[
      +  "url",
      +  "status",
      +  "untrusted_source",
      +  "note",
      +  "as_of",
      +  "source"
      +]
  3. Changed2 schema fields changed
    • changedInput schema / properties / max_chars / description
      Previous value: -"Longest Markdown to return, cut at a block end. Default 20000."New value: +"Longest Markdown to return, cut at a block end. Default 20000, most 100000: a larger value returns 100000 with a note."
    • removedInput schema / properties / max_chars / maximum
      Removed value: -100000
  4. First observed

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnly, idempotent, open-world, non-destructive, so the safety bar is low, yet the description still adds substantive behavior: robots.txt is checked and a disallowed page is skipped with a reason, and it will not sign in, bypass paywalls, solve CAPTCHAs, or execute page scripts. These are real limits an agent could otherwise only discover by failure.

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?

Front-loaded with the core action and output format, then limits, then the single sibling escape hatch. Roughly 100 words with no filler sentence; the exclusion for video arrives last where it belongs.

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, the description need not document return values, yet it briefly names the metadata returned (title, description, language, canonical, links), which is a bonus rather than padding. Combined with the stated failure mode for robots.txt and the anti-bot limits, 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.

Parameters3/5

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

Schema coverage is 100%, so url, links, and max_chars are already documented, including defaults and the clamping behavior. The description adds only a thin usage hint ("Pass max_chars for more than 20000 characters"), which restates the schema default rather than explaining new parameter meaning.

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?

"Read one public web page and return its main content as clean Markdown" is a specific verb plus resource, and the enumeration of what is kept versus stripped (headings, tables, absolute links; no menus, footers, scripts, cookie banners) pins the output shape precisely. An agent can distinguish this from extract_page_json or transcribe_media without opening any schema.

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?

It gives an explicit exclusion and a named alternative: not for video content, use transcribe_media for YouTube transcripts. It also tells the agent to raise max_chars past 20,000 characters. The gap is that the closest sibling, extract_page_json, is never contrasted, so an agent wanting structured data rather than Markdown gets no routing signal.

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.