crw-search — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited crw-search (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
scrape the one that looks right.
step 2 (crw-scrape) — pick the best result URL and scrape it for full content.
raw JSON. See crw-dynamic-search.
usage cap. Queries never leave your infrastructure in embedded/local mode.
CLI (binary on PATH):
crw search "rust async http client" # text output
crw search "site:docs.rs tokio" --json --fields title,url,snippet --limit 5
crw search "CVE-2024-1234" --category news --time-range week
crw search "climate policy 2025" --json -o .crw/results.json
crw search "rust crates" --language en --limit 20MCP (inside an agent harness):
crw_search(query="rust async http client", limit=5, lang="en")
crw_search(query="latest CVE nginx", tbs="qdr:w", categories="news")
crw_search(query="openai pricing", scrapeOptions={"formats": ["markdown"]})REST (drop-in for Firecrawl SDKs — just swap the base URL):
curl -X POST "$CRW_API_URL/v1/search" -H "Authorization: Bearer $CRW_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"query":"rust async http","limit":5,"lang":"en"}'| Need | CLI flag | MCP / REST field | |||||||
|---|---|---|---|---|---|---|---|---|---|
| Result count | -l/--limit N (default 10) | limit (default 5) | |||||||
| JSON output | --json or --format json | — (always JSON) | |||||||
| Field projection | --fields title,url,snippet | — | |||||||
| Output to file | -o FILE | — | |||||||
| Filter by category | `--category news\ | images\ | videos\ | general\ | …` | categories | |||
| Language | --language en | lang | |||||||
| Time filter | `--time-range day\ | week\ | month\ | year` | `tbs: qdr:h\ | qdr:d\ | qdr:w\ | qdr:m\ | qdr:y` |
| Safe search | `--safesearch 0\ | 1\ | 2` | — | |||||
| Custom SearXNG | --searxng-url URL / $CRW_SEARXNG_URL | — | |||||||
| Group by source | — | sources: ["web","news","images"] | |||||||
| Scrape results inline | — (use crw scrape separately) | scrapeOptions: {formats:["markdown"]} |
`--fields` available values: title, url, description, snippet, position, score, category. snippet is an alias for description.
SearXNG is a meta-search aggregator — it merges results from multiple engines (Google, Bing, DuckDuckGo, etc.) and the score field reflects internal engine weighting, not a universal relevance measure. Do not rely on score for ranking or filtering. Use `position` (1-based rank) or result order instead — position 1 is the most relevant result SearXNG surfaced.
crw setup --local to spin up a pre-configured sidecar automatically. Public instances (searx.be, priv.au) usually block JSON with 403/429.
--json --fields title,url,snippet --limit 5is one call; piping to jq is two. Prefer the flag.
scrapeOptions: {formats: ["markdown"]}to get page content alongside search results in one round-trip. There is no --scrape CLI flag — use the MCP/REST path for this.
--time-range week (CLI) or tbs: "qdr:w"(MCP/REST) for news, CVEs, releases, or any freshness-sensitive topic.
crw search "…" returns candidates;crw scrape "<url>" gets the full content. Don't try to read content from search snippets alone.
to stdout into context. Use -o .crw/results.json then jq/grep.
subprocess to save context (use this on token-heavy tasks)
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.