A Model Context Protocol Server for SearXNG
Add to Claude Desktop config.json
{
"mcpServers": {
"ihor-sokoliuk-mcp-searxng": {
"command": "node",
"args": [
"~/.mcp/mcp-searxng/index.js"
]
}
}
} Get the source and run locally
git clone https://github.com/ihor-sokoliuk/mcp-searxng.git ~/.mcp/mcp-searxng
cd ~/.mcp/mcp-searxng Private web search for AI assistants — connect any SearXNG instance to Claude, Cursor, and more.
An MCP server that integrates the SearXNG API, giving AI assistants web search capabilities.
✨ Featured in the GitHub MCP Registry.
Add to your MCP client configuration (e.g. claude_desktop_config.json):
{
"mcpServers": {
"searxng": {
"command": "npx",
"args": ["-y", "mcp-searxng"],
"env": {
"SEARXNG_URL": "YOUR_SEARXNG_INSTANCE_URL"
}
}
}
}
Replace YOUR_SEARXNG_INSTANCE_URL with the URL of your SearXNG instance (e.g. https://searxng.example.com).
response_format./autocompleter endpoint./config.min_score.| Brave MCP | Exa MCP | Firecrawl MCP | mcp-searxng | |
|---|---|---|---|---|
| Web Search | ✓ | ✓ | ✓ | ✓ |
| Read URL | ✗ | ✓ | ✓ | ✓ |
| Pagination | ✗ | ✗ | ✓ | ✓ |
| Self-hosted | ✗ | ✗ | Partial | ✓ |
| Privacy | ✗ | ✗ | ✗ | ✓ |
| Free / No API key | ✗ | ✗ | ✗ | ✓ |
mcp-searxng is a standalone MCP server — a separate Node.js process that your AI assistant connects to for web search. It queries any SearXNG instance via its HTTP JSON API.
Not a SearXNG plugin: This project cannot be installed as a native SearXNG plugin. Point it at any existing SearXNG instance by setting
SEARXNG_URL.
AI Assistant (e.g. Claude)
│ MCP protocol
▼
mcp-searxng (this project — Node.js process)
│ HTTP JSON API (SEARXNG_URL)
▼
SearXNG instance
searxng_web_search
query (string): The search query. This string is passed to external search services.pageno (number, optional): Search page number, starts at 1 (default 1)time_range (string, optional): Filter results by time range - one of: “day”, “week”, “month”, “year” (default: none)language (string, optional): Language code for results (e.g., “en”, “fr”, “de”) or “all” (default: “all”)safesearch (number, optional): Safe search filter level (0: None, 1: Moderate, 2: Strict) (default: instance setting)min_score (number, optional): Minimum relevance score from 0.0 to 1.0. Results below this score are filtered out.num_results (number, optional): Maximum number of results to return, from 1 to 20. SEARXNG_MAX_RESULTS applies as an operator ceiling.categories (string, optional): Comma-separated SearXNG categories (e.g. "news", "it,science"). When live /config is available, values are trimmed and normalized case-insensitively to the instance’s canonical category names; unknown values are rejected with available categories listed. If /config is unavailable, values are forwarded as-is with a warning. Default: SearXNG instance default.engines (string, optional): Comma-separated SearXNG engine names (e.g. "google,bing,ddg", "semantic scholar"). When live /config is available, values are trimmed and normalized case-insensitively to canonical engine names, including engines disabled by default; unknown values are rejected with available engines listed. If /config is unavailable, values are forwarded as-is with a warning.response_format (string, optional): Response format, either "text" for formatted agent-readable output or "json" for raw SearXNG JSON with filtered/sliced results. (default: "text")searxng_search_suggestions
query (string): Partial or complete query to autocomplete.language (string, optional): Language code for suggestions (e.g., “en”, “fr”, “de”) or “all” (default: “all”)searxng_instance_info
includeEngines (boolean, optional): Include enabled engine names in the response. (default: false)includeDisabled (boolean, optional): Include disabled engine names when includeEngines is true. (default: false)category (string, optional): Filter categories and engines to a single category name.refresh (boolean, optional): Bypass the process cache and fetch fresh /config data. (default: false)web_url_read
url (string): The URL to fetch and processstartChar (number, optional): Starting character position for content extraction (default: 0)maxLength (number, optional): Maximum number of characters to returnsection (string, optional): Extract content under a specific heading (searches for heading text)paragraphRange (string, optional): Return specific paragraph ranges (e.g., ‘1-5’, ‘3’, ‘10-’)readHeadings (boolean, optional): Return only a list of headings instead of full contentnpm install -g mcp-searxng
{
"mcpServers": {
"searxng": {
"command": "mcp-searxng",
"env": {
"SEARXNG_URL": "YOUR_SEARXNG_INSTANCE_URL"
}
}
}
}
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.
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.yml:
services:
mcp-searxng:
image: isokoliuk/mcp-searxng:latest
stdin_open: true
environment:
- SEARXNG_URL=YOUR_SEARXNG_INSTANCE_URL
# Add optional variables as needed — see CONFIGURATION.md
MCP client config:
{
"mcpServers": {
"searxng": {
"command": "docker-compose",
"args": ["run", "--rm", "mcp-searxng"]
}
}
}
By default the server uses STDIO. Set MCP_HTTP_PORT to enable HTTP mode:
{
"mcpServers": {
"searxng-http": {
"command": "mcp-searxng",
"env": {
"SEARXNG_URL": "YOUR_SEARXNG_INSTANCE_URL",
"MCP_HTTP_PORT": "3000"
}
}
}
}
Endpoints: POST/GET/DELETE /mcp (MCP protocol), GET /health (health check)
Test it:
MCP_HTTP_PORT=3000 SEARXNG_URL=http://localhost:8080 mcp-searxng
curl http://localhost:3000/health
Set SEARXNG_URL to your SearXNG instance URL. All other variables are optional.
Full environment variable reference: CONFIGURATION.md
Your SearXNG instance likely has JSON format disabled. Edit settings.yml (usually /etc/searxng/settings.yml):
search:
formats:
- html
- json
Restart SearXNG (docker restart searxng) then verify:
curl 'http://localhost:8080/search?q=test&format=json'
You should receive a JSON response. If not, confirm the file is correctly mounted and YAML indentation is valid.
See also: SearXNG settings docs · discussion
If you must use a public instance you don’t control and it rejects format=json (the 403 above), set the opt-in flag instead of editing the server:
"SEARXNG_HTML_FALLBACK": "true"
A search that gets a 403/404 or a non-JSON response is then retried automatically without format=json and parsed from the regular HTML results page.
sourceFormat: "html" in JSON mode, and text mode adds the line “Note: Results parsed from SearXNG HTML fallback; metadata is limited.” Relevance scores and engine names are not available from HTML.429), auth (401), or 5xx — the original error is surfaced unchanged. The fallback only triggers on 403/404/non-JSON, never on auth or network errors.Enabling JSON on an instance you control (above) remains the recommended setup — the fallback is a compatibility aid, not a replacement.
See CONTRIBUTING.md
MIT — see LICENSE for details.
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Search ArXiv research papers
Discover, extract, and interact with the web - one interface powering automated access across the public internet.
Web search using free multi-engine search (NO API KEYS REQUIRED) — Supports Bing, Baidu, DuckDuckGo, Brave, Exa, and CSDN.
Web search using DuckDuckGo
Web search capabilities using Brave's Search API