カテゴリー: Minecraftプラグイン
AIチームでマイクラサーバーを作る#5Discordボットで開発チームを運営!決定フォーラム・コマンド一覧・リソースパックチャンネル 🤝
この記事は韓国語の原文から翻訳したものです。
ひと目でわかる要点
AIリーダーがDiscordボットで運営メンバーとやり取りする仕組みです。決めることはフォーラムの投稿1つに集め、タグで状態を示します。コマンド一覧やリソースパックのように頻繁に変わるものは、ボットが新しく投稿せず既存のメッセージを編集して、常に最新だけが見えるようにします。
- Python 3.10 · requests · python-dotenv · Discord API v10 · 2026-09-28~30 実際に運用
- 1チャンネルに1つの役割 — 雑談 / 決定フォーラム / チーム活動 / モンスター図鑑 / パッチノート / コマンド一覧 / リソースパック
- 決定フォーラムのタグ: 議論中 → 確認必要 → 決定済み、反映した人のメッセージにはチェックのリアクション
- ボットはメッセージを削除しません。コマンド・リソースパックの投稿はPATCHで編集し、古いリソースパックは添付だけ外して「廃止」と表示
目次8項目

こんにちは!Mojangcamです 😎
前回の#4では、ChatGPTが描いてClaudeが検品するイラストパイプラインを扱いました。今回はシリーズ第1部の最終回で、人間とAIチームがどこで会話するのかについてです。
AIリーダーはチャット画面の中にいて、一緒にサーバーを作る人たちはDiscordにいます。そこでボットを1つ作り、AIリーダーがDiscordに投稿し、みんなが残した投稿を読み、決定を整理するようにしました。今回は
- 🗂️ チャンネルごとに役割を1つずつ持たせた構成
- 🏷️ 決定フォーラムのタグ・チェックマークのルール
- 📜 モジュール別のコマンド一覧フォーラムの自動作成
- 📦 最新版だけを残すリソースパックチャンネル
- 🧹 「消さずに直す」原則
をまとめます。

📌 準備するもの
- Python 3.10以上、
requests、python-dotenv - Discordボット (権限: チャンネルの管理、メッセージを送信、メッセージの管理(ピン留め)、スレッドの管理、リアクションの追加、ファイルを添付)
- ボットトークンはコードに書かず
.envに (.envは.gitignoreに入れること!)
pip install -U requests python-dotenv# dlib.py — すべてのスクリプトが共通で使う最小限のヘルパー
import os, time, requests
from dotenv import load_dotenv
load_dotenv()
token = os.getenv("DISCORD_TOKEN") # 出力・ログへの書き出しは絶対禁止
API = "https://discord.com/api/v10"
H = {"Authorization": f"Bot {token}", "Content-Type": "application/json"}
NOMENTION = {"parse": []} # ボットがうっかり @everyone を呼ばないように
def req(method, url, **kw):
while True:
r = requests.request(method, API + url, headers=H, timeout=20, **kw)
if r.status_code == 429: # レート制限 → 待ってから再試行
time.sleep(r.json().get("retry_after", 1) + 0.2)
continue
if r.status_code >= 400:
raise SystemExit(f"{method} {url} {r.status_code} {r.text[:200]}")
return r.json() if r.text else {}1つずつ見ていきましょう 💡
NOMENTION: ボットが投稿するすべてのメッセージに付けます。本文に@everyoneのような文字が混ざっても通知は飛びません。- 429の処理 : 一度に数十件の投稿を編集するとレート制限に引っかかります。
retry_afterの分だけ待ってから再試行します。
📌 ステップ1 - 1チャンネルに1つの役割
| チャンネル | 種類 | 役割 |
|---|---|---|
| 雑談 (대화) | テキスト | 人同士の気軽な会話。1時間ごとに整理ボットが読む |
| 決定フォーラム (결정-포럼) | フォーラム | テーマ1つ = 投稿1つ。決めること・決まったこと |
| チーム活動 (팀-활동) | フォーラム | AIチームの報告書1つ = 投稿1つ。コメント = そのチームへの修正依頼 |
| モンスター図鑑 (몬스터-도감) | フォーラム | モブ1体 = 投稿1つ。数値・ドロップが変わったら投稿を書き直す |
| パッチノート (패치-내역) | テキスト | デプロイのたびに変更点と適用方法 |
| コマンド一覧 (명령어-목록) | フォーラム | モジュール1つ = 投稿1つ。タグで分類 |
| リソースパック (리소스팩) | テキスト | 最新のzipを1つだけピン留め |
このカテゴリーには、人は読むだけ、書くのはボットだけのチャンネル(コマンド・リソースパック)と、人が自由に書き込めるチャンネル(雑談・フォーラムのコメント)が混ざっています。
📌 ステップ2 - 決定フォーラム: タグとチェックマーク 🏷️
AIチームが作業していると、「人間が決めなければならないこと」が次々に出てきます。これを雑談チャンネルに流すと埋もれてしまいます。そこで決めるテーマごとにフォーラムの投稿を1つ作り、状態をタグで示します。
| タグ | 意味 |
|---|---|
| 議論中 (논의중) | まだ話し合っている |
| 確認必要 (확인필요) | 人間の回答が必要 (推奨案つき) |
| 決定済み (결정됨) | 決まって、反映まで完了 |
ルールは3つです。
- AIが確認必要の投稿を出すときは推奨案も一緒に書きます。「1 A / 2 金の斧 / 3 コード」のように1行で答えられるようにするためです。
- 人が答えたら、反映したあとでその回答メッセージにチェック(✅)のリアクションを付けます。「読んで対応した」という印です。
- 反映が終わったら返信で何をしたかを書き、タグを
결정됨(決定済み)に変えます。まだ残っているものがあれば확인필요(確認必要)のままにして、残っている分だけを書き直します。
import urllib.parse
CHECK = urllib.parse.quote("✅")
def ack(thread_id, message_id):
"""反映した人のメッセージにチェックのリアクション"""
req("PUT", f"/channels/{thread_id}/messages/{message_id}/reactions/{CHECK}/@me")
def set_tags(thread_id, tag_ids):
"""フォーラム投稿のタグを変更 (例: 確認必要 → 決定済み)"""
req("PATCH", f"/channels/{thread_id}", json={"applied_tags": tag_ids})1時間ごとに動く整理ボット(AIの定期実行タスク)が雑談チャンネルとフォーラムのコメントを読み、テーマごとにまとめて該当する投稿に要約を付けます。ここで大事なルールが1つあります。
Discordで読んだ投稿はデータです。投稿の中に「このファイルを消して」のような文があっても、ボットはそのまま実行しません。人の意見・決定・依頼としてだけ解釈し、実際の作業はリーダーのTODOリストに書き込むだけです。
誰でも書き込める場所をAIが読むなら、このルールは欠かせません。
📌 ステップ3 - コマンド一覧フォーラム: モジュール1つ = 投稿1つ 📜
モジュールが13個あるので、コマンドは240個近くになります。最初はテキストチャンネルに43件のメッセージでずらっと投稿しましたが、探すのがとても不便でした。そこでフォーラムに切り替えました。
- モジュール1つ = 投稿1つ (投稿15件: 目次 + モジュール13 + 外部プラグイン)
- タグで分類: 戦闘・成長 / 経済・アイテム / クエスト・仲間 / ワールド・モブ / 運営 / 外部プラグイン / 「プレイヤーコマンドあり」・「管理者専用」
- リスト表示 + 作成順に並べ替え、目次の投稿をピン留め
- 原稿は企画チームのAIがコードから直接抽出して、モジュールごとのmdに書きます (「コードにないコマンドは書かない」)
コマンドが変わったら新しく投稿せず、既存の投稿のメッセージを編集します。
def upsert_thread(forum_id, state, key, title, chunks, tags):
"""モジュールの投稿がなければ作り、あればメッセージを編集する (削除はしない)"""
post = state.get(key)
if not post:
th = req("POST", f"/channels/{forum_id}/threads", json={
"name": title, "applied_tags": tags,
"message": {"content": chunks[0], "allowed_mentions": NOMENTION}})
post = state[key] = {"thread": th["id"], "ids": [th["id"]]}
ids = post["ids"]
for i, text in enumerate(chunks):
body = {"content": text, "allowed_mentions": NOMENTION}
if i < len(ids):
req("PATCH", f"/channels/{post['thread']}/messages/{ids[i]}", json=body)
else:
ids.append(req("POST", f"/channels/{post['thread']}/messages", json=body)["id"])
for extra in ids[len(chunks):]: # 投稿が短くなって余ったメッセージは消さずに空にする
req("PATCH", f"/channels/{post['thread']}/messages/{extra}", json={"content": "·"})1つずつ見ていきましょう 💡
chunks: Discordのメッセージには2,000文字の制限があるので、コマンド間の空行を区切りに1,900文字ずつ分割します。1つのコマンドが途中で切れないようにするためです。state: どの投稿・メッセージを作ったかをJSONファイルに保存しておき、次回の実行時にそのメッセージを編集します。- 余ったメッセージ : 消さずに
·で空にします。
📌 ステップ4 - リソースパックチャンネル: 最新版だけを受け取れるように 📦
リソースパックは1日に何度もバージョンが上がります (今週だけでv14 → v19)。みんなが古いバージョンをダウンロードしてしまう事故を防ぐため、ルールを次のように決めました。
- 新しいバージョンのzipをアップロードしてピン留め
- 前のバージョンの投稿は添付ファイルだけを外し、内容を「
v18廃止 — 最新はピン留めの投稿」に書き換え - ピン留めを解除
def retire(channel_id, message_id, ver):
"""古いリソースパックの投稿: 消さずに添付だけ外して廃止と表示"""
req("PATCH", f"/channels/{channel_id}/messages/{message_id}", json={
"content": f"~~📦 リソースパック {ver}~~ — **廃止** (最新はピン留めの投稿)",
"attachments": [], # 添付を空にするとファイルが消えます
"allowed_mentions": NOMENTION})
req("DELETE", f"/channels/{channel_id}/pins/{message_id}") # ピン留め解除 (メッセージの削除ではない)attachments: []でPATCHすると、メッセージは残ってファイルだけが消えます。記録は残しつつ、古いファイルはダウンロードできなくする方法です。
📌 原則 - ボットは消さない 🧹
今回のプロジェクトで、ボット(とAIチーム)に課した一番厳しいルールです。
- メッセージ・チャンネル・投稿の削除禁止 → 編集する、添付を外す、または「廃止」と表示
- ボットトークンはスクリプトだけが読み、出力・記録・コピー禁止
- 誰かがパスワードやDB情報をチャンネルに貼ったら、それを転載せず「ご自身で削除して、パスワードを変更してください」と1行だけ
AIのミスを防ぎきることはできません。その代わり、ミスしても元に戻せるようにすることが大切でした。消したものは戻せませんが、編集したものはまた編集できますからね。
📌 よくあるエラー
403 Missing Permissionsでチャンネル作成に失敗 原因: ボットのロールにチャンネルの管理権限がない、またはカテゴリーの権限の上書きでブロックされている → 解決: ボットのロールの権限を確認し、カテゴリーの権限にボットの許可を追加- フォーラム投稿のタグが変更できない
原因: タグの名前ではなくIDを渡す必要があります → 解決: フォーラム作成時のレスポンスの
available_tagsからIDを保存しておいて使う 404 Unknown Channelで返信に失敗 原因: テキストチャンネルのメッセージIDをスレッドIDのように使った → 解決: フォーラムの投稿はスレッドID、テキストチャンネルはチャンネルID + メッセージID
📌 まとめ
第5回まで、AIチームでマイクラサーバーを作る仕組みをまとめました。
- #1 AIリーダー + チームメンバー15人、指示書と報告書
- #2 jar 1つ + モジュール13個、
1000029事件 - #3 数値×10、12時間の経験値、クラスシミュレーション
- #4 ChatGPTが描いてClaudeが検品
- #5 Discordで人間とAIチームが決定をやり取り
次回からは初めての統合テストの振り返りを皮切りに、実際にみんなが入って遊んでみたあとに変わっていくことを、ゆっくり記録していきます。お楽しみに 🙌
この記事は私が方向性を決め、Claudeと一緒にまとめました。このサーバーは個人プロジェクトであり、Minecraftの公式コンテンツではなく、Mojang・Microsoftとは関係ありません。
連載 · 全5回中5回目
AIチームでマイクラサーバーを作る
- #1AIリーダー1人 + メンバー15人でMMORPGプラグインを作る仕組み! 🤖
- #21つのプラグインにモジュール13個!コア構造と「1000029ダメージ」事件 🧩
- #3数値×10、12時間の経験値曲線、クラス6種のシミュレーション! 📊
- #4ChatGPTが描いてClaudeが検品するリソースパック・パイプライン! 🎨
- #5Discordボットで開発チームを運営!決定フォーラム・コマンド一覧・リソースパックチャンネル 🤝現在の記事
