Claude Code を、Discord のスレッドから使えるようにする OSS「C-lord」を作っています。手元のマシンで動く Claude Code に、スマホの Discord から仕事を頼めます。途中で質問が来たら Discord のボタンか文章で答え、結果もスレッドで受け取ります。
この記事では機能を並べるのではなく、小さなサンプルリポジトリを使って「依頼 → 質問・承認 → 修正 → 結果の確認」を一通りやった実画面をお見せします。あわせて、2つのスレッドを同時に動かしたときに作業場所がどう分かれるかも示します。最後に、困る点と向かない使い方もまとめます。
C-lord は claude-code-discord-bridge(@ebibibi さん作、MIT ライセンス)を土台にした派生プロジェクトです。Anthropic 公式のツールではありません1。
C-lord でできること・できないこと
仕組みはシンプルです。Discord の1スレッドが、Claude Code の1セッションに対応します。 各セッションは、C-lord を動かしているマシンの tmux の1ウィンドウで動きます2。
チャンネルを Git リポジトリに紐づけておくと(/clord-init)、スレッドごとにそのリポジトリを別々に git clone して、その中で作業します。ですので、あるスレッドのコミット前の変更が、別のスレッドの作業ツリーに混ざることはありません3。
スレッドA(機能追加) ──→ Claude Code(自分の clone) ─┐
スレッドB(README 修正)──→ Claude Code(自分の clone) ─┴─→ Git のリモート(ブランチ・PR)
一方で、できないこともはっきりさせておきます。
- セッション同士は協調しません。 「並行して作業している」ことを Claude に知らせる仕組みは作られておらず、セッション同士の連絡用の機能(コーディネーション用チャンネル、AI Lounge)も既定では使われていません4
- clone の外にあるものは共有されます。 同じリモートブランチ、同じポート番号、同じデータベースなどは、スレッド同士でぶつかり得ます。README でも「スレッドごとに別のブランチを使う」ことが勧められています4
- 手元のマシンが動いている必要があります。 Claude Code が走るのは C-lord を動かしているマシン上です。Discord はあくまで窓口です
つまり「AI が勝手に分担して開発してくれる会社」ではなく、Claude Code の窓をスレッドの数だけ開けて、スマホからも操作できるようにしたものと考えるのが実態に近いです。
デモ: サンプルリポジトリで一往復する
撮影環境
以下のスクリーンショットは、すべて実際の画面です。
| 項目 | 内容 |
|---|---|
| C-lord |
main の e1ae9ba(2026-10-14) |
| Claude Code | 2.1.305、モデルは sonnet
|
| ホスト | Linux(WSL2) |
| Discord | 検証用の bot とチャンネル。Web 版クライアントで撮影 |
撮影の都合で、人の書き込みの代わりに別の bot(画面上の「C-lord」)から依頼と返事を投稿しています。普段は自分のアカウントで書き込みます。また、最初の依頼は REST API でスレッドを立てているため、依頼文の投稿者が bot 自身(C-lord-staging-2)になっています。サイドバーなど関係のない部分は切り抜いています。
サンプルリポジトリ
税抜の小計を計算する関数が1つあるだけの Python リポジトリを用意しました。真似する場合は、自分の GitHub に次の4ファイルでリポジトリを作ってください(__init__.py は空です)。
shop/__init__.py
shop/price.py
tests/__init__.py
tests/test_price.py
def subtotal(items):
"""items: [(単価, 個数), ...] の合計金額(税抜, 円)を返す。"""
return sum(price * qty for price, qty in items)
import unittest
from shop.price import subtotal
class SubtotalTest(unittest.TestCase):
def test_subtotal(self):
self.assertEqual(subtotal([(100, 2), (250, 1)]), 450)
def test_empty(self):
self.assertEqual(subtotal([]), 0)
if __name__ == "__main__":
unittest.main()
チャンネルをこのリポジトリに紐づけておきます(手順は後述の「導入」を参照してください)。
/clord-init repo:https://github.com/<あなた>/<リポジトリ>.git
1. 依頼する
チャンネルで /clord に続けて依頼を書くと、新しいスレッドが立って Claude Code が動き始めます5。今回はこう頼みました。
shop/price.py に税込金額を返す関数を追加してください(税率10%)。端数の扱いは実装前に選択肢で私に聞いてください。実装したらテストを足して
python3 -m unittestを実行し、ブランチ feature/tax を切ってコミットまでしてください(push はまだしない)。最後に作業ディレクトリ(pwd)とブランチ名を報告してください。
2. 質問に答える
依頼から20秒ほどで、Claude から「端数処理はどうしますか?」という質問が届きました。Claude Code の AskUserQuestion(選択肢つきの質問)は、Discord ではボタンとして表示されます6。ボタンを押しても、スレッドに文章を書いても答えられます。今回は「切り捨てでお願いします」と書いて答えました。
文章で答えると、C-lord は「質問への回答として送りました」と知らせてくれます。質問が開いているあいだに書いた文章は、回答として扱われます。新しい指示のつもりだった場合は「これは新しい指示でした」ボタンで送り直せます7。
回答のあと、Claude は実装してテストを走らせ、コミットまで進めて報告してきました。
作業ディレクトリの末尾の数字は、このスレッドの ID です。
3. 修正を頼み、PR を作ってもらう
同じスレッドに続けて書けば、同じ Claude Code セッションの続きとして扱われます2。
税率を引数で変えられるようにしてください(既定は10%)。軽減税率8%のテストも足してください。終わったら push して PR を作り、URL を教えてください。
返事の下には、Claude が実行したコマンドの一部と、途中経過をまとめた progress.txt が付きます。ターン中に出ていた途中経過は、ターンが終わると1つのファイルに畳まれます8。
4. 承認する
マージのような取り返しにくい操作は、確認してから進めてほしいところです。「マージしてよいか選択肢で確認して」と頼むと、ボタンつきの質問が届きました。
この質問が出ているあいだ、Claude は回答を待って止まっています。質問が出ると、そのターンを頼んだ人に @メンションが飛ぶので、スマホにも通知が届きます9。ボタンを押すだけで先に進められます。今回は「まだマージしないでください」と答え、PR は開いたままにしました。
ほかにも、Claude Code がプランの承認やツール実行の許可を求めたときには、承認・拒否のボタンが出ます。ただし、プランの承認は5分、ツールの許可は2分で応答がないと自動でキャンセル・拒否になります10。どのツールで許可を求められるかは、Claude Code のパーミッションモードと許可ルールの設定で決まります。C-lord の既定は acceptEdits です11。今回のデモでは、ツール実行の許可を求める画面は出ませんでした。
5. 結果を確かめる
報告をうのみにせず、自分でも確かめておきます。今回はホスト側で、PR とスレッドの作業ディレクトリを見ました。
$ gh pr view 1 -R yousan/clord-demo-shop --json title,headRefName,files --jq '{title, headRefName, files: [.files[].path]}'
{"files":["shop/price.py","tests/test_price.py"],"headRefName":"feature/tax","title":"feat: 税込金額を返す with_tax を追加"}
デモ用のリポジトリは非公開なので、上の PR の URL は読者の方には開けません。
スマホだけで確かめたい場合は、Claude に PR の URL を出してもらい、GitHub のアプリやブラウザで差分を見るのが手軽です。
2つのスレッドで、作業場所が分かれる
上のスレッドA(税込計算)を立てたのと同時に、もう1本スレッドBを立てていました。
README.md にテストの実行方法を追記してください。ブランチ docs/readme を切ってコミットまでしてください(push はまだしない)。最後に作業ディレクトリ(pwd)とブランチ名を報告してください。
2つのスレッドの報告を並べると、こうなります。
| スレッドA(税込計算) | スレッドB(README) | |
|---|---|---|
| 作業ディレクトリ | …/1514535894575743056/1562267182170120232 |
…/1514535894575743056/1562267186024685690 |
| ブランチ | feature/tax |
docs/readme |
| tmux ウィンドウ | w3 |
w4 |
ディレクトリは <セッション置き場>/<チャンネルID>/<スレッドID>/ という形で、スレッドごとに別の clone になっています12。ホスト側でも git branch --show-current を確かめ、それぞれのディレクトリが別のブランチにいることを確認しました。
ここで分かれているのは作業ツリーだけです。両方のスレッドが同じブランチ名を使ったり、同じポートで開発サーバーを立てたりすると、ぶつかります。今回のデモでは、依頼文でブランチ名を別々に指定しました。
必要なもの・契約・費用
混同しやすいので、分けて書きます。
| 何が要るか | 内容 | 費用の考え方 |
|---|---|---|
| Claude Code の利用資格 | Pro / Max / Team / Enterprise のいずれかのプラン、または Claude Console のアカウント。無料プランでは使えません13 | プランは定額、Console は API の従量課金です14 |
| Discord | アカウントと、bot を入れられる(サーバー管理の権限がある)サーバー | C-lord 側で追加の契約はありません |
| 動かすマシン | Python 3.10 以上、Git、tmux、uv、ログイン済みの Claude Code CLI15 | 自前の PC やサーバー。止めると Claude も止まります |
| C-lord | MIT ライセンスの OSS | 無料 |
今回のデモで、Claude Code が表示した概算コストは、スレッドAが 0.17 ドル、スレッドBが 0.15 ドルでした(Sonnet、各スレッドの最後の表示)。これは定価での概算です。Pro / Max のサブスクリプションでは利用分がプランに含まれるため、この数字がそのまま請求されるわけではありません14。
OpenClaw は不要です。 筆者は OpenClaw という別のエージェントからも C-lord に仕事を頼んでいますが、それは個人的な使い方です。C-lord 単体で動きます。
OS について。 筆者が日常的に動かしているのは Linux(WSL2)です。macOS は CI でテストを走らせていますが、実機で最初から最後まで動かした確認はまだ取れていません16。
導入の流れ
README の Quick Start に沿った最短の流れです17。この記事のデモは既存の検証用 bot で撮影しており、導入をゼロからやり直して時間を測ってはいません。
1. Discord の bot を作る
- Discord Developer Portal で New Application を作る
- Bot の画面で、Privileged Gateway Intents の Message Content Intent を有効にする(Gateway Intents の説明)
- bot の Token をコピーする。これはパスワードと同じ扱いです。人に見せたり、リポジトリにコミットしたりしないでください
-
OAuth2 → URL Generator で、Scopes に
botとapplications.commandsを選び、権限に「Send Messages」「Create Public Threads」「Send Messages in Threads」「Add Reactions」「Manage Messages」「Read Message History」を付ける - 生成された URL を開いて、bot を自分のサーバーに招待する
非公開チャンネルで使う場合は、チャンネル側の権限設定で bot のロールに「チャンネルを見る」などを別途許可する必要があります18。
2. マシンに入れて起動する
先に Claude Code をインストールし、一度 claude を起動してログインしておきます。そのうえで:
git clone https://github.com/yousan/c-lord.git
cd c-lord
uv run c-lord setup # 対話式。token・チャンネル・作業ディレクトリ・モデルを聞かれ、.env を書く
uv run c-lord start # 起動(Ctrl-C で停止)
c-lord setup は token を Discord の API で検証し、チャンネルを一覧から番号で選ばせてくれます17。設定は .env に保存されます。設定できる環境変数は README の Configuration にまとまっています。
常駐させたい Linux では、bash scripts/install-systemd.sh で systemd の user サービスとして登録できます19。
3. チャンネルとリポジトリを紐づけて、頼む
Discord のチャンネルで:
/clord-init repo:https://github.com/<あなた>/<リポジトリ>.git
/clord shop/price.py に税込金額を返す関数を追加してください
/clord-init を使うには、Discord の「サーバー管理」権限が要ります20。2つ目以降のスレッドも /clord で立てます。チャンネルに直接書いただけではスレッドは立ちません(意図しないセッションを防ぐため、チャンネル直下の書き込みは無視されます)21。
誰が使えるか
bot に話しかけることは、そのマシンでシェルコマンドを実行できることと同じです。そのため、何も設定しないと、Discord のアプリケーションの所有者だけが使えます。使える人を増やすときは DISCORD_OWNER_ID や CLORD_ALLOWED_ROLE で指定します。サーバーの全員に開放する CLORD_ALLOW_ANYONE=1 もありますが、意味を理解したうえで使ってください22。
困る点・向かない使い方
困る点
- セッション同士は相談しません。 同じファイルを2つのスレッドで直すと、PR の段階で衝突します。分担は人が決めます
- 質問中に書いた文章は回答として扱われます。 デモの最中、質問が開いていると気づかずに次の指示を書いたら、回答として送られました。「これは新しい指示でした」ボタンで送り直せますが、慣れるまでは戸惑います7
- 承認には時間制限があります。 プランの承認は5分、ツールの許可は2分で自動的にキャンセル・拒否されます10。通知に気づかないと、そこで止まります
- ホストが止まると止まります。 C-lord が再起動したときは、中断したセッションを自動で再開する仕組みがありますが23、マシンが落ちたままなら何も進みません
- 30日触らなかったスレッドは、セッションとの紐づけが消えます。 clone 自体は消えませんが、Claude Code 側の会話履歴も既定で30日で消えるため、同じ文脈では再開できないことがあります24
向かない使い方
- 不特定多数がいるサーバーで使わせる。 上に書いたとおり、bot への書き込みはホスト上でのコマンド実行につながります
- 頼んで放っておけば必ず完成する、という期待。 質問や承認待ちで止まることがありますし、Claude の作業が失敗することもあります。結果は自分で確認する前提です
- セッション同士に自動で分担させたい。 その仕組みは今の C-lord にはありません4
GitHub
- リポジトリ: https://github.com/yousan/c-lord
- 日本語の利用者ガイド: docs/ja/USER_GUIDE.md
- コマンド一覧: docs/ja/COMMANDS.md
- 不具合や要望: Issues
日本語の README(docs/ja/README.md)は英語版より更新が遅れている箇所があります。仕様は英語版の README を正としてください。
まとめ
- C-lord は、Discord の1スレッドを Claude Code の1セッションにつなぐ OSS です。スマホから依頼し、質問や承認にもボタンか文章で答えられます
- チャンネルをリポジトリに紐づけると、スレッドごとに別の
git cloneで作業します。デモでも、2つのスレッドが別ディレクトリ・別ブランチで動いていることを確認しました - 分かれるのは作業ツリーだけです。ブランチ・ポート・DB などは衝突し得るので、スレッドごとに分けてください。セッション同士の自動協調もありません
- 必要なのは Claude Code を使える契約、Discord の bot、Claude Code が動く常時稼働のマシンです。C-lord 自体は MIT ライセンスです
参考リンク
- C-lord(GitHub)
- C-lord: README
- C-lord: 利用者ガイド(日本語)
- C-lord: コマンドリファレンス(日本語)
- claude-code-discord-bridge(C-lord の土台)
- Claude Code overview
- Claude Code: Set up Claude Code
- Claude Code: Authentication
- Claude Code: Manage costs effectively
- Claude Code: Configure permissions
- Discord Developer Portal
- Discord: Gateway(Privileged Intents)
- uv
- tmux
-
出典: C-lord README 冒頭。「This project is not affiliated with, endorsed by, or officially connected to Anthropic.」 ↩
-
出典: C-lord README: The Big Idea。「Each Discord thread is its own Claude Code session, running in its own tmux window on your server.」「reply in a thread to pick up where it left off.」 ↩ ↩2
-
出典: 同上。「when a channel is bound to a repository (
/clord-init), every thread works in its own independentgit clone. Sessions never share a working tree」 ↩ -
出典: 同上。「Sessions do not coordinate with each other today.」の表(Concurrency notice は Not built、Coordination channel は Off by default、AI Lounge は nothing tells Claude the lounge exists)と、「Anything outside the clones — the same remote branch, a shared port or database, a staging bot — can still collide. Give each thread its own branch.」(C-lord
e1ae9baで確認) ↩ ↩2 ↩3 -
出典: C-lord: コマンドリファレンス。「
/clordは新しいスレッドを作成し、プロンプトを Claude Code に送信します。」 ↩ -
出典: C-lord README: Human-in-the-Loop。「
AskUserQuestionrenders as Discord Buttons or Select Menu; session resumes with your answer」 ↩ -
出典: C-lord: 質問メニューの一生(docs/specs/ask-menu-lifecycle.md)。「ボタンを押さずにスレッドに文章を書いて答えてもよい」。「これは新しい指示でした」ボタンは、デモの実画面で確認しました。 ↩ ↩2
-
出典: C-lord: 利用者ガイド「進捗の畳み込み (
progress.txt)」。「ターン終了時に 1 つのprogress.txtにまとめ、元の embed は削除します。」 ↩ -
出典: C-lord: 利用者ガイド「入力待ちの @メンション通知」。「これらのプロンプトが表示されるとき、そのターンを投稿した本人を
@メンションするメッセージが同時に送られるため、スレッドの通知設定が「@メンションのみ」でも push 通知が届きます」 ↩ -
出典: C-lord README: Human-in-the-Loop。Plan Mode は「auto-cancel on 5-minute timeout」、Tool permission requests は「auto-deny after 2 minutes」。 ↩ ↩2
-
出典: C-lord README: Configuration。
CLAUDE_PERMISSION_MODEの既定値はacceptEdits。acceptEditsの意味は Claude Code: Permission modes を参照してください。 ↩ -
出典: C-lord: 利用者ガイド「各要素の関係」。「Thread : session_dir | 1:1 |
~/c-lord-sessions/{channel_id}/{thread_id}/」。置き場所の親ディレクトリは.envのSESSION_DIR_BASEで変えられます(デモ環境ではc-lord-sessions-staging-2)。 ↩ -
出典: Claude Code: Set up Claude Code。「Claude Code requires a Pro, Max, Team, Enterprise, or Console account. The free claude.ai plan does not include Claude Code access.」Amazon Bedrock などのクラウド経由で使う方法もあります。 ↩
-
出典: Claude Code: Manage costs effectively。「Claude Max and Pro subscribers have usage included in their subscription, so the session cost figure isn't relevant for billing purposes.」プランの料金は claude.com/pricing を参照してください。 ↩ ↩2
-
出典: C-lord: 日本語 README「必要条件」(Python 3.10+、Claude Code CLI のインストールと認証、Message Content Intent が有効な bot トークン、uv)。tmux は、セッションが tmux のウィンドウで動くため必要です(README: How Discord maps to tmux)。 ↩
-
出典: C-lord: docs/macos.md。「Status: not yet confirmed on a real Mac. The code paths below are covered by the
test-macosCI job (#899), but nobody has run a bot end to end on macOS yet.」(2026-10-21 時点) ↩ -
出典: C-lord README: Quick Start。Step 1(Discord bot の作成)と Step 2(
c-lord setupのウィザード)。 ↩ ↩2 -
出典: C-lord README: Discord Bot Setup。「if a channel denies View Channel to
@everyone(a private channel), the server-wide invite above is not enough」 ↩ -
出典: C-lord: コマンドリファレンス「チャンネル設定」。「サーバー管理権限が必要です。」 ↩
-
出典: C-lord のソース
c_lord/cogs/claude_chat.pyのon_message。「Channel direct messages are ignored — thread creation is limited to slash commands (/skill) and API (spawn_session) to prevent accidental sessions.」(README の Start / Stop 節には「チャンネルに書けば新しいスレッドで返事が来る」とありますが、e1ae9ba時点のコードでは上記のとおりです) ↩ -
出典: C-lord README: Security。「With neither configured, only the Discord application's own owner may use the bot — talking to c-lord runs shell commands on its host, so "not configured" is not "everyone"」 ↩
-
出典: C-lord README: Startup Resume。「If the bot restarts mid-session, interrupted Claude sessions are automatically resumed when the bot comes back online.」 ↩
-
出典: C-lord README: Session Management。「session records untouched for 30 days are deleted」「The git clone is not deleted」「Claude Code separately expires its own transcripts on the same 30-day default (
cleanupPeriodDays)」 ↩




