Skip to main content
Glama

searxng-mcp

CI Release Pages

一个用于 SearXNG 的 MCP 服务器,它保持模型可见的输出简短,在隐藏的元数据中保留完整的搜索结果负载,并支持本地 stdio 客户端和已部署的 streamable-http 使用场景。

你将获得

  • search:用于简洁的网页搜索,并在 _meta 中包含完整的原始负载

  • search_many:用于并行扇出、去重和合并排名

  • search_and_fetch:在一次调用中完成搜索和源提取

  • research:用于多查询搜索,包含批量获取和合并源

  • fetch_url:用于带引用的可读页面提取

  • fetch_many:用于带缓存的并行 URL 提取

  • health:用于后端、缓存和渲染状态检查

该服务器设计轻量。SearXNG 负责搜索工作;searxng-mcp 处理工具塑造、缓存、提取和传输。

Related MCP server: SearXNG MCP Bridge

快速入门

从检出代码安装

uv sync
uv run searxng-mcp

使用 uvx 安装

searxng-mcp 从此仓库分发(无 PyPI 发布)。最快路径是:

uvx --from git+https://github.com/88plug/searxng-mcp searxng-mcp

默认安装中包含渲染获取功能。如果主机已安装 Chromium 或 Chrome,searxng-mcp 将直接使用它。否则,首次渲染获取会自动将 Playwright Chromium 引导至用户缓存中。

使用 Docker 运行

docker build -t searxng-mcp .
docker run --rm -p 8811:8811 --add-host=host.docker.internal:host-gateway \
  -e SEARXNG_MCP_BASE_URL=http://host.docker.internal:8890 \
  searxng-mcp

Claude Desktop 示例

{
  "mcpServers": {
    "searxng-mcp": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/88plug/searxng-mcp", "searxng-mcp"],
      "env": {
        "SEARXNG_MCP_BASE_URL": "http://127.0.0.1:8890",
        "SEARXNG_MCP_TRANSPORT": "stdio"
      }
    }
  }
}

部署模式

本地 stdio

适用于桌面客户端和私有工作流。这是最简单且最安全的模式。

SEARXNG_MCP_TRANSPORT=stdio uv run searxng-mcp

可流式传输 HTTP

适用于私有服务、团队部署或反向代理的内部端点。

SEARXNG_MCP_TRANSPORT=streamable-http uv run searxng-mcp --host 0.0.0.0 --port 8811

加固的 Docker 和 Compose

对于长期运行的自托管服务,请使用加固的容器变体和提供的 Compose 堆栈。

docker build -f Dockerfile.prod -t searxng-mcp:prod .
cp docker-compose.env.example .env
docker compose up --build -d

安全与信任

本项目适用于本地和受信任的网络环境。它不是一个即插即用的公共互联网服务。

  • fetch_url 和 fetch_many 可以获取客户端提供的任意 URL

  • 渲染提取可能会针对不受信任的页面启动 Chromium

  • streamable-http 在任何共享部署中都应置于身份验证或反向代理之后

  • SEARXNG_MCP_FETCH_VERIFY_TLS=0 仅用于私有或自签名后端设置

如果你暴露了 HTTP 传输,请将其视为内部服务,并添加任何具备 SSRF 能力的工具所应有的控制措施。

为什么存在此项目

  • 紧凑的模型可见输出,同时在隐藏元数据中保留完整细节

  • 通过并行搜索和获取扇出实现更快速的研究工作流

  • 针对 JS 密集型页面的渲染提取,无需额外的安装标志

  • 为希望拥有自己基于 SearXNG 的 MCP 服务器的用户提供可自托管的部署

MCP 界面

  • searxng://config 暴露当前设置、传输模式和渲染支持

  • searxng://guide 总结了可用工具及其使用时机

  • quick_lookup、deep_research 和 research_workflow 是针对支持提示词界面的客户端的可选兼容性提示词

环境

关键变量:

  • SEARXNG_MCP_BASE_URL: SearXNG 基础 URL,默认为 http://127.0.0.1:8890

  • SEARXNG_MCP_FALLBACK_BASE_URLS: 可选的逗号分隔的备用 SearXNG 实例

  • SEARXNG_MCP_TRANSPORT: stdio、streamable-http 或 sse

  • SEARXNG_MCP_SEARCH_TIMEOUT: 后端搜索超时(秒)

  • SEARXNG_MCP_FETCH_TIMEOUT: 获取超时(秒)

  • SEARXNG_MCP_SEARCH_CACHE_TTL: 搜索缓存 TTL(秒)

  • SEARXNG_MCP_FETCH_CACHE_TTL: 获取缓存 TTL(秒)

  • SEARXNG_MCP_FETCH_VERIFY_TLS: 设置为 0 以跳过获取时的 TLS 验证

  • SEARXNG_MCP_RENDER_TIMEOUT: 渲染获取的浏览器导航超时

  • SEARXNG_MCP_RENDER_WAIT_MS: 渲染获取在 DOM 内容加载后的额外等待时间

  • SEARXNG_MCP_RENDER_CONCURRENCY: 并发渲染获取限制

  • SEARXNG_MCP_RENDER_HEADLESS: 设置为 0 以显示浏览器

  • SEARXNG_MCP_RENDER_BROWSER_PATH: 显式的 Chromium 或 Chrome 二进制路径

  • SEARXNG_MCP_RENDER_SANDBOX: 设置为 1 以保持 Chromium 沙盒启用

  • SEARXNG_MCP_RENDER_BLOCK_RESOURCES: 设置为 0 以允许渲染期间的图像、字体、样式表和媒体

  • SEARXNG_MCP_RENDER_AUTO_FALLBACK: 设置为 0 以禁用自动渲染回退

  • SEARXNG_MCP_RENDER_AUTO_MIN_WORDS: 降低此值可使自动渲染更激进

  • SEARXNG_MCP_RENDER_AUTO_MIN_CHARS: 降低此值可使自动渲染更激进

  • SEARXNG_MCP_CACHE_DIR: 缓存目录路径

基准测试

uv run searxng-mcp-bench --rounds 3

基准测试报告:

  • 原始 SearXNG 后端延迟

  • Token 可见的搜索输出大小

  • 合并的多查询搜索延迟

  • 多查询研究延迟

  • 获取提取延迟

  • 渲染获取延迟

  • 批量获取提取延迟

  • 渲染批量获取延迟

文档

构建与测试

uv sync --all-groups
uv run pytest -q
uv run python -m compileall src
uv run mkdocs build --strict

依赖维护

手动检查:

uv lock --upgrade --dry-run
uvx --from pip-audit pip-audit

自动化检查:

  • 每周针对 uv 依赖项和 GitHub Actions 的 Dependabot PR

  • 每周用于漏洞扫描和升级预演的 Dependency Health 工作流

Available Tools

7 tools
fetch_manyA
Read-onlyIdempotent

Fetch and extract several URLs in parallel. URLs are deduplicated after canonicalisation. Each per-source full text is preserved in hidden _meta.pages[].full_text. Best for: reading a batch of search results, comparing several known sources, building a multi-source citation set. Returns: per-source {title, url, excerpt, citations, render_mode} and aggregate stats (success_count, error_count, elapsed_ms). Rendered fetch is automatic for JS-heavy pages; pass rendered=true to force browser mode for every URL (slower). Use fetch_url for a single URL; research for an end-to-end multi-query workflow.

NameRequiredDescriptionDefault
urlsYesList of 1–20 absolute http(s) URLs to fetch in parallel. Duplicates are dedupe-d after canonicalisation.
max_excerpt_charsNoExcerpt character cap for the visible output (200–50000). Default comes from server settings. The full extracted text is always returned in hidden `_meta.full_text`.
max_linksNoMaximum outbound links to surface in the visible output (0–64, default 8). The complete link list is always included in hidden `_meta`.
renderedNoForce browser-based rendering for fetches. Default false: the server auto-renders only when a page is JS-heavy or returns near-empty text. Set true when a previous fetch came back nearly empty or to read a known SPA. Forced rendering is several times slower than HTTP fetch.
render_wait_msNoExtra milliseconds to wait after DOM content load before extracting (0–15000). Use a higher value (e.g. 1500–4000) for SPAs that hydrate slowly.
concurrencyNoMaximum concurrent backend requests for this fan-out (1–16). Higher is faster but puts more load on the SearXNG instance and remote pages. Omit for the server default.
ttlNoCache TTL override in seconds (0–86400). 0 disables caching for this call. Omit to use the server's default TTL.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate read-only, idempotent, non-destructive; description adds details like parallel execution, deduplication, full text preservation, and auto-rendering behavior. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise and well-structured: starts with purpose, then best-for, returns, parameter details. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (7 parameters, parallel fetching), the description covers purpose, usage, parameter behavior, and return structure. No output schema but return fields are listed.

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 coverage is 100%, baseline 3. Description adds practical context for each parameter (e.g., when to force rendering, how to set render_wait_ms for SPAs, concurrency load implications), exceeding baseline.

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?

The description uses specific verbs ('Fetch and extract several URLs in parallel') and resources, and distinguishes from siblings by mentioning 'fetch_url' for single URL and 'research' for multi-query workflow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states best use cases (e.g., reading batch search results, building citation set) and provides alternatives for single URL or multi-query workflows.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fetch_urlA
Read-onlyIdempotent

Fetch one URL, extract readable content (Readability-style), and return a compact excerpt plus link list. The full extracted text is preserved in hidden _meta.full_text. Best for: reading a known page after search/search_many, extracting clean prose from an article, getting an outbound-link list from a hub page. Returns: {title, url, excerpt, citations, links, content_type, render_mode} plus domain and word/char counts. Rendered fetch is automatic for JS-heavy pages; pass rendered=true to force browser mode when a previous fetch came back nearly empty. Use fetch_many for multiple URLs in one call; search_and_fetch if you do not yet have URLs.

NameRequiredDescriptionDefault
urlYesAbsolute http:// or https:// URL to fetch. Bare domains like 'example.com' are auto-prefixed with https://. Other schemes are rejected.
max_excerpt_charsNoExcerpt character cap for the visible output (200–50000). Default comes from server settings. The full extracted text is always returned in hidden `_meta.full_text`.
max_linksNoMaximum outbound links to surface in the visible output (0–64, default 8). The complete link list is always included in hidden `_meta`.
renderedNoForce browser-based rendering for fetches. Default false: the server auto-renders only when a page is JS-heavy or returns near-empty text. Set true when a previous fetch came back nearly empty or to read a known SPA. Forced rendering is several times slower than HTTP fetch.
render_wait_msNoExtra milliseconds to wait after DOM content load before extracting (0–15000). Use a higher value (e.g. 1500–4000) for SPAs that hydrate slowly.
ttlNoCache TTL override in seconds (0–86400). 0 disables caching for this call. Omit to use the server's default TTL.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide readOnlyHint, destructiveHint, idempotentHint. Description adds auto-prefixing of bare domains, hidden full text, automatic rendering for JS-heavy pages, and performance trade-offs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-organized: main action, best-for list, return format, parameter details. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Comprehensive for a tool with 6 parameters and no output schema. Covers return structure, hidden fields, cache, rendering modes, and usage context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%. Description adds context beyond schema: url scheme handling, default excerpt chars from server, force rendering behavior, and TTL cache override meaning.

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?

Clearly states 'Fetch one URL, extract readable content' and lists return fields. Distinguishes from siblings like fetch_many and search_and_fetch.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides 'Best for' scenarios and when to use alternatives. Includes guidance on force rendering when previous fetch returns empty.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

healthA
Read-onlyIdempotent

Report backend, cache, and render-engine readiness. Takes no arguments. Best for: a one-shot check before a session, debugging a 'search failed' result, verifying that the SearXNG backend is reachable and that rendered fetch is available. Returns: {backend, cache, render} with status, latency, and any active fallback URLs.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. Description adds specific return fields (status, latency, fallback URLs), providing useful behavioral context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences: purpose, usage guidance, return value. No wasted words, well front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete given zero parameters and no output schema. Explains purpose, when to use, and return structure.

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?

No parameters in schema. Baseline for 0 params is 4. Description mentions 'takes no arguments', confirming no input needed.

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?

Clearly states the tool reports readiness of backend, cache, and render-engine. Distinguishes from sibling tools that take arguments by explicitly noting it takes no arguments.

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 explicit best-use cases: one-shot check before session, debugging search failures, verifying backend reachability. Does not mention when not to use or alternative tools, but context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

researchA
Read-only

Run multi-query research: search several queries in parallel, merge and dedupe results, then fetch and extract the strongest sources with citations. Best for: open-ended investigations, building a multi-source briefing, answering a complex question that needs cross-checking across providers. Returns: merged ranking, per-source extracted excerpts and citations, plus a query map showing which queries surfaced each source. Full payloads in hidden _meta. Rendered fetch is automatic for JS-heavy pages; pass rendered=true to force browser mode. Use search_many when extraction is not needed; search_and_fetch for a single query.

NameRequiredDescriptionDefault
queriesYesList of 1–10 search queries to run in parallel. Use distinct phrasings or angles (synonyms, related entities, opposing framings) for the best merged coverage.
categoriesNoComma-separated SearXNG categories to search (e.g. 'general', 'news', 'images', 'videos', 'science', 'files'). Default is the server's configured category set, typically 'general'.
enginesNoComma-separated SearXNG engine names to use for this query. Forwarded to SearXNG's 'engines' parameter. Leave unset to use the backend's default engine selection.
enabled_enginesNoComma-separated engine names to enable in addition to the backend defaults. Forwarded as SearXNG's 'enabled_engines' parameter.
disabled_enginesNoComma-separated engine names to exclude from this query. Forwarded as SearXNG's 'disabled_engines' parameter.
languageNoBCP-47 language hint for SearXNG (e.g. 'en', 'en-US', 'de', 'all'). Default is the server's configured language.
pagenoNoResult page number (1–20, default 1). Use to paginate beyond the first page.
time_rangeNoRestrict results to recent content. Valid values: 'day', 'week', 'month', 'year'. Omit for no time filter.
safesearchNoSafe search level: 0=off, 1=moderate, 2=strict. Omit to use the server default.
max_resultsNoMaximum visible results to include in the compact summary (1–50). Default comes from server settings (typically 5). The hidden `_meta.raw_payload.results` always contains the full SearXNG response regardless of this cap.
fetch_limitNoMaximum number of search results to fetch and extract (1–20, default 3). Lower is faster; higher gives more sources at the cost of latency.
fetch_excerpt_charsNoPer-source excerpt character cap (200–20000). Default comes from server settings. Smaller values keep the visible output tight; the full text is always available in hidden `_meta` for each source.
renderedNoForce browser-based rendering for fetches. Default false: the server auto-renders only when a page is JS-heavy or returns near-empty text. Set true when a previous fetch came back nearly empty or to read a known SPA. Forced rendering is several times slower than HTTP fetch.
render_wait_msNoExtra milliseconds to wait after DOM content load before extracting (0–15000). Use a higher value (e.g. 1500–4000) for SPAs that hydrate slowly.
concurrencyNoMaximum concurrent backend requests for this fan-out (1–16). Higher is faster but puts more load on the SearXNG instance and remote pages. Omit for the server default.
ttlNoCache TTL override in seconds (0–86400). 0 disables caching for this call. Omit to use the server's default TTL.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses key behaviors beyond annotations: parallel queries, merge/dedupe, automatic vs forced rendered fetch, hidden _meta payloads, and parameter effects like concurrency and caching. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise and well-structured: first sentence captures core functionality, followed by best-use cases, return format, render behavior, and alternatives. No redundant sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 16 parameters and no output schema, the description covers operation, return values (merged ranking, excerpts, citations, query map, hidden _meta), and important nuances (caching, concurrency, render wait). It is contextually complete for effective tool selection.

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 has 100% coverage, so baseline is 3. The description adds value by explaining the rendered fetch behavior and defaults (e.g., automatic rendering), but does not detail each parameter. Still, it enhances understanding of key parameters like rendered and max_results.

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?

The description clearly states the tool's purpose: run multi-query research with parallel searches, merging, deduplication, and extraction with citations. It distinguishes from siblings by contrasting with search_many and search_and_fetch.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides when to use (open-ended investigations, multi-source briefings) and when not (use search_many if no extraction needed, search_and_fetch for single query), offering clear guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_and_fetchA
Read-only

Search SearXNG for one query and fetch+extract the top results in a single call. Combines search and fetch_many for one-query research workflows. Best for: answering one question that needs evidence from full pages, building a citation-backed answer to a single prompt, getting both ranked results and readable excerpts in one round-trip. Returns: search summary plus per-source {title, url, excerpt, citations, render_mode}. The full SearXNG payload and per-page full text are in hidden _meta. Rendered fetch is automatic for JS-heavy pages; pass rendered=true to force browser mode (slower). Use search if extraction is not needed; research for multi-query investigations.

NameRequiredDescriptionDefault
queryYesSearch query (1–400 chars). Plain text or SearXNG syntax. SearXNG bangs like '!wikipedia foo' or '!images cats' are supported and route to specific engines.
categoriesNoComma-separated SearXNG categories to search (e.g. 'general', 'news', 'images', 'videos', 'science', 'files'). Default is the server's configured category set, typically 'general'.
enginesNoComma-separated SearXNG engine names to use for this query. Forwarded to SearXNG's 'engines' parameter. Leave unset to use the backend's default engine selection.
enabled_enginesNoComma-separated engine names to enable in addition to the backend defaults. Forwarded as SearXNG's 'enabled_engines' parameter.
disabled_enginesNoComma-separated engine names to exclude from this query. Forwarded as SearXNG's 'disabled_engines' parameter.
languageNoBCP-47 language hint for SearXNG (e.g. 'en', 'en-US', 'de', 'all'). Default is the server's configured language.
pagenoNoResult page number (1–20, default 1). Use to paginate beyond the first page.
time_rangeNoRestrict results to recent content. Valid values: 'day', 'week', 'month', 'year'. Omit for no time filter.
safesearchNoSafe search level: 0=off, 1=moderate, 2=strict. Omit to use the server default.
max_resultsNoMaximum visible results to include in the compact summary (1–50). Default comes from server settings (typically 5). The hidden `_meta.raw_payload.results` always contains the full SearXNG response regardless of this cap.
fetch_limitNoMaximum number of search results to fetch and extract (1–20, default 3). Lower is faster; higher gives more sources at the cost of latency.
fetch_excerpt_charsNoPer-source excerpt character cap (200–20000). Default comes from server settings. Smaller values keep the visible output tight; the full text is always available in hidden `_meta` for each source.
renderedNoForce browser-based rendering for fetches. Default false: the server auto-renders only when a page is JS-heavy or returns near-empty text. Set true when a previous fetch came back nearly empty or to read a known SPA. Forced rendering is several times slower than HTTP fetch.
render_wait_msNoExtra milliseconds to wait after DOM content load before extracting (0–15000). Use a higher value (e.g. 1500–4000) for SPAs that hydrate slowly.
ttlNoCache TTL override in seconds (0–86400). 0 disables caching for this call. Omit to use the server's default TTL.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only and non-destructive behavior. The description adds valuable context about automatic rendered fetch, hidden _meta data, and forced rendering. No contradictions.

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?

The description is well-structured with clear sections (best for, returns, behavior details). It is somewhat lengthy but each sentence adds value. Slight improvement could be made by condensing the parameter context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (15 parameters, no output schema, multiple siblings), the description is thorough, covering purpose, usage, return format, hidden data, and behavioral details. It leaves no major gaps.

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 baseline is 3. The description does not elaborate on parameters beyond the schema, but it provides context on how the parameters relate to the combined search-and-fetch workflow.

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?

The description clearly states that the tool combines search and fetch for a single query, and explicitly distinguishes it from sibling tools by recommending 'search' when no extraction is needed and 'research' for multi-query investigations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool: 'Best for: answering one question that needs evidence from full pages... getting both ranked results and readable excerpts in one round-trip.' It also clearly states when to use alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_manyA
Read-only

Run several SearXNG searches in parallel, then dedupe and merge their result sets into a single ranked list. Best for: broadening coverage on one topic with synonym/angle variants, comparing how different phrasings rank, building a high-recall source pool before fetching. Returns: merged hits with per-hit queries (which inputs surfaced it), engines, hit_count, and a merged_score. Per-query raw payloads are in hidden _meta. Use search for a single query; research when you also need the top sources fetched and excerpted in the same call.

NameRequiredDescriptionDefault
queriesYesList of 1–10 search queries to run in parallel. Use distinct phrasings or angles (synonyms, related entities, opposing framings) for the best merged coverage.
categoriesNoComma-separated SearXNG categories to search (e.g. 'general', 'news', 'images', 'videos', 'science', 'files'). Default is the server's configured category set, typically 'general'.
enginesNoComma-separated SearXNG engine names to use for this query. Forwarded to SearXNG's 'engines' parameter. Leave unset to use the backend's default engine selection.
enabled_enginesNoComma-separated engine names to enable in addition to the backend defaults. Forwarded as SearXNG's 'enabled_engines' parameter.
disabled_enginesNoComma-separated engine names to exclude from this query. Forwarded as SearXNG's 'disabled_engines' parameter.
languageNoBCP-47 language hint for SearXNG (e.g. 'en', 'en-US', 'de', 'all'). Default is the server's configured language.
pagenoNoResult page number (1–20, default 1). Use to paginate beyond the first page.
time_rangeNoRestrict results to recent content. Valid values: 'day', 'week', 'month', 'year'. Omit for no time filter.
safesearchNoSafe search level: 0=off, 1=moderate, 2=strict. Omit to use the server default.
max_resultsNoMaximum visible results to include in the compact summary (1–50). Default comes from server settings (typically 5). The hidden `_meta.raw_payload.results` always contains the full SearXNG response regardless of this cap.
concurrencyNoMaximum concurrent backend requests for this fan-out (1–16). Higher is faster but puts more load on the SearXNG instance and remote pages. Omit for the server default.
ttlNoCache TTL override in seconds (0–86400). 0 disables caching for this call. Omit to use the server's default TTL.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate read-only, non-destructive, open-world. Description adds valuable behavioral details: deduping, merged scoring, hidden `_meta` for raw payloads, max_results cap behavior, and concurrency/ttl options.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, well-structured with bullet points, and front-loads the core functionality. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite 12 parameters and no output schema, the description covers return format (merged hits, per-hit fields, hidden meta) and key behaviors (caching, concurrency). Comprehensive for agent use.

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 coverage is 100% so baseline is 3. Description adds value by explaining the meaning of 'queries' (distinct phrasings) and clarifying 'max_results' and 'concurrency' behavior beyond schema.

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?

The description clearly states it runs multiple SearXNG searches in parallel, dedupes, and merges results. It distinguishes from siblings by naming 'search' and 'research' as alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Best for' scenarios and direct guidance on when to use alternatives: 'Use `search` for a single query; `research` when you also need the top sources fetched and excerpted.'

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. 6 tool updatesv0.2.0
    • Changedfetch_many15 fields changed
      • changedInput schema / properties / concurrency / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 16,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / concurrency / description
        Added value: +"Maximum concurrent backend requests for this fan-out (1–16). Higher is faster but puts more load on the SearXNG instance and remote pages. Omit for the server default."
      • changedInput schema / properties / max_excerpt_chars / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 50000,
        +    "minimum": 200,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / max_excerpt_chars / description
        Added value: +"Excerpt character cap for the visible output (200–50000). Default comes from server settings. The full extracted text is always returned in hidden `_meta.full_text`."
      • addedInput schema / properties / max_links / description
        Added value: +"Maximum outbound links to surface in the visible output (0–64, default 8). The complete link list is always included in hidden `_meta`."
      • addedInput schema / properties / max_links / maximum
        Added value: +64
      • addedInput schema / properties / max_links / minimum
        Added value: +0
      • changedInput schema / properties / render_wait_ms / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 15000,
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / render_wait_ms / description
        Added value: +"Extra milliseconds to wait after DOM content load before extracting (0–15000). Use a higher value (e.g. 1500–4000) for SPAs that hydrate slowly."
      • addedInput schema / properties / rendered / description
        Added value: +"Force browser-based rendering for fetches. Default false: the server auto-renders only when a page is JS-heavy or returns near-empty text. Set true when a previous fetch came back nearly empty or to read a known SPA. Forced rendering is several times slower than HTTP fetch."
      • changedInput schema / properties / ttl / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 86400,
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / ttl / description
        Added value: +"Cache TTL override in seconds (0–86400). 0 disables caching for this call. Omit to use the server's default TTL."
      • addedInput schema / properties / urls / description
        Added value: +"List of 1–20 absolute http(s) URLs to fetch in parallel. Duplicates are dedupe-d after canonicalisation."
      • addedInput schema / properties / urls / maxItems
        Added value: +20
      • addedInput schema / properties / urls / minItems
        Added value: +1
    • Changedfetch_url13 fields changed
      • changedInput schema / properties / max_excerpt_chars / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 50000,
        +    "minimum": 200,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / max_excerpt_chars / description
        Added value: +"Excerpt character cap for the visible output (200–50000). Default comes from server settings. The full extracted text is always returned in hidden `_meta.full_text`."
      • addedInput schema / properties / max_links / description
        Added value: +"Maximum outbound links to surface in the visible output (0–64, default 8). The complete link list is always included in hidden `_meta`."
      • addedInput schema / properties / max_links / maximum
        Added value: +64
      • addedInput schema / properties / max_links / minimum
        Added value: +0
      • changedInput schema / properties / render_wait_ms / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 15000,
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / render_wait_ms / description
        Added value: +"Extra milliseconds to wait after DOM content load before extracting (0–15000). Use a higher value (e.g. 1500–4000) for SPAs that hydrate slowly."
      • addedInput schema / properties / rendered / description
        Added value: +"Force browser-based rendering for fetches. Default false: the server auto-renders only when a page is JS-heavy or returns near-empty text. Set true when a previous fetch came back nearly empty or to read a known SPA. Forced rendering is several times slower than HTTP fetch."
      • changedInput schema / properties / ttl / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 86400,
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / ttl / description
        Added value: +"Cache TTL override in seconds (0–86400). 0 disables caching for this call. Omit to use the server's default TTL."
      • addedInput schema / properties / url / description
        Added value: +"Absolute http:// or https:// URL to fetch. Bare domains like 'example.com' are auto-prefixed with https://. Other schemes are rejected."
      • addedInput schema / properties / url / maxLength
        Added value: +4000
      • addedInput schema / properties / url / minLength
        Added value: +4
    • Changedresearch29 fields changed
      • addedInput schema / properties / categories / description
        Added value: +"Comma-separated SearXNG categories to search (e.g. 'general', 'news', 'images', 'videos', 'science', 'files'). Default is the server's configured category set, typically 'general'."
      • changedInput schema / properties / concurrency / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 16,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / concurrency / description
        Added value: +"Maximum concurrent backend requests for this fan-out (1–16). Higher is faster but puts more load on the SearXNG instance and remote pages. Omit for the server default."
      • addedInput schema / properties / disabled_engines / description
        Added value: +"Comma-separated engine names to exclude from this query. Forwarded as SearXNG's 'disabled_engines' parameter."
      • addedInput schema / properties / enabled_engines / description
        Added value: +"Comma-separated engine names to enable in addition to the backend defaults. Forwarded as SearXNG's 'enabled_engines' parameter."
      • addedInput schema / properties / engines / description
        Added value: +"Comma-separated SearXNG engine names to use for this query. Forwarded to SearXNG's 'engines' parameter. Leave unset to use the backend's default engine selection."
      • changedInput schema / properties / fetch_excerpt_chars / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 20000,
        +    "minimum": 200,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / fetch_excerpt_chars / description
        Added value: +"Per-source excerpt character cap (200–20000). Default comes from server settings. Smaller values keep the visible output tight; the full text is always available in hidden `_meta` for each source."
      • addedInput schema / properties / fetch_limit / description
        Added value: +"Maximum number of search results to fetch and extract (1–20, default 3). Lower is faster; higher gives more sources at the cost of latency."
      • addedInput schema / properties / fetch_limit / maximum
        Added value: +20
      • addedInput schema / properties / fetch_limit / minimum
        Added value: +1
      • addedInput schema / properties / language / description
        Added value: +"BCP-47 language hint for SearXNG (e.g. 'en', 'en-US', 'de', 'all'). Default is the server's configured language."
      • changedInput schema / properties / max_results / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 50,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / max_results / description
        Added value: +"Maximum visible results to include in the compact summary (1–50). Default comes from server settings (typically 5). The hidden `_meta.raw_payload.results` always contains the full SearXNG response regardless of this cap."
      • addedInput schema / properties / pageno / description
        Added value: +"Result page number (1–20, default 1). Use to paginate beyond the first page."
      • addedInput schema / properties / pageno / maximum
        Added value: +20
      • addedInput schema / properties / pageno / minimum
        Added value: +1
      • addedInput schema / properties / queries / description
        Added value: +"List of 1–10 search queries to run in parallel. Use distinct phrasings or angles (synonyms, related entities, opposing framings) for the best merged coverage."
      • addedInput schema / properties / queries / maxItems
        Added value: +10
      • addedInput schema / properties / queries / minItems
        Added value: +1
      • changedInput schema / properties / render_wait_ms / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 15000,
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / render_wait_ms / description
        Added value: +"Extra milliseconds to wait after DOM content load before extracting (0–15000). Use a higher value (e.g. 1500–4000) for SPAs that hydrate slowly."
      • addedInput schema / properties / rendered / description
        Added value: +"Force browser-based rendering for fetches. Default false: the server auto-renders only when a page is JS-heavy or returns near-empty text. Set true when a previous fetch came back nearly empty or to read a known SPA. Forced rendering is several times slower than HTTP fetch."
      • changedInput schema / properties / safesearch / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      0,
        +      1,
        +      2
        +    ],
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / safesearch / description
        Added value: +"Safe search level: 0=off, 1=moderate, 2=strict. Omit to use the server default."
      • changedInput schema / properties / time_range / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "day",
        +      "week",
        +      "month",
        +      "year"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / time_range / description
        Added value: +"Restrict results to recent content. Valid values: 'day', 'week', 'month', 'year'. Omit for no time filter."
      • changedInput schema / properties / ttl / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 86400,
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / ttl / description
        Added value: +"Cache TTL override in seconds (0–86400). 0 disables caching for this call. Omit to use the server's default TTL."
    • Changedsearch19 fields changed
      • addedInput schema / properties / categories / description
        Added value: +"Comma-separated SearXNG categories to search (e.g. 'general', 'news', 'images', 'videos', 'science', 'files'). Default is the server's configured category set, typically 'general'."
      • addedInput schema / properties / disabled_engines / description
        Added value: +"Comma-separated engine names to exclude from this query. Forwarded as SearXNG's 'disabled_engines' parameter."
      • addedInput schema / properties / enabled_engines / description
        Added value: +"Comma-separated engine names to enable in addition to the backend defaults. Forwarded as SearXNG's 'enabled_engines' parameter."
      • addedInput schema / properties / engines / description
        Added value: +"Comma-separated SearXNG engine names to use for this query. Forwarded to SearXNG's 'engines' parameter. Leave unset to use the backend's default engine selection."
      • addedInput schema / properties / language / description
        Added value: +"BCP-47 language hint for SearXNG (e.g. 'en', 'en-US', 'de', 'all'). Default is the server's configured language."
      • changedInput schema / properties / max_results / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 50,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / max_results / description
        Added value: +"Maximum visible results to include in the compact summary (1–50). Default comes from server settings (typically 5). The hidden `_meta.raw_payload.results` always contains the full SearXNG response regardless of this cap."
      • addedInput schema / properties / pageno / description
        Added value: +"Result page number (1–20, default 1). Use to paginate beyond the first page."
      • addedInput schema / properties / pageno / maximum
        Added value: +20
      • addedInput schema / properties / pageno / minimum
        Added value: +1
      • addedInput schema / properties / query / description
        Added value: +"Search query (1–400 chars). Plain text or SearXNG syntax. SearXNG bangs like '!wikipedia foo' or '!images cats' are supported and route to specific engines."
      • addedInput schema / properties / query / maxLength
        Added value: +400
      • addedInput schema / properties / query / minLength
        Added value: +1
      • changedInput schema / properties / safesearch / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      0,
        +      1,
        +      2
        +    ],
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / safesearch / description
        Added value: +"Safe search level: 0=off, 1=moderate, 2=strict. Omit to use the server default."
      • changedInput schema / properties / time_range / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "day",
        +      "week",
        +      "month",
        +      "year"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / time_range / description
        Added value: +"Restrict results to recent content. Valid values: 'day', 'week', 'month', 'year'. Omit for no time filter."
      • changedInput schema / properties / ttl / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 86400,
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / ttl / description
        Added value: +"Cache TTL override in seconds (0–86400). 0 disables caching for this call. Omit to use the server's default TTL."
    • Changedsearch_and_fetch27 fields changed
      • addedInput schema / properties / categories / description
        Added value: +"Comma-separated SearXNG categories to search (e.g. 'general', 'news', 'images', 'videos', 'science', 'files'). Default is the server's configured category set, typically 'general'."
      • addedInput schema / properties / disabled_engines / description
        Added value: +"Comma-separated engine names to exclude from this query. Forwarded as SearXNG's 'disabled_engines' parameter."
      • addedInput schema / properties / enabled_engines / description
        Added value: +"Comma-separated engine names to enable in addition to the backend defaults. Forwarded as SearXNG's 'enabled_engines' parameter."
      • addedInput schema / properties / engines / description
        Added value: +"Comma-separated SearXNG engine names to use for this query. Forwarded to SearXNG's 'engines' parameter. Leave unset to use the backend's default engine selection."
      • changedInput schema / properties / fetch_excerpt_chars / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 20000,
        +    "minimum": 200,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / fetch_excerpt_chars / description
        Added value: +"Per-source excerpt character cap (200–20000). Default comes from server settings. Smaller values keep the visible output tight; the full text is always available in hidden `_meta` for each source."
      • addedInput schema / properties / fetch_limit / description
        Added value: +"Maximum number of search results to fetch and extract (1–20, default 3). Lower is faster; higher gives more sources at the cost of latency."
      • addedInput schema / properties / fetch_limit / maximum
        Added value: +20
      • addedInput schema / properties / fetch_limit / minimum
        Added value: +1
      • addedInput schema / properties / language / description
        Added value: +"BCP-47 language hint for SearXNG (e.g. 'en', 'en-US', 'de', 'all'). Default is the server's configured language."
      • changedInput schema / properties / max_results / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 50,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / max_results / description
        Added value: +"Maximum visible results to include in the compact summary (1–50). Default comes from server settings (typically 5). The hidden `_meta.raw_payload.results` always contains the full SearXNG response regardless of this cap."
      • addedInput schema / properties / pageno / description
        Added value: +"Result page number (1–20, default 1). Use to paginate beyond the first page."
      • addedInput schema / properties / pageno / maximum
        Added value: +20
      • addedInput schema / properties / pageno / minimum
        Added value: +1
      • addedInput schema / properties / query / description
        Added value: +"Search query (1–400 chars). Plain text or SearXNG syntax. SearXNG bangs like '!wikipedia foo' or '!images cats' are supported and route to specific engines."
      • addedInput schema / properties / query / maxLength
        Added value: +400
      • addedInput schema / properties / query / minLength
        Added value: +1
      • changedInput schema / properties / render_wait_ms / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 15000,
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / render_wait_ms / description
        Added value: +"Extra milliseconds to wait after DOM content load before extracting (0–15000). Use a higher value (e.g. 1500–4000) for SPAs that hydrate slowly."
      • addedInput schema / properties / rendered / description
        Added value: +"Force browser-based rendering for fetches. Default false: the server auto-renders only when a page is JS-heavy or returns near-empty text. Set true when a previous fetch came back nearly empty or to read a known SPA. Forced rendering is several times slower than HTTP fetch."
      • changedInput schema / properties / safesearch / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      0,
        +      1,
        +      2
        +    ],
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / safesearch / description
        Added value: +"Safe search level: 0=off, 1=moderate, 2=strict. Omit to use the server default."
      • changedInput schema / properties / time_range / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "day",
        +      "week",
        +      "month",
        +      "year"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / time_range / description
        Added value: +"Restrict results to recent content. Valid values: 'day', 'week', 'month', 'year'. Omit for no time filter."
      • changedInput schema / properties / ttl / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 86400,
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / ttl / description
        Added value: +"Cache TTL override in seconds (0–86400). 0 disables caching for this call. Omit to use the server's default TTL."
    • Changedsearch_many21 fields changed
      • addedInput schema / properties / categories / description
        Added value: +"Comma-separated SearXNG categories to search (e.g. 'general', 'news', 'images', 'videos', 'science', 'files'). Default is the server's configured category set, typically 'general'."
      • changedInput schema / properties / concurrency / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 16,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / concurrency / description
        Added value: +"Maximum concurrent backend requests for this fan-out (1–16). Higher is faster but puts more load on the SearXNG instance and remote pages. Omit for the server default."
      • addedInput schema / properties / disabled_engines / description
        Added value: +"Comma-separated engine names to exclude from this query. Forwarded as SearXNG's 'disabled_engines' parameter."
      • addedInput schema / properties / enabled_engines / description
        Added value: +"Comma-separated engine names to enable in addition to the backend defaults. Forwarded as SearXNG's 'enabled_engines' parameter."
      • addedInput schema / properties / engines / description
        Added value: +"Comma-separated SearXNG engine names to use for this query. Forwarded to SearXNG's 'engines' parameter. Leave unset to use the backend's default engine selection."
      • addedInput schema / properties / language / description
        Added value: +"BCP-47 language hint for SearXNG (e.g. 'en', 'en-US', 'de', 'all'). Default is the server's configured language."
      • changedInput schema / properties / max_results / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 50,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / max_results / description
        Added value: +"Maximum visible results to include in the compact summary (1–50). Default comes from server settings (typically 5). The hidden `_meta.raw_payload.results` always contains the full SearXNG response regardless of this cap."
      • addedInput schema / properties / pageno / description
        Added value: +"Result page number (1–20, default 1). Use to paginate beyond the first page."
      • addedInput schema / properties / pageno / maximum
        Added value: +20
      • addedInput schema / properties / pageno / minimum
        Added value: +1
      • addedInput schema / properties / queries / description
        Added value: +"List of 1–10 search queries to run in parallel. Use distinct phrasings or angles (synonyms, related entities, opposing framings) for the best merged coverage."
      • addedInput schema / properties / queries / maxItems
        Added value: +10
      • addedInput schema / properties / queries / minItems
        Added value: +1
      • changedInput schema / properties / safesearch / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      0,
        +      1,
        +      2
        +    ],
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / safesearch / description
        Added value: +"Safe search level: 0=off, 1=moderate, 2=strict. Omit to use the server default."
      • changedInput schema / properties / time_range / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "day",
        +      "week",
        +      "month",
        +      "year"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / time_range / description
        Added value: +"Restrict results to recent content. Valid values: 'day', 'week', 'month', 'year'. Omit for no time filter."
      • changedInput schema / properties / ttl / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 86400,
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / ttl / description
        Added value: +"Cache TTL override in seconds (0–86400). 0 disables caching for this call. Omit to use the server's default TTL."
  2. 7 tool updatesv0.1.0
    • First observedfetch_many
    • First observedfetch_url
    • First observedhealth
    • First observedresearch
    • First observedsearch
    • First observedsearch_and_fetch
    • First observedsearch_many

TDQS

A4.6/5.0

Scored across 7 tools

Disambiguation4/5

Tools have distinct purposes, but search_and_fetch and research are similar enough that an agent might misselect if descriptions aren't carefully read. However, descriptions clearly differentiate them.

Naming Consistency4/5

Most tools follow a verb_noun pattern in snake_case (fetch_url, search_many), but 'health' and 'research' deviate slightly. Overall pattern is recognizable.

Tool Count5/5

Seven tools cover the core operations of searching, fetching, and health checking without unnecessary bloat. The count is appropriate for the server's purpose.

Completeness5/5

The tool surface covers all typical workflows: single/multi search, single/multi fetch, combined search+fetch, and multi-query research. Health check ensures backend status. No obvious gaps.

Maintenance

ActivitySlowing
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    F
    maintenance
    An MCP server that acts as a bridge to SearXNG instances, allowing AI models to perform web searches with privacy-focused search tools. It supports both STDIO and HTTP transports, featuring built-in rate limiting and session management.
    41 npm
    7
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    MCP server that provides a search_web tool to query a self-hosted SearXNG instance and return structured web search results.
    1
    -
  • F
    license
    Not graded
    quality
    B
    maintenance
    A self-hosted MCP server providing private web search, web page fetching, and current date/time tools, powered by a bundled SearXNG instance for API-key-free local search.
    2
    -