クラウドAPIなしでローカルLLMエージェントにWebアクセスを持たせたい——そう考えたとき、選択肢の多くは外部サービスへのデータ送信を伴います。SearXNG・Firecrawl・Camofoxを組み合わせると、APIキー不要・外部依存ゼロで「検索→抽出→ブラウザ操作」を自分のサーバーだけで完結させられます。
この記事でわかること:
- SearXNG・Firecrawl・Camofoxがそれぞれ担う役割
- Search → Extract → Interact のデータフロー
- 各ツールのセットアップ手順と接続方法
- ローカルエージェント(OpenClaw・Hermes Agentなど)との連携
- 運用時に気をつける注意点
ローカルLLMがWebを使えない問題
LLMをローカルで動かす理由はプライバシー保護・コスト削減・オフライン動作など様々です。ところがエージェントにWebを使わせようとすると、多くのケースで外部APIが必要になります。
Tavily・BrightData・Browserbaseといったクラウドサービスはすべてデータが外部に出ます。医療・金融・法務など情報の外部送信に制約がある現場では使えません。また、「APIクレジットを消費したくない」「障害時に外部依存で止まりたくない」という場合も同様です。
SearXNG・Firecrawl・Camofoxはいずれもオープンソースでセルフホストでき、この問題を解決します。
3つのツールが担う役割
この構成を一言で表すと「Search → Extract → Interact」です。
- SearXNG:どのURLが候補になるかを発見する
- Firecrawl:そのURLの本文をクリーンなMarkdownとして取り出す
- Camofox:JavaScriptが必要なページやBot検出を突破するブラウザのフォールバック
3つを直列に並べることで、エージェントが必要な情報へ辿り着くまでの全工程をローカルで完結させます。
SearXNG — 候補ソースの発見
https://github.com/searxng/searxng
SearXNGはセルフホスト型のメタ検索エンジンです。Google・Bing・DuckDuckGoなど複数の検索エンジンに同時クエリを投げ、結果を集約して返します。APIキー不要・月間クォータなし・検索履歴の外部送信なし、という特性が、プライベートな環境に向いています。
複数エンジンで上位に現れたURLは信頼度が高いと判断でき、エージェントが優先して参照するリストを効率よく作れます。DockerComposeで数分起動でき、エージェントからはJSON APIを通じてクエリを送るだけです。
Firecrawl — URLをMarkdownに変換
https://github.com/mendableai/firecrawl
FirecrawlはURLを受け取り、内部でPlaywrightを使ってJavaScriptをレンダリングしてから、クリーンなMarkdownを返すスクレイピングサービスです。クッキーバナーや広告のHTMLを除去し、LLMが読みやすい形式に変換します。
セルフホスト時にSearXNGと接続する構成はGitHub上でフォークが公開されています(firecrawl-searxng)。これにより、Firecrawlの /v1/search エンドポイントがSearXNGにクエリを投げながら、URLのスクレイピングも同じサービスで処理できます。
OllamaをはじめとするOpenAI互換APIとの連携もサポートされており、環境変数 OLLAMA_BASE_URL を設定するだけでローカルLLMに処理を渡せます。
Camofox — Bot検出を回避するブラウザ
https://github.com/jo-inc/camofox-browser
CamofoxはCamoufox(FirefoxフォークでC++レベルのフィンガープリント偽装を実装)をラップしたNode.js製のローカルサーバーです。通常のPlaywrightやPuppeteerはJavaScriptラッパーがBot検出に引っかかりますが、Camofoxはブラウザエンジン自体でフィンガープリントを偽装するため、CloudflareやGoogleの検知をくぐり抜けられます。
ページをアクセシビリティツリーで表現するため、LLMエージェントが扱いやすいテキストベースのスナップショットを返します。インタラクティブな要素には @e1・@e2 のような参照IDが付与され、エージェントがクリックやテキスト入力を直接指定できます。
デフォルトポートは9377で、インストールは以下のコマンドのみです。
git clone https://github.com/jo-inc/camofox-browser
npm install && npm start
初回起動時にCamoufoxのバイナリ(約300MB)をダウンロードします。起動後はインターネット接続なしで動作します。OpenClawのプラグインとしても動作し、CAMOFOX_URL=http://localhost:9377 を設定するだけでエージェントのブラウザバックエンドが切り替わります。
セットアップの流れ
3つのツールをローカルネットワーク上で起動し、エージェントから順番に呼び出します。
1. SearXNGを起動する
DockerComposeを使って起動し、http://localhost:8080 でアクセスできる状態にします。設定ファイルでJSON出力を有効にしておくと、エージェントからのAPIリクエストに対応できます。
2. Firecrawlをセルフホストする
firecrawl-searxng フォークをクローンし、.env に以下を設定します。
SEARXNG_URL=http://localhost:8080
OLLAMA_BASE_URL=http://localhost:11434 # ローカルLLMを使う場合
3. Camofoxを起動する
npm start
# → http://localhost:9377 で待ち受け
4. エージェントと接続する
OpenClawやHermes Agentのプロバイダ設定でFirecrawlをWeb検索エンドポイントとして指定し、ブラウザ自動化バックエンドを CAMOFOX_URL=http://localhost:9377 に向けます。これで「検索 → スクレイピング → ブラウザ操作」の全工程がローカルで動くようになります。
注意点
SearXNGは複数の検索エンジンに同時クエリを投げる性質上、短時間に大量リクエストを送ると各エンジンのレート制限に引っかかることがあります。エージェントがクエリを連続投入する場合は間隔を設けるか、複数のSearXNGインスタンスを立てるのが現実的です。
FirecrawlのセルフホストにはDockerとある程度のメモリが必要です。PlaywrightのChromiumも内包するため、最低4GBのRAMを確保してください。
Camofoxは初回のバイナリダウンロード後はオフラインで動作しますが、SearXNGとFirecrawlは当然ながら対象サイトへの接続が必要です。「外部データ送信なし」とはあくまで「APIプロバイダへの送信なし」を指します。
まとめ
SearXNG・Firecrawl・Camofoxの3ツールを組み合わせると、APIキーもクレジットカードも不要でローカルLLMエージェントがWebを扱えるようになります。SearXNGで候補URLを見つけ、FirecrawlでMarkdownに変換し、Camofoxで動的ページやBot対策をかいくぐる。この三段構えで、クラウド依存なしのプライベートなWeb対応エージェント環境を構築できます。