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 分