bash
npx clawhub@latest install content-research-mcbai
Search the web for trending articles, news, and content sources on any topic. This skill powers the MCB AI content research pipeline — finding, filtering, scoring, and organizing source material for content creation.
This skill uses TWO search providers in parallel for maximum coverage:
web_search tool (built-in OpenClaw tool)TAVILY_API_KEY from ~/.openclaw/.envtext
POST https://api.tavily.com/search
Headers: Content-Type: application/json
Body:
{
"api_key": "<TAVILY_API_KEY>",
"query": "<query>",
"search_depth": "advanced",
"include_answer": false,
"include_raw_content": false,
"max_results": 10,
"topic": "news" // use "general" for non-news searches
}
Run Tavily via exec with PowerShell:
powershell
$body = @{
api_key = $env:TAVILY_API_KEY
query = "<query>"
search_depth = "advanced"
include_answer = $false
include_raw_content = $false
max_results = 10
topic = "news"
} | ConvertTo-Json
Invoke-RestMethod -Uri "https://api.tavily.com/search" -Method Post -ContentType "application/json" -Body $body
web_search) and Tavily in parallelExtract from the user's message:
Topic — the subject to research (required)
Source filter — where to search (default: all sources)
all — All web sourcesnews — News publications onlylinkedin — LinkedIn posts/articles (append site:linkedin.com)youtube — YouTube videos (append site:youtube.com)blogs — Blog posts and articles (append blog OR article OR guide)Freshness — how recent (default: past month for web, past week for news)
Count — how many results to return (default: 10-15)
If the user doesn't specify these, use sensible defaults and mention what you chose.
Run BOTH providers. Each provider runs TWO queries when possible.
Query 1 — Web:
text
Query: {topic} {source_filter_query}
count: 10
freshness: month
Query 2 — News:
text
Query: {topic} news
count: 10
freshness: week
Query 1 — General:
powershell
$env:TAVILY_API_KEY = (Get-Content "$env:USERPROFILE\.openclaw\.env" | Select-String "TAVILY_API_KEY" | ForEach-Object { $_ -replace "TAVILY_API_KEY=", "" })
$body = @{
api_key = $env:TAVILY_API_KEY.Trim()
query = "{topic}"
search_depth = "advanced"
include_answer = $false
include_raw_content = $false
max_results = 10
topic = "general"
} | ConvertTo-Json
Invoke-RestMethod -Uri "https://api.tavily.com/search" -Method Post -ContentType "application/json" -Body $body
Query 2 — News:
powershell
# Same as above but topic = "news"
Collect all results from Brave (web + news) and Tavily (general + news)
Deduplicate by URL — keep one copy per URL, prefer Tavily version (richer content)
Sort by relevance:
Limit to requested count (default 15)
Label source engine in metadata: [Brave] or [Tavily]
For each result, extract and structure:
text
Article:
- Title: [article title]
- Source: [publication/website name]
- URL: [full URL]
- Date: [relative date, e.g. "2 hours ago", "3 days ago"]
- Summary: [description/snippet from search]
- Type: [News / Blog / Report / Video / LinkedIn]
- Tag: [auto-detected tag, see Tag Rules below]
- Engine: [Brave / Tavily / Both]
Clean the hostname to a readable name:
www. prefix.com, .org, .net, .io, .co suffixesScan title + summary and apply the FIRST matching tag:
TagPattern KeywordsFundingfund, raise, round, series A-C, seed, valuation, invest, VC, ventureAIai, artificial intelligence, machine learning, LLM, GPT, Claude, OpenAISaaSsaas, software as a service, subscription, ARR, MRRToolstool, platform, app, software, stack, frameworkTrendstrend, report, survey, data, statistic, forecast, predictionStartupstartup, founder, launch, accelerator, incubator, YCGrowthgrowth, marketing, GTM, acquisition, retention, conversion
Present the organized results in a clear, scannable format:
text
## Research Results: "{topic}"
Found {N} articles from {sources_count} sources
Sources: Brave ({brave_count}) + Tavily ({tavily_count}) → merged {total} unique
### 📰 News
1. **{title}** — {source} ({date}) [{engine}]
{summary}
🏷️ {tag} | 🔗 {url}
### 📝 Articles & Blogs
2. **{title}** — {source} ({date}) [{engine}]
{summary}
🏷️ {tag} | 🔗 {url}
...
Then ask the user which articles they want to use for content creation. If the user wants to proceed to writing, hand off to the content-writer skill with the selected articles.
Always provide results as a numbered list with:
search_depth: "advanced" digs deeper — use for complex topicsAfter research, the user typically selects articles and moves to writing. Pass the selected articles to the content-writer skill in this format:
json
{
"articles": [
{
"title": "Article title",
"source": "Publication name",
"url": "https://...",
"date": "2 days ago",
"summary": "Brief description",
"tag": "AI",
"engine": "Tavily"
}
]
}
See references/source-filters.md for detailed source filter configurations.