qsearch

io.github.theYahia由 GitHub 帳號 theYahia 發布v0.4.0更新於 Oct 24, 2026

Multi-engine search for AI agents. Trust scoring, local corpus, MCP-native. Self-hostable, BYOK.

已驗證Streamable HTTP可網頁執行網頁搜尋與抓取知識與記憶資料與分析

概覽

AI 產生的概覽

qsearch 是可自架的多引擎搜尋層,讓助理取得完整網頁內容、每個網址的引擎來源與信任評分,並維護本機語料庫。

可以做什麼
透過 Brave 或 SearXNG 搜尋網頁,支援語料優先、依信任加權的重排,以及選用的新聞搜尋與深度頁面擷取(後兩者需 Brave 金鑰)。執行批次研究掃描,附帶多引擎來源、優先級層級,以及一般、學術或俄語路由。在 arxiv、PubMed 與 Semantic Scholar 中檢索同儕審查文獻。用本機大型語言模型擷取頁面內容,並查核引用的網址是否真的支持某項主張,回傳 Supported、Partial、Unsupported 或 Fabricated。將本機 markdown 檔案或抓取的網址索引進持久語料庫,並讀取信任評分、高信任網址、語料統計與成本報告。
適用情境
適合需要助理做研究、希望取得完整頁面內容與多引擎一致性訊號而非短摘要,且願意自行執行整套服務的情境。也適用於引用查核與累積私有研究語料庫。
執行需求
MCP 伺服器未發布為套件,需從原始碼執行,以 Streamable HTTP 在 8081 埠提供,且 8080 埠的 REST API 必須先啟動。需要 Node.js 20 以上版本、用於 Meilisearch、Qdrant 與 SearXNG 的 Docker,以及選用的 Ollama 模型用於清洗與向量化。focused 與 critical 層級、新聞與上下文功能需要 Brave Search API 金鑰;broad 層級與學術搜尋不需金鑰。
安裝前請注意
登錄檔條目寫的是無驗證的遠端端點,而 README 描述的是本機自架部署,連線前請確認是哪一種。Brave 金鑰按用量計費(約每月 5 美元對應約 1000 次查詢),focused 與 critical 掃描層級每次查詢都會產生費用。伺服器會抓取網址與本機 markdown 檔案並寫入持久語料庫,請留意索引內容。選用的 LLM 清洗與引用查核會把頁面文字傳送給本機 Ollama 模型或 DeepSe

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 qsearch,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/io.github.theYahia%2Fqsearch/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "qsearch": {
      "type": "http",
      "url": "https://qsearch.pro/mcp"
    }
  }
}

README

qsearch

I built this for my own daily research. After running 100+ research sprints, my agent kept hallucinating because it read 200-char snippets. qsearch gives it full content with multi-engine provenance — running locally, owned by me.

[License: Apache-2.0] [CI] [Status: v0.4.0 live] [Demo: qsearch.pro] [MCP] [MCP Registry]

AI agents lose 17–33% of facts to hallucination because they read 200-character snippets, not full pages (Stanford 2024). Existing search APIs hide which engines agreed on a result. Existing knowledge graphs are enterprise-priced or vendor-locked.

qsearch is the open-source search layer that gives agents full content with multi-engine provenance — running on your machine, owned by you, ready for MCP today.

✅ v0.4.0 live at qsearch.pro. Multi-engine attribution, trust corpus with per-URL provenance (engines[], sweep_count, trust_score), corpus viewer at /ui, MCP-over-HTTP for Claude Code and any spec-compliant client. 📖 Architecture: ARCHITECTURE.md · Vision: docs/VISION.md · Technical spec: docs/TRUST_MESH.md · Federation deep-dive: docs/FEDERATION_ARCHITECTURE.md

Demo

[qsearch terminal demo — quickstart, multi-engine search, citation verify]

60-second tour: /health (it's up, local) → /sweep (multi-engine engines[] attribution) → /verify (does the cited source actually support the claim?). Reproduce it locally with bash scripts/record-demo.sh after npm start — see docs/launch/README-demo-embed.md.

Quick start

Run it in 5 minutes — free tier, no API key:

bash
git clone https://github.com/theYahia/qsearch.git && cd qsearchcp .env.example .env.local       # works as-is on the $0 SearXNG tierdocker compose up -d             # Meilisearch + Qdrant + SearXNGnpm install && npm start         # → qsearch on http://localhost:8080
# multi-engine attribution in one callcurl -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)"

The broad sweep tier runs on self-hosted SearXNG and costs nothing. Add a Brave key only when you want the focused/critical tiers. Full setup (Brave key, Ollama, MCP server) below.

Full setup — Brave BYOK + local LLM + MCP server
bash
# 1. Clonegit clone https://github.com/theYahia/qsearch.gitcd qsearch
# 2. Get a Brave Search API key (BYOK, $5/mo for ~1000 queries)#    → https://brave.com/search/api/ → sign up → copy key
# 3. Configurecp .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 & runnpm installnpm start            # → qsearch v0.4.0 on http://localhost:8080
# 7. (Optional) MCP server for Claude Code / Workbench / OpenClawnpm run start:mcp    # → http://0.0.0.0:8081
# 8. Test multi-engine attributioncurl -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 design: Brave key + SearXNG + Ollama all stay on your machine. No data exfiltration.


How I use it daily

Every research sprint I run a dual sweep:

bash
# 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

After 10+ sprints on the same domain, /corpus/top?min_engines=3 shows which URLs survived multiple independent search engines across multiple sessions. Those are the ones I actually trust.


Why qsearch exists

Every AI agent today hits the same broken loop:

Agent → Tavily/Exa/Serper API → 200-char snippets → hallucinated answer

Three failures:

  1. Snippets aren't enough. Stanford's 2024 production RAG audit measured 17–33% hallucination on Lexis+ AI and Westlaw despite "hallucination-free" claims. On Wikipedia QA, full content beats snippet-RAG by +7.3pp (arxiv 2501.01880).

  2. No trust signal. Search APIs return ranked lists without telling you which engines agreed. SEO-spam at position 3 looks identical to authoritative source at position 4.

  3. No memory. Every search starts from zero. The same trash gets surfaced again. The same authority goes unrecognized.

qsearch addresses all three:

  • Full content fetched and cleaned, not just snippets.
  • engines[] field per result — Google + DDG + Brave + Qwant + Startpage attribution exposed (via SearXNG aggregation).
  • Local corpus accumulates — every URL grows a trust profile across sweeps.

How it works

mermaid
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

The yellow node is your private corpus. URLs found by 5 engines + 3 sweeps + 4 topics get a trust score that emerges naturally — no human ranking, no centralized authority, no cloud round-trip.

How qsearch compares

TavilyExaSerperBrave APISearXNGqsearch
Open source core❌❌❌❌✅✅
Full content (not snippets)partialpartial❌❌❌✅
Multi-engine attribution❌❌❌❌partial✅ (engines[])
Persistent local corpus❌❌❌❌❌✅
Trust score per URL❌❌❌❌❌✅
Self-hostable❌❌❌❌✅✅
MCP-nativepartial✅❌✅❌✅
BYOK upstream❌❌❌N/A✅✅

API — v0.4.0

Search endpoints

EndpointDescriptionBackend
POST /searchWeb search + corpus first, trust-weighted re-rankBrave or SearXNG
POST /sweepBatch search with priority/domain routing (see below)SearXNG / Brave / Academic
POST /cached_sweepSame as /sweep, with SQLite memcache layerSearXNG / Brave / Academic
POST /academic_searchPeer-reviewed papers via arxiv + PubMed + Semantic ScholarAcademic (free, no auth)
POST /sweep_contextLocal LLM page extraction (analogue of Brave LLM Context)Ollama qwen2.5
POST /newsNews searchBrave (requires key)
POST /contextDeep page extractionBrave (requires key)
POST /verifyCitation honesty check — does the cited URL actually support a claim? Returns Supported/Partial/Unsupported/Fabricated/Error + verbatim excerptLLM-as-judge (local Ollama qwen2.5 or DeepSeek)
POST /indexCrawl URL or index local .md globCrawl4AI
GET /trust/:urlTrust score + provenance for any URL in corpus—
GET /corpus/topTop URLs ranked by trust (?limit=20&min_engines=3)—
GET /corpus/statsCorpus size + counts—
GET /economy_reportSprint cost breakdown by backend + savings vs all-Brave—
GET /uiCorpus browser — search, trust scores, provenance modal—
GET /healthService status—

/search accepts: query, n_results (1–20), freshness (pd/pw/pm/py), search_lang, country, corpus_first (default true), corpus_only (default false).

/sweep accepts text/plain body with one query per line in the format label|query[|priority][|domain]:

  • priority ∈ broad (default, SearXNG, $0) / focused (Brave, ~$0.005) / critical (Brave + LLM Context, ~$0.01)
  • domain ∈ general (default) / scholarly (arxiv+PubMed+S2, $0) / ru (SearXNG with language=ru-RU bias, $0)
# Examplesbench_a|qdrant production latency benchmarks|focusedsch_a|crispr cas9 off target effects|broad|scholarlyru_a|tadviser сро рейтинг 2025|broad|rucrit_a|self-hosted vector DB choice 2026|criticalgen|simple search|broad        # 2-field still works — defaults broad/general

Auto-indexes results into Meilisearch with engines[] and engine_count filterable.

/academic_search accepts JSON: { query, n_results (1-20), sources?: ["arxiv","pubmed","semanticscholar"] }. Fans out to all three in parallel, dedupes by DOI/title, returns interleaved top-N.

Multi-engine attribution example

bash
curl -X POST http://localhost:8080/sweep \  -H "Content-Type: text/plain" \  --data-binary $'t1|self-hosted search engine 2026\n'

Output excerpt (parsed_snippets.md):

markdown
**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 has engine_count=4 — found by 4 independent engines. URL #2 has engine_count=1 — found by only one. The trust signal is built into the data, not bolted on.

Filter by trust in Meilisearch

bash
curl -H "Authorization: Bearer masterKey" \  "http://localhost:7700/indexes/qsearch_corpus/documents?filter=engine_count%20%3E%3D%203"

Returns only URLs found by 3+ engines — your high-trust subset.

MCP integration

The MCP server lives in this repo — there is no npm package for it. Run it from source:

bash
git clone https://github.com/theYahia/qsearch.git && cd qsearchnpm installnpm start            # REST API on :8080 — must be running firstnpm run start:mcp    # MCP server (Streamable HTTP) on :8081

Claude Code

Add to ~/.claude/settings.json:

json
{  "mcpServers": {    "qsearch": {      "type": "http",      "url": "http://localhost:8081"    }  }}

Available tools:

  • mcp__qsearch__web_search — web search via Brave or SearXNG
  • mcp__qsearch__sweep — batch research sweep with multi-engine attribution
  • mcp__qsearch__academic_search — peer-reviewed papers via arxiv + PubMed + Semantic Scholar
  • mcp__qsearch__sweep_context — Phase 3 local LLM page extraction (free, Ollama)
  • mcp__qsearch__verify_citation — does the cited URL actually support the claim? (Supported/Partial/Unsupported/Fabricated)
  • mcp__qsearch__economy_report — cost breakdown vs all-Brave baseline
  • mcp__qsearch__index_research — index local .md files by glob
  • mcp__qsearch__news_search — news search (Brave key required)
  • mcp__qsearch__context_search — deep page content (Brave key required)

Other MCP-over-HTTP clients

qsearch publishes Streamable HTTP transport at / on port :8081. Compatible with Claude Desktop (HTTP mode), OpenClaw, and any spec-compliant MCP client.

Stack

ComponentTech
RuntimeNode.js ≥20
Web searchBrave Search API (BYOK)
Meta-searchSearXNG (self-hosted, optional)
Academicarxiv + PubMed E-utilities + Semantic Scholar API (free, no auth)
Full-text corpusMeilisearch v1.7
Vector corpusQdrant v1.17.1
CrawlerCrawl4AI 0.8.6 (Python subprocess)
Embedder (optional)Ollama nomic-embed-text (default) or llama.cpp /v1/embeddings
LLM cleaner (optional)Ollama qwen2.5:7b-instruct (default; configurable via OLLAMA_CLEAN_MODEL)
MCP@modelcontextprotocol/sdk
LicenseApache-2.0

Roadmap

VersionFeatureWhen
v0.3.1Multi-engine engines[] attribution + dual sweep + corpus + MCPshipped
v0.4.0Trust layer: /trust/:url, /corpus/top, /ui viewer, trust-weighted re-rank, sort/pagination, corpus merge-on-upsert, snippet sanitizationshipped
v0.4.1Phase A — academic backend (arxiv + PubMed + S2), 4-field queries (label|q|priority|domain), /academic_search JSON + MCP toolshipped
v0.4.2Phase B — embedding rerank (Ollama nomic-embed-text, gated QSEARCH_RERANK_ENABLED); Phase C — RU coverage via SearXNG language=ru-RUshipped
v0.4.3QVAC SDK ripped out, all local LLM via Ollama (qwen2.5:7b-instruct + nomic-embed-text)shipped
v0.5Launch: awesome list PRs, MCP Registry publish, Show HN, newsletter distributionin progress
v0.6Phase B Stage 2 — LLM scoring rerank for critical queries; direct Yandex backend; Layer 8 quality gate (rejection threshold)next
v0.7+Optional federation (research direction — no timeline until v0.5 validated)open

See docs/VISION.md for the full picture and why federation is research-direction-only until we can ship it without overpromise.

Honest trade-offs

  • Cold start. First sweep takes 5–10 seconds (engine fan-out + corpus indexing). Best run as long-lived daemon.
  • Vector search Windows-blocked. Qdrant requires bare-runtime; not all platforms supported. Full-text Meilisearch works everywhere.
  • SearXNG rate limits. Self-host required — public instances get blocked by Google. Our docker-compose handles this.
  • engines[] requires SearXNG. Pure-Brave mode still works but loses the multi-engine signal.
  • Full content has latency cost. ~31s vs ~3s naive snippet retrieval (Bidirectional RAG study). qsearch makes this opt-in via /context endpoint.

Follow

License

Apache-2.0 — see LICENSE. Independent. BYOK. Self-hostable. No vendor lock-in.


Часть WWmcp · Telegram: @vhodvai

來源:README.md,提交 cb43c2a

工具

0
SourceWeft 尚未讀取此伺服器的工具。

版本歷史

1
  1. v0.4.0最新Sep 16, 2026

評分

已滿足適用檢查項的 85%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分