Build1 publisher3 min readPublished
Five of eight DuckDuckGo MCP servers failed calls on the same twelve back-to-back queries
One machine sent the same twelve research questions through eight free servers, three times about an hour apart on 2026-09-15. The rule that caught most of the failures was the one for empty bodies.
The Engineer · Build desk

What happened
- Eight free DuckDuckGo MCP servers each took the same twelve research queries back to back through the official MCP TypeScript SDK, with the whole run repeated twice more about an hour apart from one machine.
- Three of the eight answered all twelve in every pass, and according to the write-up one of those three was not talking to DuckDuckGo at all.
- An npm package sharing the name duckduckgo-mcp-server is zhsama's unrelated server, and it returned zero of twelve in all three passes.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
- constraint Scoring empty bodies as failures is what sorted the field. A harness that only watches for thrown errors will pass servers that answer with nothing and leave the model to reason from it.
- cost Across a twelve-query dig, the richest payload costs whoever runs the agent about 76.8 KB of extra context on every run.
- decision Choosing uvx or npx in one config line picks a vendor. Per the post, Google's AI Overview steers that choice toward the package that scored zero.
- exposure Free search depends on DuckDuckGo tolerating your traffic, and when it stopped, the remedy on offer made the operator responsible for looking like Chrome.
A call that comes back with nothing in it looks, to an agent, like a tool call that worked. The harness counted it as a failure, and the post says that third rule "did most of the work" [4]. The medians make the same trap worse, because they only count calls that returned something, so the three worst servers look like the quick ones. "OEvortex failing in 1.53 s is still a failure," the write-up says [5].
The fastest finisher also ships a default I would change before putting it in front of a coding agent. free-search-mcp answered twelve of twelve in all three passes at a 1.39 s median, out of a 69-star MIT project last pushed in August 2026 [6]. It returns markdown, and JSON only when the call asks for it, which means passing `query`, `engines`, `format` and `use_cache` every time [7]. `use_cache` defaults to true, and will hand back an old answer if you leave it alone [7]. That is a sane default for a person browsing and the wrong one for an agent checking whether a library API moved last week.
Two registries carry the same package name. `uvx duckduckgo-mcp-server` gets nickclyde's server from PyPI; `npx -y duckduckgo-mcp-server` gets zhsama's unrelated package, which scored zero of twelve in all three passes [11]. According to the post, Google's AI Overview for that package name currently recommends the npm version [12].
nickclyde's is the popular one: 1,460 stars, MIT, the base of the `mcp/duckduckgo` Docker image with over half a million pulls, and twelve of twelve in every pass at a 2.37 s median [8]. A fourth run from a fresh clone answered seven and refused five, each refusal citing DuckDuckGo's bot detection and suggesting the optional browser backend that impersonates Chrome's TLS [9]. For any of the twelve-of-twelve scores to transfer to your setup, DuckDuckGo would have to treat your egress address and TLS fingerprint the way it treated one machine on one IP on 2026-09-15 [3].
HasData, which employs the author and runs one of the eight servers, finished twelve of twelve in all three passes at a 1.96 s median, third on speed in the first pass and fourth in the two after, behind free servers [13][14]. Its payload is the heaviest: ten results carrying position, title, link, displayedLink, source, snippet and snippetHighlightedWords, plus DuckDuckGo's assist answer and a pagination token [15]. The payload runs 10.0 KB per call against nickclyde's 3.6 KB [16], so a twelve-query dig costs about 76.8 KB more context [19]. Whether the weight is worth it depends on how reliably your model parses `Found N search results:` and a numbered list, which is what nickclyde's server returns, with no pagination [10].
Cold config to first answer was 2.3 s on the hosted endpoint, 8.3 s for free-search and 8.8 s for nickclyde, while open-webSearch and OEvortex took 37 to 48 s resolving and building packages [17]. You pay that once per config change, not per call.
The gap between the two fastest finishers is 0.98 s a call, or roughly 11.8 s across a twelve-query run [21]. Five of the eight never got that far [20]. The harness is public [18].
What to watch
- Whether nickclyde's fresh-clone refusals reproduce once the optional browser backend for Chrome TLS impersonation is installed.
- Whether free-search-mcp holds a 1.39 s median with use_cache set to false on every call.
- Whether Google's AI Overview keeps pointing the duckduckgo-mcp-server name at the npm package that scored zero of twelve.