一句话:本文教你把微信公众号接到 Muse——从申请开发者密钥、解决 IP 白名单,到部署 MCP 服务、让 Muse 排版并写入草稿箱,全链路跑通。读完你能复刻出和我一样的管线。
这条管线能做什么、不能做什么
能:
– Muse 直接创建 / 更新 / 删除草稿
– 上传封面图和正文插图
– 按你的审美排版(不是在公众号编辑器里套模板,是 Muse 按指令精排)
– 一键发布(但我们不建议,原因后文讲)
不能:
– 不能替你点”原创声明””留言””赞赏”这些开关——微信没开放 API,只能人手点
– 所以这条管线的终点是草稿箱,不是发布按钮
先看懂链路(30 秒)
Muse(云电脑) → MCP 服务(你的微信管家) → 微信 API(api.weixin.qq.com) → 你的公众号

MCP 服务是关键:它把微信那一堆 HTTP 接口翻译成 Muse 能调用的”工具”(tool),比如 create_draft(建草稿)、upload_image(传封面)。Muse 不需要懂微信 API 文档,只需要会调用工具。
两种部署形态,后文细讲:
1. MCP 跑在 Muse 云电脑本机(127.0.0.1),适合个人尝鲜
2. MCP 跑在你自己的服务器上,Muse 远程调用,适合长期稳定用
第一步:去微信后台拿”钥匙”
- 浏览器打开 mp.weixin.qq.com,用管理员微信扫码登录(必须是管理员,运营者权限不够)
- 左侧菜单 → 设置与开发 → 基本配置
- 记下 AppID(开发者 ID,明文显示)
- AppSecret(开发者密码):点”启用”,按提示用管理员微信扫码验证后可见。这个东西等于密码,只给你的 MCP 服务用,不要发给任何人、不要截图外传。 泄露了立刻点”重置”。

微信开发者平台:左上角进「我的业务与服务」→ 公众号 → 基本配置,点「启用」按三步走完,AppSecret 只显示一次,复制好。
5. IP 白名单:同一页面,”IP 白名单” → 配置。把将要调用微信接口的机器的公网出口 IP加进去。
为什么必须加白名单:微信的 access_token 接口会校验请求来源 IP,不在白名单里直接拒绝。这是整个搭建里最容易卡住的地方,也是下面三条分支的核心分歧点。

「API IP 白名单」→ 编辑,把调用微信接口的机器的公网出口 IP 填进去。注意:是出口 IP,不是你电脑的内网 IP。
access_token 是调用几乎所有微信接口的凭证,有效期 2 小时。好的 MCP 服务会在本地缓存 token、过期前自动刷新,而不是每次调用都重新获取(微信限制每天获取 2000 次)。
拿到 AppID 和 AppSecret 后,怎么安全地交给 Muse?别贴在聊天里——走 Secure Vault 的 connector 录入卡,一张填 AppID、一张填 AppSecret,值只进保险库,Muse 看不到明文:

两张卡都走 Secure Vault,填完跟 Muse 说一声,它就可以开始实测全链路了。
第二步:选一条路(三选一)
核心矛盾就一个:调用微信接口的机器,必须有固定公网 IP 且在白名单里。Muse 的云电脑出口 IP 会变,所以有三条路:

方案 A:Muse 云电脑直连(尝鲜用)
做法:
1. 让 Muse 查自己云电脑的出口 IP:
curl -s ifconfig.me
把输出填进微信后台 IP 白名单。
2. MCP 服务跑在云电脑本机(比如 127.0.0.1:18787),Muse 直接连本机。
坑(实测过的):
– 云电脑出口 IP 会变,且可能有多个 IP 轮替。IP 一变,所有微信接口调用立刻报错,你得重新查 IP、重新加白名单。
– 结论:只适合”我先跑通一次看看”,不适合长期用。
方案 B:固定 IP 服务器做代理转发
架构:Muse 云电脑 → 你的服务器(固定 IP)上的转发服务 → 微信 API。白名单里永远只有你服务器那 1 个 IP。
让你的 agent(或运维)来部署,下面是可直接用的提示词:
目标:在我的服务器(固定公网 IP:___)上部署一个微信 API 代理转发服务,
解决 Muse 云电脑出口 IP 不固定、无法加微信 IP 白名单的问题。
需求:
1. 服务监听端口(建议 127.0.0.1:18788 或按需),接收来自 Muse 的微信 API 调用请求,
原样转发到 api.weixin.qq.com,并把结果返回。
2. AppID / AppSecret 不写进代码和日志,从环境变量或密钥文件读取。
3. access_token 本地缓存:有效期 2 小时,过期前自动刷新;不要每次调用都重新获取
(微信限制每天 2000 次)。
4. 转发服务本身要有简单的鉴权(比如 Bearer token),不要裸奔在公网上。
5. 上传类接口(封面图、正文图片)必须支持:Muse 侧把图片以文件路径或 base64 传过来,
服务负责转成微信要求的 multipart/form-data 上传。
6. 输出:服务地址、鉴权 token 的安全交付方式、以及"如何验证转发成功"的一条测试命令。
约束:不要在任何文件、日志、聊天记录里打印 AppSecret 明文。
封面上传问题的解法(方案 B 的关键细节):微信要求图片以二进制流上传,所以图片文件必须能到达你的服务器。三选一,写进上面的提示词里让 agent 落地:
- MCP 服务暴露上传接口(推荐):Muse 把图片 base64 编码后 POST 给转发服务,服务解码再转给微信。Muse 不需要直连服务器文件系统。
- Muse 经 SSH/scp 传文件:你给 Muse 配好服务器 SSH 密钥,Muse 先
scp图片到服务器某目录,再调转发接口。需要你授权 SSH 访问。 - 图片先传图床:Muse 把图传到你自己的图床 / 对象存储,转发服务按 URL 下载再转给微信。多一次跳转,适合已有图床的人。
方案 C:MCP 服务直接部署在服务器上(推荐长期用)
架构:MCP 服务本体跑在你服务器上(streamable-http + Bearer 鉴权),Muse 远程调用它;MCP 服务再调用微信 API。白名单同样只需要服务器的 1 个固定 IP。
和方案 B 的区别:B 是”哑转发”,Muse 还要懂微信 API 的细节;C 是”真 MCP”,微信的细节(token 缓存、参数格式、错误重试)都封装在 MCP 服务里,Muse 只管调 create_draft 这种高级工具。这也是我们线上在用的形态。
目标:在我的服务器(固定公网 IP:___,已加进微信 IP 白名单)上部署一个
微信公众号 MCP 服务,供 Muse 远程调用。
技术要求:
1. 用 Python + MCP SDK(FastMCP 或官方 mcp 包)实现,传输层用 streamable-http,
鉴权用 Bearer token(token 单独安全交付,不写进代码仓库)。
2. 实现以下工具(每个工具对应微信 API,参数用自然命名):
- get_access_token:获取并缓存 access_token(2 小时有效期,自动刷新)
- upload_image:上传封面图(微信要求正方形,提前按官方尺寸裁好)
- upload_content_image:上传正文插图,返回微信 CDN 的 URL
- create_draft:新建草稿(标题 / 正文 HTML / 封面 media_id / 作者 / 摘要)
- update_draft:更新草稿正文(只换 content,不动标题、作者、摘要、封面)
- get_draft / list_drafts / delete_draft:查看、列出、删除草稿
- publish_draft:发布(默认不启用,留给人工确认后再开)
3. 正文 HTML 的处理:原样透传,不做二次转义;但要记录微信会清洗哪些标签
(实测:<svg>、<a href> 会被剥离,style 里出现 ' 会导致整个 style 被清空),
写进 README,方便排版侧规避。
4. delete_draft 注意:微信 API 要的是 media_id 参数,不要传成 article_id
(这是真实踩过的坑)。
5. 上传接口要同时支持:本地文件路径、base64、图片 URL 三种输入。
6. 输出:服务公网地址、Bearer token 安全交付方式、tools 列表、
以及每条 tool 的一条真实调用示例。
约束:AppID / AppSecret / Bearer token 永不打印明文、不写进 git、不进日志。
怎么选,看这棵决策树:
– 只是想验证”Muse 写公众号”这件事行不行 → 方案 A,今天就能跑
– 有固定 IP 服务器、想稳定用 → 方案 C,一次到位
– 服务器上有现成的网关习惯、或想自己拼装 → 方案 B
第三步:MCP 服务的工具长什么样(细节)
不管你选 B 还是 C,最终 Muse 手里应该是这样一套工具。我们线上 9 个工具实测可用:
get_access_token—— 拿调用凭证,Muse 一般不用直接调,服务内部自动处理upload_image—— 传封面,返回 media_id(微信要正方形封面,提前裁好)upload_content_image—— 传正文插图,返回微信 CDN 地址(mmbiz.qpic.cn),正文里<img src="这个地址">引用create_draft—— 建草稿:标题、作者、摘要走字段,正文走 contentupdate_draft—— 改草稿只换正文,标题 / 作者 / 摘要 / 封面原样保留。这是日常最高频的动作:排版调了 10 版,调的都是 contentget_draft/list_drafts—— 回读验证用(后文”测试草稿验证法”靠它)delete_draft—— 删草稿。注意前面说的参数坑:微信要media_idpublish_draft—— 发布。建议默认不上,或上了也不让 Muse 自己调(见第五步)

第四步:让 Muse 给你排版(核心生产力)
先说微信的清洗铁律——排版前必须知道,否则调 10 版都白搭(都是我们实测的):
- style 属性里不能出现
'(HTML 实体单引号)。一旦出现,微信会静默清空整个 style 属性,那一段排版直接裸奔。解法:字体名用直引号'PingFang SC',style 属性本身用双引号包裹。 <svg>会被剥离。想做标题装饰、印章效果,别用 svg,用字符排出来(◆ ▲ ● ═ 这类)。<a href>会被剥离。外链变纯文本 URL,那就把 URL 本身设计成好看的样式(下划线、品牌色),别指望可点击跳转。- 列表别用
<ul>/<ol>/<li>。某些渲染路径下样式不可控,改成分段 + 菱形 / 数字符号,效果更稳。 - 正文 URL 保留纯文本带样式,不要试图包链接。
下面是可直接喂给你的 Muse 的排版提示词:
你要为微信公众号排版一篇文章。先读懂微信的清洗规则,再动手:
铁律(违反任何一条都会导致排版丢失):
1. style 属性值里不许出现 '(HTML 实体单引号)。字体名用直引号,
如 font-family:'PingFang SC','Microsoft YaHei',sans-serif,style 属性本身用双引号包裹。
2. 不许用 <svg>,微信会整段剥离。装饰用文字符号(◆ ▲ ● ━ ═ 等)。
3. 不许用 <a href>,微信会剥离。URL 保留为带样式的纯文本
(如下划线 + 品牌色),不要指望可点击。
4. 列表内容一律转成分段呈现,不用 <ul>/<ol>/<li>,用符号(◆ ① ② 或自定义编号徽章)引导。
5. 不得擅自改动正文一字一句:排版只加装饰性标签和样式,不增删改文字、
不改变原观点。装饰字符(如章节号 CHAPTER 01)例外,但要事先说明。
工作流:
1. 先问我想要的风格(或按我给定的品牌色 / 参考图出 1 版)。
2. 生成完整 HTML 后,先在本地渲染截图给我看效果,我确认后再进草稿。
3. 进草稿前走"测试草稿验证":新建测试草稿 → 回读 → 检查 0 空 style、
图片数量对得上、正文逐字一致 → 再写入正式草稿 → 删除测试草稿。
4. 正式草稿只更新 content 字段,标题、作者、摘要、封面保持不动。
输出:可直接写入草稿的完整 HTML + 本地预览截图。
这套提示词的要点:把”微信会洗掉什么”前置,Muse 就不会在雷区里反复横跳;把”测试草稿验证”写进流程,排版事故率直接归零。
下面是这套提示词在我这边的真实跑法——先让 Muse 出 4 版主题,我挑一版(当时选了第 3 个「宋式·雅」):

4 版主题一次看完,挑顺眼的直接套进草稿(只换排版,文字不动)。想看别的主题,报名字就行。
以及”最极端”压力测试的提示词实战——直接告诉 Muse”什么花里胡哨都可以上”,看它的设计上限:

提示词原文 + Muse 的执行汇报:设计概念、火力全开的点、微信清洗规则遵守情况,一次讲清。
最终写进草稿箱、在公众号后台里长这样:

深色 hero + 首字放大 + 一句话定位框,进了微信后台样式一处没丢——说明上面的铁律都守住了。
第五步:发布到草稿箱,人工验证,手动发布
流程:
- 样式确认后,Muse 把 HTML 写入正式草稿(
update_draft,只换 content)。 - 你在手机 / 电脑上打开公众号后台,预览草稿:看排版、看图片位置、看有没有被微信清洗掉的东西。

草稿箱里的样子:封面、标题、更新时间一目了然。点进去逐屏检查,没问题再走第 4 步。
3. 需要改 → 告诉 Muse 哪里要调,回到第四步。草稿可以反复改,零成本。
4. 不需要改 → 你自己在后台完成最后一步。
为什么最后一步必须是人?因为微信的发布 API 是”裸发”——它只接受一个 media_id 就发出去了,而后台那一堆设置(原创声明、赞赏、留言、合集、原文链接、广告)微信根本没开放 API,Muse 碰不到。原创声明关系到著作权保护和推荐加权,留言区是你的互动资产,这些不值得为了省一次点击而丢掉。
所以这条管线的标准终点就是草稿箱。Muse 负责:写稿、配图、精排、进草稿;人负责:预览验证 + 后台设置 + 点发布。各干各擅长的。
片尾:我们的搭建故事(坑和解法)
这套管线不是一次写成的,是被真实需求逼出来的。
起因:我想把一篇 X Article(一万多字、19 张插图)同步到公众号。X 的远程浏览器登录被拒,未登录状态只能扒到 1 张封面图——文章正文里的插图全在登录态后面。于是决定:X 的登录问题走长期方案(自建支持 OAuth 的 X connector),微信这边先自己搭 MCP,把”Muse 直写草稿”的链路跑通。
坑 1:两个微信 MCP,功能不一样。
运维搭的远程版只有 8 个工具,没有 update_draft;我本机自建的才有 9 个,含 update_draft。结论:更新草稿必须走本机服务。如果你发现”建草稿行、改草稿不行”,先查工具列表,大概率是服务版本不对。
坑 2:delete_draft 的参数 bug。
服务端的 server.py 里用了 article_id 参数,微信 API 要的是 media_id,调用直接报错。修了一行代码、重启服务解决。教训:微信的报错信息很吝啬,调不通时先对着官方文档逐个核对参数名。
坑 3:' 清空 style。
这是最阴的一个:排版在本地预览完美,一进草稿部分样式全丢。排查发现是某主题导出的 HTML 里字体名用了 ' 包裹,微信静默清空了整个 style 属性。解法:全局替换成直引号。现在这条已经写进上面的排版提示词铁律第一条。
坑 4:<svg> 和 <a href> 被剥离。
标题花瓶、印章装饰(svg)在草稿里直接消失;外链(a href)变成纯文本。接受现实:装饰用字符画,链接做成好看的纯文本样式。
坑 5:微信 CDN 图链有防盗链。
正文插图传进微信素材库后,返回的是 mmbiz.qpic.cn 的地址——这个地址只能在微信体系内加载,在外部浏览器 / 预览工具里打不开。这是预期的,不影响发布。给自己做本地预览时,把图片转 base64 内嵌进 HTML 就能看。
现在这条管线每天在干的事:写完文章 → Muse 排版 → 本地截图确认 → 测试草稿验证 → 正式草稿 → 我手机预览 → 后台点发布。从”你写了篇东西”到”躺在草稿箱里等发布”,全程不用打开公众号编辑器。
如果你也在搭,卡住的地方大概率不出上面这五个坑。欢迎带着报错信息来找我聊。
了解 ~/jintaoblog/朝夕见闻志⚡️ 的更多信息
订阅后即可通过电子邮件收到最新文章。
