网页搜索与内容获取服务器

一个基于Model Context Protocol (MCP)的服务器,提供网页搜索、维基百科搜索和网页内容获取功能,适用于需要集成搜索和内容提取的应用场景。

  • by mseri
  • OCaml
  • 本地部署
  • 8 星标
  • 更新于
在 GitHub 查看 mseri/ddg_mcp

使用说明

Web获取和搜索MCP服务器

一种模型上下文协议(MCP)服务器,提供web搜索、维基百科搜索和web内容获取功能,使用eio异步运行时用OCaml编写。

特性

  • DuckDuckGo搜索:使用DuckDuckGo的搜索引擎搜索网络
  • 维基百科搜索:在维基百科中搜索文章和内容
  • Web内容获取:从网页中获取和解析内容,支持清理后的HTML和Markdown格式
  • 速率限制:内置速率限制,以遵守服务限制
  • MCP协议:与模型上下文协议规范完全兼容(供应商 https://tangled.sh/@anil.recoil.org/ocaml-mcp/)
  • 异步:基于Eio构建,实现高效并发操作

提供的工具

search

搜索DuckDuckGo并返回格式化结果。

参数:

  • query (string,必填):搜索查询字符串
  • max_results (整数,可选):返回的最大结果数(默认值:10)

例子:

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

search_wikipedia

搜索维基百科并返回格式化结果。

参数:

  • query (string,必填):搜索查询字符串
  • max_results (整数,可选):返回的最大结果数(默认值:10)

例子:

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

fetch_content

从网页URL获取并解析内容。

参数:

  • url (string,必填):从中获取内容的网页URL
  • max_length (整数,可选):要返回的内容的最大长度(以字节为单位)(默认值:8192)。集 -1 禁用长度限制。
  • start_from (整数,可选):开始返回内容的字节偏移量(默认值:0)

例子:

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

fetch_markdown

从网页URL中提取并解析内容作为Markdown。

参数:

  • url (string,必填):从中获取内容的网页URL
  • max_length (整数,可选):要返回的内容的最大长度(以字节为单位)(默认值:8192)。集 -1 禁用长度限制。
  • start_from (整数,可选):开始返回内容的字节偏移量(默认值:0)

例子:

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

用法

运行服务器

这 snf-mcp 二进制支持两种操作模式:

  1. HTTP服务器模式 (默认):侦听网络端口
  2. 标准I/O模式:通过stdin/stdout进行通信

警告:安装的二进制文件被调用 snf-mcp

在端口3000上以HTTP模式启动MCP服务器:

dune exec snf-mcp -- --serve 3000

使用标准I/O模式(有助于与LLM客户端集成):

dune exec snf-mcp

通过OPAM安装后,您可以直接运行它:

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

测试服务器

HTTP模式

在HTTP模式下运行时,您可以通过使用curl发送MCP协议消息来测试服务器是否正常工作。

首先使用以下命令启动服务器:

dune exec snf-mcp --serve 8080

然后,在另一个终端上,您可以使用 curl 与服务器交互。以下是一些示例请求:

列出可用工具:

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

执行搜索:

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

获取网页内容:

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

搜索维基百科:

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

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

标准I/O模式

使用stdio模式时,您可以将JSON-RPC请求传输到二进制文件:

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

当与通过stdin/stdout通信的LLM客户端集成时,此模式特别有用。

安装

从源代码构建

  1. 克隆存储库
  2. 安装依赖项并构建:
$ cd snf_mcp
$ opam install . --deps-only
$ dune build
$ dune install

这将使 snf-mcp PATH中提供的二进制文件。

与MCP客户端集成

此服务器可以与任何兼容MCP的客户端集成。配置您的客户端以使用适当的传输方法连接到此服务器。 下面我们展示了如何配置stdio版本,远程版本非常相似。 请记住,这是早期软件,不建议用于生产或在未受保护的网络上暴露。

LLM-CLI

安装 llm-tools-mcp 插件 随着

llm install llm-tools-mcp

然后编辑(或创建) ~/.llm-tools-mcp/mcp.json 随着

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

LMStudio

从界面编辑json文件,添加与上面LLM CLI示例中相同的json条目。 另请参见 官方文件.

一月

使用 完整路径 将snf_mcp作为命令,以及 --stdio 作为唯一的论点。 另请参见 官方文件.

注意, 我只能配置基于stdio的mcp服务器 与Jan。

速率限制

服务器实施速率限制以尊重外部服务:

  • 搜索请求(DuckDuckGo和维基百科):每分钟限制30个请求
  • 内容提取:每分钟限20个请求

故障排除

利率限制问题

如果您遇到错误或超时消息,则可能已达到速率限制。当达到速率限制时,服务器将自动等待,但如果外部服务检测到自动使用,它们仍可能阻止请求。

搜索质量

DuckDuckGo的搜索结果是从HTML响应中解析出来的。如果搜索结果不正确或不完整,可能是由于:

  1. DuckDuckGo更改HTML结构
  2. 机器人检测阻止了正确的结果
  3. 搜索查询格式的问题

尝试重新表述您的查询或检查DuckDuckGo的服务是否正常运行。

内容提取质量

这 fetch_markdown 工具尝试使用 trafilatura 如果你的系统上有Python库,因为它可以产生更高质量的文本提取。如果 trafilatura 未找到,则返回 吉娜读者.

为了获得最佳效果,请考虑安装 trafilatura,例如以下3种方式之一:

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

全部

  • 在获取中使用分页