Skip to main content
Glama
marcinkuk

ddgs-mcp

by marcinkuk

ddgs-mcp

A Model Context Protocol (MCP) server that exposes DDGS (Dux Distributed Global Search) — a keyless, multi-engine web metasearch — to AI agents.

It is a drop-in, more reliable alternative to a single SearXNG instance: instead of one upstream that gets IP-banned and poisons every query, DDGS fans each call out over several backends (DuckDuckGo, Bing, Brave, Google, Mojeek, Startpage, Yahoo, Wikipedia, ...) and deduplicates the union. If one engine rate-limits you, the others still answer.

No API key. No account. Runs over stdio via uvx, matching the other MCP servers in this stack.

Install / run

uvx ddgs-mcp                 # from PyPI (once published)
uvx --from git+https://github.com/marcinkuk/ddgs-mcp.git ddgs-mcp   # direct from git

For local development:

cd ddgs-mcp
uv sync
uv run ddgs-mcp

Related MCP server: DuckDuckGo Search MCP Server

Tools

Tool

Purpose

web_search

General web results (title, url, snippet).

news_search

News results with source + date.

image_search

Image results with direct image/thumbnail URLs.

video_search

Video results with embed URL, duration, publisher.

web_extract

Read full readable content (markdown) of 1-5 URLs.

search_status

Diagnostics: version, configured backend/region, per-category backends, live ping.

Each search tool accepts backend="auto" (randomized multi-engine, the default and most resilient) or a specific backend name, plus region, timelimit (d/w/m/y) and max_results.

All tools return a uniform envelope {"ok": bool, "engine": str, "count": int, "results": [...]}; on failure ok=false with a hint telling the agent how to retry (e.g. switch to auto or a different region).

Configuration (environment)

Variable

Default

Meaning

DDGS_BACKEND

auto

Default backend for search calls.

DDGS_REGION

us-en

Default region code (pl-pl, de-de, wt-wt ...).

DDGS_TIMEOUT

10

Per-request timeout (seconds).

DDGS_PROXY

(unset)

Proxy URL passed to DDGS (e.g. http://127.0.0.1:1080). Useful behind a rotating proxy to avoid bans.

DDGS_MCP_LOG_LEVEL

INFO

Server log verbosity.

Agent Canvas registration

Register with a stdio MCP entry (no secrets required):

{
  "ddgs": {
    "transport": "stdio",
    "command": "uvx",
    "args": ["--from", "git+https://github.com/marcinkuk/ddgs-mcp.git", "ddgs-mcp"],
    "enabled": true,
    "description": "Keyless DDGS metasearch (DuckDuckGo/Bing/Brave/Google) + page extraction. Resilient SearXNG alternative."
  }
}

If you want ban-resistance, add an env entry for a rotating proxy:

"env": {"DDGS_PROXY": "http://127.0.0.1:1080"}

The value is stored through the normal MCP config path (Fernet-encrypted at rest like the other secrets) — never commit it to this repo.

Why this over SearXNG?

  • Resilience: multi-backend aggregation survives single-engine bans (your exact banuję mnie symptom).

  • No key / no server: nothing to host; uvx self-heals on container/image upgrades like trailsearch-mcp.

  • Extraction: web_extract gives clean markdown of a page in one call.

Keep searxng registered alongside it if you like; the two can coexist and you can pick per query.

License

MIT.

Available Tools

6 tools
search_statusA

Health/diagnostics: DDGS version, configured backend/region/timeout/proxy, available backends per category, and a live ping search.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses that the tool reports configuration details and performs a live ping search, which tells the agent that a live network operation is involved. It does not warn about possible latency or failure modes, but the behavior is adequately described for a diagnostic call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence packs all relevant information with a colon-structured list. Every segment adds a specific piece of diagnostic info; there is no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter status tool with an output schema, the description covers the purpose, the categories of information returned, and the diagnostic nature. The output schema can carry the detailed return structure, so nothing needed for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the description does not need to explain parameter meaning. The empty schema makes parameter semantics a non-issue; the baseline for zero-parameter tools applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific category 'Health/diagnostics' and enumerates the exact information returned: DDGS version, backend/region/timeout/proxy, available backends per category, and live ping. This distinguishes it clearly from the sibling search tools, which perform searches rather than report system status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Health/diagnostics' prefix gives clear context for when to call this tool: checking configuration and connectivity, not performing a content search. It does not explicitly name alternatives or exclusions, but the purpose is specific enough that an agent should not confuse it with the search siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

web_extractA

Extract readable content from 1-5 web pages (markdown by default).

Use after web_search/news_search to read the actual page content.

Args: urls: 1-5 absolute http(s) URLs to extract. max_chars: max characters of content returned per page (default 6000). fmt: "text_markdown" | "text_plain" | "text_rich" | "text" (raw HTML) | "content" (bytes->str).

ParametersJSON Schema
NameRequiredDescriptionDefault
fmtNotext_markdown
urlsYes
max_charsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral disclosure burden. It reveals that output is markdown by default, that content is truncated via max_chars, and that fmt controls markdown/plain/rich/raw-HTML/bytes-to-str conversion. This gives a strong model of behavior without dependency on schema or annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: a one-sentence purpose, a one-sentence usage context, then a terse Args list. Every line adds value, and the most critical facts (default format and usage order) are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return value details need no explanation. The description covers the operation, the param family with defaults, and the intended position in a search-then-extract workflow. Nothing an agent needs to call this tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description compensates fully: it explains urls are 1-5 absolute http(s) URLs, max_chars caps returned content per page with default 600, and fmt enumerates all accepted values including their semantic differences. This is exactly the parameter clarification the schema lacks.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Extract readable content from 1-5 web pages (markdown by default).' This clearly identifies the operation and scope, and the placement relative to search tools distinguishes it as a follow-up retrieval action rather than a search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says 'Use after web_search/news_search to read the actual page content,' giving the agent clear context for when this tool is appropriate. It does not spell out when not to use it, but the intended workflow is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 6 tool updatesv0.1.0
    • First observedimage_search
    • First observednews_search
    • First observedsearch_status
    • First observedvideo_search
    • First observedweb_extract
    • First observedweb_search

TDQS

A4.2/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a distinct content type or function: web, image, news, video, page extraction, and service diagnostics. There is no meaningful overlap in purpose, so an agent should rarely misselect among them.

Naming Consistency4/5

Names are uniformly lowercase snake_case and mostly follow a `<type>_search` pattern for the four search tools. `web_extract` and `search_status` are minor structural deviations, but they remain clear and predictable in style.

Tool Count5/5

Six tools is a well-scoped size for a search-focused server: four content-type searches, one extraction tool, and one diagnostics tool. Every tool has a clear role and none feel redundant or unnecessary.

Completeness5/5

The server covers the core search lifecycle: querying web, image, news, and video results, then extracting readable content from results, plus health diagnostics. There are no obvious missing operations for its stated purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

  • Scrape, crawl and search the web for AI agents via MCP.

  • Your agent needs the open web — searched by more than one engine, and read as clean markdown rather than raw HTML. **What you can ask for** • "Search this question with two providers and tell me where they disagree." • "Scrape these 40 URLs into markdown, in one batch." • "Crawl this documentation site and give me every page." • "Do deep research on this topic and cite the sources." • "Find the academic papers behind this claim." **How to use it** Point any MCP client at https://mcp.aisa.one/search/mcp and sign in with OAuth — there is no key to create or paste. 30 tools across several independent providers: Tavily and Exa search, answers, contents and agent runs; Firecrawl scrape, batch scrape, crawl, map and search; Perplexity Sonar, Sonar Pro, reasoning and deep research; Oxylabs AI search and LLM jobs; OpenAI and Anthropic web search; and scholarly search. **Why this rather than the source** Several independent indexes behind one account, because one engine's blind spot is not visible from inside it. **It is also a door to the rest** The same login reaches 26 sources and 580+ operations. Find the page here, then ask the same agent who links to it or how much traffic it gets — without adding a second server. **What it costs** Finding and inspecting an operation is free. Running one is billed per call at API prices, with no seat and no monthly minimum, and every call takes max_price_usd so an agent cannot overspend by accident. **Where else it reaches** https://mcp.aisa.one/seo-serp/mcp for the Google results page itself, https://mcp.aisa.one/seo-serp-other-engines/mcp for Bing, Baidu and Naver.

  • Multi-engine search for AI agents. Trust scoring, local corpus, MCP-native. Self-hostable, BYOK.

  • Fetch pages as markdown, search web and news, extract structured data. For AI agents.

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server for multi-engine web search and web page fetching, supporting parallel search, content extraction, and optional LLM-powered search summarization and deep search.
    4
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to perform web search, extraction, and research across multiple provider backends with persistent multi-key rotation and auditable routing. Supports MCP, CLI, and Agent Skill entry points.
    MIT