关于 Documentation Crawler & MCP Server
Documentation Crawler & MCP Server 是一套工具,用于抓取网站、wiki 和工具库文档并生成 Markdown,再通过 MCP 服务使这些文档可被语义搜索。它面向需要在 Cursor 等客户端中查询文档的开发者。
主要功能
- 01使用 crawl4ai 抓取网站并生成 Markdown
- 02支持深度、URL 过滤和 HTML 清理等配置
- 03基于标题切分文档并使用 sentence-transformers 生成向量
- 04缓存已处理的分块与嵌入,加快启动速度
- 05通过 fastmcp 暴露 stdio 传输的 MCP 工具
适用场景
- 01将某个产品的在线文档转换为可检索的本地资料
- 02在 Cursor 中通过语义搜索查询已抓取的文档
- 03只抓取文档站点中的特定章节并供 Agent 查询
MCP 相关
该项目是 MCP 服务,提供 list_documents、get_document_headings 和 search_documentation 等工具,供 Cursor 等 MCP 客户端调用。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
文档爬虫与 MCP 服务
本项目提供一套工具,用于抓取网站、生成 Markdown 文档,并通过模型上下文协议(MCP)服务让这些文档可供搜索,旨在与 Cursor 等工具集成。
功能
- 网页爬虫(
crawler_cli):- 使用
crawl4ai从指定 URL 开始抓取网站。 - 可配置抓取深度、URL 模式(包含/排除)、内容类型等。
- 可选择在转换为 Markdown 之前清理 HTML(移除导航链接、页眉和页脚)。
- 根据抓取的内容生成一个整合的 Markdown 文件。
- 默认将输出保存到
./storage/。
- 使用
- MCP 服务(
mcp_server):- 从
./storage/目录加载 Markdown 文件。 - 根据标题将 Markdown 解析为语义分块。
- 使用
sentence-transformers(multi-qa-mpnet-base-dot-v1)为每个分块生成向量嵌入。 - **缓存:**使用缓存文件(
storage/document_chunks_cache.pkl)存储已处理的分块和嵌入。- **首次运行:**抓取新文档后首次启动服务可能需要一些时间,因为需要解析、分块并为所有内容生成嵌入。
- **后续运行:**如果缓存文件存在,且
./storage/中源.md文件的修改时间未发生变化,服务会直接从缓存加载,从而大幅缩短启动时间。 - **缓存失效:**如果自上次创建缓存以来,
./storage/中的任何.md文件被修改、添加或删除,缓存会自动失效并重新生成。
- 通过
fastmcp向 Cursor 等客户端提供 MCP 工具:list_documents:列出可用的已抓取文档。get_document_headings:获取文档的标题结构。search_documentation:使用向量相似度对文档分块执行语义搜索。
- 从
- Cursor 集成:设计为通过
stdio传输运行 MCP 服务,以便在 Cursor 中使用。
工作流
- **抓取:**使用
crawler_cli工具抓取网站,并在./storage/中生成.md文件。 - **运行服务:**配置并运行
mcp_server(通常由 Cursor 等 MCP 客户端管理)。 - **加载与嵌入:**服务会自动加载、分块并嵌入
./storage/中.md文件的内容。 - **查询:**使用 MCP 客户端(例如 Cursor Agent)调用服务提供的工具(
list_documents、search_documentation等),查询已抓取的内容。
设置
本项目使用 uv 管理依赖项并执行程序。
-
安装
uv:按照 uv 网站上的说明操作。 -
克隆代码库:
git clone https://github.com/alizdavoodi/MCPDocSearch.git cd MCPDocSearch -
安装依赖项:
uv sync此命令会创建虚拟环境(通常为
.venv),并安装pyproject.toml中列出的所有依赖项。
用法
1. 抓取文档
使用 crawl.py 脚本运行爬虫,或直接通过 uv run 运行。
基本示例:
uv run python crawl.py https://docs.example.com
这会使用默认设置抓取 https://docs.example.com,并将输出保存到 ./storage/docs.example.com.md。
带选项的示例:
uv run python crawl.py https://docs.another.site --output ./storage/custom_name.md --max-depth 2 --keyword "API" --keyword "Reference" --exclude-pattern "*blog*"
查看所有选项:
uv run python crawl.py --help
主要选项包括:
--output/-o:指定输出文件路径。--max-depth/-d:设置抓取深度(必须介于 1 和 5 之间)。--include-pattern/--exclude-pattern:筛选要抓取的 URL。--keyword/-k:抓取期间用于相关性评分的关键词。--remove-links/--keep-links:控制 HTML 清理方式。--cache-mode:控制crawl4ai缓存(DEFAULT、BYPASS、FORCE_REFRESH)。--wait-for:在捕获内容前等待指定时长(秒)或 CSS 选择器(例如5或'css:.content')。适用于加载延迟的页面。--js-code:在捕获内容前,在页面上执行自定义 JavaScript。--page-load-timeout:设置等待页面加载的最长时长(秒)。--wait-for-js-render/--no-wait-for-js-render:启用特定脚本,以便通过滚动页面并点击可能的“加载更多”按钮,更好地处理 JavaScript 密集型单页应用(SPA)。若未指定--wait-for,则自动设置默认等待时间。
使用模式和深度优化抓取
有时,你可能只想抓取文档站点中的某个特定子部分。这通常需要通过 --include-pattern 和 --max-depth 反复尝试和调整。
--include-pattern:限制爬虫仅跟进 URL 与给定模式匹配的链接。使用通配符(*)可增加灵活性。--max-depth:控制爬虫从起始 URL 出发最多跟进多少层链接。深度为 1 表示仅抓取起始 URL 直接链接到的页面。深度为 2 表示抓取这些页面,以及 它们链接到的页面(前提是这些页面也匹配包含模式),依此类推。
示例:仅抓取 Pulsar Admin API 部分
假设你只想抓取 https://pulsar.apache.org/docs/4.0.x/admin-api-* 下的内容。
- 起始 URL: 可以从概览页面开始:
https://pulsar.apache.org/docs/4.0.x/admin-api-overview/。 - 包含模式: 你只想抓取包含
admin-api的链接:--include-pattern "*admin-api*"。 - 最大深度: 需要确定 Admin API 链接距起始页面有多少层。先从
2开始,必要时再增加。 - 详细模式: 使用
-v查看正在访问或跳过的 URL,这有助于调试模式和深度设置。
uv run python crawl.py https://pulsar.apache.org/docs/4.0.x/admin-api-overview/ -v --include-pattern "*admin-api*" --max-depth 2
检查输出文件(本例中默认为 ./storage/pulsar.apache.org.md)。如果缺少页面,尝试将 --max-depth 增加到 3。如果包含了太多无关页面,请让 --include-pattern 更具体,或添加 --exclude-pattern 规则。
2. 运行 MCP 服务
MCP 服务设计为通过 stdio 传输方式由 Cursor 之类的 MCP 客户端运行。运行服务的命令是:
python -m mcp_server.main
不过,必须从项目根目录(MCPDocSearch)运行,这样 Python 才能找到 mcp_server 模块。
⚠️ 注意:嵌入生成耗时
MCP 服务在首次运行时,或 ./storage/ 中的源 Markdown 文件发生变化时,会在本地生成嵌入。此过程需要加载机器学习模型并处理所有文本块。
- 耗时因情况而异: 嵌入生成所需的时间会因以下因素而有很大差异:
- 硬件: 配备兼容 GPU(CUDA 或 Apple Silicon/MPS)的系统会比仅使用 CPU 的系统快得多。
- 数据量: Markdown 文件总数及其内容长度会直接影响处理时间。
- 请耐心等待: 对于大型文档集或较慢的硬件,首次启动(或文件变更后的启动)可能需要几分钟。使用缓存后,后续启动会快得多。⏳
3. 配置 Cursor/Claude for Desktop
要在 Cursor 中使用此服务,请在本项目根目录(MCPDocSearch/.cursor/mcp.json)下创建 .cursor/mcp.json 文件,内容如下:
{
"mcpServers": {
"doc-query-server": {
"command": "uv",
"args": [
"--directory",
// IMPORTANT: Replace with the ABSOLUTE path to this project directory on your machine
"/path/to/your/MCPDocSearch",
"run",
"python",
"-m",
"mcp_server.main"
],
"env": {}
}
}
}
说明:
"doc-query-server":此服务在 Cursor 中的名称。"command": "uv":指定uv作为命令运行器。"args":"--directory", "/path/to/your/MCPDocSearch":重要的是,它会告知uv在运行命令前将工作目录切换到项目根目录。请将/path/to/your/MCPDocSearch替换为系统上的实际绝对路径。"run", "python", "-m", "mcp_server.main":uv将在正确的目录和虚拟环境中执行此命令。
保存此文件并重启 Cursor 后,"doc-query-server" 应会显示在 Cursor 的 MCP 设置中,并可供 Agent 使用(例如,@doc-query-server search documentation for "how to install")。
对于 Claude for Desktop,可参考这份官方文档来设置 MCP 服务
依赖项
使用的主要库:
crawl4ai:核心网页爬取功能。fastmcp:MCP 服务实现。sentence-transformers:生成文本嵌入。torch:sentence-transformers所需。typer:构建爬虫 CLI。uv:项目和环境管理。beautifulsoup4(通过crawl4ai):HTML 解析。rich:增强终端输出。
架构
项目遵循以下基本流程:
crawler_cli:运行此工具并提供起始 URL 和选项。- 爬取(
crawl4ai):该工具使用crawl4ai获取网页,并根据配置的规则(深度、模式)跟随链接。 - 清理(
crawler_cli/markdown.py):可选地使用 BeautifulSoup 清理 HTML 内容(移除导航和链接)。 - Markdown 生成(
crawl4ai):将清理后的 HTML 转换为 Markdown。 - 存储(
./storage/):生成的 Markdown 内容会保存到./storage/目录中的文件。 mcp_server启动:MCP 服务启动时(通常通过 Cursor 配置启动),会运行mcp_server/data_loader.py。- 加载与缓存:数据加载器会检查缓存文件(
.pkl)。如果缓存有效,则从缓存中加载文本块和嵌入;否则,从./storage/读取.md文件。 - 文本分块与嵌入:根据标题将 Markdown 文件解析为文本块。使用
sentence-transformers为每个文本块生成嵌入,并存储在内存中(同时保存到缓存)。 - MCP 工具(
mcp_server/mcp_tools.py):服务通过fastmcp暴露工具(list_documents、search_documentation等)。 - 查询(Cursor):Cursor 等 MCP 客户端可以调用这些工具。
search_documentation使用预先计算的嵌入,根据与查询的语义相似度查找相关文本块。
许可证
本项目采用 MIT License 许可,详情请参阅 LICENSE 文件。
贡献
欢迎贡献!欢迎提交问题或拉取请求。
安全说明
- **Pickle 缓存:**本项目使用 Python 的
pickle模块缓存处理后的数据(storage/document_chunks_cache.pkl)。对不可信来源的数据进行反序列化可能存在安全风险。请确保./storage/目录仅对可信用户/进程开放写入权限。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。