Skip to main content
Glama

🔍 MyWebSearch

Keyless Multi-Engine AI Web Search & High-Purity Content Extraction Engine
MCP Server · CLI · Local HTTP Daemon · Skill-Guided Agent Workflows

🇨🇳 简体中文 | 🇺🇸 English

npm version npm downloads license GitHub stars M8ven Live Monitored


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 automatic minResults cascading fallback.

  • ⚡ Native Anti-Bot & Proof-of-Work Solvers (Zero-Browser Fast Path)
    Built on wreq-js with 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's d.js (isJsaChallenge) HTML5/arithmetic challenge, bypassing anti-bot walls in milliseconds without launching a 400MB browser. Real URL decryption for Sogou redirect links, Baidu Location, 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
    fetchGithubReadme supports 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-whitelists 198.18.0.0/15 for 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 /metrics monitoring.


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

bing

🇨🇳 Direct

None

Chrome TLS impersonation + Base64 real URL resolution + stealth fallback

General technical search, mixed EN/ZH queries

baidu

🇨🇳 Direct

None

Concurrent Location redirect resolution + anti-bot detection

Chinese news, documentation, domestic forums

csdn

🇨🇳 Direct

None

WAF cookie jar persistence + empty response auto-retry

Chinese error logs, debugging tutorials

juejin

🇨🇳 Direct

None

Direct official API querying for clean long-form articles

Modern frontend/backend technical blogs

sogou

🇨🇳 Direct

None

Desktop & mobile dual parsing + redirect link decoding + ad removal

WeChat ecosystem links & long-tail queries

duckduckgo

🌐 Proxy in CN

None

Preload d.js + built-in isJsaChallenge JS solver

English technical search & open-source discussions

startpage

🌐 Proxy in CN

None

Built-in Anubis SHA-256 PoW solver + cookie session (no browser needed)

Google-backed high-privacy results

brave

🌐 Proxy in CN

None

Native TLS fingerprinting + strict sponsored ad stripping

Independent English index & technical blogs

exa

🌐 Direct API

Optional Free Key

Official semantic search API (skipped if key is unset)

Semantic similarity, AI research & papers

github

🌐 Proxy in CN

None

Official GitHub Search REST API for issues & repositories

GitHub issues, bug reports, and repositories

stackoverflow

🌐 Proxy in CN

None

Official StackExchange 2.3 API with HTML entity decoding

Developer troubleshooting, stack traces & answers

hackernews

🌐 Proxy in CN

None

Algolia HN Search API with points, comments & author metadata

Tech discussions, startup launches & engineering news

arxiv

🌐 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

search

Multi-engine federated search (13 engines)

Supports single query or parallel queries: string[], engines, limit, and minResults cascading; includes GitHub, StackOverflow, HackerNews & arXiv developer engines

fetchWebContent

Web page extraction & Markdown conversion

All-in-one content extractor: Built-in smart routing for CSDN, Juejin, WeChat, StackOverflow, and GitHub; supports pagination (startIndex) and focus snippets (focus)

fetchGithubReadme

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)

queryDocs

All-in-one official library documentation

Directly resolves library names (e.g. "next.js", "vue"), auto-heals 404s, returns alternative libraries & versioned code

💡 Backward Compatibility: Legacy fetchCsdnArticle and fetchJuejinArticle are automatically routed under fetchWebContent. Legacy resolveLibraryId is merged into queryDocs (which supports directly passing library name or legacy libraryId alias). Set REGISTER_LEGACY_ARTICLE_TOOLS=true if your LLM requires fetchCsdnArticle / fetchJuejinArticle explicitly 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/15 is 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-health

The 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:

  1. Startup log shows 🌐 Proxy: disabled even though proxy.url is set?

    • Check useProxy flag: In ~/.my-websearch/config.json, setting "useProxy": false takes precedence and explicitly overrides and disables url (setting PROXY_URL='false'). Change "useProxy": true or simply omit the field (providing a valid url automatically 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 declare PROXY_URL (e.g. http://127.0.0.1:7897 or 7890).

  2. 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 as BRAVE_API_KEY for 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": false will explicitly override and disable url. If you want proxy enabled, set "useProxy": true or 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_SEARCH_ENGINE

auto

Default engine: auto (smart query routing: Chinese baidu,sogou, English/foreign bing,duckduckgo). Supports all 13 engines: auto, bing, baidu, sogou, duckduckgo, brave, csdn, juejin, startpage, exa, github, stackoverflow, hackernews, arxiv (vertical developer engines can be configured as default, though auto or general web engines are recommended for global default)

ALLOWED_SEARCH_ENGINES

all

Comma-separated whitelist of allowed search engines (e.g. bing,baidu,duckduckgo)

BING_BASE_URL

https://cn.bing.com/search

Base URL for Bing queries. Overseas users or reverse proxy nodes can set to https://www.bing.com/search (legacy alias OPEN_WEBSEARCH_BING_HOST supported)

DEFAULT_MIN_RESULTS

5

Cascade threshold: triggers fallback engines when usable results are fewer than this value

DEFAULT_SEARCH_LIMIT

10

Default result limit when not explicitly specified in tool calls (max 50)

SEARCH_DEADLINE_MS

30000

Global hard deadline for multi-engine search execution (milliseconds)

SEARCH_AUTHORITY_DOMAINS

empty

Additional authority domain whitelist for result re-ranking (comma-separated, appended to built-in list)

SEARCH_MODE

auto

Search mode and browser policy. Supports single mode, multi-engine per mode, and compound multi-mode combinations:• Global mode: auto (default fallback), request/none (pure HTTP), playwright (force browser)• Single mode, multiple engines: playwright:bing,startpage, auto:bing,startpage, bing,startpage• Compound multiple modes: playwright:bing;auto:startpage (bing forces browser, startpage uses auto fallback), auto;request:startpage (global auto but startpage uses pure HTTP)

AUTO_ROUTE_EN_ENGINES

bing,duckduckgo

Comma-separated engines for default English auto-routing

AUTO_ROUTE_ZH_ENGINES

baidu,sogou

Comma-separated engines for default Chinese auto-routing

2. 🌐 Proxy & Network Security

Variable

Default

Allowed Values / Description

PROXY_URL

empty (off)

Consolidated upstream proxy configuration (merges previous USE_PROXY and PROXY_ENGINES). Not needed in TUN mode.• Default proxy: passing empty PROXY_URL="" or PROXY_URL=true activates default http://127.0.0.1:7897 (common port for Clash Verge; use 10809 for v2rayN or 7890 for legacy Clash; overseas engines use proxy, domestic engines stay direct)• Custom address: PROXY_URL=http://127.0.0.1:10809• Custom engines: PROXY_URL="http://127.0.0.1:7897;duckduckgo,brave" or all engines PROXY_URL=";all"

FAKE_IP_CIDRS

198.18.0.0/15

Whitelisted CIDRs for Clash Fake-IP mode to avoid SSRF false-positive blocking

IMPERSONATE_BROWSER

chrome_149

wreq-js browser TLS/H2 fingerprint profile (e.g. chrome_149, safari_18)

IMPERSONATE_OS

windows

Operating system platform for fingerprint impersonation (windows, macos, linux)

BING_IMPERSONATE

true

Toggle Chrome TLS impersonation for Bing HTTP mode (auto-trips circuit breaker after consecutive empty results)

ANUBIS_MAX_POW_DIFFICULTY

5

Maximum difficulty threshold for Startpage Anubis PoW solver; skips/falls back when difficulty exceeds this

DIRECT_FIRST_PROBE_TIMEOUT_MS

3500

Timeout in ms for direct-first connection probes before proxy fallback

FETCH_WEB_INSECURE_TLS

false

Disable TLS certificate verification for fetchWebContent only (for broken legacy site certs)

GITHUB_README_CDN_FIRST

false

When true, forces skipping raw.githubusercontent.com direct probe and queries jsDelivr CDN first (domestic network acceleration)

3. 🔐 Credentials & API Keys

Variable

Default

Allowed Values / Description

CONTEXT7_API_KEY

empty

Context7 API Key (strongly recommended for proxy/TUN users to bypass shared IP quotas)

EXA_API_KEY

empty

Exa Free API Key (only required if using the exa semantic search engine)

BRAVE_API_KEY

empty

Brave Search API Key (optional; uses official high-reliability API when set)

GITHUB_TOKEN

empty

GitHub Personal Access Token (optional; raises rate limit to 5,000 req/hr)

STACKOVERFLOW_API_KEY

empty

Stack Apps Key (optional; raises quota to 10,000 req/day)

4. 🖥️ Server Modes, Concurrency & Session Reaper

Variable

Default

Allowed Values / Description

MODE

both

MCP transport mode: stdio (stdin/stdout only), http (HTTP/SSE only), both (concurrent)

PORT

3211

MCP HTTP/SSE listen port (local persistent daemon uses 3210 by default)

MAX_CONCURRENT_SEARCHES

20

Max concurrent searches in daemon mode (0 for unlimited)

MCP_MAX_SESSIONS

100

Max retained MCP HTTP sessions before returning HTTP 429 Too Many Requests

MCP_SESSION_TTL_MS

1800000

Idle session expiration duration before reaping (default 30 min)

MCP_SESSION_REAPER_MS

300000

Session reaper scan interval (default 5 min)

LOG_LEVEL

info

Log level: quiet (completely silent), debug, info, warn, error

SECURITY_AUDIT

false

Enable SSRF blocking and host header security audit logging

OPEN_WEBSEARCH_ALLOWED_HOSTS

loopback

Host header whitelist for HTTP server (DNS Rebinding protection, comma-separated)

5. 🧭 Playwright Browser & Stealth Controls

NOTE

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

PLAYWRIGHT_CDP_ENDPOINT

empty

Remote Chrome/Edge CDP endpoint URL (e.g. http://127.0.0.1:9222 or ws://...)

PLAYWRIGHT_EXECUTABLE_PATH

auto

Absolute path to browser executable (auto-detects system Edge/Chrome by default)

PLAYWRIGHT_HEADLESS

true

Run headless (on Windows, automatically utilizes an isolated hidden desktop window)

PLAYWRIGHT_NAVIGATION_TIMEOUT_MS

20000

Hard page navigation timeout for Playwright (milliseconds)

6. 🛠️ Application Directory & Tool Customization

Variable

Default

Allowed Values / Description

MYWEBSEARCH_DATA_DIR

~/.my-websearch

Root directory for configuration and persistent cookie files

OPEN_WEBSEARCH_RESPONSE_CAP_BYTES

60000

Maximum character limit returned to LLMs to prevent prompt context explosion

MCP_TOOL_SEARCH_NAME

search

Custom registration name for the search tool in MCP

MCP_TOOL_FETCH_WEB_NAME

fetchWebContent

Custom registration name for the content extraction tool

MCP_TOOL_FETCH_GITHUB_NAME

fetchGithubReadme

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 standard PLAYWRIGHT_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 standard LOG_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 suite

Acknowledgements

Author: wtznicy

This project evolved from Open-WebSearch (originally created by Aas-ee) — special thanks to the original author. Thanks also to:

Available Tools

4 tools
fetchGithubReadmeA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

fetchWebContentA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
rawNoReturn the raw response body (HTML/plain text) without extraction
urlNo
urlsNoBatch URLs (1~3 URLs run concurrently, splitting maxChars budget; ideal for comparing search results)
focusNoKeyword or section name to target (e.g. 'Auth', 'Config'); returns targeted window (~5000 chars) instead of burning tokens on full document
formatNoContent 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
maxCharsNo
startIndexNoCharacter offset to start reading from (for paging through long content)
readabilityNo
includeLinksNo

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

queryDocsB
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of code snippets to return (default 5)
queryNoThe 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')
libraryNoLibrary 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')
libraryIdNoLegacy alias for library (e.g. /vercel/next.js)

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 3 tool updatesv1.3.1
    • RemovedfetchCsdnArticle
    • RemovedfetchJuejinArticle
    • ChangedqueryDocs1 field changed
      • removedInput schema / required
        Removed value: -[
        -  "library"
        -]
  2. 4 tool updatesv1.2.1
    • ChangedfetchWebContent3 fields changed
      • addedInput schema / properties / focus
        Added 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"
        +}
      • addedInput schema / properties / urls
        Added 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"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "url"
        -]
    • ChangedqueryDocs4 fields changed
      • addedInput schema / properties / library
        Added 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"
        +}
      • changedInput schema / properties / libraryId / description
        Previous 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)"
      • changedInput schema / properties / query / description
        Previous 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')"
      • changedInput schema / required
        Previous value: -[
        -  "libraryId"
        -]New value: +[
        +  "library"
        +]
    • RemovedresolveLibraryId
    • Changedsearch3 fields changed
      • changedInput schema / properties / engines / items / description
        Previous 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"
      • addedInput schema / properties / fetchTop
        Added 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"
        +}
      • changedInput schema / properties / limit / type
        Previous value: -"number"New value: +"integer"
  3. 2 tool updatesv1.0.25
    • ChangedfetchWebContent1 field changed
      • changedInput schema / properties / format / description
        Previous 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"
    • Changedsearch2 fields changed
      • changedInput schema / properties / queries / description
        Previous 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."
      • addedInput schema / properties / verbose
        Added value: +{
        +  "description": "Include verbose diagnostic fields (engineMetrics, full failure hints, and redundant source hostnames); default false to save tokens",
        +  "type": "boolean"
        +}
  4. 1 tool updatev1.0.21
    • Changedsearch2 fields changed
      • changedInput schema / properties / queries / description
        Previous 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)"
      • changedInput schema / properties / query / description
        Previous 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)"
  5. 2 tool updatesv1.0.17
    • ChangedfetchJuejinArticle1 field changed
      • addedInput schema / properties / format
        Added 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"
        +}
    • Changedsearch2 fields changed
      • changedInput schema / properties / minResults / description
        Previous 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)"
      • addedInput schema / properties / minResults / maximum
        Added value: +50
  6. 2 tool updatesv1.0.15
    • ChangedfetchWebContent1 field changed
      • addedInput schema / properties / format
        Added value: +{
        +  "description": "Content format: 'markdown' preserves fenced code blocks (with language) and GFM tables — better for technical docs",
        +  "enum": [
        +    "text",
        +    "markdown"
        +  ],
        +  "type": "string"
        +}
    • Changedsearch8 fields changed
      • removedInput schema / properties / engines / default
        Removed value: -[
        -  "bing"
        -]
      • addedInput schema / properties / engines / description
        Added value: +"Search engines to use (default: server default, which may auto-route by query language)"
      • removedInput schema / properties / limit / default
        Removed value: -10
      • addedInput schema / properties / limit / description
        Added value: +"Max results (default: server DEFAULT_SEARCH_LIMIT, usually 10)"
      • changedInput schema / properties / minResults / description
        Previous 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)"
      • addedInput schema / properties / queries
        Added 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"
        +}
      • addedInput schema / properties / query / description
        Added value: +"Single search query (use queries for multi-intent fan-out)"
      • removedInput schema / required
        Removed value: -[
        -  "query"
        -]
  7. 7 tool updatesv1.0.11
    • First observedfetchCsdnArticle
    • First observedfetchGithubReadme
    • First observedfetchJuejinArticle
    • First observedfetchWebContent
    • First observedqueryDocs
    • First observedresolveLibraryId
    • First observedsearch

TDQS

A3.9/5.0

Scored across 4 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count4/5

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.

Completeness4/5

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

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    B
    maintenance
    An 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.
    7
    4
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    MCP server providing web search, news search, and X/Twitter search capabilities via HTTP or stdio.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server for multi-engine web search and web page fetching, supporting parallel search, content extraction, and optional LLM-powered search summarization and deep search.
    4
    MIT