| name | omnisearch |
| description | Unified web and social media search across 5 providers (Brave, Tavily, Xpoz, Exa, Firecrawl). Auto-routes queries to the best API, supports parallel multi-provider search with deduplication, AI-generated answers, and social media search. Triggers on web search, find news, search Twitter, search Reddit, social media search, multi-provider search, omnisearch, research news, OSINT, search for, look up, find information about. |
Omnisearch Skill
Unified search across 5 providers — Brave (Google SERP), Tavily (agent-native answers), Xpoz (social media), Exa (neural/semantic), and Firecrawl (scraping). Auto-classifies queries and routes to the best provider, or runs parallel searches across all with deduplication.
Prerequisites: At least one API key set. See API Key Setup.
Coverage Map
| Surface | Provider | Strength | Cost |
|---|
| Google SERP | Brave | Web + news, freshness filtering, LLM Context API | $5/1k |
| Agent answers | Tavily | AI-synthesized answers with citations, content extraction | Free 1k/mo |
| Twitter/X | Xpoz | Tweet search, user timelines, threads, hashtags | Free 100k/mo |
| Reddit | Xpoz | Post search, subreddit browsing, trending | Free 100k/mo |
| Instagram | Xpoz | Post search, user profiles | Free 100k/mo |
| Neural/semantic | Exa (cross-skill) | Research papers, companies, similar pages | Per-query |
| Web scraping | Firecrawl (cross-skill) | Search + scrape, site crawling | Per-page |
Token-Efficient Multi-Search
Same principle as Exa's dynamic filtering — search cheaply, filter, then extract selectively.
DO:
python3 ~/.claude/skills/omnisearch/scripts/omnisearch.py "query" --parallel --no-text
python3 ~/.claude/skills/exa-search/scripts/exa_contents.py URL1 URL2 --highlights --max-chars 3000
python3 ~/.claude/skills/firecrawl/scripts/firecrawl_api.py scrape URL --only-main-content
DON'T: Run --parallel with full text for 40+ results, then reason over all of it.
Available Scripts
1. omnisearch.py — Meta-Router (start here)
Auto-classifies queries and dispatches to the best provider. Supports forced provider, parallel search, and social mode.
python3 ~/.claude/skills/omnisearch/scripts/omnisearch.py "query" [options]
| Quick Example | Purpose |
|---|
... omnisearch.py "Iran oil sanctions" | Auto-route to best provider |
... omnisearch.py "query" --provider brave | Force specific provider |
... omnisearch.py "query" --parallel | All web providers, merged + deduped |
... omnisearch.py "query" --social | Twitter search via Xpoz |
... omnisearch.py "query" --social --platform reddit | Reddit search |
... omnisearch.py "query" --answer | AI-generated answer (Tavily/Brave) |
... omnisearch.py "query" --news --parallel | News from all providers |
... omnisearch.py "query" --academic | Route to Exa academic index |
... omnisearch.py "query" --verbose | Show routing decisions on stderr |
Query Classification (auto-route):
| Signal | Category | Primary Provider |
|---|
| @mentions, #hashtags, "tweet", "reddit", r/xxx | Social Media | Xpoz |
| "latest", "breaking", "today", date words | News | Brave |
| "paper", "arxiv", "study", "journal" | Academic | Exa |
| "who is", "what is", short questions | Factual Quick | Tavily (with answer) |
| "company", "startup", "funding", "IPO" | Company Research | Exa |
| "documentation", "API", "tutorial", "SDK" | Technical Docs | Exa |
| (default) | General Web | Brave |
2. brave_search.py — Brave Web & News Search
Google-indexed SERP with freshness filtering, country targeting, and LLM Context API.
python3 ~/.claude/skills/omnisearch/scripts/brave_search.py "query" [options]
| Quick Example | Purpose |
|---|
... brave_search.py "Iran infrastructure" | Web search |
... brave_search.py "query" --news | Dedicated news endpoint |
... brave_search.py "query" --summarize | LLM Context API (AI summary) |
... brave_search.py "query" --freshness pd | Past day only |
... brave_search.py "query" --freshness pw --extra-snippets | Past week + rich context |
... brave_search.py "query" --country US --lang en | Localized results |
... brave_search.py "query" --filter web,news --markdown | Multi-type + markdown |
Freshness values: pd (past day), pw (past week), pm (past month), py (past year), or YYYY-MM-DDtoYYYY-MM-DD
3. tavily_search.py — Agent-Native Search with Answers
AI-optimized search with grounded answers, topic modes, and content extraction.
python3 ~/.claude/skills/omnisearch/scripts/tavily_search.py "query" [options]
| Quick Example | Purpose |
|---|
... tavily_search.py "oil prices" --answer | Search + AI answer |
... tavily_search.py "query" --advanced --answer | Deep search + answer |
... tavily_search.py "query" --news --days 3 | News, last 3 days |
... tavily_search.py "query" --finance | Finance topic mode |
... tavily_search.py "query" --answer-only | Pipe-friendly answer |
... tavily_search.py "query" --domains bellingcat.com | Domain-restricted |
... tavily_search.py extract URL [URL...] | Content extraction |
Search depths: basic (fast, ~1s) or --advanced (comprehensive, ~3-5s)
Topics: general (default), --news, --finance
4. xpoz_search.py — Social Media Search
Twitter/X, Reddit, and Instagram search via Xpoz SDK. 12 subcommands.
python3 ~/.claude/skills/omnisearch/scripts/xpoz_search.py SUBCOMMAND "query" [options]
| Quick Example | Purpose |
|---|
... xpoz_search.py twitter "Iran conflict" -n 10 | Twitter search |
... xpoz_search.py twitter "query" --sort latest --min-likes 10 | Filtered tweets |
... xpoz_search.py twitter-user elikishtaini -n 10 | User timeline |
... xpoz_search.py twitter-thread 1234567890 | Full thread |
... xpoz_search.py twitter-hashtag IranStrikes -n 10 | Hashtag search |
... xpoz_search.py reddit "geopolitics Iran" -n 10 | Reddit search |
... xpoz_search.py reddit-sub worldnews -n 10 --sort hot | Subreddit posts |
... xpoz_search.py reddit-post abc123 | Reddit post + comments |
... xpoz_search.py reddit-trending | Trending subreddits |
... xpoz_search.py instagram "conflict" -n 10 | Instagram search |
Twitter filters: --sort (latest/popular/media), --min-likes, --min-retweets, --since/--until, --lang
Reddit filters: --subreddit, --sort (hot/new/top/rising), --time (hour/day/week/month/year/all)
Provider Selection Guide
| Task | Best Approach |
|---|
| General web search | omnisearch.py "query" (auto-routes to Brave) |
| Breaking news | omnisearch.py "query" --news or brave_search.py "query" --news --freshness pd |
| Quick factual answer | omnisearch.py "query" --answer or tavily_search.py "query" --answer |
| Twitter OSINT | omnisearch.py "query" --social or xpoz_search.py twitter "query" |
| Reddit sentiment | xpoz_search.py reddit "query" or omnisearch.py "query" --social --platform reddit |
| Research papers | omnisearch.py "query" --academic (routes to Exa) |
| Company intelligence | omnisearch.py "query" (auto-detects company signals) |
| Multi-source corroboration | omnisearch.py "query" --parallel --verbose |
| Content extraction | tavily_search.py extract URL or Firecrawl |
| Domain-restricted search | tavily_search.py "query" --domains site.com or brave_search.py "query" --goggles ID |
Omnisearch vs Exa vs Firecrawl
| Need | Best Tool | Why |
|---|
| Google SERP surface | Omnisearch (Brave) | Exa has independent index |
| Social media search | Omnisearch (Xpoz) | Only tool with Twitter/Reddit |
| AI answer with citations | Omnisearch (Tavily) | Agent-native answers |
| Multi-provider parallel | Omnisearch --parallel | Dedup across providers |
| Semantic/neural search | Exa directly | Superior relevance ranking |
| Research papers | Exa --category "research paper" | Academic index |
| Find similar pages | Exa exa_similar.py | Semantic similarity |
| Single page scrape | Firecrawl scrape | Cleanest markdown |
| Full site crawl | Firecrawl crawl | Link following |
| News freshness filter | Omnisearch (Brave --freshness) | Hour/day/week/month |
| Content extraction | Tavily extract or Firecrawl | Both work |
Common Workflows
OSINT Research (WWW-style)
python3 ~/.claude/skills/omnisearch/scripts/omnisearch.py "Iran infrastructure strike" --news --parallel --no-text
python3 ~/.claude/skills/omnisearch/scripts/xpoz_search.py twitter "Iran infrastructure" --sort latest -n 15
python3 ~/.claude/skills/exa-search/scripts/exa_contents.py URL1 URL2 --highlights --max-chars 5000
Quick Answer Pipeline
python3 ~/.claude/skills/omnisearch/scripts/omnisearch.py "who commands CENTCOM" --answer --json | jq '.answer'
Cross-Platform Corroboration
python3 ~/.claude/skills/omnisearch/scripts/omnisearch.py "Strait of Hormuz incident" --parallel --verbose
Social Media Monitoring
python3 ~/.claude/skills/omnisearch/scripts/xpoz_search.py twitter "#IranStrikes" --sort latest -n 20
python3 ~/.claude/skills/omnisearch/scripts/xpoz_search.py twitter-user elikishtaini -n 10 --json
API Key Setup
Three new keys in ~/.config/env/secrets.env:
export BRAVE_API_KEY="..."
export TAVILY_API_KEY="tvly-..."
export XPOZ_API_KEY="..."
Existing keys (already configured for cross-skill routing):
export EXA_API_KEY="..."
export FIRECRAWL_API_KEY="..."
All scripts gracefully error with a clear message when their key is missing. You can use any subset.
Reference Documentation
| File | Contents |
|---|
references/brave-api-reference.md | Brave Search API: endpoints, parameters, response schemas, LLM Context API |
references/tavily-api-reference.md | Tavily API: search, extract, answer, topics, domains |
references/xpoz-api-reference.md | Xpoz API: SDK methods, Twitter/Reddit/Instagram endpoints |
Test Suite
python3 ~/.claude/skills/omnisearch/scripts/test_omnisearch.py --quick
python3 ~/.claude/skills/omnisearch/scripts/test_omnisearch.py
python3 ~/.claude/skills/omnisearch/scripts/test_omnisearch.py --group router
python3 ~/.claude/skills/omnisearch/scripts/test_omnisearch.py --group dedup
python3 ~/.claude/skills/omnisearch/scripts/test_omnisearch.py --verbose
| Group | Tests | Live API? |
|---|
router | classify_query (7 categories), select_providers (5 scenarios), routing_table_coverage | No |
dedup | exact URL, normalized URL, title Jaccard, short titles, score sorting, mixed providers, URL normalize, Jaccard math | No |
format | human-readable, markdown, JSON serialization, no-text mode | No |
brave | web search, news, freshness, formatters | Yes |
tavily | basic, advanced, answer, extract | Yes |
xpoz | twitter search, reddit, user tweets | Yes |
integration | auto-route, parallel, cross-skill exa, JSON CLI output | Yes |