agent-notify
A notification CLI for AI agents and automation scripts.

agent-notify provides the notify command for sending messages and generated files through configured notification channels.
Supported Channels
file-logtelegramdiscord-webhookdiscord-botntfyslack-webhookpushovergotifywebhook
The CLI can load, check, and send through the channel types above. External channel types require their configured service credentials or environment variables.
Installation
Install from crates.io:
This installs the notify binary.
To build from this repository instead:
The local build writes the binary to:
target/release/notify
Quick Start
Create notify.toml:
= "local"
[]
= "file-log"
= "./notify-log"
Send a notification:
This writes a local JSONL log under ./notify-log.
Concepts
A channel is the configured destination name that users and agents select, such as personal, team, phone, local, or automation.
Channel names are user-defined. The examples in this document are conventional names only; you can name channels for your own workflow, such as ops, alerts, desktop-log, or prod-slack.
A channel has a type, which controls how the notification is delivered:
telegram
discord-webhook
discord-bot
ntfy
slack-webhook
pushover
gotify
webhook
file-log
Agents should use channel names and should not need to know service credentials or provider-specific API details.
Configuration
notify looks for configuration in this order:
--config <path>./notify.toml~/.config/agent-notify/config.toml
Sample files are included under:
examples/notify.toml
examples/notify.env.example
Secrets
Secret-like values can be configured inline or through environment variables.
Recommended:
[]
= "discord-webhook"
= "NOTIFY_DISCORD_WEBHOOK_URL"
Quick setup:
[]
= "discord-webhook"
= "https://discord.com/api/webhooks/..."
Environment variables are recommended for shared repositories, CI, and agent workflows.
Secrets are not accepted as CLI arguments.
Invalid:
Also invalid:
= "https://discord.com/api/webhooks/..."
= "NOTIFY_DISCORD_WEBHOOK_URL"
Use either the inline field or the _env field, not both.
Channel Types
file-log
Stores notifications in a local JSONL file and copies attachments under a child directory.
[]
= "file-log"
= "./notify-log"
Use this for local testing or CI verification.
telegram
[]
= "telegram"
# Required. Use *_env for shared configs and agent workflows.
= "NOTIFY_TELEGRAM_BOT_TOKEN"
= "NOTIFY_TELEGRAM_CHAT_ID"
# Quick local setup can use inline values instead:
# bot_token = "123456:ABC..."
# chat_id = "123456789"
# Optional. Defaults to "plain". Supported: "plain", "html", "markdown-v2".
# parse_mode = "plain"
discord-webhook
[]
= "discord-webhook"
# Required.
= "NOTIFY_DISCORD_WEBHOOK_URL"
# Quick local setup can use an inline URL instead:
# webhook_url = "https://discord.com/api/webhooks/..."
# Optional display controls.
# username = "Agent Notify"
# avatar_url = "https://example.com/avatar.png"
# allow_mentions defaults to false. Set true to allow Discord mentions.
# allow_mentions = false
discord-bot
[]
= "discord-bot"
# Required.
= "NOTIFY_DISCORD_BOT_TOKEN"
= "NOTIFY_DISCORD_CHANNEL_ID"
# Quick local setup can use inline values instead:
# bot_token = "..."
# channel_id = "123456789012345678"
# Optional. Defaults to false.
# allow_mentions = false
ntfy
[]
= "ntfy"
# Required.
= "NOTIFY_NTFY_TOPIC"
# Quick local setup can use an inline topic instead:
# topic = "my-topic"
# Optional. Defaults to "https://ntfy.sh".
# server = "https://ntfy.sh"
# Optional bearer token, depending on your ntfy server/topic.
# token_env = "NOTIFY_NTFY_TOKEN"
# token = "..."
slack-webhook
[]
= "slack-webhook"
# Required.
= "NOTIFY_SLACK_WEBHOOK_URL"
# Quick local setup can use an inline URL instead:
# webhook_url = "https://hooks.slack.com/services/..."
# Optional display controls.
# username = "Agent Notify"
# icon_emoji = ":robot_face:"
# icon_url = "https://example.com/icon.png"
# allow_mentions defaults to false. Set true to allow Slack mass mentions.
# allow_mentions = false
Incoming webhook messages are sent as JSON. Attachments are not supported by this channel type.
pushover
[]
= "pushover"
# Required.
= "NOTIFY_PUSHOVER_TOKEN"
= "NOTIFY_PUSHOVER_USER"
# Quick local setup can use inline values instead:
# token = "app-token"
# user = "user-or-group-key"
# Optional routing and sound controls.
# device = "phone"
# sound = "pushover"
Attachments are not supported by this channel type.
gotify
[]
= "gotify"
# Required.
= "https://gotify.example.com"
= "NOTIFY_GOTIFY_TOKEN"
# Quick local setup can use an inline token instead:
# token = "app-token"
# Optional. Overrides the priority mapped from --priority.
# priority = 5
Attachments are not supported by this channel type.
webhook
[]
= "webhook"
# Required.
= "NOTIFY_WEBHOOK_URL"
# Quick local setup can use an inline URL instead:
# url = "https://example.com/notify"
# Optional Authorization header.
# auth_header_env = "NOTIFY_WEBHOOK_AUTH_HEADER"
# auth_header = "Bearer secret"
# Optional. Defaults to 15.
# timeout_seconds = 15
The webhook channel uses the project-defined webhook protocol. The v1 payload format is defined in SPEC.md.
Commands
notify send
Send a notification.
Use the default channel:
Send to multiple channels:
Attach a file:
Read body from a file:
Dry run:
Common options:
--channel <name> Channel name. Can be repeated. Uses default_channel if omitted.
--title <text> Notification title.
--body <text> Notification body.
--body-file <path> Read body from a file.
--file <path> Attach a file. Can be used multiple times.
--priority <level> info | success | warning | error | critical
--format <format> text | markdown
--tag <tag> Add a tag. Can be used multiple times.
--dry-run Resolve and display the notification without sending it.
--json Emit JSON output.
--config <path> Use a specific config file.
notify channels
List configured channels.
Example:
personal telegram ready
team discord-webhook ready
phone ntfy ready
chat slack-webhook ready
mobile pushover ready
self_hosted gotify ready
local file-log ready
automation webhook ready
notify check
Validate configuration.
Check one channel:
notify test
Send a test notification.
Webhook Protocol v1
The webhook channel sends the agent-notify webhook protocol v1 payload.
Without attachments, the request is application/json. With attachments, the request is multipart/form-data with a payload JSON part and file parts named file0, file1, and so on.
The full protocol is documented in:
docs/webhook-v1.md
Examples
Local test
= "local"
[]
= "file-log"
= "./notify-log"
Discord webhook
= "team"
[]
= "discord-webhook"
= "NOTIFY_DISCORD_WEBHOOK_URL"
Telegram
= "personal"
[]
= "telegram"
= "NOTIFY_TELEGRAM_BOT_TOKEN"
= "NOTIFY_TELEGRAM_CHAT_ID"
ntfy
= "phone"
[]
= "ntfy"
= "NOTIFY_NTFY_TOPIC"
Webhook
= "automation"
[]
= "webhook"
= "NOTIFY_WEBHOOK_URL"
Agent Skill
This repository includes an Agent Skill under:
skills/notification/
Use it when installing agent-notify into an AI agent environment.
Install the CLI first: