← Anyone Can Code
Asaf Avigal

Presentation

Claude Code
Extensibility

Skills, MCP Servers, Hooks, Plugins & more

Use to begin

What We'll Cover

CLAUDE.md

Persistent project context

/

Skills

Custom slash commands

MCP Servers

External integrations

Hooks

Event-based automation

Plugins

Shareable extension packs

Settings

Permissions & config

The Big Picture

Claude Code has 5 extension layers that build on each other:

CLAUDE.mdcontext & rules
Skillsreusable prompts
MCPexternal tools
Hooksautomation
Pluginsbundle & share
LayerPurposeAnalogy
CLAUDE.mdTell Claude about your projectOnboarding doc for a new dev
SkillsReusable prompt templatesMacros / keyboard shortcuts
MCP ServersConnect to external servicesVS Code extensions
HooksAuto-run scripts on eventsGit hooks / CI triggers
PluginsPackage everything togethernpm packages

1 of 5

CLAUDE.md — Custom Instructions

Markdown files that give Claude persistent context about your project.

Loaded automatically at the start of every session. No need to re-explain anything.

What goes in it?

  • Tech stack & architecture
  • Common commands (test, build, lint)
  • Code conventions & style rules
  • Project-specific patterns

Where to put it

  • ./CLAUDE.md — project (shared)
  • ./CLAUDE.local.md — personal
  • ~/.claude/CLAUDE.md — global
  • .claude/rules/*.md — modular

CLAUDE.md

Example

CLAUDE.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

Path-specific rules

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

Skills — Custom Slash Commands

Markdown files that become reusable /commands.

You type /name and Claude follows the instructions in the file.

Where they live

Personal (all projects):
~/.claude/skills/name/SKILL.md

Project (shared via git):
.claude/skills/name/SKILL.md

Key options

  • user-invocable — you can call it
  • disable-model-invocation — only manual
  • argument-hint — autocomplete hint
  • allowed-tools — skip permissions
  • context: fork — isolated sub-agent

Skills

Example: Code Review Skill

SKILL.md

---
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.

Advanced: Dynamic Content

---
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

Arguments & Variables

---
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.
VariableValue
$ARGUMENTSAll arguments as a string
$0, $1, $2Individual arguments by position
${CLAUDE_SESSION_ID}Current session ID
!`command`Output of a shell command

3 of 5

MCP Servers — External Integrations

Connect Claude to external tools — databases, APIs, SaaS platforms.

MCP = Model Context Protocol. A standard way for AI tools to talk to services.

Remote (cloud-hosted)

# GitHub
claude mcp add \
  --transport http github \
  https://api.githubcopilot.com/mcp/

# Then authenticate:
/mcp

Local (your machine)

# PostgreSQL
claude mcp add \
  --transport stdio mydb \
  -- npx -y @bytebase/dbhub \
  --dsn "postgresql://..."

MCP Servers

Popular Integrations

🐙

GitHub

PRs, issues, reviews, code search

🚨

Sentry

Error monitoring, stack traces

🗃

PostgreSQL

Query databases naturally

📝

Notion

Knowledge base access

💬

Slack

Messaging & notifications

💳

Stripe

Payment data & management

Sharing with your team (.mcp.json)

{ "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

Hooks — Automated Triggers

Shell commands that run automatically when events happen.

Enforce rules, auto-format code, send notifications — without thinking about it.

EventWhen It FiresCan Block?
PreToolUseBefore Claude uses a toolYes
PostToolUseAfter a tool succeedsNo
UserPromptSubmitYou submit a promptYes
StopClaude finishes respondingYes
SessionStartSession beginsNo
NotificationPermission prompt appearsNo

Blocking: exit code 0 = allow, exit code 2 = block the action.

Hooks

Practical Examples

Auto-format after edits

"PostToolUse": [{
  "matcher": "Edit|Write",
  "hooks": [{
    "type": "command",
    "command": "jq -r '.tool_input.file_path'
      | xargs prettier --write"
  }]
}]

Block editing .env files

"PreToolUse": [{
  "matcher": "Edit|Write",
  "hooks": [{
    "type": "command",
    "command": "jq -r '.tool_input.file_path'
      | grep -q '.env'
      && exit 2 || exit 0"
  }]
}]

Desktop notification

"Notification": [{
  "matcher": "permission_prompt",
  "hooks": [{
    "type": "command",
    "command": "osascript -e
      'display notification
      \"Claude needs attention\"'"
  }]
}]

Log all bash commands

"PostToolUse": [{
  "matcher": "Bash",
  "hooks": [{
    "type": "command",
    "command": "jq -r '.tool_input.command'
      >> ~/.claude/cmds.log"
  }]
}]

5 of 5

Plugins — Shareable Extension Packs

Bundle skills + hooks + MCP servers + agents into one distributable package.

Plugin structure

my-plugin/
├── .claude-plugin/
│   └── plugin.json    ← manifest
├── skills/
│   └── review/SKILL.md
├── agents/
│   └── analyzer.md
├── hooks/
│   └── hooks.json
└── .mcp.json          ← integrations

Minimal manifest

{
  "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

When to Use What?

SituationSolution
Customizing one projectStandalone: .claude/skills/, .claude/settings.json
Your personal workflowsPersonal: ~/.claude/skills/
Share with your teamPlugin
Publish to the communityPlugin + marketplace repo
Versioned releasesPlugin

Plugin commands

/plugin                  # Browse marketplace
/plugin install          # Install
/plugin enable name      # Enable / disable
/plugin uninstall name   # Remove

Bonus

Settings & Permissions

Control what Claude can and can't do in .claude/settings.json:

Permission rules

{
  "permissions": {
    "allow": [
      "Bash(npm run *)",
      "Bash(git *)",
      "Read(./src/**)"
    ],
    "deny": [
      "Bash(rm *)",
      "Read(.env*)"
    ]
  }
}

Settings file priority

1..claude/settings.local.jsonpersonal
2..claude/settings.jsonteam
3.~/.claude/settings.jsonglobal

Interactive setup: type /config

Cheat Sheet

I want to...UseHow
Tell Claude about my projectCLAUDE.md/init
Create a reusable commandSkill.claude/skills/name/SKILL.md
Connect to GitHub / DB / APIMCPclaude mcp add ...
Auto-format after editsHookPostToolUse in settings.json
Block dangerous commandsHookPreToolUse with exit 2
Allow npm test alwaysSettings"allow": ["Bash(npm test *)"]
Share config with teamPlugin.claude-plugin/plugin.json
See what's loadedCommands/memory /mcp /config

Getting Started

Start simple

  • Run /init to create a CLAUDE.md
  • Add one MCP server you use daily
  • Create one skill for a repetitive task

Scale up later

  • Add hooks for formatting & protection
  • Use .claude/rules/ for organized guidelines
  • Bundle into a plugin for your team

Start 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

CLAUDE.md
Skills
MCP
Hooks
Plugins