公众号图文发布 MCP Server(wechat-mp-mcp)
把「微信公众号图文发布」封装成标准 MCP 工具,让 WorkBuddy 的 Agent 在对话中直接创建内容并一键发布。
已在真实项目 wechat-mp-mcp 验证可用(构建通过、8 工具注册、错误包裹生效)。
何时用
- 用户想在 WorkBuddy 里写文章并直接发公众号。
- 需要「本地 stdio MCP + 外部 API」的可复用模板(封面/正文图上传、草稿、发布、状态查询)。
- 想要把已有 Web Agent(如 wechat-mp-agent)的发布能力下沉为 MCP,供任意 MCP 客户端复用。
架构
- 传输:stdio(本地子进程)。WorkBuddy 通过
~/.workbuddy/mcp.json拉起node dist/index.js。 - 语言:TypeScript +
@modelcontextprotocol/sdk+zod。Node ≥ 18(用原生 fetch/FormData,无原生依赖)。 - 模块:
wechat.ts(API 客户端 + 错误包裹)、index.ts(MCP 工具注册)。 - access_token 本地缓存到
data/wechat-token.json(提前 5 分钟过期)。
工具清单(8 个)
wechat_upload_thumb / wechat_upload_content_image / wechat_add_draft / wechat_publish_draft /
wechat_get_publish_status / wechat_list_drafts / wechat_get_draft / wechat_publish_article(一键工作流)。
wechat_publish_article 端到端:校验 → 上传封面(给本地路径时)→ 正文 <img> 本地图片自动上传改写 → 建草稿 → freepublish 发布;skip_publish=true 仅建草稿。
复用步骤(生成新实例)
references/下有现成package.json、tsconfig.json、wechat.ts、index.ts,直接拷到新目录。npm install --registry=https://registry.npmmirror.com(注意:本机 Bash 沙箱禁网,需dangerouslyDisableSandbox:true才能联网装包;PowerShell/Node 直连正常)。npm run build→dist/。- 在
~/.workbuddy/mcp.json的mcpServers合并一个条目:
json "wechat-mp-mcp": { "command": "C:/Users/Administrator/.workbuddy/binaries/node/versions/22.22.2-2/node.exe", "args": ["<项目绝对路径>/dist/index.js"], "env": { "WECHAT_APPID": "", "WECHAT_APPSECRET": "" } } - 在项目目录
.env填入WECHAT_APPID/WECHAT_APPSECRET(mcp.json 的 env 留空会回退到.env)。 - 务必把运行机器公网 IP 加入公众号后台「IP 白名单」,否则
40164。 - 重启 WorkBuddy,对话中即可调用工具。发布接口要求已认证服务号。
关键坑位
- 沙箱禁网:Bash 里
npm install须dangerouslyDisableSandbox:true,否则 npm 会静默 exit 0 且不写 node_modules(极难排查)。 - TS 输出类型:工具结果
content的type必须字面量"text",用CallToolResult标注返回类型,否则tsc报类型不兼容。 - 错误包裹:所有微信侧失败用带
hint的自定义错误,返回{ content:[{type:"text",text:"❌ ..."}], isError:true },让 Agent 可自愈。 - 日志走 stderr:MCP 用 stdout 通信,所有
console.log必须改console.error,否则协议被污染。 - freepublish 限认证号:未认证账号只能自动到草稿箱(
skip_publish=true),再到后台群发。 - 智能降级(48001):
wechat_publish_article与wechat_publish_draft探测到48001(本号无 freepublish 权限)时不报错中断,自动停在草稿并返回{ degraded:true, status_text, tip }友好结果;其他错误码仍按异常抛出。这样订阅号/未认证服务号用同一套工具也稳。
验证
node test-client.mjs 以 MCP 客户端连本服务,列出 8 工具并验证错误包裹(用假凭证触发 40013,确认返回带建议的中文错误)。