Labsco
zoharbabin logo

Web Researcher MCP

β˜… 35

from zoharbabin

Production-grade MCP server for web search, content extraction, and multi-source research β€” 8 tools, 5 search providers with automatic failover, 4-tier scraping pipeline. Single Go binary.

πŸ”₯πŸ”₯πŸ”₯βœ“ VerifiedPaid serviceAdvanced setup
<!-- mcp-name: io.github.zoharbabin/web-researcher-mcp --> <p align="center"> <img src="assets/logo-final.svg" width="120" height="120" alt="web-researcher-mcp logo"> </p> <h1 align="center">web-researcher-mcp</h1> <p align="center"> <strong>Your AI research assistant that cites real sources and stays honest.</strong> </p> <p align="center"> Search the entire web or narrow it down to just the sites you trust;<br/> medical journals, court databases, news outlets, academic papers.<br/> Analyze the full source, not just snippets. Links that work, citations you can trust,<br/> no made up closed garden pre-synthesized results. </p> <p align="center"> <a href="https://github.com/zoharbabin/web-researcher-mcp/actions/workflows/ci.yml"><img src="https://github.com/zoharbabin/web-researcher-mcp/actions/workflows/ci.yml/badge.svg" height="20" alt="CI"></a> <a href="https://goreportcard.com/report/github.com/zoharbabin/web-researcher-mcp"><img src="https://goreportcard.com/badge/github.com/zoharbabin/web-researcher-mcp" height="20" alt="Go Report Card"></a> <a href="https://pkg.go.dev/github.com/zoharbabin/web-researcher-mcp"><img src="https://pkg.go.dev/badge/github.com/zoharbabin/web-researcher-mcp.svg" height="20" alt="Go Reference"></a> <a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" height="20" alt="License: MIT"></a> <a href="https://github.com/zoharbabin/web-researcher-mcp/releases"><img src="https://img.shields.io/github/v/release/zoharbabin/web-researcher-mcp" height="20" alt="Release"></a> <a href="https://hub.docker.com/r/zoharbabin/web-researcher-mcp"><img src="https://img.shields.io/docker/pulls/zoharbabin/web-researcher-mcp?cacheSeconds=3600" height="20" alt="Docker"></a> <a href="https://pypi.org/project/web-researcher-mcp/"><img src="https://img.shields.io/pypi/v/web-researcher-mcp?label=PyPI" height="20" alt="PyPI"></a> <a href="https://glama.ai/mcp/servers/zoharbabin/web-researcher-mcp"><img src="https://glama.ai/mcp/servers/zoharbabin/web-researcher-mcp/badges/score.svg" height="20" alt="web-researcher-mcp MCP server"></a> <a href="https://github.com/zoharbabin/web-researcher-mcp/stargazers"><img src="https://img.shields.io/github/stars/zoharbabin/web-researcher-mcp?style=social" height="20" alt="GitHub Stars"></a> </p> <p align="center"> Built by <a href="https://zoharbabin.com">Zohar Babin</a> </p>

Get started in 30 seconds

Python users β€” uvx (no compile, any OS):

Copy & paste β€” that's it
# One-time: install uv (skip if you already have it)
curl -LsSf https://astral.sh/uv/install.sh | sh        # macOS/Linux  (Windows: winget install astral-sh.uv)

claude mcp add --scope user web-researcher -- uvx web-researcher-mcp

uv fetches the right prebuilt binary for your platform and runs it β€” no Go, no compile, no manual PATH. Point any MCP client at uvx web-researcher-mcp. Also works with uv tool install web-researcher-mcp or pip install web-researcher-mcp.

Python SDK

Copy & paste β€” that's it
from web_researcher_mcp import WebResearcherClient

async with WebResearcherClient() as client:
    response = await client.web_search("CRISPR off-target effects 2024", num_results=5)
    for r in response.results:
        verified = await client.verify_citation(r.url)
        print(r.title, "β€”", "βœ“" if verified.exists else "?")

Full documentation: docs/PYTHON_CLIENT.md

Open In Colab

Sync wrapper (for scripts and notebooks that don't use async):

Copy & paste β€” that's it
with WebResearcherClient.sync() as client:
    response = client.web_search("climate change 2024")
    print(response.results[0].title)

macOS (Homebrew):

Copy & paste β€” that's it
brew install zoharbabin/tap/web-researcher-mcp
claude mcp add --scope user web-researcher -- web-researcher-mcp

macOS / Linux (no package manager):

Copy & paste β€” that's it
curl -fsSL https://raw.githubusercontent.com/zoharbabin/web-researcher-mcp/main/install.sh | sh

Windows (PowerShell):

Copy & paste β€” that's it
powershell -ExecutionPolicy Bypass -c "irm https://raw.githubusercontent.com/zoharbabin/web-researcher-mcp/main/install.ps1 | iex"

No dev tools needed β€” every method ships the same signed binary (the PyPI wheels vendor it; the others download it and verify its checksum) and puts it on your PATH. The curl/PowerShell installers also register it with Claude Code automatically when the claude CLI is present; Homebrew installs the binary, so run the claude mcp add line above to connect it.

One-click install:

<p> <a href="https://cursor.com/en/install-mcp?name=web-researcher&config=eyJjb21tYW5kIjoidXZ4IiwiYXJncyI6WyJ3ZWItcmVzZWFyY2hlci1tY3AiXX0%3D"><img src="https://cursor.com/deeplink/mcp-install-dark.svg" alt="Add to Cursor" height="28"></a> <a href="https://vscode.dev/redirect?url=vscode%3Amcp%2Finstall%3F%257B%2522name%2522%253A%2522web-researcher%2522%252C%2522command%2522%253A%2522uvx%2522%252C%2522args%2522%253A%255B%2522web-researcher-mcp%2522%255D%257D"><img src="https://img.shields.io/badge/VS_Code-Install_Server-0098FF?style=flat-square" alt="Install in VS Code" height="28"></a> <a href="https://lmstudio.ai/install-mcp?name=web-researcher&config=eyJjb21tYW5kIjoidXZ4IiwiYXJncyI6WyJ3ZWItcmVzZWFyY2hlci1tY3AiXX0%3D"><img src="https://img.shields.io/badge/LM_Studio-Add_MCP-4A2DB8?style=flat-square" alt="Add to LM Studio" height="28"></a> </p>

The Cursor / VS Code / LM Studio buttons install the zero-config uvx setup (your editor prompts to confirm before adding it; needs uv β€” see above). It runs DuckDuckGo web search with no API key β€” great to try instantly; image_search/news_search and richer providers need a key (2 min, see Configuration). Claude Desktop: download the .mcpb bundle for your platform and double-click it (Settings β†’ Extensions), or use the uvx line above.

Using a different MCP client or want to pass API keys? See Connect to Your AI Assistant for the per-app config, and Configuration to pick a search provider.

Your AI can now search the web, read full articles, find academic papers, look up patents, and run multi-step research β€” only from sources you pick.


Why does this exist?

Perplexity gets its citations wrong over a third of the time. It links to papers that don't exist, invents DOIs, and presents SEO spam with the same confidence as peer-reviewed research. ChatGPT's web search isn't much better β€” it can't tell a blog post from a court filing.

If your work gets cited, published, submitted to a court, or shown to a client β€” you can't afford "probably real" sources.

This tool fixes the root cause: instead of searching the entire web and hoping, you tell your AI exactly which sources to search. We call these "search lenses" β€” curated lists of trusted sites for each field.

What you getWhat that means for you
Search lenses β€” choose your sources by fieldYour AI only sees the sites you trust (PubMed, SEC.gov, arXiv β€” not random blogs)
Research tools for every source typePapers, patents, SEC filings, US court records, economic data, news, web pages, images, full-text reading, grounded answers with citations, structured extraction, and multi-step deep research
Always has a backupMultiple search engines working together β€” if one has issues, the others pick up automatically
Reads full articlesDoesn't just give you snippets β€” extracts and reads entire pages, PDFs, Word docs, even YouTube transcripts and Hacker News threads
Real citations, formattedEvery source comes with a proper APA/MLA citation and a link that actually works
Your queries stay privateRuns on your machine β€” nobody sees what you're researching. Not us, not anyone.
Paper trailEvery search is logged so you can reproduce your research process months later

Works with Claude, Claude Desktop, Cursor, and any AI assistant that supports tool use.

Who uses this

  • Academic researchers β€” "I need a literature review with real DOIs, not made-up citations"
  • Business analysts β€” "My deliverable needs sources a client can actually click and verify"
  • Lawyers β€” "If I cite a case that doesn't exist, I get fined $50,000"
  • Journalists β€” "I need to cross-check government records and court filings, not Perplexity summaries"
  • Medical researchers β€” "Clinical decisions based on a health blog could hurt someone"
  • Graduate students β€” "I spent 3 hours tracking down a citation my AI invented"
  • Enterprise teams β€” "Our competitive research can't go through a third party's servers"

web-researcher-mcp demo β€” citation verification, grounded answers, and trusted search


How It Compares

web-researcher-mcpPerplexityScite.aiElicit
You pick which sources are searchedYes (built-in + custom lenses)NoNoNo
Makes up citationsNever β€” every link is real~37% incorrectRare (journals only)Rare
Works across all fieldsYes β€” legal, medical, news, patents, everythingYesJournals onlyPapers only
Keeps your research privateYes β€” runs on your machineNo (they see everything)NoNo
Works inside your existing AI (Claude, Cursor, etc.)YesNo (separate app)PartiallyNo (separate app)
Can read full articles, not just snippetsYes β€” pages, PDFs, Word docs, YouTubeNoNoLimited
CostFree forever (open source)$20/mo$20/mo$10-49/mo

When to use what

  • Perplexity β€” Quick casual lookups where you don't need to cite your sources
  • Scite.ai / Elicit β€” Browsing a specific database of academic papers
  • web-researcher-mcp β€” Anything where your reputation is attached to the research: client work, court filings, publications, grant proposals, medical decisions, journalism
  • Claude built-in search β€” Quick one-off lookups mid-conversation

What your AI can do with this

ToolWhat it does
web_searchSearch the web β€” optionally restricted to only the sources you trust via lenses
scrape_pageRead any URL in full β€” web pages, PDFs, Word docs, slideshows, YouTube transcripts, Hacker News threads (read natively via the HN API); supports mode: raw for verbatim, unsanitized source (e.g. inspecting JSON or HTML)
search_and_scrapeSearch and then read the best results β€” with quality scoring to surface the most reliable sources
image_searchFind images by size, type, color, or format
news_searchSearch recent news with date controls and source filtering
academic_searchFind real papers with real DOIs β€” authors, citation counts, open-access links
citation_graphWalk a paper's citation neighborhood β€” works it cites and works that cite it, with intent/influence signals
patent_searchSearch patent offices (US, Europe, international) with classification codes
filing_searchSearch SEC EDGAR for US public-company filings (10-K, 10-Q, 8-K, …) β€” or pull structured XBRL company facts
legal_searchSearch US court opinions and dockets via CourtListener β€” real cases with real citations
econ_searchLook up economic data β€” World Bank global development indicators, OECD economic indicators, Eurostat European statistics (all keyless), and FRED US macro series (GDP, CPI, unemployment, rates; requires FRED_API_KEY)
clinical_searchSearch ClinicalTrials.gov β€” clinical-trial registrations with status, phase, sponsor, and whether results are posted (discovery, not medical advice)
local_searchSearch for physical places (restaurants, shops, services, points of interest) by local intent query β€” structured POI details and descriptions. Requires BRAVE_API_KEY
brand_researchResearch a company's complete brand identity β€” colors (hex), logos, typography, tone of voice, and social handles β€” from any domain or company name. Returns structured JSON for AI content generation. No API key required; BrandFetch key optional for richer data
verify_citationCheck a citation before you rely on it β€” does it exist, match a real record, and is it retracted or a dead link? Evidence, not a verdict
audit_bibliographyAudit a whole reference list in one pass β€” paste a CSL-JSON/RIS/BibTeX file (or a session) and get per-entry + corpus-level flags for retracted, dead-link, and unverifiable citations
verify_recommendationAudit an AI-generated recommendation list (listicle, product ranking) for self-promotion, author conflicts of interest, domain reputation, and dead links β€” catches GEO-gamed picks. Evidence, not a verdict
archive_sourceCapture a fresh Internet Archive (Wayback Machine) snapshot of a URL via Save Page Now so a cited source stays verifiable if the page later changes or disappears β€” returns snapshot URL + timestamp (write tool)
answerAsk a factual question and get one synthesized answer with citations β€” the direct answer, not a reading list
structured_searchSearch and extract structured JSON per result (supply a schema), or pull entities by category (company, people, …)
sequential_searchMulti-step deep research β€” your AI remembers what it already found and builds on it
get_research_sessionRecover a research session after context loss β€” picks up right where you left off
research_exportExport a research session as a shareable report (markdown or JSON), with full per-step provenance
format_bibliographyTurn collected sources into a formatted bibliography β€” APA, MLA, BibTeX, RIS, or CSL-JSON (Zotero/EndNote/Mendeley-ready)

Most tools above are always available. A few activate only when the right provider or config is present: citation_graph requires a citation-capable academic provider (OpenAlex or Semantic Scholar); filing_search requires EDGAR_CONTACT_EMAIL; local_search requires BRAVE_API_KEY; answer and structured_search require a provider that supports those capabilities (e.g. Exa). Operators can also enable opt-in, consent-gated tools (per-user analytics, long-term memory, shared workspaces) that appear only when their feature is turned on β€” see docs/TOOLS.md for the authoritative, CI-verified tool list and full schemas.

Ready-made research templates

The server also ships guided prompt templates your AI assistant can pull in with one click β€” they walk it through a proven, multi-step process so you don't have to spell out every instruction:

TemplateWhat it guides your AI to do
comprehensive-researchRun a structured, multi-step deep dive on a topic
fact-checkVerify a claim against multiple independent sources
competitive-analysisSize up a company and its market (news, patents, web)
literature-reviewSystematically review academic literature on a topic
brand-guidelinesResearch a brand and produce use-case-specific creative direction (landing page, email, video brief) β€” calls brand_research and interprets the structured JSON for you
company-reconDeep OSINT reconnaissance on a company β€” maps infrastructure, filings, personnel, and public footprint

In most AI apps these show up wherever you pick a prompt or "/" command. The server exposes live status resources (stats://tools, stats://sessions, stats://rate-limits, stats://providers), a lens catalog (lenses://catalog), diagnostics (diagnostics://errors/recent, diagnostics://health), and a large-payload artifact store (research://artifact/{id}) so you β€” or your AI β€” can check usage, limits, and which providers are active. See docs/DEPLOYMENT.md for the full list.


Under the Hood

<details> <summary><strong>Architecture (for developers and contributors)</strong></summary>

The full per-package map and the layered diagram (MCP transports β†’ tool dispatch β†’ service layer β†’ infrastructure) live in ARCHITECTURE.md β€” kept in one place to avoid drift.

<details> <summary><strong>Design Principles (for developers)</strong></summary>
  1. Zero global state -- all dependencies injected via constructors
  2. Interface-driven -- every external dependency behind an interface for testing and swapping
  3. Bounded concurrency -- explicit semaphores for external API calls
  4. Defense in depth -- SSRF protection, rate limiting, content sanitization at every layer
  5. Fail loud -- errors returned, never swallowed; validation at boundaries
</details> </details>

Search Providers

You choose which search engine powers your research. All of them work with lenses.

ProviderWhole-WebImagesNewsNotes
DuckDuckGoYesβ€”β€”Zero-config default (no API key needed); rate-limited for heavy use
Google PSEYesYesYesProgrammable Search Engine; free tier: 100 queries/day
Brave SearchYesYesYesIndependent index; free tier available
Serper.devYesYesYesGoogle-identical results
SearXNGYesYesYesSelf-hosted, privacy-first, air-gapped deployments
SearchAPI.ioYesYesYesUnified API with multiple engine backends
TavilyYesβ€”YesAI-agent search; clean, LLM-ready content
ExaYesβ€”YesNeural/semantic search; also backs answer & structured_search and the optional paid scrape tier
Hacker NewsHN onlyβ€”YesZero-config (HN Algolia index); searches HN threads, not the full web

Multiple Providers (recommended)

Set up multiple search engines so if one has issues, your research doesn't stop:

Copy & paste β€” that's it
export SEARCH_ROUTING=brave,google,serper

If Brave is down, it automatically tries Google. If Google is rate-limited, it falls through to Serper. Your research just works.

See docs/PROVIDERS.md for a full provider comparison (index classification, capabilities, free tiers) and docs/DEPLOYMENT.md for advanced routing options (per-topic routing, patent-specific providers, etc.).

Single Provider

If you only have one search API key, that works too β€” just set it up and go.

<details> <summary><strong>Provider Setup Examples</strong></summary>

Multi-provider routing (recommended):

Copy & paste β€” that's it
export SEARCH_ROUTING=brave,google,serper
export BRAVE_API_KEY=BSAxxxxxxxxxx
export GOOGLE_CUSTOM_SEARCH_API_KEY=AIza...
export GOOGLE_CUSTOM_SEARCH_ID=017...
export SERPER_API_KEY=...

Single provider β€” Brave Search:

Copy & paste β€” that's it
export SEARCH_PROVIDER=brave
export BRAVE_API_KEY=BSAxxxxxxxxxx

Single provider β€” SearXNG (self-hosted, privacy-first):

Copy & paste β€” that's it
export SEARCH_PROVIDER=searxng
export SEARXNG_URL=http://localhost:8080

Single provider β€” Exa (also unlocks the answer & structured_search tools):

Copy & paste β€” that's it
export SEARCH_PROVIDER=exa
export EXA_API_KEY=...

Single provider β€” Google PSE:

Copy & paste β€” that's it
export SEARCH_PROVIDER=google
export GOOGLE_CUSTOM_SEARCH_API_KEY=AIza...
export GOOGLE_CUSTOM_SEARCH_ID=017...

Any provider from the Configuration table works the same way β€” set SEARCH_PROVIDER and its key(s).

</details>

Search Lenses

Search lenses let you control which websites your AI is allowed to search. Instead of searching the entire web (and getting blogs, spam, and AI-generated junk), a lens restricts results to only the sources you trust for that topic.

Built-in Lenses

LensFocus
docsOfficial documentation and API references only
academicPreprint servers, repositories, open-access journals
academic-extendedPreprint servers, OA aggregators, and repositories beyond core journal indexes
clinicalClinical trials, drug safety, evidence-based medicine
securityCVEs, advisories, vulnerability research
journalismPublic records, corporate filings, FOIA
programmingCode docs, tutorials, Q&A
programming-goggleDeveloper-first results re-ranked by Brave's Programming Goggle β€” surfaces docs, repos, and authoritative technical content (requires Brave)
devopsInfrastructure and operations β€” Kubernetes, Docker, Terraform, cloud, CI/CD
newsCurrent events, journalism
techTechnology industry
legalLaw, cases, statutes
medicalHealth, medicine
financeMarkets, filings
scienceResearch, papers
governmentPolicy, regulations
osintOpen-source intelligence β€” public records, corporate registries, social footprint, infrastructure

You can also create your own lenses for any field β€” just list the domains you trust.

How it works

When you (or your AI) use a lens, results come only from the sites in that lens. For example, using the medical lens means your AI searches PubMed, WHO, NIH, and other clinical sources β€” never health blogs or supplement ads.

Your AI uses lenses automatically when you ask it to. For example: "Search for recent findings on SGLT2 inhibitors using the clinical lens."

<details> <summary><strong>Creating Your Own Lens</strong></summary>

Create a directory for your custom lenses and add a JSON file for each one:

Copy & paste β€” that's it
{
  "name": "my-industry",
  "description": "Only searches sources I trust for my field",
  "domains": [
    "trusted-source.com",
    "industry-journal.org",
    "official-database.gov"
  ],
  "cx": "",
  "routing": ""
}

Then point the server to your lens directory:

Copy & paste β€” that's it
export CUSTOM_LENSES_PATH=/path/to/my-lenses

Your AI will now have my-industry as an available lens. Custom lenses load after the built-in set β€” a custom lens with the same name as a built-in one overrides it. You can add up to ~10 domains per lens.

Advanced options (optional β€” most users can ignore these):

  • cx β€” If you have a Google Programmable Search Engine with up to 5,000 domains, put the engine ID here
  • routing β€” Force this lens to use a specific search provider (e.g., "google")
</details>

Privacy & Security

Your research queries go directly from your machine to the search provider you chose. They never pass through our servers (we don't have servers). The tool runs entirely on your computer.

<details> <summary><strong>Technical security details (for enterprise / compliance teams)</strong></summary>
  • SSRF protection β€” blocks internal network access, cloud metadata endpoints, DNS rebinding attacks
  • OAuth 2.1 (HTTP mode) β€” JWKS token validation, per-tenant isolation, audience/issuer validation
  • Rate limiting (HTTP mode) β€” per-tenant + global limits to protect upstream APIs
  • Content sanitization β€” HTML cleaned via whitelist policy, deduplication, quality scoring

For the full threat model, see docs/SECURITY.md.

</details>

Performance

Searches come back in under a second. Previously-seen results are cached so repeats are instant. Full article extraction works on 95%+ of the web β€” including sites that try to block bots. Heavy JavaScript sites get a real browser behind the scenes (automatic, no setup needed).


Development

Copy & paste β€” that's it
go build -o web-researcher-mcp ./cmd/web-researcher-mcp   # Build
go test -race ./...                                        # Test (with race detector)
make verify                                                # Full CI gate (see Makefile for steps)

The lint, gosec, and govulncheck tools are pinned as go.mod tool directives, so make verify runs them at the exact versions CI uses (no global installs needed). Branch protection requires the Lint, Test, Security, and E2E checks to pass.

See CONTRIBUTING.md for the full development workflow, code style guide, and PR process.


Contributing

Contributions are welcome. Please see CONTRIBUTING.md for code style guidelines, development workflow, and how to submit pull requests.


Documentation

DocumentDescription
ARCHITECTURE.mdDesign decisions, technology stack, dependencies
CONTRIBUTING.mdDevelopment setup, code style, PR workflow
docs/TOOLS.mdTool specifications and parameter schemas
docs/EXAMPLES.mdUsage examples with JSON tool calls
docs/API_SETUP.mdSearch provider API key setup for all providers
docs/SECURITY.mdThreat model, SSRF, auth, compliance (SOC2/GDPR/FedRAMP)
docs/PRIVACY.mdWhat data goes where, third-party processors, retention
docs/DEPLOYMENT.mdBuild, Docker, Kubernetes, client configs, scaling
docs/PYTHON_CLIENT.mdPython SDK β€” WebResearcherClient reference, sync wrapper, installation
docs/LESSONS_LEARNED.mdNode.js to Go migration story and lessons
docs/SESSION_PERSISTENCE.mdHow sessions survive context loss β€” design, data flow, citations
docs/MIGRATION.mdMigrating from the deprecated google-researcher-mcp

License

MIT


Star History

<a href="https://www.star-history.com/?repos=zoharbabin%2Fweb-researcher-mcp&type=date&legend=top-left"><img src="https://api.star-history.com/chart?repos=zoharbabin/web-researcher-mcp&type=date&legend=top-left" width="800" height="450" alt="Star History Chart"></a>


<p align="center"> Built with <a href="https://go.dev">Go</a> and the <a href="https://modelcontextprotocol.io/">Model Context Protocol</a> <br/><br/> If you're tired of AI making things up, give this a try β€” and a ⭐ if it helps. </p>