Skip to main content
Glama
alterlab-mcp-server

alterlab-mcp-server

alterlab_crawl

Crawl an entire website and return each page’s content for RAG, indexing, or site-wide export, including JavaScript-heavy and protected sites. Returns a crawl_id for retrieving results.

Instructions

Crawl a whole website and return the content of every page, for RAG, indexing or site-wide export. Use when you need many pages from one domain; for one URL use alterlab_scrape, for a URL list only use alterlab_map. Works on JavaScript-heavy and protected sites, with anti-bot handling on every page. Returns a crawl_id immediately; results are available from GET /api/v1/crawl/{crawl_id}.

Input Schema

NameRequiredDescriptionDefault
urlYesStart URL for the crawl
cacheNoServe pages from the response cache when available
delayNoPoliteness delay between page requests, in seconds (0-30)
budgetNoPer-path page budget: glob pattern -> max pages, most specific pattern wins, '*' is the catch-all (e.g., {"/products/*": 100, "/blog/*": 50, "*": 5}). max_pages stays the hard cap.
formatsNoOutput formats for each scraped page. 'markdown' is best for LLM consumption. 'json_v2' returns a structured section tree (headings + content blocks). 'rag' returns chunked text optimized for retrieval-augmented generation. 'raw' returns the raw response body without extraction. 'content' returns body_markdown + content_hash + images + links for AI/KB pipelines.
headersNoCustom HTTP headers injected into every page request during the crawl (e.g., {"Authorization": "Bearer token"}). Maximum 50 headers.
sitemapNoSitemap mode: include (default), skip (link extraction only), only (sitemap URLs only)include
storageNoWhere crawl results are stored (API default 'redis')
timeoutNoPer-page request timeout in seconds (1-300)
webhookNoDetailed webhook config (events, signing secret, headers); use instead of webhook_url
priorityNoCrawl prioritisation hints (keywords, boost_patterns, demote_patterns)
wait_forNoCSS selector to wait for before extracting each page (e.g., '#main-content'). Applied to all pages in the crawl.
cache_ttlNoCache TTL in seconds (60-86400). Requires cache=true
max_depthNoMaximum link-following depth from start URL (0 = start page only)
max_pagesNoMaximum number of pages to scrape
render_jsNoRender JavaScript on crawled pages. true=always (Tier 4, $0.004/page), false=never, auto=smart detection per page
use_proxyNoRoute all crawl requests through premium proxy (+$0.0002/page)
extractionNoSet to 'auto' for automatic page-type detection and extraction without a user-defined schema. Mutually exclusive with extraction_schema.
screenshotNoCapture a screenshot of each crawled page (requires render_js)
webhook_urlNoWebhook URL to notify on crawl completion
sitemap_pathNoExplicit path to the sitemap file (e.g., '/sitemap_index.xml'). Use when the sitemap is not at the standard /sitemap.xml location.
cost_controlsNoCost controls for the entire crawl — cap total spend or pin the scraping tier
force_refreshNoBypass the cache and fetch every page fresh
depth_strategyNoLink-discovery strategy (API default 'sequential')
respect_robotsNoRespect robots.txt rules for the target domain
change_trackingNoTrack page changes between crawls
max_concurrencyNoMaximum concurrent pages to scrape simultaneously
exclude_patternsNoGlob patterns — skip URLs whose path matches any (e.g., ['/tag/*', '/author/*'])
extraction_modelNoPer-request LLM model override in provider-specific format (e.g. 'gpt-4o', 'claude-opus-4-5-20251101', 'llama3-70b-8192'). Overrides the model saved in your BYOK key settings for this request only.
include_patternsNoGlob patterns — only scrape URLs whose path matches at least one (e.g., ['/blog/*', '/docs/*'])
extraction_schemaNoJSON schema for structured extraction on each page
extraction_profileNoPre-defined extraction profile applied to every crawled page. 'auto' detects the page type automatically.
include_subdomainsNoInclude links to subdomains during discovery
extraction_providerNoBYOK LLM provider used for extraction on each page
extraction_templateNoAlias for extraction_profile (mutually exclusive with it)

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed28 schema fields changedv1.9.0
    • removedInput schema / properties / block_images
      Removed value: -{
      -  "default": false,
      -  "description": "Block image downloads during browser rendering on each crawled page. Reduces proxy bandwidth and speeds up crawls. Only effective with render_js=true.",
      -  "type": "boolean"
      -}
    • addedInput schema / properties / budget
      Added value: +{
      +  "additionalProperties": {
      +    "type": "integer"
      +  },
      +  "description": "Per-path page budget: glob pattern -> max pages, most specific pattern wins, '*' is the catch-all (e.g., {\"/products/*\": 100, \"/blog/*\": 50, \"*\": 5}). max_pages stays the hard cap.",
      +  "type": "object"
      +}
    • addedInput schema / properties / cache
      Added value: +{
      +  "description": "Serve pages from the response cache when available",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / cache_ttl
      Added value: +{
      +  "description": "Cache TTL in seconds (60-86400). Requires cache=true",
      +  "maximum": 86400,
      +  "minimum": 60,
      +  "type": "integer"
      +}
    • addedInput schema / properties / change_tracking
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Track page changes between crawls",
      +  "properties": {
      +    "enabled": {
      +      "type": "boolean"
      +    },
      +    "include_diff": {
      +      "description": "Include a diff of changed pages",
      +      "type": "boolean"
      +    },
      +    "mode": {
      +      "enum": [
      +        "content",
      +        "structured"
      +      ],
      +      "type": "string"
      +    },
      +    "tracking_id": {
      +      "description": "Stable ID to compare this crawl against earlier crawls with the same ID",
      +      "maxLength": 200,
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • changedInput schema / properties / cost_controls / properties / max_tier / description
      Previous value: -"Maximum tier to use for page scrapes (1=curl $0.0002, 2=http $0.0003, 3=stealth $0.002, 3.5=lightjs $0.0025, 4=browser $0.004)"New value: +"Maximum tier to use for page scrapes (1=curl $0.0002, 2=http $0.0003, 3=stealth $0.002, 3.5=lightjs $0.0025, 4=browser $0.004). render_js=true with a max_tier below 4 is rejected (render_js forces tier 4)."
    • addedInput schema / properties / delay
      Added value: +{
      +  "description": "Politeness delay between page requests, in seconds (0-30)",
      +  "maximum": 30,
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / depth_strategy
      Added value: +{
      +  "description": "Link-discovery strategy (API default 'sequential')",
      +  "enum": [
      +    "eager",
      +    "sequential"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / exclude_patterns / maxItems
      Added value: +50
    • addedInput schema / properties / extraction
      Added value: +{
      +  "const": "auto",
      +  "description": "Set to 'auto' for automatic page-type detection and extraction without a user-defined schema. Mutually exclusive with extraction_schema.",
      +  "type": "string"
      +}
    • changedInput schema / properties / extraction_profile / enum
      Previous value: -[
      -  "auto",
      -  "product",
      -  "article",
      -  "job_posting",
      -  "faq",
      -  "recipe",
      -  "event"
      -]New value: +[
      +  "auto",
      +  "product",
      +  "article",
      +  "job_posting",
      +  "faq",
      +  "recipe",
      +  "event",
      +  "ecommerce_homepage",
      +  "directory_listing"
      +]
    • addedInput schema / properties / extraction_provider
      Added value: +{
      +  "description": "BYOK LLM provider used for extraction on each page",
      +  "enum": [
      +    "openai",
      +    "anthropic",
      +    "openrouter",
      +    "groq"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / extraction_template
      Added value: +{
      +  "$ref": "#/properties/extraction_profile",
      +  "description": "Alias for extraction_profile (mutually exclusive with it)"
      +}
    • addedInput schema / properties / force_refresh
      Added value: +{
      +  "description": "Bypass the cache and fetch every page fresh",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / formats / description
      Previous value: -"Output formats for each scraped page"New value: +"Output formats for each scraped page. 'markdown' is best for LLM consumption. 'json_v2' returns a structured section tree (headings + content blocks). 'rag' returns chunked text optimized for retrieval-augmented generation. 'raw' returns the raw response body without extraction. 'content' returns body_markdown + content_hash + images + links for AI/KB pipelines."
    • changedInput schema / properties / formats / items / enum
      Previous value: -[
      -  "text",
      -  "json",
      -  "json_v2",
      -  "html",
      -  "markdown"
      -]New value: +[
      +  "text",
      +  "json",
      +  "json_v2",
      +  "html",
      +  "markdown",
      +  "rag",
      +  "content"
      +]
    • addedInput schema / properties / include_patterns / maxItems
      Added value: +50
    • addedInput schema / properties / priority
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Crawl prioritisation hints (keywords, boost_patterns, demote_patterns)",
      +  "properties": {
      +    "boost_patterns": {
      +      "description": "URL glob patterns to crawl earlier",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "demote_patterns": {
      +      "description": "URL glob patterns to crawl later",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "keywords": {
      +      "description": "Crawl pages matching these keywords first",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
    • removedInput schema / properties / render_js / default
      Removed value: -false
    • changedInput schema / properties / render_js / description
      Previous value: -"Render JavaScript on crawled pages. true=always (Tier 4), false=never, auto=smart detection per page"New value: +"Render JavaScript on crawled pages. true=always (Tier 4, $0.004/page), false=never, auto=smart detection per page"
    • addedInput schema / properties / screenshot
      Added value: +{
      +  "description": "Capture a screenshot of each crawled page (requires render_js)",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / storage
      Added value: +{
      +  "description": "Where crawl results are stored (API default 'redis')",
      +  "enum": [
      +    "redis",
      +    "s3",
      +    "r2"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / timeout / type
      Previous value: -"number"New value: +"integer"
    • addedInput schema / properties / url / maxLength
      Added value: +2083
    • removedInput schema / properties / use_proxy / default
      Removed value: -false
    • changedInput schema / properties / use_proxy / description
      Previous value: -"Route all crawl requests through premium proxy"New value: +"Route all crawl requests through premium proxy (+$0.0002/page)"
    • addedInput schema / properties / webhook
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Detailed webhook config (events, signing secret, headers); use instead of webhook_url",
      +  "properties": {
      +    "events": {
      +      "description": "Event names to deliver (default: all)",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "headers": {
      +      "additionalProperties": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    "metadata": {
      +      "additionalProperties": {},
      +      "description": "Opaque metadata echoed in every event",
      +      "type": "object"
      +    },
      +    "secret": {
      +      "description": "Signing secret for webhook payloads (8-256 chars)",
      +      "maxLength": 256,
      +      "minLength": 8,
      +      "type": "string"
      +    },
      +    "url": {
      +      "format": "uri",
      +      "maxLength": 2083,
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "url"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / webhook_url / maxLength
      Added value: +2083
  2. Changed6 schema fields changedv1.8.0
    • addedInput schema / properties / cost_controls
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Cost controls for the entire crawl — cap total spend or pin the scraping tier",
      +  "properties": {
      +    "force_tier": {
      +      "$ref": "#/properties/cost_controls/properties/max_tier",
      +      "description": "Force all pages to use this exact tier, bypassing per-page escalation"
      +    },
      +    "max_credits": {
      +      "description": "Hard spending cap in credits for the entire crawl",
      +      "exclusiveMinimum": 0,
      +      "type": "integer"
      +    },
      +    "max_tier": {
      +      "description": "Maximum tier to use for page scrapes (1=curl $0.0002, 2=http $0.0003, 3=stealth $0.002, 3.5=lightjs $0.0025, 4=browser $0.004)",
      +      "enum": [
      +        "1",
      +        "2",
      +        "3",
      +        "3.5",
      +        "4"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / extraction_profile
      Added value: +{
      +  "description": "Pre-defined extraction profile applied to every crawled page. 'auto' detects the page type automatically.",
      +  "enum": [
      +    "auto",
      +    "product",
      +    "article",
      +    "job_posting",
      +    "faq",
      +    "recipe",
      +    "event"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / headers
      Added value: +{
      +  "additionalProperties": {
      +    "type": "string"
      +  },
      +  "description": "Custom HTTP headers injected into every page request during the crawl (e.g., {\"Authorization\": \"Bearer token\"}). Maximum 50 headers.",
      +  "type": "object"
      +}
    • addedInput schema / properties / sitemap_path
      Added value: +{
      +  "description": "Explicit path to the sitemap file (e.g., '/sitemap_index.xml'). Use when the sitemap is not at the standard /sitemap.xml location.",
      +  "type": "string"
      +}
    • addedInput schema / properties / timeout
      Added value: +{
      +  "description": "Per-page request timeout in seconds (1-300)",
      +  "maximum": 300,
      +  "minimum": 1,
      +  "type": "number"
      +}
    • addedInput schema / properties / wait_for
      Added value: +{
      +  "description": "CSS selector to wait for before extracting each page (e.g., '#main-content'). Applied to all pages in the crawl.",
      +  "type": "string"
      +}
  3. Changed1 schema field changedv1.7.0
    • addedInput schema / properties / block_images
      Added value: +{
      +  "default": false,
      +  "description": "Block image downloads during browser rendering on each crawled page. Reduces proxy bandwidth and speeds up crawls. Only effective with render_js=true.",
      +  "type": "boolean"
      +}
  4. First observedv1.5.0

TDQS

A4.4/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 delivers the single most important behavioral fact: it is asynchronous, returning a crawl_id immediately with results fetched from GET /api/v1/crawl/{crawl_id} — which changes how an agent must sequence follow-up calls (likely to alterlab_crawl_status). It also discloses anti-bot/JS handling across all pages. It omits cost/politeness implications and that the job can be cancelled, which keeps it short of 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.

Conciseness5/5

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

Three tight sentences with zero filler: purpose and use cases first, sibling routing second, operational return contract last. Appropriate size for a 35-parameter tool and front-loaded with the scope constraint.

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

Completeness4/5

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

For a very complex, high-parameter, async tool with no annotations and no output schema, the description covers the essentials: what it produces, async polling contract, and scope. Remaining gaps (cost tier behavior, robots.txt default, cancellation) are all documented in the schema or handled by sibling tools such as alterlab_crawl_status and alterlab_crawl_cancel.

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 description coverage is 100% across all 35 parameters, so the schema already documents url, budget, cost_controls, extraction, and the rest in detail. The description adds no parameter-level meaning beyond the implicit note that anti-bot handling applies per page. Baseline 3 is correct when the schema does this much work.

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 ('Crawl a whole website and return the content of every page') plus the intended use cases (RAG, indexing, site-wide export). It explicitly distinguishes itself from alterlab_scrape (one URL) and alterlab_map (URL list only), so an agent can route between the three 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?

Gives explicit when-to-use ('many pages from one domain') and when-not-to-use, naming both alternatives and the conditions that select them. This is textbook sibling routing.

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