n8nとClaude Code Actionで、Slackからのコード調査を依頼できるワークフローを実現する

はじめに

こんにちは!クラスター株式会社でクライアントエンジニアをしている@nkjzmです。

クラスターが運営するメタバースプラットフォーム cluster(クラスター)は2017年から9年近く続くサービスで、社内でも全ての機能や詳細な仕様を把握しきれている人はほとんどいません。そのため、分からない機能や仕様を知りたい時はSlack上でやりとりをし、必要に応じてPMやエンジニアが調査をするという流れがあります。

そこで、先日導入されたGitHub Actions上でClaude Codeを実行できる仕組みを利用して、社内メンバーが誰でも直接コード調査を実行できるSlack botを作成しました。今回はその仕組みを紹介したいと思います。

n8nを使ったワークフロー作成

今回のワークフローを実現するにあたりn8nというサービスを利用しました。

n8n.io

n8nはAIツールとの連携がしやすことが特徴で、ノーコード/ローコードで視覚的にワークフローを構築できるサービスです。今回連携しようとしていたSlack botやGitHub Actionsについて、公式機能で扱えるようになっていました。社内でn8nのトライアル導入をしていたこともあり、今回使ってみることにしました。

実現したワークフロー

全体像

構築したワークフローの全体像は以下の通りです。

作成したn8nワークフロー全体図

ワークフローの流れは次のようになっています。

  1. ユーザーがSlackでbotをメンション付きでタスクを依頼
  2. n8nがSlackイベントを検知
  3. チャットテキストから改行を削除(次のノードの入力に改行が含まれるとエラーになる)
  4. n8nがGitHub Actionsワークフローをトリガー(workflow_dispatch
  5. GitHub Actions上でClaude Code Actionが実行される
  6. Claude Codeが完了すると、結果がn8nのresumeUrlにPOSTされる
  7. マージノードで必要な情報を集約する
  8. n8nがSlackのスレッドに返信

このワークフローにより、Slackからbotにメンションをするだけで、Claude Codeによるコード調査やコード修正を依頼できるようになりました。

メンションをするとコード調査をして結果が返ってくる様子

GitHub Actionsワークフロー

n8nから呼び出すための専用のGitHub Actionsのワークフローファイルを作成しました。n8nがworkflow_dispatchトリガーを呼び出す形で利用します。

on:
  workflow_dispatch:
    inputs:
      prompt:
        description: 'Claude Codeに実行させるタスク内容'
        required: true
        type: string
      resumeUrl:
        description: 'n8nから自動的に提供されるresume webhook URL'
        required: true
        type: string

主要な入力パラメータは下記の2つです。

  • prompt: ユーザーがSlackで入力したタスク内容をそのまま渡す
  • resumeUrl: n8nが生成するWebhook URL。Claude Codeの実行結果をここにPOSTすることで、n8nが結果を受け取れる。GitHub Actionsの命名はsnake_caseであることが多いが、n8nの仕様に合わせてcamelCaseになっている
Claude Code Actionの設定

Anthropics公式のClaude Code Actionを利用しています。

github.com

      - uses: anthropics/claude-code-action@v1
        id: claude-code
        with:
          github_token: ${{ steps.app-token.outputs.token }}
          use_bedrock: "true"
          claude_args: |
            --model global.anthropic.claude-opus-4-5-20251101-v1:0
            --max-turns 50
            --allowedTools "Read,Write,Edit,Glob,Grep,WebFetch,WebSearch,Bash(git:*),Bash(date:*),Bash(gh pr create:*),Bash(cd:*)"
            --json-schema '{"type":"object","properties":{"summary":{"type":"string","description":"実行結果のサマリー。Slack mrkdwn形式で記述(太字は*text*、リンクは<url|text>)。PRを作成した場合はそのURLをsummary内にSlackリンク形式(<url|text>)で含める。コード参照はGitHubパーマリンク形式で記述(例: <https://github.com/orgs/repos/blob/master/path/to/file.txt#L10|path/to/file.txt:10>)。"}},"required":["summary"]}'

ポイントは--json-schema で、Claude Code Actionから返却されるデータ構造を指定することが可能です。

{
  "summary": "実行結果のサマリー。Slack mrkdwn形式で記述(太字は*text*、リンクは<url|text>)。PRを作成した場合はそのURLをSlackリンク形式で含める。コード参照はGitHubパーマリンク形式で記述。"
}

このJSON形式のデータは、GitHub Actionsの後続ステップ内でパースされ、n8nのresumeUrlにPOSTされます。

# 成功時の処理(抜粋)
STRUCTURED_OUTPUT='${{ steps.claude-code.outputs.structured_output }}'
SUMMARY=$(echo "$STRUCTURED_OUTPUT" | jq -r '.summary')

# jqを使ってJSONペイロードを構築
PAYLOAD=$(jq -n \
  --arg status "success" \
  --arg summary "$SUMMARY" \
  --arg workflow_url "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" \
  '{
    status: $status,
    summary: $summary,
    workflow_run_url: $workflow_url
  }')

# n8nに結果を送信
curl -X POST "${{ github.event.inputs.resumeUrl }}" \
  -H "Content-Type: application/json" \
  -d "$PAYLOAD"

失敗時も同様に、エラー情報を含むJSONをn8nに返却します。

実装して得られた知見

Slack bot権限やトリガーの注意点

n8nのSlackノードでは、メンションを受け取る対象を「特定チャンネルのみ」or「全体」を選択できるのですが、「全体」を選択した場合に下記のような警告が表示されます。

「各チャンネルのでイベントごとにn8nの実行回数が消費される」という旨の警告

n8nは契約プランで実行可能な回数が決まっているため一見恐ろしい警告なのですが、この対象となるEventはSlack bot側から制御が可能です。Slack Appの設定ページの「Event Subscriptions」タブにて「Subscribe to bot events」を変更できます。対象をメンションのみにしておきましょう。

Subscribe to bot events

ちなみに、今回はDMでの使用を制限し、チャンネル内のメンションのみに反応するようにしました。理由としては下記の通りです。

  • チャンネルでのやりとりであれば、他のメンバーも結果を参照できる
    • DMでのやりとりはチーム内で共有されず、ナレッジが蓄積されず、誤った情報が返ってきた時に指摘が受けられない
  • 社内に公開すべきでない情報をDM上から送信してしまうリスクがある
    • Slack上では見えないが、n8nやGitHub Actionsのログからは内容を確認できてしまう

ノードのマージについて

複数のフローを経由する場合は、出力を統合する必要があります。n8nのMergeノードを使用することで、異なるフローからのデータを1つにまとめて次のノードに渡すことができます。

今回のワークフローでいうと、最終的にSlack botから返信をする際に必要な情報を

  • 返信先の投稿: Slack botのトリガーノードから
  • 返信する内容: Claude Code Actionのノードから

それぞれ取得し、情報が揃ったタイミングで最後のノードに渡るように設定しました。

Mergeの設定

ちなみに、n8nではワークフロー実行後に各ノードのInput/Outputタブから、実際に送受信されたデータを確認できる機能があります。どのノードでどのようなデータが流れているかを把握できるので、マージ周りの動作確認をする際に非常に有用でした。

まとめ

n8nとClaude Code Actionの連携により、Slackから手軽にコード調査を依頼できるワークフローを実現しました。

ただし、n8nの実行回数制限やcredential管理、AIによる回答の信頼性など、運用上の注意点もいくつかあります。今後も改善を続けながら、より多くのメンバーがAIを活用したワークフローを活用できる環境を整えていく予定です。