MCP Server for Stealth Web Search and Fetching
Search the web and fetch rendered web pages as concise Markdown via MCP tools websearch and webfetch.
Search the web with DuckDuckGo or Google, localize by region, set safe search, limit results, and optionally block media.
Fetch any
http/httpsURL, execute JavaScript, and extract main content as token-efficient Markdown.Auto-detect or choose built-in templates for GitHub, GitLab, npm, PyPI, crates.io, docs.rs, Docker Hub, Wikipedia, MDN, Reddit, YouTube, DEV, pkg.go.dev, Javadoc, and generic docs; use
rawfor full body.Pass custom inline JSON templates for extraction and search.
Paginate fetched content with
start_indexandmax_length.Use fallback search engines and browser relaunch/retry for timeouts, network failures, and HTTP 429.
Strip scripts, styles, SVGs, inline styles, navigation, headers, footers, sidebars, dialogs, and embedded data images; block images/media/fonts at the network layer.
Both tools are read-only and return failures as MCP tool errors.
Allows fetching and extracting structured content from Docker Hub pages.
Allows searching the web using the DuckDuckGo search engine.
Allows fetching and extracting structured content from GitHub repositories and issues.
Allows fetching and extracting structured content from GitLab repositories and issues.
Allows searching the web using the Google search engine.
Allows fetching and extracting structured content from npm package pages.
Allows fetching and extracting structured content from PyPI package pages.
Allows fetching and extracting structured content from Reddit pages.
Allows fetching and extracting structured content from Wikipedia pages.
Allows fetching and extracting structured content from YouTube pages.
SearchFetch
An MCP server that gives AI agents web search and page fetching through a stealth browser. Pages are rendered with JavaScript, stripped of noise, and returned as compact Markdown.
Browser rendering: CloakBrowser runs Chromium with humanized input. Each fetch uses an isolated browser context. Sites may still demand logins or challenges.
Fault tolerance: relaunches a disconnected browser and retries timeouts, network failures and HTTP 429 (honoring
Retry-After, capped at 30 s) once. Built-in search engines fall back to DuckDuckGo HTML and then DuckDuckGo Lite.Token-efficient output: scripts, styles, SVGs, inline styles and embedded
data:images are removed before conversion; images, media and fonts are blocked at the network layer.Template-driven extraction: JSON templates for GitHub, GitLab, npm, PyPI, crates.io, docs.rs, Docker Hub, Wikipedia, MDN, Reddit, YouTube, DEV, pkg.go.dev, Javadoc and generic documentation sites. Custom templates can be passed inline.
Two runtimes: Python (
uvx, Python 3.11.5+) or Node.js (npx, Node 24+), with the same tools, templates and output. The first run downloads the browser binary.
Setup
No manual install is needed. Point your MCP client at uvx or npx:
{
"mcpServers": {
"searchfetch": {
"command": "uvx",
"args": ["searchfetch"]
}
}
}For Node.js, use "command": "npx", "args": ["-y", "searchfetch"]. In Cursor, add a command
server with uvx searchfetch or npx -y searchfetch.
Related MCP server: markdown-for-agents-mcp
Tools
Both tools are read-only. Failures are returned as MCP tool errors.
websearch
Parameter | Type | Default | Description |
| string | required | Search query (must not be blank). |
| string |
|
|
| string/null |
| Region-language code such as |
| boolean/null |
|
|
| integer |
| Maximum results (positive). |
| boolean |
| Block images, media and fonts at the network layer. |
Results are a numbered list of titles, URLs and snippets. When an engine fails or returns no
results, the next template in its fallback chain is tried (google → duckduckgo-search →
duckduckgo-lite-search), and a [websearch: …] note at the top of the output explains why.
webfetch
Parameter | Type | Default | Description |
| string | required | Absolute |
| string |
|
|
| integer |
| Start offset in Unicode code points (non-negative). |
| integer |
| Maximum code points to return (positive). |
| boolean |
| Block images, media and fonts at the network layer. |
Output ends with a footer naming the template and the character window, plus the next
start_index when more content remains. Pages that match no template are converted whole after
removing navigation, headers, footers, sidebars, dialogs and media (template="auto (fallback)").
The raw template converts the full <body> with no removal.
Templates
Built-in templates live in templates/ and are shared by both runtimes. Page
templates: github-repo, github-issue, npm-package, pypi-package, crates-package,
docs-rs, javadoc, docs-page, docker-hub, wikipedia, gitlab, reddit,
mdn-web-docs, devto, go-pkg, youtube, raw. Search templates: google-search,
duckduckgo-search, duckduckgo-lite-search.
Templates are validated when they are loaded or passed inline:
Field | Description |
| Required unique name (inline templates default to |
| Required list of sections (see below). |
| Precedence for |
| Regular expressions (compatible with JavaScript and Python) that select the template for |
| CSS selectors removed before extraction. Defaults to scripts, styles, SVG, nav, footer, iframes. |
| Raw Markdown source tried first, e.g. |
| Playwright cookies added to the browser context. |
| Resource types blocked when |
| Search URL with |
| Per placeholder: |
|
|
| Name of the search template to try when this one fails. |
Each section has a name, a selector (empty selects <body>), and optionally format (text, markdown,
attribute with attribute, or html), transform (one or a list of strip,
decode_google_url, decode_ddg_url, json_parse, resolve_href), required, multiple,
max_items, and children (fields extracted from inside each matched element).
Selectors separated by top-level commas are ordered fallbacks: the first selector that matches
wins, and an empty fallback selects the current element. Children search inside their parent
element and its ancestors, never neighbouring results, so a missing field stays missing. Missing
required sections or fields are reported as errors.
A records section whose first item has Author/User and Comment/Body fields is rendered as
a comment thread; other records render as indented Key: value blocks.
Development
npm ci && uv sync --locked --extra dev
git config core.hooksPath .githooks # optional: format, lint and unit tests before commits
npm test # Node (node:test) and Python (pytest) unit tests
npm run lint # ESLint and Ruff
npm run format # Prettier and Ruff format (format:check to verify)
npm run e2e # real browser against local fixtures, plus the packed npm and wheel builds
npm run check # everything CI runs
npm run inspect:node # MCP Inspector (inspect:py for Python)Layout
Path | Contents |
| Node.js runtime ( |
| Python package ( |
| Shared templates; bundled into the npm package and the Python wheel. |
| Shared fixtures that keep both runtimes' extraction and output identical. |
| Unit tests. |
| MCP end-to-end tests over stdio against a local HTTP server. |
The runtimes mirror each other module for module (templates, extract, markdown, compose,
browser, server). Any change to one should be made to the other, with a shared fixture if
the behavior is observable.
Releasing
Bump version in both package.json and pyproject.toml (then npm install and uv lock),
commit, and push a matching tag:
git tag -a v4.0.1 -m "v4.0.1" && git push origin main v4.0.1The Publish workflow checks that the tag matches both versions, runs lint and unit tests, publishes to npm and PyPI, and then creates the GitHub Release with generated notes. To retry a tag, run the workflow manually from the Actions tab with that tag.
Limits
HTML-to-Markdown conversion uses turndown (Node) and markdownify (Python). They agree on common content, but edge cases such as tables differ.
After the DOM is ready, each fetch waits up to five seconds for network activity to settle. Pages that keep rendering after that may return partial content.
E2E tests use local fixtures. Live search-engine availability and third-party page layouts change over time and need separate live checks.
Available Tools
2 toolswebfetchWeb FetchARead-only
Fetch a web page in a JavaScript-capable stealth browser and return its main content as Markdown, with images, scripts and styles stripped. Long output is paginated.
Inputs: url (required), template, max_length, block_media, +1 more.
websearchWeb SearchBRead-only
Search the web with DuckDuckGo or Google and return numbered results with titles, URLs and snippets.
Inputs: query (required), engine, region, block_media, +2 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 2 tools
The two tools have clearly distinct purposes: websearch performs discovery (querying DuckDuckGo/Google), while webfetch retrieves and renders a specific URL. There is no plausible overlap or confusion between searching and fetching.
Both names follow the identical 'web' + verb convention (websearch, webfetch) in consistent lowercase with no separator. The pattern is fully predictable across the set.
Two tools is minimal but well-matched to a narrow search-and-fetch domain, where each tool maps to a core operation. It is slightly thin (no batch or pagination-control tool), but nothing feels redundant.
Search plus JavaScript-capable fetch with pagination covers the essential lifecycle of web retrieval, and the fetch tool handles content normalization. Minor gaps exist around result-count/format control, but core workflows are fully served.
Maintenance
Related MCP Connectors
Official Browserless MCP server: browser automation, scraping, screenshots and PDFs for AI agents.
Hosted Web Crawler MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
MCP Server for Web2MD — convert URLs to Markdown from Claude Desktop, Cursor, etc.
Web scraping, browser automation, screenshots and AI data extraction for AI agents via MCP.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceA production-ready Model Context Protocol server that brings AI-powered web search directly into development environments, providing intelligent search results with proper citations in Claude Desktop, Cursor, or any MCP-compatible client.106 npm21MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for AI agents -- fetch any URL with full JavaScript rendering (Playwright/Chromium) and convert to clean, token-efficient markdown. Works on React, Vue, Angular, and any JS-heavy page. Includes web search, batch fetching, binary file download, LRU cache, SSRF protection, and structured output.44 npmMIT
- AlicenseAqualityBmaintenanceMCP server for browser automation with anti-detection. Scout pages, find elements, interact with websites, and monitor network traffic from any AI client that supports the Model Context Protocol.211MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for web scraping and browser automation, enabling AI agents to extract clean, token-efficient content from web pages.1MIT