Web fetch and search MCP Server

Fornece pesquisa na web, pesquisa na Wikipedia e capacidades de busca de conteúdo web usando OCaml.

Documentação

Servidor MCP de Busca e Captura Web

Um servidor Model Context Protocol (MCP) que fornece recursos de busca na web, busca na Wikipedia e captura de conteúdo web, escrito em OCaml usando o runtime assíncrono eio.

Recursos

  • Busca DuckDuckGo: Busque na web usando o mecanismo de busca do DuckDuckGo
  • Busca na Wikipedia: Busque artigos e conteúdo na Wikipedia
  • Captura de Conteúdo Web: Capture e analise conteúdo de páginas web, com suporte para formatos HTML limpo e Markdown
  • Limitação de Taxa: Limitação de taxa integrada para respeitar os limites dos serviços
  • Protocolo MCP: Totalmente compatível com a especificação do Model Context Protocol (fornecendo https://tangled.sh/@anil.recoil.org/ocaml-mcp/)
  • Assíncrono: Construído sobre Eio para operações concorrentes eficientes

Ferramentas Fornecidas

search

Busque no DuckDuckGo e retorne resultados formatados.

Parâmetros:

  • query (string, obrigatório): A string de consulta de busca
  • max_results (inteiro, opcional): Número máximo de resultados a retornar (padrão: 10)

Exemplo:

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

search_wikipedia

Busque na Wikipedia e retorne resultados formatados.

Parâmetros:

  • query (string, obrigatório): A string de consulta de busca
  • max_results (inteiro, opcional): Número máximo de resultados a retornar (padrão: 10)

Exemplo:

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

fetch_content

Capture e analise conteúdo de uma URL de página web.

Parâmetros:

  • url (string, obrigatório): A URL da página web para capturar conteúdo
  • max_length (inteiro, opcional): Comprimento máximo (em bytes) do conteúdo a retornar (padrão: 8192). Defina -1 para desativar o limite de comprimento.
  • start_from (inteiro, opcional): Deslocamento de bytes para começar a retornar o conteúdo (padrão: 0)

Exemplo:

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

fetch_markdown

Capture e analise conteúdo de uma URL de página web como Markdown.

Parâmetros:

  • url (string, obrigatório): A URL da página web para capturar conteúdo
  • max_length (inteiro, opcional): Comprimento máximo (em bytes) do conteúdo a retornar (padrão: 8192). Defina -1 para desativar o limite de comprimento.
  • start_from (inteiro, opcional): Deslocamento de bytes para começar a retornar o conteúdo (padrão: 0)

Exemplo:

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

Uso

Executando o Servidor

O binário snf-mcp suporta dois modos de operação:

  1. Modo Servidor HTTP (padrão): Escuta em uma porta de rede
  2. Modo Entrada/Saída Padrão: Comunica-se através de stdin/stdout

Observação: o binário instalado é chamado snf-mcp

Inicie o servidor MCP em modo HTTP na porta 3000:

dune exec snf-mcp -- --serve 3000

Use o modo Entrada/Saída Padrão (útil para integrar com clientes LLM):

dune exec snf-mcp

Quando instalado via OPAM, você pode executá-lo diretamente:

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

Testando o Servidor

Modo HTTP

Ao executar em modo HTTP, você pode testar se o servidor está funcionando enviando mensagens do protocolo MCP usando curl.

Primeiro inicie o servidor com:

dune exec snf-mcp --serve 8080

Depois, em um terminal diferente, você pode usar curl para interagir com o servidor. Aqui estão alguns exemplos de solicitações:

Listar ferramentas disponíveis:

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

Realizar uma busca:

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
    }
  }
}'

Capturar conteúdo 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 na 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
    }
  }
}'

Capturar conteúdo 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 Entrada/Saída Padrão

Ao usar o modo stdio, você pode canalizar solicitações JSON-RPC para o binário:

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 é particularmente útil ao integrar com clientes LLM que se comunicam via stdin/stdout.

Instalação

Compilar a partir do Código Fonte

  1. Clone o repositório
  2. Instale as dependências e compile:
$ cd snf_mcp
$ opam install . --deps-only
$ dune build
$ dune install

Isso tornará o binário snf-mcp disponível no seu PATH.

Integração com Clientes MCP

Este servidor pode ser integrado com qualquer cliente compatível com MCP. Configure seu cliente para conectar a este servidor usando o método de transporte apropriado. Abaixo mostramos como configurar a versão stdio; a versão remota é muito semelhante. Lembre-se de que este é um software inicial e não é recomendado para produção ou para ser exposto em redes não protegidas.

LLM CLI

Instale o plugin llm-tools-mcp com

llm install llm-tools-mcp

depois edite (ou crie) ~/.llm-tools-mcp/mcp.json com

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

LMStudio

Edite o arquivo json pela interface adicionando a mesma entrada json do exemplo LLM CLI acima. Veja também a documentação oficial.

Jan

Use o caminho completo para snf_mcp como comando, e --stdio como o único argumento. Veja também a documentação oficial.

Nota: só consegui configurar servidores mcp baseados em stdio com Jan.

Limitação de Taxa

O servidor implementa limitação de taxa para ser respeitoso com serviços externos:

  • Solicitações de busca (DuckDuckGo e Wikipedia): Limitadas a 30 solicitações por minuto
  • Captura de conteúdo: Limitada a 20 solicitações por minuto

Solução de Problemas

Problemas de Limitação de Taxa

Se você encontrar erros ou mensagens de tempo limite, pode estar atingindo os limites de taxa. O servidor aguardará automaticamente quando os limites de taxa forem atingidos, mas serviços externos ainda podem bloquear solicitações se detectarem uso automatizado.

Qualidade da Busca

Os resultados de busca do DuckDuckGo são analisados a partir da resposta HTML. Se os resultados de busca parecerem incorretos ou incompletos, pode ser devido a:

  1. O DuckDuckGo alterar sua estrutura HTML
  2. Detecção de bot impedindo resultados adequados
  3. Problemas com o formato da consulta de busca

Tente reformular sua consulta ou verificar se o serviço do DuckDuckGo está funcionando normalmente.

Qualidade da Extração de Conteúdo

A ferramenta fetch_markdown tenta usar a biblioteca Python trafilatura se estiver disponível no seu sistema, pois ela produz extração de texto de maior qualidade. Se trafilatura não for encontrado, ele usa como alternativa o jina reader.

Para melhores resultados, considere instalar trafilatura, por exemplo, de uma das seguintes 3 maneiras:

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

TODO

  • Usar paginação na captura