MIT 开源项目 mcp-my-site 提供网站爬取索引工具和 ASP.NET Core 远程 MCP 服务,让助手直接检索站点并引用页面。项目面向千页以内的网站,关键词检索模式只需 .NET 10 SDK,无需 API 密钥。
现在,人们往往会先问 AI 助手,再打开搜索框。当有人向 ChatGPT 或 Claude 询问我写过的内容时,回答要么来自模型的记忆,要么来自一次不一定能找到我网站的网页搜索。我希望助手能直接向我的网站提问,并引用它实际使用的页面。
Model Context Protocol(MCP)就是实现这一点的标准方式。网站提供一个包含少量工具的服务器,任何 MCP 客户端都可以调用这些工具。于是,我开发了 mcp-my-site:一个用于抓取网站的命令行索引工具,以及一个小型 ASP.NET Core 应用,将索引结果作为远程 MCP 服务提供。它采用 MIT 许可证,面向页面数量少于 1,000 的小型网站。
继续阅读之前,你可以先试试看。下面这个在线实例索引了我自己的网站:
claude mcp add --transport http pournasserian https://ai.pournasserian.com/mcp
此外还有一个 playground,它是运行在浏览器中的 MCP 客户端,让你无需安装任何东西就能调用工具。
你需要安装 .NET 10 SDK。首次运行除此之外不需要任何东西,也不需要 API key。
dotnet tool install --global mcpmysite
mcpmysite init https://example.com --keyword-only # writes appsettings.json
mcpmysite build # crawls the site into ./index
mcpmysite search "how can I contact you" # checks the index
docker run --rm -p 5000:8080 -v "$PWD/index:/index:ro" -e Index__Path=/index ghcr.io/pournasserian/mcp-my-site:latest
启动后,服务器地址为 http://localhost:5000。/mcp 是供 Agent 使用的端点,/playground 让你在浏览器中试用,/api/search?q=contact 返回 JSON,/healthz 显示已加载的索引。使用以下命令连接 Claude Code:
claude mcp add --transport http mysite http://localhost:5000/mcp
不使用 Docker 的话,也可以克隆仓库后运行服务器。
混合搜索,支持降级。 关键词搜索匹配字词,向量搜索匹配语义,因此即使问题的表述与页面不同,也能找到对应内容。服务器会针对每次查询执行 BM25 搜索和基于 embedding 的向量搜索,再融合两组排名。如果查询时 embedding 服务提供方不可用,就会降级为关键词搜索,并在响应中说明。在线演示使用的是混合搜索。
没有 key 也能用。 我不希望第一次运行就得先注册某个服务。--keyword-only 会构建不含向量的索引,不访问任何 embedding 端点,也不读取任何 key。代价是无法按语义匹配:如果一个页面只写了“contact”,搜索“how do I reach you”就找不到它。需要语义匹配时,只需修改一项设置、设置 AI_API_KEY,然后重新构建。embedding 端点可以使用默认的 OpenRouter,也可以使用任何兼容 OpenAI 的服务:OpenAI、Azure OpenAI、Gemini、Ollama,或者 LiteLLM 代理。key 从环境变量读取,绝不会写入文件。使用默认模型时,小型网站生成 embedding 的费用还不到一美分。
遵循 ChatGPT connector 的接口约定。 服务器通过 Streamable HTTP 提供 MCP 服务,并暴露 search 和 fetch 两个工具。它们遵循 ChatGPT connector 期望的数据格式:每条搜索结果都有一个 id,fetch 接收这个 id,并以文本形式返回页面。其他客户端也可以向 fetch 传入 url。服务器还会发送根据网站自身内容生成的 instructions,让模型知道网站讲什么,以及何时使用这些工具。它可以配合 Claude Code、Claude Desktop、VS Code、Cursor 和 MCP Inspector 使用。
每个服务器对应一个网站。 没有多租户功能,也没有管理界面。配置保存在 appsettings.json 文件中。索引工具会自动提取每个页面的主要内容,因此不需要维护 CSS 选择器。服务器会轮询索引来源,无需重启就能切换到新构建的索引。因此,更新时只需在 CI 中构建,再将索引文件夹发布到服务器轮询的 URL。
为你自己的网站提供搜索 API。 同一套搜索代码也支撑着 GET /api/search,并提供 CORS、限流和 OpenAPI 文档。用户指南中还提供了一段可直接嵌入的搜索框代码。
它可以索引通过 HTTP 访问的纯 HTML 页面,也可以索引一个存放已构建 HTML 的文件夹。不支持依赖 JavaScript 渲染的网站、PDF,以及需要登录才能访问的页面。每次构建都会完整重建索引,但内容未变的分块不会重新生成 embedding。
代码仓库:https://github.com/pournasserian/mcp-my-site
在线演示:https://ai.pournasserian.com(playground 位于 /playground,API 参考文档位于 /docs)
NuGet:https://www.nuget.org/packages/mcpmysite
Docker 镜像:ghcr.io/pournasserian/mcp-my-site
有三类反馈最有帮助。第一,按照文中的步骤,快速上手是否顺利,哪些地方出了问题。第二,它在你的网站上表现如何:哪些页面的内容提取有误,哪些问题返回了错误的页面。索引工具会生成一个 report.json,列出文本内容偏少的页面,提交 issue 时附上这个文件会很有帮助。第三,你试过哪些 MCP 客户端,尤其是 ChatGPT connector,以及任何我没有列出的客户端。
问题和想法请发到 Discussions,bug 请提交到 Issues。
如需采取进一步行动,你可以考虑屏蔽此人和/或举报滥用行为。