loading…
Search for a command to run...
loading…
Enables AI assistants to perform web searches and read URL content via a SearXNG instance.
Enables AI assistants to perform web searches and read URL content via a SearXNG instance.
An MCP server that integrates the SearXNG API, giving AI assistants web search capabilities.
This fork is published as @kassol/mcp-searxng and includes support for custom outgoing headers via SEARXNG_HEADERS, URL_READER_HEADERS, and their base64 variants.
npm version npm downloads license GitHub repo
Add to your MCP client configuration (e.g. claude_desktop_config.json):
{
"mcpServers": {
"searxng": {
"command": "npx",
"args": ["-y", "@kassol/mcp-searxng"],
"env": {
"SEARXNG_URL": "YOUR_SEARXNG_INSTANCE_URL"
}
}
}
}
Replace YOUR_SEARXNG_INSTANCE_URL with the URL of your SearXNG instance (e.g. https://search.example.com).
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", "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)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 @kassol/mcp-searxng
{
"mcpServers": {
"searxng": {
"command": "mcp-searxng",
"env": {
"SEARXNG_URL": "YOUR_SEARXNG_INSTANCE_URL"
}
}
}
}
docker build -t mcp-searxng:latest -f Dockerfile .
{
"mcpServers": {
"searxng": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "SEARXNG_URL",
"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.
docker-compose.yml:
services:
mcp-searxng:
build:
context: .
dockerfile: Dockerfile
image: 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",
"args": ["compose", "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.
Protected SearXNG instances can receive extra search request headers through SEARXNG_HEADERS_BASE64. This is the recommended format for ChatWise and other MCP clients that treat environment variables as plain key-value fields.
Generate the value directly from existing Cloudflare Access environment variables:
export CF_ACCESS_CLIENT_ID='your-client-id.access'
export CF_ACCESS_CLIENT_SECRET='your-client-secret'
node -e 'console.log(Buffer.from(JSON.stringify({"CF-Access-Client-Id":process.env.CF_ACCESS_CLIENT_ID,"CF-Access-Client-Secret":process.env.CF_ACCESS_CLIENT_SECRET})).toString("base64"))'
Verify the generated value:
export SEARXNG_HEADERS_BASE64='paste-generated-value-here'
node -e 'console.log(Buffer.from(process.env.SEARXNG_HEADERS_BASE64,"base64").toString("utf8"))'
MCP client configuration:
{
"mcpServers": {
"searxng": {
"command": "npx",
"args": ["-y", "@kassol/mcp-searxng"],
"env": {
"SEARXNG_URL": "https://search.example.com",
"SEARXNG_HEADERS_BASE64": "eyJDRi1BY2Nlc3MtQ2xpZW50LUlkIjoieW91ci1jbGllbnQtaWQuYWNjZXNzIiwiQ0YtQWNjZXNzLUNsaWVudC1TZWNyZXQiOiJ5b3VyLWNsaWVudC1zZWNyZXQifQ=="
}
}
}
}
ChatWise environment variables:
SEARXNG_URL=https://search.example.com
USER_AGENT=Mozilla/5.0
SEARXNG_HEADERS_BASE64=paste-generated-value-here
SEARXNG_HEADERS_BASE64 applies only to searxng_web_search requests. Use URL_READER_HEADERS_BASE64 for headers that should be sent by web_url_read.
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
See CONTRIBUTING.md
MIT — see LICENSE for details.
Выполни в терминале:
claude mcp add mcp-searxng -- npx Безопасность
Низкий рискАвтоматическая эвристика по публичным данным — не гарантия безопасности.