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 "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., "@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.) |
Every tool supports region (e.g. us-en, uk-en, wt-wt), safesearch (on / moderate / off), and time-limit filters.
Related MCP server: search-mcp
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) |
|
| DuckDuckGo request timeout in seconds |
| (none) | Proxy URL (http/https/socks5) or |
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(keywords=query, max_results=_clamp(max_results, 1, 50)) return [_safe_result(r) for r in results]Add tests in
tests/test_server.py.
License
MIT
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.
Latest Blog Posts
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/arvindg4u/ddg-search-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server