Discord est un canal Crew natif — chaque fil de messages directs est une session isolée avec accès complet aux outils, réponses en continu et approbation d'outil en ligne. La configuration ressemble à celle de Slack, mais le modèle de confiance et de liste d'autorisation est plus strict : refus par défaut avec une liste d'autorisation explicite des utilisateurs.
Le tableau de bord affiche un badge d'état vert lorsque la connexion est établie.
Définissez la variable d'environnement et configurez la liste d'autorisation :
# In ~/.kiro/crew/.env DISCORD_BOT_TOKEN=your-token-here
Dans ~/.kiro/crew/config.json :
{ "discord": { "allowed_users": ["123456789012345678"] } }
Puis redémarrez : kirocrew restart. Vérifiez l'état avec kirocrew doctor.
Discord utilise une connexion WebSocket Gateway pour les événements entrants (identification → pulsation → distribution des messages) et REST pour les envois sortants (publier un message, modifier, réagir, accuser réception d'un composant). Aucune URL publique n'est nécessaire — le processus du Crew établit et maintient le WebSocket.
Comparativement à Slack, les éléments mobiles sont :
| Aspect | Slack | Discord |
|---|---|---|
| Entrant | WebSocket en mode socket | WebSocket Gateway |
| Sortant | REST Web API | REST |
| Modèle d'authentification | Propriétaire seulement via KIROCREW_OWNER_ID | Liste d'autorisation à refus par défaut des identifiants d'utilisateur |
| Clé de session | slack:{thread_ts} | discord:{agent}:direct:{user} |
Chaque canal de messages directs Discord devient sa propre session, avec pour clé discord:{agent}:direct:{user} :
session.timeout_secs (30 minutes d'inactivité par défaut)Puisque la session utilise l'utilisateur comme clé (et non un fil), tous les messages d'un même utilisateur vont dans une seule session continue. Les messages directs Discord sont conversationnels — le modèle convient bien.
La surface du plan de contrôle de Discord est à refus par défaut, même pour le propriétaire du bot. Pour interagir avec le bot à partir d'un message direct Discord, l'utilisateur doit figurer dans la liste d'autorisation.
Géré via la configuration ou le tableau de bord :
{ "discord": { "allowed_users": ["123456789012345678", "234567890123456789"] } }
Ou par l'intermédiaire du panneau des paramètres Discord du tableau de bord. Chaque ajout à la liste d'autorisation fait l'objet d'un audit SEL.
Pourquoi le refus par défaut. Contrairement à Slack, où l'identifiant du propriétaire donne une identité unique verrouillée, les invitations de bot Discord sont peu coûteuses. Un bot ajouté à un serveur public sans liste d'autorisation serait exposé à quiconque pourrait lui envoyer un message direct. La liste d'autorisation force une adhésion explicite par utilisateur.
La boucle d'autonudge — la vérification autonome réactive qui réinjecte des instructions selon une minuterie d'inactivité — est verrouillée à la session actuelle de l'utilisateur uniquement sur Discord. Un nudge ne peut pas se déclencher contre une session de messages directs plus ancienne d'un utilisateur, et un utilisateur qui n'est pas actuellement actif n'obtient rien.
Cette asymétrie est intentionnelle. Le modèle de canal de Discord ne sépare pas clairement « le travail actif de cet utilisateur » de « les fils plus anciens de cet utilisateur », donc le Crew opte pour la rigueur.
L'approbation interactive d'outil fonctionne via les boutons de composants de message de Discord :
Les messages de suivi pendant une invite d'approbation sont mis en file d'attente. L'envoi de !stop annule le tour actuel (et toute approbation en attente).
Le mode d'approbation correspond au mode global de la passerelle :
interactive — chaque appel d'outil déclenche une inviteauto (YOLO) — approbation automatique de tous les appels d'outilMise en garde en mode interactif. En mode interactif, les boucles de surveillance Discord ne peuvent pas utiliser d'outils — le tour non surveillé n'a personne pour approuver les appels, il se rabat donc sur le refus par défaut. Si vous voulez des flux de travail Discord riches en outils, exécutez la passerelle en mode auto ou utilisez le tableau de bord / Slack pour le travail avec outils.
La plateforme Discord limite les messages à 2000 caractères par message (max_message_chars: 2000 pour le transport Discord). Les longues réponses de l'agent sont automatiquement divisées. Les boutons interactifs sont limités à 3 par carte de style Block Kit (max_buttons: 3).
file_sendLes fichiers envoyés par des utilisateurs non autorisés sont rejetés silencieusement.
Si votre bot Discord fonctionne dans une organisation comportant plusieurs comptes, le transport prend en charge la validation d'identifiant d'entreprise — analogue à la vérification Enterprise Grid de Slack — mais la défense principale reste la liste d'autorisation.
Les canaux de groupe Discord peuvent être joints, mais doivent être activés par canal. Dans les canaux de groupe :
Par défaut, seules les sessions de messages directs sont actives. La participation aux groupes se fait sur adhésion volontaire.
L'outil MCP send_message prend en charge les cibles Discord :
channel: "discord:{channel_id}" — publier dans un canal spécifiqueuser: "discord:{user_id}" — publier dans les messages directs d'un utilisateur spécifiqueLes tâches cron et les achèvements de sous-agents peuvent cibler Discord de cette façon si le marqueur d'acheminement déclare un canal Discord :
- [ ] Poll status <!-- deliver:discord:{channel_id} -->
L'API REST de Discord comporte des limites de débit par route. Le transport les respecte et réduit automatiquement la cadence. Si vous voyez des erreurs 429 répétées dans kirocrew doctor, le bot est limité en débit — réduisez la fréquence des messages ou utilisez moins de mises à jour de composants en ligne.
| Symptôme | Solution |
|---|---|
| Le bot ne répond pas | Confirmez que DISCORD_BOT_TOKEN est défini et que kirocrew doctor indique que Discord est connecté |
| Seul le propriétaire fonctionne, aucun autre utilisateur ne peut envoyer de message direct | Ajoutez l'identifiant Discord de l'utilisateur à discord.allowed_users via la configuration ou le tableau de bord |
| Les boutons d'approbation d'outil ne font rien | Le point de terminaison d'interaction de Discord exige que le bot soit en ligne; vérifiez les journaux de la passerelle pour des déconnexions du WebSocket |
| Une longue réponse est tronquée | Limite de 2000 caractères — le transport divise automatiquement; si vous observez une troncature au lieu de cela, vérifiez la présence d'un formateur de message personnalisé fragile |
| Le mémo vocal n'est pas transcrit | Vérifiez que le fournisseur STT est configuré (voice.stt_provider); les messages directs Discord sont traités comme les mémos vocaux Slack |
Sous discord.* :
| Clé | Par défaut | But |
|---|---|---|
discord.enabled | false (jusqu'à la présence du jeton) | Commutateur principal — activé implicitement lorsque le jeton est défini |
discord.allowed_users | [] | Liste d'autorisation à refus par défaut des identifiants d'utilisateur Discord |
discord.enterprise_id | "" | Vérification facultative d'identifiant d'entreprise / d'espace de travail |
discord.command_prefix | ! | Préfixe pour les commandes à point d'exclamation |
Discord