Pour envoyer les notifications de Claude Code vers Telegram, Slack ou Discord, crée un bot ou un webhook entrant dans l'app, puis ajoute un hook Claude Code qui y poste un court message avec curl. Un hook Notification couvre « Claude a besoin de ton autorisation » et « Claude attend », et un hook Stop couvre « Claude a terminé ». Telegram demande un token de bot et ton chat ID ; Slack et Discord n'ont besoin que d'une URL de webhook. Le même script fonctionne sur Mac et Linux, et une courte version PowerShell couvre Windows.
01Avant de commencer : le message et le secret
Chaque hook reçoit du JSON sur l'entrée standard. Les champs utiles sont hook_event_name, cwd (le dossier du projet), message pour les événements Notification, et last_assistant_message pour les événements Stop. Les exemples ci-dessous en font une seule ligne, par exemple Claude needs you in my-app: Claude needs your permission to use Bash.
Les tokens de bot et les URL de webhook sont des mots de passe : quiconque en possède un peut poster au nom de ton bot. La documentation de Slack dit clairement de ne pas partager les URL de webhook ni de les commiter dans un gestionnaire de versions. Garde-les dans un fichier séparé que toi seul peux lire :
mkdir -p ~/.claude
touch ~/.claude/chat-notify.env
chmod 600 ~/.claude/chat-notify.env
02Telegram : un bot qui t'envoie des messages
- Dans Telegram, ouvre une conversation avec @BotFather, envoie
/newbotet suis les instructions. Il te répond avec un token du type123456789:AA.... - Ouvre une conversation avec ton nouveau bot et envoie-lui n'importe quel message, pour qu'il ait le droit de t'écrire.
- Récupère ton chat ID. Ouvre cette URL avec ton token et cherche
"chat":{"id":dans la réponse :
curl "https://api.telegram.org/bot<TOKEN>/getUpdates"
- Mets les deux valeurs dans
~/.claude/chat-notify.env:
SERVICE=telegram
TELEGRAM_TOKEN=123456789:AA...
TELEGRAM_CHAT_ID=987654321
La méthode sendMessage de Telegram prend chat_id et text (de 1 à 4 096 caractères). Elle accepte aussi disable_notification=true, qui livre le message sans son. Le script l'utilise pour les messages « terminé » et garde le son pour les demandes d'autorisation.
03Slack : un webhook entrant
- Crée une app Slack sur api.slack.com/apps (ou ouvre une app existante).
- Dans Incoming Webhooks, active Activate Incoming Webhooks.
- Clique sur Add New Webhook to Workspace, choisis un canal et sélectionne Authorize.
- Copie l'URL qui commence par
https://hooks.slack.com/services/.
SERVICE=slack
SLACK_WEBHOOK_URL=https://hooks.slack.com/services/T000/B000/XXXX
Chaque webhook poste dans un seul canal, choisi à sa création, et tu ne peux pas changer le nom ni l'icône à chaque message. Le mieux, c'est un petit canal privé rien qu'à toi, pour que l'alerte ne se noie pas dans un canal très actif.
04Discord : un webhook de canal
- Sur ton serveur, ouvre Server Settings, puis Integrations, puis Webhooks.
- Crée un webhook, choisis le canal et copie son URL.
SERVICE=discord
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/1234/abcd
L'endpoint execute-webhook de Discord prend un corps JSON avec content (jusqu'à 2 000 caractères) et un username optionnel pour remplacer le nom du webhook.
05Le script du hook (Mac et Linux)
Enregistre-le sous ~/.claude/chat-notify.sh et lance chmod +x ~/.claude/chat-notify.sh. Il a besoin de curl et de jq (brew install jq ou 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
Construire le JSON avec jq -n --arg est important : les réponses de Claude contiennent des guillemets, des antislashs et des retours à la ligne, et les coller à la main dans une chaîne JSON casse la requête.
Teste-le avant de le brancher :
echo '{"hook_event_name":"Notification","cwd":"/tmp/demo","message":"Test"}' | ~/.claude/chat-notify.sh
06Ajouter les hooks
Dans ~/.claude/settings.json, à l'intérieur de l'objet hooks existant s'il y en a un :
{
"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 }]
}
]
}
}
Lance une nouvelle session Claude Code pour que les hooks soient chargés. idle_prompt et Stop se recoupent : Stop se déclenche dès que Claude termine, et idle_prompt environ une minute plus tard si tu n'as rien tapé. Garde les deux ou supprimes-en un ; le guide ntfy explique le compromis.
07Windows (PowerShell)
Enregistre-le sous %USERPROFILE%\.claude\chat-notify.ps1. Cette version poste sur Discord ; pour Slack, remplace le corps par @{ text = $text } et change 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
Entrée du hook :
{
"type": "command",
"shell": "powershell",
"command": "powershell -NoProfile -ExecutionPolicy Bypass -File \"$HOME\\.claude\\chat-notify.ps1\""
}
Dans WSL, utilise le script Mac et Linux.
08Ce qu'il faut savoir sur les apps de chat comme outil de notification
- Ce que tu envoies quitte ton ordinateur. Le message « terminé » contient le début de la réponse de Claude. Dans un canal Slack ou Discord partagé, tous les membres peuvent le lire. Retire
$detailsi ton code est privé. - Les apps de chat regroupent et mettent en sourdine. Un workspace très actif ou un serveur en sourdine peut masquer l'alerte. Une app de push dédiée comme ntfy (voir le guide ntfy) risque moins de se perdre.
- Les hooks ne savent pas si tu es devant ton écran.
Stopposte à chaque fois.idle_promptetpermission_promptsont ce qui se rapproche le plus d'un filtre « absent » intégré.
09Où se situe Claude Code Notifier
Un webhook est un bon moyen de garder une trace de ce qu'a fait Claude, et pour une équipe, ça peut être le bon outil. Mais pour une personne seule qui veut agir sur l'alerte, ça ne va pas assez loin : tu lis que Claude a besoin d'une autorisation, puis tu retournes au terminal pour la donner. Un bot Telegram pourrait en théorie recevoir des réponses, mais il faudrait écrire toi-même le hook qui les attend et renvoie une décision.
Claude Code Notifier s'occupe de cette partie. Avec un téléphone appairé, tu autorises une fois, autorises pour la session ou refuses une demande d'autorisation, tu réponds aux questions à choix multiples de Claude et tu envoies une nouvelle instruction quand Claude a terminé, le tout depuis ton téléphone. Si tu as tapé quelque chose dans les 30 dernières secondes, le terminal demande comme d'habitude et rien n'attend sur le téléphone. C'est un outil indépendant, non créé par Anthropic, et ccn tourne sur Mac, Windows et Linux. Voir la comparaison, la page ccn et les tarifs.
10FAQ
Claude Code peut-il poster sur Slack sans script ?
Claude Code propose des hooks http qui envoient le JSON du hook en POST vers une URL, mais les webhooks Slack et Discord attendent leur propre format de corps (text ou content), donc un hook http direct échoue. Il faut un petit script ou un relais entre les deux.
Comment trouver mon chat ID Telegram ?
Envoie un message à ton bot, puis ouvre https://api.telegram.org/bot<TOKEN>/getUpdates. Le nombre après "chat":{"id": est le chat ID. Pour un groupe, ajoute d'abord le bot au groupe et envoie-y un message.
Je peux répondre à Claude Code depuis Slack ou Discord ?
Pas avec un webhook entrant, qui ne fait que publier. Pour répondre, il faut un hook qui attend ta réponse et renvoie une décision, et c'est exactement le rôle des outils d'approbation à distance.
Est-ce que le hook va ralentir Claude Code ?
L'entrée Stop utilise "async": true, donc l'envoi se fait en arrière-plan. Les hooks Notification tournent déjà en parallèle de Claude sans le bloquer.