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 buscamax_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 buscamax_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údomax_length(inteiro, opcional): Comprimento máximo (em bytes) do conteúdo a retornar (padrão: 8192). Defina-1para 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údomax_length(inteiro, opcional): Comprimento máximo (em bytes) do conteúdo a retornar (padrão: 8192). Defina-1para 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:
- Modo Servidor HTTP (padrão): Escuta em uma porta de rede
- 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
- Clone o repositório
- 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:
- O DuckDuckGo alterar sua estrutura HTML
- Detecção de bot impedindo resultados adequados
- 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