Claude Code · Discord · MCP · AI Agent · Windows
專案概述
官方 Discord channel plugin 把 Discord gateway 綁在一條 MCP stdio pipe 上,終端機一關 pipe 就斷,所以 bot 只在 Claude Code 開著的時候上線。這個專案讓bot.ts 以獨立的長駐行程自己持有 gateway 連線:每則允許清單內使用者的 DM,都會 spawn 一個全新的 headless claude -p,載入完整的全域設定(MCP servers、plugins、CLAUDE.md),再由該行程把回覆貼回 Discord。Windows 登入時自動啟動的排程任務負責讓它撐過關終端、崩潰與重開機。
同時以 npm 套件(bunx claude-discord-daemon / cdd)與 Claude Code plugin(/claude-discord-daemon:discord 指令)兩種形式散布,授權為 MIT。
核心功能
- 即時具名工具狀態卡:執行中以單一 embed 就地更新,指出當下在跑的工具、skill、MCP、子代理或指令(例如
MCP matlab·evaluate、Bash、agent code-reviewer、skill xlsx、/commit),而不是籠統的「思考中」 - 回覆覆蓋狀態卡:成功時狀態卡直接改寫成最終回覆,末尾附一行 Discord
-#淡色腳註(耗時與各類工具的次數),聊天室只留一則訊息;附件、長文或多段回覆改以新訊息送出(就地編輯無法附檔),此時狀態卡只剩腳註 - Rich 輸出指令,每個指令在回覆中獨佔一行:
[[embed: {json}]]渲染彩色 embed 卡,JSON 可跨多行[[file: /絕對路徑]]附上產出檔,送出前先驗證存在性與大小- 末行
[[buttons: A | B]]渲染 2-5 顆 Discord 選擇按鈕,點按的標籤文字會作為下一則訊息回饋進同一個 session
- 附件下載:使用者上傳的附件(≤ 50 MB)下載到共用 inbox,本機路徑附進 prompt,供
claude用Read讀取 - 權限中繼:headless run 的權限提示轉成 Discord 上的核准 / 拒絕按鈕卡,由擁有者點選決定,不需要回終端機批准
- idle-watchdog:預設沒有總時長上限,只有事件 stream 靜默超過
BOT_IDLE_TIMEOUT_MS(行程卡死)才會砍掉,跑得久不會被誤殺 - 自然語言開新對話:整則訊息剛好是少數幾個重置語之一,就清掉已存 session,下一則訊息重新開始
- per-chat session 續接:每個聊天的 session UUID 存在
sessions.json,後續訊息以--resume續接 - 24/7 常駐:登入時自動啟動的排程任務、detached 啟動、崩潰即重啟、單例 loopback 鎖,撐過關終端、崩潰、重開機
- 可攜:沒有硬編碼路徑,工作目錄預設為引擎所在目錄,每個路徑都能用環境變數覆寫
專案架構
常駐的啟動鏈是:登入任務ClaudeDiscordBridge → wscript launch.vbs(detached)→ supervise.cmd 迴圈 → bun bot.ts。
橋接自帶 discord.js gateway,而不走官方 channel engine,原因在 Anthropic 把未核准的自訂 channel 擋在 --dangerously-load-development-channels 後面,該旗標會跳出啟動確認對話框;headless daemon 沒有 TTY 可以回應,會直接卡住。由 bot.ts 自己持有 gateway,就不需要這個旗標,也不需要互動確認,能以服務形式無人值守地執行。
專案檔案:
claude-discord-daemon
bot.ts · Discord gateway 長駐行程(橋接引擎)
perm-mcp.ts · 權限中繼 MCP
cli.ts · cdd / claude-discord-daemon CLI
launch.vbs · 以 detached 方式啟動 supervisor
supervise.cmd · 崩潰即重啟
install-service.ps1 · 註冊登入時自動啟動的排程任務
.env.example · 環境變數範本
commands
skills
.claude-plugin
videos
技術棧
- 執行環境:Bun ≥ 1.1.0,TypeScript
- Discord:discord.js v14
- 權限中繼:
perm-mcp.ts,使用 MCP SDK(@modelcontextprotocol/sdk) - 常駐:Windows 登入時自動啟動的排程任務、
launch.vbs、supervise.cmd - 散布:npm 套件與 Claude Code plugin
快速開始
1
寫入 bot token
啟動前,先把 bot token 與允許清單放進 bridge 的 state 目錄(預設 也可以直接在 process 環境設
~/.claude/channels/discord/,可用 DISCORD_STATE_DIR 覆寫)。token 寫入 ~/.claude/channels/discord/.env:DISCORD_BOT_TOKEN,真實環境變數優先於 .env 檔。2
設定允許清單
建立 只有
~/.claude/channels/discord/access.json,把你的 Discord 使用者 ID 加進 allowFrom:allowFrom 內的使用者 ID 發的 DM 會被處理,其餘一律忽略(fail-closed)。此檔每則訊息重讀,改允許清單免重啟。3
安裝並啟動(二選一)
作為 npm 套件:作為 Claude Code plugin:Claude Code 會為 plugin 指令加上plugin 名前綴,所以實際指令是 它底層呼叫同一組
/claude-discord-daemon:discord,用它驅動同一個 daemon:cdd CLI,cdd 不在 PATH 時退回 bunx claude-discord-daemon。4
邀請 bot 並直接 DM
把 bot 邀請進任一你也在的 Discord 伺服器,然後直接 DM 這個 bot。
5
管理 daemon
claude-discord-daemon 與 cdd,兩者相同。設定參考
access.json 的額外選用鍵,沿用官方 plugin 的語意:
環境變數除
DISCORD_BOT_TOKEN 外皆為選用,在 process 環境設定即可覆寫預設:
開新對話:傳一則整則訊息剛好是下列任一者(不分大小寫)的訊息,就會清掉已存 session,下一則訊息開啟全新的
claude -p session:
來開新對話討論 X 這種夾帶提及不會重置。重置時 bot 會以表情回應並確認。
注意事項
實際應用面
適合想讓 Claude Code 在 Discord DM 裡隨時待命、又不想一直開著終端機的情境:預設下長時間作業不會因為跑得久被砍,只有 stream 靜默才算卡死;需要核准的操作在聊天裡按按鈕即可;也能收附件、回傳產出檔。限制是只支援 Windows 11,且只有允許清單內的使用者能觸發 run。相關連結
- GitHub:felimet/claude-discord-daemon
- Bun:bun.sh