qsearch について
qsearchは、AIエージェント向けのオープンソース検索レイヤーです。ページ全文を取得し、検索エンジンごとの出典情報とURL単位の信頼情報を蓄積します。セルフホストとローカルコーパスに対応し、出典を追跡する調査ワークフローに適しています。
主な機能
- 01ウェブ検索と全文抽出
- 02検索エンジンごとの出典表示
- 03URL単位でローカルコーパスを蓄積
- 04信頼情報による再ランキング
- 05学術論文の検索
- 06引用が主張を裏付けるか検証
活用シーン
- 01テーマ別の一括調査検索
- 02複数エンジンの一致に基づくページ選別
- 03arXiv・PubMed・Semantic Scholarの論文検索
- 04引用元が主張を裏付けるか確認
MCP 対応
リポジトリにはStreamable HTTPで動作するMCPサーバーが含まれ、ウェブ検索、一括検索、学術検索、引用検証、インデックス作成などのツールを提供します。対応するMCPクライアントからローカルサービスに接続できます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://qsearch.pro/mcpclaude mcp add --transport http theyahia-qsearch https://qsearch.pro/mcp{"mcpServers":{"theyahia-qsearch":{"type":"http","url":"https://qsearch.pro/mcp"}}}Cursor で開く{"servers":{"theyahia-qsearch":{"type":"http","url":"https://qsearch.pro/mcp"}}}VS Code で開く{"mcpServers":{"theyahia-qsearch":{"type":"http","url":"https://qsearch.pro/mcp"}}}{"mcpServers":{"theyahia-qsearch":{"serverUrl":"https://qsearch.pro/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
qsearch
これは、私自身が日々のリサーチに使うために作りました。100 回以上のリサーチスプリントを実行したところ、エージェントは 200 文字のスニペットを読んでいたため、何度もハルシネーションを起こしていました。qsearch は、複数の検索エンジンの出典情報とともに完全なコンテンツを提供します。ローカルで動作し、所有権は私にあります。
AI エージェントは、ページ全体ではなく 200 文字のスニペットを読むため、事実の17~33%をハルシネーションによって失います(Stanford 2024)。既存の検索 API では、ある結果にどの検索エンジンが同意したかが分かりません。既存のナレッジグラフは、企業向けの価格設定か、ベンダーロックインが必要です。
qsearch は、複数の検索エンジンの出典情報とともに完全なコンテンツをエージェントに提供するオープンソースの検索レイヤーです。お使いのマシン上で動作し、所有権はお客様にあり、すぐに MCP で利用できます。
✅ v0.4.0 は qsearch.pro で公開中です。 複数の検索エンジンの帰属情報、URL ごとの出典情報を含む信頼コーパス(
engines[]、sweep_count、trust_score)、/uiのコーパスビューアー、Claude Code および仕様準拠のあらゆるクライアント向け MCP-over-HTTP に対応しています。 📖 アーキテクチャ: ARCHITECTURE.md · ビジョン: docs/VISION.md · 技術仕様: docs/TRUST_MESH.md · フェデレーションの詳細: docs/FEDERATION_ARCHITECTURE.md
デモ

60 秒の紹介:
/health(稼働中、ローカル)→/sweep(複数検索エンジンのengines[]帰属情報)→/verify(引用された情報源は実際に主張を裏付けているか?)。npm startの実行後、bash scripts/record-demo.shでローカルに再現できます。docs/launch/README-demo-embed.md を参照してください。
クイックスタート
無料枠、API キー不要で 5 分で実行できます:
git clone https://github.com/theYahia/qsearch.git && cd qsearch
cp .env.example .env.local # works as-is on the $0 SearXNG tier
docker compose up -d # Meilisearch + Qdrant + SearXNG
npm install && npm start # → qsearch on http://localhost:8080
# multi-engine attribution in one call
curl -X POST http://localhost:8080/sweep \
-H "Content-Type: text/plain" \
--data-binary $'t1|self-hosted search engine\n'
# → parsed_snippets.md with "Engines: google, duckduckgo, brave (count=3)"
broad スイープティアはセルフホストの SearXNG 上で動作し、費用はかかりません。focused/critical ティアを利用したい場合にのみ、Brave キーを追加してください。完全なセットアップ(Brave キー、Ollama、MCP サーバー)については以下をご覧ください。
完全なセットアップ — Brave BYOK + ローカル LLM + MCP サーバー
# 1. Clone
git clone https://github.com/theYahia/qsearch.git
cd qsearch
# 2. Get a Brave Search API key (BYOK, $5/mo for ~1000 queries)
# → https://brave.com/search/api/ → sign up → copy key
# 3. Configure
cp .env.example .env.local
# Set BRAVE_API_KEY=your_key
# Set SEARXNG_URL=http://localhost:8888 (for multi-engine attribution)
# 4. Start infrastructure (Meilisearch + Qdrant + SearXNG)
docker compose up -d
# 5. (Optional) Pull Ollama models for local LLM cleaning + embedding rerank
# Without them, search still works — just no cleaned_markdown and no rerank.
ollama pull qwen2.5:7b-instruct # ~5GB, cleaner (used by /sweep_context)
ollama pull nomic-embed-text # 274MB, embedding rerank (Phase B)
# 6. Install & run
npm install
npm start # → qsearch v0.4.0 on http://localhost:8080
# 7. (Optional) MCP server for Claude Code / Workbench / OpenClaw
npm run start:mcp # → http://0.0.0.0:8081
# 8. Test multi-engine attribution
curl -X POST http://localhost:8080/sweep \
-H "Content-Type: text/plain" \
--data-binary $'t1|self-hosted search engine\n'
# → parsed_snippets.md with "Engines: google, duckduckgo, brave (count=3)"
BYOK の設計: Brave キー、SearXNG、Ollama はすべてお使いのマシン上にとどまります。データが外部に流出することはありません。
日々の使い方
リサーチスプリントのたびに、デュアルスイープを実行します。
# Brave sweep (primary, authoritative)
python research/scripts/brave_sweep.py queries.txt _raw_data/topic_2026-04-28/brave/
# qsearch sweep (secondary, auto-indexes into corpus)
curl -X POST http://localhost:8080/sweep?topic=my_topic \
-H "Content-Type: text/plain" --data-binary @queries.txt
同じドメインで 10 回以上のスプリントを行うと、/corpus/top?min_engines=3 に、複数のセッションにわたって複数の独立した検索エンジンを通過した URL が表示されます。これらが、私が実際に信頼している URL です。
qsearch が存在する理由
現在、どの AI エージェントも同じ壊れたループに陥っています。
Agent → Tavily/Exa/Serper API → 200-char snippets → hallucinated answer
3 つの問題があります。
-
スニペットだけでは不十分です。 Stanford による 2024 年の本番 RAG 監査では、「ハルシネーションなし」とうたわれているにもかかわらず、Lexis+ AI と Westlaw で 17~33%のハルシネーションが測定されました。Wikipedia の QA では、全文コンテンツはスニペット RAG を 7.3 ポイント上回ります(arxiv 2501.01880)。
-
信頼性を示すシグナルがありません。 検索 API は、どのエンジンが一致したかを示さずにランキング結果を返します。3 位の SEO スパムは、4 位の信頼できる情報源と同じように見えます。
-
記憶がありません。 検索は毎回ゼロから始まります。同じ質の低い情報がまた表示され、同じ権威ある情報源が認識されないままです。
qsearch はこの 3 つすべてに対応します。
- スニペットだけでなく、コンテンツ全体を取得してクリーニングします。
- 結果ごとの
engines[]フィールド — Google、DDG、Brave、Qwant、Startpage の帰属情報を公開します(SearXNG による集約経由)。 - ローカルコーパスが蓄積され、検索を重ねるごとにすべての URL の信頼プロファイルが成長します。
仕組み
flowchart LR
A[Your agent] -->|query| Q[qsearch]
Q -->|fan out| B[Brave Search API]
Q -->|fan out| S["SearXNG\n(Google, DDG, Brave, Qwant, …)"]
B -->|results| Q
S -->|results + engines[]| Q
Q -->|index by URL| C["Local corpus\n(Meilisearch + Qdrant)"]
C -->|trust score| Q
Q -->|re-ranked + full content + provenance| A
style C fill:#fde68a,stroke:#d97706,color:#000
style Q fill:#93c5fd,stroke:#2563eb,color:#000
style S fill:#86efac,stroke:#16a34a,color:#000
黄色のノードはプライベートコーパスです。5 つのエンジン、3 回の検索、4 つのトピックで見つかった URL には、自然に信頼スコアが付与されます。人間によるランキングも、中央集権的な権威も、クラウドへの往復通信もありません。
qsearch の比較
| Tavily | Exa | Serper | Brave API | SearXNG | qsearch | |
|---|---|---|---|---|---|---|
| コアがオープンソース | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ |
| 全文コンテンツ(スニペットではない) | 一部対応 | 一部対応 | ❌ | ❌ | ❌ | ✅ |
| 複数エンジンの帰属情報 | ❌ | ❌ | ❌ | ❌ | 一部対応 | ✅(engines[]) |
| 永続的なローカルコーパス | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| URL ごとの信頼スコア | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| セルフホスト可能 | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ |
| MCP ネイティブ | 一部対応 | ✅ | ❌ | ✅ | ❌ | ✅ |
| 上流で BYOK | ❌ | ❌ | ❌ | 該当なし | ✅ | ✅ |
API — v0.4.0
検索エンドポイント
| エンドポイント | 説明 | バックエンド |
|---|---|---|
POST /search | ウェブ検索とコーパス検索を実行し、信頼度で重み付けして再ランク付けします | Brave または SearXNG |
POST /sweep | 優先度とドメインに基づいてルーティングする一括検索(下記参照) | SearXNG / Brave / Academic |
POST /cached_sweep | /sweep と同じですが、SQLite メモリーキャッシュ層を使用します | SearXNG / Brave / Academic |
POST /academic_search | arxiv + PubMed + Semantic Scholar を通じた査読済み論文の検索 | Academic(無料、認証不要) |
POST /sweep_context | ローカル LLM によるページ抽出(Brave LLM Context に相当) | Ollama qwen2.5 |
POST /news | ニュース検索 | Brave(キーが必要) |
POST /context | 詳細なページ抽出 | Brave(キーが必要) |
POST /verify | 引用の正確性を確認します。引用された URL が主張を実際に裏付けているかを検証します。Supported/Partial/Unsupported/Fabricated/Error と、原文の抜粋を返します | LLM による判定(ローカル Ollama qwen2.5 または DeepSeek) |
POST /index | URL をクロールするか、ローカルの .md glob をインデックス化します | Crawl4AI |
GET /trust/:url | コーパス内の任意の URL の信頼スコアと出典情報 | — |
GET /corpus/top | 信頼度順に並べた上位 URL(?limit=20&min_engines=3) | — |
GET /corpus/stats | コーパスのサイズと件数 | — |
GET /economy_report | バックエンド別のスプリントコストの内訳と、すべてを Brave にした場合との比較による節約額 | — |
GET /ui | コーパスブラウザー。検索、信頼スコア、出典情報のモーダルを利用できます | — |
GET /health | サービスの状態 | — |
/search が受け付けるパラメーター:query、n_results(1~20)、freshness(pd/pw/pm/py)、search_lang、country、corpus_first(デフォルトは true)、corpus_only(デフォルトは false)。
/sweep は、1 行につき 1 件のクエリを含む、次の形式の text/plain リクエスト本文を受け付けます:label|query[|priority][|domain]
- priority ∈
broad(デフォルト、SearXNG、$0)/focused(Brave、約 $0.005)/critical(Brave + LLM Context、約 $0.01) - domain ∈
general(デフォルト)/scholarly(arxiv+PubMed+S2、$0)/ru(language=ru-RUによるバイアスを適用した SearXNG、$0)
# Examples
bench_a|qdrant production latency benchmarks|focused
sch_a|crispr cas9 off target effects|broad|scholarly
ru_a|tadviser сро рейтинг 2025|broad|ru
crit_a|self-hosted vector DB choice 2026|critical
gen|simple search|broad # 2-field still works — defaults broad/general
結果は、フィルター可能な engines[] と engine_count を付けて Meilisearch に自動でインデックス化されます。
/academic_search は JSON を受け付けます:{ query, n_results (1-20), sources?: ["arxiv","pubmed","semanticscholar"] }。3 つのソースに並列で検索を実行し、DOI/タイトルで重複を除去して、上位 N 件を交互に並べて返します。
複数エンジンによる帰属の例
curl -X POST http://localhost:8080/sweep \
-H "Content-Type: text/plain" \
--data-binary $'t1|self-hosted search engine 2026\n'
出力の抜粋(parsed_snippets.md):
**1. GitHub - searxng/searxng**
- URL: https://github.com/searxng/searxng
- Engines: google, duckduckgo, brave, qwant (count=4)
> A privacy-respecting, hackable metasearch engine...
**2. random-blog.io/seo-spam-2026**
- URL: https://random-blog.io/seo-spam-2026
- Engines: google (count=1)
> Best self-hosted search engines you must try...
URL #1 の engine_count=4 は、4 つの独立したエンジンで見つかったことを示します。URL #2 の engine_count=1 は、1 つのエンジンでしか見つからなかったことを示します。信頼度のシグナルは後付けではなく、データに組み込まれています。
Meilisearch で信頼度によるフィルター処理
curl -H "Authorization: Bearer masterKey" \
"http://localhost:7700/indexes/qsearch_corpus/documents?filter=engine_count%20%3E%3D%203"
3 つ以上のエンジンで見つかった URL のみを返します。信頼度の高いサブセットを取得できます。
MCP 統合
MCP サーバーはこのリポジトリに含まれており、npm パッケージはありません。ソースから実行してください:
git clone https://github.com/theYahia/qsearch.git && cd qsearch
npm install
npm start # REST API on :8080 — must be running first
npm run start:mcp # MCP server (Streamable HTTP) on :8081
Claude Code
~/.claude/settings.json に追加します:
{
"mcpServers": {
"qsearch": {
"type": "http",
"url": "http://localhost:8081"
}
}
}
利用可能なツール:
mcp__qsearch__web_search— Brave または SearXNG によるウェブ検索mcp__qsearch__sweep— 複数エンジンによる帰属情報付きの一括調査mcp__qsearch__academic_search— arxiv + PubMed + Semantic Scholar を通じた査読済み論文の検索mcp__qsearch__sweep_context— フェーズ 3 のローカル LLM によるページ抽出(無料、Ollama)mcp__qsearch__verify_citation— 引用された URL が主張を実際に裏付けているかを検証します(Supported/Partial/Unsupported/Fabricated)mcp__qsearch__economy_report— すべてを Brave にした場合の基準とのコスト内訳の比較mcp__qsearch__index_research— glob を使用してローカルの.mdファイルをインデックス化mcp__qsearch__news_search— ニュース検索(Brave キーが必要)mcp__qsearch__context_search— 詳細なページコンテンツ(Brave キーが必要)
その他の MCP over HTTP クライアント
qsearch は、ポート :8081 の / で Streamable HTTP トランスポートを公開します。Claude Desktop(HTTP モード)、OpenClaw、および仕様に準拠するすべての MCP クライアントと互換性があります。
スタック
| コンポーネント | 技術 |
|---|---|
| ランタイム | Node.js ≥20 |
| ウェブ検索 | Brave Search API(BYOK) |
| メタ検索 | SearXNG(セルフホスト、任意) |
| 学術検索 | arxiv + PubMed E-utilities + Semantic Scholar API(無料、認証不要) |
| 全文コーパス | Meilisearch v1.7 |
| ベクトルコーパス | Qdrant v1.17.1 |
| クローラー | Crawl4AI 0.8.6(Python サブプロセス) |
| 埋め込みモデル(任意) | Ollama nomic-embed-text(デフォルト)または llama.cpp /v1/embeddings |
| LLM クリーナー(任意) | Ollama qwen2.5:7b-instruct(デフォルト。OLLAMA_CLEAN_MODEL で設定可能) |
| MCP | @modelcontextprotocol/sdk |
| ライセンス | Apache-2.0 |
ロードマップ
| バージョン | 機能 | 状況 |
|---|---|---|
| v0.3.1 | 複数エンジンの engines[] 帰属 + デュアルスイープ + コーパス + MCP | リリース済み |
| v0.4.0 | 信頼レイヤー:/trust/:url、/corpus/top、/ui ビューアー、信頼度重み付けによる再ランキング、並べ替え/ページネーション、コーパスの upsert 時マージ、スニペットのサニタイズ | リリース済み |
| v0.4.1 | フェーズ A — 学術検索バックエンド(arxiv + PubMed + S2)、4 フィールドクエリ(label|q|priority|domain)、/academic_search JSON + MCP ツール | リリース済み |
| v0.4.2 | フェーズ B — 埋め込みによる再ランキング(Ollama nomic-embed-text、QSEARCH_RERANK_ENABLED で制御);フェーズ C — SearXNG language=ru-RU によるロシア語対応 | リリース済み |
| v0.4.3 | QVAC SDK を削除し、すべてのローカル LLM を Ollama に移行(qwen2.5:7b-instruct + nomic-embed-text) | リリース済み |
| v0.5 | ローンチ:awesome リストへの PR、MCP Registry への公開、Show HN、ニュースレターでの配信 | 進行中 |
| v0.6 | フェーズ B ステージ 2 — 重要なクエリ向けの LLM スコアリング再ランキング、Yandex 直接バックエンド、レイヤー 8 品質ゲート(拒否しきい値) | 次 |
| v0.7+ | 任意のフェデレーション(研究方針 — v0.5 の検証が完了するまでは時期未定) | 未着手 |
全体像と、過剰な約束をせずに提供できるようになるまでフェデレーションを研究方針にとどめる理由については、docs/VISION.md をご覧ください。
正直なトレードオフ
- コールドスタート。 最初のスイープには 5~10 秒かかります(エンジンへのファンアウト + コーパスのインデックス作成)。長時間稼働するデーモンとして実行するのが最適です。
- ベクトル検索は Windows では利用できません。 Qdrant はベアランタイムを必要とするため、すべてのプラットフォームに対応しているわけではありません。全文検索の Meilisearch はどこでも動作します。
- SearXNG のレート制限。 セルフホストが必要です。パブリックインスタンスは Google にブロックされます。この問題には docker-compose で対応しています。
engines[]には SearXNG が必要です。 Brave のみのモードでも動作しますが、複数エンジンのシグナルは失われます。- 全文コンテンツにはレイテンシのコストがあります。 素朴なスニペット取得の約 3 秒に対し、約 31 秒かかります(双方向 RAG の研究)。qsearch では
/contextエンドポイントからオプトインで利用できます。
フォローする
- 🌐 ライブデモ: qsearch.pro
- ⭐ スター: github.com/theYahia/qsearch
- 🐦 X: @TheTieTieTies
ライセンス
Apache-2.0 — LICENSE をご覧ください。独立運営。BYOK。セルフホスト可能。ベンダーロックインなし。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。