## Recommendation: **Firecrawl** (`/scrape` endpoint) ### Repository context This is **Quoroom**, a TypeScript autonomous-agent framework. It already has a `webFetch(url)` in `src/shared/web-tools.ts:125` that tries **Jina Reader** (`r.jina.ai`, free, no key) and falls back to a Playwright browser. It's exposed to agents as the `quoroom_web_fetch` tool (`src/shared/queen-tools.ts:212`). So the integration point is well-defined: swap/upgrade the primary provider inside `webFetch`, keep Playwright as the last-resort fallback. HTTP is done with native `fetch()`; keys resolve through `model-provider.ts` → DB-encrypted credentials → env var. ### Why Firecrawl wins on *accuracy + citations* (your stated priorities) - **Deterministic extraction = low hallucination risk.** `/scrape` returns the *actual* page rendered to clean markdown. No LLM rewrites the content in the default path, so facts aren't paraphrased or invented. (LLM-based JSON/summary modes exist but are strictly opt-in — you keep the extraction path deterministic.) - **Provenance metadata for verifiable citations.** Every response carries `sourceURL`, `title`, `description`, status code, language, and Open Graph fields — enough to build audit trails and real citations. - **Source quality / coverage.** Managed proxies, JS rendering, PDFs, and js-blocked content handled server-side; scored highest on independent *deep conte