SearXNG Server
🔍 Servidor MCP de SearXNG
Búsqueda web que respeta la privacidad para asistentes de IA: usa una instancia de SearXNG controlada por el operador o de confianza con Claude, Cursor y más.
Un servidor MCP que integra la API de SearXNG, brindando capacidades de búsqueda web a los asistentes de IA.
✨ Destacado en el Registro MCP de GitHub.
Inicio rápido
Añade a la configuración de tu cliente MCP (por ejemplo, claude_desktop_config.json):
{
"mcpServers": {
"searxng": {
"command": "npx",
"args": ["-y", "mcp-searxng"],
"env": {
"SEARXNG_URL": "YOUR_SEARXNG_INSTANCE_URL"
}
}
}
}Reemplaza YOUR_SEARXNG_INSTANCE_URL con la URL de tu instancia de SearXNG (por ejemplo, https://searxng.example.com). También puedes proporcionar réplicas intercambiables como una lista separada por punto y coma, por ejemplo, https://one.example.com;https://two.example.com.
Para recetas verificadas de Claude Desktop, Claude Code, Codex CLI, Cursor, VS Code, Windsurf, Cline y OpenCode, consulta el libro de cocina de configuraciones de cliente MCP.
Para un método acotado y neutral al cliente de buscar, inspeccionar fuentes, verificar afirmaciones y citar evidencia, consulta el flujo de trabajo de investigación centrado en evidencia.
Para puntos de partida medidos de CPU y memoria del proceso MCP, consulta perfiles de despliegue medidos.
Related MCP server: SearXNG MCP Server
Características
Búsqueda web: Consultas generales, de noticias y de artículos con paginación, filtros de rango de tiempo/idioma/búsqueda segura, filtrado por relevancia (
min_score) y salida en texto formateado o JSON sin procesar seleccionada por llamada (response_format) o con el valor predeterminado del operador (SEARXNG_DEFAULT_RESPONSE_FORMAT).Conmutación por error y fan-out de instancias: Configura réplicas intercambiables de SearXNG en
SEARXNG_URL; las búsquedas fallan en orden por defecto, o consulta todas las réplicas saludables en paralelo y combina los resultados conSEARXNG_FANOUT.Respuestas directas y metadatos: Los resultados de texto muestran respuestas, correcciones, sugerencias e infoboxes de SearXNG antes de la lista de resultados.
Sugerencias de búsqueda: Autocompletado de consultas mediante el endpoint
/autocompleterde SearXNG.Descubrimiento de capacidades de la instancia: Inspecciona categorías, motores, valores predeterminados, locales y complementos configurados desde
/config.Lectura de contenido de URL: Conversión a Markdown consciente del tipo de contenido, incluida la extracción de texto PDF acotada, con paginación, filtrado de secciones, rangos de párrafos y extracción de encabezados.
Soporte de solucionador de navegador: Para cada URL no almacenada en caché que pase la validación estática de URL y la verificación previa de tamaño HEAD, opcionalmente adquiere una sesión de navegador de FlareSolverr, Byparr o ambos, y luego reproduce el user-agent devuelto y las cookies con alcance a través del lector de URL acotado. En el modo de doble proveedor, FlareSolverr siempre es el principal y Byparr solo se intenta después de un principal ocupado o no disponible temporalmente. FlareSolverr 3.5.0 y Byparr 2.1.0 fueron verificados el 2026-07-30.
Caché inteligente: Tanto los resultados de búsqueda como el contenido de URL se almacenan en caché en memoria con TTL configurable y expulsión de menos utilizados recientemente (LFU), lo que reduce solicitudes redundantes.
Protección SSRF:
web_url_readbloquea URLs privadas/internas y redirecciones por defecto en todos los modos de transporte.Transporte HTTP: Modo HTTP Streamable opcional del SDK MCP v2 con endurecimiento opcional, limitación de velocidad y compatibilidad sin estado acotada para despliegues sin servidor o escalados horizontalmente. Las solicitudes modernas del 2026-07-28 y los clientes heredados retenidos comparten la misma superficie de herramientas y recursos.
Respaldo HTML: Opcionalmente analiza resultados de la página HTML para instancias públicas que rechazan
format=json.Modo de herramientas ligeras: Esquemas de herramientas mínimos para modelos locales con ventanas de contexto pequeñas.
Soporte de proxy: Proxies HTTP/HTTPS globales o por herramienta para el tráfico de búsqueda y lectura de URL.
Las imágenes verificadas linux/amd64 provienen de manifiestos multiarquitectura
ghcr.io/flaresolverr/flaresolverr:v3.5.0@sha256:139dfee1c6f89249c8d665d1333a42e8ec74ec0a86bc6bb1c8461e10d3a66a47
y
ghcr.io/thephaseless/byparr:2.1.0@sha256:01a46a2865d9a6db5eb8ead04ec0dd33b8fbe233e8565ae70b50d4cc0af4cfb0.
La cancelación del cliente detiene el trabajo local rápidamente, pero un navegador remoto puede
continuar hasta su tiempo de espera de proveedor configurado después de que el cliente HTTP se desconecte.
Consulta verificación del solucionador de navegador.
¿Por qué mcp-searxng?
A partir del 2026-07-29, la comparación de capacidades a continuación refleja los proyectos oficiales Brave MCP, Exa MCP y Firecrawl MCP. "Paginación" significa un control de página o desplazamiento expuesto. "Autoalojado" significa que el servicio de búsqueda puede ejecutarse bajo tu control. "Gratis / Sin clave API" significa que este servidor MCP no requiere una clave API de un proveedor de búsqueda de pago; aún así operas o seleccionas la instancia de SearXNG subyacente.
Brave MCP | Exa MCP | Firecrawl MCP | mcp-searxng | |
Búsqueda web | ✓ | ✓ | ✓ | ✓ |
Leer URL | ✗ | ✓ | ✓ | ✓ |
Paginación | ✓ | ✗ | ✓ | ✓ |
Autoalojado | ✗ | ✗ | Parcial | ✓ |
Gratis / Sin clave API | ✗ | ✗ | ✗ | ✓ |
La privacidad depende del despliegue de SearXNG. Una instancia controlada por el operador puede evitar confiar en un operador de búsqueda de terceros, mientras que una instancia pública recibe la consulta y puede registrarla. SearXNG y esta integración MCP no proporcionan anonimato por sí mismos.
Cómo funciona
mcp-searxng es un servidor MCP independiente: un proceso Node.js separado al que tu asistente de IA se conecta para la búsqueda web. Consulta una instancia de SearXNG, o una lista separada por punto y coma de réplicas intercambiables de SearXNG, a través de la API JSON HTTP.
No es un complemento de SearXNG: Este proyecto no se puede instalar como un complemento nativo de SearXNG. Apúntalo a cualquier instancia existente de SearXNG, o a una lista de réplicas intercambiables, configurando
SEARXNG_URL.
AI Assistant (e.g. Claude)
│ MCP protocol
▼
mcp-searxng (this project — Node.js process)
│ HTTP JSON API (SEARXNG_URL)
▼
SearXNG instance(s)Para el despliegue, configuración y solución de problemas de SearXNG, consulta Operación de SearXNG autoalojado con mcp-searxng.
Herramientas
searxng_web_search
Ejecuta búsquedas web con paginación
Entradas:
query(cadena): La consulta de búsqueda. Esta cadena se pasa a los servicios de búsqueda externos.pageno(número, opcional): Número de página de búsqueda, comienza en 1 (por defecto 1)time_range(cadena, opcional): Filtra los resultados por rango de tiempo: uno de: "day", "week", "month", "year" (por defecto: ninguno)language(cadena, opcional): Código de idioma para los resultados (p. ej., "en", "fr", "de") o "all" (por defecto: "all")safesearch(enumeración de cadena, opcional): Nivel del filtro de búsqueda segura, uno de"0"(Ninguno),"1"(Moderado) o"2"(Estricto). Los valores numéricos heredados0,1y2todavía se aceptan por compatibilidad con versiones anteriores. (por defecto: configuración de la instancia)min_score(número, opcional): Puntuación de relevancia mínima de 0.0 a 1.0. Los resultados por debajo de esta puntuación se filtran.num_results(número, opcional): Número máximo de resultados a devolver, de 1 a 20.SEARXNG_MAX_RESULTSse aplica como límite máximo del operador.categories(cadena, opcional): Categorías de SearXNG separadas por comas (p. ej.,"news","it,science"). Las capacidades en vivo de/configse agregan entre las instancias alcanzables; prefieresearxng_instance_infocategories.commonpara obtener resultados coherentes en múltiples instancias. Los valores conocidos se recortan y normalizan sin distinguir mayúsculas de minúsculas; los valores desconocidos se reenvían recortados para que SearXNG pueda ignorarlos u honrarlos. Si/configno está disponible, los valores se reenvían tal cual con una advertencia. Si se omite, cada instancia usa su valor predeterminado del lado del servidor.engines(cadena, opcional): Nombres de motores de SearXNG separados por comas (p. ej.,"google,bing,ddg","semantic scholar"). Las capacidades en vivo de/configse agregan entre las instancias alcanzables; prefieresearxng_instance_infoengines.common.enabledpara obtener resultados coherentes en múltiples instancias. Los valores conocidos se recortan y normalizan sin distinguir mayúsculas de minúsculas, incluidos los motores deshabilitados por defecto; los valores desconocidos se reenvían recortados para que SearXNG pueda ignorarlos u honrarlos. Si/configno está disponible, los valores se reenvían tal cual con una advertencia. Si se omite, cada instancia usa su valor predeterminado del lado del servidor.response_format(cadena, opcional): Formato de respuesta, ya sea"text"para una salida formateada legible por el agente o"json"para el JSON crudo de SearXNG conresultsfiltrados/rebanados. Si se omite, se aplicaSEARXNG_DEFAULT_RESPONSE_FORMAT; si no está configurado o es inválido, se usatext. Unresponse_formatexplícito siempre tiene prioridad.result_detail(cadena, opcional):"full"(el valor predeterminado) conserva los metadatos de SearXNG, advertencias, procedencia, respuestas, infoboxes, correcciones y sugerencias."compact"devuelve solo el título, la URL y la descripción/fragmento de contenido de cada resultado; el JSON compacto usa exactamente las clavestitle,urlycontent. Usafullcuando esas señales de investigación importen.Los clientes que envían explícitamente o autoinyectan
response_format=textcontinúan anulando el valor predeterminado del operador. Si las llamadas omitidas aún devuelven texto después de configurar JSON, inspecciona los argumentos emitidos por el cliente MCP.
Migración: el texto compacto tiene exactamente tres líneas por resultado y sin anotación de caché ni preámbulo. Actualiza los analizadores de líneas que esperan puntuaciones de relevancia o metadatos de búsqueda para solicitar
result_detail="full"(o acepta los registros de tres líneas del formato compacto).El formato compacto suprime deliberadamente advertencias, procedencia y cualquier otra señal de búsqueda. El texto completo puede añadir líneas opcionales válidas en orden fijo: puntuación, motores, categoría, fecha de publicación, miniatura, fuente de imagen; los metadatos opcionales inválidos se omiten. Los campos de texto se normalizan a líneas individuales.
SEARXNG_MAX_RESULT_CHARStrunca el contenido de los resultados en las respuestas de texto y JSON compactas y completas, incluido el JSON completo para los usuarios existentes que ya configuraron la variable; el texto compacto normaliza los separadores de línea antes de aplicar el límite, mientras que el JSON limita el valor de cadena original.Con
SEARXNG_LITE_TOOLS=true, el esquema Lite sigue siendo solo de consulta, pero las anulaciones opcionales proporcionadas explícitamente, comoresponse_formatyresult_detail, todavía se validan y se respetan.searxng_search_suggestions
Obtiene sugerencias de autocompletado para refinar las consultas de búsqueda
Entradas:
query(cadena): Consulta parcial o completa para autocompletar.language(cadena, opcional): Código de idioma para las sugerencias (p. ej., "en", "fr", "de") o "all" (por defecto: "all")
searxng_instance_info
Descubre categorías agregadas de las instancias de SearXNG configuradas y alcanzables, opcionalmente incluye nombres de motores, e inspecciona valores predeterminados, configuraciones regionales y complementos de la instancia principal alcanzable. Las categorías—y los motores cuando se solicitan—informan los valores
commonpresentes en cada instancia alcanzable y los valoresavailablepresentes en al menos una instancia alcanzable.Entradas:
includeEngines(booleano, opcional): Incluye los nombres de los motores habilitados en la respuesta. (por defecto: false)includeDisabled(booleano, opcional): Incluye los nombres de los motores deshabilitados cuandoincludeEngineses true. (por defecto: false)category(cadena, opcional): Filtra categorías y motores a un solo nombre de categoría.refresh(booleano, opcional): Omite la caché del proceso y obtiene datos frescos de/config. (por defecto: false)
web_url_read
Lee el contenido de una URL como markdown con manejo consciente del tipo de contenido y opciones avanzadas de extracción
Contenido legible compatible:
HTML (
text/html,application/xhtml+xml) se convierte a markdownJSON (
application/json,*+json) se imprime de forma legible en un bloque delimitadoTexto plano, YAML, TOML, XML y otras respuestas seguras explícitas de
text/*se devuelven como texto delimitado legibleEl texto de PDF (
application/pdf) se extrae en un trabajador con límite de recursos para documentos de hasta 500 páginasLos tipos de contenido faltantes o genéricos se leen bajo el límite de tamaño existente; los cuerpos no binarios continúan a través de la ruta de conversión de HTML a markdown por compatibilidad
La entrada de PDF y el texto extraído están limitados cada uno al menor de
URL_READ_MAX_CONTENT_LENGTH_BYTESy 16 MiB. No se admite OCR, y los PDF escaneados/solo imagen o protegidos con contraseña devuelven una breve explicación.Una respuesta declarada como PDF debe comenzar con la firma
%PDF-; un desajuste generalmente indica una página intersticial o de error servida con el tipo de contenido incorrecto.El análisis de PDF tiene un presupuesto de trabajador separado de 30 segundos después de que se descarga el cuerpo de la respuesta. En la ruta directa, la obtención de red y el análisis toman como máximo el presupuesto de obtención configurado más 30 segundos; el tiempo de pre-vuelo y adquisición del solucionador de navegador configurado es adicional.
Como máximo dos extracciones de PDF se ejecutan simultáneamente por proceso MCP. No hay cola; las lecturas concurrentes adicionales devuelven un mensaje de ocupado y pueden reintentarse.
Otras descargas binarias, multimedia, de archivo y de flujo de octetos se rechazan intencionalmente con una breve pista en lugar de devolver bytes crudos
Cuando
FLARESOLVERR_URLoBYPARR_URLestá configurado, una URL no almacenada en caché se valida y se verifica mediante el pre-vuelo de tamaño HEAD antes de quemcp-searxngintente la adquisición de sesión del navegador. Con ambos configurados, se intenta FlareSolverr primero y Byparr solo se intenta después de una ranura ocupada, fallo de red/tiempo de espera, HTTP 408/429/5xx, o respuesta malformada/sobredimensionada. Los 4xx persistentes del proveedor, la cancelación, el fallo de validación del host de solución y el estado objetivo no-2xx resuelto detienen la cadena. Si cada proveedor configurado está ocupado o no disponible, se ejecuta una obtención directa no almacenada en caché. Cada proveedor intentado recibe la URL objetivo original; el éxito del desafío no está garantizado.En los límites predeterminados, el modo de doble proveedor tiene un máximo aditivo de 150 segundos a través del pre-vuelo HEAD inicial, ambos intentos del solucionador (incluido el período de gracia de respuesta) y la obtención directa final.
Entradas:
url(cadena): La URL a obtener y procesarstartChar(número, opcional): Posición de carácter inicial para la extracción de contenido (por defecto: 0)maxLength(número, opcional): Número máximo de caracteres a devolversection(cadena, opcional): Extrae contenido bajo un encabezado específico (busca texto de encabezado)paragraphRange(cadena, opcional): Devuelve rangos de párrafos específicos (p. ej., '1-5', '3', '10-')readHeadings(booleano, opcional): Devuelve solo una lista de encabezados en lugar del contenido completo
Instalación
Se requiere Node.js 22 o posterior.
npm install -g mcp-searxng{
"mcpServers": {
"searxng": {
"command": "mcp-searxng",
"env": {
"SEARXNG_URL": "YOUR_SEARXNG_INSTANCE_URL"
}
}
}
}Imagen precompilada:
docker pull isokoliuk/mcp-searxng:latestLas firmas de imagen se pueden verificar con Cosign — consulta SECURITY.md para obtener instrucciones.
{
"mcpServers": {
"searxng": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "SEARXNG_URL",
"isokoliuk/mcp-searxng:latest"
],
"env": {
"SEARXNG_URL": "YOUR_SEARXNG_INSTANCE_URL"
}
}
}
}Para pasar variables de entorno adicionales, añade -e VAR_NAME a args y la variable a env.
Para la integración con el solucionador de navegador, pasa FLARESOLVERR_URL, BYPARR_URL o ambos
y haz que los servicios configurados sean alcanzables desde este contenedor. El modo dual tiene
un orden fijo de FlareSolverr primero y sin conmutación por error inversa automática. Consulta
Controles del lector de URL para conocer el comportamiento
completo y el ejemplo de Docker Compose.
Compilar localmente:
docker build -t mcp-searxng:latest -f Dockerfile .Usa la misma configuración anterior, reemplazando isokoliuk/mcp-searxng:latest con mcp-searxng:latest.
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.mdEl archivo Compose rastreado es intencionalmente solo STDIO y no publica puertos de red; los clientes MCP lo lanzan con una ruta absoluta al archivo Compose y docker compose run --rm -T, no docker compose up. La bandera -T evita la asignación de pseudo-TTY para que el JSON-RPC de MCP permanezca en la entrada y salida estándar crudas. Compose falla antes del lanzamiento a menos que el cliente MCP proporcione SEARXNG_URL.
Configuración del cliente MCP:
{
"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"
}
}
}
}Si anteriormente usaste el archivo rastreado como un servicio HTTP en el puerto 8080, coloca la configuración HTTP en un docker-compose.override.yml no rastreado:
services:
mcp-searxng:
ports:
- "127.0.0.1:8080:8080"
environment:
- MCP_HTTP_PORT=8080
- MCP_HTTP_HOST=0.0.0.0Aquí 0.0.0.0 es la dirección de enlace del lado del contenedor; el puerto del lado del host permanece solo de bucle local. Esta anulación no tiene autenticación y es solo una ruta de migración temporal de un solo host. Antes de añadir contenedores co-ubicados o exponer el servicio más allá de la máquina local, sigue la guía de implementación reforzada.
Por defecto, el servidor usa STDIO, lanzado por tu cliente MCP. Para usar HTTP en su lugar, ejecuta mcp-searxng como un proceso independiente con MCP_HTTP_PORT configurado. En este modo sirve el protocolo MCP sobre HTTP y no habla STDIO, por lo que tu cliente se conecta a él por URL en lugar de generarlo.
Iniciar el servidor:
MCP_HTTP_PORT=3000 SEARXNG_URL=http://localhost:8080 mcp-searxngO con Docker (enlaza a todas las interfaces para que el puerto sea alcanzable desde el host):
docker run --rm -p 3000:3000 \
--add-host=host.docker.internal:host-gateway \
-e MCP_HTTP_PORT=3000 -e MCP_HTTP_HOST=0.0.0.0 \
-e SEARXNG_URL=http://host.docker.internal:8080 \
isokoliuk/mcp-searxng:latestEl mapeo --add-host permite que el contenedor alcance una instancia de SearXNG en el host a través de host.docker.internal; se resuelve automáticamente en Docker Desktop pero necesita esta bandera en Linux nativo. Apunta SEARXNG_URL a tu instancia real si se ejecuta en otro lugar.
Conecta un cliente MCP compatible con HTTP al endpoint /mcp por URL:
{
"mcpServers": {
"searxng-http": {
"type": "streamable-http",
"url": "http://localhost:3000/mcp"
}
}
}Soporte de protocolo: HTTP y STDIO sirven el MCP moderno 2026-07-28 y las revisiones heredadas retenidas 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05 y 2024-10-07. El HTTP moderno es sin sesión POST /mcp; el HTTP heredado permanece con estado por defecto (POST/GET/DELETE /mcp) o usa el modo sin estado existente solo POST.
Endpoints: POST /mcp moderno; POST/GET/DELETE /mcp heredado en el valor predeterminado con estado, o POST /mcp heredado solo con el modo sin estado; GET /health.
Para clientes HTTP heredados, las sesiones con estado siguen siendo el valor predeterminado. Configura MCP_HTTP_STATELESS=true cuando una implementación no pueda preservar sesiones heredadas en memoria entre solicitudes. El HTTP moderno permanece sin sesión independientemente de esa configuración. Cada POST sin estado crea un servidor y transporte MCP nuevos, ignora cualquier ID de sesión entrante y devuelve JSON negociado o un flujo SSE dentro de ese mismo POST. El modo sin estado es solo POST: GET /mcp y DELETE /mcp devuelven HTTP 405 con Allow: POST, y no se preservan suscripciones entre solicitudes, reanudabilidad ni notificaciones de servidor a cliente.
Las solicitudes sin estado están limitadas por límites de solicitudes en curso globales y por cliente-IP, además de un tiempo de vida de solicitud. Consulta CONFIGURATION.md para conocer los valores predeterminados, las respuestas de sobrecarga y tiempo de espera, la equidad consciente del proxy y el contrato de compatibilidad completo.
Aviso de validación de origen y actualización: Cada Origin presente en /mcp se valida en todos los modos; un Origin ausente sigue siendo válido para clientes que no son navegadores. En modo no endurecido, un MCP_HTTP_ALLOWED_ORIGINS sin establecer tiene como valor predeterminado los orígenes de bucle local HTTP/HTTPS exactos http://127.0.0.1, https://127.0.0.1, http://localhost, https://localhost, http://[::1] y https://[::1], tanto sin puerto como con el MCP_HTTP_PORT configurado. Un MCP_HTTP_ALLOWED_ORIGINS no vacío reemplaza esos valores predeterminados. Las entradas se recortan pero por lo demás son literales; la coincidencia es exacta, con distinción entre mayúsculas y minúsculas, incluidos el esquema y el puerto. Los valores mal formados, sin esquema, con ruta, con barra final o con mayúsculas/minúsculas diferentes no coinciden silenciosamente y deben corregirse. El modo endurecido aún requiere una lista de permitidos explícita y añade autenticación además de la aplicación del encabezado Host. Un Origin presente no válido en /mcp recibe un 403 fijo que no se refleja antes del analizador, la autenticación, la limitación de velocidad o la construcción del transporte. /health está fuera del límite 403 de MCP pero utiliza la lista de permitidos CORS global restringida. Antes de actualizar, las implementaciones existentes de navegador no endurecidas que usan orígenes que no son de bucle local deben establecer MCP_HTTP_ALLOWED_ORIGINS o recibirán un 403 fijo.
Pruébalo:
curl http://localhost:3000/healthEl servidor se vincula a 127.0.0.1 de forma predeterminada; establece MCP_HTTP_HOST=0.0.0.0 para implementaciones remotas o en contenedores. Antes de exponerlo en una red, activa el modo endurecido (MCP_HTTP_HARDEN) y consulta CONFIGURATION.md para MCP_HTTP_TRUST_PROXY de modo que la limitación de velocidad y los registros usen la IP de cliente correcta.
Configuración
SEARXNG_URL es la única variable obligatoria: establécelo en la URL de tu instancia de SearXNG (o una lista separada por punto y coma de réplicas intercambiables). Todo lo demás es opcional.
Usa SEARXNG_DEFAULT_RESPONSE_FORMAT para seleccionar text o json cuando las llamadas de búsqueda omitan response_format; los valores explícitos por llamada siguen teniendo prioridad.
Consulta CONFIGURATION.md para obtener la referencia completa de variables de entorno, incluidos autenticación, conmutación por error/difusión, almacenamiento en caché, tiempos de espera, proxies, TLS, transporte HTTP y endurecimiento.
Solución de problemas
Para la configuración de SearXNG autohospedado, la verificación directa y la solución de problemas, consulta Operación de SearXNG autohospedado con mcp-searxng. Si no controlas la instancia, usa la guía separada guía de instancias públicas de SearXNG.
Si las solicitudes HTTPS fallan detrás de un proxy corporativo con inspección TLS y errores de certificado, consulta TLS / CA corporativa.
403 Prohibido desde SearXNG
Es probable que tu instancia de SearXNG tenga deshabilitado el formato JSON. Edita settings.yml (normalmente /etc/searxng/settings.yml):
search:
formats:
- html
- jsonReinicia SearXNG (docker restart searxng) y luego verifica:
curl 'http://localhost:8080/search?q=test&format=json'Deberías recibir una respuesta JSON. Si no es así, confirma que el archivo está montado correctamente y que la sangría YAML es válida.
Consulta también: documentación de ajustes de SearXNG · discusión
¿No puedes activar JSON? (respaldo HTML)
Si debes usar una instancia pública que no controlas y rechaza format=json (el 403 anterior), establece la marca de aceptación explícita en lugar de editar el servidor:
Antes de activarla, revisa la política del operador público y la guía de uso de instancias públicas.
{
"SEARXNG_HTML_FALLBACK": "true"
}Una búsqueda que recibe un 403/404 o una respuesta que no es JSON se reintenta automáticamente sin format=json y se analiza desde la página de resultados HTML normal.
En caso de éxito: obtienes resultados normales (título, URL, fragmento). Se marcan como
sourceFormat: "html"en modo JSON, y el modo texto añade la línea "Nota: Resultados analizados desde el respaldo HTML de SearXNG; los metadatos son limitados." Las puntuaciones de relevancia y los nombres de motores no están disponibles desde HTML.En caso de fallo: el análisis es de máximo esfuerzo y varía según el tema/versión de la instancia, por lo que algunos resultados pueden omitirse o ser escasos. Si la propia página HTML también falla (aún bloqueada, limitada por velocidad (
429), autenticación (401) o5xx), se muestra el error del intento de respaldo, de modo que la búsqueda nunca devuelve resultados vacíos silenciosamente. El respaldo solo se activa con403/404/no JSON, nunca con errores de autenticación o red.
Activar JSON en una instancia que controlas (arriba) sigue siendo la configuración recomendada: el respaldo es una ayuda de compatibilidad, no un reemplazo.
Contribuciones
Consulta CONTRIBUTING.md
Licencia
MIT — consulta LICENSE para más detalles.
Available Tools
2 toolssearxng_web_searchARead-only
Searches the web using SearXNG and returns a list of results, each with a title, URL, and content snippet. CRITICAL: The required parameter name is exactly query (not prompt, q, or any other name). Calls an external SearXNG instance; availability depends on the SEARXNG_URL configuration. Use pageno to paginate results; combine time_range and language to narrow scope. To read the full text of a result URL, follow up with web_url_read.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | The search query string. This is the required parameter name — use exactly `query`, not `prompt` or `q`. | |
| pageno | No | Search page number (starts at 1) | |
| time_range | No | Time range of search (day, month, year) | |
| language | No | Language code for search results (e.g., 'en', 'fr', 'de'). Default is instance-dependent. | all |
| safesearch | No | Safe search filter level (0: None, 1: Moderate, 2: Strict) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint and openWorldHint. The description adds behavioral context: 'Calls an external SearXNG instance; availability depends on the SEARXNG_URL configuration.' It also warns about the exact parameter name. 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?
The description is concise with 4 sentences, each adding value. It starts with the main purpose, then includes a critical note, behavior, usage tips, and follow-up suggestion. No wasted words.
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?
The description covers the return value (list of results with title, URL, snippet), external dependency, pagination, and narrowing options. It does not mention error handling or empty results, but given the simple output, it is largely complete.
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% with clear descriptions for all parameters. The description reinforces the required parameter name and gives usage context for pageno, time_range, and language, but does not add significant new semantics beyond the 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 the tool's purpose: 'Searches the web using SearXNG and returns a list of results...' It specifies the return structure (title, URL, content snippet) and distinguishes from the sibling tool 'web_url_read' by suggesting follow-up for full text.
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 clear guidance on when to use this tool (for web search) and suggests using the sibling 'web_url_read' for full text retrieval. It also gives tips on pagination and narrowing scope with time_range and language, but does not explicitly state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_url_readARead-only
Fetches a URL and returns its text content converted to markdown. Three modes: (1) Full content — omit filtering params; use startChar/maxLength to paginate large pages. (2) Section extraction — set section to return content under a specific heading. (3) Headings only — set readHeadings: true to list all headings (mutually exclusive with other filtering params). Returns an error string if the URL is unreachable or content cannot be extracted. Use after searxng_web_search to read the full content of individual result URLs.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL | |
| startChar | No | Starting character position for content extraction (default: 0) | |
| maxLength | No | Maximum number of characters to return | |
| section | No | Extract content under a specific heading (searches for heading text) | |
| paragraphRange | No | Return specific paragraph ranges (e.g., '1-5', '3', '10-') | |
| readHeadings | No | Return only a list of headings instead of full content |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint and openWorldHint. Description adds behavioral details: three modes, error handling (returns error string if unreachable), and mutual exclusion. It's transparent about what the tool does but doesn't cover all edge cases (e.g., combining multiple filtering params other than readHeadings).
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 a single but well-structured paragraph that enumerates modes clearly. Every sentence adds value with no redundancy. Front-loaded with main purpose.
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?
Covers main functionality, modes, error handling, and relation to sibling tool. No output schema, but return type (text/markdown) is implied. Minor gap: doesn't specify behavior when multiple filtering params are combined beyond readHeadings.
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 parameters are documented. The description adds significant meaning by grouping parameters into modes and explaining relationships (e.g., omit filtering for full content, set section for extraction, readHeadings for headings). It clarifies mutex conditions 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 the tool fetches a URL and converts content to markdown, with three distinct modes. It distinguishes from sibling tools (search tools) by specifying it's for reading individual URLs after a search.
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 says to use after searxng_web_search to read full content of result URLs. Describes three modes and their parameter usage, including mutual exclusivity of readHeadings. Provides guidance on pagination with startChar/maxLength.
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 tool update
v1.0.4- Changed
searxng_web_search1 field changed- changed
Input schema / properties / query / descriptionPrevious value: -"The search query. This is the main input for the web search"New value: +"The search query string. This is the required parameter name — use exactly `query`, not `prompt` or `q`."
TDQS
Scored across 2 tools
The two tools have completely distinct purposes: searxng_web_search performs web searches, while web_url_read fetches and extracts content from URLs. There is no overlap or ambiguity between them.
Both tools use snake_case and are descriptive, but the naming pattern differs: searxng_web_search includes the service prefix, while web_url_read does not. The verb-noun order is also inconsistent (verb-noun vs noun-verb). Overall, still clear and predictable.
With only 2 tools, the set feels minimal but adequate for a basic web search and content retrieval use case. It does not overcomplicate, though it may leave room for additional utility tools.
The tools cover the core workflow: search the web and read full content of results. Minor gaps include advanced search filters (e.g., site, filetype) or management features, but the essential functionality is present.
Maintenance
Related MCP Connectors
Serper MCP — wraps the Serper Google Search API (serper.dev)
An MCP server that gives your AI access to the source code and docs of all public github repos
Related MCP Servers
- AlicenseAqualityDmaintenanceAn MCP server implementation that integrates the SearXNG API for powerful web search capabilities and uses @missionsquad/puppeteer-scraper to read and process live web content.227 npm1MIT
- AlicenseBqualityDmaintenanceAn MCP server that integrates with the SearXNG API to provide comprehensive web search capabilities with features like time filtering, language selection, and safe search. It also enables users to fetch and convert web content from specific URLs into markdown format.216 npm4MIT
- AlicenseAqualityDmaintenanceAn MCP server that integrates the SearXNG API for web search and URL content extraction with advanced features like pagination, caching, and proxy support.413,388 npm2MIT
- AlicenseNot gradedqualityFmaintenanceAn MCP server that integrates the SearXNG API to provide web search with pagination, filtering, and URL content extraction.9 npmMIT