Claude Code GitHub Actions
Configure automation using anthropics/claude-code-action with event routing, subagents, hooks, and MCP integration.
Quick Start
name: Claude Code
on:
issue_comment: { types: [created] }
pull_request: { types: [opened, synchronize] }
issues: { types: [opened, labeled] }
permissions:
contents: write
pull-requests: write
issues: write
jobs:
claude:
if: github.actor != 'github-actions[bot]'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
Core Concepts
| Concept |
Purpose |
Details |
| Event Routing |
Route GitHub events to behaviors |
patterns/event-routing.md |
| Subagents |
Parallel execution in isolated contexts |
patterns/subagents.md |
| Hooks |
Quality gates and automation |
patterns/hooks.md |
| MCP Servers |
External tool integration |
official-docs/configuration.md |
| Permissions |
Tool and access control |
patterns/permissions.md |
| Security |
Fork-safe PR handling |
patterns/security.md |
| Reusable Workflows |
Organization-wide sharing |
patterns/reusable-workflows.md |
| Performance |
Optimization patterns |
patterns/performance.md |
| Skills |
Domain expertise |
patterns/skill-usage.md |
| Official Docs |
Upstream documentation |
official-docs/ |
Key Patterns
Event Routing
jobs:
pr-comment:
if: github.event_name == 'issue_comment' && github.event.issue.pull_request
issue-comment:
if: github.event_name == 'issue_comment' && !github.event.issue.pull_request
label-triggered:
if: contains(github.event.issue.labels.*.name, 'claude-implement')
Subagents
prompt: |
Delegate to 3 parallel subagents:
1. Security Agent: OWASP Top 10, auth checks
2. Performance Agent: N+1 queries, memory leaks
3. Style Agent: Naming, documentation, tests
Hooks
{
"hooks": {
"PostToolUse": [{
"matcher": "Edit|Write",
"hooks": [{ "type": "command", "command": "npx prettier --write $(jq -r '.tool_input.file_path')" }]
}],
"Stop": [{
"hooks": [{ "type": "command", "command": "npm run lint && npm test" }]
}]
}
}
Performance
concurrency:
group: claude-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
on:
pull_request:
paths: ['src/**', '!**/*.md']
Tuning Reference
| Scenario |
Max Turns |
Model |
Timeout |
| Triage/labeling |
2-3 |
sonnet |
5 min |
| Code review |
8-12 |
sonnet |
15 min |
| Implementation |
15-20 |
sonnet |
20 min |
| Security audit |
10-15 |
opus |
30 min |
Critical Gotchas
--allowedTools vs --disallowedTools
allowedTools only skips prompts—does NOT restrict tools
- Use
disallowedTools to actually block: --disallowedTools Bash,Run,Edit
MCP + Subagents
- MCP tools do NOT work in background subagents
- Always run MCP operations in foreground
Fork Safety
pull_request event = safe (read-only token, no secrets)
pull_request_target = dangerous if you checkout fork code
- Never:
checkout ref: ${{ github.event.pull_request.head.sha }} with secrets
Hook Exit Codes
0 = continue
2 = block, feed stderr to Claude
- Other = log error, don't block
Subagent Limits
- ~10 concurrent subagents max
- Additional tasks queue
Examples
See examples/ for 14 production-ready use cases:
| # |
Use Case |
Techniques |
| 1 |
Parallel Review Pipeline |
Subagents, concurrency |
| 2 |
ChatOps Command Router |
Event routing, comment parsing |
| 3 |
Issue-to-Implementation |
Label triggers, Stop hooks |
| 4 |
Compliance Firewall |
PreToolUse blocking, PostToolUse formatting |
| 5 |
Security Review |
Path filtering, tool restrictions |
| 6 |
Monorepo Support |
dorny/paths-filter, language skills |
| 7 |
Ticket Sync |
MCP servers (foreground!) |
| 8 |
Fork-Safe Review |
pull_request event, disallowedTools |
| 9 |
Scheduled Maintenance |
Cron, parallel subagents |
| 10 |
Documentation Sync |
Scheduled, MCP |
| 11 |
Dependency Review |
Bot filtering, semver skill |
| 12 |
Release Notes |
Release event, categorization |
| 13 |
Reusable Workflow |
workflow_call, inputs/outputs |
| 14 |
CLAUDE.md Pattern |
Project context, conventions |
Patterns
- Event Routing - Conditions, label routing, author associations
- Subagents - Creation, parallel execution, built-in types
- Hooks - All events, exit codes, JSON parsing, examples
- Permissions - Tool control layers, known issues
- Security - Fork handling, external contributors, safe patterns
- Reusable Workflows - workflow_call, composite actions
- Performance - Concurrency, caching, path filtering
- Skills - Domain expertise, skill structure, hooks
Official Docs
Synced from anthropics/claude-code-action:
- Configuration - MCP servers, settings, custom tools
- Security - API key protection, commit signing
- Usage - Inputs, outputs, migration guide
1---2name: cc-actions3description: Configure Claude Code GitHub Actions workflows effectively. Covers automatic mode detection, event routing, subagent coordination, hooks for quality gates, MCP server integration, reusable workflows, performance optimization, and security best practices for fork-based PRs. Use when working with GitHub Actions, CI/CD automation, PR reviews, issue automation, claude-code-action, chatops, MCP servers, fork safety, or reusable workflows.4---56# Claude Code GitHub Actions78Configure automation using [`anthropics/claude-code-action`](https://github.com/anthropics/claude-code-action) with event routing, subagents, hooks, and MCP integration.910## Quick Start1112```yaml13name: Claude Code14on:15 issue_comment: { types: [created] }16 pull_request: { types: [opened, synchronize] }17 issues: { types: [opened, labeled] }1819permissions:20 contents: write21 pull-requests: write22 issues: write2324jobs:25 claude:26 if: github.actor != 'github-actions[bot]'27 runs-on: ubuntu-latest28 steps:29 - uses: actions/checkout@v430 - uses: anthropics/claude-code-action@v131 with:32 anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}33```3435## Core Concepts3637| Concept | Purpose | Details |38|---------|---------|---------|39| **Event Routing** | Route GitHub events to behaviors | [patterns/event-routing.md](patterns/event-routing.md) |40| **Subagents** | Parallel execution in isolated contexts | [patterns/subagents.md](patterns/subagents.md) |41| **Hooks** | Quality gates and automation | [patterns/hooks.md](patterns/hooks.md) |42| **MCP Servers** | External tool integration | [official-docs/configuration.md](official-docs/configuration.md) |43| **Permissions** | Tool and access control | [patterns/permissions.md](patterns/permissions.md) |44| **Security** | Fork-safe PR handling | [patterns/security.md](patterns/security.md) |45| **Reusable Workflows** | Organization-wide sharing | [patterns/reusable-workflows.md](patterns/reusable-workflows.md) |46| **Performance** | Optimization patterns | [patterns/performance.md](patterns/performance.md) |47| **Skills** | Domain expertise | [patterns/skill-usage.md](patterns/skill-usage.md) |48| **Official Docs** | Upstream documentation | [official-docs/](official-docs/) |4950## Key Patterns5152### Event Routing5354```yaml55jobs:56 pr-comment:57 if: github.event_name == 'issue_comment' && github.event.issue.pull_request58 issue-comment:59 if: github.event_name == 'issue_comment' && !github.event.issue.pull_request60 label-triggered:61 if: contains(github.event.issue.labels.*.name, 'claude-implement')62```6364### Subagents6566```yaml67prompt: |68 Delegate to 3 parallel subagents:69 1. Security Agent: OWASP Top 10, auth checks70 2. Performance Agent: N+1 queries, memory leaks71 3. Style Agent: Naming, documentation, tests72```7374### Hooks7576```json77{78 "hooks": {79 "PostToolUse": [{80 "matcher": "Edit|Write",81 "hooks": [{ "type": "command", "command": "npx prettier --write $(jq -r '.tool_input.file_path')" }]82 }],83 "Stop": [{84 "hooks": [{ "type": "command", "command": "npm run lint && npm test" }]85 }]86 }87}88```8990### Performance9192```yaml93concurrency:94 group: claude-${{ github.workflow }}-${{ github.ref }}95 cancel-in-progress: true9697on:98 pull_request:99 paths: ['src/**', '!**/*.md']100```101102## Tuning Reference103104| Scenario | Max Turns | Model | Timeout |105|----------|-----------|-------|---------|106| Triage/labeling | 2-3 | sonnet | 5 min |107| Code review | 8-12 | sonnet | 15 min |108| Implementation | 15-20 | sonnet | 20 min |109| Security audit | 10-15 | opus | 30 min |110111## Critical Gotchas1121131. **`--allowedTools` vs `--disallowedTools`**114 - `allowedTools` only skips prompts—does NOT restrict tools115 - Use `disallowedTools` to actually block: `--disallowedTools Bash,Run,Edit`1161172. **MCP + Subagents**118 - MCP tools do NOT work in background subagents119 - Always run MCP operations in foreground1201213. **Fork Safety**122 - `pull_request` event = safe (read-only token, no secrets)123 - `pull_request_target` = dangerous if you checkout fork code124 - Never: `checkout ref: ${{ github.event.pull_request.head.sha }}` with secrets1251264. **Hook Exit Codes**127 - `0` = continue128 - `2` = block, feed stderr to Claude129 - Other = log error, don't block1301315. **Subagent Limits**132 - ~10 concurrent subagents max133 - Additional tasks queue134135## Examples136137See [examples/](examples/) for 14 production-ready use cases:138139| # | Use Case | Techniques |140|---|----------|------------|141| 1 | Parallel Review Pipeline | Subagents, concurrency |142| 2 | ChatOps Command Router | Event routing, comment parsing |143| 3 | Issue-to-Implementation | Label triggers, Stop hooks |144| 4 | Compliance Firewall | PreToolUse blocking, PostToolUse formatting |145| 5 | Security Review | Path filtering, tool restrictions |146| 6 | Monorepo Support | dorny/paths-filter, language skills |147| 7 | Ticket Sync | MCP servers (foreground!) |148| 8 | Fork-Safe Review | pull_request event, disallowedTools |149| 9 | Scheduled Maintenance | Cron, parallel subagents |150| 10 | Documentation Sync | Scheduled, MCP |151| 11 | Dependency Review | Bot filtering, semver skill |152| 12 | Release Notes | Release event, categorization |153| 13 | Reusable Workflow | workflow_call, inputs/outputs |154| 14 | CLAUDE.md Pattern | Project context, conventions |155156## Patterns157158- [Event Routing](patterns/event-routing.md) - Conditions, label routing, author associations159- [Subagents](patterns/subagents.md) - Creation, parallel execution, built-in types160- [Hooks](patterns/hooks.md) - All events, exit codes, JSON parsing, examples161- [Permissions](patterns/permissions.md) - Tool control layers, known issues162- [Security](patterns/security.md) - Fork handling, external contributors, safe patterns163- [Reusable Workflows](patterns/reusable-workflows.md) - workflow_call, composite actions164- [Performance](patterns/performance.md) - Concurrency, caching, path filtering165- [Skills](patterns/skill-usage.md) - Domain expertise, skill structure, hooks166167## Official Docs168169Synced from [anthropics/claude-code-action](https://github.com/anthropics/claude-code-action):170171- [Configuration](official-docs/configuration.md) - MCP servers, settings, custom tools172- [Security](official-docs/security.md) - API key protection, commit signing173- [Usage](official-docs/usage.md) - Inputs, outputs, migration guide