---
title: mdorigin：面向 Agent 的内容发布工具
date: '2026-03-27 08:26:58'
draft: false
summary: 我想要的不是又一个博客系统，而是一个面向 Agent 的内容发布工具。对人类浏览器默认返回 HTML，对工具和 Agent 直接返回 Markdown。
slug: mdorigin-agent-publishing-tool
tags:
- mdorigin
- markdown
- ai-agent
topics:
- ai
- software-engineering
type: post
syndication:
- platform: Weibo
  url: https://weibo.com/ttarticle/p/show?id=2309405281000820703296
- platform: X / Twitter
  url: https://x.com/jolestar/status/2037325469750854120
---

![mdorigin 封面图](./cover.png)

前一段时间，我一直在找一个工具，给项目搭 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

## 一个最直接的例子

比如访问同一个地址：

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

默认会返回 HTML。

如果显式声明想拿 Markdown：

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

它会直接返回这棵目录下的首页，也就是 `index.md` 或 `README.md`。

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

- <https://github.com/jolestar/mdorigin/tree/main/docs/site>

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

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

## 只是浏览还不够，还需要检索

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

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

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

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

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

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

```bash
curl "https://mdorigin.jolestar.workers.dev/api/search?q=how%20to%20deploy%20to%20cloudflare"
```

```json
{
  "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 视图比主题皮肤更重要。

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

## 项目地址

- GitHub: <https://github.com/jolestar/mdorigin>
- 文档站: <https://mdorigin.jolestar.workers.dev>
- npm: <https://www.npmjs.com/package/mdorigin>

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