WhatsApp AI 连接器
一个通过Model Context Protocol将WhatsApp Web与AI模型连接起来的Node.js应用程序,可通过AI驱动的工作流实现自动消息发送、联系人管理和群聊功能。
MCP 服务配置
复制以下 JSON 到 OPClaw 或其他 MCP 客户端的配置文件中即可使用
{
"mcpServers": {
"whatsapp": {
"args": [
"run",
"-i",
"--rm",
"wweb-mcp:latest",
"-m",
"mcp",
"-s",
"local",
"-c",
"api",
"-t",
"command",
"--api-base-url",
"http://host.docker.internal:3001/api",
"--api-key",
"1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"
],
"command": "docker"
}
}
}
该服务需要配置环境变量:api_base_url、api_key、api_port、auth_data_path、auth_strategy、log_level、mcp_mode、mode、sse_port、transport
服务介绍
WhatsApp Web MCP
这是一个使用 Model Context Protocol (MCP) 将 WhatsApp Web 与 AI 模型连接起来的 Node.js 应用程序。该项目提供了一个标准化的接口,用于通过编程方式与 WhatsApp 进行交互,从而实现自动消息发送、联系人管理和群聊功能,并通过 AI 驱动的工作流来支持这些功能。
概述
WhatsApp Web MCP 通过以下方式在 WhatsApp Web 和 AI 模型之间提供了无缝集成:
- 通过 Model Context Protocol (MCP) 创建一个标准化的接口
- 提供对 WhatsApp 功能的 MCP 服务器访问
- 通过 SSE 或命令模式提供灵活的部署选项
- 支持直接的 WhatsApp 客户端集成和基于 API 的连接
免责声明
重要提示:此工具仅用于测试目的,不应在生产环境中使用。
来自 WhatsApp Web 项目的免责声明:
本项目与 WhatsApp 及其任何子公司或关联公司无关,也未得到它们的认可。官方的 WhatsApp 网站可以在 whatsapp.com 找到。“WhatsApp”以及相关名称、标志、徽标和图像是各自所有者的注册商标。此外,不能保证使用此方法不会被封禁。WhatsApp 不允许在其平台上使用机器人或非官方客户端,因此不应认为这种方法是完全安全的。
学习资源
要了解如何在实际场景中使用 WhatsApp Web MCP,请查看以下文章:
安装
-
克隆仓库:
git clone https://github.com/pnizer/wweb-mcp.git cd wweb-mcp -
全局安装或直接使用 npx:
# 全局安装 npm install -g . # 或者直接使用 npx npx . -
使用 Docker 构建:
docker build . -t wweb-mcp:latest
配置
命令行选项
| 选项 | 别名 | 描述 | 选择 | 默认值 |
|---|---|---|---|---|
--mode |
-m |
运行模式 | mcp, whatsapp-api |
mcp |
--mcp-mode |
-c |
MCP连接模式 | standalone, api |
standalone |
--transport |
-t |
MCP传输模式 | sse, command |
sse |
--sse-port |
-p |
SSE服务器端口 | - | 3002 |
--api-port |
- | WhatsApp API服务器端口 | - | 3001 |
--auth-data-path |
-a |
存储认证数据的路径 | - | .wwebjs_auth |
--auth-strategy |
-s |
认证策略 | local, none |
local |
--api-base-url |
-b |
使用api模式时MCP的API基础URL | - | http://localhost:3001/api |
--api-key |
-k |
使用api模式时WhatsApp Web REST API的API密钥 | - | '' |
API密钥认证
当以API模式运行时,WhatsApp API服务器需要使用API密钥进行认证。当你启动WhatsApp API服务器时,会自动生成API密钥,并显示在日志中:
WhatsApp API key: 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
要将MCP服务器连接到WhatsApp API服务器,你需要通过--api-key或-k选项提供这个API密钥:
npx wweb-mcp --mode mcp --mcp-mode api --api-base-url http://localhost:3001/api --api-key 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
API密钥存储在认证数据目录(由--auth-data-path指定)中,并且在重启WhatsApp API服务器后仍然有效。
认证方法
本地认证(推荐)
- 仅需扫描一次二维码
- 凭据在会话之间保持
- 对于长期操作更稳定
无认证
- 默认方法
- 每次启动时都需要扫描二维码
- 适合测试和开发
Webhook配置
你可以通过在认证数据目录(由--auth-data-path指定)中创建一个webhook.json文件来配置Webhook以接收传入的WhatsApp消息。
Webhook JSON格式
{
"url": "https://your-webhook-endpoint.com/incoming",
"authToken": "your-optional-authentication-token",
"filters": {
"allowedNumbers": ["+1234567890", "+0987654321"],
"allowPrivate": true,
"allowGroups": false
}
}
配置选项
| 选项 | 类型 | 描述 |
|---|---|---|
url |
字符串 | 发送消息数据的目标Webhook端点URL |
authToken |
字符串(可选) | 作为Bearer令牌包含在Authorization头中的认证令牌 |
filters.allowedNumbers |
数组(可选) | 接受来自这些电话号码的消息列表。如果提供,则只有来自这些号码的消息才会触发Webhook |
filters.allowPrivate |
布尔值(可选) | 是否向Webhook发送私信。默认:true |
filters.allowGroups |
布尔值(可选) | 是否向Webhook发送群消息。默认:true |
Webhook负载
当接收到消息并通过过滤器后,将向配置的URL发送带有以下JSON负载的POST请求:
{
"from": "+1234567890",
"name": "Contact Name",
"message": "Hello, world!",
"isGroup": false,
"timestamp": 1621234567890,
"messageId": "ABCDEF1234567890"
}
使用
运行模式
WhatsApp API服务器
运行一个独立的WhatsApp API服务器,通过REST端点暴露WhatsApp功能:
npx wweb-mcp --mode whatsapp-api --api-port 3001
MCP服务器(独立)
运行直接连接到WhatsApp Web的MCP服务器:
npx wweb-mcp --mode mcp --mcp-mode standalone --transport sse --sse-port 3002
MCP 服务器 (API 客户端)
运行一个连接到 WhatsApp API 服务器的 MCP 服务器:
# First, start the WhatsApp API server and note the API key from the logs
npx wweb-mcp --mode whatsapp-api --api-port 3001
# Then, start the MCP server with the API key
npx wweb-mcp --mode mcp --mcp-mode api --api-base-url http://localhost:3001/api --api-key YOUR_API_KEY --transport sse --sse-port 3002
可用工具
| 工具 | 描述 | 参数 |
|---|---|---|
get_status |
检查 WhatsApp 客户端连接状态 | 无 |
send_message |
向 WhatsApp 联系人发送消息 | number: 发送的目标电话号码message: 要发送的文本内容 |
search_contacts |
按姓名或号码搜索联系人 | query: 用于查找联系人的搜索词 |
get_messages |
从特定聊天中检索消息 | number: 从中获取消息的电话号码limit (可选): 要检索的消息数量 |
get_chats |
获取所有 WhatsApp 聊天列表 | 无 |
create_group |
创建一个新的 WhatsApp 群组 | name: 群组名称participants: 要添加的电话号码数组 |
add_participants_to_group |
将参与者添加到现有群组 | groupId: 群组IDparticipants: 要添加的电话号码数组 |
get_group_messages |
从群组中检索消息 | groupId: 群组IDlimit (可选): 要检索的消息数量 |
send_group_message |
向群组发送消息 | groupId: 群组IDmessage: 要发送的文本内容 |
search_groups |
按名称、描述或成员名称搜索群组 | query: 用于查找群组的搜索词 |
get_group_by_id |
获取关于特定群组的详细信息 | groupId: 要获取的群组ID |
download_media_from_message |
从消息中下载媒体文件 | messageId: 包含要下载媒体的消息ID |
send_media_message |
向 WhatsApp 联系人发送媒体消息 | number: 发送的目标电话号码source: 媒体源,使用URI方案(对于URL使用http://或https://,对于本地文件使用file://)caption (可选): 媒体的文本说明 |
可用资源
| 资源 URI | 描述 |
|---|---|
whatsapp://contacts |
所有 WhatsApp 联系人列表 |
whatsapp://messages/{number} |
来自特定聊天的消息 |
whatsapp://chats |
所有 WhatsApp 聊天列表 |
whatsapp://groups |
所有 WhatsApp 群组列表 |
whatsapp://groups/search |
按名称、描述或成员名称搜索群组 |
whatsapp://groups/{groupId}/messages |
来自特定群组的消息 |
REST API 端点
联系人与消息
| 端点 | 方法 | 描述 | 参数 |
|---|---|---|---|
/api/status |
GET | 获取 WhatsApp 连接状态 | 无 |
/api/contacts |
GET | 获取所有联系人 | 无 |
/api/contacts/search |
GET | 搜索联系人 | query: 搜索词 |
/api/chats |
GET | 获取所有聊天 | 无 |
/api/messages/{number} |
GET | 从聊天中获取消息 | limit (查询): 消息数量 |
/api/send |
POST | 发送消息 | number: 收件人message: 消息内容 |
/api/send/media |
POST | 发送媒体消息 | number: 收件人source: 媒体源(使用 URI 方案,对于 URL 使用 http:// 或 https://,对于本地文件使用 file://)caption (可选): 文字说明 |
/api/messages/{messageId}/media/download |
POST | 从消息中下载媒体 | 无 |
群组管理
| 端点 | 方法 | 描述 | 参数 |
|---|---|---|---|
/api/groups |
GET | 获取所有群组 | 无 |
/api/groups/search |
GET | 搜索群组 | query: 搜索词 |
/api/groups/create |
POST | 创建新群组 | name: 群组名称participants: 号码数组 |
/api/groups/{groupId} |
GET | 获取特定群组的详细信息 | 无 |
/api/groups/{groupId}/messages |
GET | 从群组中获取消息 | limit (查询): 消息数量 |
/api/groups/{groupId}/participants/add |
POST | 将成员添加到群组 | participants: 号码数组 |
/api/groups/send |
POST | 向群组发送消息 | groupId: 群组 IDmessage: 消息内容 |
AI 集成
Claude Desktop 集成
选项 1: 使用 NPX
-
启动 WhatsApp API 服务器:
npx wweb-mcp -m whatsapp-api -s local -
使用您的 WhatsApp 移动应用程序扫描二维码
-
注意日志中显示的 API 密钥:
WhatsApp API key: 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef -
在您的 Claude Desktop 配置中添加以下内容:
{ "mcpServers": { "whatsapp": { "command": "npx", "args": [ "wweb-mcp", "-m", "mcp", "-s", "local", "-c", "api", "-t", "command", "--api-base-url", "http://localhost:3001/api", "--api-key", "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef" ] } } }
选项 2: 使用 Docker
-
在 Docker 中启动 WhatsApp API 服务器:
docker run -i -p 3001:3001 -v wweb-mcp:/wwebjs_auth --rm wweb-mcp:latest -m whatsapp-api -s local -a /wwebjs_auth -
使用您的 WhatsApp 移动应用程序扫描二维码
-
注意日志中显示的 API 密钥:
WhatsApp API key: 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef -
将以下内容添加到您的 Claude Desktop 配置中:
{ "mcpServers": { "whatsapp": { "command": "docker", "args": [ "run", "-i", "--rm", "wweb-mcp:latest", "-m", "mcp", "-s", "local", "-c", "api", "-t", "command", "--api-base-url", "http://host.docker.internal:3001/api", "--api-key", "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef" ] } } } -
重启 Claude Desktop
-
通过 Claude 的界面将可以使用 WhatsApp 功能
架构
项目结构清晰,职责分离明确:
组件
- WhatsAppService: 与 WhatsApp 交互的核心业务逻辑
- WhatsAppApiClient: 连接到 WhatsApp API 的客户端
- API 路由器: REST API 的 Express 路由
- MCP 服务器: 模型上下文协议实现
部署选项
- WhatsApp API 服务器: 独立的 REST API 服务器
- MCP 服务器(独立): 直接连接到 WhatsApp Web
- MCP 服务器(API 客户端): 连接到 WhatsApp API 服务器
这种架构允许灵活的部署场景,包括:
- 在不同的机器上运行 API 服务器和 MCP 服务器
- 将 MCP 服务器作为现有 API 服务器的客户端
- 为了简化,在单个机器上运行所有组件
开发
项目结构
src/
├── whatsapp-client.ts # WhatsApp Web client implementation
├── whatsapp-service.ts # Core business logic
├── whatsapp-api-client.ts # Client for the WhatsApp API
├── api.ts # REST API router
├── mcp-server.ts # MCP protocol implementation
└── main.ts # Application entry point
从源代码构建
npm run build
测试
该项目使用 Jest 进行单元测试。要运行测试:
# Run all tests
npm test
# Run tests in watch mode during development
npm run test:watch
# Generate test coverage report
npm run test:coverage
代码检查和格式化
该项目使用 ESLint 和 Prettier 来保证代码质量和格式:
# Run linter
npm run lint
# Fix linting issues automatically
npm run lint:fix
# Format code with Prettier
npm run format
# Validate code (lint + test)
npm run validate
代码检查配置强制执行 TypeScript 最佳实践,并在整个项目中保持一致的代码风格。
发布
该项目使用 GitHub Actions 自动发布到 npm。工作流处理:
- 版本递增 (
patch、minor或major) - 使用版本前缀 'v' 的 Git 标签(例如 v0.2.1)
- 使用 GitHub 密钥发布到 npm
要发布新版本:
- 前往 GitHub 仓库的 Actions 选项卡
- 选择“Publish Package”工作流
- 单击“Run workflow”
- 选择版本递增类型(patch、minor 或 major)
- 单击“Run workflow”开始发布过程
此工作流需要在您的 GitHub 仓库中配置 NPM_TOKEN 密钥。
故障排除
Claude 桌面集成问题
- 由于 Claude 会多次打开多个进程,而每个 wweb-mcp 都需要打开一个无法共享相同 WhatsApp 认证的 puppeteer 会话,因此在 Claude 上无法以独立命令模式启动 wweb-mcp。由于这一限制,我们将应用程序拆分为 MCP 和 API 模式,以便与 Claude 正确集成。
功能
- 发送和接收消息
- 发送媒体消息(仅限图片)
- 从消息中下载媒体(图片、音频、文档)
- 群聊管理
- 联系人管理和搜索
- 消息历史记录检索
即将推出的功能
- 支持发送所有类型的媒体文件(视频、音频、文档)
- 增强的消息模板,适用于常见场景
- 高级群组管理功能
- 联系人管理(添加/删除联系人)
- 增强的错误处理和恢复机制
贡献
- 分叉仓库
- 创建功能分支
- 提交你的更改
- 推送到你的分支
- 创建 Pull Request
请确保您的 PR:
- 遵循现有的代码风格
- 包含适当的测试
- 根据需要更新文档
- 详细描述所做的更改
依赖项
WhatsApp Web.js
此项目使用 whatsapp-web.js,这是一个非官方的 WhatsApp Web JavaScript 客户端库,通过 WhatsApp Web 浏览器应用进行连接。欲了解更多信息,请访问 whatsapp-web.js GitHub 仓库。
许可证
本项目根据 MIT 许可证发布 - 详情请参阅 LICENSE 文件。
日志记录
WhatsApp Web MCP 包含一个使用 Winston 构建的强大日志系统。该日志系统提供:
- 多个日志级别(错误、警告、信息、http、调试)
- 控制台输出带颜色的日志
- API 端点的 HTTP 请求/响应日志
- 结构化的错误处理
- 环境感知的日志级别(开发环境与生产环境)
- 在 MCP 命令模式下运行时,所有日志都定向到 stderr
日志级别
应用程序支持以下按详细程度排序的日志级别:
- error - 阻止应用程序正常运行的关键错误
- warn - 不会停止应用程序但需要关注的警告
- info - 关于应用程序状态和事件的一般信息
- http - HTTP 请求/响应日志
- debug - 详细的调试信息
配置日志级别
你可以在启动应用程序时使用 --log-level 或 -l 标志来配置日志级别:
npm start -- --log-level=debug
或者在使用全局安装时:
wweb-mcp --log-level=debug
命令模式下的日志记录
当以 MCP 命令模式 (--mode mcp --transport command) 运行时,所有日志都被定向到 stderr。这对于命令行工具来说很重要,因为 stdout 可能用于数据输出,而 stderr 用于日志记录和诊断。这确保了通过 stdout 的 MCP 协议通信不会被日志消息干扰。
测试环境
在测试环境(当 NODE_ENV=test 或使用 Jest 运行时),日志记录器会自动调整其行为以适应测试环境。