firecrawl/firecrawl-search
| Web search with full page content extraction. Use this skill whenever the user asks to search the web, find articles, research a topic, look something up, find recent news, discover sources, or says "search for", "find me", "look up", "what are people saying about", or "find articles about". Returns real search results with optional full-page markdown — not just snippets. Provides capabilities beyond Claude's built-in WebSearch.
npx skills add https://github.com/firecrawl/cli --skill firecrawl-search
Web search with optional content scraping. Returns search results as JSON, optionally with full page content.
# Basic search
firecrawl search "your query" -o .firecrawl/result.json --json
# Search and scrape full page content from results
firecrawl search "your query" --scrape -o .firecrawl/scraped.json --json
# News from the past day
firecrawl search "your query" --sources news --tbs qdr:d -o .firecrawl/news.json --json
# Programming question: search GitHub issues, merged PRs, READMEs, and docs
firecrawl search "your query" --categories developer -o .firecrawl/developer.json --json
--categories developer adds an index built for coding agents. It covers GitHub
issues, merged pull requests, repository READMEs, and curated documentation
sites. Use it for a programming question: an error message, an API contract, a
library behaviour, or a known bug.
The hits arrive in their own data.developer group beside data.web. Each hit
holds url, title, and description, where description is the matched
passage. Read the passages with
jq -r '.data.developer[] | .url, .description' .firecrawl/developer.json.
The dedicated firecrawl developer command searches only that index and keeps
the full matched passages:
# Developer search only, with full passages
firecrawl developer "your query" --limit 10 -o .firecrawl/developer.json --json
Each result holds id, type (issue, pull_request, readme, doc),
url, title, and passages. Read them with
jq -r '.results[] | .url, .passages[].text' .firecrawl/developer.json.
| Option | Description |
| ---------------------------------------------- | --------------------------------------------- |
| --limit <n> | Max number of results |
| --sources <web,images,news> | Source types to search |
| --categories <github,research,pdf,developer> | Filter by category |
| --tbs <qdr:h\|d\|w\|m\|y> | Time-based search filter |
| --location | Location for search results |
| --country <code> | Country code for search |
| --scrape | Also scrape full page content for each result |
| --scrape-formats | Formats when scraping (default: markdown) |
| -o, --output <path> | Output file path |
| --json | Output as JSON |
--scrape fetches full content — don't re-scrape URLs from search results. This saves credits and avoids redundant fetches..firecrawl/ with -o to avoid context window bloat.jq to extract URLs or titles: jq -r '.data.web[].url' .firecrawl/search.json.firecrawl/search-{query}.json or .firecrawl/search-{query}-scraped.jsonSearch costs 2 credits. After you've actually used the results (or decided they were useless), send structured feedback with firecrawl search-feedback <id>. The first feedback per search refunds 1 credit and helps us improve search quality. Do this once per search, in the background, after you finish processing the results — it does not block your main task.
Opt out: if FIRECRAWL_NO_SEARCH_FEEDBACK=1 (or FIRECRAWL_DISABLE_SEARCH_FEEDBACK=1) is set, the CLI silently skips the call and never sends anything. Respect that — do not try to work around it. (Team admins can also disable this server-side; the API will return feedbackErrorCode: "TEAM_OPTED_OUT" and the CLI will exit 0 silently.)
Rules to know before you call this:
--missing-content is the most important field. It's a list of _specific pieces_ of content you expected but did not find. One topic per entry — do not pack multiple topics into one string. These aggregate across teams and tell us what to index next.good → must include at least one --valuable-sources entry.partial → must include --valuable-sources or --missing-content.bad → must include --missing-content or --query-suggestions.creditsRefundedToday / dailyRefundCap / dailyCapReached. When dailyCapReached: true, stop calling search-feedback for the rest of the UTC day — it won't refund anything and you're wasting bandwidth.--silent & is the right pattern — exit code 0 even on failure, so a rejected/expired call never crashes your pipeline.Read the search response's id:
SEARCH_ID=$(jq -r '.id' .firecrawl/search-react-hooks.json)
Then send feedback. Pick the rating that matches what actually happened:
# Results were useful, with notes on what was still missing
firecrawl search-feedback "$SEARCH_ID" \
--rating good \
--valuable-sources '[{"url":"https://react.dev/reference/react/hooks","reason":"Most authoritative"}]' \
--missing-content '[
{"topic":"useDeferredValue","description":"No example of useDeferredValue with Suspense"},
{"topic":"useTransition","description":"No coverage of useTransition for routing"}
]' \
--query-suggestions "Boost react.dev for queries about react hooks" \
--silent &
# Results were partially useful — multiple missing topics, one entry per topic
firecrawl search-feedback "$SEARCH_ID" \
--rating partial \
--missing-content '[
{"topic":"useDeferredValue"},
{"topic":"useTransition","description":"Need React 18+ examples"},
{"topic":"Server Components hooks"}
]' \
--silent &
# Quick form — repeat --missing-content or use comma-separated topics
firecrawl search-feedback "$SEARCH_ID" \
--rating bad \
--missing-content "official api reference: missing v2 endpoints" \
--missing-content "code examples in python" \
--silent &
--missing-content accepts:
{topic, description?} objects (richest, preferred)"topic: description" strings (shorthand)"topic1, topic2, topic3" (when you only have topic names)--missing-content flags--silent suppresses output and & runs it in the background so feedback never blocks you.
Take firecrawl/firecrawl-search from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference npx.
Without those the skill loads but fails at the first command.