Skip to main content

Command Palette

Search for a command to run...

CLAUDE.md, Skills, Hooks, Subagents and MCP — I Finally Get the Difference

Updated
3 min read
C

#developerlife Computer system engineering, software architecture, development and maintenance while drinking coffee

A few days ago I finished Anthropic's Introduction to Agent Skills course, and honestly one section hit me harder than I expected. Not because it was complex, but because I had been doing it wrong — or at least, less efficiently than I could.

The course covers five customization options in Claude Code: CLAUDE.md, Skills, Hooks, Subagents, and MCP Servers. On paper they sound like variations of the same thing. They're not. Each one solves a completely different problem, and once that clicked for me, I started mentally refactoring everything I had set up.

CLAUDE.md is the one most people start with, and for good reason — it's the simplest to understand. Whatever you put in there loads into every single conversation, always. That's it. So it's best for things that should always be true in your project: "use TypeScript strict mode", "never modify the database schema directly", "we use Tailwind, not plain CSS". These are constraints that apply whether you're writing code, reviewing a PR, or debugging a nasty race condition at 2am. It's your always-on project bible.

Skills are different. They load on demand, when Claude detects the topic in your request. Your PR review checklist doesn't need to live in every conversation — it only matters when you're actually doing a review. Same with deployment runbooks, architecture decision templates, or incident response procedures. The skill activates when you need it, not before. I had been cramming this kind of task-specific expertise into my CLAUDE.md and then wondering why conversations felt bloated with irrelevant context. Turns out that's exactly the wrong move.

The one that surprised me most was Hooks. I had assumed hooks were just another way to inject instructions. They're not — they're event-driven. A hook fires when something happens in the system: a file gets saved, a tool call is about to execute. You don't ask for a hook, it just runs. So if you want a linter to run every time Claude saves a file, that's a hook. If you want validation before a specific tool call, that's also a hook. They handle automated side effects of Claude's actions. Skills inform how Claude thinks. Hooks react to what Claude does.

Subagents are the most architecturally interesting one. When you spin up a subagent, it runs in a completely separate context. You hand it a task, it works independently, it returns results. It doesn't know what's in your main conversation and your main conversation doesn't get cluttered with its working memory. This is perfect for delegated work — parallel research, isolated code generation, anything where you want separation between the main thread and the delegated task. I had been trying to do all of this in one long conversation and it was getting messy.

And then there's MCP Servers, which the course correctly calls "a different category entirely." While the other four features customize how Claude thinks and acts within a session, MCP is about giving Claude access to external tools and integrations — APIs, databases, SaaS platforms. It's not really comparable to skills or hooks. It's infrastructure.

The mental model I came out with: CLAUDE.md is always-on project memory, Skills are on-demand expertise, Hooks are event triggers, Subagents are isolated workers, and MCP is your external toolbelt. Use all five. Don't force everything into one.

BTW, if you're using Claude Code and you haven't gone through this course yet, do yourself a favor and check it out at anthropic.skilljar.com. The section on skills vs subagents alone is worth the time.