Skip to main content
Glama
creandoaldia

Wafle-Scraper

by creandoaldia
██╗    ██╗  █████╗  ███████╗██╗     ███████╗
██║    ██║ ██╔══██╗ ██╔════╝██║     ██╔════╝
██║ █╗ ██║ ███████║ █████╗  ██║     █████╗
██║███╗██║ ██╔══██║ ██╔══╝  ██║     ██╔══╝
╚███╔███╔╝ ██║  ██║ ██║     ███████╗███████║
 ╚══╝╚══╝  ╚═╝  ╚═╝ ╚═╝     ╚══════╝╚══════╝

Wafle-Scraper — Universal MCP Server for Safe Web Scraping

Wafle-Scraper is an MCP server that lets AI agents (OpenCode, Claude, Cursor) extract data from the web safely and responsibly.

Safety First

Rule

Enforcement

No private data

Every browser session is incognito — no cookies, no localStorage, no saved passwords

Only what you ask

The scraper never mines extra data beyond your explicit request

No localhost

Internal/private IPs are blocked by default

Rate limited

Minimum 2 seconds between requests — never floods servers

CAPTCHA = human only

No automated CAPTCHA solving. If one appears, you solve it interactively

User-Agent rotation

Each request looks like a real browser

Related MCP server: sessemi-mcp

Quick Start

pip install wafle-scraper
playwright install chromium
wafle-scraper

Configuration

OpenCode / Claude Desktop / Cursor

{
  "mcpServers": {
    "wafle-scraper": {
      "command": "wafle-scraper",
      "description": "Web scraping & browser automation — incognito, audited, safe"
    }
  }
}

CLI Options

wafle-scraper                    # MCP stdio mode (default for agents)
wafle-scraper --http --port 8000 # HTTP SSE mode
wafle-scraper --version          # Show version

MCP Tools

Tool

Description

Safety

scrape_url

Extract text from a static URL (requests + BeautifulSoup)

✅ Read-only, no JS

scrape_browser

Navigate a page in isolated incognito browser and extract text

✅ Incognito, no cookies

scrape_reddit

Fetch public posts from a subreddit via official API

✅ API, no scraping

extract_emails

Find email addresses on a public page

✅ Only what you ask

browser_interact

Click, type, scroll, extract, screenshot in live browser

✅ You control the actions

Browser Backend (Playwright)

  • Incognito always: storage_state=None, fresh context per session

  • No permissions: No camera, mic, location access

  • Anti-detection: Rotating UA, viewport, locale, timezone

  • Natural delays: Human-like timing between actions

  • Gradual scroll: Loads lazy content naturally

CAPTCHA Handling

Wafle-Scraper does NOT solve CAPTCHAs automatically. When a CAPTCHA is detected:

  1. The scraper pauses

  2. Prompts you to open the URL in your browser

  3. You solve the CAPTCHA manually

  4. Type done and the scraper continues

This is the only ethical and reliable approach without paid services.

Security

  • Blocked: localhost, 127.0.0.1, private IPs, file://, chrome://

  • Rate limiting (configurable, default 2s min interval)

  • Scope enforcement — only processes what you explicitly request

  • User-Agent rotation

  • Browser isolation — Playwright contexts are fully sandboxed

Requirements

  • Python 3.10+

  • Playwright with Chromium installed (playwright install chromium)

  • Windows, macOS, Linux

Dependencies

Standalone — no other MCP servers required.

Known Issues

Issue

Detail

Status

CDP health check unstable

_cdp_health_check() creates a throwaway context just to eval 1+1. Masks real CDP issues instead of diagnosing them.

🟡 Medium

CAPTCHA handler is interactive only

CAPTCHA solver relies on stdin — doesn't work in MCP server mode (no stdin available in stdio transport).

🔴 High

_safe_goto only 2 retries

No exponential backoff, no proxy fallback. If 2 attempts fail, the whole scrape fails.

🟡 Medium

Error strings instead of exceptions

browser_navigate, browser_click, etc. return "Error: ..." strings instead of raising. Consumers must parse strings.

🟡 Medium

Single browser context

Only 1 context at a time. Concurrent scrape_browser calls cause race conditions.

🔴 High

Reddit HTML fallback is silent

If JSON API fails, falls back to old.reddit.com without logging the fallback path.

🟢 Low

Installation from Source

git clone https://github.com/creandoaldia/wafle-scraper.git
cd wafle-scraper
pip install -e .
playwright install chromium

License

MIT

Why "Wafle-Scraper"?

Part of the WAFLE ecosystem (Web AI Framework for Language Ecosystems). Wafle-Scraper gives WAFLE agents the ability to read the live web — safely, transparently, and under your control.

Available Tools

5 tools
browser_interactC

Interact with the active browser page (click, type, extract).

ParametersJSON Schema
NameRequiredDescriptionDefault
valueNo
actionYes
selectorNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.3/5.0
Behavior2/5

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

With no annotations, the description must disclose behavioral traits. It mentions actions but does not indicate that clicking/typing are mutational, whether modifications are reversible, or the need for page focus. Output schema exists but return values are not described.

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

Conciseness2/5

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

The description is a single sentence, but it is under-specified rather than concise; it lacks critical details about parameter usage and behavior, making it inefficient for an agent to use correctly.

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

Completeness1/5

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

Given three parameters, no annotation support, and no parameter descriptions, the description fails to provide essential context. It does not cover how to specify actions, query selectors, or input values, leaving the agent to guess.

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

Parameters1/5

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

Schema coverage is 0%, so the description must compensate. It lists 'click, type, extract' but does not map them to the 'action' parameter, nor explain the meaning of 'selector' and 'value' in relation to these actions. Parameter semantics are entirely absent.

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?

The description specifies the verb 'Interact' and lists example actions (click, type, extract), making it clear that this tool manipulates the active browser page. It distinguishes from sibling tools like scrape_browser which are read-only scraping.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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

No guidance is given on when to use this tool versus alternatives, nor any prerequisites or limitations (e.g., when to prefer a specific sibling tool). The description is purely functional.

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

extract_emailsB

Find email addresses on a public page.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

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

With no annotations, the description carries full transparency burden. It states the tool 'finds' emails on a 'public page' but does not disclose how it works (e.g., HTTP request vs local parsing), whether authentication is needed, or any limitations.

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?

The description is a single, clear sentence that front-loads the verb. It is appropriately sized with no wasted words.

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

Completeness3/5

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

For a simple tool with one parameter and an output schema, the description is adequate but minimal. It could add behavioral context (e.g., 'Extracts all anchor text' or 'Results include email addresses found in visible HTML').

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

Parameters2/5

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

Schema coverage is 0%, so the description must add meaning. It clarifies that the 'url' parameter refers to a public page, but adds no further syntax or format details. For a single parameter, this is minimally helpful.

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 'Find email addresses on a public page' uses a specific verb and resource, clearly indicating the tool's function. It distinguishes itself from sibling tools like 'scrape_url' (general scraping) and 'scrape_reddit' (platform-specific), making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. Given sibling tools like 'scrape_url' may also extract emails, lack of usage context makes it harder for an agent to choose correctly.

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

scrape_browserC

Navigate a page in an isolated incognito browser and extract text.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes
scrollNo
wait_selectorNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.6/5.0
Behavior2/5

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

With no annotations, the description must disclose behavioral traits. It mentions 'isolated incognito browser' implying privacy, but does not explain JavaScript handling, error behavior, or return format. The output schema exists but is not referenced.

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 description is a single sentence of 9 words, front-loaded with the core action. However, given the tool's complexity (3 parameters, output schema), it is too brief to be fully informative, balancing conciseness with substance.

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

Completeness2/5

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

The description does not cover parameter usage, output format, or behavioral details. With no annotations and low schema coverage, the description is insufficient for an agent to use the tool correctly without additional inference.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate. It does not explain the 'scroll' or 'wait_selector' parameters beyond their names, which are somewhat self-explanatory but lack context (e.g., scroll for dynamic loading, wait_selector for element visibility).

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?

The description states 'Navigate a page in an isolated incognito browser and extract text,' which clearly identifies the tool's main action and resource. It distinguishes from siblings like 'browser_interact' (which likely involves interaction) and 'scrape_reddit' (site-specific), though the term 'extract text' could be more specific about scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives such as 'scrape_url' or 'browser_interact'. The description lacks any context about prerequisites, scenarios, or exclusions.

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

scrape_redditB

Fetch public posts from a subreddit via the official Reddit API.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNohot
limitNo
subredditYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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

No annotations provided, so description carries full burden. Only notes 'public posts' implying read-only, but fails to disclose rate limits, authentication needs, error handling, pagination, or other behavioral traits.

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?

Single sentence is concise and to the point. Could include more detail without being verbose, but structure is efficient.

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

Completeness3/5

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

Tool is low complexity with 3 parameters and an output schema reducing burden. However, description lacks usage guidelines and parameter details, making it only adequately complete.

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

Parameters1/5

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

Schema description coverage is 0%, yet the description adds no explanation of sort or limit parameters beyond their names and defaults. Does not compensate for the lack of schema descriptions.

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?

Clearly states verb 'Fetch', resource 'public posts from a subreddit', and method 'via the official Reddit API'. This distinguishes it from sibling tools like scrape_browser which use different scraping approaches.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

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

Implied usage for fetching Reddit posts, but no explicit guidance on when to use vs alternatives like scrape_browser or scrape_url, nor any exclusions or prerequisites.

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

scrape_urlC

Extract readable text content from a static URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes
extract_linksNo
extract_imagesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, and the description only states 'static URL' and 'extract readable text content'. It fails to disclose important behaviors like handling of redirects, error states, or any limitations beyond the static nature.

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?

The description is a single sentence with no extraneous content, front-loading the core purpose efficiently.

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

Completeness2/5

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

Despite having 3 parameters and an output schema, the description does not explain the optional extraction behaviors or the format of the output. It lacks sufficient detail for an agent to fully understand the tool's capabilities.

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

Parameters1/5

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

Schema coverage is 0%, meaning the description adds no meaning to the parameters. It does not mention the optional extract_links or extract_images flags, leaving the agent to infer their purpose solely from the schema.

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 uses the specific verb 'Extract' and the resource 'readable text content from a static URL', clearly distinguishing it from sibling tools like 'scrape_browser' (dynamic content) and 'browser_interact' (interactive browsing).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives like 'scrape_browser' or 'browser_interact'. The description does not mention any preconditions or exclusions.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 5 tool updatesv0.1.0
    • First observedbrowser_interact
    • First observedextract_emails
    • First observedscrape_browser
    • First observedscrape_reddit
    • First observedscrape_url

TDQS

B3/5.0
Disambiguation4/5

Most tools have clear purposes: extract_emails, scrape_reddit, and scrape_url are distinct. However, browser_interact and scrape_browser both involve browser interaction, potentially causing confusion despite different contexts (active page vs. isolated browser).

Naming Consistency3/5

Tools use snake_case but mix patterns: 'browser_interact' is noun_verb, while others like 'extract_emails' and 'scrape_browser' are verb_noun. The inconsistent placement of 'browser' in two tool names adds confusion.

Tool Count5/5

With 5 tools, the server covers static scraping, browser scraping, interaction, email extraction, and Reddit API access. This is a well-scoped set for a scraping-focused server.

Completeness4/5

The tool set covers core scraping needs: static URLs, dynamic pages, specific platform (Reddit), email extraction, and interaction. Minor gaps like handling pagination or form submission exist but are acceptable for this scope.

Maintenance

ActivityInactive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI agents to scrape websites protected by Cloudflare, DataDome, and Akamai, bypassing anti-bot measures to retrieve page content.
    2
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents to crawl and scrape websites, converting HTML to clean Markdown and structured metadata with support for JavaScript rendering, bot evasion, and SSRF protection.
    169
    MIT

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/creandoaldia/wafle-scraper'

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