ratduck-search-mcp
Enables web searches through DuckDuckGo, returning titles, URLs, domains, and snippets, with support for site restriction, region, safe search, time range, result filtering, and re-ranking.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ratduck-search-mcpfind the three best current pages on Rust async runtimes, and read the top one"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ratduck-search-mcp
An MCP server that gives an agent the open web: it searches DuckDuckGo by scraping the no-JavaScript front end, scrapes any URL you point it at, and filters and re-ranks results so the agent gets the top handful instead of a wall of links.
No API keys. No headless browser. No search-provider bill. Not on the npm registry either — it installs straight from its GitHub Pages site.
Tools
Tool | What it does |
| Search DuckDuckGo. Returns title, URL, domain and snippet per result. Supports |
| Search, filter, then re-rank by keyword coverage, host authority and engine position, and return the best few. Optionally scrapes each winner's page in the same call. |
| Fetch any http(s) URL as markdown, plain text, raw HTML, a link list, or page metadata. Supports CSS selectors and boilerplate stripping. |
| Narrow and re-rank results you already have — by domain, terms, regex, snippet length, per-domain cap — without spending another request on DuckDuckGo. |
Full parameter reference: docs/tools.md.
Related MCP server: LLM Researcher
Install
One-liner — checks your Node version, downloads the tarball, installs it globally, and prints the client config to paste:
curl -fsSL https://dixonsolutions.github.io/ratduck-search-mcp/install.sh | bashOr do it by hand:
curl -fsSLO https://dixonsolutions.github.io/ratduck-search-mcp/ratduck-search-mcp-latest.tgz && npm install -g ./ratduck-search-mcp-latest.tgzDownload first, install second — npm 12 refuses to fetch tarball URLs unless you pass
--allow-remote=all, and a local file works on every npm version. Every released version is at a
stable URL; versions.json
lists them.
Wire it into a client
Claude Code
claude mcp add ratduck -- ratduck-search-mcpClaude Desktop / any client using mcpServers JSON
{
"mcpServers": {
"ratduck": {
"command": "ratduck-search-mcp"
}
}
}More clients and troubleshooting: docs/install.md.
Example
> ask the agent: "find the three best current pages on Rust async runtimes, and read the top one"The agent calls ddg_top_results with count: 3, fetchContent: true, and gets back ranked
results plus the page text — one round trip.
Programmatic use works too, since the package exports its internals (install the tarball as a
project dependency the same way, npm install ./ratduck-search-mcp-latest.tgz):
import { search } from "ratduck-search-mcp/ddg";
import { topResults } from "ratduck-search-mcp/filter";
import { scrapeUrl } from "ratduck-search-mcp/scrape";
const response = await search({ query: "rust async runtime", maxResults: 25 });
const best = topResults(response.results, response.effectiveQuery, 3, { excludeHomepages: true });
const page = await scrapeUrl({ url: best[0].url, format: "markdown", maxChars: 4000 });Configuration
All optional, all environment variables:
Variable | Default | Meaning |
|
| Per-request timeout. |
|
| Maximum response body size. |
| rotating | Pin a single User-Agent instead of rotating. |
| unset | Set to |
Safety notes
Private-network guard.
scrape_urlresolves the target host and refuses loopback, RFC1918, link-local (including169.254.169.254) and CGNAT addresses, so a URL that arrives from a web page cannot turn the server into an internal-network probe. Override withRATDUCK_ALLOW_PRIVATE=1only when you mean it.Everything returned is untrusted. Search snippets and scraped pages are attacker-controllable text. The server declares this in its MCP instructions, but the client is what ultimately has to treat tool output as data rather than instructions.
Rate limits. DuckDuckGo challenges bursty traffic. The server detects the challenge page, falls back from
html.duckduckgo.comtolite.duckduckgo.com, spaces out paged requests, and reports what happened in the result'snoticesinstead of failing silently.Be a good citizen. This scrapes a free service. Keep
maxResultssane and don't hammer it.
Development
npm install
npm test # unit tests, no network
npm run typecheck
npm run build
npm run test:live # hits DuckDuckGo for realArchitecture and contribution notes: docs/architecture.md, docs/contributing.md.
Releasing
Every push to main rebuilds the tarball and redeploys the
Pages site, so the -latest.tgz URL always
matches main. Bumping version in package.json additionally tags the commit and cuts a GitHub
Release with the tarball attached — Releases are the permanent home of each version, Pages is the
install surface in front of them. See docs/release.md.
License
MIT — see LICENSE.
This server cannot be installed
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 Servers
- AlicenseAqualityAmaintenanceA privacy-friendly MCP server that enables web searches and URL content extraction using DuckDuckGo, allowing AI assistants to access real-time web information without API keys.2147142Apache 2.0
- Flicense-qualityDmaintenanceA lightweight MCP server that enables LLMs to search the web via DuckDuckGo, search GitHub code repositories, and extract clean content from web pages in LLM-friendly formats.8
- Alicense-qualityBmaintenanceA MCP server for DuckDuckGo HTML search. Unlike other DuckDuckGo MCP servers, this one isn't just AI slop.ISC
- Alicense-qualityDmaintenanceSmall Python MCP server that provides web search and page fetching tools via DuckDuckGo, requiring no API key.Apache 2.0
Related MCP Connectors
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
Serper MCP — wraps the Serper Google Search API (serper.dev)
An MCP server that gives your AI access to the source code and docs of all public github repos
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/dixonSolutions/ratduck-search-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server