websearch-mcp
Allows searching GitHub repositories and issues as entry points for semantic web search.
Allows searching Python packages on PyPI as an entry point for semantic web search.
Enables searching across Stack Exchange network Q&A sites as entry points for semantic web search.
Provides Wikipedia as an entry point for semantic web search, allowing the server to navigate from articles to authoritative sources on a topic.
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., "@websearch-mcpfind the current rate limits for the GitHub API"
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.
websearch-mcp
Semantic web search as an MCP server, using no general search engine — no Google, Bing, DuckDuckGo, or Exa. A cheap LLM navigates the live web, a local embedding model indexes everything it walks past, and the index answers the next similar question by itself.
The idea
Building a general web index means crawling billions of pages. This does the opposite: it looks things up only when asked, and remembers what it found.
query → local vector index
├─ good hit → return immediately (milliseconds, no API cost)
└─ no hit → navigate the live web:
LLM picks entry sites → fetch page → LLM scores the page's links
against the goal → expand only the most promising ones → repeat
→ index every page walked pastSo it gets faster the more you use it: a brand-new topic takes a minute or two, and anything in that neighbourhood is a cache hit afterwards.
The load-bearing trick is that the model prunes at every node. A page has 50–150 outgoing links, so expanding all of them is exponential and hopeless. Scoring them against the goal turns the tree into a guided beam search — affordable precisely because the model is cheap.
Related MCP server: nesift-mcp
Entry points
With no search engine, navigation starts from each site's own search — what a person does when they know which site holds the answer but not which page. Every entry below was probed live:
Entry point | Notes |
Wikipedia (en/zh) | Article URLs directly — its |
GitHub repos / issues | Site search works |
Hacker News | Official Algolia JSON API |
Stack Exchange | Official JSON API (the HTML site rejects non-browser user agents) |
MDN / PyPI / PaperMC javadoc | Site search or a fixed entry page |
Sites whose search is robots-disallowed (Reddit, ArchWiki, Baidu Baike) or that are JavaScript-only shells (devdocs, the Hacker News web UI) are deliberately absent — where an official API exists, that is used instead.
Add your own with kb_add_hub, or edit websearch/hubs.py.
Tools
Tool | Purpose |
| Semantic search. Checks the local index first, navigates the live web on a miss |
| Fetch one URL's main text (and index it) |
| Index size, domains covered, cache hit rate |
| Register a site as a future entry point |
What gets stored
Per page: URL, title, summary, tags, and a 384-dimension vector — about 2KB. Page text is never retained. A hundred thousand pages fit in roughly 200MB.
Retrieval is brute-force cosine over the whole matrix (~50ms at 100k pages), so there is no ANN index to build or tune until this grows by another order of magnitude.
index.sqlite3— metadatavectors.npy+vector_ids.json— the vector matrix
Precision
Vector similarity alone is not enough. Multilingual e5 packs unrelated text into a narrow band, so an off-topic page can still score 0.80 — early versions happily answered a question about kimchi with Minecraft documentation. Retrieval is therefore followed by a cheap LLM relevance pass, and when nothing survives it says so instead of returning whatever the index happens to hold.
Being a good citizen
robots.txt fully respected, plus a 1 req/s per-domain rate limit
SSRF protection — hosts are resolved and private/loopback/link-local addresses refused
Prompt injection — crawled content is always wrapped in data tags and explicitly marked as data, never instructions
URL normalisation and content hashing to avoid re-indexing the same page
Running it
python3 -m venv .venv
.venv/bin/pip install --extra-index-url https://download.pytorch.org/whl/cpu torch
.venv/bin/pip install -r requirements.txt
cp .env.example .env # fill in OPENROUTER_API_KEY
OPENROUTER_API_KEY=... WEBSEARCH_DATA=/var/lib/websearch .venv/bin/python server.pyWire it into any MCP client:
{
"websearch": {
"command": "/opt/websearch-mcp/.venv/bin/python",
"args": ["/opt/websearch-mcp/server.py"],
"env": {
"HOME": "/var/lib/websearch",
"HF_HOME": "/var/lib/websearch/hf",
"WEBSEARCH_DATA": "/var/lib/websearch"
}
}
}Everything in websearch/config.py can be overridden by environment variable — navigation budget (NAV_MAX_PAGES, NAV_MAX_DEPTH, NAV_MAX_SECONDS), embedding model (EMBED_MODEL), politeness (PER_DOMAIN_DELAY), and so on. See .env.example.
Queries and summaries work in any language the embedding model covers; the LLM is asked to answer in the language of the query.
Cost
Embeddings run locally, so indexing is free. The LLM is used only for choosing entry sites, scoring links, and judging relevance — roughly $0.005 per cold query and nothing at all for a cache hit, using a cheap model such as DeepSeek V4 Flash through OpenRouter.
Honest limitations
This does not replace a general search engine for arbitrary queries. It is strong in the areas you have actually used it in, and empty everywhere else.
A brand-new topic costs one to two minutes on the first query. That is the price of navigating rather than querying a pre-built index.
When a site redesigns or changes its robots.txt, the corresponding entry point breaks and
hubs.pyneeds updating.
License
MIT — see LICENSE.
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.
Related MCP Servers
- AlicenseAqualityAmaintenanceA local-first, no-API-key MCP server that enables LLMs to search the web, fetch pages, and read documents using multiple engines and smart fallbacks.Last updated1031MIT
- Alicense-qualityBmaintenanceMCP server for local semantic search over web content, enabling AI agents to ingest, index, and query pages with hybrid retrieval and token budget control.Last updated4GPL 2.0
- AlicenseAqualityAmaintenanceMCP server for private web search via self-hosted SearXNG with local reranking, full-page content fetching via Firecrawl, and optional Ollama-powered query expansion and summaries.Last updated729316MIT
- AlicenseAqualityBmaintenanceMCP server for web search with LLM-optimized results and anti-detection mechanisms.Last updated362MIT
Related MCP Connectors
Local-first RAG engine with MCP server for AI agent integration.
Multi-engine search for AI agents. Trust scoring, local corpus, MCP-native. Self-hostable, BYOK.
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
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/jason920612/websearch-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server