Skip to main content
Glama

Map a website

map

Build a cached link inventory for a website by combining sitemap discovery with homepage link extraction, then filter and paginate internal, external, or subdomain URLs before scraping.

Instructions

Build (or fetch a cached) link-map for a website by combining sitemap discovery with homepage link extraction. Returns paginated lists of discovered URLs, each item just { url }. Filterable by link type (internal / external / subdomain). Use this to enumerate a site before scraping selected pages. max_urls (default 5000, max 100000) is a discovery budget, not a trim at the end: discovery stops as soon as that many URLs are found, so a smaller value is a faster, cheaper crawl. A map stopped that way returns exactly max_urls links with response_capped false — the signal that the site has more is response_meta.truncation.discovery_cap_reason. When that is "max_urls", ask again with a higher max_urls to get more; "unread_files" means a sitemap file could not be read this time and is often temporary, so asking again later can return more; "time", "file_budget", "depth" and "file_size" mean the site itself is big, slow or deep and a retry will not help. discovery_capped says discovery stopped early, sitemaps_skipped how many sitemap files were skipped or only partly read. limit (default 5000, max 10000) only pages the answer. Set zero_data_retention: true to keep the result out of the shared cache; anything stored to deliver it is kept for 24 hours, then deleted. It adds 1 credit and must be enabled for the organization (else a zero_data_retention_not_enabled error, not billed). See https://crawlbrulee.com/docs/zero-data-retention. Returned URLs are normalized the same way scrape normalizes its returned url, so map-then-scrape stays on one host. Results are ordered with the most useful links first. The response carries response_meta.usage: total_credit_cost = engine_credit_cost × proxy_multiplier + zero_data_retention_credit_cost, plus engine and proxy (the resolved tier, never auto). Map has no screenshot slicing and no page_status_code: it reads many files, not one page. A map that found nothing because the site answered only with statuses we don't bill (a 5xx, for example), or not at all, is empty and free. If the site cannot be reached, the tool can return a target_unreachable error (HTTP 502, not billed): retry later or check the URL.

Input Schema

NameRequiredDescriptionDefault
urlYesThe website URL to map. Mapping always targets the site root, so the path, query string and fragment are dropped; known tracking parameters are removed before the request is processed.
pageNoPage number for paginated results
cacheNoCache settings for this request
limitNoNumber of URLs to return per page. Default 5000, maximum 10000.
proxyNoProxy tier to use for fetchingauto
typesNoFilter which link types to include
locationNoOptional country emulation for the map
max_urlsNoMaximum number of URLs to discover and store in the map. Default 5000, maximum 100000. Sitemap discovery stops as soon as this many URLs have been found, so a smaller value is a faster and lighter crawl, not just a smaller answer.
sitemap_onlyNoOnly use sitemap.xml — skip homepage link extraction
zero_data_retentionNoKeeps the result out of the shared cache; anything stored to deliver it is kept for 24 hours, then deleted. Adds 1 credit. Must be enabled for your organization. See https://crawlbrulee.com/docs/zero-data-retention.

Output Schema

NameRequiredDescriptionDefault
linksYesList of discovered URLs for the current page
response_metaYesResponse metadata including pagination, truncation, and usage info

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv1.3.3
    • changedInput schema / properties / cache / properties / max_age / anyOf
      Previous value: -[
      -  {
      -    "maximum": 9007199254740991,
      -    "minimum": 0,
      -    "type": "integer"
      -  },
      -  {
      -    "format": "date-time",
      -    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
      -    "type": "string"
      -  }
      -]New value: +[
      +  {
      +    "maximum": 9007199254740991,
      +    "minimum": 0,
      +    "type": "integer"
      +  },
      +  {
      +    "format": "date-time",
      +    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
      +    "type": "string"
      +  }
      +]
  2. Changed5 schema fields changedv1.1.1
    • addedInput schema / properties / zero_data_retention
      Added value: +{
      +  "description": "Keeps the result out of the shared cache; anything stored to deliver it is kept for 24 hours, then deleted. Adds 1 credit. Must be enabled for your organization. See https://crawlbrulee.com/docs/zero-data-retention.",
      +  "type": "boolean"
      +}
    • changedOutput schema / properties / response_meta / properties / usage / description
      Previous value: -"What this map request cost: total_credit_cost = engine_credit_cost × proxy_multiplier, plus the billed engine and the resolved proxy tier."New value: +"What this map request cost: total_credit_cost = engine_credit_cost × proxy_multiplier + zero_data_retention_credit_cost, plus the billed engine and the resolved proxy tier."
    • removedOutput schema / properties / response_meta / properties / usage / properties / credits
      Removed value: -{
      -  "deprecated": true,
      -  "description": "Deprecated: use total_credit_cost, which always has the same value. This field will be removed in a future version.",
      -  "maximum": 9007199254740991,
      -  "minimum": 0,
      -  "type": "integer"
      -}
    • changedOutput schema / properties / response_meta / properties / usage / properties / total_credit_cost / description
      Previous value: -"Credits charged for this map request. Always equals engine_credit_cost × proxy_multiplier. 0 for a cache hit, and for an empty map when the site answered only with statuses we do not bill (a 5xx, for example) or not at all. Older api versions do not send it; read `credits` then, which has the same value."New value: +"Credits charged for this map request. Always equals engine_credit_cost × proxy_multiplier + zero_data_retention_credit_cost. 0 for a cache hit, and for an empty map when the site answered only with statuses we do not bill (a 5xx, for example) or not at all. Older api versions do not send it."
    • addedOutput schema / properties / response_meta / properties / usage / properties / zero_data_retention_credit_cost
      Added value: +{
      +  "description": "Credits added by zero data retention: 1 on a billed, fresh result, else 0. Older api versions do not send it.",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
  3. Changed7 schema fields changedv1.1.0
    • changedOutput schema / properties / response_meta / properties / usage / description
      Previous value: -"Usage accounting for this map request: credits charged, the billed engine, and the resolved proxy tier."New value: +"What this map request cost: total_credit_cost = engine_credit_cost × proxy_multiplier, plus the billed engine and the resolved proxy tier."
    • addedOutput schema / properties / response_meta / properties / usage / properties / credits / deprecated
      Added value: +true
    • changedOutput schema / properties / response_meta / properties / usage / properties / credits / description
      Previous value: -"Credits charged for this map request"New value: +"Deprecated: use total_credit_cost, which always has the same value. This field will be removed in a future version."
    • addedOutput schema / properties / response_meta / properties / usage / properties / engine_credit_cost
      Added value: +{
      +  "description": "The engine base charged, before the proxy multiplier: 1 for \"http\", 0 for \"cache\". Also 0 for an empty map that is not billed. Older api versions do not send it.",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / response_meta / properties / usage / properties / proxy_multiplier
      Added value: +{
      +  "description": "The multiplier of the proxy tier the request ran on: 1 for \"basic\", 5 for \"advanced\". Always reported, even when the engine cost is 0. Older api versions do not send it.",
      +  "exclusiveMinimum": 0,
      +  "maximum": 9007199254740991,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / response_meta / properties / usage / properties / total_credit_cost
      Added value: +{
      +  "description": "Credits charged for this map request. Always equals engine_credit_cost × proxy_multiplier. 0 for a cache hit, and for an empty map when the site answered only with statuses we do not bill (a 5xx, for example) or not at all. Older api versions do not send it; read `credits` then, which has the same value.",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • changedOutput schema / properties / response_meta / properties / usage / required
      Previous value: -[
      -  "credits",
      -  "engine",
      -  "proxy"
      -]New value: +[
      +  "engine",
      +  "proxy"
      +]
  4. First observedv1.0.3

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does most of it: it discloses caching behavior, the 24-hour retention for zero_data_retention, the +1 credit and org-enablement requirement, the credit formula, which empty results are free, and two named error modes (target_unreachable, zero_data_retention_not_enabled). It stops short of stating outright that the operation is read-only/non-destructive or describing auth/rate-limit behavior, which keeps it off a 5.

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

Conciseness4/5

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

The purpose and the map-before-scrape routing are front-loaded, and every paragraph is topic-coherent. It is long for a tool description, and the dense enumeration of truncation reason strings plus the credit-cost formula push toward reference-doc territory, but the material is largely load-bearing rather than filler.

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?

Despite an output schema existing, the description covers the things the schema cannot: how to interpret `response_capped`, what each `discovery_cap_reason` implies for retry, free-vs-billed outcomes, and URL normalization parity with `scrape`. Nothing an agent needs in order to call this correctly or interpret the result is missing.

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

Parameters5/5

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

Schema coverage is already 100%, so the baseline is 3, but the description adds genuinely new meaning: `max_urls` is a discovery budget that halts the crawl early rather than a post-hoc trim, while `limit` only pages the answer. It also explains the `response_capped` flag, `truncation.discovery_cap_reason` values, and the cost/eligibility semantics of `zero_data_retention` — none of which the schema conveys.

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 — 'Build (or fetch a cached) link-map for a website by combining sitemap discovery with homepage link extraction' — and distinguishes itself from the scrape family by saying 'Use this to enumerate a site before scraping selected pages.' An agent can tell this apart from scrape, scrape_async, and scrape_result 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 Guidelines5/5

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

Explicitly names the workflow position (before scraping selected pages) and the alternative it feeds into. It goes further by giving decision rules for retries: raise max_urls when `discovery_cap_reason` is 'max_urls', retry later when 'unread_files', and do not retry for 'time', 'file_budget', 'depth', 'file_size'. This is unusually actionable when-to-use guidance.

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