DuckDuckGo Search MCP Server
Brings DuckDuckGo search (web, news, images, videos) to any MCP-compatible AI client without requiring an API key.
README
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 |
|---|---|
ddg_search |
General web search (supports filetype:, site:, intitle:, inurl: operators) |
ddg_news |
Recent news article search |
ddg_images |
Image search with size, colour, and type filters |
ddg_videos |
Video search (aggregates YouTube, Bing Videos, etc.) |
ddg_fetch |
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), and time-limit filters.
Quick Start
# Install
pip install -r requirements.txt
# Run (no auth — local dev only)
python server.py
The 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.txt - Start command:
python server.py - Health check:
/health
- Build command:
- Deploy.
After deploy, find your auto-generated token in Environment or generate one:
openssl rand -base64 32
Free 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 |
|---|---|---|
PORT |
10000 |
Server port |
MCP_API_TOKEN |
(none) | Bearer token for authentication (unset = no auth) |
DDGS_TIMEOUT |
10 |
DuckDuckGo request timeout in seconds |
DDGS_PROXY |
(none) | Proxy URL (http/https/socks5) or "tb" for Tor |
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.py
Testing
pytest tests/ -v
Adding a new tool
See AGENTS.md for full conventions — the short version:
- Add a decorated function in
server.py:For web-fetch tools, use@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]httpx+trafilatura(seeddg_fetchfor the pattern). - Add tests in
tests/test_server.py.
License
MIT
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.