webcrawl-mcp
Provides web search capabilities using DuckDuckGo, allowing agents to search the web and optionally scrape search results programmatically.
webcrawl-mcp
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 |
| Fetch a single URL → |
| DuckDuckGo search (optionally scrape results, each with provenance) |
| Discover same-domain URLs from a starting page |
| 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-mcpRequires Python 3.12+.
Quick smoke test (should print Webcrawl MCP server running then exit cleanly with Ctrl-C):
webcrawl-mcpInstall 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_scrapetool to fetchhttps://docs.python.org/3/library/asyncio.htmland 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 |
|
| HTTP User-Agent |
|
| Seconds before request timeout |
| (unset) | If set, enables Firecrawl fallback for low-quality extractions. Leave unset for a fully free setup. |
|
| Firecrawl endpoint |
|
| If |
|
| On a |
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):
trafilaturaextracts main content from HTML →source: static_http.If that fails or returns <200 chars,
markdownifyconverts the raw HTML.If the result is still low-quality and
FIRECRAWL_API_KEYis 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), a429carrying aRetry-Afterheader gets one bounded retry of the original request →source: static_http_retryon success.With
FALLBACK_ON_TRANSPORT_ERROR=trueandFIRECRAWL_API_KEYset, 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 toolswebcrawl_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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Starting URL | |
| max_pages | No | Maximum number of pages to fetch (default: 10) | |
| max_depth | No | Maximum link depth from start (default: 2) | |
| include_patterns | No | Glob patterns for URLs to include (e.g., ["*/docs/*"]) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Starting URL to map from | |
| limit | No | Maximum number of URLs to return (default: 50) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The URL to scrape | |
| timeout | No | Request timeout in seconds (default: 30) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
webcrawl_searchC
Search the web using DuckDuckGo.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query string | |
| num_results | No | Maximum number of results to return (default: 5) | |
| scrape_results | No | If true, fetch full page content for each result (default: false) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure, but it only states the search engine. It does not mention safe read behavior, rate limits, or what happens with different parameter values beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise (one sentence). While brevity is good, it sacrifices valuable context that could be added without becoming verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity and the existence of an output schema, the description is minimally adequate. However, it lacks details on result format, pagination, or any side effects, which are expected for a search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (each parameter has a description). The tool description adds no additional meaning beyond 'Search the web using DuckDuckGo', so it neither improves nor harms parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool performs web searches using DuckDuckGo. However, it does not explicitly distinguish from sibling tools like webcrawl_crawl or webcrawl_scrape, which have different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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. There is no mention of prerequisites, when webcrawl_search should be preferred, or when other tools might be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
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.
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.
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.
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
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
Scrape, crawl and search the web for AI agents via MCP.
Firecrawl MCP — wraps the Firecrawl API (firecrawl.dev) for web
MCP server for Google search results via SERP API
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP server for web scraping — extract clean markdown, links, and metadata from any URL. Free Firecrawl alternative.5935MIT
- AlicenseAqualityAmaintenanceMCP server for private web search via self-hosted SearXNG with local reranking, full-page content fetching via Firecrawl, and optional Ollama-powered query expansion and summaries.711218MIT
- AlicenseNot gradedqualityCmaintenanceWeb scraping and search MCP server that wraps Firecrawl API for URL discovery and web search with optional content retrieval.9MIT
- AlicenseNot gradedqualityDmaintenanceLightweight MCP server for DuckDuckGo search with HTML fallback, safe webpage fetching, caching, and clean text extraction.AGPL 3.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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