OpenClaw

OpenClaw Discord 채널

메시징
쉬움

discord.js Bot Gateway API를 사용하여 OpenClaw를 Discord에 연결합니다. Discord Developer Portal에서 봇을 생성하고 필요한 Intent를 활성화한 후 서버에 봇을 초대하면 AI 어시스턴트가 Discord에서 바로 작동합니다. 다이렉트 메시지, 서버 채널 대화, 리액션, 스레드, 슬래시 명령, 리치 미디어를 지원합니다. 가장 쉽게 설정할 수 있는 채널 중 하나입니다.

기본 정보
난이도쉬움
카테고리메시징
지원 기능 수5 / 6

Discord 지원 기능

텍스트 메시지

지원

미디어 및 파일

지원

리액션

지원

스레드

지원

음성 메시지

미지원

그룹 채팅

지원

Discord 사전 요구사항

  • Discord Developer Portal에 접근할 수 있는 Discord 계정
  • Discord Developer Portal에서 발급한 Bot Token (Applications → New Application → Bot)
  • Privileged Gateway Intents에서 Message Content Intent 활성화
  • OpenClaw Gateway 실행 및 구성 완료

Discord 빠른 설정

1

Discord 봇 생성 및 Intent 활성화

Discord Developer Portal(discord.com/developers)로 이동하여 New Application을 생성하고 Bot 사용자를 추가한 후 Bot Token을 복사합니다. Privileged Gateway Intents에서 'Message Content Intent'(필수)와 'Server Members Intent'(멤버 조회에 권장)를 활성화합니다.

2

Discord 채널 구성 추가

~/.openclaw/openclaw.json에 Discord 채널 구성을 추가합니다. 토큰을 설정하거나 DISCORD_BOT_TOKEN 환경 변수를 사용하고, dm.policy를 구성하여 봇에게 DM을 보낼 수 있는 사용자를 제어합니다.

3

서버에 봇 초대 및 테스트

Developer Portal에서 OAuth2 → URL Generator로 이동합니다. 'bot'과 'applications.commands' 스코프를 선택합니다. 권한으로 View Channels, Send Messages, Read Message History, Embed Links, Attach Files, Add Reactions를 선택합니다. 생성된 URL을 열어 서버에 봇을 초대합니다. '@BotName hello'를 전송하여 테스트합니다.

Discord 구성 예시

config.json
{
  "channels": {
    "discord": {
      "enabled": true,
      "token": "YOUR_DISCORD_BOT_TOKEN",
      "dm": {
        "policy": "pairing"
      }
    }
  }
}

Discord 상세 문서

아키텍처 개요

OpenClaw는 discord.js 라이브러리를 통해 Discord에 연결합니다. discord.js는 Discord Bot Gateway API와 상호작용하기 위한 강력한 Node.js 모듈입니다. 봇은 WebSocket을 통해 Discord의 Gateway에 연결되어 메시지, 리액션 및 기타 상호작용에 대한 실시간 이벤트를 수신합니다. 세션 라우팅은 컨텍스트에 따라 다릅니다: 다이렉트 메시지 대화는 에이전트의 메인 세션(agent:main:main)으로 통합되며, 서버 채널 대화는 채널별로 격리된 세션(agent:<agentId>:discord:channel:<channelId>)을 생성합니다. 슬래시 명령은 사용자별로 고유한 격리 세션을 가집니다. 그룹 DM은 기본적으로 비활성화되어 있습니다.
봇 토큰은 DISCORD_BOT_TOKEN 환경 변수 또는 channels.discord.token 구성에서 설정할 수 있습니다.
Discord에서 개발자 모드를 활성화하면(사용자 설정 → 고급) 우클릭으로 Guild ID, Channel ID, User ID를 쉽게 복사할 수 있습니다.

봇 생성하기

Discord 봇을 설정하려면 Discord Developer Portal에서 애플리케이션을 생성해야 합니다: 1. discord.com/developers/applications으로 이동합니다 2. 'New Application'을 클릭하고 이름을 지정합니다 3. Bot 섹션으로 이동하여 'Add Bot'을 클릭합니다 4. Bot Token을 복사합니다 — 안전하게 보관하세요 5. Privileged Gateway Intents에서 다음을 활성화합니다: • Message Content Intent (필수 — 이것이 없으면 봇이 메시지 내용을 읽을 수 없습니다) • Server Members Intent (멤버/역할 조회에 권장) 6. OAuth2 → URL Generator로 이동합니다 7. 스코프 선택: 'bot' 및 'applications.commands' 8. 권한 선택: View Channels, Send Messages, Read Message History, Embed Links, Attach Files, Add Reactions 9. 생성된 URL을 복사하여 열어 서버에 봇을 초대합니다
디버깅 중이 아니라면 Administrator 권한 부여를 피하세요. 보안을 위해 최소한의 필수 권한만 사용하세요.
봇 토큰을 비밀로 유지하세요. 토큰을 가진 누구나 봇을 제어할 수 있습니다. 유출된 경우 Developer Portal에서 재생성하세요.
Message Content Intent는 봇이 메시지 텍스트를 읽는 데 필수입니다. 이것이 없으면 봇은 연결되지만 메시지 내용을 볼 수 없습니다.

DM 정책

DM(다이렉트 메시지) 정책은 비공개 채팅에서 AI 어시스턴트와 상호작용할 수 있는 사용자를 제어합니다. OpenClaw는 네 가지 정책을 지원합니다: • pairing (기본값) — 알 수 없는 발신자에게 시간 제한이 있는 페어링 코드가 전송됩니다(1시간 후 만료). 터미널에서 'openclaw pairing approve discord <code>'를 통해 승인합니다. 승인되면 자유롭게 채팅할 수 있습니다. • allowlist — dm.allowFrom에 명시적으로 나열된 사용자 ID만 봇에게 메시지를 보낼 수 있습니다. 나머지는 자동으로 무시됩니다. • open — 봇에게 DM을 보내는 누구나 응답을 받습니다. 작동하려면 dm.allowFrom=["*"]이 필요합니다. 주의하여 사용하세요. • disabled — DM 처리가 완전히 비활성화됩니다. 봇은 어떤 다이렉트 메시지에도 응답하지 않습니다.
openclaw.json
{
  "channels": {
    "discord": {
      "dm": {
        "policy": "pairing",
        "allowFrom": ["123456789012345678"]
      }
    }
  }
}

서버 채널 구성

Guild(서버) 채널은 대부분의 Discord 상호작용이 이루어지는 곳입니다. OpenClaw는 봇이 작동하는 서버와 채널에 대한 세밀한 제어를 제공합니다. 최상위 설정: • groupPolicy — 서버 채널 처리 방식을 제어합니다. 옵션: open(모든 채널에서 응답), disabled(모든 서버 메시지 무시), allowlist(구성된 서버로 제한) 서버별 구성으로 각 서버의 동작을 사용자 정의할 수 있습니다: • slug — 표시용 식별자 • users — 사용자 허용 목록(ID 또는 이름) • requireMention — 봇이 @멘션되어야 하는지 여부 • reactionNotifications — 리액션 이벤트 알림 제어(off, own, all, allowlist) 채널별 규칙으로 서버 내에서 더 세밀한 제어가 가능합니다: • allow — 채널 활성화/비활성화 • requireMention — 채널별 멘션 요구 설정 • users — 채널 사용자 허용 목록 • skills — 스킬 필터(모두 사용하려면 생략) • systemPrompt — AI에 대한 추가 컨텍스트 지시사항
openclaw.json
{
  "channels": {
    "discord": {
      "groupPolicy": "open",
      "guilds": {
        "YOUR_GUILD_ID": {
          "slug": "my-server",
          "requireMention": true,
          "channels": {
            "CHANNEL_ID": {
              "allow": true,
              "requireMention": false,
              "systemPrompt": "You are a helpful assistant in this channel."
            }
          }
        }
      }
    }
  }
}
Discord에서 개발자 모드를 활성화하면(사용자 설정 → 고급) 우클릭으로 Guild, Channel, User ID를 복사할 수 있습니다.
채널별 systemPrompt를 사용하면 각 채널마다 AI에게 다른 성격이나 지시사항을 부여할 수 있습니다.

리액션 및 수신 확인

OpenClaw는 메시지 수신 확인 및 리액션 알림을 위한 Discord 리액션 시스템을 지원합니다. 수신 확인 리액션: 봇은 수신 메시지에 이모지로 반응하여 처리 중임을 알릴 수 있습니다. messages.ackReaction으로 구성합니다. messages.removeAckAfterReply를 사용하면 AI가 응답한 후 리액션을 자동으로 제거할 수 있습니다. 리액션 알림: 서버별로 어떤 리액션이 에이전트 알림을 트리거하는지 구성합니다: • off — 리액션 알림 없음 • own — 봇 메시지에 대한 리액션만 • all — 채널의 모든 리액션 • allowlist — 허용된 사용자의 리액션만
openclaw.json
{
  "channels": {
    "discord": {
      "messages": {
        "ackReaction": "👀",
        "removeAckAfterReply": true
      },
      "guilds": {
        "GUILD_ID": {
          "reactionNotifications": "own"
        }
      }
    }
  }
}

메시지 포맷팅 및 분할

Discord는 2,000자 메시지 제한이 있습니다. OpenClaw는 긴 AI 응답을 자동으로 분할하여 처리합니다. 주요 설정: • textChunkLimit — 메시지 청크당 최대 문자 수(기본값: 2000) • maxLinesPerMessage — 메시지당 소프트 줄 수 제한(기본값: 17) • chunkMode — 분할 전략: 'length'(기본값, 문자 수 기준 분할) 또는 'newline'(단락 경계에서 분할) 봇은 또한 최근 서버 메시지의 컨텍스트를 주입하여(historyLimit으로 구성 가능, 기본값 20개 메시지) AI가 진행 중인 대화에 자연스럽게 참여할 수 있도록 합니다.
openclaw.json
{
  "channels": {
    "discord": {
      "textChunkLimit": 2000,
      "chunkMode": "newline",
      "historyLimit": 20
    }
  }
}

슬래시 명령 및 도구 액션

OpenClaw는 봇 시작 시 네이티브 Discord 슬래시 명령을 자동으로 등록합니다(기본값: auto, commands.native로 구성 가능). commands.native를 false로 설정하면 이전에 등록된 명령이 삭제됩니다. 명령은 메시지와 동일한 허용 목록 규칙을 따르며, 권한이 없는 사용자는 Discord UI에서 명령을 볼 수 있지만 '권한 없음' 응답을 받습니다. 세션 격리: 슬래시 명령은 공유 메인 세션 대신 별도의 세션 키(agent:<agentId>:discord:slash:<userId>)를 사용하여 사용자별 격리를 제공합니다. 에이전트는 Discord와 상호작용하기 위한 다양한 도구 액션을 지원합니다: • 메시지 — 메시지 전송, 편집, 삭제, 고정/고정 해제, 검색 • 스레드 — 스레드 생성, 목록 조회, 스레드에 답글 • 리액션 — 메시지에 리액션, 리액션 목록 조회 • 관리 — 타임아웃, 추방, 차단(기본적으로 비활성화) • 서버 정보 — 멤버 정보, 역할 정보, 채널 정보, 이모지 목록 • 상태 — 봇 상태 설정(기본적으로 비활성화) 응답 태그를 사용하면 모델이 메시지 스레딩을 제어할 수 있습니다: • [[reply_to_current]] — 트리거 메시지에 대한 스레드 답글 • [[reply_to:<id>]] — 특정 메시지 ID에 대한 스레드 답글
슬래시 명령이 표시되려면 OAuth2 초대 URL에 'applications.commands' 스코프가 포함되어야 합니다.
관리 도구(타임아웃, 추방, 차단)와 역할 관리는 기본적으로 비활성화되어 있습니다. 필요한 경우 구성에서 명시적으로 활성화하세요.

미디어 및 파일 처리

OpenClaw는 Discord를 통한 미디어 파일 송수신을 지원합니다. 기본 최대 업로드 크기는 8MB입니다(mediaMaxMb로 구성 가능). 지원되는 작업: • 사용자로부터 이미지 및 파일 첨부 수신 • 응답에서 이미지, 문서 및 기타 파일 전송 • 리치 미리보기가 포함된 링크 임베드 서버 채널에서 미디어를 전송하려면 봇에 'Attach Files' 권한이 필요합니다.
Discord의 파일 크기 제한은 서버의 부스트 레벨에 따라 다릅니다. 부스트되지 않은 서버의 기본값은 8MB, Level 2는 50MB, Level 3은 100MB입니다.

PluralKit 통합

OpenClaw는 선택적으로 PluralKit 프록시 메시지 확인을 지원하여 봇이 PluralKit 시스템의 메시지를 올바르게 식별할 수 있습니다. 활성화하면 봇은 프록시된 메시지를 원래 PluralKit 멤버 ID로 확인합니다. 이는 PluralKit을 사용하여 시스템/복수 메시지 라우팅을 하는 커뮤니티에 유용합니다. 주요 세부사항: • 허용 목록에서 pk:<memberId> 접두사를 사용하여 PluralKit 멤버를 매칭합니다 • 멤버 이름은 표시 이름 또는 slug로도 매칭됩니다 • 조회는 PluralKit의 30분 창 내에서 원본 Discord 메시지 ID를 사용합니다 • 조회가 실패하면 프록시된 메시지는 봇 메시지로 처리됩니다(allowBots=true가 아닌 한 삭제)
openclaw.json
{
  "channels": {
    "discord": {
      "pluralkit": {
        "enabled": true,
        "token": "pk_live_..."
      }
    }
  }
}
비공개 PluralKit 시스템은 멤버를 확인하기 위해 pluralkit.token이 필요합니다. 토큰이 없으면 프록시된 메시지는 봇 메시지로 처리되어 삭제됩니다.
PluralKit 멤버를 정확하게 매칭하려면 허용 목록에서 pk:<memberId> 접두사를 사용하세요.

실행 승인 (버튼 UI)

Discord는 exec 작업에 대한 버튼 기반 승인 플로우를 지원합니다. 활성화하면 봇은 지정된 승인자에게 DM으로 인터랙티브 버튼(한 번 허용, 항상 허용, 거부)을 전송합니다. 이는 명령 기반 /approve 플로우를 더 사용자 친화적인 인터페이스로 대체합니다. 요구사항: • execApprovals.enabled가 true여야 합니다 • 승인자의 Discord 사용자 ID가 execApprovals.approvers에 나열되어야 합니다 • 선택적 agentFilter 및 sessionFilter 배열로 어떤 에이전트/세션이 승인을 트리거하는지 제한할 수 있습니다 참고: /approve <id> 명령은 전달된 승인에만 사용됩니다. Discord 버튼 UI는 직접 상호작용에 대해 명령 기반 승인보다 우선합니다.
openclaw.json
{
  "channels": {
    "discord": {
      "execApprovals": {
        "enabled": true,
        "approvers": ["USER_ID_1", "USER_ID_2"],
        "agentFilter": [],
        "sessionFilter": []
      }
    }
  }
}
승인 버튼이 나타나지 않거나 'unknown approval id' 오류가 표시되면 사용자 ID가 execApprovals.approvers에 나열되어 있는지, execApprovals.enabled가 true인지 확인하세요.

액션 게이트

OpenClaw는 에이전트가 수행할 수 있는 Discord 도구 액션에 대한 세밀한 제어를 제공합니다. 액션은 channels.discord.actions.<action>(true/false)을 통해 제어됩니다. 기본 활성화: • reactions, stickers, emojiUploads, stickerUploads, polls, permissions, messages, threads, pins, search, memberInfo, roleInfo, channelInfo, voiceStatus, events, channels 기본 비활성화: • roles — 역할 관리(역할 할당/제거) • moderation — 타임아웃, 추방, 차단 • presence — 봇 상태/활동 설정 특정 액션을 비활성화하여 봇의 기능을 줄이고 위험을 제한하세요. 예를 들어, channels.discord.actions.moderation=false로 설정하면 에이전트가 멤버를 추방하거나 차단할 수 없습니다.
최소 권한 원칙을 따르세요: 실제 사용 사례에 필요한 액션만 활성화하세요.
서버별 및 채널별 도구 재정의는 guilds.<id>.tools 및 guilds.<id>.channels.<id>.tools를 통해 더 세밀한 제어가 가능합니다.

허용 목록 확인 및 매칭

OpenClaw는 허용 목록에서 사용자와 채널을 지정하기 위한 여러 형식을 지원합니다: • 숫자 ID(권장) — 예: "123456789012345678" • Discord 사용자/채널 이름 — 예: "username", "#channel-name" • 멘션 — 예: "<@userId>", "<#channelId>" • 접두사 형식 — discord:, user:, channel:, pk:(PluralKit 멤버용) • 와일드카드 — "*"로 무제한 접근 시작 시 OpenClaw는 봇이 멤버를 검색할 수 있을 때(Server Members Intent 필요) 이름을 ID로 확인합니다. 매핑이 로그에 기록되며, 확인되지 않은 항목은 입력된 그대로 유지됩니다. 소유자 감지: 서버별 또는 채널별 사용자 허용 목록이 발신자와 일치하면 OpenClaw는 시스템 프롬프트에서 발신자를 소유자로 처리합니다. 전역 소유자는 commands.ownerAllowFrom으로 구성됩니다. 스레드 상속: 스레드는 스레드의 채널 ID로 명시적으로 나열되지 않는 한 부모 채널 구성(허용 목록, requireMention, skills, prompts)을 상속합니다.
신뢰성 있는 매칭을 위해 가능하면 숫자 ID를 사용하세요. 이름 기반 확인은 Server Members Intent가 필요하며 대규모 서버에서는 실패할 수 있습니다.
Slug 형식은 소문자이며 공백은 하이픈으로 대체됩니다(예: #my-help → slug my-help).
서버 채널 토픽은 컨텍스트로 주입되지만 시스템 프롬프트로는 주입되지 않습니다 — 신뢰할 수 없는 입력으로 취급하세요.

Discord 구성 참조

enabled
Type: booleanDefault: true

Discord 채널 활성화 또는 비활성화

token
Type: stringDefault: ""

Discord Bot Token. DISCORD_BOT_TOKEN 환경 변수를 사용할 수도 있습니다

dm.policy
Type: stringDefault: "pairing"

봇에게 DM을 보낼 수 있는 사용자를 제어합니다. 옵션: pairing, allowlist, open, disabled

dm.allowFrom
Type: string[]Default: []

봇에게 DM을 보낼 수 있는 Discord 사용자 ID(dm.policy가 allowlist일 때)

groupPolicy
Type: stringDefault: "allowlist"

서버 채널 처리 정책. 옵션: open, disabled, allowlist

guilds
Type: objectDefault: {}

서버 ID를 키로 하는 서버별 구성. slug, users, channels, requireMention 등 포함

requireMention
Type: booleanDefault: true

서버 채널에서 봇이 응답하려면 @멘션이 필요한지 여부

messages.ackReaction
Type: stringDefault: ""

처리 중 메시지 수신 확인으로 반응할 이모지

messages.removeAckAfterReply
Type: booleanDefault: false

AI가 응답한 후 수신 확인 리액션 제거

textChunkLimit
Type: numberDefault: 2000

메시지 청크당 최대 문자 수(Discord 제한은 2000)

chunkMode
Type: stringDefault: "length"

긴 응답 분할 방식. 옵션: length(문자 수 기준), newline(단락 경계 기준)

historyLimit
Type: numberDefault: 20

AI 컨텍스트에 포함할 최근 서버 메시지 수

mediaMaxMb
Type: numberDefault: 8

업로드 최대 미디어 파일 크기(메가바이트)

replyToMode
Type: stringDefault: "off"

답글 스레딩 모드. 옵션: off, first(첫 번째 청크만 스레드), all(모든 청크 스레드)

configWrites
Type: booleanDefault: true

Discord에서 /config set|unset 명령을 통한 구성 업데이트 허용

allowBots
Type: booleanDefault: false

다른 봇의 메시지를 처리할지 여부. 루프 방지를 위해 주의하여 사용

retry.attempts
Type: numberDefault: 3

실패한 Discord API 호출의 재시도 횟수

retry.minDelayMs
Type: numberDefault: 500

재시도 간 최소 지연 시간(밀리초)

retry.maxDelayMs
Type: numberDefault: 30000

재시도 간 최대 지연 시간(밀리초)

retry.jitter
Type: numberDefault: 0.1

재시도 지연에 적용되는 지터 팩터

dm.enabled
Type: booleanDefault: true

다이렉트 메시지 수신 여부

dm.groupEnabled
Type: booleanDefault: false

그룹 DM 처리 활성화

dm.groupChannels
Type: string[]Default: []

그룹 DM 채널 허용 목록

dmHistoryLimit
Type: numberDefault: -

사용자별 DM 기록 제한 재정의

maxLinesPerMessage
Type: numberDefault: 17

메시지 청크당 소프트 줄 수 제한

commands.native
Type: string | booleanDefault: "auto"

네이티브 슬래시 명령 등록. 옵션: auto(Discord에서 활성화), true, false

commands.text
Type: objectDefault: {}

독립 실행형 /... 메시지가 필요한 텍스트 명령 구성

commands.useAccessGroups
Type: booleanDefault: false

명령에 대한 접근 그룹 검사 시행 여부

actions.*
Type: booleanDefault: varies

도구 액션 게이트. 대부분 기본 활성화; roles, moderation, presence는 기본 비활성화

pluralkit.enabled
Type: booleanDefault: false

PluralKit 프록시 메시지 확인 활성화

Discord 자주 묻는 질문

Discord 문제 해결

봇이 연결되지만 메시지에 답장하지 않음

Message Content Intent가 활성화되지 않았거나, 봇에 채널 권한이 없거나, 멘션 요구 설정이 잘못되었습니다.

Discord Developer Portal(Bot → Privileged Gateway Intents)에서 Message Content Intent가 활성화되어 있는지 확인하세요. 봇에 View Channels, Send Messages, Read Message History 권한이 있는지 확인하세요. requireMention이 true로 설정되어 있고 봇이 @멘션되지 않고 있는지 확인하세요.
DM이 작동하지 않음

구성에서 DM 처리가 비활성화되었거나 페어링 승인이 보류 중입니다.

dm.policy가 'disabled'로 설정되어 있지 않은지 확인하세요. 페어링 모드를 사용하는 경우 'openclaw pairing list'로 보류 중인 페어링을 확인하고 'openclaw pairing approve discord <code>'를 통해 승인하세요. allowlist 모드를 사용하는 경우 사용자의 Discord ID가 dm.allowFrom에 있는지 확인하세요.
슬래시 명령이 Discord에 표시되지 않음

봇의 OAuth2 초대 URL에 'applications.commands' 스코프가 포함되지 않았습니다.

Developer Portal → OAuth2 → URL Generator로 이동하여 'bot'과 'applications.commands' 스코프가 모두 선택되어 있는지 확인하고 새 초대 URL을 생성한 후 서버에 봇을 다시 초대하세요. 슬래시 명령은 일반 메시지와 동일한 허용 목록으로 제어됩니다.
봇이 속도 제한되거나 멈춤

Discord API 속도 제한에 도달했거나 Gateway 연결 상태가 불안정합니다.

'openclaw gateway --force'로 Gateway를 재시작하세요. OpenClaw는 속도 제한(429 응답)에 대한 지수 백오프 재시도 로직이 내장되어 있습니다. 문제가 지속되면 channels.discord.retry 하위의 재시도 구성을 확인하세요.
requireMention이 false인데 봇이 여전히 응답하지 않음

groupPolicy가 기본적으로 'allowlist'이므로 봇은 명시적으로 구성된 서버/채널에서만 응답합니다.

groupPolicy를 'open'으로 설정하여 모든 채널에서 응답하게 하거나, guilds 구성에 특정 서버 및 채널 ID를 추가하세요. 서버 항목에 allow: true로 설정된 채널이 포함되어 있는지 확인하세요.
DM에서 실행 승인 버튼이 나타나지 않음

execApprovals가 활성화되지 않았거나 사용자의 Discord ID가 approvers 배열에 나열되지 않았습니다.

Discord 채널 구성에서 execApprovals.enabled를 true로 설정하세요. 사용자의 숫자 Discord ID를 execApprovals.approvers 배열에 추가하세요. 직접 Discord 승인에는 (/approve 명령이 아닌) 버튼 UI를 사용하세요.