MyWebSearch
MyWebSearch is a keyless multi-engine AI web search and content extraction MCP server that gives you four tools: search, fetchWebContent, fetchGithubReadme, and queryDocs.
search— Federated web search across 13 engines (bing, baidu, csdn, juejin, sogou, duckduckgo, brave, startpage, exa, github, stackoverflow, hackernews, arxiv) with no API key; supports a singlequeryor up to 4 parallelqueries, engine selection, auto language-aware routing,minResultscascading fallback,limitup to 50, andfetchTop(0–3) to auto-pull full Markdown for the top results in one turn.fetchWebContent— Extracts high-purity readable Markdown/text from any public HTTP(S) URL; bypasses anti-bot walls, strips ads/nav/footer, preserves fenced code blocks with languages and GFM tables; supportsfocuskeyword targeting,startIndexpagination,maxChars(up to 200k), batchurls(1–3 concurrent), and raw mode.fetchGithubReadme— Reads comprehensive GitHub/Gitee content: repo READMEs, source files (/blob/), directory trees (/tree/), issue discussions (/issues/), and PRs with changed files (/pull/).queryDocs— Preferred source for official, version-specific library/framework docs and code snippets via Context7, accepting plain package names (e.g.next.js) or pinned IDs (/vercel/next.js@v15.1.8); resolves names automatically, heals 404s, and needs no proxy.Deployment options — Usable over MCP STDIO, Streamable HTTP/SSE, as one-shot CLI commands (
search,fetch-web,status,cache-clear), or as a persistent local daemon (127.0.0.1:3210) with/healthand Prometheus/metrics.Zero-config networking — Auto-detects OS proxies, routes overseas engines through proxy while keeping domestic engines direct, whitelists Clash Fake-IP (198.18.0.0/15), and enforces SSRF security bounds; diagnostics via
doctor,--network, and--reset-health.
Search the web using Baidu as the search engine, returning structured results with titles, URLs, and descriptions.
Search the web using Brave Search, returning structured results with titles, URLs, and descriptions.
Search the web using CSDN and fetch individual article content from CSDN pages.
Search the web using DuckDuckGo, returning structured results with titles, URLs, and descriptions.
Fetch README files from GitHub repositories as content.
Search the web using Juejin, returning structured results with titles, URLs, and descriptions.
Search the web using Sogou, returning structured results with titles, URLs, and descriptions.
Search the web using Startpage, returning structured results with titles, URLs, and descriptions.
🔍 MyWebSearch
Keyless Multi-Engine AI Web Search & High-Purity Content Extraction Engine
MCP Server · CLI · Local HTTP Daemon · Skill-Guided Agent Workflows
One server, four ways to use it: connect an AI client over MCP, run a one-shot CLI query, keep a local daemon alive, or use the built-in diagnostics before going live.
Jump to: Quick start · MCP tools · CLI · Configuration · Diagnostics · Development
✨ Features
my-websearch is a full-stack search and technical documentation engine built specifically for AI coding agents (Claude Desktop, Cursor, Cherry Studio, Windsurf, Cline, ZCode, etc.). It requires zero paid API keys:
🌐 13-Engine Federated Search & Smart Routing
Aggregates direct domestic engines (Bing, Baidu, CSDN, Juejin, Sogou), global engines (DuckDuckGo, Brave, Startpage, Exa), and specialized developer platforms (GitHub, StackOverflow, Hacker News, arXiv). Features automatic language-aware routing (auto), parallel multi-query execution (queries: string[]), URL deduplication, and automaticminResultscascading fallback.⚡ Native Anti-Bot & Proof-of-Work Solvers (Zero-Browser Fast Path)
Built onwreq-jswith native Chrome TLS/HTTP2 handshake emulation and persistent session cookies. Includes pure-JS/Rust solvers for Startpage's Anubis SHA-256 PoW challenge and DuckDuckGo'sd.js(isJsaChallenge) HTML5/arithmetic challenge, bypassing anti-bot walls in milliseconds without launching a 400MB browser. Real URL decryption for Sogou redirect links, BaiduLocation, and Bing Base64 links.📄 High-Purity Markdown Article Extraction & Dedicated Site Purifiers
Combines Mozilla Readability with intelligent chrome noise stripping. Features dedicated purification rules for WeChat Official Accounts (mp.weixin.qq.com), StackOverflow questions & accepted answers, and transparent internal routing for CSDN & Juejin. Removes<nav>,<aside>,<footer>, and breadcrumbs while faithfully preserving article titles, code blocks, and GFM tables. Supports seamless pagination (startIndex).📚 Unified Context7 Library Docs Lookup (
queryDocs)
Directly query official documentation with natural package names (e.g."next.js","vue") or Context7 IDs without needing a separate resolve step. Includes automatic candidate ranking, blind-guess 404 self-healing, and related alternatives discovery.🐙 Extended GitHub Resource Fetcher
fetchGithubReadmesupports GitHub/Gitee repository READMEs, raw code blob files (/blob/...), and complete issue discussions with comments (/issues/...).🌏 Zero-Config Network Detection & Clash Fake-IP Ready
Auto-detects OS system proxies (Windows Registry / macOS scutil / Linux env). Automatically routes overseas engines through proxy while keeping domestic engines on fast direct lines. Pre-whitelists198.18.0.0/15for Clash TUN / Fake-IP compatibility while enforcing strict SSRF security bounds.🔌 Versatile Deployment Modes
Works seamlessly across MCP STDIO (Claude Desktop/Cursor), Streamable HTTP / SSE (Cherry Studio/remote clients), CLI one-shot commands, and a Local HTTP Daemon with connection pool reuse and Prometheus/metricsmonitoring.
Related MCP server: grok-mcp
🏗️ Architecture
flowchart TB
subgraph Clients["🤖 Entrypoints"]
MCP["MCP Server<br/>(STDIO / Streamable HTTP / SSE)"]
CLI["CLI Commands<br/>(my-websearch search / fetch-*)"]
Daemon["Local Daemon<br/>(127.0.0.1:3210 · /health · /metrics)"]
end
subgraph Core["🧠 Search & Fetch Orchestrator"]
Router["Language-Aware Auto Router<br/>ZH → Baidu/Sogou | EN/Tech → Bing + DuckDuckGo"]
Cascade["minResults Cascade & Circuit Breaker<br/>(Auto Fallback + 5min TTL LRU Cache)"]
Ranker["Cross-Engine URL Deduplication & BM25 Relevance Ranking"]
end
subgraph Transport["🛡️ Anti-Bot & Security Transport"]
Wreq["wreq-js Chrome TLS/H2 Fingerprint<br/>+ Automatic Session Cookie Jars"]
Solvers["Millisecond Challenge Solvers<br/>Startpage PoW | DDG JSA Solver"]
PW["Playwright Stealth Browser Fallback<br/>(Budget Bounds + Cross-Process Locking)"]
Guard["SSRF Guard & Clash Fake-IP Support<br/>(PROXY_URL Split Routing + 198.18.0.0/15)"]
end
subgraph Engines["🌍 13 Search Engines + 6 Content/Docs Tools"]
CN["🇨🇳 Direct Domestic Engines<br/>Bing · Baidu · CSDN · Juejin · Sogou"]
INTL["🌐 Global & Tech Engines<br/>DuckDuckGo · Brave · Startpage · Exa<br/>GitHub · StackOverflow · HackerNews · arXiv"]
Docs["📚 Content & Official Docs<br/>fetchWebContent · queryDocs · GitHub/Gitee · CSDN/Juejin"]
end
Clients --> Core
Core --> Transport
Transport --> Engines🌍 13 Search Engines
Engine | Mainland China Connectivity | API Key | Core Technology | Best For |
| 🇨🇳 Direct | None | Chrome TLS impersonation + Base64 real URL resolution + stealth fallback | General technical search, mixed EN/ZH queries |
| 🇨🇳 Direct | None | Concurrent | Chinese news, documentation, domestic forums |
| 🇨🇳 Direct | None | WAF cookie jar persistence + empty response auto-retry | Chinese error logs, debugging tutorials |
| 🇨🇳 Direct | None | Direct official API querying for clean long-form articles | Modern frontend/backend technical blogs |
| 🇨🇳 Direct | None | Desktop & mobile dual parsing + redirect link decoding + ad removal | WeChat ecosystem links & long-tail queries |
| 🌐 Proxy in CN | None | Preload | English technical search & open-source discussions |
| 🌐 Proxy in CN | None | Built-in Anubis SHA-256 PoW solver + cookie session (no browser needed) | Google-backed high-privacy results |
| 🌐 Proxy in CN | None | Native TLS fingerprinting + strict sponsored ad stripping | Independent English index & technical blogs |
| 🌐 Direct API | Optional Free Key | Official semantic search API (skipped if key is unset) | Semantic similarity, AI research & papers |
| 🌐 Proxy in CN | None | Official GitHub Search REST API for issues & repositories | GitHub issues, bug reports, and repositories |
| 🌐 Proxy in CN | None | Official StackExchange 2.3 API with HTML entity decoding | Developer troubleshooting, stack traces & answers |
| 🌐 Proxy in CN | None | Algolia HN Search API with points, comments & author metadata | Tech discussions, startup launches & engineering news |
| 🌐 Proxy in CN | None | Official arXiv Atom XML API parsing titles, authors & abstracts | Scientific papers, machine learning & AI research |
🛠️ 4 Core MCP Tools (Minimal & Token-Efficient)
Tool Name | Purpose | Key Highlights |
| Multi-engine federated search (13 engines) | Supports single |
| Web page extraction & Markdown conversion | All-in-one content extractor: Built-in smart routing for CSDN, Juejin, WeChat, StackOverflow, and GitHub; supports pagination ( |
| Comprehensive GitHub / Gitee content reader | Fetches repository READMEs, branch-specific source files (fenced code blocks with syntax highlighting), ASCII directory trees, and Issue / PR discussions (with reactions & changed files) |
| All-in-one official library documentation | Directly resolves library names (e.g. |
💡 Backward Compatibility: Legacy
fetchCsdnArticleandfetchJuejinArticleare automatically routed underfetchWebContent. LegacyresolveLibraryIdis merged intoqueryDocs(which supports directly passinglibraryname or legacylibraryIdalias). SetREGISTER_LEGACY_ARTICLE_TOOLS=trueif your LLM requiresfetchCsdnArticle/fetchJuejinArticleexplicitly exposed as separate tools.
🚀 Quick Start
1. Run with NPX (Zero Configuration)
No installation required:
npx -y my-websearch@latest💡 Automated Proxy Discovery: The server automatically detects your operating system's proxy settings. If a local proxy (Clash, v2ray, Surge) is active, overseas engines automatically use the proxy while domestic engines stay on fast direct lines.
198.18.0.0/15is whitelisted out of the box for Clash Fake-IP.
2. Configure in AI Clients
🔹 Claude Desktop / Cursor / Windsurf / Cline (STDIO Mode)
Add to your MCP settings file:
{
"mcpServers": {
"my-websearch": {
"command": "npx",
"args": ["-y", "my-websearch@latest"],
"env": {
"MODE": "stdio"
}
}
}
}(For Windows environments where npx is not in the system path, set command to cmd and args to ["/c", "npx", "-y", "my-websearch@latest"])
🔹 Cherry Studio (Streamable HTTP Mode)
Start the server in your terminal with npx my-websearch@latest (default port 3211), then configure:
{
"mcpServers": {
"web-search": {
"name": "MyWebSearch",
"type": "streamableHttp",
"baseUrl": "http://localhost:3211/mcp"
}
}
}💻 CLI & Local Daemon
my-websearch can be used directly from your terminal as a standalone CLI tool or persistent daemon. Use --json in automation and keep the daemon on 127.0.0.1 unless you explicitly need remote access:
# Global install
npm install -g my-websearch
# Start persistent local HTTP daemon (port 3210 by default)
my-websearch serve
# One-shot terminal search (reuses running daemon automatically)
my-websearch search "Model Context Protocol best practices" --limit 5 --min-results 5 --json
# Extract web page as clean Markdown
my-websearch fetch-web "https://blog.vuejs.org/posts/vue-3-5" --max-chars 15000 --json
# View daemon status and Prometheus metrics (/health, /status, /metrics)
my-websearch status --json
# Clear in-memory search cache
my-websearch cache-clear🩺 Diagnostics
Use the built-in doctor command before troubleshooting a proxy, browser, or engine:
# Local configuration and browser checks
my-websearch doctor
# Real proxy/engine probes (may contact upstream services)
my-websearch doctor --network
# Limit network probes to selected engines
my-websearch doctor --network --engine bing,duckduckgo --json
# Reset and clear cached engine circuit breaker / health state
my-websearch doctor --reset-healthThe report separates configuration, proxy TCP reachability, HTTP reachability, application parsing, browser launch, and anti-bot challenges. Network mode performs real requests and should not be used as a high-frequency health check.
🌐 Proxy Troubleshooting & Upstream IP Risk Control
When configuring or diagnosing proxy connectivity, refer to these common edge cases:
Startup log shows
🌐 Proxy: disabledeven thoughproxy.urlis set?Check
useProxyflag: In~/.my-websearch/config.json, setting"useProxy": falsetakes precedence and explicitly overrides and disablesurl(settingPROXY_URL='false'). Change"useProxy": trueor simply omit the field (providing a validurlautomatically enables the proxy).No system proxy active without
PROXY_URL: If no system proxy (Clash/v2ray) is running, overseas engines will be blocked by default. Explicitly declarePROXY_URL(e.g.http://127.0.0.1:7897or7890).
Proxy is configured properly, but overseas engines fail or timeout? (Upstream IP Blocking, NOT a Config Error)
DuckDuckGo returns HTTP 202 / challenge: DDG detected excessive traffic from the proxy node's egress IP and served an anti-bot challenge.
Brave returns HTTP 429 Too Many Requests: Brave Search rate-limits noisy datacenter IP ranges.
Startpage times out or Anubis PoW difficulty spikes: Startpage dynamically raises Anubis PoW difficulty to 6+ for flagged IP addresses, exceeding single-engine execution budgets.
💡 Resolution: These symptoms indicate that the proxy node's public IP has been flagged by upstream search providers, not a bug in
my-websearch. Switch to a cleaner proxy server/node in your proxy client, fallback to domestic/direct engines, or supply an official API key such asBRAVE_API_KEYfor guaranteed SLA.
⚙️ Configuration & Environment Variables
Global Configuration (~/.my-websearch/config.json)
To share settings across all MCP clients without duplicate configuration:
{
"apiKeys": {
"context7": "ctx7sk-...",
"exa": "..."
},
"proxy": {
"url": "http://127.0.0.1:7897",
"useProxy": true,
"engines": ["duckduckgo", "exa", "brave", "startpage"]
}
}⚠️ Note on
useProxy: When"url"is configured, proxy is enabled automatically. Setting"useProxy": falsewill explicitly override and disableurl. If you want proxy enabled, set"useProxy": trueor omit the field entirely.
📋 Exhaustive Environment Variables Reference
Can be set via the global configuration file (~/.my-websearch/config.json), local .env, or system environment variables:
1. 🔍 Search & Routing Orchestration
Variable | Default | Allowed Values / Description |
|
| Default engine: |
| all | Comma-separated whitelist of allowed search engines (e.g. |
|
| Base URL for Bing queries. Overseas users or reverse proxy nodes can set to |
|
| Cascade threshold: triggers fallback engines when usable results are fewer than this value |
|
| Default result limit when not explicitly specified in tool calls (max 50) |
|
| Global hard deadline for multi-engine search execution (milliseconds) |
| empty | Additional authority domain whitelist for result re-ranking (comma-separated, appended to built-in list) |
|
| Search mode and browser policy. Supports single mode, multi-engine per mode, and compound multi-mode combinations:• Global mode: |
|
| Comma-separated engines for default English auto-routing |
|
| Comma-separated engines for default Chinese auto-routing |
2. 🌐 Proxy & Network Security
Variable | Default | Allowed Values / Description |
| empty (off) | Consolidated upstream proxy configuration (merges previous |
|
| Whitelisted CIDRs for Clash Fake-IP mode to avoid SSRF false-positive blocking |
|
|
|
|
| Operating system platform for fingerprint impersonation ( |
|
| Toggle Chrome TLS impersonation for Bing HTTP mode (auto-trips circuit breaker after consecutive empty results) |
|
| Maximum difficulty threshold for Startpage Anubis PoW solver; skips/falls back when difficulty exceeds this |
|
| Timeout in ms for direct-first connection probes before proxy fallback |
|
| Disable TLS certificate verification for |
|
| When |
3. 🔐 Credentials & API Keys
Variable | Default | Allowed Values / Description |
| empty | Context7 API Key (strongly recommended for proxy/TUN users to bypass shared IP quotas) |
| empty | Exa Free API Key (only required if using the |
| empty | Brave Search API Key (optional; uses official high-reliability API when set) |
| empty | GitHub Personal Access Token (optional; raises rate limit to 5,000 req/hr) |
| empty | Stack Apps Key (optional; raises quota to 10,000 req/day) |
4. 🖥️ Server Modes, Concurrency & Session Reaper
Variable | Default | Allowed Values / Description |
|
| MCP transport mode: |
|
| MCP HTTP/SSE listen port (local persistent daemon uses |
|
| Max concurrent searches in daemon mode ( |
|
| Max retained MCP HTTP sessions before returning HTTP 429 Too Many Requests |
|
| Idle session expiration duration before reaping (default 30 min) |
|
| Session reaper scan interval (default 5 min) |
|
| Log level: |
|
| Enable SSRF blocking and host header security audit logging |
| loopback | Host header whitelist for HTTP server (DNS Rebinding protection, comma-separated) |
5. 🧭 Playwright Browser & Stealth Controls
BING_PLAYWRIGHT_FALLBACK and STARTPAGE_PLAYWRIGHT_FALLBACK have been consolidated into SEARCH_MODE (e.g. SEARCH_MODE=bing or SEARCH_MODE=request). Backward compatibility is automatically preserved.
Variable | Default | Allowed Values / Description |
| empty | Remote Chrome/Edge CDP endpoint URL (e.g. |
| auto | Absolute path to browser executable (auto-detects system Edge/Chrome by default) |
|
| Run headless (on Windows, automatically utilizes an isolated hidden desktop window) |
|
| Hard page navigation timeout for Playwright (milliseconds) |
6. 🛠️ Application Directory & Tool Customization
Variable | Default | Allowed Values / Description |
|
| Root directory for configuration and persistent cookie files |
|
| Maximum character limit returned to LLMs to prevent prompt context explosion |
|
| Custom registration name for the search tool in MCP |
|
| Custom registration name for the content extraction tool |
|
| Custom registration name for the GitHub README tool |
💡 Zero-Config Upgrades (Redundant Variables Removed):
CORS Switches (
ENABLE_CORS/CORS_ORIGIN): CORS is disabled by default; enable it explicitly and restrict origins when browser clients need cross-origin access.Playwright Package Selection (
PLAYWRIGHT_PACKAGE/PLAYWRIGHT_MODULE_PATH): Now 100% automated via intelligent client and system binary discovery.Remote Browser Endpoint (
PLAYWRIGHT_WS_ENDPOINT): Unified into standardPLAYWRIGHT_CDP_ENDPOINT.Emoji Switch (
OPEN_WEBSEARCH_NO_EMOJI): Automatic console code page detection smoothly falls back to ASCII tags on legacy terminals.Fragmented Debug Flag (
OPEN_WEBSEARCH_DEBUG): Unified into standardLOG_LEVEL=debug.Cookie Persistence TTL (
MYWEBSEARCH_COOKIE_TTL_DAYS): Solidified to 30 days with automated sliding renewal.
🤝 Contributing & Tests
Pull requests and issues are welcome! To run the test suite locally:
npm install
npm run build
npm test # Run the Vitest suite (45 files, 401 tests at the current baseline)
npm run test:live # Run bounded-concurrency live integration tests
npm run eval:live # Run 23-case live STDIO JSON-RPC evaluation suiteAcknowledgements
Author: wtznicy
This project evolved from Open-WebSearch (originally created by Aas-ee) — special thanks to the original author. Thanks also to:
wreq-js for native Chrome TLS/HTTP2 fingerprint impersonation
Context7 for powering official documentation retrieval
Mozilla Readability & Turndown for content extraction and GFM Markdown formatting
Available Tools
4 toolsfetchGithubReadmeARead-onlyIdempotent
Fetch comprehensive GitHub/Gitee content: repository README, source code files (/blob/:branch/:path with language-tagged code blocks), directory trees (/tree/:branch/:path with clean ASCII trees), Issue discussions (/issues/:number with top solutions/comments), or Pull Requests (/pull/:number with changed files list). For generic web pages, use fetchWebContent.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so safety is covered. The description adds real behavioral value beyond that by describing the response shape per URL type (language-tagged code blocks, ASCII trees, top solutions/comments, changed-file lists), which sets agent expectations. It omits auth or rate-limit behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and resource scope, then a routing sentence with no filler. The content-type list is dense but each item earns its place by clarifying a distinct URL pattern; only the parenthetical detail is slightly heavy for a one-sentence preamble.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully sketches return formats per URL type, and annotations cover the safety profile. An agent has enough to select and call the tool; missing only edge-case guidance (private repos/auth, invalid URLs, rate limits).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single required 'url' parameter, so the description carries the burden — and it does, by spelling out the accepted URL patterns (/blob/:branch/:path, /tree/:branch/:path, /issues/:number, /pull/:number). That meaningfully compensates, though it never states that the input is a full GitHub/Gitee URL versus a relative path.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (fetch) and enumerates exactly what resource types it retrieves: README, source files, directory trees, Issues, and Pull Requests, with the URL shape for each. It also explicitly differentiates itself from the sibling fetchWebContent, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear exclusion and named alternative: 'For generic web pages, use fetchWebContent.' That resolves the most likely ambiguity (this vs. the generic fetcher). It gives no guidance for the other siblings (search, queryDocs), so it stops short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetchWebContentARead-onlyIdempotent
Fetch high-quality readable content from any public HTTP(S) URL (web pages, technical documentation, Markdown files, and technical articles such as CSDN, Juejin, WeChat, Stack Overflow). Automatically bypasses domestic anti-bot walls, removes promotional noise/watermarks, and preserves code blocks (with programming language) and GFM tables. Defaults to format='markdown'. Supports focus='keyword' for chapter targeting (5000 chars) and batch 'urls' (13 URLs concurrently). When response has truncated=true, inspect 'toc' for heading offsets or pass nextStartIndex as startIndex.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | Return the raw response body (HTML/plain text) without extraction | |
| url | No | ||
| urls | No | Batch URLs (1~3 URLs run concurrently, splitting maxChars budget; ideal for comparing search results) | |
| focus | No | Keyword or section name to target (e.g. 'Auth', 'Config'); returns targeted window (~5000 chars) instead of burning tokens on full document | |
| format | No | Content format (default: 'markdown' when raw is false): 'markdown' preserves headings, lists, fenced code blocks (with language) and GFM tables — better for technical docs; use 'text' for plain text | |
| maxChars | No | ||
| startIndex | No | Character offset to start reading from (for paging through long content) | |
| readability | No | ||
| includeLinks | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/idempotent/non-destructive, so the safety profile is covered; the description then adds substantive behavior beyond that: anti-bot bypass, promotional-noise and watermark removal, code-block language preservation, GFM table retention, markdown default, batch concurrency of 1-3 sharing the maxChars budget, and the truncated/toc/startIndex paging loop. No claim contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose before the feature list, and every clause carries a distinct fact (extraction behavior, format default, focus, batch, truncation recovery) with no filler. It is densely packed into a single run-on paragraph, which slightly hurts scannability, keeping it off a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 9 params, 0 required, 56% schema coverage and no output schema, the description covers most of what an agent needs to call it correctly, including the truncation-recovery loop and reference to the toc response field. The gaps are the unmentioned readability/includeLinks toggles and the maxChars budget semantics, which are never explained in prose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 56%, so the description must compensate and does for several params: format default ('markdown' when raw is false), focus targeting (~5000-char window), batch urls (1-3 concurrent, comparing search results), and startIndex paging via nextStartIndex. It leaves readability, includeLinks, and maxChars (only a default is given in schema) unexplained, so coverage remains partial rather than complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (fetch) and resource (high-quality readable content) scoped to 'any public HTTP(S) URL', enumerating content classes (web pages, technical docs, Markdown, articles like CSDN/Juejin/WeChat/Stack Overflow). The 'any public HTTP(S) URL' scope implicitly distinguishes it from fetchGithubReadme and from queryDocs/search, so an agent can route correctly without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete conditional guidance: use focus='keyword' for chapter targeting, batch urls for 1-3 concurrent fetches, and when truncated=true inspect toc or pass nextStartIndex as startIndex. It never names when NOT to use this tool versus fetchGithubReadme/queryDocs, so it stops short of a full when/when-not/alternatives statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
queryDocsBRead-onlyIdempotent
PREFERRED for official documentation: get up-to-date, version-specific official docs and code snippets for any library, framework, or package (e.g. 'next.js', 'react', 'fastapi', or exact ID '/vercel/next.js'). Directly pass the package name — automatically resolves to the canonical library. Direct, reliable, no proxy needed.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of code snippets to return (default 5) | |
| query | No | The question, feature, or task to get relevant documentation for (optional; defaults to an overview when omitted, e.g. 'how to set up middleware with auth') | |
| library | No | Library or package name (e.g. 'next.js', 'react', 'fastapi') or exact Context7 library ID (e.g. '/vercel/next.js', version-pinnable like '/vercel/next.js@v15.1.8') | |
| libraryId | No | Legacy alias for library (e.g. /vercel/next.js) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and openWorld, so the safety profile is covered. The description adds one genuinely useful behavioral fact -- the library argument auto-resolves to the canonical library -- but 'Direct, reliable, no proxy needed' is unverifiable marketing copy rather than disclosure, and no rate/scope limits are mentioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical routing cue 'PREFERRED' is correctly front-loaded, but the sentence is overloaded and ends with throwaway promotional clauses ('Direct, reliable, no proxy needed') that consume space without informing invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only query tool with no output schema, the description adequately conveys what comes back (documentation and code snippets) and how to supply a library. Annotations carry the safety profile and the schema carries parameter detail, so only minor gaps (result format, snippet ordering) remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (query, library, libraryId, limit) are already documented with formats and defaults, making 3 the baseline. The description restates the package-name-vs-ID input convention and the canonical resolution behavior, adding marginal value but no syntax beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: retrieving up-to-date, version-specific official docs and code snippets for libraries/frameworks, with concrete examples ('next.js', '/vercel/next.js'). The opening 'PREFERRED for official documentation' loosely differentiates it from the generic siblings (search, fetchWebContent, fetchGithubReadme), though it never names them directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'PREFERRED' implies this should be chosen over generic web tools for documentation, which is useful implied guidance. However, there is no explicit when-not condition, no stated prerequisites, and no direct comparison to search or fetchWebContent, leaving the agent to infer the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchARead-onlyIdempotent
Search the web across multiple engines with no API key required. Requires either "query" (single query string) or "queries" (array of 1-4 queries for fan-out). searchMode: omit/auto = server SEARCH_MODE; request/playwright force that mode. Engine guidance: for Chinese queries prefer engines=["baidu","sogou","csdn","juejin"]; for English general/official docs use bing; for bug/issue lookups use github; for developer Q&A use stackoverflow; for tech reviews use hackernews; for papers use arxiv; overseas engines (duckduckgo/brave/startpage/exa/github/stackoverflow/hackernews/arxiv) need a proxy. Omit engines to use server-side auto routing. Cite the relevant result URLs as markdown links in your answer. For OFFICIAL library/framework documentation, prefer queryDocs (more reliable, works without proxy). Use the site: operator for site-specific queries (e.g. "update site:docs.elastic.co").
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default: server DEFAULT_SEARCH_LIMIT, usually 10) | |
| query | No | Single search query (required if 'queries' is omitted; use 'queries' for multi-intent fan-out) | |
| engines | No | Search engines to use (default: server default, which may auto-route by query language) | |
| queries | No | 1-4 queries run concurrently and merged (required if 'query' is omitted) — for covering multiple intents in one call (e.g. official docs / Chinese community / English). Response includes 'cached: true' only when all sub-queries hit the TTL cache. | |
| verbose | No | Include verbose diagnostic fields (engineMetrics, full failure hints, and redundant source hostnames); default false to save tokens | |
| fetchTop | No | Two-in-one search & fetch: automatically fetch full readable Markdown content for top N results (0~3) in a single turn (up to 4000 chars per article) | |
| minResults | No | Auto-run additional engines when fewer than this many USABLE results (relevant, non-entry-page) come back (default: server DEFAULT_MIN_RESULTS, usually 5; max 50 — larger values only burn the search deadline) | |
| searchMode | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/idempotent, so the safety profile is covered; the description adds operational context the annotations do not carry — the proxy requirement for overseas engines, the cached-response signal, and the deadline cost of raising minResults. It stops short of return-format or rate-limit detail, but the annotation bar is low and real value is added.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the query/queries requirement are front-loaded, and the engine-routing sentences each carry distinct, actionable information rather than filler. It is dense and slightly run-on, but nearly every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, no-output-schema tool this is largely complete: query vs queries, engine selection, searchMode, and the cached-return behavior are covered. fetchTop, verbose, limit, and minResults are left to the schema, which is acceptable given high schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 88%, so parameters are already documented (baseline 3). The description goes beyond the schema by explaining searchMode semantics ('omit/auto = server SEARCH_MODE; request/playwright force that mode') and by mapping engine choices to query intent, which adds meaning the enum and engine list alone do not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search the web across multiple engines') with an immediate differentiator ('no API key required'). It also routes official-doc lookups to the sibling queryDocs, so an agent can separate this multi-engine search from the fetch* siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance keyed to intent: Chinese queries to baidu/sogou/csdn/juejin, bug lookups to github, Q&A to stackoverflow, papers to arxiv, and official library docs to queryDocs instead. It even names the alternative tool and the selecting condition, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v1.3.1- Removed
fetchCsdnArticle - Removed
fetchJuejinArticle - Changed
queryDocs1 field changed- removed
Input schema / requiredRemoved value: -[ - "library" -]
4 tool updates
v1.2.1- Changed
fetchWebContent3 fields changed- added
Input schema / properties / focusAdded value: +{ + "description": "Keyword or section name to target (e.g. 'Auth', 'Config'); returns targeted window (~5000 chars) instead of burning tokens on full document", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / urlsAdded value: +{ + "description": "Batch URLs (1~3 URLs run concurrently, splitting maxChars budget; ideal for comparing search results)", + "items": { + "format": "uri", + "type": "string" + }, + "maxItems": 3, + "minItems": 1, + "type": "array" +} - removed
Input schema / requiredRemoved value: -[ - "url" -]
- Changed
queryDocs4 fields changed- added
Input schema / properties / libraryAdded value: +{ + "description": "Library or package name (e.g. 'next.js', 'react', 'fastapi') or exact Context7 library ID (e.g. '/vercel/next.js', version-pinnable like '/vercel/next.js@v15.1.8')", + "minLength": 1, + "type": "string" +} - changed
Input schema / properties / libraryId / descriptionPrevious value: -"Exact Context7-compatible library ID (e.g. /vercel/next.js, /packages/express; optional version like /vercel/next.js@v15.1.8)"New value: +"Legacy alias for library (e.g. /vercel/next.js)" - changed
Input schema / properties / query / descriptionPrevious value: -"The question or task to get relevant documentation for (optional; defaults to an overview when omitted, e.g. 'how to set up middleware with auth')"New value: +"The question, feature, or task to get relevant documentation for (optional; defaults to an overview when omitted, e.g. 'how to set up middleware with auth')" - changed
Input schema / requiredPrevious value: -[ - "libraryId" -]New value: +[ + "library" +]
- Removed
resolveLibraryId - Changed
search3 fields changed- changed
Input schema / properties / engines / items / descriptionPrevious value: -"Search engine name. Valid values (normalize alias to canonical name): baidu, bing, csdn, duckduckgo, exa, brave, juejin, startpage, sogou"New value: +"Search engine name. Valid values (normalize alias to canonical name): baidu, bing, csdn, duckduckgo, exa, brave, juejin, startpage, sogou, github, stackoverflow, hackernews, arxiv" - added
Input schema / properties / fetchTopAdded value: +{ + "description": "Two-in-one search & fetch: automatically fetch full readable Markdown content for top N results (0~3) in a single turn (up to 4000 chars per article)", + "maximum": 3, + "minimum": 0, + "type": "integer" +} - changed
Input schema / properties / limit / typePrevious value: -"number"New value: +"integer"
2 tool updates
v1.0.25- Changed
fetchWebContent1 field changed- changed
Input schema / properties / format / descriptionPrevious value: -"Content format: 'markdown' preserves fenced code blocks (with language) and GFM tables — better for technical docs"New value: +"Content format (default: 'markdown' when raw is false): 'markdown' preserves headings, lists, fenced code blocks (with language) and GFM tables — better for technical docs; use 'text' for plain text"
- Changed
search2 fields changed- changed
Input schema / properties / queries / descriptionPrevious value: -"1-4 queries run concurrently and merged (required if 'query' is omitted) — for covering multiple intents in one call (e.g. official docs / Chinese community / English)"New value: +"1-4 queries run concurrently and merged (required if 'query' is omitted) — for covering multiple intents in one call (e.g. official docs / Chinese community / English). Response includes 'cached: true' only when all sub-queries hit the TTL cache." - added
Input schema / properties / verboseAdded value: +{ + "description": "Include verbose diagnostic fields (engineMetrics, full failure hints, and redundant source hostnames); default false to save tokens", + "type": "boolean" +}
1 tool update
v1.0.21- Changed
search2 fields changed- changed
Input schema / properties / queries / descriptionPrevious value: -"1-4 queries run concurrently and merged (dedup by URL) — for covering multiple intents in one call (e.g. official docs / Chinese community / English)"New value: +"1-4 queries run concurrently and merged (required if 'query' is omitted) — for covering multiple intents in one call (e.g. official docs / Chinese community / English)" - changed
Input schema / properties / query / descriptionPrevious value: -"Single search query (use queries for multi-intent fan-out)"New value: +"Single search query (required if 'queries' is omitted; use 'queries' for multi-intent fan-out)"
2 tool updates
v1.0.17- Changed
fetchJuejinArticle1 field changed- added
Input schema / properties / formatAdded value: +{ + "description": "Output format (default: text). 'markdown' keeps fenced code blocks (with language) and GFM tables — recommended for technical posts", + "enum": [ + "text", + "markdown" + ], + "type": "string" +}
- Changed
search2 fields changed- changed
Input schema / properties / minResults / descriptionPrevious value: -"Auto-run additional engines when fewer than this many USABLE results (relevant, non-entry-page) come back (default: server DEFAULT_MIN_RESULTS, usually 5)"New value: +"Auto-run additional engines when fewer than this many USABLE results (relevant, non-entry-page) come back (default: server DEFAULT_MIN_RESULTS, usually 5; max 50 — larger values only burn the search deadline)" - added
Input schema / properties / minResults / maximumAdded value: +50
2 tool updates
v1.0.15- Changed
fetchWebContent1 field changed- added
Input schema / properties / formatAdded value: +{ + "description": "Content format: 'markdown' preserves fenced code blocks (with language) and GFM tables — better for technical docs", + "enum": [ + "text", + "markdown" + ], + "type": "string" +}
- Changed
search8 fields changed- removed
Input schema / properties / engines / defaultRemoved value: -[ - "bing" -] - added
Input schema / properties / engines / descriptionAdded value: +"Search engines to use (default: server default, which may auto-route by query language)" - removed
Input schema / properties / limit / defaultRemoved value: -10 - added
Input schema / properties / limit / descriptionAdded value: +"Max results (default: server DEFAULT_SEARCH_LIMIT, usually 10)" - changed
Input schema / properties / minResults / descriptionPrevious value: -"Auto-run additional engines when fewer than this many results come back (default: disabled)"New value: +"Auto-run additional engines when fewer than this many USABLE results (relevant, non-entry-page) come back (default: server DEFAULT_MIN_RESULTS, usually 5)" - added
Input schema / properties / queriesAdded value: +{ + "description": "1-4 queries run concurrently and merged (dedup by URL) — for covering multiple intents in one call (e.g. official docs / Chinese community / English)", + "items": { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "maxItems": 4, + "minItems": 1, + "type": "array" +} - added
Input schema / properties / query / descriptionAdded value: +"Single search query (use queries for multi-intent fan-out)" - removed
Input schema / requiredRemoved value: -[ - "query" -]
7 tool updates
v1.0.11- First observed
fetchCsdnArticle - First observed
fetchGithubReadme - First observed
fetchJuejinArticle - First observed
fetchWebContent - First observed
queryDocs - First observed
resolveLibraryId - First observed
search
TDQS
Scored across 4 tools
Each tool has a fairly distinct target: web search (search), generic URL fetch (fetchWebContent), GitHub/Gitee-specific fetch (fetchGithubReadme), and official docs lookup (queryDocs). There is mild overlap between fetchWebContent and fetchGithubReadme (both fetch content) and between search and queryDocs (both retrieve docs), but descriptions explicitly cross-reference each other to steer selection.
Three tools use a clear camelCase verb-noun pattern (fetchGithubReadme, fetchWebContent, queryDocs), giving a predictable structure. However, 'search' is a bare single-word name that breaks the verb_noun convention of the rest, a minor deviation.
Four tools is slightly lean but well-scoped for a web search/retrieval server, with search, fetch, GitHub content, and docs each earning a distinct role. It borders on thin since there's no dedicated multi-page crawl or news tool, but nothing is redundant.
The surface covers the core retrieval lifecycle: search, generic fetch, code-host fetch, and canonical docs lookup, which is solid for a research/search server. Minor gaps exist (no dedicated crawl/site-mapping or structured extraction), but the descriptions show agents can work around them via site: operators and batch URLs.
Maintenance
Related MCP Connectors
Search GitHub, npm, PyPI, StackOverflow, ArXiv from one MCP — built for coding agents.
Docs: https://docs.keenable.ai/mcp-server Keenable is a free, remote MCP server that gives agents access to the web index. Search the web with ranked results and date/site filters, then fetch any indexed page as clean markdown. Works out of the box with no account or API key.
Free web search for AI agents. No API key required. Hosted MCP in active development.
Serper MCP — wraps the Serper Google Search API (serper.dev)
Related MCP Servers
- FlicenseAqualityBmaintenanceAn MCP server for SearXNG that provides web search capabilities with concise model-visible output while preserving full result payloads in metadata. It supports search, parallel fetching, URL extraction, and research workflows through both local stdio and streamable HTTP transports.74-
- FlicenseNot gradedqualityCmaintenanceMCP server providing web search, news search, and X/Twitter search capabilities via HTTP or stdio.-
- AlicenseNot gradedqualityBmaintenanceMCP server for multi-engine web search and web page fetching, supporting parallel search, content extraction, and optional LLM-powered search summarization and deep search.4MIT
- AlicenseAqualityBmaintenanceA self-hosted MCP server for web search with multi-engine support, combining search, URL fetching, and deep research along with proxy routing and deduplication.3MIT