MCP Web Search Tool

Un servidor para búsqueda web en tiempo real utilizando proveedores conectables, impulsado por la API de Brave Search.

Documentación

Herramienta de Búsqueda Web MCP

Un servidor MCP que brinda al asistente búsqueda web en vivo, lectura de páginas completas y citas de fuentes. Transporte Stdio, proveedores conectables, sin dependencias de scraping.

Claude Desktop Example

CI License: MIT Node

Inicio rápido · Herramientas · Configuración · Clientes · Seguridad · Registro de cambios


Descripción general

Cinco herramientas: web_search, news_search, image_search, fetch_url, list_providers. La búsqueda devuelve resúmenes clasificados con identificadores estables; fetch_url lee la página detrás de cualquier identificador. Brave Search es el proveedor principal; DuckDuckGo funciona sin clave como respaldo.

Requisitos

Node.js>= 20.18 (usa fetch nativo)
npm>= 10
Clave de API de Brave Searchopcional. Sin ella, DuckDuckGo maneja web_search. news_search y image_search requieren una clave.

Inicio rápido

git clone https://github.com/gabrimatic/mcp-web-search-tool.git
cd mcp-web-search-tool
npm install
cp .env.example .env   # edit BRAVE_API_KEY if you have one
npm run build
npm start

Ejecutar con Docker:

docker build -t mcp-web-search .
docker run --rm -i -e BRAVE_API_KEY mcp-web-search

Para integración con Claude Desktop, Claude Code, Codex, VS Code, Cursor o Windsurf, consulte MCP_CLIENTS.md.


Herramientas

Cada herramienta devuelve dos bloques de contenido: una representación en Markdown para el modelo y un bloque JSON delimitado con la carga estructurada. Los errores regresan como contenido isError: true con un mensaje accionable; solo las llamadas a herramientas desconocidas generan un error de protocolo.

web_search

Búsqueda web en vivo. Úsela primero para respuestas actuales respaldadas por fuentes.

ParámetroTipoDescripción
search_termcadena, obligatorioCadena de consulta.
providerenumeración"brave search" o "duckduckgo". Por defecto usa Brave cuando hay una clave configurada; de lo contrario, DuckDuckGo.
countentero (1–20)Número de resultados. Por defecto 10.
offsetenteroDesplazamiento de paginación (solo web).
cursorcadenaCursor opaco de una respuesta anterior.
freshnesscadenapd (24 h), pw (semana), pm (mes), py (año) o YYYY-MM-DDtoYYYY-MM-DD.
countrycadenaCódigo de país ISO.
search_langcadenaIdioma de la interfaz, p. ej. en.
safesearchenumeraciónoff, moderate, strict.
include_domainscadena[]Restringir resultados a estos hosts.
exclude_domainscadena[]Excluir resultados de estos hosts (coincidencia por sufijo de nombre de host).

news_search

Noticias recientes con nombre de la fuente y fecha de publicación. Solo Brave.

image_search

Resultados de imágenes con miniaturas. Solo Brave.

fetch_url

Lee un resultado de búsqueda o una URL http(s) arbitraria. Pase un identificador de resultado de una búsqueda anterior (preferido) o una URL completa.

ParámetroTipoDescripción
id_or_urlcadenaUn identificador de resultado (p. ej. r_a1b2c3d4e5f6) o una URL http(s) completa.
urlcadenaAlias obsoleto para id_or_url.
max_charsentero (200–200 000)Límite suave de caracteres devueltos. Por defecto 8000.
cursorcadenaCursor de una respuesta anterior para continuar la lectura.

Devuelve el título de la página, el texto legible (se eliminan scripts, estilos, navegación, pie de página y apartados), los primeros 25 enlaces salientes, el estado HTTP, el tipo de contenido, la longitud en bytes y un nextCursor cuando se trunca.

Rechaza esquemas que no sean http(s) y cualquier host que resuelva a una dirección privada, de bucle local, de enlace local, multicast o IPv4 asignada a IPv6 privada. Detalles: SECURITY.md.

list_providers

Devuelve los proveedores registrados y el predeterminado actual. Llámela una vez si no está seguro de si news_search o image_search están disponibles en esta sesión.


Configuración

Toda la configuración se maneja mediante variables de entorno. Referencia: .env.example.

VariablePredeterminadoPropósito
BRAVE_API_KEYvacíoClave de API de Brave Search. Cuando no está configurada, se usa DuckDuckGo.
MAX_RESULTS10Cantidad predeterminada de resultados (limitada a 1–50).
REQUEST_TIMEOUT10000Tiempo de espera por solicitud en ms (1 000–60 000).
DEFAULT_PROVIDERautoForzar un proveedor específico (p. ej. duckduckgo).
ALLOW_KEYLESStrueCuando false, el servidor se niega a iniciar sin BRAVE_API_KEY.
CACHE_MAX_ENTRIES / CACHE_TTL_MS256 / 300000Caché de búsqueda.
FETCH_CACHE_MAX / FETCH_CACHE_TTL_MS128 / 600000Caché de obtención de URL.
FETCH_TIMEOUT_MS / FETCH_MAX_BYTES15000 / 2000000Presupuesto por solicitud para fetch_url.

Estructura del proyecto

src/
├── index.ts                    MCP server: tool registry, dispatch, rendering
├── config.ts                   env loader, validation, defaults
├── providers/
│   ├── SearchProvider.ts       abstract contract and shared types
│   ├── SearchProviderFactory   registry and default selection
│   ├── BraveSearchProvider     web/news/images via Brave API
│   └── DuckDuckGoProvider      keyless HTML-lite fallback
├── services/
│   ├── SearchService.ts        provider dispatch, LRU+TTL cache
│   └── FetchService.ts         safe URL fetch, readable extraction
└── utils/
    ├── http.ts                 native fetch, retry/backoff/timeout
    ├── html.ts                 zero-dep HTML to text + links
    ├── cache.ts                LRU+TTL cache
    └── ids.ts                  stable result-id minting and resolution
tests/                          vitest suite

Agregar un proveedor

import { SearchProvider, SearchResponse, SearchOptions } from './SearchProvider.js';

export class MyProvider extends SearchProvider {
  getName() { return 'My Provider'; }
  override requiresApiKey() { return true; }
  async search(query: string, _opts: SearchOptions = {}): Promise<SearchResponse> {
    const out = this.emptyResponse(query, 'web');
    out.results = mapped; // shape: SearchResult[]
    return out;
  }
}

Regístrelo en SearchProviderFactory.setupDefaults. Los identificadores de resultado se generan automáticamente cuando llama a mintResultId(url) en cada entrada.


Desarrollo

npm run dev          # tsx watch mode
npm test             # vitest (23 tests)
npm run lint
npm run format
npm run build

CI se ejecuta en Node 20, 22 y 24, además de una compilación de imagen Docker. Las pruebas cubren la caché LRU+TTL, el extractor de HTML, el analizador de DuckDuckGo, la caché del servicio de búsqueda, el reintento/retroceso HTTP, la protección SSRF, la coincidencia de dominio y el resolvedor de identificadores de resultado.


Ejemplos de indicaciones

  • "¿Qué dicen los analistas sobre la carrera por el MVP después de los partidos de la NBA de esta noche?"
  • "Resume los tres mejores resultados para RAG benchmarks 2025 y extrae el resumen del primer artículo."
  • "Busca imágenes del último campo profundo del telescopio Webb, luego abre la página de la NASA y cita el pie de foto."
  • "¿Cómo está el clima en Berlín ahora mismo?"

Licencia

Licencia MIT

Desarrollador

Por Soroush Yousefpour

© Todos los derechos reservados.

Video de YouTube

Una breve demostración de la Herramienta de Búsqueda Web MCP con Claude:

Claude + Búsqueda Web MCP – Demostración en vivo

Artículo en Medium

Antecedentes del proyecto y cómo funciona:

Análisis profundo de la Herramienta de Búsqueda Web MCP

Soporte

Buy Me A Book