Presentation
Skills, MCP Servers, Hooks, Plugins & more
Use → to begin
Persistent project context
Custom slash commands
External integrations
Event-based automation
Shareable extension packs
Permissions & config
Claude Code has 5 extension layers that build on each other:
| Layer | Purpose | Analogy |
|---|---|---|
| CLAUDE.md | Tell Claude about your project | Onboarding doc for a new dev |
| Skills | Reusable prompt templates | Macros / keyboard shortcuts |
| MCP Servers | Connect to external services | VS Code extensions |
| Hooks | Auto-run scripts on events | Git hooks / CI triggers |
| Plugins | Package everything together | npm packages |
1 of 5
Markdown files that give Claude persistent context about your project.
Loaded automatically at the start of every session. No need to re-explain anything.
./CLAUDE.md — project (shared)./CLAUDE.local.md — personal~/.claude/CLAUDE.md — global.claude/rules/*.md — modularCLAUDE.md
# My App ## Tech Stack TypeScript, React 18, PostgreSQL ## Commands - `npm test` — Run tests - `npm run dev` — Dev server ## Rules - 2-space indentation - Prefer const over let - Always write tests
File: .claude/rules/api.md
--- paths: - "src/api/**/*.ts" --- All API endpoints must: - Include input validation - Return standard error format
Rules only apply when Claude works on matching files.
Quick start: type /init in Claude Code to auto-generate one.
2 of 5
Markdown files that become reusable /commands.
You type /name and Claude follows the instructions in the file.
Personal (all projects): ~/.claude/skills/name/SKILL.md Project (shared via git): .claude/skills/name/SKILL.md
user-invocable — you can call itdisable-model-invocation — only manualargument-hint — autocomplete hintallowed-tools — skip permissionscontext: fork — isolated sub-agentSkills
--- name: review description: Review code for bugs user-invocable: true argument-hint: "[file]" allowed-tools: Read, Grep, Glob --- Review the code for: 1. Bugs and logic errors 2. Security vulnerabilities 3. Performance issues Suggest fixes for each issue.
--- name: pr-review context: fork --- Review this PR: # Shell output injected at runtime! Diff: !`gh pr diff` Files: !`gh pr diff --name-only` Summarize and flag concerns.
!`command` runs the command and injects the output before Claude sees the skill.
Skills
--- name: fix-issue argument-hint: "[issue-number]" --- Fix GitHub issue #$ARGUMENTS. Read the issue, understand the problem, implement a fix. # Usage: /fix-issue 123 # Claude sees: Fix GitHub issue #123.
| Variable | Value |
|---|---|
$ARGUMENTS | All arguments as a string |
$0, $1, $2 | Individual arguments by position |
${CLAUDE_SESSION_ID} | Current session ID |
!`command` | Output of a shell command |
3 of 5
Connect Claude to external tools — databases, APIs, SaaS platforms.
MCP = Model Context Protocol. A standard way for AI tools to talk to services.
# GitHub claude mcp add \ --transport http github \ https://api.githubcopilot.com/mcp/ # Then authenticate: /mcp
# PostgreSQL claude mcp add \ --transport stdio mydb \ -- npx -y @bytebase/dbhub \ --dsn "postgresql://..."
MCP Servers
🐙
PRs, issues, reviews, code search
🚨
Error monitoring, stack traces
🗃
Query databases naturally
📝
Knowledge base access
💬
Messaging & notifications
💳
Payment data & management
{ "mcpServers": { "github": { "type": "http", "url": "https://api.githubcopilot.com/mcp/" } } }
Commit .mcp.json to git → everyone on the team gets the same servers.
4 of 5
Shell commands that run automatically when events happen.
Enforce rules, auto-format code, send notifications — without thinking about it.
| Event | When It Fires | Can Block? |
|---|---|---|
PreToolUse | Before Claude uses a tool | Yes |
PostToolUse | After a tool succeeds | No |
UserPromptSubmit | You submit a prompt | Yes |
Stop | Claude finishes responding | Yes |
SessionStart | Session begins | No |
Notification | Permission prompt appears | No |
Blocking: exit code 0 = allow, exit code 2 = block the action.
Hooks
"PostToolUse": [{ "matcher": "Edit|Write", "hooks": [{ "type": "command", "command": "jq -r '.tool_input.file_path' | xargs prettier --write" }] }]
"PreToolUse": [{ "matcher": "Edit|Write", "hooks": [{ "type": "command", "command": "jq -r '.tool_input.file_path' | grep -q '.env' && exit 2 || exit 0" }] }]
"Notification": [{ "matcher": "permission_prompt", "hooks": [{ "type": "command", "command": "osascript -e 'display notification \"Claude needs attention\"'" }] }]
"PostToolUse": [{ "matcher": "Bash", "hooks": [{ "type": "command", "command": "jq -r '.tool_input.command' >> ~/.claude/cmds.log" }] }]
5 of 5
Bundle skills + hooks + MCP servers + agents into one distributable package.
my-plugin/ ├── .claude-plugin/ │ └── plugin.json ← manifest ├── skills/ │ └── review/SKILL.md ├── agents/ │ └── analyzer.md ├── hooks/ │ └── hooks.json └── .mcp.json ← integrations
{
"name": "my-plugin",
"description": "What it does",
"version": "1.0.0"
}
Test locally:
claude --plugin-dir ./my-plugin
# Skills are namespaced:
/my-plugin:review
Plugins
| Situation | Solution |
|---|---|
| Customizing one project | Standalone: .claude/skills/, .claude/settings.json |
| Your personal workflows | Personal: ~/.claude/skills/ |
| Share with your team | Plugin |
| Publish to the community | Plugin + marketplace repo |
| Versioned releases | Plugin |
/plugin # Browse marketplace /plugin install # Install /plugin enable name # Enable / disable /plugin uninstall name # Remove
Bonus
Control what Claude can and can't do in .claude/settings.json:
{
"permissions": {
"allow": [
"Bash(npm run *)",
"Bash(git *)",
"Read(./src/**)"
],
"deny": [
"Bash(rm *)",
"Read(.env*)"
]
}
}
| 1. | .claude/settings.local.json | personal |
| 2. | .claude/settings.json | team |
| 3. | ~/.claude/settings.json | global |
Interactive setup: type /config
| I want to... | Use | How |
|---|---|---|
| Tell Claude about my project | CLAUDE.md | /init |
| Create a reusable command | Skill | .claude/skills/name/SKILL.md |
| Connect to GitHub / DB / API | MCP | claude mcp add ... |
| Auto-format after edits | Hook | PostToolUse in settings.json |
| Block dangerous commands | Hook | PreToolUse with exit 2 |
| Allow npm test always | Settings | "allow": ["Bash(npm test *)"] |
| Share config with team | Plugin | .claude-plugin/plugin.json |
| See what's loaded | Commands | /memory /mcp /config |
/init to create a CLAUDE.md.claude/rules/ for organized guidelinesStart with what solves a real problem today.
You don't need all 5 layers. Most teams start with CLAUDE.md + one or two skills.
Thank you
Claude Code Extensibility