Overview

Messaging rails for AI agents

agentpush is the messaging infrastructure your agents operate: one tool catalog to send and receive messages across WhatsApp, Telegram, Discord, Slack, SMS/RCS, email and Teams — exposed over REST and MCP, with your own inference kept firmly on your side of the wire.

What agentpush is

Agents need to talk to people where people actually are: WhatsApp, Telegram, Slack, email, SMS. Each of those providers has its own API, webhook format, session rules and failure modes. agentpush collapses them into a single, typed surface an agent can drive directly:

  • One tool catalog, three transports. Every capability is a typed tool (26 of them — see MCP tools). The same catalog is served as REST (POST /tools/:name), as an MCP server (POST /mcp, streamable HTTP), and as a TypeScript SDK.
  • BYO inference. agentpush never runs your model. Your agent calls in to send; inbound messages reach your agent either as a signed webhook (push) or via polling (pull). See Inbound & BYO inference.
  • Multi-tenant by construction. Everything — contacts, events, provider accounts, inbound routes — is scoped to a workspace, resolved from a hashed Bearer API key. See API keys & workspaces.
  • A delivery journal, not fire-and-forget. Every send and receive is journaled as a delivery event, which powers check_delivery, get_stats, get_spend and get_ttr.
  • Agent-shaped guardrails. A blocked send is not an exception — it returns { status: "blocked", blocked_reason, suggestion } so the agent can read the suggestion and correct course (pick a template, respect an opt-out) instead of retry-looping.

Architecture at a glance

data flow
              ┌──────────────────────────── agentpush ────────────────────────────┐
              │                                                                   │
 your agent ──┤  POST /tools/:name   (REST)          ┌── WhatsApp                 │
 (any model,  │  POST /mcp           (MCP, HTTP)     ├── Telegram   outbound      │
  any stack)  │        │                             ├── Discord      +           │
              │        ▼                             ├── Slack      inbound       │
              │  tool catalog ──► policy ──► send ──►├── SMS / RCS  webhooks      │
              │        │                             ├── Email                    │
              │        ▼                             └── Teams                    │
              │  delivery journal (stats · spend · TTR · check_delivery)          │
              │        │                                                          │
              │        ▼                                                          │
              │  inbound routes ──► signed webhook ──► your inference             │
              │                     (or poll_inbound)                             │
              └───────────────────────────────────────────────────────────────────┘

The write path: your agent calls a tool → the policy engine checks session windows, opt-outs and template status → the channel provider sends → the result is journaled. The read path: provider webhooks (or the Gmail poll worker) ingest inbound messages → the routing engine evaluates your inbound_routes → matches are journaled and, for notify routes, POSTed to your endpoint as a signed envelope your agent replies to with send_message.

Where to go next

SectionCovers
QuickstartKey in hand to first message in five minutes
ChannelsProvider accounts and webhook registration
SendingText, templates, media and broadcasts
Inbound & BYO inferenceRoutes, the signed envelope and replies
MCP toolsThe full tool catalog, tagged read/write
API keys & workspacesMulti-tenant model, scopes and auth