CLI & MCP
Manage Wabery from your terminal, or wire it into an AI agent over MCP.
The Wabery CLI manages channels, registration intents, flows, automations, and webhooks from your terminal. It also ships an MCP server, so you can hand Wabery to an AI coding agent (Claude, Codex, OpenCode) and build by describing the feature.
Install & sign in
Install it globally, then sign in:
npm i -g @wabery/cli
wabery loginpnpm add -g @wabery/cli
wabery loginbun add -g @wabery/cli
wabery loginwabery login authorizes the CLI in your browser (--no-open prints a URL
instead), asks you to choose a project, creates a key scoped to that project,
and saves it to your local CLI config — so the CLI and the MCP server are
authenticated with no copy-pasting. Run wabery doctor to confirm. To override,
set WABERY_API_KEY (and optionally WABERY_BASE_URL, which defaults to the API
base https://api.wabery.com/v1 — not the dashboard origin).
Run without installing
Prefer not to install globally? Run any wabery command on demand through your
package runner — handy for CI or a one-off wabery login:
npx wabery login
npx wabery doctorpnpm dlx wabery login
pnpm dlx wabery doctorbunx wabery login
bunx wabery doctorCommon commands
# verify your API key and base URL; also flags channels that drop inbound
# (the `channels` check lists any `routing_warnings`)
wabery doctor
# confirm the project this key is scoped to
wabery projects list
# create a starter config, then validate it
wabery config init wabery.config.json --project-id "project_id"
wabery config validate wabery.config.json
# enroll a WhatsApp contact for testing (optionally with a language)
wabery contacts enroll --project-id "project_id" --phone "+14155550123" \
--preferred-language "es"
# update a contact's language or metadata later (metadata is shallow-merged)
wabery contacts update "contact_id" --preferred-language "id" \
--metadata '{"linked": true}'
# mint a single-use WhatsApp registration link
wabery registration-intents create --customer-reference "user_123" \
--metadata '{"plan": "starter"}'
wabery registration-intents get "intent_id"
# send a flow; use --config-key to pick the variant for the contact's language
wabery flows send "flow_id" --channel-id "channel_id" --contact-id "contact_id"
wabery flows send --config-key "lead_intake" --locale "es" \
--channel-id "channel_id" --contact-id "contact_id"
# inspect channels; `routing_warning` flags a channel that silently drops inbound
wabery channels list
wabery channels get "channel_id"
# forward a dedicated number's inbound to your webhook (overrides project routing)
wabery channels update "channel_id" --routing-mode EXTERNAL
# or set the project-wide default that new channels inherit
wabery projects update "project_id" --routing-mode EXTERNALMCP server
Print an MCP server config for your agent and drop it into its config file — Claude Code, Codex, and OpenCode are supported:
wabery mcp-config claude --raw
wabery mcp-config codex --raw
wabery mcp-config opencode --rawThen just describe what you want:
"Create a lead-intake flow and route submissions to our /leads webhook" —
the agent calls Wabery for you, end to end.
The MCP server exposes the same primitives as the API: channels, messages,
registration intents, flows, automations, contacts, and webhooks. It starts
read-only by default; pass --write (or set WABERY_MCP_MODE=write) to
allow mutations in a trusted local session.