wechat-use
GitHubBlog

指南 / Guides

集成到你的 agent

让任意 AI agent 直接给你的微信发消息、读历史 —— 纯后台 LLDB,不碰 UI,不重签 WeChat.app,不重新登录。对上层框架,wechat-use 暴露三个稳定的网络面:本地 HTTP+SSE bridge、Wechaty Puppet gRPC gateway、以及可远程调用的 REST /v1底层全部走同一个 wechatd daemon,没有第二套业务逻辑。

先看端口图

三个面,三个 loopback 端口。1840118402 由同一个 wechat-wechaty-gateway 进程一起起。

port map
# 18400  本地 HTTP + SSE bridge   →  wechat-bridge 进程
# 18401  Wechaty Puppet gRPC      →  wechat-wechaty-gateway 进程
# 18402  REST /v1(可走 tunnel 远程)→  同一个 gateway 进程
📌 关于 MCP
wechat-use 目前没有独立的 MCP server。要把它接进 agent,用下面三个面里最贴合你框架的那个即可 —— webhook 形态走 18400 的 Hermes shape,Wechaty 生态走 18401,自定义 / 远程 agent 走 18402 的 REST /v1。别去找不存在的 MCP 端点。

面一:本地 HTTP + SSE bridge(18400)

最通用的入口。wechat-bridge 绑在 127.0.0.1:18400,只走 loopback。给 agent 提供 REST 读写 + 一条 SSE 实时消息流。

入口 & 鉴权

路由

例子

bash
# 拿一个起始游标(别用 since=0,否则回填全部历史 1.3MB+)
$ wechat new-messages -n 1 --json    # 取里面的 create_time

# 订阅实时消息流
$ curl -N http://127.0.0.1:18400/messages/stream?since=1719800000

# 发一条
$ curl -XPOST http://127.0.0.1:18400/send -d '{"to":"wxid_xxx","text":"hi"}'
⚠️ SSE 坑
/messages/stream 默认 ?since=0,连上会把全部历史灌给你。agent 一定要带 ?since=<epoch>,起始值用 wechat new-messages -n 1 --json 里的 create_time

Hermes shape —— 接 n8n / Dify 零改造

--shape hermes(或走 BridgeShape)后,多出一个 POST /typing,并且 SSE 的 wire shape 切成和 Hermes 的 WhatsApp-bridge 完全一致。所以 n8n / Dify / 各种 webhook adapter 直接对接,不用写适配层 —— 这是首选的框架集成路径。

群里想「只 @ 才回」?设 WECHAT_BRIDGE_GROUP_MENTION_ONLY=1,没被 @ 的群消息在 wire 层就丢掉。

面二:Wechaty Puppet gRPC gateway(18401)

wechat-wechaty-gateway127.0.0.1:18401 上实现标准 Wechaty Puppet 服务(tonic gRPC)。任何现成的 Wechaty TS SDK bot 把 gRPC puppet 指到这个地址、带上 bearer,相对普通 Wechaty puppet 零代码改动就能跑在真实 macOS 微信账号上。

已实现的 Puppet RPC

真实现的部分(节选):start / stop / version / ding / logoutcontact_list / contact_payload / contact_alias / contact_avatarmessage_send_text / message_payload / message_image / message_file、以及 friendship_search_phone / friendship_add / friendship_accept 等。消息事件通过订阅 daemon 推流给 gRPC 客户端。

鉴权模式(WECHATY_GATEWAY_AUTH_MODE)

ts
// 一个普通 Wechaty bot,puppet 指到本地 gateway
const bot = WechatyBuilder.build({
  puppet: 'wechaty-puppet-service',
  puppetOptions: {
    endpoint: '127.0.0.1:18401',
    token: process.env.WECHATY_GATEWAY_BEARER,
  },
})

面三:REST /v1 bridge(18402)—— 远程调用

版本化的 JSON REST,由 gateway 进程和 gRPC 一起起在 127.0.0.1:18402。给 LangChain / 自定义 agent / 远程服务用,可本地直连,也可以透过 Cloudflare Tunnel 远程暴露。

路由

鉴权和 gRPC gateway 共用同一个 AuthMode(static bearer / jwt),每个数据路由都过 subscription gate。

远程暴露:wechat-use tunnel

想让公网上的 agent / Worker 调用本机微信,用 Cloudflare Tunnel 把 18402 安全穿出去。需要你自己的 CF zone。

bash
# 一键 11 步:装 cloudflared → 建 tunnel → CNAME → 起服务
# → 等 /health 200 → 注册 → 把 bridge 鉴权从 static 翻成 jwt
$ wechat tunnel setup --hostname wx.yourdomain.com

$ wechat tunnel status              # cloudflared 健康 + 远端可达 + 当前鉴权模式
$ wechat tunnel token                # 给远程 bot 铸一个 1h TTL 的 JWT
$ wechat tunnel teardown             # 拆掉,翻回 static,保留 ~/.cloudflared 复用
✅ fail-closed
tunnel setup 任一步失败会全自动回滚;成功后会 smoke-test /v1/sessions 必须返回 401(证明 jwt 鉴权已生效),并打印远程 Worker 该设的环境变量:WECHAT_USER_TOKEN / WECHAT_MACHINE_ID / WECHAT_TUNNEL_URL

选哪个面 —— 按框架对号入座

你的框架 / 场景接哪个面入口
Wechaty bot面二 gRPC127.0.0.1:18401 + bearer,SDK 零改
n8n / Dify / webhook adapter面一 Hermes shape18400 --shape hermes,SSE+/typing 零适配
Hermes面一 Hermes shapewire shape 与 WhatsApp-bridge 一致
LangChain / 自定义 agent / 远程服务面三 REST /v118402 本地直连,或 tunnel + JWT 远程
所有场景的实时推送daemon 订阅SSE(18400)或 gRPC event stream(18401),毫秒级,别轮询
📌 前提
三个面都要求 wechat init 已取到 DB key、daemon 在跑、且已用 wechatuse_ 激活码 wechat auth activate 过 —— 订阅在 daemon 内部强制(401/402),网络面无法绕过。发消息前还有一次性 warmup:微信重启后第一条 senddelivery_verify_timeout,手动在微信里发一条(比如给 filehelper)接通发送管线后再重试。详见 安装发送