skills/research/duckduckgo-search/SKILL.md
Free web search via DuckDuckGo — text, news, images, videos. No API key needed. Use the Python DDGS library or CLI to search, then web_extract for full content.
npx skillsauth add garrettroi/open-manus duckduckgo-searchInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Free web search using DuckDuckGo. No API key required.
Preferred when web_search tool is unavailable or unsuitable (no FIRECRAWL_API_KEY set). Can also be used as a standalone search tool.
# Install the ddgs package (one-time)
pip install ddgs
Use the DDGS class in execute_code for structured results with typed fields.
Important: max_results must always be passed as a keyword argument — positional usage raises an error on all methods.
Best for: general research, companies, documentation.
from ddgs import DDGS
with DDGS() as ddgs:
for r in ddgs.text("python async programming", max_results=5):
print(r["title"])
print(r["href"])
print(r.get("body", "")[:200])
print()
Returns: title, href, body
Best for: current events, breaking news, latest updates.
from ddgs import DDGS
with DDGS() as ddgs:
for r in ddgs.news("AI regulation 2026", max_results=5):
print(r["date"], "-", r["title"])
print(r.get("source", ""), "|", r["url"])
print(r.get("body", "")[:200])
print()
Returns: date, title, body, url, image, source
Best for: visual references, product images, diagrams.
from ddgs import DDGS
with DDGS() as ddgs:
for r in ddgs.images("semiconductor chip", max_results=5):
print(r["title"])
print(r["image"]) # direct image URL
print(r.get("thumbnail", ""))
print(r.get("source", ""))
print()
Returns: title, image, thumbnail, url, height, width, source
Best for: tutorials, demos, explainers.
from ddgs import DDGS
with DDGS() as ddgs:
for r in ddgs.videos("FastAPI tutorial", max_results=5):
print(r["title"])
print(r.get("content", "")) # video URL
print(r.get("duration", "")) # e.g. "26:03"
print(r.get("provider", "")) # YouTube, etc.
print(r.get("published", ""))
print()
Returns: title, content, description, duration, provider, published, statistics, uploader
| Method | Use When | Key Fields |
|--------|----------|------------|
| text() | General research, companies | title, href, body |
| news() | Current events, updates | date, title, source, body, url |
| images() | Visuals, diagrams | title, image, thumbnail, url |
| videos() | Tutorials, demos | title, content, duration, provider |
Use the ddgs command via terminal when you don't need structured field access.
# Text search
ddgs text -k "python async programming" -m 5
# News search
ddgs news -k "artificial intelligence" -m 5
# Image search
ddgs images -k "landscape photography" -m 10
# Video search
ddgs videos -k "python tutorial" -m 5
# With region filter
ddgs text -k "best restaurants" -m 5 -r us-en
# Recent results only (d=day, w=week, m=month, y=year)
ddgs text -k "latest AI news" -m 5 -t w
# JSON output for parsing
ddgs text -k "fastapi tutorial" -m 5 -o json
| Flag | Description | Example |
|------|-------------|---------|
| -k | Keywords (query) — required | -k "search terms" |
| -m | Max results | -m 5 |
| -r | Region | -r us-en |
| -t | Time limit | -t w (week) |
| -s | Safe search | -s off |
| -o | Output format | -o json |
DuckDuckGo returns titles, URLs, and snippets — not full page content. To get full content, follow up with web_extract:
web_extract tool (if available) or curlfrom ddgs import DDGS
with DDGS() as ddgs:
results = list(ddgs.text("fastapi deployment guide", max_results=3))
for r in results:
print(r["title"], "->", r["href"])
# Then use web_extract tool on the best URL
web_extract or curl for that..get() for optional fields to avoid KeyError.max_results is keyword-only: ddgs.text("query", 5) raises an error. Use ddgs.text("query", max_results=5).-k and -m (CLI): -k is for keywords, -m is for max results count.ddgs (was previously duckduckgo-search). Install with pip install ddgs.Smoke-tested with ddgs==9.11.2 on Python 3.13. All four methods (text, news, images, videos) confirmed working with keyword max_results.
development
# Voice Sanitizer This skill cleans up text before it is sent to the Text-to-Speech (TTS) engine. It removes technical jargon, code blocks, and long URLs to ensure the agent sounds natural and conversational in voice chat. ## Usage To sanitize text for speech, run the following command in the terminal: ```bash python3 /app/skills/voice_sanitizer/sanitizer.py "Your long, technical text with `code` and https://links.com/long-url" ``` ### Example Output ```text Your long, technical text with a
tools
Professional AI video production workflow. Use when creating videos, short films, commercials, or any video content using AI generation tools.
tools
Secure API key access from the centralized vault. Fetch keys on-demand without storing them in environment variables.
testing
# Task Board — Persistent Task Tracking for Open Manus This skill provides a shared task board backed by Redis. Harmony uses it to track delegated work across all agents, and agents use it to report progress and completion. ## When to Use - **Harmony**: Use this whenever you delegate a task to an agent. Add the task to the board, then check the board periodically to follow up. - **Worker Agents**: Use this to update your task status or mark tasks as complete. ## Commands ### Add a new task