search-cli
Multi-provider web search CLI for AI agents — Brave, Serper, Exa, Jina, Firecrawl, Perplexity, xAI in one Rust binary
Search CLI
One binary, 11 providers, 14 modes. The web search tool your AI agent is missing.
A single Rust binary that aggregates Brave, Serper, Exa, Jina, Firecrawl, Tavily, SerpApi, Perplexity, xAI, and more into one unified search interface. Designed from day one for AI agents -- structured JSON output, semantic exit codes, auto-JSON when piped, and parallel fan-out across providers in under 2 seconds.
Install | How It Works | Features | Providers | Contributing
Why This Exists
Every search API is good at something different. Brave has its own 35-billion page index. Serper gives you raw Google results plus Scholar, Patents, and Places. Exa does neural/semantic search. Perplexity gives AI-synthesized answers with citations. Jina reads any URL into clean markdown. Firecrawl renders JavaScript-heavy pages. xAI searches X/Twitter.
You shouldn't have to wire up each one separately, handle their different response formats, manage rate limits, or figure out which provider to use for which query type. search does all of that for you -- routes your query to the right combination automatically, fans out in parallel, deduplicates results, and gives you a single clean response.
search "CRISPR gene therapy breakthroughs"
That's it. Auto-detects your intent, picks the right providers, and returns results in under 2 seconds.
Install
Cargo (recommended):
cargo install agent-search
Homebrew:
brew tap 199-biotechnologies/tap
brew install search-cli
One-liner (macOS / Linux):
curl -fsSL https://raw.githubusercontent.com/199-biotechnologies/search-cli/master/install.sh | sh
From source:
cargo install --git https://github.com/199-biotechnologies/search-cli
Binary size is ~6 MB. Startup is ~2 ms. Memory is ~5 MB. No Python, no Node, no Docker.
Quick Start
# Set your API keys (any combination works -- even just one)
search config set keys.brave YOUR_BRAVE_KEY
search config set keys.serper YOUR_SERPER_KEY
search config set keys.exa YOUR_EXA_KEY
# Or use environment variables
export SEARCH_KEYS_BRAVE=YOUR_KEY
export SEARCH_KEYS_EXA=YOUR_KEY
# Search
search "your query here"
How It Works
┌─────────────┐
│ Your Query │
└──────┬──────┘
│
┌──────▼──────┐
│ Classify │ regex-based intent detection
└──────┬──────┘
│
┌────────────┼────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Brave │ │ Serper │ │ Exa │ parallel fan-out
└────┬─────┘ └────┬─────┘ └────┬─────┘ via tokio::JoinSet
│ │ │
└────────────┼────────────┘
│
┌──────▼──────┐
│ Dedup & │ URL normalization
│ Merge │ across providers
└──────┬──────┘
│
┌───────────┴───────────┐
▼ ▼
┌────────────┐ ┌────────────┐
│ JSON │ │ Table │
│ (piped) │ │ (terminal) │
└────────────┘ └────────────┘
- Parse -- Clap parses your query, mode, provider filter, and output preferences
- Classify -- If mode is
auto, regex-based intent classifier picks the right mode - Route -- Mode determines which providers to query (or you override with
-p) - Fan out --
tokio::JoinSetfires all providers in parallel with per-provider timeouts - Collect -- Results stream in as providers respond (no waiting for the slowest)
- Dedup -- URL normalization removes duplicates across providers
- Render -- JSON envelope when piped, colored terminal table when interactive
Features
14 Search Modes
| Mode | What it does | Providers used |
|---|---|---|
auto |
Detects intent from your query | varies |
general |
Broad web search | Brave + Serper + Exa + Jina + Tavily + Perplexity |
news |
Breaking news, current events | Brave News + Serper News + Tavily + Perplexity |
academic |
Research papers, studies | Exa + Serper + Tavily + Perplexity |
people |
LinkedIn profiles, bios | Exa |
deep |
Maximum coverage | Brave (LLM Context) + Exa + Serper + Tavily + Perplexity + xAI |
scholar |
Google Scholar | Serper + SerpApi |
patents |
Patent search | Serper |
images |
Image search | Serper |
places |
Local businesses, maps | Serper |
extract |
Full text from a URL | Stealth -> Jina -> Firecrawl -> Browserless |
scrape |
Page scraping | Stealth -> Jina -> Firecrawl -> Browserless |
similar |
Find similar pages to a URL | Exa |
social |
X/Twitter social search | xAI (Grok) |
Agent-First Design
Built for Claude Code, Codex CLI, Gemini CLI, OpenClaw, and any AI agent that can shell out to a command.
# Discover capabilities programmatically
search agent-info
# Structured JSON with metadata
search "query" --json
# {
# "status": "success",
# "query": "...",
# "mode": "general",
# "results": [...],
# "metadata": {
# "elapsed_ms": 1542,
# "result_count": 10,
# "providers_queried": ["brave", "serper", "exa"]
# }
# }
Auto-JSON: Output is automatically JSON when piped to another program. Human-readable tables when you're in a terminal.
Semantic exit codes:
| Code | Meaning | Agent action |
|---|---|---|
| 0 | Success | Process results |
| 1 | Runtime error | Retry might help |
| 2 | Config error | Fix configuration |
| 3 | Auth missing | Set API key |
| 4 | Rate limited | Back off and retry |
Usage Examples
# Auto-detect mode (just type what you want)
search "quantum computing advances"
search "who is the CEO of Anthropic"
search "CRISPR research papers"
# Force a specific mode
search search -q "transformer architectures" -m academic
search search -q "Sam Altman" -m people
search search -q "AI startups 2026" -m news
search search -q "BRCA1 gene patent" -m patents
# Search X (Twitter) only
search --x "AI agents"
# Pick specific providers
search search -q "machine learning" -p exa
search search -q "rust programming" -p brave,serper
# Control output
search "query" --json | jq '.results[].url'
search "query" -c 20 # 20 results
search "query" 2>/dev/null # suppress diagnostics
Providers
| Provider | What it does | Best for |
|---|---|---|
| Brave | Independent 35B-page index + LLM Context API | Web search, news, RAG-ready content |
| Serper | Raw Google SERP + specialist endpoints | Scholar, patents, images, places |
| Exa | Neural/semantic search, category filters | Research papers, people search, similar sites |
| Jina | Fast URL-to-markdown, 500 RPM free tier | Reading article content, quick extraction |
| Firecrawl | JavaScript rendering, structured extraction | Dynamic pages, SPAs, data extraction |
| Tavily | General + deep search, research-focused | Broad coverage, research queries |
| SerpApi | 80+ engines: Google, Bing, YouTube, Baidu | Scholar, multi-engine coverage |
| Perplexity | AI-powered answers with citations (Sonar Pro) | Complex queries, synthesized answers |
| Browserless | Cloud browser for Cloudflare/JS-heavy pages | Anti-bot bypass, dynamic rendering |
| Stealth | Built-in anti-bot scraper | Protected pages, no API key needed |
| xAI | X/Twitter search via Grok AI | Tweets, trending topics, social sentiment |
Configuration
Config file lives at ~/.config/search/config.toml (Linux) or ~/Library/Application Support/search/config.toml (macOS).
search config show # View current config (keys masked)
search config check # Health check all providers
search config set K V # Set a value
Environment variables override the config file. Prefix with SEARCH_KEYS_:
export SEARCH_KEYS_BRAVE=your-key
export SEARCH_KEYS_SERPER=your-key
export SEARCH_KEYS_EXA=your-key
export SEARCH_KEYS_JINA=your-key
export SEARCH_KEYS_FIRECRAWL=your-key
export SEARCH_KEYS_TAVILY=your-key
export SEARCH_KEYS_SERPAPI=your-key
export SEARCH_KEYS_PERPLEXITY=your-key
export SEARCH_KEYS_BROWSERLESS=your-key
export SEARCH_KEYS_XAI=your-key
Updating
search update # Self-update from GitHub releases
search update --check # Check without installing
Building from Source
git clone https://github.com/199-biotechnologies/search-cli
cd search-cli
cargo build --release
# Binary at target/release/search
Contributing
Contributions are welcome. See CONTRIBUTING.md for guidelines.
License
Yorumlar (0)
Yorum birakmak icin giris yap.
Yorum birakSonuc bulunamadi