Per inviare le notifiche di Claude Code su Telegram, Slack o Discord, crea un bot o un webhook in entrata nell'app, poi aggiungi un hook di Claude Code che ci invia un breve messaggio con curl. Un hook Notification copre "Claude ha bisogno del tuo permesso" e "Claude è in attesa", mentre un hook Stop copre "Claude ha finito". Telegram richiede un bot token e il tuo chat ID, Slack e Discord solo l'URL di un webhook. Lo stesso script funziona su Mac e Linux, e una breve versione in PowerShell copre Windows.
01Prima di iniziare: il messaggio e il segreto
Ogni hook riceve un JSON sullo standard input. I campi utili sono hook_event_name, cwd (la cartella del progetto), message negli eventi Notification e last_assistant_message negli eventi Stop. Gli esempi qui sotto li trasformano in una sola riga, tipo Claude needs you in my-app: Claude needs your permission to use Bash.
I bot token e gli URL dei webhook sono password: chiunque li abbia può pubblicare a nome del tuo bot. La documentazione di Slack dice chiaramente di non condividere gli URL dei webhook né di committarli nel version control. Tienili in un file separato leggibile solo da te:
mkdir -p ~/.claude
touch ~/.claude/chat-notify.env
chmod 600 ~/.claude/chat-notify.env
02Telegram: un bot che ti scrive
- Su Telegram, apri una chat con @BotFather, invia
/newbote segui le istruzioni. Ti risponderà con un token tipo123456789:AA.... - Apri una chat con il tuo nuovo bot e mandagli un messaggio qualsiasi, così potrà risponderti.
- Trova il tuo chat ID. Apri questo URL con il tuo token e cerca
"chat":{"id":nella risposta:
curl "https://api.telegram.org/bot<TOKEN>/getUpdates"
- Metti entrambi i valori in
~/.claude/chat-notify.env:
SERVICE=telegram
TELEGRAM_TOKEN=123456789:AA...
TELEGRAM_CHAT_ID=987654321
Il metodo sendMessage di Telegram accetta chat_id e text (da 1 a 4.096 caratteri). Accetta anche disable_notification=true, che consegna il messaggio senza suono. Lo script lo usa per i messaggi di "finito" e lascia il suono per le richieste di permesso.
03Slack: un webhook in entrata
- Crea un'app Slack su api.slack.com/apps (o aprine una esistente).
- In Incoming Webhooks, attiva Activate Incoming Webhooks.
- Clicca su Add New Webhook to Workspace, scegli un canale e seleziona Authorize.
- Copia l'URL che inizia con
https://hooks.slack.com/services/.
SERVICE=slack
SLACK_WEBHOOK_URL=https://hooks.slack.com/services/T000/B000/XXXX
Ogni webhook pubblica in un solo canale, scelto alla creazione, e non puoi cambiare nome o icona per singolo messaggio. L'ideale è un piccolo canale privato tutto tuo, così l'avviso non si perde in un canale affollato.
04Discord: un webhook di canale
- Nel tuo server, apri Server Settings, poi Integrations, poi Webhooks.
- Crea un webhook, scegli il canale e copia il suo URL.
SERVICE=discord
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/1234/abcd
L'endpoint execute-webhook di Discord accetta un body JSON con content (fino a 2.000 caratteri) e un username opzionale per sovrascrivere il nome del webhook.
05Lo script dell'hook (Mac e Linux)
Salvalo come ~/.claude/chat-notify.sh ed esegui chmod +x ~/.claude/chat-notify.sh. Servono curl e jq (brew install jq oppure apt install jq).
#!/bin/sh
. "$HOME/.claude/chat-notify.env"
input=$(cat)
event=$(printf '%s' "$input" | jq -r '.hook_event_name')
project=$(basename "$(printf '%s' "$input" | jq -r '.cwd')")
if [ "$event" = "Stop" ]; then
detail=$(printf '%s' "$input" | jq -r '(.last_assistant_message // "") | .[0:300]')
text="Claude finished in $project. $detail"
quiet=true
else
detail=$(printf '%s' "$input" | jq -r '.message // "Needs your attention"')
text="Claude needs you in $project: $detail"
quiet=false
fi
case "$SERVICE" in
telegram)
curl -s "https://api.telegram.org/bot$TELEGRAM_TOKEN/sendMessage" \
--data-urlencode "chat_id=$TELEGRAM_CHAT_ID" \
--data-urlencode "text=$text" \
--data-urlencode "disable_notification=$quiet" > /dev/null ;;
slack)
jq -n --arg t "$text" '{text: $t}' | curl -s -X POST \
-H 'Content-Type: application/json' --data @- "$SLACK_WEBHOOK_URL" > /dev/null ;;
discord)
jq -n --arg t "$text" '{content: $t, username: "Claude Code"}' | curl -s -X POST \
-H 'Content-Type: application/json' --data @- "$DISCORD_WEBHOOK_URL" > /dev/null ;;
esac
exit 0
Costruire il JSON con jq -n --arg è importante: le risposte di Claude contengono virgolette, backslash e a capo, e incollarle a mano in una stringa JSON rompe la richiesta.
Provalo prima di collegarlo:
echo '{"hook_event_name":"Notification","cwd":"/tmp/demo","message":"Test"}' | ~/.claude/chat-notify.sh
06Aggiungi gli hook
In ~/.claude/settings.json, dentro l'oggetto hooks esistente, se c'è:
{
"hooks": {
"Notification": [
{
"matcher": "permission_prompt|idle_prompt",
"hooks": [{ "type": "command", "command": "~/.claude/chat-notify.sh" }]
}
],
"Stop": [
{
"hooks": [{ "type": "command", "command": "~/.claude/chat-notify.sh", "async": true }]
}
]
}
}
Avvia una nuova sessione di Claude Code per caricare gli hook. idle_prompt e Stop si sovrappongono: Stop scatta appena Claude finisce, idle_prompt circa un minuto dopo se non hai scritto nulla. Tienili entrambi o togline uno; la guida a ntfy spiega i pro e i contro.
07Windows (PowerShell)
Salvalo come %USERPROFILE%\.claude\chat-notify.ps1. Questa versione pubblica su Discord; per Slack cambia il body in @{ text = $text } e l'URL.
$url = 'https://discord.com/api/webhooks/1234/abcd'
$in = [Console]::In.ReadToEnd() | ConvertFrom-Json
$project = Split-Path $in.cwd -Leaf
if ($in.hook_event_name -eq 'Stop') { $text = "Claude finished in $project." }
else { $text = "Claude needs you in ${project}: $($in.message)" }
$json = @{ content = $text; username = 'Claude Code' } | ConvertTo-Json
Invoke-RestMethod -Method Post -Uri $url -ContentType 'application/json; charset=utf-8' `
-Body ([Text.Encoding]::UTF8.GetBytes($json)) | Out-Null
Voce dell'hook:
{
"type": "command",
"shell": "powershell",
"command": "powershell -NoProfile -ExecutionPolicy Bypass -File \"$HOME\\.claude\\chat-notify.ps1\""
}
Dentro WSL, usa lo script per Mac e Linux.
08Cosa sapere sulle app di chat come sistema di notifica
- Ciò che invii esce dal tuo computer. Il messaggio di "finito" include l'inizio della risposta di Claude. In un canale Slack o Discord condiviso, chiunque ci sia può leggerlo. Togli
$detailse il tuo codice è privato. - Le app di chat raggruppano e silenziano. Un workspace affollato o un server silenziato possono nascondere l'avviso. Un'app di notifiche push dedicata come ntfy (vedi la guida a ntfy) ha meno probabilità di perderlo.
- Gli hook non sanno se sei alla scrivania.
Stoppubblica ogni volta.idle_promptepermission_promptsono il filtro "non ci sono" integrato più vicino.
09Dove si inserisce Claude Code Notifier
Un webhook è un buon modo per tenere un log di cosa ha fatto Claude, e per un team può essere lo strumento giusto. Per chi vuole agire sull'avviso, però, si ferma a metà: leggi che Claude ha bisogno di un permesso e poi devi tornare al terminal per darglielo. Un bot Telegram in teoria potrebbe ricevere risposte, ma dovresti scriverti tu l'hook che le attende e restituisce una decisione.
Claude Code Notifier fa proprio questo. Con un telefono associato, puoi consentire una volta, consentire per la sessione o negare una richiesta di permesso, rispondere alle domande a scelta multipla di Claude e inviare un'istruzione successiva quando Claude finisce, tutto dal telefono. Se hai scritto negli ultimi 30 secondi, il terminal chiede come al solito e sul telefono non resta niente in attesa. È indipendente, non realizzato da Anthropic, e ccn gira su Mac, Windows e Linux. Guarda il confronto con le alternative, la pagina di ccn e i prezzi.
10FAQ
Claude Code può pubblicare su Slack senza uno script?
Claude Code ha hook http che fanno POST del JSON dell'hook a un URL, ma i webhook di Slack e Discord si aspettano un formato di body specifico (text o content), quindi un hook http diretto fallisce. Serve un piccolo script o un relay nel mezzo.
Come trovo il mio chat ID di Telegram?
Manda un messaggio al tuo bot, poi apri https://api.telegram.org/bot<TOKEN>/getUpdates. Il numero dopo "chat":{"id": è il chat ID. Per un gruppo, aggiungi prima il bot al gruppo e invia lì un messaggio.
Posso rispondere a Claude Code da Slack o Discord?
Non con un incoming webhook, che si limita a pubblicare messaggi. Per rispondere serve un hook che aspetti la tua risposta e restituisca una decisione, ed è proprio quello che fanno gli strumenti di approvazione remota.
L'hook rallenterà Claude Code?
La voce Stop usa "async": true, quindi l'invio avviene in background. Gli hook Notification girano già in parallelo a Claude senza bloccarlo.