Skip to main content
Glama
andyliszewski

webcrawl-mcp

webcrawl-mcp

PyPI version Python versions License: MIT

A lightweight MCP server that gives Claude Code (or any MCP client) the ability to scrape, search, map, and crawl the web — using free, open-source libraries. Firecrawl is supported as an optional fallback for JS-heavy sites when you have a key.

Why

Most scraping doesn't actually need a headless browser. trafilatura handles the ~80% case (articles, docs, blogs) locally, which is faster and keeps external API usage to a minimum. This server routes the easy stuff through local extraction and only falls back to Firecrawl when content quality is genuinely poor.

Related MCP server: searxng-mcp

Tools

Tool

Purpose

webcrawl_scrape

Fetch a single URL → {content, source} (markdown + provenance)

webcrawl_search

DuckDuckGo search (optionally scrape results, each with provenance)

webcrawl_map

Discover same-domain URLs from a starting page

webcrawl_crawl

BFS crawl multiple pages (each result includes provenance)

The source field on scraped content is one of static_http, static_http_retry, firecrawl_transport_fallback, or firecrawl_quality_fallback — see Fallback behavior.

Install

pip install webcrawl-mcp

Requires Python 3.12+.

Quick smoke test (should print Webcrawl MCP server running then exit cleanly with Ctrl-C):

webcrawl-mcp

Install from source (for development)

git clone https://github.com/andyliszewski/webcrawl-mcp.git
cd webcrawl-mcp
python -m venv venv
source venv/bin/activate      # Windows: venv\Scripts\activate
pip install -e .

Configure your MCP client

Claude Code

Create .mcp.json in your project root (or merge into ~/.claude/settings.json):

{
  "mcpServers": {
    "webcrawl": {
      "command": "uvx",
      "args": ["webcrawl-mcp"]
    }
  }
}

This uses uvx to run the package in a temporary environment — no manual install needed. If uvx is unavailable, install via pip install webcrawl-mcp and use "command": "webcrawl-mcp" with no args instead.

For a source checkout (development), point command at your venv's Python and use "args": ["-m", "webcrawl_mcp"].

Then in a Claude Code session run /mcp — you should see webcrawl listed with four tools.

Claude Desktop

Same JSON shape, placed in claude_desktop_config.json (see Anthropic's docs for the OS-specific path). Restart Claude Desktop after editing.

Other MCP clients (Cursor, Cline, Continue, Zed, etc.)

The command / args / env shape is standardized. Consult your client's MCP docs for where to put it.

Verify it's working

Ask your agent something like:

Use the webcrawl_scrape tool to fetch https://docs.python.org/3/library/asyncio.html and summarize the first section.

You should see the tool invocation in the client UI, followed by a summary grounded in the live page content. If nothing happens, see Troubleshooting.

Environment variables

All optional:

Variable

Default

Purpose

USER_AGENT

Mozilla/5.0 (compatible; WebcrawlMCP/1.0; …)

HTTP User-Agent

REQUEST_TIMEOUT

30

Seconds before request timeout

FIRECRAWL_API_KEY

(unset)

If set, enables Firecrawl fallback for low-quality extractions. Leave unset for a fully free setup.

FIRECRAWL_API_URL

https://api.firecrawl.dev/v1

Firecrawl endpoint

FALLBACK_ON_TRANSPORT_ERROR

false

If true and FIRECRAWL_API_KEY is set, route bot-blocked statuses (403, 429, 503) to Firecrawl instead of raising. Opt-in.

POLITE_MODE

true

On a 429 with a parseable Retry-After, retry the original request once after the indicated wait (capped at REQUEST_TIMEOUT) before falling through.

Set these inside the env block of your MCP config, not in your shell — MCP servers run under the client, not your terminal.

Fallback behavior

The scraper distinguishes extraction-quality failure from transport failure and reports which path produced the content via the source field.

Extraction-quality path (default):

  1. trafilatura extracts main content from HTML → source: static_http.

  2. If that fails or returns <200 chars, markdownify converts the raw HTML.

  3. If the result is still low-quality and FIRECRAWL_API_KEY is set, Firecrawl is used as a last resort → source: firecrawl_quality_fallback.

Transport path (opt-in):

If a request returns 403, 429, or 503 (typical bot-blocking responses):

  • With POLITE_MODE=true (default), a 429 carrying a Retry-After header gets one bounded retry of the original request → source: static_http_retry on success.

  • With FALLBACK_ON_TRANSPORT_ERROR=true and FIRECRAWL_API_KEY set, the request routes to Firecrawl instead of raising → source: firecrawl_transport_fallback.

  • Otherwise, the transport error is raised to the caller (current behavior).

Without a Firecrawl key, the tool is fully self-contained and free; FALLBACK_ON_TRANSPORT_ERROR is a no-op without a key.

Troubleshooting

Client doesn't list webcrawl under MCP servers. The command path is almost always the problem. It must be an absolute path to the Python binary inside your venv, not just python. Test it in a terminal: /path/you/configured -m webcrawl_mcp should print Webcrawl MCP server running.

ModuleNotFoundError: webcrawl_mcp. Either pip install -e . didn't run in the same venv as command, or PYTHONPATH is missing/wrong. Double-check both point at the same checkout.

Python version mismatch. Requires 3.12+. python --version inside your venv should report ≥ 3.12. If not, recreate the venv with a newer Python.

Scrapes return very little text. Some sites render with JavaScript and can't be extracted statically. Either set FIRECRAWL_API_KEY to enable the fallback path, or accept that this tool isn't the right fit for that specific site.

Search is slow or rate-limited. DuckDuckGo throttles bursty querying. Space out searches, or reduce num_results.

Responsible use

This tool is for fetching public web content for research, coding assistance, and similar legitimate uses. You are responsible for:

  • Respecting each target site's Terms of Service and robots.txt.

  • Not overloading servers — the built-in per-domain rate limiter helps, but don't circumvent it.

  • Complying with applicable laws around automated access and data use in your jurisdiction.

License

MIT — see LICENSE.

Acknowledgements

Built on top of trafilatura, httpx, beautifulsoup4, markdownify, ddgs, and fastmcp. Firecrawl integration uses the public Firecrawl API (not affiliated).

Available Tools

4 tools
webcrawl_crawlA

Crawl multiple pages starting from a URL.

Uses BFS to discover and fetch pages up to max_depth links away. Respects rate limiting between requests.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesStarting URL
max_pagesNoMaximum number of pages to fetch (default: 10)
max_depthNoMaximum link depth from start (default: 2)
include_patternsNoGlob patterns for URLs to include (e.g., ["*/docs/*"])

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Without annotations, the description carries full burden. It discloses BFS traversal and rate limiting, but lacks details on error handling, page content returned, or what happens on max_pages reached. Adequate but not thorough.

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?

Three concise sentences, front-loaded with purpose. No fluff. However, could be slightly more structured with explicit parameter usage guidance, but overall 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?

Covers basic operation and rate limiting, but missing details on include_patterns parameter behavior and output specifics (though output schema exists). Gaps in what pages are returned and error scenarios.

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% with clear parameter descriptions. The tool description mentions BFS and depth, but does not add new meaning beyond the schema. Baseline 3 is appropriate.

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 clearly states the tool 'crawl multiple pages starting from a URL', which is specific and distinguishable from sibling tools (map, scrape, search). The mention of BFS and depth further clarifies the operation.

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?

The description implies usage for crawling linked pages but does not explicitly state when to use versus alternatives or exclude when not appropriate. No guidance on when to pick this over webcrawl_scrape or webcrawl_search.

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

webcrawl_mapA

Discover URLs on a website.

Fetches the given URL and extracts all same-domain links.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesStarting URL to map from
limitNoMaximum number of URLs to return (default: 50)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

Without annotations, the description discloses the basic action but omits details like respect for robots.txt, rate limits, or side effects, which is moderate transparency for a read-like operation.

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 two concise sentences that front-load the purpose, with no unnecessary 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?

While concise, the description does not clarify how it differs from webcrawl_crawl or mention limitations like only same-domain links, leaving some contextual gaps.

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% with clear descriptions for both parameters (url and limit), so the description adds no extra meaning beyond the schema, earning a baseline score of 3.

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 clearly states 'Discover URLs on a website' and 'extracts all same-domain links', specifying a verb and resource that distinguishes it from sibling tools like crawl, scrape, and search.

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 webcrawl_crawl or webcrawl_search, leaving the agent without context for selection.

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

webcrawl_scrapeA

Fetch a URL and extract main content as markdown.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe URL to scrape
timeoutNoRequest timeout in seconds (default: 30)

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior2/5

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

No annotations provided, and description fails to disclose behaviors such as error handling, rate limits, or authentication requirements. It only states the action without depth.

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?

Single sentence, front-loaded with key action, no redundant words. Every part is essential.

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?

Output schema exists, so return values are covered. Description is minimal but sufficient for a simple scrape operation, though could provide more about content extraction behavior.

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 parameters are well-defined in schema. Description adds no extra meaning beyond 'fetch URL' and 'extract as markdown', not even mentioning timeout. 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?

Description clearly states it fetches a URL and extracts main content as markdown, with specific verb and resource. It distinguishes from siblings (crawl, map, search) by focusing on single-page extraction.

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?

No explicit guidance on when to use versus alternatives like crawling or mapping. The purpose is implicitly for single-page extraction, but lacks when-to-use or when-not-to-use context.

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

TDQS

B3.4/5.0
Disambiguation4/5

Tools are mostly distinct: crawl is multi-page BFS, map is single-page link discovery, scrape extracts content, search is external web search. Some overlap between crawl and map (both find links), but descriptions clarify the difference.

Naming Consistency5/5

All tools use a consistent 'webcrawl_' prefix followed by a clear verb (crawl, map, scrape, search). The pattern is uniform and each verb accurately describes the action.

Tool Count4/5

Four tools is slightly lean for a web crawling server, but each serves a clear purpose (crawl, map, scrape, search). The count is appropriate for a minimal but functional set.

Completeness3/5

Covers core web operations: link discovery, crawling, content extraction, and search. Missing features like robots.txt handling, sitemap parsing, or raw HTML retrieval, which are notable gaps for advanced use cases.

Maintenance

ActivityStale
ResponsivenessSyncing

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

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/andyliszewski/webcrawl-mcp'

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