mcpbeat

Claude Code Hooks

aiskillstore/claude-code-hooks

Claude Code hook system for pre/post tool execution. Triggers on: hooks, PreToolUse, PostToolUse, hook script, tool validation, audit logging.

This is a copy. The original lives at comeonoliver/claude-code-hooks.

31k tokens
context cost
the whole folder, loaded on every use
5
files
instructions only
0
copies elsewhere
how many repositories repackaged it
404
stars on the repo
on the repository, not the skill itself

Install

one command, takes just this skill from the repository
npx skills add https://github.com/aiskillstore/marketplace --skill claude-code-hooks

What comes with it

122 525 bytes besides the instruction
references/configuration.md
references/hook-events.md
references/security-patterns.md
skill-report.json

What it tells the agent to use

found in the instruction text
Write writes files
Task spawns other agents

The instruction itself

10 sections, as written by the author

Claude Code Hooks

Execute custom scripts before/after Claude Code tool invocations.

Quick Reference

| Event | When | Has Matcher |

|-------|------|-------------|

| PreToolUse | Before tool execution | Yes |

| PostToolUse | After tool completes | Yes |

| PermissionRequest | Permission dialog shown | Yes |

| Notification | Notifications sent | Yes |

| UserPromptSubmit | User submits prompt | No |

| Stop | Agent finishes | No |

| SubagentStop | Subagent finishes | No |

| PreCompact | Before context compaction | No |

| SessionStart | Session begins/resumes | No |

| SessionEnd | Session ends | No |

Basic Configuration

Add to ~/.claude/settings.json or .claude/settings.local.json:

{
  "hooks": {
    "PreToolUse": [{
      "matcher": "Bash",
      "hooks": [{
        "type": "command",
        "command": "$CLAUDE_PROJECT_DIR/hooks/validate.sh",
        "timeout": 5000
      }]
    }]
  }
}

Matcher Patterns

| Pattern | Matches |

|---------|---------|

| "Write" | Only Write tool |

| "*" or "" | All tools |

| "mcp__*" | All MCP tools |

| "Bash" | Bash commands |

Hook Script Requirements

#!/bin/bash
# Receives JSON via stdin: { "tool_name": "...", "tool_input": {...} }
INPUT=$(cat)
TOOL=$(echo "$INPUT" | jq -r '.tool_name')

# Exit codes:
# 0 = Success (continue)
# 2 = Block with error (stderr shown to Claude)
# Other = Non-blocking error

Common Use Cases

| Use Case | Event | Example |

|----------|-------|---------|

| Validate inputs | PreToolUse | Block dangerous commands |

| Audit logging | PostToolUse | Log all tool usage |

| Custom approval | PermissionRequest | Slack notification |

| Session init | SessionStart | Load project context |

Security Checklist

  • [ ] Quote all variables: "$VAR" not $VAR
  • [ ] Validate paths (no .. traversal)
  • [ ] Use $CLAUDE_PROJECT_DIR for paths
  • [ ] Set reasonable timeouts
  • [ ] Handle jq parsing errors

Troubleshooting

# Debug hook loading
claude --debug

# List registered hooks
/hooks

# Test script manually
echo '{"tool_name":"Bash"}' | ./hooks/validate.sh

Official Documentation

  • https://code.claude.com/docs/en/hooks - Hooks reference
  • https://code.claude.com/docs/en/settings - Settings configuration

Additional Resources

  • ./references/hook-events.md - All events with input/output schemas
  • ./references/configuration.md - Advanced config patterns
  • ./references/security-patterns.md - Production security

See Also: claude-code-debug for troubleshooting, claude-code-headless for CLI automation

How to use it

Copy the folder

Take aiskillstore/claude-code-hooks from the repository into ~/.claude/skills for personal use, or into .claude/skills inside a project.

Check the name does not clash

The agent identifies a skill by the name field in its header. Two skills with the same name cannot sit side by side — one of them will be ignored.