返回市场
<ddg_mcp>

<ddg_mcp>

作者:mseri7 星标更新:2025-10-01

项目介绍

Web 搜索与内容抓取 MCP 服务器

这是一个使用 OCaml 编写的 Model Context Protocol (MCP) 服务器,提供网络搜索、维基百科搜索以及网页内容抓取的功能,并使用了 eio 异步运行时。

功能

  • DuckDuckGo 搜索:使用 DuckDuckGo 的搜索引擎进行网络搜索
  • 维基百科搜索:在维基百科中搜索文章和内容
  • 网页内容抓取:抓取并解析网页内容,支持清理过的 HTML 和 Markdown 格式
  • 速率限制:内置速率限制以尊重服务限制
  • MCP 协议:完全兼容 Model Context Protocol 规范(托管于 https://tangled.sh/@anil.recoil.org/ocaml-mcp/
  • 异步:基于 Eio 实现高效的并发操作

提供的工具

search

使用 DuckDuckGo 进行搜索并返回格式化结果。

参数:

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

示例:

{
  "query": "OCaml 编程语言",
  "max_results": 5
}

search_wikipedia

在维基百科中进行搜索并返回格式化结果。

参数:

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

示例:

{
  "query": "OCaml 编程语言",
  "max_results":  5
}

fetch_content

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

参数:

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

示例:

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

fetch_markdown

从网页 URL 抓取并解析内容为 Markdown 格式。

参数:

  • url (字符串,必需):要抓取内容的网页 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 模式:通过标准输入输出通信

注意:安装的二进制文件名为 snf-mcp

在 HTTP 模式下启动 MCP 服务器,监听端口 3000:

dune exec snf-mcp -- --serve 3000

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

dune exec snf-mcp

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

snf_mcp [--serve PORT | --stdio]
  --serve  在指定端口上运行 http 服务器
  --stdio  使用标准输入输出进行通信而不是端口(默认)
  --debug  启用调试日志
  --verbose  启用详细日志
  --quiet  抑制非错误日志(默认)
  -help  显示此选项列表
  --help  显示此选项列表

测试服务器

HTTP 模式

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

首先启动服务器:

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 编程语言",
      "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 编程语言",
      "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 模式

在使用标准 I/O 模式时,可以将 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 编程语言"}},"id":2}' | dune exec snf-mcp | jq
echo '{"jsonrpc":"2.0","method":"tools/call","params":{"name":"search_wikipedia","arguments":{"query":"OCaml 编程语言"}},"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

这种模式特别适用于与通过标准输入输出通信的 LLM 客户端集成。

安装

从源码构建

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

这将使 snf-mcp 二进制文件在你的 PATH 中可用。

与 MCP 客户端集成

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

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 条目。 参见官方文档

Jan

使用 snf_mcp 的全路径作为命令,并将 --stdio 作为唯一参数。 参见官方文档

注意,我只能配置基于标准 I/O 的 mcp 服务器。

速率限制

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

  • 搜索请求(DuckDuckGo 和维基百科):每分钟限速 30 次请求
  • 内容抓取:每分钟限速 20 次请求

故障排除

速率限制问题

如果你遇到错误或超时信息,可能是达到了速率限制。当达到速率限制时,服务器会自动等待,但外部服务可能会因检测到自动化使用而阻止请求。

搜索质量

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

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

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

内容提取质量

fetch_markdown 工具会尝试使用系统上的 trafilatura Python 库,因为它能产生更高的文本提取质量。如果没有找到 trafilatura,它会回退到 jina reader

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

uv tool install trafilatura # 方法 1:使用 `uv` 工具
pipx install trafilatura # 方法 2:使用 `pipx`
pip install trafilatura # 方法 3:使用 `pip`

TODO

  • 在抓取时使用分页