{"id":48963743,"url":"https://github.com/paperfoot/search-cli","last_synced_at":"2026-04-18T03:03:42.652Z","repository":{"id":345594714,"uuid":"1186595418","full_name":"paperfoot/search-cli","owner":"paperfoot","description":"Multi-provider web search CLI for AI agents — Brave, Serper, Exa, Jina, Firecrawl, Perplexity, xAI in one Rust binary","archived":false,"fork":false,"pushed_at":"2026-04-17T20:43:13.000Z","size":173,"stargazers_count":13,"open_issues_count":3,"forks_count":4,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-04-17T22:29:22.622Z","etag":null,"topics":["ai-agent-tools","brave-search","cli-tool","command-line-tool","developer-tools","exa","firecrawl","jina","mcp","meta-search","multi-provider-search","perplexity","rust-cli","search-cli","search-engine","serper","tavily","web-scraping","web-search-api","xai"],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/paperfoot.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-19T19:45:07.000Z","updated_at":"2026-04-17T20:43:16.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/paperfoot/search-cli","commit_stats":null,"previous_names":["199-biotechnologies/search-cli","paperfoot/search-cli"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/paperfoot/search-cli","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paperfoot%2Fsearch-cli","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paperfoot%2Fsearch-cli/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paperfoot%2Fsearch-cli/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paperfoot%2Fsearch-cli/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/paperfoot","download_url":"https://codeload.github.com/paperfoot/search-cli/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paperfoot%2Fsearch-cli/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31954738,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T00:39:45.007Z","status":"online","status_checked_at":"2026-04-18T02:00:07.018Z","response_time":103,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agent-tools","brave-search","cli-tool","command-line-tool","developer-tools","exa","firecrawl","jina","mcp","meta-search","multi-provider-search","perplexity","rust-cli","search-cli","search-engine","serper","tavily","web-scraping","web-search-api","xai"],"created_at":"2026-04-18T03:03:39.364Z","updated_at":"2026-04-18T03:03:42.643Z","avatar_url":"https://github.com/paperfoot.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# Search CLI\n\n**One binary, 11 providers, 14 modes. The web search tool your AI agent is missing.**\n\n\u003cbr /\u003e\n\n[![Star this repo](https://img.shields.io/github/stars/paperfoot/search-cli?style=for-the-badge\u0026logo=github\u0026label=%E2%AD%90%20Star%20this%20repo\u0026color=yellow)](https://github.com/paperfoot/search-cli/stargazers)\n\u0026nbsp;\u0026nbsp;\n[![Follow @longevityboris](https://img.shields.io/badge/Follow_%40longevityboris-000000?style=for-the-badge\u0026logo=x\u0026logoColor=white)](https://x.com/longevityboris)\n\n\u003cbr /\u003e\n\n[![Crates.io](https://img.shields.io/crates/v/agent-search?style=for-the-badge\u0026logo=rust\u0026logoColor=white\u0026label=crates.io)](https://crates.io/crates/agent-search)\n[![Downloads](https://img.shields.io/crates/d/agent-search?style=for-the-badge\u0026logo=rust\u0026logoColor=white)](https://crates.io/crates/agent-search)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue?style=for-the-badge)](LICENSE)\n[![Build](https://img.shields.io/github/actions/workflow/status/paperfoot/search-cli/ci.yml?style=for-the-badge\u0026logo=github)](https://github.com/paperfoot/search-cli/actions)\n\n---\n\nA 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.\n\n[Install](#install) | [How It Works](#how-it-works) | [Features](#features) | [Providers](#providers) | [Contributing](#contributing)\n\n\u003c/div\u003e\n\n## Why This Exists\n\nEvery 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.\n\nYou 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.\n\n```bash\nsearch \"CRISPR gene therapy breakthroughs\"\n```\n\nThat's it. Auto-detects your intent, picks the right providers, and returns results in under 2 seconds.\n\n## Install\n\n**Cargo (recommended):**\n```bash\ncargo install agent-search\n```\n\n**Homebrew:**\n```bash\nbrew tap 199-biotechnologies/tap\nbrew install search-cli\n```\n\n**One-liner (macOS / Linux):**\n```bash\ncurl -fsSL https://raw.githubusercontent.com/paperfoot/search-cli/master/install.sh | sh\n```\n\n**From source:**\n```bash\ncargo install --git https://github.com/paperfoot/search-cli\n```\n\nBinary size is ~6 MB. Startup is ~2 ms. Memory is ~5 MB. No Python, no Node, no Docker.\n\n## Quick Start\n\n```bash\n# Set your API keys (any combination works -- even just one)\nsearch config set keys.brave YOUR_BRAVE_KEY\nsearch config set keys.serper YOUR_SERPER_KEY\nsearch config set keys.exa YOUR_EXA_KEY\n\n# Or use environment variables\nexport SEARCH_KEYS_BRAVE=YOUR_KEY\nexport SEARCH_KEYS_EXA=YOUR_KEY\n\n# Search\nsearch \"your query here\"\n```\n\n## How It Works\n\n```\n                          ┌─────────────┐\n                          │  Your Query │\n                          └──────┬──────┘\n                                 │\n                          ┌──────▼──────┐\n                          │   Classify  │  regex-based intent detection\n                          └──────┬──────┘\n                                 │\n                    ┌────────────┼────────────┐\n                    ▼            ▼            ▼\n              ┌──────────┐ ┌──────────┐ ┌──────────┐\n              │  Brave   │ │  Serper  │ │   Exa    │  parallel fan-out\n              └────┬─────┘ └────┬─────┘ └────┬─────┘  via tokio::JoinSet\n                   │            │            │\n                   └────────────┼────────────┘\n                                │\n                         ┌──────▼──────┐\n                         │   Dedup \u0026   │  URL normalization\n                         │   Merge     │  across providers\n                         └──────┬──────┘\n                                │\n                    ┌───────────┴───────────┐\n                    ▼                       ▼\n             ┌────────────┐         ┌────────────┐\n             │    JSON    │         │   Table    │\n             │  (piped)   │         │ (terminal) │\n             └────────────┘         └────────────┘\n```\n\n1. **Parse** -- Clap parses your query, mode, provider filter, and output preferences\n2. **Classify** -- If mode is `auto`, regex-based intent classifier picks the right mode\n3. **Route** -- Mode determines which providers to query (or you override with `-p`)\n4. **Fan out** -- `tokio::JoinSet` fires all providers in parallel with per-provider timeouts\n5. **Collect** -- Results stream in as providers respond (no waiting for the slowest)\n6. **Dedup** -- URL normalization removes duplicates across providers\n7. **Render** -- JSON envelope when piped, colored terminal table when interactive\n\n## Features\n\n### 14 Search Modes\n\n| Mode | What it does | Providers used |\n|------|-------------|----------------|\n| `auto` | Detects intent from your query | *varies* |\n| `general` | Broad web search | Brave + Serper + Exa + Jina + Tavily + Perplexity |\n| `news` | Breaking news, current events | Brave News + Serper News + Tavily + Perplexity |\n| `academic` | Research papers, studies | Exa + Serper + Tavily + Perplexity |\n| `people` | LinkedIn profiles, bios | Exa |\n| `deep` | Maximum coverage | Brave (LLM Context) + Exa + Serper + Tavily + Perplexity + xAI |\n| `scholar` | Google Scholar | Serper + SerpApi |\n| `patents` | Patent search | Serper |\n| `images` | Image search | Serper |\n| `places` | Local businesses, maps | Serper |\n| `extract` | Full text from a URL | Stealth -\u003e Jina -\u003e Firecrawl -\u003e Browserless |\n| `scrape` | Page scraping | Stealth -\u003e Jina -\u003e Firecrawl -\u003e Browserless |\n| `similar` | Find similar pages to a URL | Exa |\n| `social` | X/Twitter social search | xAI (Grok) |\n\n### Agent-First Design\n\nBuilt for Claude Code, Codex CLI, Gemini CLI, [OpenClaw](https://github.com/openclaw), and any AI agent that can shell out to a command.\n\n```bash\n# Discover capabilities programmatically\nsearch agent-info\n\n# Structured JSON with metadata\nsearch \"query\" --json\n# {\n#   \"status\": \"success\",\n#   \"query\": \"...\",\n#   \"mode\": \"general\",\n#   \"results\": [...],\n#   \"metadata\": {\n#     \"elapsed_ms\": 1542,\n#     \"result_count\": 10,\n#     \"providers_queried\": [\"brave\", \"serper\", \"exa\"]\n#   }\n# }\n```\n\n**Auto-JSON:** Output is automatically JSON when piped to another program. Human-readable tables when you're in a terminal.\n\n**Semantic exit codes:**\n\n| Code | Meaning | Agent action |\n|------|---------|-------------|\n| 0 | Success | Process results |\n| 1 | Runtime error | Retry might help |\n| 2 | Config error | Fix configuration |\n| 3 | Auth missing | Set API key |\n| 4 | Rate limited | Back off and retry |\n\n### Usage Examples\n\n```bash\n# Auto-detect mode (just type what you want)\nsearch \"quantum computing advances\"\nsearch \"who is the CEO of Anthropic\"\nsearch \"CRISPR research papers\"\n\n# Force a specific mode\nsearch search -q \"transformer architectures\" -m academic\nsearch search -q \"Sam Altman\" -m people\nsearch search -q \"AI startups 2026\" -m news\nsearch search -q \"BRCA1 gene patent\" -m patents\n\n# Search X (Twitter) only\nsearch --x \"AI agents\"\n\n# Pick specific providers\nsearch search -q \"machine learning\" -p exa\nsearch search -q \"rust programming\" -p brave,serper\n\n# Control output\nsearch \"query\" --json | jq '.results[].url'\nsearch \"query\" -c 20                   # 20 results\nsearch \"query\" 2\u003e/dev/null             # suppress diagnostics\n```\n\n## Providers\n\n| Provider | What it does | Best for |\n|----------|-------------|----------|\n| **[Brave](https://brave.com/search/api/)** | Independent 35B-page index + LLM Context API | Web search, news, RAG-ready content |\n| **[Serper](https://serper.dev/)** | Raw Google SERP + specialist endpoints | Scholar, patents, images, places |\n| **[Exa](https://exa.ai/)** | Neural/semantic search, category filters | Research papers, people search, similar sites |\n| **[Jina](https://jina.ai/)** | Fast URL-to-markdown, 500 RPM free tier | Reading article content, quick extraction |\n| **[Firecrawl](https://firecrawl.dev/)** | JavaScript rendering, structured extraction | Dynamic pages, SPAs, data extraction |\n| **[Tavily](https://tavily.com/)** | General + deep search, research-focused | Broad coverage, research queries |\n| **[SerpApi](https://serpapi.com/)** | 80+ engines: Google, Bing, YouTube, Baidu | Scholar, multi-engine coverage |\n| **[Perplexity](https://perplexity.ai/)** | AI-powered answers with citations (Sonar Pro) | Complex queries, synthesized answers |\n| **Browserless** | Cloud browser for Cloudflare/JS-heavy pages | Anti-bot bypass, dynamic rendering |\n| **Stealth** | Built-in anti-bot scraper | Protected pages, no API key needed |\n| **[xAI](https://x.ai/)** | X/Twitter search via Grok AI | Tweets, trending topics, social sentiment |\n\n## Configuration\n\nConfig file lives at `~/.config/search/config.toml` (Linux) or `~/Library/Application Support/search/config.toml` (macOS).\n\n```bash\nsearch config show       # View current config (keys masked)\nsearch config check      # Health check all providers\nsearch config set K V    # Set a value\n```\n\nEnvironment variables override the config file. Prefix with `SEARCH_KEYS_`:\n\n```bash\nexport SEARCH_KEYS_BRAVE=your-key\nexport SEARCH_KEYS_SERPER=your-key\nexport SEARCH_KEYS_EXA=your-key\nexport SEARCH_KEYS_JINA=your-key\nexport SEARCH_KEYS_FIRECRAWL=your-key\nexport SEARCH_KEYS_TAVILY=your-key\nexport SEARCH_KEYS_SERPAPI=your-key\nexport SEARCH_KEYS_PERPLEXITY=your-key\nexport SEARCH_KEYS_BROWSERLESS=your-key\nexport SEARCH_KEYS_XAI=your-key\n```\n\n## Updating\n\n```bash\nsearch update             # Self-update from GitHub releases\nsearch update --check     # Check without installing\n```\n\n## Building from Source\n\n```bash\ngit clone https://github.com/paperfoot/search-cli\ncd search-cli\ncargo build --release\n# Binary at target/release/search\n```\n\n## Contributing\n\nContributions are welcome. See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n## License\n\n[MIT](LICENSE)\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\nBuilt by [Boris Djordjevic](https://github.com/longevityboris) at [199 Biotechnologies](https://github.com/199-biotechnologies) | [Paperfoot AI](https://paperfoot.ai)\n\n\u003cbr /\u003e\n\n**If this is useful to you:**\n\n[![Star this repo](https://img.shields.io/github/stars/paperfoot/search-cli?style=for-the-badge\u0026logo=github\u0026label=%E2%AD%90%20Star%20this%20repo\u0026color=yellow)](https://github.com/paperfoot/search-cli/stargazers)\n\u0026nbsp;\u0026nbsp;\n[![Follow @longevityboris](https://img.shields.io/badge/Follow_%40longevityboris-000000?style=for-the-badge\u0026logo=x\u0026logoColor=white)](https://x.com/longevityboris)\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpaperfoot%2Fsearch-cli","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpaperfoot%2Fsearch-cli","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpaperfoot%2Fsearch-cli/lists"}