What it takes off you is the snippet ceiling: a search alone gives three lines of context, and the second call turns the chosen result into clean text the model can reason over. Both calls label their output as untrusted input, which is the right posture for text that arrives from a page nobody vetted.
Two calls: a DuckDuckGo search that returns titles, URLs and snippets, and a fetch that strips a page down to its readable text. Both mark what they return as untrusted input.
- Web results with titles, URLs and snippets — ten by default, and narrowed by region on the call or through DDG_REGION
- One page fetched and reduced to its main text, with navigation, headers, footers, scripts and styles removed
- Pagination over a long page, through a start index and a maximum length that starts at 8000 characters
- SafeSearch set for the whole server through DDG_SAFE_SEARCH — STRICT, MODERATE or OFF
- A curl backend that impersonates a real Chrome TLS handshake, chosen per call or as the server default, for sites that block a plain HTTP client
- Stdio by default, with --transport sse or streamable-http, and --allowed-hosts for running it behind a reverse proxy
- A CA bundle through --ca-certs or DDG_CA_CERTS, for networks whose proxy re-signs HTTPS
Uv and network access — no account and no API key. Install the browser extra, `uvx --with "duckduckgo-mcp-server[browser]" duckduckgo-mcp-server`: DuckDuckGo's search endpoint fingerprint-blocks the plain HTTP client, and the fallback that gets past it needs that extra. Without it, a blocked search returns a message telling you to install it rather than results.
One command — uvx duckduckgo-mcp-server
