这是一个使用 OCaml 编写的 Model Context Protocol (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 (字符串,必需):要抓取内容的网页 URLmax_length (整数,可选):返回的内容最大长度(以字节为单位,默认值:8192)。设置为 -1 可禁用长度限制。start_from (整数,可选):开始返回内容的字节偏移量(默认值:0)示例:
{
"url": "https://example.com/article",
"max_length": 16384,
"start_from": 1024
}
fetch_markdown从网页 URL 抓取并解析内容为 Markdown 格式。
参数:
url (字符串,必需):要抓取内容的网页 URLmax_length (整数,可选):返回的内容最大长度(以字节为单位,默认值:8192)。设置为 -1 可禁用长度限制。start_from (整数,可选):开始返回内容的字节偏移量(默认值:0)示例:
{
"url": "https://example.com/article",
"max_length": 16384,
"start_from": 1024
}
snf-mcp 二进制文件支持两种操作模式:
注意:安装的二进制文件名为 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 模式下运行时,可以通过发送 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 模式时,可以将 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 客户端集成。
$ cd snf_mcp
$ opam install . --deps-only
$ dune build
$ dune install
这将使 snf-mcp 二进制文件在你的 PATH 中可用。
该服务器可以与任何兼容 MCP 的客户端集成。配置你的客户端连接到此服务器,使用适当的传输方式。 下面展示了如何配置标准 I/O 版本,远程版本非常相似。 请注意,这是早期软件,不建议用于生产或暴露在未受保护的网络上。
安装 llm-tools-mcp 插件:
llm install llm-tools-mcp
然后编辑(或创建)~/.llm-tools-mcp/mcp.json 文件:
{
"mcpServers": {
"snf_mcp": {
"command": "/path/to/snf-mcp",
"args": [
"--stdio"
]
}
}
}
从界面编辑 json 文件,添加与 LLM CLI 示例相同的 json 条目。 参见官方文档。
使用 snf_mcp 的全路径作为命令,并将 --stdio 作为唯一参数。
参见官方文档。
注意,我只能配置基于标准 I/O 的 mcp 服务器。
服务器实现了速率限制以尊重外部服务:
如果你遇到错误或超时信息,可能是达到了速率限制。当达到速率限制时,服务器会自动等待,但外部服务可能会因检测到自动化使用而阻止请求。
DuckDuckGo 的搜索结果是从 HTML 响应中解析出来的。如果搜索结果看起来不正确或不完整,可能是因为:
尝试重新表述你的查询,或者检查 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`