Skip to content

Channel Integrations

Channels connect the agent to messaging platforms. Each channel runs as a listener that forwards messages to the agent loop and sends responses back to the platform.

ChannelConfig KeyTransportNotes
Telegramchannels.telegramBot API (polling)Supports groups, inline queries
Discordchannels.discordGateway WebSocketSupports guilds, threads
Discord Historychannels.discord_historyGateway WebSocketBackfill guild history
Slackchannels.slackSocket ModeRequires bot + app tokens
Mattermostchannels.mattermostWebSocketSelf-hosted or cloud
iMessagechannels.imessageAppleScript + SQLitemacOS only
Matrixchannels.matrixClient-Server APIFederated, E2EE-capable
Signalchannels.signalsignal-cli REST APIRequires signal-cli daemon
WhatsAppchannels.whatsappCloud APIMeta Business Platform
WhatsApp Webchannels.whatsapp_webMulti-device protocolQR code or pairing code
WhatsApp Storagechannels.whatsapp_storageIn-memory ring bufferMessage persistence layer
WATIchannels.watiWATI APIWhatsApp Team Inbox
MQTTchannels.mqttMQTT brokerPub/sub messaging
Transcriptionchannels.transcriptionWhisper-compatible APIAudio-to-text (Groq default)
Linqchannels.linqLinq APILinq messaging platform
NextCloud Talkchannels.nextcloud_talkSpreed OCS APISelf-hosted collaboration
Emailchannels.emailSMTP + IMAPSend and receive email
Gmail Pushchannels.gmail_pushGoogle Pub/SubReal-time Gmail notifications
IRCchannels.ircTLS socketAny IRC network
Larkchannels.larkOpen Platform APIByteDance Lark (international)
Feishuchannels.feishuOpen Platform APIByteDance Feishu (China)
DingTalkchannels.dingtalkOutgoing webhookAlibaba DingTalk
QQ Officialchannels.qq_officialBot Open Platform APITencent QQ
Nostrchannels.nostrRelay WebSocketDecentralized
ClawdTalkchannels.clawdtalkREST APISelf-hosted chat
Voice Wake Wordchannels.voice_wakeAudio energy detectionWake word + Whisper
Webhookchannels.webhookHTTP POSTGeneric HTTP integration
Napcatchannels.napcatOneBot v11 HTTPQQ via Napcat/OneBot
ACPchannels.acpAgent Client ProtocolAgent-to-agent communication
SMSchannels.smsTwilio REST APISend and receive SMS

If building from source, enable the channels-standard feature:

Terminal window
cargo build -p agentzero --release --features channels-standard

Pre-built binaries include all channels by default.

Add a [channels.<name>] section to your agentzero.toml:

[channels.telegram]
bot_token = "123456:ABC-DEF..."
Terminal window
agentzero gateway

The gateway automatically starts all configured channels.

Terminal window
agentzero channel list # List all configured channels
agentzero channel add telegram # Add a channel
agentzero channel remove telegram # Remove a channel
agentzero channel start # Start all configured channels
agentzero channel test telegram # Send a test message through a channel
agentzero channel doctor # Run channel diagnostics

[channels.telegram]
bot_token = "YOUR_TELEGRAM_BOT_TOKEN" # from @BotFather
allowed_users = [] # empty = allow all users
privacy_boundary = "" # "" | "local_only" | "encrypted_only"

Create a bot via @BotFather on Telegram and copy the token.

[channels.discord]
bot_token = "YOUR_DISCORD_BOT_TOKEN"
privacy_boundary = ""

Create a bot in the Discord Developer Portal, enable the Message Content intent, and invite it to your server.

[channels.discord_history]
bot_token = "YOUR_DISCORD_BOT_TOKEN"

Uses the same bot as the Discord channel. Backfills guild message history for context.

[channels.slack]
bot_token = "xoxb-YOUR-SLACK-BOT-TOKEN" # Bot User OAuth Token
app_token = "xapp-YOUR-SLACK-APP-TOKEN" # App-Level Token (Socket Mode)
privacy_boundary = ""

Slack requires two tokens:

  1. Bot token (xoxb-...) — from OAuth & Permissions
  2. App token (xapp-...) — from Basic Information → App-Level Tokens (enable Socket Mode)
[channels.mattermost]
base_url = "https://your-mattermost.example.com"
token = "YOUR_MATTERMOST_TOKEN"
channel_id = "YOUR_CHANNEL_ID"
[channels.imessage]
allowed_users = [] # phone numbers or iCloud emails

macOS only. Uses AppleScript to send messages and polls the iMessage SQLite database for incoming messages. No token needed — uses the logged-in macOS user’s Messages app.

[channels.matrix]
homeserver = "https://matrix.org"
access_token = "YOUR_MATRIX_TOKEN"
room_id = "!roomid:matrix.org"
[channels.signal]
base_url = "http://localhost:8080" # signal-cli REST API endpoint
channel_id = "+1234567890" # your Signal phone number

Requires a running signal-cli REST API daemon.

[channels.whatsapp]
access_token = "YOUR_WHATSAPP_ACCESS_TOKEN"
channel_id = "YOUR_PHONE_NUMBER_ID" # from Meta Business Platform

Uses the WhatsApp Cloud API via Meta Business Platform.

[channels.whatsapp_web]
# session_path = "./whatsapp-session" # optional session persistence
# pairing_mode = "qr" # "qr" or "code"

Connects via the WhatsApp Web multi-device protocol. On first run, scan the QR code or enter a pairing code.

[channels.whatsapp_storage]
# session_path = "./whatsapp-storage" # optional persistence path

In-memory message ring buffer for WhatsApp message persistence. Typically used alongside another WhatsApp channel.

[channels.wati]
base_url = "https://live-server-XXXXX.wati.io"
token = "YOUR_WATI_API_TOKEN"

WATI is a WhatsApp Team Inbox platform.

[channels.mqtt]
base_url = "mqtt://localhost:1883" # broker URL
channel_name = "agentzero/inbox" # subscribe topic
# channel_id = "agentzero/outbox" # publish topic (optional)

Connects to any MQTT broker. Subscribes to the configured topic for incoming messages and publishes responses.

[channels.transcription]
token = "YOUR_API_KEY" # Groq or Whisper-compatible API key
# base_url = "https://api.groq.com" # API endpoint (default: Groq)

Transcribes audio input to text using a Whisper-compatible API.

[channels.linq]
base_url = "https://api.linq.chat"
token = "YOUR_LINQ_API_KEY"
[channels.nextcloud_talk]
base_url = "https://your-nextcloud.example.com"
username = "bot-user"
password = "bot-password"
room_id = "YOUR_ROOM_TOKEN"

Uses the NextCloud Spreed OCS API.

[channels.email]
smtp_host = "smtp.gmail.com"
smtp_port = 587
imap_host = "imap.gmail.com"
imap_port = 993
username = "you@gmail.com"
password = "app-specific-password" # use Gmail App Passwords
from_address = "you@gmail.com"
[channels.gmail_push]
access_token = "YOUR_GOOGLE_ACCESS_TOKEN"
# channel_id = "projects/my-project/topics/gmail" # Pub/Sub topic

Uses Google Pub/Sub for real-time Gmail push notifications.

[channels.irc]
server = "irc.libera.chat"
port = 6697
nick = "agentzero-bot"
channel_name = "#your-channel"
password = "" # NickServ password (optional)
[channels.lark]
token = "YOUR_LARK_APP_ID"
app_token = "YOUR_LARK_APP_SECRET"

Create an app in the Lark Developer Console.

[channels.feishu]
token = "YOUR_FEISHU_APP_ID"
app_token = "YOUR_FEISHU_APP_SECRET"

Same as Lark but for the China region (Feishu).

[channels.dingtalk]
access_token = "YOUR_DINGTALK_TOKEN"

Uses DingTalk outgoing webhook integration.

[channels.qq_official]
token = "YOUR_QQ_APP_ID"
bot_token = "YOUR_QQ_BOT_TOKEN"

Uses the QQ Bot Open Platform API.

[channels.nostr]
relay_url = "wss://relay.example.com"
private_key_hex = "YOUR_NOSTR_PRIVATE_KEY_HEX"
[channels.clawdtalk]
base_url = "https://your-clawdtalk.example.com"
token = "YOUR_CLAWDTALK_API_KEY"
room_id = "YOUR_ROOM_ID"

Self-hosted chat platform.

[channels.voice_wake]
# wake_words = ["hey agent"] # custom wake words
# channel_id = "0.6" # energy threshold (0.0-1.0)

Listens for a wake word via audio energy detection, then transcribes speech with Whisper.

[channels.webhook]
base_url = "http://localhost:8080/webhook"

The webhook channel sends agent responses as HTTP POST requests to the configured URL.

[channels.napcat]
base_url = "http://localhost:3000" # Napcat OneBot v11 HTTP endpoint
access_token = "YOUR_ACCESS_TOKEN" # optional

Uses the OneBot v11 HTTP API via Napcat.

[channels.acp]
base_url = "http://localhost:9000"
channel_id = "my-agent" # agent ID
# token = "YOUR_API_KEY" # optional authentication

Agent-to-agent communication channel using the Agent Client Protocol.

[channels.sms]
token = "YOUR_TWILIO_AUTH_TOKEN"
channel_id = "YOUR_TWILIO_ACCOUNT_SID" # Account SID
# from_number = "+15550001234" # Twilio sending number (E.164)

Uses the Twilio REST API for SMS.

Real-time voice input using microphone audio capture, energy-based voice activity detection, and Whisper-compatible speech-to-text.

[channels_config.voice_wake]
wake_words = ["hey agent", "ok computer"]
energy_threshold = 0.05
capture_timeout_secs = 10
transcription_url = "https://api.groq.com/openai/v1/audio/transcriptions"
# transcription_api_key = "" # or set GROQ_API_KEY env var
sample_rate = 16000
auto_tts_response = false

Pipeline: microphone → energy-based VAD → capture audio buffer → encode as WAV → POST to Whisper API → check for wake word → emit message.

Build with the channel-voice-wake feature flag:

Terminal window
cargo build --features channel-voice-wake

Requires a working audio input device. The channel reports unhealthy if no microphone is found.


These settings apply to all channels:

[channels_config]
message_timeout_secs = 300 # max time to process a message
stream_mode = "off" # off | partial | full
draft_update_interval_ms = 500 # interval for draft updates (streaming)
interrupt_on_new_message = false # cancel current response on new message

Control how the bot responds in group chats:

[channels_config.group_reply.telegram]
mode = "mention_only" # all_messages | mention_only
bot_name = "MyBot" # triggers on @MyBot mentions
allowed_sender_ids = [] # empty = allow all

Send a reaction emoji when a message is received (before the response is ready):

[channels_config.ack_reaction.telegram]
enabled = true
emoji_pool = ["👍", "👀", "🤔"]
strategy = "random" # random | first | round_robin
sample_rate = 1.0 # probability of sending ack (0.0-1.0)

Conditional reactions based on message content:

[[channels_config.ack_reaction.telegram.rules]]
contains_any = ["urgent", "asap"]
emoji_override = ["🚨"]

Each channel can enforce a privacy boundary that restricts which tools and data flows are allowed:

ModeEffect
"" (empty)No restrictions — inherits from global config
"local_only"Blocks all outbound network tools (web search, HTTP, etc.)
"encrypted_only"Requires encrypted transport for all operations
[channels.telegram]
bot_token = "..."
privacy_boundary = "local_only" # this channel can only use local tools

The leak guard prevents sensitive data (API keys, tokens, passwords) from being sent through channels:

[security.outbound_leak_guard]
enabled = true
action = "redact" # redact | block | warn
sensitivity = 0.7 # detection threshold (0.0-1.0)
ActionBehavior
redactReplace detected secrets with [REDACTED]
blockDrop the entire message
warnSend the message but log a warning

SymptomCauseFix
Channel not startingMissing tokenCheck bot_token / access_token in config
Bot not responding in groupsGroup reply modeSet mode = "all_messages" or mention the bot
Messages timing outSlow LLM responseIncrease message_timeout_secs
Sensitive data in responsesLeak guard disabledEnable [security.outbound_leak_guard]
Channel not in channel listFeature not compiledBuild with --features channels-standard