DuckDuckGo Search MCP Server
Provides tools for searching DuckDuckGo, including web search with operators (filetype:, site:, etc.), news article search, image search with filters (size, colour, type), and video search aggregating multiple sources.
Click on "Deploy 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., "@DuckDuckGo Search MCP Serversearch for top news about climate change"
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.
DuckDuckGo Search MCP Server
An MCP server that brings DuckDuckGo search to any MCP-compatible AI client (Claude Desktop, Cursor, VS Code, Copilot, etc.).
No API key required — DuckDuckGo is free and public.
Tools
Tool | Description |
| General web search (supports |
| Recent news article search |
| Image search with size, colour, and type filters |
| Video search (aggregates YouTube, Bing Videos, etc.) |
| NEW — Fetch a URL and extract readable content (article body, headings, metadata). Uses trafilatura to strip navigation, ads, and boilerplate. |
Every search tool supports region (e.g. us-en, uk-en, wt-wt), safesearch (on / moderate / off), time-limit filters, and a backend parameter to pick or force a search engine.
Related MCP server: Search Proxy MCP
Troubleshooting: searches fail on Render / Vercel / Heroku
Symptom: works locally, but deployed searches return errors like
403 Forbidden, 202 Ratelimit, or connection failures.
Cause: search engines — DuckDuckGo especially — routinely block or ratelimit requests from datacenter IPs. Managed platforms (Render, Vercel, Heroku, AWS, GCP…) egress from shared datacenter ranges that are frequently flagged. This is an IP-reputation problem, not a bug in the server.
Fixes, in order of effectiveness:
Check what works from your host — hit the diagnostic endpoint:
curl -H "Authorization: Bearer $MCP_API_TOKEN" \ "https://ddg-search-mcp.onrender.com/status?category=text"It probes every engine (duckduckgo, brave, google, bing, …) with a 1-result query and reports
ok: true/falseplus areasonfor each.Use a backend that isn't blocked. Every search tool takes a
backendparameter — ask your AI client to retry withbackend="bing"(news, images) or another engine reportedokby/status. You can also set a server-wide default with theDDGS_BACKENDenv var. With the defaultbackend="auto", theddgslibrary already fans out across engines and uses whichever responds.Route egress through a proxy — set
DDGS_PROXY(HTTP/HTTPS/SOCKS5, or"tb"for Tor). A residential or rotating proxy service makes requests look like home users and is the most reliable fix for blocked hosts.Don't deploy to Vercel. This is a long-running HTTP server; Vercel is serverless with short function timeouts and heavily-shared egress IPs — both the MCP transport and the search engines will misbehave. Use Render, Railway, Fly.io, or run it locally.
When a search fails, tools return a single-entry list with error, reason
(e.g. ip_blocked, timeout, network), and a hint your AI client can
read and relay — instead of an opaque stack trace.
Quick Start
# Install
pip install -r requirements.txt
# Run (no auth — local dev only)
python server.pyThe server starts at http://localhost:10000.
MCP endpoint: http://localhost:10000/mcp
Health check: http://localhost:10000/health
Connect from AI Clients
Claude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"ddg-search": {
"type": "streamable-http",
"url": "https://ddg-search-mcp.onrender.com/mcp",
"headers": {
"Authorization": "Bearer YOUR_TOKEN"
}
}
}
}Cursor
Add to .cursor/mcp.json:
{
"mcpServers": {
"ddg-search": {
"url": "https://ddg-search-mcp.onrender.com/mcp",
"headers": {
"Authorization": "Bearer YOUR_TOKEN"
}
}
}
}VS Code / Copilot
Add to your MCP configuration:
{
"inputs": [
{
"type": "mcp",
"name": "ddg-search",
"url": "https://ddg-search-mcp.onrender.com/mcp",
"headers": {
"Authorization": "Bearer YOUR_TOKEN"
}
}
]
}Deploy to Render
One-click with Blueprint
Push this repo to GitHub.
In the Render Dashboard, click New → Blueprint.
Connect your repo — the included
render.yamlauto-configures everything.
Render auto-generates an MCP_API_TOKEN. Find it under Dashboard → your service → Environment.
Manual deploy
Push to GitHub.
Render Dashboard → New → Web Service.
Connect repo, set:
Build command:
pip install -r requirements.txtStart command:
python server.pyHealth check:
/health
Deploy.
After deploy, find your auto-generated token in Environment or generate one:
openssl rand -base64 32Free plan & keep-alive
Render's free services spin down after 15 minutes of inactivity, causing 30–60s cold starts. This repo includes a GitHub Actions keep-alive cron (.github/workflows/keep-alive.yml) that pings the health endpoint every 10 minutes to prevent spin-down.
To enable it:
Go to your repo on GitHub → Actions tab.
Enable GitHub Actions (if prompted).
The
Keep Render Aliveworkflow runs automatically on the*/10 * * * *schedule.
Note: GitHub Actions has a usage limit on free plans (2,000 minutes/month). This workflow uses ~4,500 minutes/year (~375 min/month) — well within the free tier. For guaranteed zero latency, upgrade to Render's Starter plan ($7/mo).
Environment Variables
Variable | Default | Description |
|
| Server port |
| (none) | Bearer token for authentication (unset = no auth) |
|
| Search request timeout in seconds |
| (none) | Proxy URL (http/https/socks5) or |
|
| Default search engine for all tools ( |
Diagnostic endpoints: GET /health (public, for platform health checks) and
GET /status (auth-protected; probes every engine from the host — see
Troubleshooting).
Architecture
┌──────────────────────────────────────────────┐
│ Starlette ASGI app │
│ │
│ ┌──────────┐ ┌──────────────────────────┐ │
│ │ /health │ │ /mcp │ │
│ │ (no auth)│ │ (FastMCP Streamable HTTP)│ │
│ └──────────┘ │ │ │
│ │ ddg_search() │ │
│ Middleware: │ ddg_news() │ │
│ • CORS │ ddg_images() │ │
│ • Auth (JWT) │ ddg_videos() │ │
│ └──────────────────────────┘ │
└──────────────────────────────────────────────┘Development
pip install -r requirements.txt
python server.pyTesting
pytest tests/ -vAdding a new tool
See AGENTS.md for full conventions — the short version:
Add a decorated function in
server.py:@mcp.tool() def ddg_my_tool(query: str, max_results: int = 10) -> list[dict]: """Description for LLMs.""" ddgs = _make_ddgs() results = ddgs.some_method(query=query, max_results=_clamp(max_results, 1, 50)) return [_safe_result(r) for r in results]For web-fetch tools, use
httpx+trafilatura(seeddg_fetchfor the pattern).Add tests in
tests/test_server.py.
License
MIT
This server cannot be deployed
Maintenance
Related MCP Connectors
Serper MCP — wraps the Serper Google Search API (serper.dev)
Scrape, crawl and search the web for AI agents via MCP.
Docs: https://docs.keenable.ai/mcp-server Keenable is a free, remote MCP server that gives agents access to the web index. Search the web with ranked results and date/site filters, then fetch any indexed page as clean markdown. Works out of the box with no account or API key.
Live AI-native web search with citations. One tool for every MCP client. Flat per-request pricing.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables web search capabilities using DuckDuckGo's free API without requiring authentication or API keys.-
- AlicenseNot gradedqualityFmaintenanceEnables AI agents to search the web, find news, and read page content via DuckDuckGo without an API key.2MIT
- FlicenseNot gradedqualityDmaintenanceMCP server that provides web search scraping from DuckDuckGo (with Mojeek fallback) and URL content fetching as markdown/text or raw HTML.1-
- AlicenseAqualityBmaintenanceMCP server for DuckDuckGo web search, enabling AI agents to perform real-time text, news, and image searches without an API key.3MIT