The Five Ways to Customize Claude Code

The Five Ways to Customize Claude Code
Claude Code ships with five customization mechanisms — CLAUDE.md, Skills, Sub-agents, Hooks, and MCP servers — and each one solves a different problem. Here's how I think about each one in practice.

Claude Code ships with five customization mechanisms — CLAUDE.md, Skills, Sub-agents, Hooks, and MCP servers — and each one solves a different problem. Choosing the wrong one means either cluttering every conversation with irrelevant context or missing critical instructions when they matter most.

After watching Anthropic's breakdown of these tools, I wanted to distill the key ideas and share how I think about each one in practice.

CLAUDE.md — Always-On Project Standards

CLAUDE.md loads into every single conversation. It's the equivalent of a project's .editorconfig or .rubocop.yml — rules that apply unconditionally.

Use it for:

  • Framework preferences — "Use TypeScript strict mode" or "Follow Rails conventions"
  • Hard constraints — "Never modify the database schema directly" or "Always run tests before committing"
  • Coding style — Naming conventions, file organization patterns, preferred libraries

The key principle: if the instruction is relevant regardless of what task you're working on, it belongs in CLAUDE.md.

What doesn't belong here: detailed checklists, task-specific procedures, or domain knowledge that only applies sometimes. That's what Skills are for.

Skills — On-Demand Expertise

Skills are the opposite of CLAUDE.md in one important way: they load on demand, only when Claude matches your request to a relevant skill.

Think of it this way: your PR review checklist doesn't need to be in context when you're writing new code. It activates when you ask for a review. A deployment procedure loads when you mention deploying.

Use Skills for:

  • Task-specific expertise — Review checklists, deployment guides, content templates
  • Knowledge that's only relevant sometimes — Regulatory references, API documentation, style guides for specific content types
  • Detailed procedures that would add noise if they were always present

The distinction is simple: CLAUDE.md is "always apply this", Skills are "apply this when the topic comes up."

Sub-Agents — Isolated Execution Contexts

Skills add knowledge to your current conversation — they enhance Claude's reasoning within the same context. Sub-agents are fundamentally different: they run in a separate context entirely.

A sub-agent receives a task, works on it independently with its own tool access, and returns results back to your main conversation. The main conversation and the sub-agent are isolated from each other.

Use Sub-agents when:

  • You want to delegate a task to a separate execution context
  • The delegated work needs different tool access than your main conversation
  • You want isolation between the delegated work and what you're doing — so one doesn't pollute the other

The mental model: Skills are like calling a colleague over to look at your screen. Sub-agents are like sending a task to a colleague who works on it at their own desk and brings you back the results.

Hooks — Event-Driven Automation

Hooks fire on events, not on requests. This is the critical distinction from Skills.

A Hook might run a linter every time Claude saves a file, validate input before certain tool calls, or trigger automated side effects after Claude performs an action. They're reactive — they respond to what Claude does, not what you ask.

Use Hooks for:

  • Operations that should run on every file save — linting, formatting, validation
  • Validation before specific tool calls — sanity checks, safety guards
  • Automated side effects — logging, notifications, synchronization

Meanwhile, Skills are request-driven: they activate based on what you're asking Claude to do. Hooks are event-driven: they activate based on what Claude is doing.

MCP Servers — External Tool Integration

MCP (Model Context Protocol) servers provide external tools and data sources that Claude can use. While the other four mechanisms customize Claude's behavior and knowledge, MCP servers extend what Claude can actually do.

They connect Claude to external systems — databases, APIs, file systems, third-party services — giving it capabilities beyond its built-in tools.

Putting It All Together

A well-configured setup typically combines multiple mechanisms, each handling its own specialty:

Mechanism When It Applies What It Does
CLAUDE.md Every conversation Project-wide standards and constraints
Skills When topic matches Task-specific expertise and procedures
Sub-agents When delegating Isolated task execution with separate context
Hooks On specific events Automated operations triggered by actions
MCP Servers When external tools needed Connections to external systems and data

The key insight is: don't force everything into one mechanism. If you're putting detailed review checklists in CLAUDE.md, you're adding noise to every conversation. If you're trying to use Skills for automated validation on file saves, you're using the wrong tool.

Each mechanism has a clear purpose. Match the mechanism to the need, and combine them for comprehensive customization.

My Setup as an Example

For context, on the Rails projects I work on, my approach looks roughly like this:

  • CLAUDE.md: Rails conventions, test commands, deployment constraints, coding style preferences
  • Skills: Content creation templates, PR review checklists, compliance reference material
  • Hooks: Running RuboCop on saved files, validating migrations
  • MCP Servers: Connecting to project management tools, calendar, email

The result is a Claude that knows my project's rules at all times, brings in specialized knowledge when relevant, automates repetitive checks, and can interact with external services — all without any single conversation being overloaded with irrelevant context.