Guarded WhatsApp

io.github.peter-tnc-453由 GitHub 帳號 peter-tnc-453 發布v0.1.0更新於 Oct 24, 2026

Security gate for agent-driven WhatsApp: allowlist, secret scan, rate limit, audit log.

已驗證STDIO僅桌面溝通與協作安全與監控

概覽

AI 產生的概覽

為 AI 代理提供受管控的 WhatsApp 傳送:白名單、密鑰掃描、速率限制與稽核日誌把關每則訊息和檔案。

可以做什麼
  • 以唯讀方式預演傳送,執行所有檢查並回傳判定結果與確認權杖,不會實際送出
  • 透過完整檢核向白名單內的收件人傳送文字訊息
  • 傳送檔案,自動使用 ASCII 安全檔名,並進行類型、大小檢查與說明文字掃描
  • 檢視收件人白名單,號碼已遮蔽
  • 讀取僅可追加稽核日誌中的近期紀錄
適用情境
當希望助理傳送 WhatsApp 訊息或檔案,但需要對可聯絡對象、外送內容與頻率設下硬性限制,並保留每次嘗試的紀錄時使用。適合在備用號碼上做個人或團隊自動化,而非正式環境的客戶訊息推播。
執行需求
以 Python 套件形式在本機透過 stdio 執行(Python 3.10+),可從 PyPI 或原始碼安裝。需要另一個提供傳送介面且已完成登入的 WhatsApp 橋接服務在執行(首次需掃 QR code)。需要 YAML 白名單設定檔,由環境變數 WA_GUARD_CONFIG 指定;稽核日誌寫入使用者家目錄下。
安裝前請注意
預設傳輸層為非官方的 WhatsApp Web 橋接,README 稱其違反 WhatsApp 服務條款並可能導致號碼遭停用;請使用備用號碼,不要用於正式客戶訊息。這些防護僅降低營運風險。傳送是真實的外送訊息,稽核日誌會記錄嘗試內容(內文預覽與雜湊)。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Guarded WhatsApp,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

[guarded-whatsapp-mcp]

guarded-whatsapp-mcp

Govern & automate WhatsApp safely for AI agents.

[License: MIT] [Python 3.10+] [MCP server] [status: alpha] [PRs welcome]

An MCP server that lets an AI agent (or any MCP client) send WhatsApp messages and files — but only through a security gate you control: a recipient allowlist, secret scanning, file validation, rate limiting, a confirmation gate, and an append-only audit log.

Most WhatsApp bridges send anything, anywhere, with no record. That is fine for a human clicking send. It is not fine for an autonomous agent. guarded-whatsapp-mcp is the governance layer that makes agent-driven WhatsApp safe enough to trust.

This is not a Slack replacement. No channels, no threads, no workspace UI. It makes the WhatsApp you already use safe to automate.

See it in action

[Good sends go through, bad sends are blocked, all of it logged]
Good sends go through · a leaked key and an un-allowlisted number are blocked · files need a preview · everything is logged.

How it works


⚠️ Read this first — unofficial transport & WhatsApp Terms

This server governs access to a transport; by default that transport is the unofficial whatsmeow-based bridge (e.g. whatsapp-mcp), which speaks WhatsApp Web's private protocol.

  • An unofficial client violates WhatsApp's Terms of Service and can get a number banned. A reverse-engineered client cannot avoid this.
  • Use a secondary / non-critical number. Never your primary or business-critical one.
  • Not for production customer messaging — use the official WhatsApp Business Cloud API. An official Cloud-API backend is on the roadmap; the guard layer is built to front either transport.

The guardrails here reduce operational risk (wrong recipient, leaked secret, spam). They do not change the Terms-of-Service risk of the underlying bridge. We are loud about this on purpose so you can choose with eyes open.


Why teams use it

Without a guardWith guarded-whatsapp-mcp
Agent can message any number it generatesFail-closed allowlist — strangers are refused
A leaked API key sails out in a messageSecret scan blocks it before it sends
A runaway loop spams the team 200×Rate limit caps it
Files arrive as Untitled; paths uncheckedASCII-safe filenames + type/size checks
No idea what the agent sentAppend-only audit log of every attempt
Accidental sendsConfirmation gate — risky sends must be previewed

Security controls

ControlWhat it does
Recipient allowlistFail-closed. With allow_unlisted: false, only people/groups in your config can be messaged — even a raw number is refused.
Secret / PII scanText + captions scanned for API keys, private keys, cloud/Slack/GitHub/OpenAI tokens, JWTs, credit cards (Luhn), national IDs. block or warn.
File validationExtension allowlist + size cap. Filenames sanitized to ASCII (no Untitled, no path traversal); copied to a safe name before sending.
Rate limitingSliding window (per-minute + per-hour) stops runaway loops.
Confirmation gateRisky sends (unlisted / files / all) need a confirm_token from wa_preview — proof the send was previewed, not accidental.
Audit logEvery attempt (sent / blocked / failed) appended to ~/.guarded-whatsapp-mcp/audit.jsonl, with body stored as preview + hash only.

Tools

ToolGated?Purpose
wa_list_recipientsread-onlyShow the allowlist (numbers masked).
wa_previewread-onlyDry-run a send: run every check, return a verdict + confirm_token if needed. Sends nothing.
wa_send_messagesendSend text to an allowlisted recipient through the full gate.
wa_send_filesendSend a file (auto ASCII-safe name, type/size checked, caption scanned).
wa_audit_tailread-onlyRecent audit records.

Quickstart

bash
git clone https://github.com/peter-tnc-453/guarded-whatsapp-mcpcd guarded-whatsapp-mcp
uv venv --python 3.11 && source .venv/bin/activate   # Python 3.10+uv pip install -e .
cp config/allowlist.example.yaml config/allowlist.yaml   # edit your allowlist (git-ignored)
# a WhatsApp bridge exposing POST /api/send must be running (the authenticated session).# whatsmeow bridge: https://github.com/lharries/whatsapp-mcp  (first run = QR scan)
python -m wa_guard          # run the MCP server (stdio)

Register with Claude Code / any MCP client

json
{  "mcpServers": {    "guarded-whatsapp-mcp": {      "command": "/ABSOLUTE/PATH/guarded-whatsapp-mcp/.venv/bin/python",      "args": ["-m", "wa_guard"],      "env": {        "PYTHONPATH": "/ABSOLUTE/PATH/guarded-whatsapp-mcp/src",        "WA_GUARD_CONFIG": "/ABSOLUTE/PATH/guarded-whatsapp-mcp/config/allowlist.yaml"      }    }  }}

Example — a safe agent flow

jsonc
// 1) The agent previews first (read-only, sends nothing)wa_preview(recipient="Alex", file_path="report.pdf")// → { ok:false, needs_confirm:true, confirm_token:"a1b2c3d4e5",//     display_filename:"report.pdf", recipient:{ name:"Alex", allowlisted:true } }
// 2) It sends, passing the token back to prove the preview happenedwa_send_file(recipient="Alex", file_path="report.pdf", confirm_token="a1b2c3d4e5")// → { sent:true, ... }   (and one line is appended to the audit log)
// A blocked attempt is explicit and recorded:wa_send_message(recipient="+66999999999", message="hi")// → { sent:false, blocked_reason:"recipient is not allowlisted and allow_unlisted=false" }

Configuration

See config/allowlist.example.yaml. Key knobs: allow_unlisted (the fail-closed switch), require_confirm_for, rate_limit, files, secrets.on_detect, and the recipients allowlist. Edits hot-reload on each call.

Roadmap

  • Pluggable backend — same guard layer in front of the unofficial bridge or the official WhatsApp Business Cloud API (compliant path).
  • Inbound routing — surface incoming messages to agents (read · classify · route).
  • Scheduled / templated sends through the same gate.
  • Per-recipient policy (rate limits / confirm rules per contact or group).

Tests

bash
uv pip install pytest && PYTHONPATH=src python -m pytest -q   # 19 passing

Contributing

PRs welcome — see CONTRIBUTING.md. The one rule: keep the fail-closed posture, and add a test for every new check.

License

MIT — see LICENSE. Security model & honest limitations in SECURITY.md.

來源:README.md,提交 73cfc2c

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v0.1.0最新Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分