Skip to main content
Glama
WhatsApp MCP Stream

WhatsApp MCP Stream

by BusinessNone

WhatsApp MCP Stream

[CI

一个基于 Streamable HTTP 传输构建的 WhatsApp MCP 服务端,使用 Bailys 实现 WhatsApp 连接,并附带 Web 管理界面和双向媒体流(上传 + 下载)。

要点:

  • 传输:位于 /mcp 的 Streamable HTTP

  • 引擎:Baileys

  • 管理界面:二维码、状态、退出登录、运行时设置、聊天历史记录查看器

  • 媒体:上传端点 + /media 托管 + MCP 下载工具

快速开始(Docker)

# build and run

docker compose build

docker compose up -d

服务器可通过以下地址访问:

  • 管理界面:http://localhost:3001/admin

  • MCP 端点:http://localhost:3000/mcp

  • 媒体文件:http://localhost:3000/media/<filename>

Related MCP server: WhatsApp Business API MCP Server

在带 --ifconfig=false 的主机上进行 DNS

在某些 NAS / 加固主机(例如启用了 dockerd --iptables=false 的 Synology)上,Docker 内嵌的 DNS 代理(127.0.0.11)没有 iptables DNAT 规则,因此会拒绝容器内的连接。

修复:复制 resolv.conf.example 到 resolv.conf,并添加一个卷覆盖:

cp resolv.conf.example resolv.conf

然后将和内容添加到本地 docker-compose.override.yml(不提交):

services:
  mcp-whatsapp:
    volumes:
      - ./resolv.conf:/etc/resolv.conf:ro

docker compose up 会自动加载这个 override 文件。

运行时设置

设置可以在管理界面中编辑,并持久化到 SETTINGS_PATH(默认是 MEDIA_DIR/settings.json)。

管理界面

管理界面 管理控制台,包括运行时设置、二维码关联、聊天记录查看器、导出和状态。

支持的设置:

  • media_public_base_url

  • upload_max_mb

  • upload_enabled

  • max_files_per_upload

  • require_upload_token

  • upload_token

  • auto_download_media

  • auto_download_max_mb

认证

内置认证尚未实现。在生产环境中,请使用强制认证的网关。此项目在 authmcp-gateway 之后运行良好:

https://github.com/loglux/authmcp-gateway

媒体上传 API

Base64 JSON:

curl -X POST http://localhost:3003/api/upload \
  -H "Content-Type: application/json" \
  -d {filename:photo.jpg,mime_type:image/jpeg,data:<base64>}

Multipart(建议用于大文件):

curl -X POST http://localhost:3003/api/upload-multipart \
  -F "file=@/path/to/file.jpg"

两者都会返回 url,并且(如果配置了)还会返回 publicUrl。

通过 send_media 发送本地文件

项目根目录中的 ./files/ 目录被绑定挂载到容器内的 /app/files 路径。把文件放到该目录后即可立即引用——无需重启容器:

# On host:
cp report.pdf /path/to/whatsapp-mcp-stream/files/

# In send_media:
media_path: /app/files/report.pdf

如果使用 URL 源,直接将 media_url 传给 send_media 或 stage_media 即可——服务器会自行下载文件,不用 base64。

上传认证(可选)

如果 require_upload_token=true,请通过以下任一方式提供 token:

  • x-upload-token: <token>

  • Authorization: Bearer <token>

MCP 传输

服务器在 /mcp 上暴露 Streamable HTTP。

典型流程:

  1. 使用 JSON-RPC initialize 发送 POST /mcp

  2. 在进行后续请求时使用返回的 mcp-session-id 请求头

  3. 通过 POST /mcp 进行工具调用

注意:客户端在 initialize 时必须发送 Accept: application/json, text/event-stream。

Smoke 测试

对 MCP 工具进行的快速回归冒烟测试:

npm run smoke:mcp

可选的中的:

MCP_BASE_URL=http://localhost:3003 npm run smoke:mcp

MCP 工具

认证

工具

描述

get_qr_code

获取最新的 WhatsApp 二维码图片,用于身份验证。

check_auth_status

检查 WhatsApp 客户端是否已通过认证并准备就绪运行。

logout

退出 WhatsApp 并清除当前会话。

联系人

工具

描述

search_contacts

变量

默认值

描述

DB_PATH

<SESSION_DIR>/store.sqlite

用于聊天/消息持久化的 SQLite 数据库路径。

WA_EVENT_LOG

0

启用详细的 WhatsApp 事件日志。

WA_EVENT_STREAM

0

将原始 Baileys 事件流写入文件,以便深度调试。

WA_EVENT_STREAM_PATH

/app/logs/wa-events.log

事件流日志的文件路径。

WA_RESYNC_RECONNECT

1

在强制重新同步后启用重连安全网。

WA_RESYNC_RECONNECT_DELAY_MS

15000

强制重新同步后重连前的延迟(毫秒)。

WA_SYNC_RECOVERY_COOLOWN_MS

300000

自动应用状态恢复之间的最小延迟。

WA_SYNC_RECOVERY_WINDOW_MS

900000

用于统计重复应用状态损坏失败的时间窗口。

WA_SYNC_SOFT_RECOVERY_LIMIT

2

软恢复次数达到该值后升级为内部重启。

WA_READINESS_GRACE_MS

180000

恢复/断开连接期间,/healthz 转为不健康前的宽限期。

WA_DISCONNECT_RECOVERY_DELAY_MS

30000

socket 关闭后,断开看门狗强制重连/重启前等待的时间。

WA_DISCONNECT_RECOVERYRESTART_CODES

428

逗号分隔的断开状态码,这些状态码应直接升级为内部重启看门狗。

WA_SEND_DEDUP_WINDOW_MS

45000

在此窗口内,抑制到同一 JID 的完全重复 send_message 请求。

WA_IDEMPOTENCY_TTL_MS

86400000

已完成的 send_message 等幂记录在 SQLite 中保留的时间,以便安全重试。

WA_MESSAGE_INDEX_MAX

20000

消息索引(jid:id -> 原始消息)的最大内存条目数。

WA_MESSAGE_KEY_INDEX_MAX

20000

消息键索引(id -> 原始消息)的最大内存条目数。

WA_INITIALIZE_TIMEOUT_MS

120000

以此期限竞争 WhatsApp 客户端初始化;设置为 0 以禁用。超时后抛出异常,使恢复可以重试而不是挂起。

WA_AUTODOWNLOAD_CONCURRENCY

3

最大并行自动下载数。自动下载通过进程内有界队列进行,因此突发入站媒体不会耗尽 I/O。

WA_AUTO_DOWNLOAD_QUEUE_MAX

200

最大排队自动下载作业数。超出部分以 FIFO(最旧)方式丢弃并记录警告日志;较新的消息保持优先。

MCP_HTTP_ENABLE_JSON_RESPONSE

1

默认对 Streamable HTTP POST 请求使用直接 JSON 响应。设置为 0 以强制使用旧版 SSE 风格 POST 响应处理。

传输诊断附加信息:

  • /mcp POST 请求现在会在 logs/mcp-whatsapp.log 中记录请求生命周期事件

  • 其中包括请求进入、传输分发、transport.handleRequest 完成,以及 HTTP finish / close

  • 使用这些日志判断延迟是发生在响应离开 whatsapp-mcp-stream 之前,还是之后在网关/客户端

聊天历史 API

通过以下接口浏览已存储的聊天和消息:

GET /api/chats?limit=50&offset=0&q=<search> — 分页聊天列表,可选择性按名称过滤。

GET /api/chats/jid/messages?limit=50&offset=0 — 聊天的分页消息(最新在前)。

两个接口均被 admin UI 中的 Chats 标签使用。

导出

通过以下导出聊天(JSON + 可选的下载媒体):

GET /api/export/chat/:jid?include_media=true

如果 include_media=true,ZIP 将包含已通过 download_media 下载的文件。它不会从 WhatsApp 获取缺失媒体。

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables WhatsApp automation through MCP protocol, allowing users to manage sessions, send messages, handle groups/communities, and access contacts through natural language interactions with AI agents.
    3 npm
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables connecting a personal or business WhatsApp account via QR pairing and then sending/reading messages, managing chats, contacts, groups, and searching message history through MCP tools.
    MIT