コンテンツにスキップ

OpenClaw経由でClaude Codeを操作する方法

💡 目的

DiscordからClaude Codeの機能(ファイル編集、プランモード等)を実行できるようにする。


🔍 実装方法の詳細比較

方法1: OpenClawカスタムスキル作成(推奨)

📋 概要

OpenClawのスキルシステムを使って、Discordコマンドから直接Claude Codeを呼び出す。

🏗️ アーキテクチャ

Discord
@MyLabBot /code-edit <file> <instruction>
OpenClaw Gateway
カスタムスキル (TypeScript/JavaScript)
Claude Code CLI 実行
結果をDiscordに返す

✅ メリット

  • OpenClawの機能をフル活用
  • 既存のスキルシステムに統合
  • スキル管理が簡単(openclaw skills list
  • 権限管理が組み込み済み
  • 実装が比較的簡単
  • OpenClawのスキルSDKを使用
  • TypeScript/JavaScriptで記述
  • 豊富なサンプル・ドキュメント
  • 保守性が高い
  • OpenClawのアップデートに追従
  • スキル単位で管理・更新

❌ デメリット

  • OpenClawに依存(OpenClaw停止時は使えない)
  • TypeScript/JavaScriptの知識が必要
  • スキル開発の学習コストがある

🛠️ 実装難易度

中級(⭐⭐⭐☆☆) - TypeScript経験者: 1-2日 - 初心者: 3-5日

💻 実装例(疑似コード)

// openclaw-skill: claude-code-bridge
export default {
  name: 'claude-code',
  description: 'Execute Claude Code commands',

  commands: {
    'code-edit': async ({ args, reply }) => {
      const [file, instruction] = args;

      // Claude Code CLIを実行
      const result = await exec(`claude "${instruction}" --file ${file}`);

      // 結果をDiscordに返す
      await reply(`✅ 完了:\n\`\`\`\n${result}\n\`\`\``);
    },

    'plan-mode': async ({ args, reply }) => {
      const [task] = args;

      // プランモードでClaude Code実行
      const plan = await exec(`claude "plan: ${task}"`);

      await reply(`📋 計画:\n${plan}`);
    }
  }
};

📚 参考リンク

  • OpenClaw Skills Documentation: https://docs.openclaw.ai/tools/skills
  • Skill Creator: /skill_creator コマンドを使用

方法2: Webhook + 自動実行システム

📋 概要

Webhookを受け取るサーバーを立て、Discordからのメッセージに応じてClaude Codeを実行。

🏗️ アーキテクチャ

Discord
Webhook送信
Webhookサーバー (Python/Node.js)
メッセージをパース
Claude Code CLI 実行
Discord APIで結果を投稿

✅ メリット

  • 完全なカスタマイズ性
  • 自由に機能を追加できる
  • OpenClawに依存しない
  • 複雑なロジックも実装可能
  • 柔軟性が高い
  • どんな言語でも実装可能(Python, Node.js等)
  • 既存のスクリプトと統合しやすい
  • ファイル監視、自動実行なども追加可能

❌ デメリット

  • 実装が複雑
  • Webhookサーバーの構築が必要
  • セキュリティ対策が必要
  • エラーハンドリングを自分で実装
  • 保守コストが高い
  • Discord APIの変更に対応が必要
  • サーバーの監視・管理が必要

🛠️ 実装難易度

上級(⭐⭐⭐⭐☆) - 経験者: 2-3日 - 初心者: 1週間以上

💻 実装例(疑似コード)

# webhook_server.py
from flask import Flask, request
import subprocess
import discord

app = Flask(__name__)

@app.route('/webhook', methods=['POST'])
def handle_webhook():
    data = request.json
    command = data['content']

    # コマンドをパース
    if command.startswith('!code-edit'):
        file, instruction = parse_command(command)

        # Claude Code実行
        result = subprocess.run(
            ['claude', instruction, '--file', file],
            capture_output=True
        )

        # Discordに投稿
        post_to_discord(data['channel_id'], result.stdout)

    return {'status': 'ok'}

if __name__ == '__main__':
    app.run(port=5000)

方法3: シンプルなプロトタイプ(最速)

📋 概要

最小限の機能で、まず動くものを作る。既存のMyLab Botを拡張。

🏗️ アーキテクチャ

Discordで特定のメッセージを投稿
MyLab Botが検知(既存のbot.py拡張)
Claude Code CLI実行
結果をDiscordに投稿

✅ メリット

  • すぐに始められる
  • 既存のMyLab Botを拡張
  • Pythonで実装(慣れた言語)
  • 数時間で動くものができる
  • 学習コストが低い
  • シンプルな構造
  • 既存コードを参考にできる

❌ デメリット

  • 機能が限定的
  • 複雑な処理は難しい
  • スケーラビリティが低い
  • 将来的には作り直しが必要
  • 本格運用には向かない

🛠️ 実装難易度

初級(⭐⭐☆☆☆) - 既存のbot.pyを理解していれば: 2-3時間 - 初心者: 1日

💻 実装例

# scripts/discord_bot/bot.py に追加
import subprocess

@bot.command(name='code-edit')
async def code_edit(ctx, file: str, *, instruction: str):
    """Claude Codeでファイル編集

    使い方:
        $code-edit path/to/file.py "ログ機能を追加して"
    """

    await ctx.send(f"🔄 編集中: {file}")

    try:
        # Claude Code CLI実行
        result = subprocess.run(
            ['claude', instruction, '--file', file],
            capture_output=True,
            text=True,
            timeout=60
        )

        if result.returncode == 0:
            # 成功
            await ctx.send(f"✅ 編集完了:\n```\n{result.stdout[:1900]}\n```")
        else:
            # エラー
            await ctx.send(f"❌ エラー:\n```\n{result.stderr[:1900]}\n```")

    except subprocess.TimeoutExpired:
        await ctx.send("⏱️ タイムアウト: 処理に時間がかかりすぎました")
    except Exception as e:
        await ctx.send(f"❌ 予期しないエラー: {str(e)}")


@bot.command(name='plan')
async def plan_mode(ctx, *, task: str):
    """プランモード実行

    使い方:
        $plan ユーザー認証機能を実装する計画を立てて
    """

    await ctx.send(f"📋 計画作成中...")

    try:
        # Claude Codeでプラン作成
        result = subprocess.run(
            ['claude', f'plan: {task}'],
            capture_output=True,
            text=True,
            timeout=120
        )

        if result.returncode == 0:
            # 結果をチャンク分割して投稿(Discordの2000文字制限対策)
            output = result.stdout
            chunks = [output[i:i+1900] for i in range(0, len(output), 1900)]

            for i, chunk in enumerate(chunks):
                await ctx.send(f"📋 計画 (Part {i+1}/{len(chunks)}):\n```\n{chunk}\n```")
        else:
            await ctx.send(f"❌ エラー:\n```\n{result.stderr[:1900]}\n```")

    except subprocess.TimeoutExpired:
        await ctx.send("⏱️ タイムアウト: 処理に時間がかかりすぎました")
    except Exception as e:
        await ctx.send(f"❌ 予期しないエラー: {str(e)}")


@bot.command(name='code-review')
async def code_review(ctx, file: str):
    """コードレビュー

    使い方:
        $code-review path/to/file.py
    """

    await ctx.send(f"🔍 レビュー中: {file}")

    try:
        result = subprocess.run(
            ['claude', f'このファイルをレビューして: {file}'],
            capture_output=True,
            text=True,
            timeout=60
        )

        if result.returncode == 0:
            await ctx.send(f"✅ レビュー結果:\n```\n{result.stdout[:1900]}\n```")
        else:
            await ctx.send(f"❌ エラー:\n```\n{result.stderr[:1900]}\n```")

    except Exception as e:
        await ctx.send(f"❌ エラー: {str(e)}")

📊 比較表

項目 OpenClawスキル Webhook プロトタイプ
難易度 ⭐⭐⭐☆☆ ⭐⭐⭐⭐☆ ⭐⭐☆☆☆
実装時間 1-2日 2-3日 数時間
保守性
拡張性
セキュリティ
OpenClaw依存 あり なし なし
学習コスト
推奨度 ⭐⭐⭐⭐⭐ ⭐⭐⭐☆☆ ⭐⭐⭐⭐☆

💡 推奨: 段階的アプローチ

Phase 1: プロトタイプで試す(今週)

# 既存のMyLab Botに機能追加
# scripts/discord_bot/bot.py を編集

実装コマンド:
- $code-edit <file> <instruction>
- $plan <task>
- $code-review <file>

目的:
 まず動くものを作って試す
 必要な機能を見極める
 使い勝手を確認

実装手順: 1. scripts/discord_bot/bot.py を開く 2. 上記のコマンドを追加 3. Botを再起動 4. Discordでテスト


Phase 2: OpenClawスキルに移行(1-2週間後)

// より洗練された実装
# openclaw/skills/claude-code-bridge/

実装内容:
- OpenClawのスキルシステムを活用
- 権限管理エラーハンドリング
- 複数のコマンドを追加
- ログ記録進捗通知

目的:
 安定した運用
 高度な機能追加
 保守性向上

実装手順: 1. OpenClawスキル開発について学習 2. /skill_creator コマンドでスキル作成 3. TypeScriptで実装 4. テスト・デプロイ


Phase 3: 高度な機能追加(将来)

実装内容:
- ファイル監視・自動実行
- プランの保存・管理
- チーム共有機能
- GitHub連携強化
- 定期実行(Cron)
- 通知システム

目的:
→ 完全自動化
→ チーム開発対応
→ CI/CD統合

🎯 実現可能な機能

基本機能(Phase 1)

  • ✅ ファイル編集コマンド
    $code-edit src/main.py "ログ機能を追加"
    
  • ✅ プランモード実行
    $plan ユーザー認証機能を実装
    
  • ✅ コードレビュー
    $code-review src/utils.py
    
  • ✅ Git操作
    $git-commit "feat: add logging"
    

応用機能(Phase 2)

  • ✅ 複数ファイルの一括編集
    $code-edit-batch src/*.py "型ヒントを追加"
    
  • ✅ プランの保存・共有
    $plan-save "認証機能" → Obsidianに保存
    
  • ✅ 進捗通知
    編集完了時に自動通知
    
  • ✅ インタラクティブモード
    $code-edit-i → 対話形式で編集
    

高度な機能(Phase 3)

  • ✅ 定期実行(Cron)
    毎日自動でコードレビュー
    
  • ✅ ファイル監視
    ファイル変更時に自動テスト
    
  • ✅ PR自動作成
    編集完了後に自動でPR作成
    
  • ✅ チーム共有
    プランをチームメンバーと共有
    

🚀 実装開始ガイド

今すぐ始める: Phase 1 プロトタイプ

ステップ1: bot.pyを編集

cd D:/Kazuma_Teramachi/MyLab/scripts/discord_bot
# bot.py を開いて、上記のコマンドを追加

ステップ2: Botを再起動

pkill -f "python.*bot.py"
python bot.py &

ステップ3: Discordでテスト

$code-edit test.py "コメントを追加"
$plan テスト機能を実装

⚠️ 注意事項

セキュリティ

  • Claude Code CLIは強力なツール
  • 任意のコマンド実行を許可しない
  • 信頼できるユーザーのみに制限
  • admin_users リストで権限管理

エラーハンドリング

  • タイムアウト設定(60秒推奨)
  • 出力文字数制限(Discord: 2000文字)
  • 例外処理を必ず実装

パフォーマンス

  • Claude Code実行は時間がかかる
  • 「処理中...」メッセージを表示
  • バックグラウンドで実行を検討

📚 参考リソース

OpenClaw

  • 公式ドキュメント: https://docs.openclaw.ai
  • スキル開発: https://docs.openclaw.ai/tools/skills
  • GitHub: https://github.com/openclaw/openclaw

Claude Code

  • GitHub: https://github.com/anthropics/claude-code
  • ドキュメント: 内蔵(claude --help

Discord Bot開発

  • discord.py: https://discordpy.readthedocs.io
  • 既存実装: scripts/discord_bot/bot.py

📝 次のステップ

  1. Phase 1を実装(今週)
  2. bot.pyに基本コマンドを追加
  3. Discordでテスト
  4. フィードバックを収集

  5. Phase 2の検討(1-2週間後)

  6. OpenClawスキル開発について学習
  7. 必要な機能を洗い出し
  8. 実装計画を立てる

  9. ドキュメント更新

  10. 使い方ガイドを作成
  11. トラブルシューティング追加
  12. GitHub Issueに記録

作成日: 2026-02-09 最終更新: 2026-02-09 ステータス: 計画中