qsearch
Provides academic paper search from arXiv.
Enables web search via the Brave Search API.
Search results aggregated via SearXNG metasearch.
Search results aggregated via SearXNG metasearch.
Indexes and queries the local corpus for full-text search.
Uses local LLM for page cleaning and embedding reranking.
Provides biomedical literature search from PubMed.
Search results aggregated via SearXNG metasearch.
Metasearch engine aggregating results from multiple search engines.
Provides academic paper search from Semantic Scholar.
Search results aggregated via SearXNG metasearch.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@qsearchsearch for 'self-hosted AI' with full content and multi-engine attribution"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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.
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
Quick start
# 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 design: Brave key + SearXNG + Ollama all stay on your machine. No data exfiltration.
Related MCP server: Deep Search MCP Server
How I use it daily
Every research sprint I run a dual sweep:
# 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.txtAfter 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 answerThree failures:
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).
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.
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
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:#000The 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
Tavily | Exa | Serper | Brave API | SearXNG | qsearch | |
Open source core | β | β | β | β | β | β |
Full content (not snippets) | partial | partial | β | β | β | β |
Multi-engine attribution | β | β | β | β | partial | β
( |
Persistent local corpus | β | β | β | β | β | β |
Trust score per URL | β | β | β | β | β | β |
Self-hostable | β | β | β | β | β | β |
MCP-native | partial | β | β | β | β | β |
BYOK upstream | β | β | β | N/A | β | β |
API β v0.4.0
Search endpoints
Endpoint | Description | Backend |
| Web search + corpus first, trust-weighted re-rank | Brave or SearXNG |
| Batch search with priority/domain routing (see below) | SearXNG / Brave / Academic |
| Same as | SearXNG / Brave / Academic |
| Peer-reviewed papers via arxiv + PubMed + Semantic Scholar | Academic (free, no auth) |
| Local LLM page extraction (analogue of Brave LLM Context) | Ollama qwen2.5 |
| News search | Brave (requires key) |
| Deep page extraction | Brave (requires key) |
| Crawl URL or index local | Crawl4AI |
| Trust score + provenance for any URL in corpus | β |
| Top URLs ranked by trust ( | β |
| Corpus size + counts | β |
| Sprint cost breakdown by backend + savings vs all-Brave | β |
| Corpus browser β search, trust scores, provenance modal | β |
| Service 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 withlanguage=ru-RUbias, $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/generalAuto-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
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):
**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
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
Claude Code
Add to ~/.claude/settings.json:
{
"mcpServers": {
"qsearch": {
"type": "http",
"url": "http://localhost:8081"
}
}
}Available tools:
mcp__qsearch__web_searchβ web search via Brave or SearXNGmcp__qsearch__sweepβ batch research sweep with multi-engine attributionmcp__qsearch__academic_searchβ peer-reviewed papers via arxiv + PubMed + Semantic Scholarmcp__qsearch__sweep_contextβ Phase 3 local LLM page extraction (free, Ollama)mcp__qsearch__economy_reportβ cost breakdown vs all-Brave baselinemcp__qsearch__index_researchβ index local.mdfiles by globmcp__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
Component | Tech |
Runtime | Node.js β₯20 |
Web search | Brave Search API (BYOK) |
Meta-search | SearXNG (self-hosted, optional) |
Academic | arxiv + PubMed E-utilities + Semantic Scholar API (free, no auth) |
Full-text corpus | Meilisearch v1.7 |
Vector corpus | Qdrant v1.17.1 |
Crawler | Crawl4AI 0.8.6 (Python subprocess) |
Embedder (optional) | Ollama |
LLM cleaner (optional) | Ollama |
MCP |
|
License | Apache-2.0 |
Roadmap
Version | Feature | When |
v0.3.1 | Multi-engine | shipped |
v0.4.0 | Trust layer: | shipped |
v0.4.1 | Phase A β academic backend (arxiv + PubMed + S2), 4-field queries ( | shipped |
v0.4.2 | Phase B β embedding rerank (Ollama nomic-embed-text, gated | shipped |
v0.4.3 | QVAC SDK ripped out, all local LLM via Ollama ( | shipped |
v0.5 | Launch: awesome list PRs, MCP Registry publish, Show HN, newsletter distribution | in progress |
v0.6 | Phase 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
/contextendpoint.
Follow
π Live demo: qsearch.pro
β Star: github.com/theYahia/qsearch
π¦ X: @TheTieTieTies
License
Apache-2.0 β see LICENSE. Independent. BYOK. Self-hostable. No vendor lock-in.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/theYahia/qsearch'
If you have feedback or need assistance with the MCP directory API, please join our Discord server