Reaction Tool Behavior Across Discord, Slack, Nextcloud Talk, and Telegram

Learn how the message tool's react action works on different channels, including adding and removing emoji reactions. This page is for developers building bots that need consistent reaction handling.

Read this when

  • Working on reactions in any channel
  • Understanding how emoji reactions differ across platforms

The agent uses the message tool's react action to add and remove emoji reactions. How this behaves depends on the channel.

How it works

{
  "action": "react",
  "messageId": "msg-123",
  "emoji": "thumbsup"
}
  • emoji is mandatory when adding a reaction.
  • Set emoji to an empty string ("") to remove the bot's reaction(s) on channels that support this.
  • Set remove: true to remove a single specific emoji (requires a non-empty emoji).
  • On channels with status reactions, using trackToolCalls: true on a reaction lets the runtime reuse that reacted message for subsequent tool-progress reactions within the same turn.

Channel behavior

Discord and Slack

  • An empty emoji removes all of the bot's reactions on that message.
  • remove: true removes only the specified emoji.

Nextcloud Talk

  • Adding reactions only: emoji is required and must be non-empty.
  • Reaction removal is not yet wired to a delete call; remove: true is rejected with an explicit error rather than silently doing nothing.
  • Requires the Talk bot registered with the reaction feature (see Nextcloud Talk channel docs).

Telegram

  • An empty emoji removes the bot's reactions.
  • remove: true also removes reactions but still requires a non-empty emoji for tool validation.

WhatsApp

  • An empty emoji removes the bot reaction.
  • remove: true maps to an empty emoji internally (still requires emoji in the tool call).
  • WhatsApp has one bot reaction slot per message; sending a new reaction replaces it instead of stacking multiple emoji.

Zalo Personal (zalouser)

  • Requires a non-empty emoji for both add and remove.
  • remove: true removes that specific emoji reaction.

Feishu/Lark

  • Uses the same react action as other channels (add/remove/list via message reaction IDs), not a separate tool.
  • Adding requires a non-empty emoji (mapped to a Feishu emoji_type, e.g. SMILE, THUMBSUP, HEART).
  • remove: true requires a non-empty emoji and removes the bot's own reaction matching that emoji type.
  • An empty emoji with clearAll: true removes all of the bot's reactions on the message.

Signal

  • Inbound reaction notifications are controlled by channels.signal.reactionNotifications: "off" disables them, "own" (default) emits events when users react to bot messages, "all" emits events for all reactions, and "allowlist" emits events only for senders in channels.signal.reactionAllowlist.

iMessage

  • Outbound reactions are iMessage tapbacks (love, like, dislike, laugh, emphasize, and question); emoji must map to one of these kinds to add a reaction.
  • remove: true without a recognized tapback kind removes all tapback kinds; with a recognized kind it removes only that one.

Reaction level

Per-channel reactionLevel throttles how often the agent sends its own reactions. Values: off, ack, minimal, or extensive.

  • Agent Send - the message tool that includes react
  • Channels - channel-specific configuration