Files
mcpctl/templates/duckduckgo.yaml
Michal 61e52403a3
Some checks failed
CI/CD / typecheck (pull_request) Successful in 1m17s
CI/CD / test (pull_request) Successful in 1m24s
CI/CD / lint (pull_request) Successful in 2m56s
CI/CD / smoke (pull_request) Failing after 1m54s
CI/CD / build (pull_request) Successful in 4m19s
CI/CD / publish (pull_request) Has been skipped
fix(templates): search templates stop probing with searches; add firecrawl
Readiness probes ran real searches every interval: searxng's
searxng_web_search probe fanned a query out to every engine 1,440 times a
day, billing API-key engines (braveapi, kagi), and duckduckgo's `search`
probe scraped DuckDuckGo from the same IP agents search from.

- searxng: probe searxng_instance_info, which reads /config only
- duckduckgo: probe fetch_content on example.com every 300s
- firecrawl (new): firecrawl-mcp against a self-hosted or cloud
  Firecrawl, for reading pages as main-content markdown; probe
  firecrawl_scrape on example.com every 300s

Every probe still names a readiness tool, as templates.test.ts requires;
each was run against the real package before being written down.
docs/web-search.md now pairs searxng (search) with firecrawl (reading)
and says why duckduckgo does not hold up under agent traffic.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JPjtnE6Gd343oRNtMU9Bcd
2026-09-15 22:16:17 +01:00

31 lines
1.1 KiB
YAML

name: duckduckgo
version: "1.0.0"
description: DuckDuckGo web search and page-to-markdown fetching — no API key, no backing service
packageName: "duckduckgo-mcp-server"
runtime: python
transport: STDIO
repositoryUrl: https://github.com/nickclyde/duckduckgo-mcp-server
# Readiness fetches a tiny static page instead of searching. A `search` probe is
# a DuckDuckGo scrape every interval (1,440/day at 60s) from the same IP agents
# search from, which is how that IP ends up answering CAPTCHA. This proves the
# process and its outbound fetch path work, not that DuckDuckGo is answering.
healthCheck:
tool: fetch_content
arguments:
url: "https://example.com"
max_length: 500
intervalSeconds: 300
timeoutSeconds: 20
env:
- name: DDG_SAFE_SEARCH
description: Result filtering — STRICT, MODERATE or OFF
required: false
defaultValue: "MODERATE"
- name: DDG_REGION
description: Default region/language code (e.g. us-en, pl-pl, uk-en)
required: false
- name: DDG_SEARCH_BACKEND
description: Fetch backend — auto, httpx or curl. `curl` survives more bot checks.
required: false
defaultValue: "auto"