Web search/scrape/crawl via Firecrawl CLI (prefer for live internet lookups).
59
69%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
Fix and improve this skill with Tessl
tessl review fix ./.agents/skills/00-utilities/firecrawl/SKILL.mdUse the firecrawl CLI to fetch and search the web. If the user asks for information from the internet, use Firecrawl skill.
Check status, auth, and rate limits:
firecrawl --statusOutput when ready:
🔥 firecrawl cli v1.0.2
● Authenticated via FIRECRAWL_API_KEY
Concurrency: 0/100 jobs (parallel scrape limit)
Credits: 500,000 remainingIf not installed: npm install -g firecrawl-cli
Always refer to the installation rules in rules/install.md for more information if the user is not logged in.
If not authenticated, run:
firecrawl login --browserThe --browser flag automatically opens the browser for authentication without prompting. This is the recommended method for agents. Don't tell users to run the commands themselves - just execute the command and have it prompt them to authenticate in their browser.
Create a .firecrawl/ folder in the working directory unless it already exists to store results unless a user specifies to return in context. Add .firecrawl/ to the .gitignore file if not already there. Always use -o to write directly to file (avoids flooding context):
# Search the web (most common operation)
firecrawl search "your query" -o .firecrawl/search-{query}.json
# Search with scraping enabled
firecrawl search "your query" --scrape -o .firecrawl/search-{query}-scraped.json
# Scrape a page
firecrawl scrape https://example.com -o .firecrawl/{site}-{path}.mdExamples:
.firecrawl/search-react_server_components.json
.firecrawl/search-ai_news-scraped.json
.firecrawl/docs.github.com-actions-overview.md
.firecrawl/firecrawl.dev.mdFor temporary one-time scripts (batch scraping, data processing), use .firecrawl/scratchpad/:
.firecrawl/scratchpad/bulk-scrape.sh
.firecrawl/scratchpad/process-results.shOrganize into subdirectories when it makes sense for the task:
.firecrawl/competitor-research/
.firecrawl/docs/nextjs/
.firecrawl/news/2024-01/Always quote URLs - shell interprets ? and & as special characters.
# Basic search (human-readable output)
firecrawl search "your query" -o .firecrawl/search-query.txt
# JSON output (recommended for parsing)
firecrawl search "your query" -o .firecrawl/search-query.json --json
# Limit results
firecrawl search "AI news" --limit 10 -o .firecrawl/search-ai-news.json --json
# Search specific sources
firecrawl search "tech startups" --sources news -o .firecrawl/search-news.json --json
firecrawl search "landscapes" --sources images -o .firecrawl/search-images.json --json
firecrawl search "machine learning" --sources web,news,images -o .firecrawl/search-ml.json --json
# Filter by category (GitHub repos, research papers, PDFs)
firecrawl search "web scraping python" --categories github -o .firecrawl/search-github.json --json
firecrawl search "transformer architecture" --categories research -o .firecrawl/search-research.json --json
# Time-based search
firecrawl search "AI announcements" --tbs qdr:d -o .firecrawl/search-today.json --json # Past day
firecrawl search "tech news" --tbs qdr:w -o .firecrawl/search-week.json --json # Past week
firecrawl search "yearly review" --tbs qdr:y -o .firecrawl/search-year.json --json # Past year
# Location-based search
firecrawl search "restaurants" --location "San Francisco,California,United States" -o .firecrawl/search-sf.json --json
firecrawl search "local news" --country DE -o .firecrawl/search-germany.json --json
# Search AND scrape content from results
firecrawl search "firecrawl tutorials" --scrape -o .firecrawl/search-scraped.json --json
firecrawl search "API docs" --scrape --scrape-formats markdown,links -o .firecrawl/search-docs.json --jsonSearch Options:
--limit <n> - Maximum results (default: 5, max: 100)--sources <sources> - Comma-separated: web, images, news (default: web)--categories <categories> - Comma-separated: github, research, pdf--tbs <value> - Time filter: qdr:h (hour), qdr:d (day), qdr:w (week), qdr:m (month), qdr:y (year)--location <location> - Geo-targeting (e.g., "Germany")--country <code> - ISO country code (default: US)--scrape - Enable scraping of search results--scrape-formats <formats> - Scrape formats when --scrape enabled (default: markdown)-o, --output <path> - Save to file# Basic scrape (markdown output)
firecrawl scrape https://example.com -o .firecrawl/example.md
# Get raw HTML
firecrawl scrape https://example.com --html -o .firecrawl/example.html
# Multiple formats (JSON output)
firecrawl scrape https://example.com --format markdown,links -o .firecrawl/example.json
# Main content only (removes nav, footer, ads)
firecrawl scrape https://example.com --only-main-content -o .firecrawl/example.md
# Wait for JS to render
firecrawl scrape https://spa-app.com --wait-for 3000 -o .firecrawl/spa.md
# Extract links only
firecrawl scrape https://example.com --format links -o .firecrawl/links.json
# Include/exclude specific HTML tags
firecrawl scrape https://example.com --include-tags article,main -o .firecrawl/article.md
firecrawl scrape https://example.com --exclude-tags nav,aside,.ad -o .firecrawl/clean.mdScrape Options:
-f, --format <formats> - Output format(s): markdown, html, rawHtml, links, screenshot, json-H, --html - Shortcut for --format html--only-main-content - Extract main content only--wait-for <ms> - Wait before scraping (for JS content)--include-tags <tags> - Only include specific HTML tags--exclude-tags <tags> - Exclude specific HTML tags-o, --output <path> - Save to file# List all URLs (one per line)
firecrawl map https://example.com -o .firecrawl/urls.txt
# Output as JSON
firecrawl map https://example.com --json -o .firecrawl/urls.json
# Search for specific URLs
firecrawl map https://example.com --search "blog" -o .firecrawl/blog-urls.txt
# Limit results
firecrawl map https://example.com --limit 500 -o .firecrawl/urls.txt
# Include subdomains
firecrawl map https://example.com --include-subdomains -o .firecrawl/all-urls.txtMap Options:
--limit <n> - Maximum URLs to discover--search <query> - Filter URLs by search query--sitemap <mode> - include, skip, or only--include-subdomains - Include subdomains--json - Output as JSON-o, --output <path> - Save to fileNEVER read entire firecrawl output files at once unless explicitly asked or required - they're often 1000+ lines. Instead, use grep, head, or incremental reads. Determine values dynamically based on file size and what you're looking for.
Examples:
# Check file size and preview structure
wc -l .firecrawl/file.md && head -50 .firecrawl/file.md
# Use grep to find specific content
grep -n "keyword" .firecrawl/file.md
grep -A 10 "## Section" .firecrawl/file.md
# Read incrementally with offset/limit
Read(file, offset=1, limit=100)
Read(file, offset=100, limit=100)Adjust line counts, offsets, and grep context as needed. Use other bash commands (awk, sed, jq, cut, sort, uniq, etc.) when appropriate for processing output.
# Raw markdown output
firecrawl scrape https://example.com --format markdown -o .firecrawl/page.md
# JSON output with multiple formats
firecrawl scrape https://example.com --format markdown,links -o .firecrawl/page.jsonBranding is obtained from the v2 scrape endpoint with formats: ["branding"].
curl -sS -X POST "https://api.firecrawl.dev/v2/scrape" \
-H "Authorization: Bearer $FIRECRAWL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com","formats":["branding"],"waitFor":10000}' \
-o ".firecrawl/example-branding.json"jq -r '.data.colors.primary' .firecrawl/example-branding.json
jq -r '.data.typography.headings[]?' .firecrawl/example-branding.json
jq -r '.data.logo' .firecrawl/example-branding.jsonIf your firecrawl CLI version supports branding as a format, you can use it; otherwise use the API approach above (don't assume CLI support unconditionally).
# Extract URLs from search results
jq -r '.data.web[].url' .firecrawl/search-query.json
# Get titles from search results
jq -r '.data.web[] | "\(.title): \(.url)"' .firecrawl/search-query.json
# Extract links and process with jq
firecrawl scrape https://example.com --format links | jq '.links[].url'
# Search within scraped content
grep -i "keyword" .firecrawl/page.md
# Count URLs from map
firecrawl map https://example.com | wc -l
# Process news results
jq -r '.data.news[] | "[\(.date)] \(.title)"' .firecrawl/search-news.jsonALWAYS run multiple scrapes in parallel, never sequentially. Check firecrawl --status for concurrency limit, then run up to that many jobs using & and wait:
# WRONG - sequential (slow)
firecrawl scrape https://site1.com -o .firecrawl/1.md
firecrawl scrape https://site2.com -o .firecrawl/2.md
firecrawl scrape https://site3.com -o .firecrawl/3.md
# CORRECT - parallel (fast)
firecrawl scrape https://site1.com -o .firecrawl/1.md &
firecrawl scrape https://site2.com -o .firecrawl/2.md &
firecrawl scrape https://site3.com -o .firecrawl/3.md &
waitFor many URLs, use xargs with -P for parallel execution:
cat urls.txt | xargs -P 10 -I {} sh -c 'firecrawl scrape "{}" -o ".firecrawl/$(echo {} | md5).md"'a0eadb2
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.