午夜咖啡午夜咖啡

jolestar 的文章与笔记。

Post

mdorigin:面向 Agent 的内容发布工具

2026-03-27 08:26:58Post

我想要的不是又一个博客系统,而是一个面向 Agent 的内容发布工具。对人类浏览器默认返回 HTML,对工具和 Agent 直接返回 Markdown。

mdorigin 封面图

前一段时间,我一直在找一个工具,给项目搭 docs 或者搭个人博客,但我真正想要的并不是又一个博客系统,而是一个面向 Agent 的内容发布工具

对我来说,关键不是页面怎么渲染,而是内容能不能被 Agent 直接访问、直接消费。为了做到这一点,Markdown 就不能只是写作时的源文件,而是可以直接对外输出。

我看了不少现有系统,它们大多还是默认把 Markdown 当成源文件,真正稳定对外暴露的只有 HTML。

这个模式对浏览器阅读当然没问题,但一旦内容还要被 Agent 消费,问题就出来了:

  • Agent 想读原文,往往只能去啃 HTML
  • HTML 里混着导航、侧边栏、脚本和样板结构,信噪比很差
  • 同一份内容的目录结构、发布路由和原始文件路径经常脱节
  • 博客、文档、Skill 仓库和知识库之间也缺少统一模型

最后只好自己做了一个:mdorigin

mdorigin 想解决什么

mdorigin 想解决的不是“怎么把 Markdown 编译成一个网站”,而是更前面的问题:

一棵 Markdown 内容树,能不能直接成为网站本身,同时又保持对工具友好。

它的工作方式很简单。给它一个 Markdown 目录,它就通过 HTTP 服务把这棵目录直接暴露出去,再根据请求方式自动选择返回什么视图:

  • 对人类浏览器,默认返回 HTML
  • 对工具和 Agent,直接返回 Markdown 文本

换句话说,mdorigin 的核心不是“编译”,而是“稳定暴露”。

同一棵内容树,可以同时有两种视图:

  • 给人看的 HTML
  • 给工具和 Agent 看的 Markdown

一个最直接的例子

比如访问同一个地址:

curl https://mdorigin.jolestar.workers.dev/

默认会返回 HTML。

如果显式声明想拿 Markdown:

curl -H "Accept: text/markdown" https://mdorigin.jolestar.workers.dev/

它会直接返回这棵目录下的首页,也就是 index.mdREADME.md

而这棵内容树本身,在 GitHub 上也可以直接浏览:

所以这个模型里,仓库里的 Markdown 目录、站点发布出去的内容、Agent 实际消费的原文,三者是对齐的,不需要再额外做一层“导出给工具”的转换。

然后再把代码和 Markdown 文件一起发布到 Cloudflare Workers 上,就可以得到一个既能给人访问,也能给 Agent 直接读原文的站点。

只是浏览还不够,还需要检索

当然,只把内容暴露出来还不够。只要文档规模一上来,检索就会成为基础能力。

很多文档网站的检索都是直接做在前端 JavaScript 里,这对传统站点没问题。但如果我们希望同一套内容还能被 Agent 和工具直接消费,就更自然的做法是:索引也应该跟着内容一起构建和发布。

于是我又补了一个更底层的检索工具:indexbind

我对它的要求也比较明确:

  1. 可以基于 Markdown 构建索引
  2. 索引能和代码、内容一起发布
  3. 能跑在 Workers 这类环境里,而不是强依赖一整套独立服务

基于 mdorigin 部署的网站,现在可以直接提供一个搜索接口:

curl "https://mdorigin.jolestar.workers.dev/api/search?q=how%20to%20deploy%20to%20cloudflare"
{
  "query": "how to deploy to cloudflare",
  "topK": 10,
  "count": 10,
  "hits": [
    {
      "docId": "/guides/cloudflare",
      "relativePath": "guides/cloudflare.md",
      "canonicalUrl": "https://mdorigin.jolestar.workers.dev/guides/cloudflare",
      "title": "Cloudflare Deployment",
      "summary": "Build a user-project Worker bundle and initialize Wrangler config.",
      "metadata": {},
      "score": 0.03201844170689583,
      "bestMatch": {
        "chunkId": 5415122407870905000,
        "excerpt": "That lets agents fetch markdown directly from the site domain without adding `.md` to the URL.",
        "headingPath": [
          "Cloudflare Deployment",
          "Initialize Wrangler config"
        ],
        "charStart": 1157,
        "charEnd": 1251,
        "score": 0.7150935530662537
      }
    }
  ]
}

这样同一棵内容树就不只是能被人浏览、被 Agent 读原文,也能被程序直接检索。

mdorigin 刻意没有提供太多模板和样式,因为这件事太容易变成无底洞,我以前也在博客样式上花过很多时间。

这次我刻意提醒自己:如果未来网站越来越多地被 Agent 访问,那么 Markdown 视图比主题皮肤更重要。

对我来说,内容系统首先要解决的,不是页面怎么渲染,而是内容能不能被直接访问和直接消费。

项目地址

有需要的朋友自行取用,或者 fork 自定义。