Skip to main content
Glama
mysleekdesigns

CrawlForge MCP Server

scrape_with_actions

Read-only

Scrape pages that require interaction—logins, clicks, form fills, scrolling—by running browser actions first, then extracting content from SPAs and multi-step flows.

Instructions

Use this when you must interact with a page before scraping - login, click buttons, fill forms, scroll, or wait for dynamic content to load - for SPAs, login-gated content, or multi-step flows. Actions: wait, click, type, press, scroll, screenshot, executeJavaScript, select (dropdowns), hover, navigate. Set browserOptions.stealth:true to run the chain in the stealth browser. robots.txt is respected on every navigation. Screenshots from this tool are stored as crawlforge://screenshot/{actionId} resources. Not for pages that render without interaction (scrape) and not as the first attempt on a blocked site (stealth_mode operation:"scrape"). Cost: 5 credits. Example: scrape_with_actions({url: "https://app.com/dashboard", actions: [{type:"click",selector:"#login"},{type:"type",selector:"#email",text:"user@a.com"}]})

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
urlYesThe URL to scrape
actionsYesBrowser actions to perform before scraping
formatsNoOutput formats for scraped content
maxRetriesNoMaximum retry attempts on failure
redact_piiNoRedact personal data from the text this call returns, before it reaches your context window. true means the free regex pass over EMAIL, PHONE, FINANCIAL and SECRET. The result carries redaction:{entities,count}. Default: off
formAutoFillNoForm auto-fill configuration
browserOptionsNoBrowser configuration options
respect_robotsNoRespect the target site's robots.txt (default: true). Setting this to false is honoured, returns a warning in the response, and is recorded against your API key — it is your decision, not a silent default.
max_inline_charsNoLargest result to return inline, in characters of its JSON. Over it, the call returns a preview plus a result_handle for read_result instead of the whole result (default 40,000; env CRAWLFORGE_MAX_INLINE_CHARS)
extractionOptionsNoContent extraction options. selectors results are returned as content.json.extracted, so include "json" in formats when passing selectors — without it the extraction is not part of the response.
screenshotOnErrorNoCapture screenshot when an error occurs
captureScreenshotsNoTake screenshots during action execution
continueOnActionErrorNoContinue executing actions if one fails
captureIntermediateStatesNoCapture page state after each action

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. Changed11 schema fields changedv6.0.0
    • removedInput schema / additionalProperties
      Removed value: -false
    • removedInput schema / properties / actions / items / additionalProperties
      Removed value: -false
    • addedInput schema / properties / actions / items / properties / args / items
      Added value: +{}
    • removedInput schema / properties / actions / items / properties / position / additionalProperties
      Removed value: -false
    • removedInput schema / properties / browserOptions / additionalProperties
      Removed value: -false
    • removedInput schema / properties / extractionOptions / additionalProperties
      Removed value: -false
    • addedInput schema / properties / extractionOptions / properties / selectors / propertyNames
      Added value: +{
      +  "type": "string"
      +}
    • removedInput schema / properties / formAutoFill / additionalProperties
      Removed value: -false
    • removedInput schema / properties / formAutoFill / properties / fields / items / additionalProperties
      Removed value: -false
    • addedInput schema / properties / max_inline_chars
      Added value: +{
      +  "description": "Largest result to return inline, in characters of its JSON. Over it, the call returns a preview plus a result_handle for read_result instead of the whole result (default 40,000; env CRAWLFORGE_MAX_INLINE_CHARS)",
      +  "maximum": 10000000,
      +  "minimum": 1000,
      +  "type": "integer"
      +}
    • addedInput schema / properties / redact_pii
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "boolean"
      +    },
      +    {
      +      "properties": {
      +        "entities": {
      +          "description": "Which classes to redact, case-insensitive: EMAIL, PHONE, FINANCIAL, SECRET, plus PERSON and LOCATION when mode is \"model\". Omitted or empty means all four regex classes (and both model classes in \"model\" mode). An unknown name, or a model-only name without mode:\"model\", is rejected",
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "mode": {
      +          "description": "\"fast\" (default) is regex only and free; \"model\" adds an Ollama NER pass for PERSON and LOCATION (+3 credits once per call)",
      +          "enum": [
      +            "fast",
      +            "model"
      +          ],
      +          "type": "string"
      +        },
      +        "replace_style": {
      +          "description": "\"tag\" (default) writes <EMAIL>, \"mask\" writes [REDACTED], \"remove\" deletes the value",
      +          "enum": [
      +            "tag",
      +            "mask",
      +            "remove"
      +          ],
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    }
      +  ],
      +  "description": "Redact personal data from the text this call returns, before it reaches your context window. true means the free regex pass over EMAIL, PHONE, FINANCIAL and SECRET. The result carries redaction:{entities,count}. Default: off"
      +}
  2. Changed1 schema field changedv5.6.6
    • changedInput schema / properties / extractionOptions / description
      Previous value: -"Content extraction options"New value: +"Content extraction options. selectors results are returned as content.json.extracted, so include \"json\" in formats when passing selectors — without it the extraction is not part of the response."
  3. Changed7 schema fields changedv5.4.0
    • changedInput schema / properties / actions / items / properties / type / enum
      Previous value: -[
      -  "wait",
      -  "click",
      -  "type",
      -  "press",
      -  "scroll",
      -  "screenshot",
      -  "executeJavaScript"
      -]New value: +[
      +  "wait",
      +  "click",
      +  "type",
      +  "press",
      +  "scroll",
      +  "screenshot",
      +  "executeJavaScript",
      +  "select",
      +  "hover",
      +  "navigate"
      +]
    • addedInput schema / properties / actions / items / properties / url
      Added value: +{
      +  "description": "navigate: URL to navigate to — goes through the same SSRF and robots.txt gate as the initial URL",
      +  "format": "uri",
      +  "type": "string"
      +}
    • addedInput schema / properties / actions / items / properties / value
      Added value: +{
      +  "description": "select: option to choose, matched by value or label",
      +  "type": "string"
      +}
    • addedInput schema / properties / actions / items / properties / values
      Added value: +{
      +  "description": "select: options to choose in a multi-select, matched by value or label",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / actions / items / properties / waitUntil
      Added value: +{
      +  "description": "navigate: when to consider navigation complete",
      +  "enum": [
      +    "load",
      +    "domcontentloaded",
      +    "networkidle",
      +    "commit"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / browserOptions / properties / stealth
      Added value: +{
      +  "default": false,
      +  "description": "Run the action chain in the stealth browser (randomized fingerprint, WebRTC/canvas spoofing) instead of the standard browser pool. Renders JavaScript; it does not solve challenges.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / respect_robots
      Added value: +{
      +  "description": "Respect the target site's robots.txt (default: true). Setting this to false is honoured, returns a warning in the response, and is recorded against your API key — it is your decision, not a silent default.",
      +  "type": "boolean"
      +}
  4. Changed3 schema fields changedv5.0.4
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / properties / actions / items / properties / x
      Added value: +{
      +  "description": "scroll: absolute X coordinate to scroll to (window.scrollTo; with y, takes precedence over direction/distance)",
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / actions / items / properties / y
      Added value: +{
      +  "description": "scroll: absolute Y coordinate to scroll to (window.scrollTo; with x, takes precedence over direction/distance)",
      +  "minimum": 0,
      +  "type": "number"
      +}
  5. First observedv4.10.0

TDQS

A3.7/5.0
Behavior1/5

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

This is an annotation contradiction. The description says the tool performs browser interactions such as clicking, typing, form filling, and executing JavaScript, which can mutate remote page state or trigger side effects, while the annotations declare readOnlyHint=true and destructiveHint=false. The description does add useful context like robots.txt handling and screenshot storage, but the direct contradiction with the read-only hint is a serious behavioral disclosure failure.

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 description is front-loaded with the core use case, then presents exclusions, stealth guidance, robots behavior, cost, and an example in a logical order. It is longer than average, but the tool is complex with 14 parameters; the action list is slightly redundant with the schema enum, but it serves as a useful quick reference rather than fluff.

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 tool with 14 parameters, nested objects, and no output schema, the description covers usage triggers, exclusions, stealth mode, robots.txt, screenshot resources, cost, and a usage example. It does not explicitly describe the shape of the scrape result, the large-result result_handle path, or redaction behavior beyond what the schema describes, so a little more output-side context would make it fully complete.

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% and the schema itself provides detailed semantics for every parameter, including per-action enums, defaults, and constraints. The description adds a compact action list and a concrete example, but it does not explain parameter behavior beyond what the schema already provides, so the baseline 3 applies.

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?

The description opens with a specific trigger: "Use this when you must interact with a page before scraping" and enumerates concrete use cases (login, click buttons, fill forms, scroll, wait). It names the resource and distinguishes itself from siblings by stating it is not for pages that render without interaction and not a first attempt on blocked sites.

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?

The description is explicit about when to use the tool and when not to: it targets SPAs, login-gated content, and multi-step flows, and explicitly routes the no-interaction case to scrape and the blocked-site case to stealth_mode. This gives an agent clear decision rules without needing to inspect sibling tools.

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

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/mysleekdesigns/crawlforge-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server