searxng-mcp
searxng-mcp
모델이 볼 수 있는 출력은 짧게 유지하고, 전체 결과 페이로드는 숨겨진 메타데이터에 보존하며, 로컬 stdio 클라이언트와 배포된 streamable-http 사용을 모두 지원하는 SearXNG용 MCP 서버입니다.
제공 기능
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-mcpuvx로 설치
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-mcpClaude 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:8890SEARXNG_MCP_FALLBACK_BASE_URLS: 선택적인 쉼표로 구분된 대체 SearXNG 인스턴스SEARXNG_MCP_TRANSPORT:stdio,streamable-http또는sseSEARXNG_MCP_SEARCH_TIMEOUT: 백엔드 검색 시간 제한(초)SEARXNG_MCP_FETCH_TIMEOUT: 가져오기 시간 제한(초)SEARXNG_MCP_SEARCH_CACHE_TTL: 검색 캐시 TTL(초)SEARXNG_MCP_FETCH_CACHE_TTL: 가져오기 캐시 TTL(초)SEARXNG_MCP_FETCH_VERIFY_TLS: 가져오기 시 TLS 확인을 건너뛰려면0으로 설정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: Chromium 샌드박스를 활성화하려면1로 설정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 백엔드 지연 시간
토큰으로 볼 수 있는 검색 출력 크기
병합된 다중 쿼리 검색 지연 시간
다중 쿼리 연구 지연 시간
가져오기 추출 지연 시간
렌더링된 가져오기 지연 시간
배치 가져오기 추출 지연 시간
렌더링된 배치 가져오기 지연 시간
문서
빌드 및 테스트
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 toolsfetch_manyARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | List of 1–20 absolute http(s) URLs to fetch in parallel. Duplicates are dedupe-d after canonicalisation. | |
| max_excerpt_chars | No | 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`. | |
| max_links | No | Maximum outbound links to surface in the visible output (0–64, default 8). The complete link list is always included in hidden `_meta`. | |
| rendered | No | 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. | |
| render_wait_ms | No | 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. | |
| concurrency | No | 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. | |
| ttl | No | Cache TTL override in seconds (0–86400). 0 disables caching for this call. Omit to use the server's default TTL. |
TDQS
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.
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.
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.
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.
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.
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_urlARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Absolute http:// or https:// URL to fetch. Bare domains like 'example.com' are auto-prefixed with https://. Other schemes are rejected. | |
| max_excerpt_chars | No | 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`. | |
| max_links | No | Maximum outbound links to surface in the visible output (0–64, default 8). The complete link list is always included in hidden `_meta`. | |
| rendered | No | 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. | |
| render_wait_ms | No | 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. | |
| ttl | No | Cache TTL override in seconds (0–86400). 0 disables caching for this call. Omit to use the server's default TTL. |
TDQS
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.
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.
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.
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.
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.
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.
healthARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
researchARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| queries | Yes | 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. | |
| categories | No | Comma-separated SearXNG categories to search (e.g. 'general', 'news', 'images', 'videos', 'science', 'files'). Default is the server's configured category set, typically 'general'. | |
| engines | No | 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. | |
| enabled_engines | No | Comma-separated engine names to enable in addition to the backend defaults. Forwarded as SearXNG's 'enabled_engines' parameter. | |
| disabled_engines | No | Comma-separated engine names to exclude from this query. Forwarded as SearXNG's 'disabled_engines' parameter. | |
| language | No | BCP-47 language hint for SearXNG (e.g. 'en', 'en-US', 'de', 'all'). Default is the server's configured language. | |
| pageno | No | Result page number (1–20, default 1). Use to paginate beyond the first page. | |
| time_range | No | Restrict results to recent content. Valid values: 'day', 'week', 'month', 'year'. Omit for no time filter. | |
| safesearch | No | Safe search level: 0=off, 1=moderate, 2=strict. Omit to use the server default. | |
| max_results | No | 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. | |
| fetch_limit | No | 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. | |
| fetch_excerpt_chars | No | 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. | |
| rendered | No | 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. | |
| render_wait_ms | No | 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. | |
| concurrency | No | 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. | |
| ttl | No | Cache TTL override in seconds (0–86400). 0 disables caching for this call. Omit to use the server's default TTL. |
TDQS
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.
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.
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.
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.
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.
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.
searchARead-only
Search the open web via SearXNG for a single query and return a compact, token-efficient summary of the top results.
Best for: quick fact-finding, current events, locating likely sources, single-question lookups.
Returns: ranked list of {title, url, domain, snippet, engine, score} plus answers, infoboxes, suggestions and corrections when SearXNG provides them. The full SearXNG payload is also available in hidden _meta.raw_payload.
Use search_many instead when running multiple parallel queries; search_and_fetch when you also need extracted page content; research for multi-query investigations with merged sources and fetched excerpts.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | 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. | |
| categories | No | Comma-separated SearXNG categories to search (e.g. 'general', 'news', 'images', 'videos', 'science', 'files'). Default is the server's configured category set, typically 'general'. | |
| engines | No | 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. | |
| enabled_engines | No | Comma-separated engine names to enable in addition to the backend defaults. Forwarded as SearXNG's 'enabled_engines' parameter. | |
| disabled_engines | No | Comma-separated engine names to exclude from this query. Forwarded as SearXNG's 'disabled_engines' parameter. | |
| language | No | BCP-47 language hint for SearXNG (e.g. 'en', 'en-US', 'de', 'all'). Default is the server's configured language. | |
| pageno | No | Result page number (1–20, default 1). Use to paginate beyond the first page. | |
| time_range | No | Restrict results to recent content. Valid values: 'day', 'week', 'month', 'year'. Omit for no time filter. | |
| safesearch | No | Safe search level: 0=off, 1=moderate, 2=strict. Omit to use the server default. | |
| max_results | No | 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. | |
| ttl | No | Cache TTL override in seconds (0–86400). 0 disables caching for this call. Omit to use the server's default TTL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description adds value beyond annotations by explaining the return format (compact summary, raw payload in _meta), without contradicting readOnlyHint=true. Discloses token-efficiency and hidden data, enhancing transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise (4 sentences), front-loaded with purpose, then usage guidance, then return details and alternatives. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (11 parameters, no output schema), the description covers purpose, return format, hidden payload, and sibling guidance. Leaves no major gaps for an agent to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% coverage of parameter descriptions, so baseline is 3. The description does not add additional meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool searches the open web via SearXNG for a single query and returns a compact summary. Distinct from siblings by naming alternatives explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a 'Best for' section and explicitly names alternatives (search_many, search_and_fetch, research) with their use cases, offering strong guidance on when to use this tool versus others.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_and_fetchARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | 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. | |
| categories | No | Comma-separated SearXNG categories to search (e.g. 'general', 'news', 'images', 'videos', 'science', 'files'). Default is the server's configured category set, typically 'general'. | |
| engines | No | 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. | |
| enabled_engines | No | Comma-separated engine names to enable in addition to the backend defaults. Forwarded as SearXNG's 'enabled_engines' parameter. | |
| disabled_engines | No | Comma-separated engine names to exclude from this query. Forwarded as SearXNG's 'disabled_engines' parameter. | |
| language | No | BCP-47 language hint for SearXNG (e.g. 'en', 'en-US', 'de', 'all'). Default is the server's configured language. | |
| pageno | No | Result page number (1–20, default 1). Use to paginate beyond the first page. | |
| time_range | No | Restrict results to recent content. Valid values: 'day', 'week', 'month', 'year'. Omit for no time filter. | |
| safesearch | No | Safe search level: 0=off, 1=moderate, 2=strict. Omit to use the server default. | |
| max_results | No | 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. | |
| fetch_limit | No | 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. | |
| fetch_excerpt_chars | No | 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. | |
| rendered | No | 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. | |
| render_wait_ms | No | 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. | |
| ttl | No | Cache TTL override in seconds (0–86400). 0 disables caching for this call. Omit to use the server's default TTL. |
TDQS
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.
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.
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.
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.
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.
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_manyARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| queries | Yes | 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. | |
| categories | No | Comma-separated SearXNG categories to search (e.g. 'general', 'news', 'images', 'videos', 'science', 'files'). Default is the server's configured category set, typically 'general'. | |
| engines | No | 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. | |
| enabled_engines | No | Comma-separated engine names to enable in addition to the backend defaults. Forwarded as SearXNG's 'enabled_engines' parameter. | |
| disabled_engines | No | Comma-separated engine names to exclude from this query. Forwarded as SearXNG's 'disabled_engines' parameter. | |
| language | No | BCP-47 language hint for SearXNG (e.g. 'en', 'en-US', 'de', 'all'). Default is the server's configured language. | |
| pageno | No | Result page number (1–20, default 1). Use to paginate beyond the first page. | |
| time_range | No | Restrict results to recent content. Valid values: 'day', 'week', 'month', 'year'. Omit for no time filter. | |
| safesearch | No | Safe search level: 0=off, 1=moderate, 2=strict. Omit to use the server default. | |
| max_results | No | 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. | |
| concurrency | No | 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. | |
| ttl | No | Cache TTL override in seconds (0–86400). 0 disables caching for this call. Omit to use the server's default TTL. |
TDQS
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.
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.
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.
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.
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.
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.
6 tool updates
v0.2.0- Changed
fetch_many15 fields changed- changed
Input schema / properties / concurrency / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 16, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / concurrency / descriptionAdded 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." - changed
Input schema / properties / max_excerpt_chars / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 50000, + "minimum": 200, + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / max_excerpt_chars / descriptionAdded 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`." - added
Input schema / properties / max_links / descriptionAdded value: +"Maximum outbound links to surface in the visible output (0–64, default 8). The complete link list is always included in hidden `_meta`." - added
Input schema / properties / max_links / maximumAdded value: +64 - added
Input schema / properties / max_links / minimumAdded value: +0 - changed
Input schema / properties / render_wait_ms / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 15000, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / render_wait_ms / descriptionAdded 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." - added
Input schema / properties / rendered / descriptionAdded 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." - changed
Input schema / properties / ttl / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 86400, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / ttl / descriptionAdded value: +"Cache TTL override in seconds (0–86400). 0 disables caching for this call. Omit to use the server's default TTL." - added
Input schema / properties / urls / descriptionAdded value: +"List of 1–20 absolute http(s) URLs to fetch in parallel. Duplicates are dedupe-d after canonicalisation." - added
Input schema / properties / urls / maxItemsAdded value: +20 - added
Input schema / properties / urls / minItemsAdded value: +1
- Changed
fetch_url13 fields changed- changed
Input schema / properties / max_excerpt_chars / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 50000, + "minimum": 200, + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / max_excerpt_chars / descriptionAdded 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`." - added
Input schema / properties / max_links / descriptionAdded value: +"Maximum outbound links to surface in the visible output (0–64, default 8). The complete link list is always included in hidden `_meta`." - added
Input schema / properties / max_links / maximumAdded value: +64 - added
Input schema / properties / max_links / minimumAdded value: +0 - changed
Input schema / properties / render_wait_ms / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 15000, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / render_wait_ms / descriptionAdded 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." - added
Input schema / properties / rendered / descriptionAdded 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." - changed
Input schema / properties / ttl / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 86400, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / ttl / descriptionAdded value: +"Cache TTL override in seconds (0–86400). 0 disables caching for this call. Omit to use the server's default TTL." - added
Input schema / properties / url / descriptionAdded value: +"Absolute http:// or https:// URL to fetch. Bare domains like 'example.com' are auto-prefixed with https://. Other schemes are rejected." - added
Input schema / properties / url / maxLengthAdded value: +4000 - added
Input schema / properties / url / minLengthAdded value: +4
- Changed
research29 fields changed- added
Input schema / properties / categories / descriptionAdded 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'." - changed
Input schema / properties / concurrency / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 16, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / concurrency / descriptionAdded 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." - added
Input schema / properties / disabled_engines / descriptionAdded value: +"Comma-separated engine names to exclude from this query. Forwarded as SearXNG's 'disabled_engines' parameter." - added
Input schema / properties / enabled_engines / descriptionAdded value: +"Comma-separated engine names to enable in addition to the backend defaults. Forwarded as SearXNG's 'enabled_engines' parameter." - added
Input schema / properties / engines / descriptionAdded 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." - changed
Input schema / properties / fetch_excerpt_chars / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 20000, + "minimum": 200, + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / fetch_excerpt_chars / descriptionAdded 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." - added
Input schema / properties / fetch_limit / descriptionAdded 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." - added
Input schema / properties / fetch_limit / maximumAdded value: +20 - added
Input schema / properties / fetch_limit / minimumAdded value: +1 - added
Input schema / properties / language / descriptionAdded value: +"BCP-47 language hint for SearXNG (e.g. 'en', 'en-US', 'de', 'all'). Default is the server's configured language." - changed
Input schema / properties / max_results / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 50, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / max_results / descriptionAdded 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." - added
Input schema / properties / pageno / descriptionAdded value: +"Result page number (1–20, default 1). Use to paginate beyond the first page." - added
Input schema / properties / pageno / maximumAdded value: +20 - added
Input schema / properties / pageno / minimumAdded value: +1 - added
Input schema / properties / queries / descriptionAdded 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." - added
Input schema / properties / queries / maxItemsAdded value: +10 - added
Input schema / properties / queries / minItemsAdded value: +1 - changed
Input schema / properties / render_wait_ms / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 15000, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / render_wait_ms / descriptionAdded 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." - added
Input schema / properties / rendered / descriptionAdded 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." - changed
Input schema / properties / safesearch / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + 0, + 1, + 2 + ], + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / safesearch / descriptionAdded value: +"Safe search level: 0=off, 1=moderate, 2=strict. Omit to use the server default." - changed
Input schema / properties / time_range / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "day", + "week", + "month", + "year" + ], + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / time_range / descriptionAdded value: +"Restrict results to recent content. Valid values: 'day', 'week', 'month', 'year'. Omit for no time filter." - changed
Input schema / properties / ttl / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 86400, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / ttl / descriptionAdded value: +"Cache TTL override in seconds (0–86400). 0 disables caching for this call. Omit to use the server's default TTL."
- Changed
search19 fields changed- added
Input schema / properties / categories / descriptionAdded 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'." - added
Input schema / properties / disabled_engines / descriptionAdded value: +"Comma-separated engine names to exclude from this query. Forwarded as SearXNG's 'disabled_engines' parameter." - added
Input schema / properties / enabled_engines / descriptionAdded value: +"Comma-separated engine names to enable in addition to the backend defaults. Forwarded as SearXNG's 'enabled_engines' parameter." - added
Input schema / properties / engines / descriptionAdded 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." - added
Input schema / properties / language / descriptionAdded value: +"BCP-47 language hint for SearXNG (e.g. 'en', 'en-US', 'de', 'all'). Default is the server's configured language." - changed
Input schema / properties / max_results / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 50, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / max_results / descriptionAdded 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." - added
Input schema / properties / pageno / descriptionAdded value: +"Result page number (1–20, default 1). Use to paginate beyond the first page." - added
Input schema / properties / pageno / maximumAdded value: +20 - added
Input schema / properties / pageno / minimumAdded value: +1 - added
Input schema / properties / query / descriptionAdded 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." - added
Input schema / properties / query / maxLengthAdded value: +400 - added
Input schema / properties / query / minLengthAdded value: +1 - changed
Input schema / properties / safesearch / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + 0, + 1, + 2 + ], + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / safesearch / descriptionAdded value: +"Safe search level: 0=off, 1=moderate, 2=strict. Omit to use the server default." - changed
Input schema / properties / time_range / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "day", + "week", + "month", + "year" + ], + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / time_range / descriptionAdded value: +"Restrict results to recent content. Valid values: 'day', 'week', 'month', 'year'. Omit for no time filter." - changed
Input schema / properties / ttl / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 86400, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / ttl / descriptionAdded value: +"Cache TTL override in seconds (0–86400). 0 disables caching for this call. Omit to use the server's default TTL."
- Changed
search_and_fetch27 fields changed- added
Input schema / properties / categories / descriptionAdded 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'." - added
Input schema / properties / disabled_engines / descriptionAdded value: +"Comma-separated engine names to exclude from this query. Forwarded as SearXNG's 'disabled_engines' parameter." - added
Input schema / properties / enabled_engines / descriptionAdded value: +"Comma-separated engine names to enable in addition to the backend defaults. Forwarded as SearXNG's 'enabled_engines' parameter." - added
Input schema / properties / engines / descriptionAdded 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." - changed
Input schema / properties / fetch_excerpt_chars / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 20000, + "minimum": 200, + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / fetch_excerpt_chars / descriptionAdded 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." - added
Input schema / properties / fetch_limit / descriptionAdded 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." - added
Input schema / properties / fetch_limit / maximumAdded value: +20 - added
Input schema / properties / fetch_limit / minimumAdded value: +1 - added
Input schema / properties / language / descriptionAdded value: +"BCP-47 language hint for SearXNG (e.g. 'en', 'en-US', 'de', 'all'). Default is the server's configured language." - changed
Input schema / properties / max_results / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 50, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / max_results / descriptionAdded 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." - added
Input schema / properties / pageno / descriptionAdded value: +"Result page number (1–20, default 1). Use to paginate beyond the first page." - added
Input schema / properties / pageno / maximumAdded value: +20 - added
Input schema / properties / pageno / minimumAdded value: +1 - added
Input schema / properties / query / descriptionAdded 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." - added
Input schema / properties / query / maxLengthAdded value: +400 - added
Input schema / properties / query / minLengthAdded value: +1 - changed
Input schema / properties / render_wait_ms / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 15000, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / render_wait_ms / descriptionAdded 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." - added
Input schema / properties / rendered / descriptionAdded 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." - changed
Input schema / properties / safesearch / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + 0, + 1, + 2 + ], + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / safesearch / descriptionAdded value: +"Safe search level: 0=off, 1=moderate, 2=strict. Omit to use the server default." - changed
Input schema / properties / time_range / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "day", + "week", + "month", + "year" + ], + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / time_range / descriptionAdded value: +"Restrict results to recent content. Valid values: 'day', 'week', 'month', 'year'. Omit for no time filter." - changed
Input schema / properties / ttl / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 86400, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / ttl / descriptionAdded value: +"Cache TTL override in seconds (0–86400). 0 disables caching for this call. Omit to use the server's default TTL."
- Changed
search_many21 fields changed- added
Input schema / properties / categories / descriptionAdded 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'." - changed
Input schema / properties / concurrency / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 16, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / concurrency / descriptionAdded 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." - added
Input schema / properties / disabled_engines / descriptionAdded value: +"Comma-separated engine names to exclude from this query. Forwarded as SearXNG's 'disabled_engines' parameter." - added
Input schema / properties / enabled_engines / descriptionAdded value: +"Comma-separated engine names to enable in addition to the backend defaults. Forwarded as SearXNG's 'enabled_engines' parameter." - added
Input schema / properties / engines / descriptionAdded 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." - added
Input schema / properties / language / descriptionAdded value: +"BCP-47 language hint for SearXNG (e.g. 'en', 'en-US', 'de', 'all'). Default is the server's configured language." - changed
Input schema / properties / max_results / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 50, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / max_results / descriptionAdded 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." - added
Input schema / properties / pageno / descriptionAdded value: +"Result page number (1–20, default 1). Use to paginate beyond the first page." - added
Input schema / properties / pageno / maximumAdded value: +20 - added
Input schema / properties / pageno / minimumAdded value: +1 - added
Input schema / properties / queries / descriptionAdded 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." - added
Input schema / properties / queries / maxItemsAdded value: +10 - added
Input schema / properties / queries / minItemsAdded value: +1 - changed
Input schema / properties / safesearch / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + 0, + 1, + 2 + ], + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / safesearch / descriptionAdded value: +"Safe search level: 0=off, 1=moderate, 2=strict. Omit to use the server default." - changed
Input schema / properties / time_range / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "day", + "week", + "month", + "year" + ], + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / time_range / descriptionAdded value: +"Restrict results to recent content. Valid values: 'day', 'week', 'month', 'year'. Omit for no time filter." - changed
Input schema / properties / ttl / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 86400, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / ttl / descriptionAdded value: +"Cache TTL override in seconds (0–86400). 0 disables caching for this call. Omit to use the server's default TTL."
7 tool updates
v0.1.0- First observed
fetch_many - First observed
fetch_url - First observed
health - First observed
research - First observed
search - First observed
search_and_fetch - First observed
search_many
TDQS
Scored across 7 tools
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.
Most tools follow a verb_noun pattern in snake_case (fetch_url, search_many), but 'health' and 'research' deviate slightly. Overall pattern is recognizable.
Seven tools cover the core operations of searching, fetching, and health checking without unnecessary bloat. The count is appropriate for the server's purpose.
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
Related MCP Connectors
Web search API and MCP server for developers building AI agents.
One MCP server for all web data. Scrape, search, crawl, and AI research in one install.
Docs: https://docs.keenable.ai/mcp-server Keenable is a free, remote MCP server that gives agents access to the web index. Search the web with ranked results and date/site filters, then fetch any indexed page as clean markdown. Works out of the box with no account or API key.
Serper MCP — wraps the Serper Google Search API (serper.dev)
Related MCP Servers
- AlicenseBqualityFmaintenanceAn MCP server for connecting agentic systems to search systems via searXNG.1131MIT
- AlicenseNot gradedqualityFmaintenanceAn 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 npm7MIT
- FlicenseAqualityDmaintenanceMCP server that provides a search_web tool to query a self-hosted SearXNG instance and return structured web search results.1-
- FlicenseNot gradedqualityCmaintenanceA 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-