full-web-searchLABSCO SUMMARY
Search that costs nothing per query and returns the page, not just the link.
Three engines in a fallback chain and content extraction with its own retry path — the design is about getting an answer back when one engine blocks you, which is the failure mode that makes keyless search unreliable.
What it is
A search server that queries engines directly through browser automation rather than a paid search API, then follows the results and extracts their page content. Built and tested against LM Studio and LibreChat.
What you get
full-web-search— the main tool: search, then fetch full page content from each result URL concurrently, returning structured data. Takes a query and a result count between 1 and 10, default 5get-web-search-summaries— the same multi-engine search returning only the result snippets, with no content extraction, for when speed matters more than depthget-single-web-page-content— extract the main content of one URL you already have, with navigation, ads and other non-content elements stripped- An ordered engine strategy: browser-based Bing on a dedicated Chromium instance first, browser-based Brave on Firefox second, and Axios DuckDuckGo as the final fallback, each engine getting its own browser instance with automatic cleanup
- Content extraction that tries plain HTTP first and only falls back to a browser, with automatic HTTP/1.1 retry when an HTTP/2 protocol error occurs
Requirements
Node.js 18.0.0 or higher and npm 8.0.0 or higher. Download a release, then run npm install, npx playwright install and npm run build in the extracted folder — the install must happen at the root, not inside dist/. Point your client's mcp.json at the built dist/index.js. Behaviour is tuned with environment variables: MAX_CONTENT_LENGTH defaults to 500000 characters, DEFAULT_TIMEOUT to 6000 milliseconds, MAX_BROWSERS to 3, and BROWSER_TYPES to chromium and firefox. Model choice matters more here than usual — recent tool-use models such as Qwen3 and Gemma 3 work well, while some older Llama and Deepseek builds behave erratically or not at all. Only LM Studio and LibreChat have been tested as clients.
Setup effort
Follow the published steps — npx playwright install
USE CASES
Giving a local model access to the web
No API key and no account: the engines are queried directly, so a model running in LM Studio can research without a paid search plan behind it.
Answering a question that needs the whole article
The main tool follows each result and extracts the page body, so the model reads the source rather than a snippet.
Getting a quick lay of the land
Snippets only, with no page fetching — the same multi-engine search at a fraction of the wait.
Reading a page you already found
Pass one URL and get its main content back with navigation and ads removed.
Tuning it for a slow or memory-tight machine
Lower the timeout for faster answers at some cost in success rate, and drop the browser count to reduce memory use.
3 tools
Listed in project docs. Your client may show a different list.
get-web-search-summariesget-single-web-page-contentBEFORE YOU INSTALL
What to know first
Tools you get
3 tools named in the project's documentation.
Requires
Node.js 18.0.0 or later
INSTALLATION
Connect your client
Server setup
Download the latest release zip from the Releases page (https://github.com/mrkrsl/web-search-mcp/releases) and extract it, for example to ~/mcp-servers/web-search-mcp/
npm install
npx playwright install
npm run buildMCP Clients
LM Studio
{
"mcpServers": {
"web-search": {
"command": "node",
"args": [
"<YOUR_PATH_TO_EXTRACTED>/web-search-mcp/dist/index.js"
]
}
}
}Point args at dist/index.js inside the folder you extracted, for example ~/mcp-servers/web-search-mcp/dist/index.js. Run npm install at the root of that folder, not inside dist/.
LibreChat
mcpServers:
web-search:
type: stdio
command: node
args:
- /app/mcp/web-search-mcp/dist/index.js
serverInstructions: trueThis entry goes under mcpServers in librechat.yaml. If LibreChat runs in Docker, first bind-mount your MCP directory to /app/mcp in docker-compose.override.yml.