123k 스타·7.5k 포크·5,475 커밋의 LLM 시대 웹 스크래핑 인프라. 어떤 URL이든 app.scrape() 한 줄이면 JS가 무거운 SPA·PDF·DOCX·이미지까지 깨끗한 마크다운으로 변환해 준다. 단일 페이지 스크래핑부터 전체 사이트 크롤, MCP/Agent Skill 통합, "URL 모르고 결과만 묘사하면 알아서 찾아오는" Agent 엔드포인트까지 한 API에 묶었다. AGPL-3.0 오픈소스 + Mendable사 클라우드 호스팅 듀얼 모델.
Firecrawl은 단순한 스크래퍼가 아니다. "AI 에이전트가 웹을 도구처럼 쓰게 만드는" 인프라 레이어로 포지셔닝한다. 단일 URL을 깔끔한 마크다운으로 만드는 /scrape부터, 사이트 전체를 도는 /crawl, 검색 결과를 통째로 가져오는 /search, URL을 몰라도 "원하는 정보"만 묘사하면 알아서 찾는 /agent까지 — 한 API로 묶었다.
오픈소스(AGPL-3.0)로 자체 호스팅도 가능하지만, firecrawl.dev 클라우드를 함께 운영해 IP 로테이션·봇 우회·Cloudflare 통과 같은 "어려운 일"을 회사가 떠안는다. 사용자는 API 키 하나만 받으면 된다.
예전에 카카오톡으로 친구한테 "이 링크 내용 좀 요약해줘"라고 부탁한 적이 있다면, 그게 Firecrawl이 하는 일이다. 차이는 받는 쪽이 사람이 아니라 LLM이고, "요약"이 아니라 "불필요한 광고·헤더·푸터·자바스크립트 다 떼고 본문 마크다운만"이다. 사람이 두 번 요청할 일을, Firecrawl은 app.scrape(url) 한 번에 해 준다.
Eric Ciarla, Nicolas Camara, Caleb Peffer 세 공동창업자가 Mendable.ai에서 만든 사내 도구를 2024년 오픈소스로 풀었다. 2026년 5월 기준 v2.10까지 34번 릴리즈했고, GitHub 스타 123k로 같은 카테고리의 Scrapling(52k)·crawl4ai(40k급)을 모두 따돌렸다.
2024~2026년 LLM 앱 개발의 가장 큰 병목은 "학습 데이터 → 모델"이 아니라, "현재 웹 정보 → 컨텍스트 윈도우"다. ChatGPT가 똑똑해도 어제 발표된 가격 정책을 모르면 무용지물이다.
전통적으로 이 문제는 BeautifulSoup + requests로 직접 짜거나, Selenium/Playwright로 브라우저를 띄워서 해결했다. 둘 다 사이트가 디자인을 바꾸면 깨지고, JS 무거운 SPA는 빈 HTML만 받고, Cloudflare가 막으면 끝. Firecrawl은 이 모든 걸 API 한 통으로 추상화한다.
회사 블로그 글 "The world's best web data API"에 따르면, 수백만 페이지 기준 P95 지연시간 3.4초, 웹 커버리지 96%. 이는 단순 HTTP fetch가 아니라 JS 렌더링 포함 수치다.
경쟁 서비스(Apify, ScrapingBee, Bright Data)는 "성공률 90%대" 광고를 하지만 보통 정적 페이지 기준이거나 Cloudflare 같은 봇 차단 페이지를 제외한 수치. Firecrawl은 "마크다운까지 만들어서 반환"하는 풀-파이프라인의 성공률로 발표한다.
2024년 11월 Anthropic이 발표한 MCP(Model Context Protocol)와 Agent Skills 표준을, Firecrawl은 발표 직후부터 공식 지원한다.
# MCP — Claude Desktop, Cursor, Windsurf에 한 줄로 연결
{
"mcpServers": {
"firecrawl-mcp": {
"command": "npx",
"args": ["-y", "firecrawl-mcp"],
"env": { "FIRECRAWL_API_KEY": "fc-..." }
}
}
}
# Agent Skill — Claude Code, Antigravity, OpenCode에 한 줄로 설치
npx -y firecrawl-cli@latest init --all --browser
레포 안에 firecrawl-skills/, firecrawl-cli-skills/, firecrawl-workflows/ 폴더를 따로 두고 운영. 자사 API를 단순 SDK가 아닌 "AI 에이전트의 도구 호출 표준에 정합한 모듈"로 패키징한다.
2026년 들어서 Firecrawl이 새로 추가한 가장 야심찬 기능. 기존에는 /extract로 "이 URL에서 이런 필드 뽑아줘"였다면, /agent는 "이런 정보 찾아줘"만 주면 알아서 검색·탐색·추출한다.
app.agent(prompt="Find the founders of Stripe")
# → 알아서 stripe.com 도달, About 페이지 탐색, 창업자 이름 추출
app.agent(
prompt="Compare enterprise features across Firecrawl, Apify, and ScrapingBee",
model="spark-1-pro"
)
# spark-1-pro = 비싸지만 정확한 모델 / spark-1-mini = 60% 저렴한 기본값
이건 사실상 "인터넷을 알아서 도는 에이전트를 API 1회 호출로 빌리는" 가격 모델이다. 일종의 "에이전트 as a Service".
코어는 AGPL-3.0이라 자기 회사 인프라에 통합해서 비공개 SaaS로 팔려면 라이선스 충돌이 난다. 그래서 "진심으로 셀프호스팅할 사람만 셀프호스팅, 나머지는 firecrawl.dev로 결제"가 자연스럽게 유도된다. 이는 Plausible Analytics, Sentry, Posthog와 동일한 OSS 비즈니스 모델.
이전: 스크래퍼 짜고 → 프록시 사고 → Cloudflare 우회 코드 짜고 → 사이트 디자인 바뀌면 다시 짜고 → 매주 한 번씩 깨짐.
Firecrawl: POST /v2/scrape → 끝. "웹"이 LLM의 도구처럼 호출 가능한 함수가 된다. 1인 SaaS 창업자가 가장 먼저 위임하는 인프라 중 하나로 자리 잡았다.
| 기술 | 버전/세부 | 역할 |
|---|---|---|
Node.js | 22+ | API/워커 런타임. TypeScript 5.9.2로 컴파일 후 node dist/... 실행. |
TypeScript | 5.9.2 | 전체 코드베이스 66.2%. 강한 타입 + AI SDK 통합에 필수. |
pnpm | 10.16.1 | 모노레포 패키지 매니저. apps/api, apps/*-sdk, firecrawl-rs를 workspace로 묶음. |
Express | 4.22.0 | API 라우터. /v1, /v2 두 API 버전 동시 운영. |
@mendable/firecrawl-rs | workspace | Rust로 짠 네이티브 모듈 (전체 5.1%). napi-rs(@napi-rs/cli)로 빌드되고 Node.js N-API로 호출. 마크다운 후처리(postProcessMarkdown) 담당. |
go-html-to-md | sharedLibs | Go로 짠 HTML→마크다운 변환 공유 라이브러리. koffi FFI로 Node에서 호출 (html-to-markdown.ts 참조). |
| 기술 | 역할 |
|---|---|
BullMQ 5.56 | Redis 기반 작업 큐. 일반 scrape 요청 + 워커 관리. @bull-board/express로 어드민 UI도 제공. |
NUQ (자체 큐) | RabbitMQ + PostgreSQL 기반 자체 큐 시스템. nuq-worker, nuq-prefetch-worker, nuq-reconciler-worker 3종. |
ioredis 5.6 | Redis 클라이언트. rate-limit + 분산 락(redlock). |
amqplib 0.10 | RabbitMQ AMQP 클라이언트. |
pg 8.16 | PostgreSQL 클라이언트. apps/nuq-postgres/ 폴더에 자체 빌드한 nuq 전용 DB. |
| 엔진 | 역할 | 비고 |
|---|---|---|
| Fire-engine | 회사 클라우드 전용 엔진(소스 비공개). Cloudflare 우회·IP 로테이션·CAPTCHA 풀이 포함. | 셀프호스팅에서는 사용 불가 (SELF_HOST.md 명시). |
| Playwright | apps/playwright-service-ts/의 별도 컨테이너. Chromium 헤드리스 브라우저로 JS 렌더링. | 오픈소스 셀프호스팅의 기본 엔진. |
| fetch (HTTP) | undici 7.24.1 기반 빠른 정적 fetch. | JS 없는 단순 페이지용. |
| SearXNG | 오픈소스 메타 검색엔진. /search 백엔드로 사용 가능. | 환경변수 SEARXNG_ENDPOINT로 자체 인스턴스 연결. |
Firecrawl이 /extract·/agent·"마크다운에서 JSON 추출" 같은 기능에 LLM을 쓰는데, 사용자가 모델을 자유롭게 고를 수 있도록 Vercel AI SDK v6의 9개 프로바이더를 다 의존성에 포함한다.
| 프로바이더 | 패키지 |
|---|---|
| OpenAI | @ai-sdk/openai 3.0.71 |
| Anthropic Claude | @ai-sdk/anthropic 3.0.84 |
| Google Gemini | @ai-sdk/google 3.0.29 + @ai-sdk/google-vertex 4.0.145 |
| Groq | @ai-sdk/groq 3.0.41 |
| xAI Grok | @ai-sdk/xai 3.0.83 |
| DeepInfra | @ai-sdk/deepinfra 2.0.54 |
| Fireworks | @ai-sdk/fireworks 2.0.56 |
| OpenRouter | @openrouter/ai-sdk-provider 2.9.1 |
| Ollama (로컬) | ollama-ai-provider-v2 3.6.0 |
덕분에 자체 호스팅 시 OLLAMA_BASE_URL=http://localhost:11434/api + MODEL_NAME=deepseek-r1:7b만 박으면 완전 로컬 LLM 추출도 가능.
| 라이브러리 | 역할 |
|---|---|
cheerio 1.0 | jQuery 스타일 HTML 파서. 본문 셀렉터 추출. |
jsdom 29.1.1 | 완전한 DOM 시뮬레이터. JS 평가 필요한 경우. |
turndown 7.1 + joplin-turndown-plugin-gfm | HTML → 마크다운(GFM 호환) 변환. |
marked 14.1 | 마크다운 → 다시 HTML(검증용). |
pdf-parse 1.1 | PDF → 텍스트. LLAMAPARSE_API_KEY 있으면 LlamaParse 우선. |
he 1.2 + escape-html | HTML 엔티티 디코딩/이스케이프. |
| 영역 | 기술 |
|---|---|
| 인증/DB | drizzle-orm + pg 8.16 — Supabase PostgreSQL에 직접 연결 (apps/api/src/db/connection.ts). USE_DB_AUTHENTICATION=false로 끄면 API 키 없이 동작. supabase-js 클라이언트는 사용하지 않음. |
| 스토리지 | @google-cloud/storage 7.19 (스크래프 결과·스크린샷 영구 저장) |
| 분석/로그 | @clickhouse/client 1.8 (이벤트 분석), winston 3.14 (로깅), prom-client 15.1 (Prometheus) |
| 관측 | @sentry/node 10.27 (에러 추적, 소스맵 자동 업로드) |
| 결제 | stripe 16.1 (클라우드 구독), autumn-js 1.2.13 (사용량 기반 과금), resend 3.5 (트랜잭셔널 이메일) |
| 암호화폐 결제 | @x402/core 2.4, @x402/evm, @x402/express — x402 프로토콜로 USDC 마이크로페이먼트 지원 (AI 에이전트가 직접 결제해 API 호출) |
| 토큰 카운팅 | @dqbd/tiktoken 1.0.22 (LLM 컨텍스트 비용 계산) |
| 언어 | 패키지 |
|---|---|
| Python | pip install firecrawl-py |
| Node.js / TypeScript | npm install @mendable/firecrawl-js |
| Java | JitPack com.github.firecrawl:firecrawl-java-sdk:2.0 |
| Elixir | {:firecrawl, "~> 1.0"} |
| Rust | crates.io firecrawl = "2" |
| Go (커뮤니티) | 레포 내 apps/go-sdk/ |
| .NET | 레포 내 apps/dot-net-sdk/ (Firecrawl.sln) |
| PHP | 레포 내 apps/php-sdk/ (composer.json) |
| Ruby | 레포 내 apps/ruby-sdk/ (Gemfile) |
처음 보면 "왜 BullMQ랑 NUQ 둘 다 쓰지?" 싶다. 이유는 작업 성격이 완전히 다르기 때문:
| 분류 | BullMQ (Redis) | NUQ (RabbitMQ + PG) |
|---|---|---|
| 작업 시간 | 수 초 ~ 수 분 | 수 분 ~ 수 시간 |
| 예시 | 단일 페이지 scrape | 10,000페이지 crawl, LLM extract |
| 실패 비용 | 낮음 (그냥 재요청) | 높음 (수십 분 작업 날아감) |
| 상태 추적 | Redis 휘발성으로 충분 | PostgreSQL 영구 저장 필수 |
| 워커 종류 | queue-worker | nuq-worker, nuq-prefetch, nuq-reconciler |
여기에 queue-worker가 같은 컨테이너 안에서 함께 도는 "harness" 패턴이 더해진다. node dist/src/harness.js --start-docker 한 명령으로 API 서버 + 4종 워커가 동시에 뜨도록 했다.
apps/api/src/harness.ts에 있다. Docker에서는 보통 1컨테이너 1프로세스가 정석이지만, 6개 워커 컨테이너를 따로 띄우면 메모리 오버헤드가 큼. 그래서 "하나의 컨테이너 안에서 supervisor처럼 여러 프로세스를 띄우고 헬스체크"하는 방식을 택했다. HARNESS_STARTUP_TIMEOUT_MS=60000로 부팅 타임아웃 조정 가능.브라우저 자동화는 "폭주하면 OOM(out-of-memory)으로 전체 서비스를 죽이는" 가장 위험한 컴포넌트다. Firecrawl은 이걸 별도 컨테이너로 분리해서:
cpus: 2.0, mem_limit: 4G로 자원 상한 박음. OOM되어도 API는 안 죽음./tmp/.cache를 1GB 메모리 디스크로 마운트(tmpfs:size=1g,noexec,nosuid). 디스크 I/O 회피.MAX_CONCURRENT_PAGES=10으로 브라우저 인스턴스가 폭주하지 않게.ALLOW_LOCAL_WEBHOOKS=false가 기본 — 스크래퍼가 내부망(10.x, 192.168.x)을 찌르지 못하게 SSRF 방어.@mendable/firecrawl-rs는 회사가 직접 짠 Rust 모듈을 napi-rs(N-API)로 Node.js에서 호출한다. 별도로 Go로 짠 HTML→마크다운 공유 라이브러리(go-html-to-md)는 koffi FFI로 호출한다. 왜 Rust인가?
SELF_HOST.md에 명시되어 있다: "Fire-engine은 셀프호스팅에서 사용 불가". Fire-engine은 회사가 운영하는 비공개 엔진이고, IP 로테이션·CAPTCHA 풀이·고급 봇 우회 같은 "운영 노하우"가 담겨 있다.
오픈소스 코어는 Playwright만으로 충분히 동작하지만, "진짜 어려운 사이트(Amazon, LinkedIn, X 등)는 fire-engine으로만 통과"되도록 분리. 이게 클라우드 결제 동기 부여.
| 파일 | 왜 중요한가 |
|---|---|
docker-compose.yaml | 전체 인프라가 어떻게 묶이는지 한눈에. 환경 변수 50+ 개의 의미도 여기 있음. |
apps/api/src/harness.ts | 멀티프로세스 supervisor 코드. 6개 워커가 어떻게 한 컨테이너에서 도는지의 진실. |
apps/api/src/scraper/scrapeURL/ | 엔진 선택 분기 로직. fire-engine·playwright·fetch 중 어떤 걸 쓸지 결정하는 부분. |
한 회사가 OSS 코어 + 상용 클라우드를 같이 운영할 때 가장 흔한 함정은 "코드가 두 갈래로 갈라져서 OSS가 시들해지는" 패턴이다. Firecrawl은 그걸 막으려고 fire-engine만 비공개로 두고 나머지는 전부 한 레포에서 관리한다. 셀프호스팅 사용자도 95%는 같은 코드, 5%만 다른 엔진을 쓰는 식.
pnpm workspace + monorepo로 6개 SDK + 메인 API + Rust 모듈을 한 레포에서 관리하는 방식. apps/api/package.json의 pnpm.overrides 블록을 보면 보안 취약점 있는 종속성을 어떻게 강제로 버전 고정하는지 알 수 있다(js-yaml@<3.14.2 같은 항목 30개+). 실제 운영 OSS의 "공급망 보안" 사례 학습 자료.
실습 아이디어: 자기 사이드 프로젝트를 pnpm workspace로 리팩터링 → Python·JS·Rust SDK를 한 레포에 두는 구조 따라하기.
대부분의 튜토리얼은 "BullMQ 하나면 충분"이라고 가르치지만, Firecrawl은 "수초짜리는 BullMQ, 수시간짜리는 RabbitMQ+PG"로 분리했다. 이 분리가 왜 필요한지를 코드로 보여주는 드문 사례. nuq-worker.ts · nuq-reconciler-worker.ts 둘을 비교해 보면 "재시도 책임이 어디에 있는가"의 설계가 보인다.
실습 아이디어: 자기 토이 프로젝트에 "단발 작업은 BullMQ, 장기 작업은 RabbitMQ" 패턴 적용. Redis만 있을 때 vs RabbitMQ 추가했을 때의 P99 차이를 직접 측정.
"브라우저는 무겁고 잘 죽는다"는 사실을 정면으로 인정한 설계. apps/playwright-service-ts/가 별도 컨테이너인 이유, tmpfs:size=1g,noexec,nosuid로 보안+성능을 동시에 잡는 방법, cpus: 2.0 / mem_limit: 4G의 의미. Docker Compose에서 컨테이너별 자원 격리 모범 사례.
실습 아이디어: Playwright 서비스만 따로 떼서 Cloud Run/Fly.io에 배포 → 메인 API는 Vercel에서 운영하는 분산 아키텍처 구성.
ai 6.0.86 + @ai-sdk/* 9개를 동시에 의존성에 넣고, 런타임에 generateText({ model: openai("gpt-4o") }) vs generateText({ model: anthropic("claude-sonnet-4") })로 자유롭게 스위칭. "벤더 락인 없는 AI 앱"의 표준 패턴. schema(Zod)로 구조화 출력을 강제하는 게 핵심.
실습 아이디어: 같은 프롬프트로 OpenAI gpt-4o-mini vs Anthropic claude-3.5-haiku vs Groq llama-3.1-70b를 동시에 호출해 응답 비교 대시보드 만들기. Vercel AI SDK 학습용 최적 예제.
두 가지 네이티브 통합이 공존한다. Rust(@mendable/firecrawl-rs)는 napi-rs(@napi-rs/cli)로 빌드해 Node.js N-API로 호출 — 마크다운 후처리(postProcessMarkdown) 담당. Go 공유 라이브러리(go-html-to-md)는 koffi FFI로 Node에서 호출 — HTML→마크다운 변환 담당. 둘의 역할과 호출 방식이 다르다는 점이 핵심. Node ↔ 다언어 네이티브 통합의 2026년 모범.
실습 아이디어: Go로 짠 간단한 텍스트 처리 함수를 koffi로 Node에서 호출해 보기. Rust 모듈은 napi-rs 튜토리얼로 N-API 통합 체험. 벤치마크: pure JS vs 네이티브 FFI의 P95 비교.
같은 API를 3가지 방식으로 노출한다: ① REST API(외부 호출) ② MCP 서버(Claude Desktop 통합) ③ Agent Skill(Claude Code 슬래시 커맨드). 3개를 한 레포에서 관리하면서 API 변경 시 일관성 유지하는 게 어려운데, firecrawl-cli-skills/, firecrawl-skills/ 폴더로 깨끗하게 분리.
실습 아이디어: 자기가 운영하는 API에 MCP 서버 래퍼 추가 → Claude Desktop에 등록 → "내가 만든 도구를 LLM이 도구로 쓰는" 경험 체험.
@x402/express 미들웨어를 보면, HTTP 402 응답에 Coinbase USDC 결제 정보를 담아 반환 → 클라이언트(AI 에이전트)가 결제 후 같은 요청 재시도. "신용카드 등록 없이 에이전트가 알아서 결제"되는 미래의 표준이 될 가능성이 있는 프로토콜. Firecrawl이 이걸 일찍 실험하는 회사 중 하나.
실습 아이디어: 자기 API에 x402 미들웨어를 붙여서 1요청 = 1센트 USDC로 결제되게 → 자기 에이전트로 호출해 보기.
| 리소스 | 요구사항 | 비고 |
|---|---|---|
| CPU | 4 vCPU | api(4.0) + playwright(2.0) 합계 6.0인데, 4 vCPU에서도 동시성 낮추면 동작 |
| RAM | 최소 12GB | api 8G + playwright 4G + redis/rabbitmq/postgres 합쳐 ~1G |
| 디스크 | 20GB | Chromium 이미지(~1.5GB) + Docker layer + 로그 |
| OS | Docker 24+ 지원 | Linux 권장. macOS도 동작하지만 Chromium 메모리 효율 떨어짐 |
| 네트워크 | 아웃바운드 80/443 | 스크래핑 대상 + Redis/PG 통신 |
| 리소스 | 권장 | 이유 |
|---|---|---|
| CPU | 8+ vCPU | NUM_WORKERS_PER_QUEUE=8이 기본값, 동시 페이지 10개 + Rust FFI 부하 |
| RAM | 24GB+ | Chromium 인스턴스가 페이지당 ~200MB. 동시 10페이지면 2GB만 페이지에 씀 |
| 디스크 | SSD 100GB+ | 스크린샷 + GCS 업로드 전 임시 저장 (또는 GCS 직결) |
| 외부 의존성 | OpenAI/Anthropic 키 | /extract, /agent 쓰려면 필요. 또는 Ollama 로컬 |
| (선택) 프록시 | 주거용 IP 풀 | Cloudflare 막힐 때. 셀프호스팅은 fire-engine 못 쓰니까 직접 구해야 함 |
SELF_HOST.md에 분명히 적혀 있다: "self-hosted instances of Firecrawl do not have access to Fire-engine". 결과적으로 Amazon, LinkedIn, X, Instagram 같은 강한 봇 차단 사이트는 셀프호스팅 인스턴스로는 못 긁는다. 본격적인 운영용은 클라우드 결제가 거의 강제된다. "오픈소스니까 공짜로 다 된다"는 환상은 금물.
# 1. .env 생성 (SELF_HOST.md 템플릿 복사)
PORT=3002
HOST=0.0.0.0
USE_DB_AUTHENTICATION=false
BULL_AUTH_KEY=<강한_랜덤_문자열>
POSTGRES_USER=firecrawl
POSTGRES_PASSWORD=<강한_비번>
POSTGRES_DB=firecrawl
OPENAI_API_KEY=sk-... # 또는 OLLAMA_BASE_URL=http://localhost:11434/api
# 2. 빌드 + 실행
docker compose build
docker compose up
# 3. 검증
curl -X POST http://localhost:3002/v1/scrape \
-H 'Content-Type: application/json' \
-d '{"url": "https://example.com"}'
# 4. 큐 어드민 UI
# http://localhost:3002/admin/<BULL_AUTH_KEY>/queues
firecrawl.dev에 가입 → 무료 크레딧 받기 → Python SDK로 자기 블로그 마크다운 변환.
pip install firecrawl-py
python -c "
from firecrawl import Firecrawl
app = Firecrawl(api_key='fc-YOUR_KEY')
print(app.scrape('https://news.ycombinator.com').markdown[:500])
"
학습 포인트: scrape 응답에 metadata·screenshot·markdown·html·json이 모두 들어있다는 걸 직접 확인.
Claude Desktop 설정에 firecrawl-mcp 추가 → Claude한테 "오늘 TechCrunch에서 AI 관련 기사 5개 가져와서 한 줄 요약해줘" 부탁.
// ~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"firecrawl": {
"command": "npx",
"args": ["-y", "firecrawl-mcp"],
"env": { "FIRECRAWL_API_KEY": "fc-..." }
}
}
}
학습 포인트: AI 에이전트가 도구를 호출하는 흐름을 직관적으로 체험. "프롬프트 → MCP → REST API → 결과 → LLM 응답"의 사이클.
git clone → .env에 OLLAMA_BASE_URL=http://host.docker.internal:11434/api + MODEL_NAME=qwen2.5:7b 박기 → docker compose up.
로컬 Ollama에 qwen2.5:7b 설치한 상태에서 /extract 엔드포인트로 "이 페이지의 가격 정보 JSON으로 뽑아줘" 요청.
학습 포인트: 로컬 LLM도 Firecrawl 추출 작업을 처리할 수 있음을 확인. 클라우드 API 키 0개로 동작.
/crawl로 자기 블로그 전체 크롤 → 마크다운 청크 → OpenAI 임베딩 → Pinecone/Qdrant 저장 → 챗봇 UI.
examples/rag-with-firecrawl/ 폴더에 비슷한 템플릿이 있으니 거기서 출발.
학습 포인트: "RAG의 데이터 인제스트 단계"가 얼마나 번거로운지 vs Firecrawl이 그걸 얼마나 압축하는지 체감. scrape 대신 crawl을 처음 써 보는 경험.
/agent 엔드포인트의 동작을 자기 손으로 재현. 구성요소: ① 검색 도구(Bing API 또는 SearXNG) ② 페이지 평가 LLM(어느 페이지가 답을 갖고 있을지) ③ Firecrawl /scrape로 후보 페이지 가져오기 ④ 최종 LLM으로 답 합성.
학습 포인트: 단순 RAG와 "Agentic RAG"의 차이를 코드로 이해. Plan-Execute-Observe 루프, Cost-budget enforcement, 멀티 단계 검색 같은 에이전트의 모든 본질이 여기 있음.
| 주차 | 주제 | 핵심 자료/실습 |
|---|---|---|
| 1주 | 웹 스크래핑 기초 | cheerio·BeautifulSoup·lxml로 정적 사이트 직접 긁기. 왜 Firecrawl이 필요한지 절감. |
| 2주 | Playwright 마스터 | Chromium 자동화. 대기 전략(waitForSelector vs waitForLoadState), 모바일 에뮬레이션, 프록시. |
| 3주 | 큐 시스템 — BullMQ | Redis 기반 작업 큐 직접 짜기. 재시도·우선순위·rate-limit·분산 락. |
| 4주 | RabbitMQ + Postgres | 왜 Redis만으로 부족한지를 직접 체험. 메시지 영속성·DLQ·트랜잭션 큐. |
| 5주 | LLM 추출 — Vercel AI SDK | 9개 프로바이더 어댑터 체험. Structured Output(Zod 스키마) 강제. 토큰 비용 측정. |
| 6주 | MCP 서버 직접 짜기 | Anthropic의 MCP SDK로 자기 도구를 LLM에 노출. firecrawl-mcp-server 소스 참고. |
| 7주 | Rust FFI | 핫패스를 Rust로 떼어내기. koffi로 Node에서 호출. 벤치마크 P95 비교. |
| 8주 | Agent 시스템 설계 | Plan-Execute-Observe 루프, 비용 예산, 멀티스텝 검색. /agent 엔드포인트 재현. |
같은 카테고리 — D4Vinci/Scrapling(파이썬, 적응형), microsoft/markitdown(파일→마크다운), browser-use/browser-use(LLM이 브라우저 직접 조작). 4개를 함께 보면 "AI 시대 웹 데이터 파이프라인"의 전체 그림이 보임.
node dist/src/harness.js --start-docker로 실행.nuq-worker, nuq-prefetch-worker, nuq-reconciler-worker 3종.apps/api/src/__tests__/snips/v1/, v2/에 있다. CLAUDE.md에서 "snips는 항상 unit test보다 선호한다"고 명시./agent 엔드포인트의 모델 옵션. spark-1-mini(기본·60% 저렴)와 spark-1-pro(복잡한 멀티스텝 작업용). 내부적으로 어떤 LLM을 쓰는지는 비공개.firecrawl-mcp 패키지로 npm 한 줄 등록 가능.firecrawl-cli init --all --browser로 한 번에 설치.