Claude Code の GitHub Actions 連携とは、anthropics/claude-code-action@v1 をワークフローに置き、Issue や PR の @claude への応答・PR の自動レビュー・定期実行などをリポジトリの中で動かす仕組みです。 必要なのは「Claude GitHub App のインストール」「認証用シークレット1つ」「ワークフロー YAML 1枚」の3点です。

この記事では、そのまま .github/workflows/ に置ける YAML を用途別に4本、入力パラメータ12種の日本語表、beta から v1 への対応表、ジョブごとの最小 permissions、「誰が起動できるか」の判断表、費用の上限のかけ方までを1ページにまとめます。

確認環境:Claude Code Docs(code.claude.com/docs)と anthropics/claude-code-action の docs(usage.md・migration-guide.md・security.md)を2026年10月7日に開いて確認。掲載した YAML は Python 3.11.15 + PyYAML 6.0.3 と actionlint 1.7.12 で構文を確認し、git の操作は git 2.43.0 で実行しています。

Claude Code GitHub Actions 連携の早見表

やりたいこと 置くファイル 起動のきっかけ prompt
@claude に応答させる claude.yml Issue・PR のコメント なし
PR を自動レビューする claude-code-review.yml PR の作成・更新 あり
毎朝レポートを作る claude-daily-report.yml cron・手動 あり
自作スキルを動かす claude-changelog.yml 手動 あり
決めること 選択肢 目安
認証 APIキー / OAuthトークン / OIDC連携 個人はOAuth、組織共有はAPIキーかOIDC
権限 ジョブの permissions 読むだけなら read、書き込むジョブだけ write
費用の上限 --max-turns・timeout-minutes・concurrency 3つとも入れる
バージョン @v1 @beta の入力名は v1 で置き換え

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Claude Code GitHub Actions連携|YAML雛形と入力一覧」

仕組みを先に押さえる:prompt の有無で動き方が決まる

claude-code-action は、ワークフローの書き方から動き方を自動で判断します。v1 では mode という入力は無くなり、prompt を書くかどうかで次の2つに分かれます。

モード 条件 動き 結果の出る場所
対話(interactive) prompt なし トリガーフレーズ(既定 @claude)を待って応答 元の Issue・PR のコメント
自動(automation) prompt あり メンションを待たずに実行 既定ではワークフローの実行ログ

対話モードが反応するのは、Issue や PR のコメント、PR レビュー、新しく開かれた Issue の本文とタイトルに含まれるトリガーフレーズです。自動モードでは、プロンプトで投稿を指示し、かつ投稿できるツールを許可したときに限り、Issue や PR にコメントが付きます(後述の PR レビューの YAML がその例です)。

flowchart TD
    A[GitHub のイベント発生] --> B{起動した人は bot か}
    B -- "bot で allowed_bots に無い" --> X[実行しない]
    B -- "人、または許可した bot" --> C{Issue・PR 系のイベントか}
    C -- はい --> D{write 権限があるか}
    D -- いいえ --> X
    D -- はい --> E{prompt を指定したか}
    C -- "schedule など" --> E
    E -- なし --> F["対話モード: @claude を待って応答"]
    E -- あり --> G["自動モード: すぐ実行しログに出力"]

セットアップの手順

準備の方法は2通りあります。どちらもリポジトリの管理者権限が必要です。

方法 手順 向いている場面
かんたん設定 Claude Code で /install-github-app を実行 手元で Claude Code を使っている
手動設定 App 導入 → シークレット登録 → YAML を置く ワークフローを自分で管理したい

かんたん設定(/install-github-app)

  1. GitHub CLI を入れて gh auth login で認証しておく
  2. 連携したいリポジトリで claude を起動し、/install-github-app を実行する
  3. 案内に沿って進めると、Claude GitHub App の導入、シークレットの保存、ワークフローを載せたブランチの push までが行われ、ブラウザで PR 作成画面が開く
  4. その PR を作成してマージすると @claude が使えるようになる

保存されるシークレット名は、API キーなら ANTHROPIC_API_KEY、サブスクリプションのトークンなら CLAUDE_CODE_OAUTH_TOKEN です。このコマンドは github.com のリポジトリが対象です。

手動設定

  1. Claude GitHub App をリポジトリにインストールする
  2. リポジトリの Settings → Secrets and variables → Actions に、次のどちらかを登録する
    • ANTHROPIC_API_KEY:Claude Console で発行した API キー
    • CLAUDE_CODE_OAUTH_TOKEN:手元で claude setup-token を実行して作る OAuth トークン(Pro・Max・Team・Enterprise プラン)
  3. 次の章の YAML を .github/workflows/ に置く
  4. Issue か PR のコメントで @claude と書いて動作を見る

コピペ用ワークフロー YAML 4種

4本とも permissions を必要な分だけにし、timeout-minutes・concurrency・--max-turns で1回あたりの上限を入れてあります。OAuth トークンで認証する場合は、anthropic_api_key の行を次の1行に置き換えてください。

          claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}

1. @claude メンションに応答する(claude.yml)

Issue や PR のコメントに @claude と書くと、Claude が同じ場所に返信し、作業の進み具合をそのコメントに更新していきます。

name: Claude Code
on:
  issue_comment:
    types: [created]
  pull_request_review_comment:
    types: [created]

concurrency:
  group: claude-${{ github.event.issue.number || github.event.pull_request.number }}
  cancel-in-progress: false

jobs:
  claude:
    if: contains(github.event.comment.body, '@claude')
    runs-on: ubuntu-latest
    timeout-minutes: 20
    permissions:
      contents: write
      pull-requests: write
      issues: write
      id-token: write
      actions: read
    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 1
      - uses: anthropics/claude-code-action@v1
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
          claude_args: |
            --max-turns 20
行 役割
if: contains(...) @claude を含まないコメントではランナーを起動しない。アクション側でもトリガーフレーズを確認する
id-token: write アクションが既定で使う GitHub App 認証に必要
actions: read PR の CI 結果を Claude が読めるようにする
actions/checkout Claude が作業するためのリポジトリの写しを用意する
concurrency 同じ Issue・PR では1本ずつ順番に動かす

コメントの書き方の例です。

@claude この Issue の内容に沿って実装してください
@claude このエンドポイントの入力チェックはどう書くのがよいですか
@claude 一覧画面で出ている TypeError を直してください

@claude への応答では、Claude は新しいブランチにコミットし、PR 作成ページへのリンクを返します。PR を作るボタンを押すのは人です。

2. PR を自動レビューする(claude-code-review.yml)

plugin_marketplaces と plugins で code-review プラグインを入れ、そのスキルを prompt で呼びます。

name: Code Review
on:
  pull_request:
    types: [opened, synchronize, ready_for_review, reopened]

concurrency:
  group: claude-review-${{ github.event.pull_request.number }}
  cancel-in-progress: true

jobs:
  review:
    if: >-
      github.event.pull_request.draft == false &&
      github.event.pull_request.head.repo.full_name == github.repository
    runs-on: ubuntu-latest
    timeout-minutes: 15
    permissions:
      contents: read
      pull-requests: read
      issues: read
      id-token: write
    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 1
      - uses: anthropics/claude-code-action@v1
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
          plugin_marketplaces: "https://github.com/anthropics/claude-code.git"
          plugins: "code-review@claude-code-plugins"
          prompt: "/code-review:code-review --comment ${{ github.repository }}/pull/${{ github.event.pull_request.number }}"
          claude_args: |
            --max-turns 15
            --allowedTools "mcp__github_inline_comment__create_inline_comment"

レビューの出力先は次の2行で決まります。

行 働き
--comment 見つけた点ごとにインラインコメントを付ける。指摘が無ければまとめのコメントを1件。外すと結果は実行ログだけに出る
--allowedTools "mcp__github_inline_comment__..." インラインコメントを投稿する MCP サーバーは、claude_args の --allowedTools に名前があるときだけ起動する

plugins の書式は プラグイン名@マーケットプレイス名 です。マーケットプレイス名はリポジトリの URL ではなく、マーケットプレイス自身のマニフェストに書かれた名前を使います。

Claude 側でも、ドラフトやクローズ済みの PR、レビュー不要と判断した PR(自動生成のものやごく小さなもの)、すでに Claude のコメントがある PR は対象から外します。上の if は、その前の段階でランナーの起動自体を省くためのものです。cancel-in-progress: true により、同じ PR に続けて push したときは最新の1本だけが残ります。

3. cron で定期レポートを作る(claude-daily-report.yml)

prompt を付ければ、cron を含むどのイベントでも自動モードで動きます。次の例は平日の日本時間 9:00(UTC 0:00)にコミットと Issue を要約し、実行ログに出します。

name: Daily Report
on:
  schedule:
    - cron: "0 0 * * 1-5"
  workflow_dispatch:

concurrency:
  group: claude-daily-report
  cancel-in-progress: false

jobs:
  report:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    permissions:
      contents: read
      issues: read
      id-token: write
    steps:
      - uses: anthropics/claude-code-action@v1
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
          prompt: "昨日のコミットと、開いている Issue を日本語で要約してください。見出しは「コミット」「Issue」「次に見るとよい点」の3つにしてください。"
          claude_args: |
            --max-turns 10
            --model claude-sonnet-5
            --allowedTools "mcp__github__list_commits,mcp__github__list_issues"

押さえておく点は3つです。

  • 文章のプロンプトでは、許可したツールだけが使えます。 シェルや GitHub API を使わせるには、claude_args の --allowedTools か、settings 入力の permissions.allow で必要なツールを渡します。この例は GitHub MCP の2つのツールでコミットと Issue を読むため、checkout のステップを省いています。
  • スケジュール実行は既定ブランチのワークフローだけが対象です。公開リポジトリでは、リポジトリに動きが無い状態が60日続くとスケジュールが止まります。
  • cron は UTC で書きます。 日本時間の 9:00 は UTC の 0:00 です。

--model を省くと、Claude Code の既定モデルが使われます。

4. リポジトリ内のスキルを prompt で実行する(claude-changelog.yml)

リポジトリの .claude/skills/ に置いたスキルは、先に actions/checkout を実行してから prompt に /スキル名 を渡すと動きます。まずスキル本体です。

.claude/skills/changelog-draft/SKILL.md

---
name: changelog-draft
description: 直近のタグから HEAD までのコミットを読み、変更履歴の下書きを日本語で作る
disable-model-invocation: true
allowed-tools: Bash(git describe *) Bash(git log *) Bash(git tag *)
---

直近のタグから HEAD までの変更履歴の下書きを作ってください。

1. `git describe --tags --abbrev=0` で直近のタグを調べる
2. `git log <直近のタグ>..HEAD --oneline --no-merges` でコミットを一覧にする
3. コミットを「追加」「変更」「修正」「その他」に分け、Markdown の箇条書きで出力する
4. ファイルは編集しない。分類に迷ったコミットは「その他」に入れ、理由を1行添える

.github/workflows/claude-changelog.yml

name: Changelog Draft
on:
  workflow_dispatch:

concurrency:
  group: claude-changelog
  cancel-in-progress: true

jobs:
  changelog:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    permissions:
      contents: read
      id-token: write
    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0
      - uses: anthropics/claude-code-action@v1
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
          prompt: "/changelog-draft"
          claude_args: |
            --max-turns 10

スキルを呼ぶ場合、Claude はフロントマターの allowed-tools に書いたツールを使えます。ここでは git の読み取り系コマンド3種だけを渡しています。タグを参照するので fetch-depth: 0 で履歴をすべて取得します。

スキルが使う git コマンドを、タグ v1.0.0 のあとに3コミットを積んだリポジトリで実行した結果です(git 2.43.0)。

$ git describe --tags --abbrev=0
v1.0.0
$ git log v1.0.0..HEAD --oneline --no-merges
b564f7e docs: README に起動手順を追記
8ebe799 fix: 数量が0のとき合計が空になる点を修正
55d2e20 feat: 在庫一覧に検索条件を追加

Claude はこの一覧を受け取り、「追加」「修正」などに分けた下書きを実行ログに出します。プラグインに入ったスキルを呼ぶときは、2本目の YAML のように /プラグイン名:スキル名 と名前空間つきで書きます。

YAML の構文を確認した結果

4本の YAML とスキルのフロントマターを、次のスクリプトで読み込みました。push する前に手元で同じ確認ができます。

import pathlib, yaml

print("PyYAML", yaml.__version__)
for path in sorted(pathlib.Path(".github/workflows").glob("*.yml")):
    doc = yaml.safe_load(path.read_text(encoding="utf-8"))
    # PyYAML は YAML 1.1 の規則で `on` を真偽値 True として読む
    triggers = doc.get("on", doc.get(True))
    print(f"\n{path.name}: OK")
    print("  triggers   :", ", ".join(triggers))
    for job_id, job in doc["jobs"].items():
        print("  job        :", job_id)
        print("  timeout    :", job.get("timeout-minutes"), "min")
        print("  permissions:", job.get("permissions"))
        uses = [s["uses"] for s in job["steps"] if "uses" in s]
        print("  uses       :", uses)
    print("  concurrency:", doc.get("concurrency"))

# スキルのフロントマターも確認
text = pathlib.Path(".claude/skills/changelog-draft/SKILL.md").read_text(encoding="utf-8")
front = yaml.safe_load(text.split("---")[1])
print("\nSKILL.md frontmatter: OK")
for k, v in front.items():
    print(f"  {k}: {v}")
$ python3 check_yaml.py
PyYAML 6.0.3

claude-changelog.yml: OK
  triggers   : workflow_dispatch
  job        : changelog
  timeout    : 10 min
  permissions: {'contents': 'read', 'id-token': 'write'}
  uses       : ['actions/checkout@v6', 'anthropics/claude-code-action@v1']
  concurrency: {'group': 'claude-changelog', 'cancel-in-progress': True}

claude-code-review.yml: OK
  triggers   : pull_request
  job        : review
  timeout    : 15 min
  permissions: {'contents': 'read', 'pull-requests': 'read', 'issues': 'read', 'id-token': 'write'}
  uses       : ['actions/checkout@v6', 'anthropics/claude-code-action@v1']
  concurrency: {'group': 'claude-review-${{ github.event.pull_request.number }}', 'cancel-in-progress': True}

claude-daily-report.yml: OK
  triggers   : schedule, workflow_dispatch
  job        : report
  timeout    : 10 min
  permissions: {'contents': 'read', 'issues': 'read', 'id-token': 'write'}
  uses       : ['anthropics/claude-code-action@v1']
  concurrency: {'group': 'claude-daily-report', 'cancel-in-progress': False}

claude.yml: OK
  triggers   : issue_comment, pull_request_review_comment
  job        : claude
  timeout    : 20 min
  permissions: {'contents': 'write', 'pull-requests': 'write', 'issues': 'write', 'id-token': 'write', 'actions': 'read'}
  uses       : ['actions/checkout@v6', 'anthropics/claude-code-action@v1']
  concurrency: {'group': 'claude-${{ github.event.issue.number || github.event.pull_request.number }}', 'cancel-in-progress': False}

SKILL.md frontmatter: OK
  name: changelog-draft
  description: 直近のタグから HEAD までのコミットを読み、変更履歴の下書きを日本語で作る
  disable-model-invocation: True
  allowed-tools: Bash(git describe *) Bash(git log *) Bash(git tag *)

ワークフロー専用の静的チェックである actionlint 1.7.12 にも4本を通し、指摘なし(終了コード 0)でした。

$ actionlint -version
1.7.12
$ actionlint .github/workflows/*.yml; echo "exit=$?"
exit=0

PyYAML で確認するときは、on キーが真偽値 True として読まれる点に気を付けます。上のスクリプトでは doc.get("on", doc.get(True)) で両方に対応しています。

入力パラメータ12種の一覧

公式ページが「よく使う入力」として挙げている12種です。どれも anthropics/claude-code-action ステップの with: に書きます。

入力名 役割 必須
prompt Claude への指示。文章でもスキル呼び出しでもよい。省くとトリガーフレーズに応答する いいえ
claude_args Claude Code に渡す CLI 引数 いいえ
anthropic_api_key Claude API のキー Claude API を使う場合に必要(OAuth トークンか OIDC 連携を使うなら不要)
claude_code_oauth_token サブスクリプションで認証する OAuth トークン。claude setup-token で作る いいえ
github_token GitHub 操作用のトークン。省くと Claude GitHub App として認証する いいえ
plugin_marketplaces プラグインのマーケットプレイスの Git URL(改行区切り) いいえ
plugins 実行前に入れるプラグイン名(改行区切り) いいえ
settings Claude Code の設定。JSON 文字列か設定ファイルのパス いいえ
trigger_phrase 反応するトリガーフレーズ。既定は @claude いいえ
use_bedrock Claude API の代わりに Amazon Bedrock を使う いいえ
use_vertex Claude API の代わりに Google Cloud の Agent Platform を使う いいえ
use_foundry Claude API の代わりに Microsoft Foundry を使う いいえ

claude_args でよく使う引数

claude_args には Claude Code の CLI 引数をそのまま書けます。1行でも、| を使った複数行でも構いません。

claude_args: "--max-turns 5 --model claude-sonnet-5 --mcp-config /path/to/config.json"
引数 働き
--max-turns 会話のターン数の上限
--model 使うモデル。省くと既定モデル
--mcp-config MCP 設定ファイルのパス
--allowedTools 許可するツール(カンマ区切り)。--allowed-tools でも同じ
--append-system-prompt 既定のプロンプトに指示を追記する
--debug デバッグ出力を有効にする

起動や絞り込みに使うその他の入力

アクションのリポジトリにある usage.md には、上の12種のほかにも入力が載っています。起動の条件や安全面に関わるものを抜き出します。

入力名 既定値 働き
assignee_trigger なし Issue にこのユーザーが割り当てられたら起動
label_trigger なし Issue にこのラベルが付いたら起動
allowed_bots 空(bot は不可) 起動を許可する bot 名(カンマ区切り)。* で全 bot
allowed_non_write_users 空 write 権限の無いユーザーの許可。github_token 入力と併用
branch_prefix claude/ Claude が作るブランチ名の接頭辞
use_sticky_comment false PR へのコメントを1件にまとめる
track_progress false 進み具合のコメントを付ける
use_commit_signing false GitHub の API でコミットに署名する
include_comments_by_actor 空(全員) 読み込むコメントの投稿者を絞る
exclude_comments_by_actor 空 読み込まないコメントの投稿者

認証方式の比較:APIキー・OAuthトークン・OIDC連携

方式 使う入力 保存するもの 合う場面
APIキー anthropic_api_key ANTHROPIC_API_KEY 組織で共有、従量課金で管理
OAuthトークン claude_code_oauth_token CLAUDE_CODE_OAUTH_TOKEN 個人のサブスクリプションで動かす
OIDC連携 anthropic_federation_rule_id ほか 長期のシークレットなし 長期の鍵を置かない運用
クラウド経由 use_bedrock など 各クラウドの連携設定 自社のクラウド契約で推論する
  • OAuth トークンは claude setup-token を実行した人のサブスクリプションに結び付きます。 複数リポジトリで共有するシークレットには API キーが合います。組織レベルの Actions シークレットに置けば、リポジトリごとに登録し直す手間が省けます。
  • OIDC 連携(workload identity federation)は、ワークフローの GitHub OIDC トークンを Claude API のアクセスに交換する方式です。anthropic_federation_rule_id(fdrl_...)と anthropic_organization_id を指定し、必要に応じて anthropic_service_account_id(svac_...)と anthropic_workspace_id(wrkspc_...)を足します。ジョブには id-token: write が必要です。
  • Bedrock・Agent Platform・Foundry の3つも、API キーではなく OIDC の ID 連携で認証します。
  • OAuth トークンで動かした実行は、API の課金ではなくサブスクリプションの利用枠を使います。

permissions を最小にする

ワークフロー別の permissions

GitHub Actions では、ジョブに permissions を書くと、書いた項目だけが有効になります。4本の YAML の内訳です。

ワークフロー contents PR issues その他
@claude 応答 write write write actions: read
PR 自動レビュー read read read なし
定期レポート read なし read なし
スキル実行 read なし なし なし

4本とも id-token: write を加えています。これはアクションが既定で使う GitHub App 認証に必要な項目です。コードを書き換えるのは1本目だけなので、write を持つのも1本目だけにしてあります。

Claude GitHub App が要求する権限11項目

Claude GitHub App は、このアクションのほか Code Review や Web のセッションの auto-fix でも共通に使われます。GitHub App は機能ごとに権限を分けられないため、インストール時には次の11項目をまとめて許可することになります。

権限 アクセス このアクションでの用途
Actions 読み書き ほかの機能向け
Checks 読み書き ほかの機能向け
Contents 読み書き ファイルの変更、ブランチ作成
Discussions 読み書き ほかの機能向け
Issues 読み書き Issue への応答
Members 読み取り ほかの機能向け
Metadata 読み取り ほかの機能向け
Pull requests 読み書き PR の作成、変更の push
Repository hooks 読み書き ほかの機能向け
Statuses 読み取り ほかの機能向け
Workflows 読み書き ほかの機能向け

このアクションが頼っているのは Contents・Issues・Pull requests の3つです。組織の方針でこの3つだけに絞りたいときは、アクションの setup.md に沿って独自の GitHub App を作る方法があります。その場合に使えるのはこのアクションだけで、Code Review と Web の auto-fix には公式の App が必要です。

App が新しい権限を求めるようになったときは、アカウントの所有者(組織なら組織の所有者)に GitHub から承認の依頼が届き、承認するまでは以前の権限のまま動きます。

誰が起動できるかの判断表

アクションは Claude を動かす前に、起動した人について2つの確認をします。どちらかで外れると、その実行は失敗として終わります。

起動した人・イベント 結果 通したいとき
write 権限のある人のコメント 実行される 設定不要
write 権限の無い人のコメント 実行されない allowed_non_write_users と github_token を指定
bot(Dependabot など) 実行されない allowed_bots に bot 名を列挙
schedule write の確認は対象外。bot の確認はある 最後に cron を変更した人が bot なら allowed_bots に追加
workflow_dispatch write の確認は対象外 設定不要(手動実行できるのは write 権限のある人)
フォークからの PR シークレットが渡らない 同じリポジトリのブランチから PR を出す

設定するときの目安です。

  • allowed_bots は bot 名を1つずつ書くと範囲がはっきりします(例:"dependabot[bot],renovate[bot]")。許可した bot にはリポジトリ権限の確認が行われないため、公開リポジトリで * を使うと外部の App からも起動できる状態になります。あわせてジョブの permissions を最小にしておきます。
  • allowed_non_write_users を使うときは、github_token: ${{ secrets.GITHUB_TOKEN }} を渡します。 このトークンはジョブ単位で自動発行され、入れ替わっていきます。個人アクセストークンは入れ替わらないため、ここでは GITHUB_TOKEN を使い、claude_args で許可するツールも必要な分だけにします。
  • フォークからの PR には、GitHub がシークレットを渡しません(公開リポジトリの場合)。2本目の YAML では head.repo.full_name == github.repository の条件で、同じリポジトリのブランチからの PR だけを対象にしています。
  • pull_request_target や workflow_run はベースリポジトリのシークレットで動きます。使うときは、ワークスペースのルートにはベースブランチを checkout し、PR 側のコードが必要なら path: pr-head のように別ディレクトリへ取り出して --add-dir pr-head で渡す形が公式に示されています。
  • 外部から届く Issue や PR の本文には、表示されない文字や HTML コメントが含まれることがあります。アクションはこれらを取り除いてから Claude に渡します。読み込むコメントの投稿者を絞りたいときは include_comments_by_actor が使えます。

Claude のコミットで CI が動かないときの原因

GitHub は、既定の GITHUB_TOKEN で作られたコミットではワークフローを起動しません。 そのため、アクションに github_token: ${{ secrets.GITHUB_TOKEN }} を渡していると、Claude が push しても CI が始まりません。

直す前(github_token を渡している)

      - uses: anthropics/claude-code-action@v1
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
          github_token: ${{ secrets.GITHUB_TOKEN }}

直した後(行を外して Claude GitHub App として認証する)

      - uses: anthropics/claude-code-action@v1
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}

独自の GitHub App を使っている場合は、その App のトークンを github_token に渡します。あわせて、CI 側のワークフローの on: に、Claude の push で発生するイベント(push や pull_request)が入っているかも見ておきます。

費用に上限をかける設定

1回の実行で使うものは2種類あります。GitHub Actions の実行時間(GitHub ホストのランナーの分数)と、API のトークン(OAuth トークンの場合はサブスクリプションの利用枠)です。次の3つを入れると、どちらにも上限がかかります。

設定 書く場所 抑えられるもの
--max-turns claude_args 1回の実行でのやり取りの回数
timeout-minutes ジョブ 1回の実行時間
concurrency ワークフロー 同時に走る本数

直す前(上限の指定が無い)

jobs:
  claude:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: anthropics/claude-code-action@v1
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}

直した後(3つの上限を入れる)

concurrency:
  group: claude-${{ github.event.issue.number || github.event.pull_request.number }}
  cancel-in-progress: false

jobs:
  claude:
    if: contains(github.event.comment.body, '@claude')
    runs-on: ubuntu-latest
    timeout-minutes: 20
    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 1
      - uses: anthropics/claude-code-action@v1
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
          claude_args: |
            --max-turns 20

cancel-in-progress は用途で使い分けます。PR レビューのように最新の1本があれば足りるものは true、@claude への応答のように途中で止めたくないものは false が合います。

設定のほかに効くのは、依頼の書き方です。

  • @claude への依頼を具体的に書くと、少ないターンで終わります
  • Issue テンプレートで、必要な情報を最初から渡します
  • CLAUDE.md は毎回読み込まれるので、短く保ちます

beta から v1 への対応表

anthropics/claude-code-action@beta のままのワークフローは、次の4点で v1 に移せます。

  1. uses の @beta を @v1 に変える
  2. mode を消す(モードは自動で判定される)
  3. direct_prompt を prompt に変える
  4. max_turns や model などの CLI オプションを claude_args に移す
beta の入力 v1 での書き方 補足
mode 不要(自動判定) prompt の有無で決まる
direct_prompt prompt そのまま置き換え
override_prompt prompt 変数は GitHub のコンテキストで書く
custom_instructions claude_args: --append-system-prompt 既定のプロンプトに追記
max_turns claude_args: --max-turns CLI の書式で書く
model claude_args: --model CLI の書式で書く
allowed_tools claude_args: --allowedTools CLI の書式で書く
disallowed_tools claude_args: --disallowedTools CLI の書式で書く
claude_env settings の env 設定 JSON で渡す
mcp_config claude_args: --mcp-config CLI 引数で渡す
timeout_minutes ジョブの timeout-minutes 入力ではなくジョブに書く

custom_instructions には同名のフラグが無く、--append-system-prompt になります。--system-prompt は既定のプロンプト全体を置き換える別のフラグです。

書き換えの例(beta)

- uses: anthropics/claude-code-action@beta
  with:
    mode: "tag"
    anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
    custom_instructions: "Follow our coding standards"
    max_turns: "10"
    allowed_tools: "Edit,Read,Write"

書き換えの例(v1)

- uses: anthropics/claude-code-action@v1
  with:
    anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
    claude_args: |
      --max-turns 10
      --append-system-prompt "Follow our coding standards"
      --allowedTools Edit,Read,Write

環境変数(claude_env)は、settings に JSON で渡します。

- uses: anthropics/claude-code-action@v1
  with:
    anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
    settings: |
      {
        "env": {
          "NODE_ENV": "test",
          "CI": "true"
        }
      }

うまく動かないときの確認表

症状 確認するところ
@claude に反応しない App がリポジトリに入っているか/ワークフローが有効か/シークレットがあるか
同上 @claude が単語として書かれているか(/claude や @claude-bot では反応しない)
同上 コメントした人に write 権限があるか
Claude のコミットで CI が動かない github_token: ${{ secrets.GITHUB_TOKEN }} を渡していないか
認証エラー キーやトークンが有効か。手元の claude で試してから確認する
レビューがコメントされない --comment と --allowedTools の2行があるか
フォークの PR で失敗する シークレットが渡らない。同じリポジトリのブランチで試す
cron が動かない 既定ブランチに YAML があるか。時刻を UTC で書いたか

よくある質問

Q. API キーとサブスクリプションのどちらで動かせますか? A. どちらでも動きます。API キーは anthropic_api_key、サブスクリプションは claude setup-token で作ったトークンを claude_code_oauth_token に渡します。OAuth トークンは発行した人のサブスクリプションに結び付くため、複数リポジトリで共有するなら API キーか OIDC 連携が合います。

Q. ワークフローを書かずに自動レビューだけ使う方法はありますか? A. 公式には、ワークフローの管理が要らない Code Review という別の機能が用意されています。プロンプト・モデル・トリガーを自分で決めたい場合に、この記事の2本目のようなワークフローを使います。

Q. Claude の作業ルールはどこに書きますか? A. リポジトリのルートに CLAUDE.md を置き、コードの書き方やレビューの観点を書きます。Claude は PR の作成や依頼への応答のときにこの内容に従います。毎回読み込まれるので、短くまとめるのがこつです。

Q. 連携をやめたいときは何を消せばよいですか? A. .github/workflows/ の該当ワークフロー、リポジトリ(と組織)のシークレット、Claude GitHub App の3つです。シークレットを消しても鍵そのものは有効なままなので、API キーを使い終えるときは Claude Console 側でも削除します。App はほかの Claude の機能で使っていない場合に外します。

まとめ

  • 必要なものは3つ:Claude GitHub App、認証用シークレット、anthropics/claude-code-action@v1 を使う YAML
  • prompt なしは対話モード、ありは自動モード。v1 では mode を書かない
  • permissions はジョブごとに最小に。書き込みが要るのは @claude 応答のジョブだけ
  • 起動できるのは write 権限のある人。bot は allowed_bots に名前を書いたものだけ
  • Claude のコミットで CI を動かすには github_token: ${{ secrets.GITHUB_TOKEN }} を渡さない
  • 費用は --max-turns・timeout-minutes・concurrency の3つで上限をかける
  • beta の入力は prompt と claude_args に集約。custom_instructions は --append-system-prompt

参考・出典

いずれも2026年10月7日に確認しました。

  • Claude Code Docs: Claude Code GitHub Actions https://code.claude.com/docs/en/github-actions
  • Claude Code Docs: Skills https://code.claude.com/docs/en/skills
  • Claude Code Docs: Configure permissions https://code.claude.com/docs/en/permissions
  • anthropics/claude-code-action: Usage(入力一覧) https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
  • anthropics/claude-code-action: Migration Guide https://github.com/anthropics/claude-code-action/blob/main/docs/migration-guide.md
  • anthropics/claude-code-action: Security https://github.com/anthropics/claude-code-action/blob/main/docs/security.md

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Claude Code GitHub Actions連携|YAML雛形と入力一覧」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?