pingwa

io.github.grzgrzgrz3Published by GitHub account grzgrzgrz3v0.4.1Updated Oct 24, 2026

Zero-setup WhatsApp notifications + human-in-the-loop for AI agents — text 'join', send in 60s.

VerifiedStreamable HTTPWeb executableProductivity & WorkflowCommunication & Collaboration

Overview

AI-generated overview

Sends WhatsApp notifications to your own phone and lets an agent ask you questions there, blocking until you reply.

What you can do
  • Send a text message, optionally with a public image link as caption, to the account owner's own phone
  • Ask the human a question on WhatsApp with up to three tappable buttons and wait for the answer or a timeout
  • Pull inbound WhatsApp messages, with a cursor and optional long-poll, to receive out-of-band instructions or late answers
  • Check the account's plan, remaining monthly quota and whether the free 24h reply window is open
  • Get a Stripe Checkout link to upgrade to Pro, or a billing-portal link if already Pro
When to use it
Useful when a long-running agent or script should ping you on your phone when a build or deploy finishes, or when it needs a human decision mid-task and you would rather tap a button in WhatsApp than watch a terminal.
Requirements
A pingwa API key in the PINGWA_KEY environment variable (obtained by sending 'join' on WhatsApp to the service number). Runs either as a remote endpoint with a Bearer key header or locally via uvx with Python/uv. Network access to the pingwa backend; PINGWA_BASE_URL can point at a self-hosted backend.
Before you install
The key is a credential that authorizes sending messages and spending quota; keep it out of chats and logs. Messages go through the hosted pingwa backend, which sees the text and image link you send. The upgrade tool returns a Stripe payment link, so a human should open and pay it. Webhook secrets are shown only once and must be stored immediately.

Installation

In SourceWeft

  1. Open pingwa in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.grzgrzgrz3%2Fpingwa/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "pingwa": {
      "type": "http",
      "url": "https://pingwa.dev/mcp"
    }
  }
}

README

pingwa (client)

[PyPI] [Python] [License: MIT]

WhatsApp notifications for AI agents and scripts with zero setup — no Meta account, no templates, no dashboard: text "join", get an API key, curl → WhatsApp in 60s. Two-way human-in-the-loop: your agent asks, you tap a button to answer. From your terminal or an MCP client.

This is the open-source (MIT) pingwa client: a CLI, a tiny HTTP client, and an MCP server. It talks to a pingwa backend (the hosted service at https://pingwa.dev, or your own). The backend is separate and private; this client is not.

Install & use

No install needed with uv:

bash
export PINGWA_KEY=pw_your_key          # get one: send "join" on WhatsApp to the service numberuvx pingwa send "build finished ✅"     # notify your own phoneecho "deploy done" | uvx pingwa send -  # from stdinuvx pingwa ask "Deploy to prod?" --button yes --button no   # wait for a reply from your phoneuvx pingwa replies                      # pull messages your phone sent back (out-of-band steering)uvx pingwa me                           # plan / quota / reply-windowuvx pingwa keys                         # list active API keys (up to 10 named keys per number)uvx pingwa keys revoke ci               # revoke one by name (or reply 'revoke ci' on WhatsApp)uvx pingwa upgrade                      # get a Stripe link to go Pro (no password needed)uvx pingwa send "x" --json              # raw JSON response

AI agents: don't ask your human to copy-paste a key — drive the registration yourself (POST /v1/registrations; full recipe in llms.txt). The human only taps one WhatsApp link; the key is claimed by you and never travels through the chat. Works for existing accounts too — it mints an additional named key.

Exit codes: 0 ok · 2 missing key · 3 quota exceeded · 1 other. Override the backend with PINGWA_BASE_URL or --base-url.

Webhooks

Prefer PUSH over polling replies? Register HTTPS endpoints and pingwa POSTs every inbound WhatsApp message to them:

bash
uvx pingwa webhooks                                   # list your webhooksuvx pingwa webhooks add https://your-host/pingwa-hook # returns a signing SECRET, shown ONCEuvx pingwa webhooks rm https://your-host/pingwa-hook  # by id, or by exact url

add prints a whsec_... secret once — store it now; it never appears again. Each delivery carries an X-Pingwa-Signature: sha256=<hex> header (an HMAC-SHA256 of the raw body under that secret) — verify it and reject anything that fails. Full verification recipe and payload shape: llms.txt. Up to 5 active webhooks per account; to rotate a secret, rm then add again.

MCP server

Same tools on stdio and remote: notify(text), ask(text, buttons?, timeout?), check_replies(since?, wait?), check_status(), upgrade().

Local (stdio) — for Claude Desktop / Claude Code:

json
{  "mcpServers": {    "pingwa": {      "command": "uvx",      "args": ["pingwa", "mcp"],      "env": { "PINGWA_KEY": "pw_your_key" }    }  }}

Remote (Streamable HTTP, no install):

json
{  "mcpServers": {    "pingwa": {      "url": "https://pingwa.dev/mcp",      "headers": { "Authorization": "Bearer pw_your_key" }    }  }}

Every error carries an action hint, so an agent knows what to do next.

What it sends

Only your message text and your key, to the pingwa backend you point it at — over HTTPS. Nothing else. The recipient is always your own phone (there is no "to" field). See the service's /privacy.

License

MIT — see LICENSE in the repository root. It covers this client package only (src/pingwa/client/); the pingwa server is separate, private, and not published. See NOTICE for the exact boundary.

Source: README.md at commit 58a47df

Tools

5

notify

Send a WhatsApp notification to the account owner's own phone. `text` is the message (1-1024 chars). `image_url` (optional) is a public https image link — a screenshot, chart or diff — delivered as an image with `text` as the caption when the user's 24h window is open (otherwise text only). Returns a confirmation with the queued message id; raises an actionable error on quota/auth.

Parameterstextrequiredimage_url

check_status

Show the pingwa account's plan, remaining monthly quota, and whether the free 24h WhatsApp reply window is currently open.

Takes no parameters.

upgrade

Get a link to upgrade the account to Pro (raises the monthly quota). Returns a Stripe Checkout URL for the human to open and pay — no pingwa password needed, the card is handled by Stripe. If the account is already Pro, returns a billing-portal URL to manage or cancel instead.

Takes no parameters.

ask

Ask the human a question on WhatsApp and BLOCK until they reply (or timeout). `text` is the question. `buttons` (optional, up to 3) render as tappable reply buttons; omit them to invite a free-text answer the human types on their phone — use this to let the human steer you mid-task. `timeout` is seconds to wait (max 90). Returns the human's reply (free text and/or the chosen option). On timeout, returns a note — the question was delivered and the answer is still retrievable via `check_replies`.

Parameterstextrequiredbuttonstimeout

check_replies

Pull inbound WhatsApp messages the human sent to pingwa (out-of-band instructions, or late answers to an `ask`). `since` is a cursor from a previous call (pass it back to get only newer messages); `wait` long-polls up to that many seconds for something to arrive. Returns the messages and a new cursor.

Parameterswaitsince

Version history

1
  1. v0.4.1LatestSep 16, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts