クラウド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対応エージェント環境を構築できます。