封面

我这个人写博客有个习惯:文章是 AI 帮我一起写的,但发布这一步一直是手动的——登录服务器,把 Markdown 文件丢进目录,跑一下构建脚本。一两次没什么,次数多了就烦了:凭什么 AI 都能把文章写完了,最后"复制文件"这一步还得我来?

所以我决定把发布这条路打通:让智能体(我自己的助手小K、ChatGPT 里的 Dot、以及其他 AI 工作台)能够自己把文章发到 howie.wang 上。这篇文章记录整个改造过程,以及路上踩到的坑。

第一步:先做一个"笨"接口

最早的想法很直接:博客本质就是个文件夹,里面有 Markdown 文章和图片,构建脚本扫描一下生成页面。那我只要做一个接口,帮智能体把文件"安全地放到正确的位置",不就完事了?

于是有了第一版 Publish API,就三个接口:查状态、发文章、查文章。设计上有几条铁律:

  • 接口只干一件事:把对的文件安全地放到对的位置。不做编辑器、不做后台、不做用户系统
  • 智能体永远拿不到 SSH:它只知道一个 API 地址和一个 Token
  • 该拦的都拦:slug 只允许字母数字(防目录穿越)、图片只收五种格式、单张限 10MB、已存在的文章默认拒绝覆盖(返回 409,必须显式传"我要覆盖"才能更新)
  • 写文件用原子写入:先写临时文件再改名,不会让读者看到"半篇文章"

这一版做完全链路测试的时候还挺有成就感的:一条 curl 命令,Markdown 加三张图,几秒后文章就在博客上了。

💡 这里是浩哥AI实验室,专注分享「一个人+AI」的真实实战记录。从工具测评到项目搭建,从踩坑经验到行业观察,用大白话讲清楚 AI 到底能干什么、不能干什么。觉得有用的话,欢迎关注,每周持续更新 👇

意外:接口做好了,AI 却"不敢用"

我以为故事到这就结束了,直到我把 Token 发给 Dot(ChatGPT 里的智能体),它回复我:它的运行环境有安全限制,不能拿用户提供的裸 Token 直接调外部接口。

当时还有点懵:安全限制拦的居然是"听话"的一方。但转念一想,这限制其实很合理——如果每个 AI 都随手把用户给的密钥塞进请求头,密钥就可能出现在日志、上下文、甚至模型的记忆里。凭证不该经智能体的手。

Dot 给的方案很专业:像"连接 GitHub"那样,做一个私有的 MCP 插件,用标准 OAuth 授权。我评估了一下,这确实是标准做法,于是照单全收。

第二步:把接口升级成 MCP

MCP(Model Context Protocol)是现在各家 AI 平台通用的"工具插座"标准。说白了,就是把我的发布能力包装成三个"工具":

  • blog_status:看看发布服务活着没
  • blog_get_article:查某篇文章发过没有
  • blog_publish:发布文章(支持带图、支持更新)

认证方式从"你拿着 Token"变成了"你授权一次"。流程变成这样:我在 ChatGPT 里点添加连接器 → 弹出我的授权页面 → 输入只有我知道的账号密码 → 完成。之后凭证由 OpenAI 的连接系统托管,智能体全程接触不到密钥,它只管调用工具。

这个授权还带权限划分:只读授权的令牌能查文章但不能发,发布权限是单独一项。每次调用,我的服务器都会验证令牌和权限,而不是相信"请求来自某个大平台"这种可以伪造的说法。

自测抓到一个真 Bug

这里必须诚实记录一件事。权限功能写完后我跑测试,用一个只读令牌尝试调用发布工具——居然成功了。

检查代码,权限判断写错了:只判断了"有没有令牌",没判断"令牌有什么权限"。这就是自测的价值——如果直接上线,任何一个拿到只读授权的东西都能往我博客上发东西。修完之后我把所有"令牌 × 工具"组合跑了一遍矩阵测试:只读令牌调发布会被明确拒绝,读写令牌一切正常。

另外 OAuth 授权页也做了基础的防爆破:密码连错五次,这个 IP 锁五分钟。令牌有效期 30 天,想撤销随时清掉,不用换服务器密码。

现在的发布流程

改造完之后,发一篇文章的完整流程是这样的:

  1. 我(或者任何智能体)把写好的 Markdown 和图片准备好
  2. 调一次发布接口,或者让 Dot 在对话里直接调工具
  3. 服务器自动校验、落盘、重建页面
  4. 几秒后,文章出现在博客上,返回的文章链接直接给读者

这篇《让 AI 自己发博客》本身,就是通过这条链路发布的——写完稿、生成头图、一次接口调用,没有 SSH,没有手动复制文件。

几点思考

给智能体开权限,本质是设计一个"可撤销的最小权限系统"。 没上线之前我觉得安全设计是麻烦,做完才发现恰恰是这些限制(白名单、409、scope、原子写入)让敢把发布权交出去。限制不是能力的敌人,是授权的前提。

平台的安全限制在推着整个生态变规范。 Dot 拒绝裸 Token 这件事,短期看是麻烦,长期看是在逼所有人用 OAuth 这类可托管、可撤销的授权方式。AI 时代凭证的暴露面比人大得多——模型上下文里什么都有。

"笨接口"比"聪明系统"好维护。 整条链路没有数据库、没有用户系统、没有后台管理界面,博客的生成逻辑一行没改。接口的全部工作就是把文件安全地放对位置。能用简单方案跑稳的事,就别急着建系统。

下一步,我打算让小K直接在这个接口上做定期的内容发布实验——当然,那又是另一篇故事了。