Web fetch and search MCP Server

Proporciona capacidades de búsqueda web, búsqueda en Wikipedia y obtención de contenido web utilizando OCaml.

Documentación

Servidor MCP de búsqueda y obtención web

Un servidor de Protocolo de Contexto de Modelo (MCP) que proporciona capacidades de búsqueda web, búsqueda en Wikipedia y obtención de contenido web, escrito en OCaml utilizando el tiempo de ejecución asíncrono eio.

Características

  • Búsqueda DuckDuckGo: Busca en la web utilizando el motor de búsqueda de DuckDuckGo
  • Búsqueda en Wikipedia: Busca artículos y contenido en Wikipedia
  • Obtención de contenido web: Obtiene y analiza contenido de páginas web, con soporte tanto para HTML limpio como para formatos Markdown
  • Limitación de velocidad: Limitación de velocidad integrada para respetar los límites del servicio
  • Protocolo MCP: Totalmente compatible con la especificación del Protocolo de Contexto de Modelo (incluyendo https://tangled.sh/@anil.recoil.org/ocaml-mcp/)
  • Asíncrono: Construido sobre Eio para operaciones concurrentes eficientes

Herramientas proporcionadas

search

Busca en DuckDuckGo y devuelve resultados formateados.

Parámetros:

  • query (cadena, obligatorio): La cadena de consulta de búsqueda
  • max_results (entero, opcional): Número máximo de resultados a devolver (predeterminado: 10)

Ejemplo:

{
  "query": "OCaml programming language",
  "max_results": 5
}

search_wikipedia

Busca en Wikipedia y devuelve resultados formateados.

Parámetros:

  • query (cadena, obligatorio): La cadena de consulta de búsqueda
  • max_results (entero, opcional): Número máximo de resultados a devolver (predeterminado: 10)

Ejemplo:

{
  "query": "OCaml programming language",
  "max_results": 5
}

fetch_content

Obtiene y analiza contenido de una URL de página web.

Parámetros:

  • url (cadena, obligatorio): La URL de la página web de la que obtener contenido
  • max_length (entero, opcional): Longitud máxima (en bytes) del contenido a devolver (predeterminado: 8192). Establece -1 para deshabilitar el límite de longitud.
  • start_from (entero, opcional): Desplazamiento de bytes para comenzar a devolver contenido (predeterminado: 0)

Ejemplo:

{
  "url": "https://example.com/article",
  "max_length": 16384,
  "start_from": 1024
}

fetch_markdown

Obtiene y analiza contenido de una URL de página web como Markdown.

Parámetros:

  • url (cadena, obligatorio): La URL de la página web de la que obtener contenido
  • max_length (entero, opcional): Longitud máxima (en bytes) del contenido a devolver (predeterminado: 8192). Establece -1 para deshabilitar el límite de longitud.
  • start_from (entero, opcional): Desplazamiento de bytes para comenzar a devolver contenido (predeterminado: 0)

Ejemplo:

{
  "url": "https://example.com/article",
  "max_length": 16384,
  "start_from": 1024
}

Uso

Ejecutar el servidor

El binario snf-mcp admite dos modos de operación:

  1. Modo servidor HTTP (predeterminado): Escucha en un puerto de red
  2. Modo de entrada/salida estándar: Se comunica a través de stdin/stdout

Advertencia: el binario instalado se llama snf-mcp

Inicia el servidor MCP en modo HTTP en el puerto 3000:

dune exec snf-mcp -- --serve 3000

Usa el modo de entrada/salida estándar (útil para integrarse con clientes LLM):

dune exec snf-mcp

Cuando se instala a través de OPAM, puedes ejecutarlo directamente:

snf_mcp [--serve PORT | --stdio]
  --serve  Run http server, listening on PORT
  --stdio  Use stdio for communication instead of port (default)
  --debug  Enable debug logging
  --verbose  Enable verbose logging
  --quiet  Suppress non-error logs (default)
  -help  Display this list of options
  --help  Display this list of options

Probar el servidor

Modo HTTP

Cuando se ejecuta en modo HTTP, puedes probar si el servidor funciona enviando mensajes del protocolo MCP usando curl.

Primero inicia el servidor con:

dune exec snf-mcp --serve 8080

Luego, en una terminal diferente, puedes usar curl para interactuar con el servidor. Aquí hay algunas solicitudes de ejemplo:

Listar herramientas disponibles:

curl -X POST http://localhost:8080 -H "Content-Type: application/json" -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/list"
}'

Realizar una búsqueda:

curl -X POST http://localhost:8080 -H "Content-Type: application/json" -d '{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "search",
    "arguments": {
      "query": "OCaml programming language",
      "max_results": 3
    }
  }
}'

Obtener contenido de página web:

curl -X POST http://localhost:8080 -H "Content-Type: application/json" -d '{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "tools/call",
  "params": {
    "name": "fetch_content",
    "arguments": {
      "url": "https://ocaml.org"
    }
  }
}'

Buscar en Wikipedia:

curl -X POST http://localhost:8080 -H "Content-Type: application/json" -d '{
  "jsonrpc": "2.0",
  "id": 4,
  "method": "tools/call",
  "params": {
    "name": "search_wikipedia",
    "arguments": {
      "query": "OCaml programming language",
      "max_results": 3
    }
  }
}'

Obtener contenido de página web como Markdown:

curl -X POST http://localhost:8080 -H "Content-Type: application/json" -d '{
  "jsonrpc": "2.0",
  "id": 5,
  "method": "tools/call",
  "params": {
    "name": "fetch_markdown",
    "arguments": {
      "url": "https://ocaml.org"
    }
  }
}'

Modo de entrada/salida estándar

Cuando se usa el modo stdio, puedes canalizar solicitudes JSON-RPC al binario:

echo '{"jsonrpc":"2.0","method":"tools/list","id":1}' | dune exec snf-mcp | jq
echo '{"jsonrpc":"2.0","method":"tools/call","params":{"name":"search","arguments":{"query":"OCaml programming language"}},"id":2}' | dune exec snf-mcp | jq
echo '{"jsonrpc":"2.0","method":"tools/call","params":{"name":"search_wikipedia","arguments":{"query":"OCaml programming language"}},"id":3}' | dune exec snf-mcp | jq
echo '{"jsonrpc":"2.0","method":"tools/call","params":{"name":"fetch_content","arguments":{"url":"https://ocaml.org"}},"id":4}' | dune exec snf-mcp | jq
echo '{"jsonrpc":"2.0","method":"tools/call","params":{"name":"fetch_markdown","arguments":{"url":"https://ocaml.org"}},"id":5}' | dune exec snf-mcp | jq

Este modo es particularmente útil al integrarse con clientes LLM que se comunican a través de stdin/stdout.

Instalación

Compilar desde el código fuente

  1. Clona el repositorio
  2. Instala las dependencias y compila:
$ cd snf_mcp
$ opam install . --deps-only
$ dune build
$ dune install

Esto hará que el binario snf-mcp esté disponible en tu PATH.

Integración con clientes MCP

Este servidor puede integrarse con cualquier cliente compatible con MCP. Configura tu cliente para conectarse a este servidor utilizando el método de transporte apropiado. A continuación mostramos cómo configurar la versión stdio; la versión remota es muy similar. Ten en cuenta que este es software temprano y no se recomienda para producción ni para exponerse en redes no protegidas.

CLI LLM

Instala el plugin llm-tools-mcp con

llm install llm-tools-mcp

luego edita (o crea) ~/.llm-tools-mcp/mcp.json con

{
  "mcpServers": {
    "snf_mcp": {
      "command": "/path/to/snf-mcp",
      "args": [
        "--stdio"
      ]
    }
  }
}

LMStudio

Edita el archivo json desde la interfaz agregando la misma entrada json que en el ejemplo de CLI LLM anterior. Consulta también la documentación oficial.

Jan

Usa la ruta completa a snf_mcp como comando, y --stdio como único argumento. Consulta también la documentación oficial.

Nota: solo pude configurar servidores mcp basados en stdio con Jan.

Limitación de velocidad

El servidor implementa limitación de velocidad para ser respetuoso con los servicios externos:

  • Solicitudes de búsqueda (DuckDuckGo y Wikipedia): Limitadas a 30 solicitudes por minuto
  • Obtención de contenido: Limitada a 20 solicitudes por minuto

Solución de problemas

Problemas de limitación de velocidad

Si encuentras errores o mensajes de tiempo de espera, es posible que estés alcanzando los límites de velocidad. El servidor esperará automáticamente cuando se alcancen los límites de velocidad, pero los servicios externos podrían bloquear las solicitudes si detectan uso automatizado.

Calidad de búsqueda

Los resultados de búsqueda de DuckDuckGo se analizan a partir de la respuesta HTML. Si los resultados de búsqueda parecen incorrectos o incompletos, podría deberse a:

  1. DuckDuckGo cambiando su estructura HTML
  2. Detección de bots que impide resultados adecuados
  3. Problemas con el formato de la consulta de búsqueda

Intenta reformular tu consulta o verifica si el servicio de DuckDuckGo funciona normalmente.

Calidad de extracción de contenido

La herramienta fetch_markdown intenta usar la biblioteca de Python trafilatura si está disponible en tu sistema, ya que produce una extracción de texto de mayor calidad. Si no se encuentra trafilatura, recurre a jina reader.

Para obtener mejores resultados, considera instalar trafilatura, por ejemplo, de una de las siguientes 3 formas:

uv tool install trafilatura # Method 1: Using `uv` tool
pipx install trafilatura # Method 2: Using `pipx`
pip install trafilatura # Method 3: Using `pip`

PENDIENTE

  • Usar paginación en la obtención