About SearXNG MCP Server
SearXNG MCP Server connects MCP clients to SearXNG for web search and URL reading, using an instance operated or trusted by the user. It provides filters, pagination, and multiple transport and deployment options; a separate SearXNG instance with JSON search enabled is required.
Key features
- 01Web search with filters and pagination
- 02Read web pages and bounded PDF text
- 03Query suggestions and instance inspection
- 04Optional replica failover and caching
- 05STDIO and Streamable HTTP transports
- 06Static bearer and optional OAuth protection
Use cases
- 01Let an AI assistant search the web
- 02Read and extract text from a known URL
- 03Inspect categories and engines of a SearXNG instance
- 04Connect search through a local or HTTP service
MCP support
The MCP server connects MCP clients to SearXNG and exposes web search, query suggestions, instance inspection, and URL-reading tools. Clients can launch it over STDIO or connect to an independently running HTTP service.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
npx -y mcp-searxngSEARXNG_URLSecretURL of your SearXNG instanceAUTH_USERNAMESecretLegacy global SearXNG Basic Auth usernameAUTH_PASSWORDSecretLegacy global SearXNG Basic Auth passwordLocal servers need a runtime on your machine (e.g. Node.js 18+). Config file locations differ by client; see your client’s docs.
Tools
4Saved tool list · updated 3w ago
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | Yes | The search query string. This is the required parameter name — use exactly `query`, not `prompt` or `q`. |
| pageno | integer | No | Search page number (starts at 1) |
| engines | string | No | Comma-separated SearXNG engine names to query (e.g. 'google,bing,ddg'). Live /config capabilities are aggregated across reachable instances; prefer searxng_instance_info engines.common.enabled for consistent multi-instance results. Values in engines.available.enabled are best-effort and may only be honored by some instances. Known values are normalized case-insensitively; unknown values are forwarded trimmed so SearXNG can ignore or honor them. If /config is unavailable, values are forwarded as-is with a warning. If omitted, each instance uses its server-side default. |
| language | string | No | Language code for search results (e.g., 'en', 'fr', 'de'). Default is instance-dependent. |
| min_score | number | No | Minimum relevance score threshold from 0.0 to 1.0. Results below this score are filtered out. |
| categories | string | No | Comma-separated SearXNG categories. Live /config capabilities are aggregated across reachable instances; prefer searxng_instance_info categories.common for consistent multi-instance results. Values in categories.available are best-effort and may only be honored by some instances. Known values are normalized case-insensitively; unknown values are forwarded trimmed so SearXNG can ignore or honor them. If /config is unavailable, values are forwarded as-is with a warning. If omitted, each instance uses its server-side default. |
| safesearch | enum | No | Safe search filter level (0: None, 1: Moderate, 2: Strict)0 | 1 | 2 |
| time_range | enum | No | Time range of search (day, week, month, year). With explicit engines, all selected engines must confirm time_range_support=true via /config.day | week | month | year |
| num_results | number | No | Maximum number of results to return (1-20). Operator cap SEARXNG_MAX_RESULTS applies as a ceiling. |
| result_detail | enum | No | Result detail: full preserves SearXNG metadata and search signals; compact returns only title, URL, and content-snippet fields for each result (JSON keys: title, url, content). If omitted, full is used.compact | full |
| response_format | enum | No | Response format: formatted text for agents or raw JSON for programmatic clients. If omitted, SEARXNG_DEFAULT_RESPONSE_FORMAT applies; if unset or invalid, text is used. An explicit response_format always takes precedence.text | json |
Details
From the project README🔍 SearXNG MCP Server
Privacy-respecting web search for AI assistants — use an operator-controlled or trusted SearXNG instance with Claude, Cursor, and more.
An MCP server that integrates the SearXNG API, giving AI assistants web search capabilities.
✨ Featured in the GitHub MCP Registry.
Quick Start
You need an existing SearXNG instance with JSON search enabled. This project connects an MCP client to SearXNG; it does not install SearXNG. Use an instance you operate or trust. Start with the self-hosted or public-instance guide if needed.
Choose how to connect:
| Your setup | Start here |
|---|---|
| Client starts the server locally | Install Node.js 22 or later, then use the NPX example below or your client recipe. |
| Client starts a Docker container | Use the Docker/STDIO recipe in Installation. |
| You have an independently running HTTP service | Use your client's HTTP recipe with the full /mcp URL. |
| You need to operate an HTTP service | Follow the HTTP server guide. |
For clients using mcpServers JSON (such as Claude Desktop), add:
{
"mcpServers": {
"searxng": {
"command": "npx",
"args": ["-y", "mcp-searxng"],
"env": { "SEARXNG_URL": "https://search.example.com" }
}
}
}
Replace the example URL with your SearXNG base URL. Other clients use different
configuration shapes: choose your client recipe.
Leave MCP_HTTP_PORT unset for local STDIO. Docker also needs environment
forwarding into the container.
Reload the client, inspect its MCP tool inventory, then ask it to search for
SearXNG documentation. A simple tool call is
searxng_web_search with {"query":"SearXNG"}. Discovery alone does not
test SearXNG connectivity. If the call fails, start with
troubleshooting.
Features
- Search with pagination, filters, direct answers and full or compact text/JSON output.
- Read HTML, structured text and bounded PDF text; inspect headings or selected sections.
- Discover instance capabilities and get query suggestions.
- Optional replica failover/fan-out, HTML fallback, caching, proxies and browser solvers.
- Local STDIO or Streamable HTTP, with static bearer and optional OAuth protection.
See the tool guide for capabilities and limits, configuration reference for settings, and historical deployment measurements for bounded resource-planning evidence.
Why mcp-searxng?
Capability comparison recorded on 2026-07-29
As of 2026-07-29, the capability comparison below reflects the official Brave MCP, Exa MCP, and Firecrawl MCP projects. “Pagination” means an exposed page or offset control. “Self-hosted” means the search service can run under your control. “Free / No API key” means this MCP server does not require a paid search-vendor API key; you still operate or select the underlying SearXNG instance.
| Brave MCP | Exa MCP | Firecrawl MCP | mcp-searxng | |
|---|---|---|---|---|
| Web Search | ✓ | ✓ | ✓ | ✓ |
| Read URL | ✗ | ✓ | ✓ | ✓ |
| Pagination | ✓ | ✗ | ✓ | ✓ |
| Self-hosted | ✗ | ✗ | Partial | ✓ |
| Free / No API key | ✗ | ✗ | ✗ | ✓ |
Privacy depends on the SearXNG deployment. An operator-controlled instance can avoid trusting a third-party search operator, while a public instance receives the query and may log it. SearXNG and this MCP integration do not by themselves provide anonymity.
How It Works
MCP client → mcp-searxng → SearXNG → search engines
The client either starts its own STDIO process or connects to an HTTP service.
SEARXNG_URL identifies the SearXNG service, not the MCP endpoint. URL reading
fetches the selected website directly. A semicolon-separated replica list is
supported for interchangeable SearXNG deployments; see
replica configuration.
STDIO is the default. Legacy Streamable HTTP sessions are stateful by default:
clients should send DELETE /mcp when finished, then reinitialize if a later
request receives HTTP 404 for the terminated session. Modern HTTP requests and
the MCP_HTTP_STATELESS=true legacy mode are sessionless; see
HTTP transport configuration.
Tools
| Tool | Use it to |
|---|---|
searxng_web_search | Find sources and refine results |
searxng_search_suggestions | Complete or refine a query |
searxng_instance_info | Inspect categories, engines and defaults |
web_url_read | Read a known URL as text/Markdown |
The tool guide contains examples and the full parameter reference. The optional research workflow explains how to inspect sources and cite evidence.
Installation
The project-maintained distribution methods are npm (including npx) and Docker. Additional package formats, including Nix, can be maintained separately by the community.
For NPX and npm installs, Node.js 22 or later is required. The Docker image includes its Node.js runtime.
NPM (global install)
npm install -g mcp-searxng
{
"mcpServers": {
"searxng": {
"command": "mcp-searxng",
"env": {
"SEARXNG_URL": "YOUR_SEARXNG_INSTANCE_URL"
}
}
}
}
Docker
Pre-built image:
docker pull isokoliuk/mcp-searxng:latest
Image signatures can be verified with Cosign — see SECURITY.md for instructions.
{
"mcpServers": {
"searxng": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "SEARXNG_URL",
"isokoliuk/mcp-searxng:latest"
],
"env": {
"SEARXNG_URL": "YOUR_SEARXNG_INSTANCE_URL"
}
}
}
}
To pass additional env vars, add -e VAR_NAME to args and the variable to env.
For browser-solver integration, pass FLARESOLVERR_URL, BYPARR_URL, or both
and make the configured services reachable from this container. Dual mode has
a fixed FlareSolverr-first order and no automatic reverse failover. Safe rendered
HTML and explicit Byparr PDF content are read directly; ambiguous content uses
guarded replay, with bounded failover for eligible read failures. See
URL Reader Controls for the complete
behavior and Docker Compose example.
Build locally:
docker build -t mcp-searxng:latest -f Dockerfile .
Use the same config above, replacing isokoliuk/mcp-searxng:latest with mcp-searxng:latest.
Docker Compose
docker-compose.yml:
services:
mcp-searxng:
image: isokoliuk/mcp-searxng:latest
stdin_open: true
environment:
- SEARXNG_URL=${SEARXNG_URL:?Set SEARXNG_URL in the environment}
# Add optional variables as needed — see CONFIGURATION.md
The tracked Compose file is intentionally STDIO-only and publishes no network ports; MCP clients launch it with an absolute Compose-file path and docker compose run --rm -T, not docker compose up. The -T flag prevents pseudo-TTY allocation so MCP JSON-RPC stays on raw standard input and output. Compose fails before launch unless the MCP client supplies SEARXNG_URL.
MCP client config:
{
"mcpServers": {
"searxng": {
"command": "docker",
"args": [
"compose",
"-f", "/absolute/path/to/docker-compose.yml",
"run", "--rm", "-T", "mcp-searxng"
],
"env": {
"SEARXNG_URL": "YOUR_SEARXNG_INSTANCE_URL"
}
}
}
}
If you previously used the tracked file as an HTTP service on port 8080, put the HTTP settings in an untracked docker-compose.override.yml:
services:
mcp-searxng:
ports:
- "127.0.0.1:8080:8080"
environment:
- MCP_HTTP_PORT=8080
- MCP_HTTP_HOST=0.0.0.0
Here 0.0.0.0 is the container-side bind address; the host-side port remains loopback-only. This override has no authentication and is only a temporary single-host migration path. Before adding co-located containers or exposing the service beyond the local machine, follow the hardened deployment guidance.
HTTP Transport
Run HTTP independently, then connect the client. See the HTTP server guide for local checks, static bearer authentication, OAuth requirements and deployment verification.
Configuration
For the default local setup, SEARXNG_URL is the required setting. Optional
modes such as hardened HTTP and OAuth have companion requirements. Use the
configuration reference for environment variables,
defaults, caching, timeouts, proxies, TLS, and limits.
Optional MCP OAuth
An HTTP deployment can use OAuth with an external authorization provider. See authentication choices. Static bearer authentication and SearXNG Basic Auth protect different connections.
Troubleshooting
| Symptom | Next check |
|---|---|
| Server absent or disconnected | Client/process startup |
| HTTP auth, session or proxy error | HTTP connection |
| Tools appear but search fails | SearXNG connection |
| Empty, poor or stale results | Filters, upstream metadata and cache |
| URL/PDF failure or timeout | URL reading |
403 Forbidden from SearXNG
JSON output may be disabled, or an access-control layer may have denied the request. Follow the direct checks before changing settings. A working browser page does not prove the JSON API works.
Can't enable JSON? (HTML fallback)
SEARXNG_HTML_FALLBACK=true can retry 403/404/non-JSON search responses as HTML.
Parsing is best-effort and metadata is limited; compact output omits fallback
markers. Read the public-instance guidance
before enabling it on a service you do not control.
For a bug report, collect a minimal reproduction and relevant errors.
Documentation
Configure search for useful coverage with tested upstream settings, specialist engine routes and MCP output controls. The deployment recipe includes a private Compose stack and optional browser providers, with dated results and known failures.
Find a guide by task. These links open current main-branch documentation. Unreleased behavior is labeled; consult the matching Git tag when investigating an older version.
Contributing
See CONTRIBUTING.md.
License
MIT — see LICENSE for details.
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.