MCP Web Search Server
MCP server for web search with LLM-optimized results and anti-detection mechanisms.
README
MCP Web Search Server
MCP server for web search with results optimized for LLMs and advanced bot-detection evasion.
Features
- Search: DuckDuckGo (no API key), Serper.dev, Bing Web Search
- Search aggregation:
fallbackmode ormergemode that queries multiple providers in parallel, deduplicates and ranks results by query relevance - Content extraction: Headless browser with stealth injection, browser page pool, and plain HTTP text fallback when pages are blocked
- Anti-detection: Dynamic fingerprint generation (viewport, UA, locale, timezone), human-like behavior, proxy support
- LLM formatting: Clean markdown via Turndown, metadata, structured data, links, images, PDF text extraction
- OCR: Extract text from image URLs using
tesseract.js - Broken link checker: Scan a page and report the status of its outgoing links
- Robustness: Retry with exponential backoff, circuit breaker per provider, token-bucket rate limiting, concurrency limiting, in-flight request deduplication, persistent cache, graceful shutdown
- Observability: Structured JSON logging via Pino, latency/error metrics per provider and fetch operation
- Config hot reload:
.envchanges are picked up automatically while the server is running - Multiple transports: stdio (default) or HTTP Streamable MCP transport
Installation
npm install
npm run build
Configuration
Copy .env.example to .env and configure:
# Search providers (optional — DuckDuckGo works without API keys)
SERPER_API_KEY=your_key
BING_API_KEY=your_key
# Search aggregation: "fallback" or "merge"
SEARCH_MERGE_MODE=fallback
# Rate limits (requests per second per provider)
SERPER_RATE_LIMIT=10
BING_RATE_LIMIT=10
DUCKDUCKGO_RATE_LIMIT=1
# Anti-detect
STEALTH_ENABLED=true
HEADLESS=true
PROXY_LIST=http://proxy1:8080,http://proxy2:8080
USER_DATA_DIR=
# Browser page pool size
BROWSER_POOL_SIZE=2
# Limits
MAX_RESULTS=10
MAX_CONTENT_LENGTH=8000
MAX_RESPONSE_SIZE_BYTES=10000000
REQUEST_TIMEOUT=30000
CACHE_TTL=300
# Behavior
MIN_DELAY=500
MAX_DELAY=3000
MAX_CONCURRENT=2
SCROLL_TO_BOTTOM=true
# Fetch fallback when the browser is blocked
TEXT_FETCH_FALLBACK=true
# Optional persistent cache directory
CACHE_DIR=./cache
# Logging
LOG_LEVEL=info
# Transport: stdio or http
MCP_TRANSPORT=stdio
HTTP_HOST=127.0.0.1
HTTP_PORT=8080
# Ethics / safety
ROBOTS_TXT_ENABLED=true
ALLOWED_DOMAINS=
BLOCKED_DOMAINS=
# Debug only — weakens browser security
ALLOW_INSECURE_BROWSER_FLAGS=false
MCP Tools
web_search
Search by query.
{
"query": "latest AI developments 2025",
"num_results": 10,
"provider": "auto",
"recency_days": 7
}
fetch_url
Fetch and clean a page.
{
"url": "https://example.com/article",
"max_length": 8000,
"include_images": false,
"include_links": false
}
search_and_fetch
Search and automatically fetch top-N results.
{
"query": "quantum computing breakthrough",
"num_results": 5,
"fetch_content": true,
"max_content_length": 5000,
"include_images": false,
"include_links": false
}
health_check
Check provider availability, circuit breaker state, and rate limits.
{}
ocr_image
Extract text from an image URL.
{
"url": "https://example.com/screenshot.png",
"language": "eng"
}
check_links
Fetch a page and check its outgoing links.
{
"url": "https://example.com/article",
"max_links": 20
}
Claude Desktop Integration
{
"mcpServers": {
"web-search": {
"command": "node",
"args": ["C:\\Files\\git\\mcp-web-search\\dist\\index.js"],
"env": {
"SERPER_API_KEY": "..."
}
}
}
}
HTTP Transport
Set MCP_TRANSPORT=http and HTTP_PORT=8080, then point an MCP client that supports Streamable HTTP at http://127.0.0.1:8080.
Anti-Detection & Reliability
The server uses a layered approach:
- puppeteer-extra-plugin-stealth — hides automation fingerprints
- Dynamic fingerprint generation — random Chrome on Windows/macOS/Linux with matching timezone
- Browser page pool — reusable Puppeteer pages to reduce launch overhead
- Human-like behavior — random delays, scroll, mouse events
- Proxy support — random proxy selection from
PROXY_LIST - Text fetch fallback — plain HTTP fetch when the headless browser is blocked
- Search result merging & ranking — combine multiple providers and rank by relevance
- Circuit breaker — temporarily disables failing providers
- Token-bucket rate limiting — per-provider rate limiting
- Retry & concurrency limiting — exponential backoff, bounded parallelism, in-flight deduplication
- Graceful shutdown — waits for active requests on SIGINT/SIGTERM
- Robots.txt respect — honors site crawl rules (can be disabled)
Development
npm run dev # watch mode
npm test # run unit tests
npm run build # compile TypeScript
npm run lint # run ESLint
npm run format # format with Prettier
Docker
docker build -t mcp-web-search .
docker run --rm -e SERPER_API_KEY=... mcp-web-search
License
MIT
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。
mcp-server-qdrant
这个仓库展示了如何为向量搜索引擎 Qdrant 创建一个 MCP (Managed Control Plane) 服务器的示例。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。