Contents
OpenClaw の概要と現在確認できるリリース状況
| 項目 | 現在分かっている情報 |
|---|---|
| 公式サイト | https://openclaw.ai (2026 年版のページは見当たりません) |
| GitHub リポジトリ | github.com/openclaw/openclaw-sdk(最新のタグは v0.9.3 まで) |
| 主な機能 | ・マルチプラットフォーム対応 ・Python / Node.js SDK 提供 ・Discord Bot、GitHub Issue 自動生成などの拡張ポイント |
| 2026 年アップデート | コミュニティ投稿(例:X.com の実装例)では「GitHub 連携」「Discord Bot 統合」が追加されたとされるが、公式リリースノートは未公開 |
参考リンク
- GitHub releases: https://github.com/openclaw/openclaw-sdk/releases(2025 年末までの情報)
- X.com 実装例(ツイート ID 1234567890)※執筆時点で削除されている可能性あり
開発環境の構築手順
推奨ランタイム
| 言語 | バージョン |
|---|---|
| Python | 3.12 系(例:3.12.4) |
| Node.js | 20 系(例:20.11.0) |
インストール例(macOS / Linux / Windows 共通)
|
1 2 3 4 5 6 |
# pyenv がインストール済みの場合 pyenv install 3.12.4 && pyenv global 3.12.4 # nvm がインストール済みの場合 nvm install 20 && nvm use 20 |
VS Code の推奨拡張と設定
| 拡張機能 | 用途 |
|---|---|
| Python (Microsoft) | Lint・IntelliSense |
| ESLint | JavaScript/Node.js コード品質 |
| Docker | コンテナデバッグ |
| OpenClaw SDK Helper(非公式) | manifest.json のスキーマ補完 |
.vscode/settings.json
|
1 2 3 4 5 6 7 8 9 |
{ "python.pythonPath": "~/.pyenv/versions/3.12.4/bin/python", "editor.formatOnSave": true, "[python]": { "editor.defaultFormatter": "ms-python.black-formatter" }, "docker.enableDebugging": true } |
必要パッケージのインストール
|
1 2 3 4 5 6 7 8 |
# 仮想環境作成(venv 推奨) python -m venv .venv source .venv/bin/activate # Windows: .\.venv\Scripts\activate # パッケージ更新 & インストール pip install --upgrade pip pip install openclaw-sdk discord.py python-dotenv |
python-dotenvは環境変数(API キーやトークン)を.envファイルから安全にロードするために使用します。
MOD のディレクトリ構成と基本コード
最小構成例
|
1 2 3 4 5 6 |
my_mod/ ├─ manifest.json ├─ main.py └─ assets/ └─ icon.png |
manifest.json(必須項目)
|
1 2 3 4 5 6 7 8 9 |
{ "name": "TaskMaster", "version": "0.1.0", "description": "Discord と対話できるシンプルなタスク管理 MOD", "entry_point": "main.py", "author": "your_name", "license": "MIT" } |
main.py(基本的なハンドラ)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
import os from dotenv import load_dotenv from openclaw_sdk import ClawBot, on_message, run_action from discord import Intents # .env のロード → DISCORD_TOKEN などを環境変数に展開 load_dotenv() bot = ClawBot( name="TaskMaster", discord_intents=Intents.default(), discord_token=os.getenv("DISCORD_TOKEN") # 必ず環境変数から取得 ) tasks: list[str] = [] @on_message async def handle_task(ctx): """Discord メッセージを解析してタスク操作を行う""" if ctx.content.startswith("タスク追加"): task = ctx.content.replace("タスク追加", "").strip() tasks.append(task) await ctx.reply(f"✅ タスク『{task}』を追加しました!") elif ctx.content == "タスク一覧": if not tasks: await ctx.reply("📭 現在タスクはありません。") else: await ctx.reply("🗒️ タスク一覧:\n" + "\n".join(f"- {t}" for t in tasks)) elif ctx.content.startswith("タスク削除"): target = ctx.content.replace("タスク削除", "").strip() if target in tasks: tasks.remove(target) await ctx.reply(f"🗑️ タスク『{target}』を削除しました。") else: await ctx.reply(f"❓ 『{target}』はタスクにありません。") # 外部 API 呼び出しのサンプル(天気情報取得) @run_action(name="fetch_weather") async def fetch_weather(location: str) -> str: import httpx # Open-Meteo は無料でキー不要 lat, lon = location.split(",") url = ( f"https://api.open-meteo.com/v1/forecast?" f"latitude={lat}&longitude={lon}&current_weather=true" ) resp = await httpx.get(url, timeout=10.0) data = resp.json()["current_weather"] return f"{location} の現在の天気は {data['weathercode']}、温度 {data['temperature']}°C です。" if __name__ == "__main__": bot.run() |
ポイント
- トークン管理は必ず os.getenv() 経由で取得し、コードにハードコーディングしないこと。
- .env ファイル例
dotenv
DISCORD_TOKEN=YOUR_DISCORD_BOT_TOKEN
.gitignore に .env を追加してリポジトリに含めないようにする。
GitHub Actions による CI/CD パイプライン
ワークフロー構成
| ファイル | 内容 |
|---|---|
.github/workflows/ci.yml |
テスト実行(pytest)とコード品質チェック |
.github/workflows/release.yml |
タグ作成時にパッケージをビルドし、GitHub Packages へ自動公開 |
ci.yml
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
name: CI on: push: branches: [ main ] pull_request: jobs: test: runs-on: ubuntu-latest strategy: matrix: python-version: ["3.12"] node-version: ["20"] steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m venv .venv source .venv/bin/activate pip install -r requirements.txt pytest anyio - name: Run tests run: | source .venv/bin/activate pytest |
release.yml
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
name: Release on: push: tags: - 'v*.*.*' jobs: publish: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Node.js uses: actions/setup-node@v3 with: node-version: "20" - name: Install & Build (if needed) run: | npm ci npm run build # プロジェクトにビルドが必要な場合のみ - name: Publish to GitHub Packages env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | npm publish --registry=https://npm.pkg.github.com |
テストコード例(tests/test_main.py)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import os import pytest from openclaw_sdk import ClawBot # ハンドラは main.py からインポートされている前提 from main import handle_task, greet # greet は別途実装したサンプルハンドラと仮定 @pytest.mark.asyncio async def test_task_addition(): bot = ClawBot(name="Test") class DummyCtx: content = "タスク追加 テストタスク" async def reply(self, msg): self.response = msg ctx = DummyCtx() await handle_task(ctx) assert ctx.response == "✅ タスク『テストタスク』を追加しました!" @pytest.mark.asyncio async def test_greet(): class DummyCtx: content = "こんにちは" async def reply(self, msg): self.response = msg ctx = DummyCtx() await greet(ctx) # greet が別途定義されている想定 assert "こんにちは" in ctx.response |
- 非同期テストは
pytestのプラグインanyio(またはpytest-asyncio)で実行できる。 - シークレット管理は GitHub の Secrets に
DISCORD_TOKENなどを登録し、ワークフロー内で${{ secrets.DISCORD_TOKEN }}と参照する。
Discord Bot 連携と安全なトークン管理
開発者ポータルでの基本手順(2026 年版公式チュートリアルは未確認)
| 手順 | 内容 |
|---|---|
| 1. アプリ作成 | https://discord.com/developers/applications → 「New Application」 |
| 2. Bot の追加 | 左メニュー「Bot」→「Add Bot」 |
| 3. 権限設定 | MESSAGE_READ、MESSAGE_SEND、MESSAGE_CONTENT(メッセージ内容取得)を有効化 |
| 4. トークン取得 | 「Reset Token」→表示された文字列をコピーし .env に保存 |
| 5. OAuth2 URL 生成 | スコープ bot と applications.commands、必要な権限ビットマスクで招待リンク作成 |
注意:トークンは決してコードリポジトリにハードコーディングしないこと。GitHub にプッシュする前に必ず
.gitignoreに.envを追加してください。
環境変数のロード例(.env)
|
1 2 |
DISCORD_TOKEN=MzI1...your_token_here... |
main.py での接続コード
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
from openclaw_sdk import ClawBot, on_message from discord import Intents import os from dotenv import load_dotenv load_dotenv() # .env 読み込み bot = ClawBot( name="TaskMaster", discord_intents=Intents.default(), discord_token=os.getenv("DISCORD_TOKEN") ) @on_message async def discord_echo(ctx): if ctx.is_discord: # Discord からのメッセージか判定 await ctx.reply(f"🔔 Received from Discord: {ctx.content}") if __name__ == "__main__": bot.run() |
Docker を使ったローカルデバッグ環境
Dockerfile(公式イメージベース)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# ------------------------------------------------- # OpenClaw 開発用コンテナ # ------------------------------------------------- FROM python:3.12-slim WORKDIR /app COPY . /app # 必要パッケージをインストール RUN pip install --no-cache-dir -r requirements.txt # .env はホスト側でマウントまたは docker compose で渡す ENV PYTHONUNBUFFERED=1 CMD ["python", "-m", "openclaw_sdk.run", "--manifest", "manifest.json"] |
docker‑compose.yml(ローカルデバッグ推奨構成)
|
1 2 3 4 5 6 7 8 9 10 11 |
version: "3.9" services: openclaw-mod: build: . env_file: - .env # DISCORD_TOKEN などを自動ロード volumes: - .:/app # ソースコードのライブリロードが可能 ports: - "8000:8000" # 必要に応じてポート公開(例:Web UI がある場合) |
デバッグ手順
|
1 2 3 4 5 6 7 8 9 |
# 1. 環境変数ファイルを作成(.gitignore に .env を追加済みとする) echo "DISCORD_TOKEN=YOUR_BOT_TOKEN" > .env # 2. コンテナビルド&起動 docker compose up --build -d # 3. ログ確認 docker compose logs -f |
- ホットリロードが欲しい場合は
watchmedoやentrをコンテナ内にインストールし、コード変更時に自動再起動させることも可能です。
実装例:タスク管理 MOD と外部 API 呼び出し
完全版コード(manifest.json + main.py)
manifest.json
|
1 2 3 4 5 6 7 8 9 |
{ "name": "TaskMaster", "version": "0.1.0", "description": "Discord と対話できるタスク管理 MOD", "entry_point": "main.py", "author": "your_name", "license": "MIT" } |
main.py
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
import os from dotenv import load_dotenv from openclaw_sdk import ClawBot, on_message, run_action from discord import Intents load_dotenv() bot = ClawBot( name="TaskMaster", discord_intents=Intents.default(), discord_token=os.getenv("DISCORD_TOKEN") ) # ------------------- タスク操作 ------------------- tasks: list[str] = [] @on_message async def task_handler(ctx): """タスク追加・一覧・削除をテキストコマンドで処理""" msg = ctx.content.strip() if msg.startswith("タスク追加"): task = msg.replace("タスク追加", "").strip() tasks.append(task) await ctx.reply(f"✅ タスク『{task}』を追加しました!") elif msg == "タスク一覧": if not tasks: await ctx.reply("📭 現在タスクはありません。") else: await ctx.reply("🗒️ タスク一覧:\n" + "\n".join(f"- {t}" for t in tasks)) elif msg.startswith("タスク削除"): target = msg.replace("タスク削除", "").strip() if target in tasks: tasks.remove(target) await ctx.reply(f"🗑️ タスク『{target}』を削除しました。") else: await ctx.reply(f"❓ 『{target}』はタスクにありません。") # ------------------- 外部 API(天気) ------------------- @run_action(name="fetch_weather") async def fetch_weather(location: str) -> str: """Open-Meteo の無料エンドポイントを利用して現在天気を取得""" import httpx lat, lon = location.split(",") url = ( f"https://api.open-meteo.com/v1/forecast?" f"latitude={lat}&longitude={lon}&current_weather=true" ) resp = await httpx.get(url, timeout=10.0) data = resp.json()["current_weather"] return ( f"{location} の現在の天気はコード {data['weathercode']}、" f"温度 {data['temperature']}°C です。" ) # ------------------- ニュース取得(例) ------------------- @run_action(name="latest_news") async def latest_news(topic: str) -> str: """NewsAPI (有料) の代替として free-news API を使用""" import httpx api_key = os.getenv("NEWS_API_KEY") # .env に設定必須 url = f"https://free-news.p.rapidapi.com/v1/search?q={topic}&lang=en" headers = {"X-RapidAPI-Key": api_key} resp = await httpx.get(url, headers=headers, timeout=10.0) articles = resp.json().get("entries", [])[:3] lines = [f"📰 {a['title']}" for a in articles] return "\n".join(lines) if lines else "ニュースが見つかりませんでした。" if __name__ == "__main__": bot.run() |
重要ポイントまとめ
- API キーはすべて
.envに格納し、コード内ではos.getenv()のみ使用する。 - 非同期 HTTP クライアントは
httpx(デフォルトで async 対応)を利用し、タイムアウトを必ず設定。 - エラーハンドリングは省略しているが、本番環境では
try/exceptでネットワーク障害や JSON パース失敗に備える。
公開・シェアのフロー
| ステップ | 操作内容 |
|---|---|
| 1. リポジトリ作成 | git init && git remote add origin https://github.com/yourname/taskmaster-mod.git |
| 2. コミット & プッシュ | git add . && git commit -m "Initial commit – TaskMaster MOD"git push -u origin main |
| 3. バージョンタグ付与 | git tag v0.1.0 && git push origin v0.1.0(リリースワークフローが自動起動) |
| 4. README 作成 | インストール手順、使用例、ライセンス情報を記載 |
| 5. 記事投稿 | - Zenn: zenn new:article taskmaster-intro → タグ openclaw, discord, mod を付与- Qiita: 同様に Markdown で投稿し、デモ GIF(Docker 起動画面)を添付 |
| 6. コミュニティ共有 | Discord の公式サーバー #mods-showcase にリポジトリリンクと簡単な説明文を投稿。ハッシュタグ #OpenClawCommunity で可視化 |
- シークレット管理は GitHub 上の Settings → Secrets へ
DISCORD_TOKEN,NEWS_API_KEYを追加し、CI/CD が参照できるようにする。 - 公開リポジトリの場合、
.env.exampleに必要な環境変数名だけを記載して利用者が自分で作成できるよう配慮すると親切です。
まとめ
| 項目 | キーポイント |
|---|---|
| 最新情報 | 2026 年版の公式リリースは未確認。コミュニティ情報を元に「GitHub 連携」「Discord Bot 統合」等が期待される。 |
| 開発環境 | Python 3.12、Node.js 20、VS Code 推奨拡張で即時セットアップ可能。 |
| MOD 構成 | manifest.json とエントリポイント main.py の 2 ファイルで最小構成が完結。 |
| CI/CD | GitHub Actions による自動テスト・パッケージ公開を設定し、シークレットは GitHub Secrets で安全管理。 |
| Discord 連携 | 開発者ポータルで取得したトークンは .env 経由でロードし、コードに埋め込まない。 |
| Docker デバッグ | Dockerfile と docker‑compose により OS 差異を排除し、本番と同一環境でローカルテストが可能。 |
| 実装例 | タスク管理 MOD + 天気・ニュース取得アクションのサンプルコードをフル掲載。 |
| 公開手順 | GitHub リポジトリ作成 → タグ付与 → CI による自動デプロイ → 記事投稿・Discord コミュニティでシェア の一連流れが完了形。 |
このガイドに沿って環境を構築すれば、2026 年版 OpenClaw(※未確認)でも 安全かつスムーズ に MOD 開発・公開・共有が実現できます。ぜひ自分だけの AI アシスタントや Discord Bot を作成し、OpenClaw エコシステムに貢献してみてください!