The Navigator · 11 min mission

Skills: Reusable Expertise for Claude

Package workflows as skills Claude discovers and applies on its own.

skillsautomationcustomizationFact-checked 2026-06-13
On this page

You have probably done this: pasted the same five-step deploy checklist into chat for the third time this week, or re-explained how your team writes API endpoints to a fresh session that has no memory of the last one. A skill is how you stop. Write the procedure down once as a SKILL.md file, and Claude adds it to its toolkit — it reaches for that expertise on its own when the moment calls for it, or you summon it directly with /skill-name.

Anthropic announced Agent Skills on October 16, 2025, and the framing is worth keeping in mind: a skill is a folder of instructions, scripts, and resources that Claude loads only when it needs them. That last clause is the whole trick. A skill can carry a thousand lines of reference material and cost almost nothing until the moment it is relevant.

What a skill actually is

Strip away the features and a skill is a directory with one required file, SKILL.md, that has two parts: YAML frontmatter that tells Claude when to use the skill, and a markdown body that tells Claude what to do once it does. The directory name becomes the command you type. Drop SKILL.md into ~/.claude/skills/changelog/ and you have a /changelog skill, available across every project on your machine.

The mental model that matters: CLAUDE.md is a fact that rides in context every single session whether you need it or not. A skill is a capability that sits dormant until it is summoned. When a checklist or multi-step procedure has outgrown a line in CLAUDE.md, that is the signal to move it into a skill.

~/.claude/skills/summarize-changes/SKILL.md
yaml
---
description: Summarizes uncommitted changes and flags anything risky. Use when the user asks what changed, wants a commit message, or asks to review their diff.
---
 
## Current changes
 
!`git diff HEAD`
 
## Instructions
 
Summarize the changes above in two or three bullet points, then list
any risks you notice — missing error handling, hardcoded values, or
tests that need updating. If the diff is empty, say there are no
uncommitted changes.

Anatomy: frontmatter and body

In the example above, only one frontmatter field is present — description — and that is by design. Every frontmatter field is technically optional, but description is the one field Anthropic recommends you always write, because it is the single thing Claude reads to decide whether the skill is relevant. If you omit it, Claude falls back to the first paragraph of the body, which is rarely as sharp.

Two more fields shape behavior. name sets the display label in skill listings; if you leave it off, it defaults to the directory name. (On the Claude API and claude.ai, where there is no directory, name is required and must be lowercase letters, numbers, and hyphens, max 64 characters, and may not contain the reserved words "anthropic" or "claude".) And allowed-tools pre-approves specific tools so Claude can use them without stopping to ask you — more on that below.

Notice the !git diff HEAD`` line. That is dynamic context injection: Claude Code runs the command and splices its output into the skill before Claude ever reads it. The skill arrives with your actual working-tree diff already inlined, so Claude reasons over real data instead of guessing. This is preprocessing, not something Claude executes — it only sees the finished, rendered prompt.

Progressive disclosure: the three levels

This is why skills scale. A skill loads in stages, and each stage only pays for itself when it is actually used.

The genius is in Level 1. Because only the name and description sit in context at startup — roughly a hundred tokens each — you can install dozens of skills with almost no overhead. Claude knows each one exists and when to use it, but the actual instructions stay on disk. When your request matches a description, Claude reads the SKILL.md body off the filesystem and only then does Level 2 enter the context window. Level 3 goes further still: a skill can bundle a 2,000-line API reference, a database schema, and a Python script, and those cost zero tokens until Claude reads the specific one a task needs. When Claude runs a bundled script via bash, the script's code never enters context — only its output does, which makes a tested script far cheaper and more reliable than regenerating the same logic from scratch every time.

LevelWhat it isWhen it loadsToken cost
1 — Metadataname + description from the frontmatterAlways, at startup (in the system prompt)~100 tokens per skill
2 — InstructionsThe SKILL.md markdown bodyOnly when the skill is triggeredUnder ~5k tokens
3 — ResourcesBundled files: reference docs, templates, scriptsOnly when Claude reads or runs themEffectively unlimited
Progressive disclosure: three levels, three load times. Approximate token costs are from the official Agent Skills overview.

Letting Claude discover and invoke skills

When a session starts, Claude Code injects every available skill's metadata into context. From then on, two paths trigger a skill. You can invoke it explicitly by typing /skill-name. Or Claude can invoke it automatically: when something you ask matches a skill's description, Claude pulls the body in on its own. Both paths can pass arguments — /fix-issue 123 substitutes 123 into the skill's $ARGUMENTS placeholder.

This makes the description the single most important sentence you will write. It is the matching surface. A vague description means Claude never reaches for the skill; an overeager one means it fires when you did not want it. The official guidance is concrete: state both what the skill does and when to use it, and lead with concrete trigger phrases a user would actually say. "Use when the user asks what changed or wants a commit message" gives Claude real anchors. "Helps with git stuff" gives it nothing. If Claude ever ignores a skill you expected it to use, the description is almost always the culprit — add keywords a user would naturally say, confirm the skill is even visible by asking "What skills are available?", and as a fallback invoke it directly with /skill-name. The mirror problem, a skill firing too often, is fixed by making the description more specific or by adding disable-model-invocation: true so only you can trigger it.

Two descriptions, two outcomes

Won't trigger

description: Helps with PDFs

No trigger words, no "when." Claude cannot tell whether your request about a form, a report, or a document extraction should pull this in — so it usually does not.

Triggers reliably

description: Extract text and tables from PDF files, fill forms, merge documents. Use when working with PDF files or when the user mentions PDFs, forms, or document extraction.

What it does and the exact phrases that should summon it. Claude matches confidently.

Where skills live: personal, project, plugin

Where you put a skill decides who can use it. Personal skills in ~/.claude/skills/<name>/ follow you across every project on your machine — your private toolkit of commit helpers and research routines. Project skills in .claude/skills/<name>/ ship to your whole team through version control, so everyone who clones the repo gets the same /deploy or /review-pr. Plugin skills live in a plugin's skills/ directory and load wherever the plugin is enabled — that is how Anthropic and the community distribute skills as installable packages. (Organizations get a fourth, enterprise scope deployed through managed settings.)

When two skills share a name, the more specific wins by override order: enterprise over personal, personal over project. Plugin skills sidestep conflicts entirely under a plugin-name:skill-name namespace. And project skills don't only load from your starting directory — Claude Code walks up to the repo root and discovers nested .claude/skills/ directories on demand, which is what makes monorepos work cleanly.

Scoping tools with allowed-tools

By default, a skill running its instructions still hits your normal permission prompts every time it wants to run a command. The allowed-tools field smooths that over: list the tools a skill may use, and Claude can use exactly those without asking while the skill is active. A /commit skill might declare allowed-tools: Bash(git add *) Bash(git commit *) Bash(git status *) so it stages and commits in one clean pass.

Read allowed-tools carefully, though, because it is permissive, not restrictive. It does not limit what tools are available — every other tool is still callable, governed by your normal permission settings. It only pre-approves the ones you list. (To remove a tool from the pool while a skill runs, that is a different field, disallowed-tools.) The security consequence is real: a project skill checked into someone else's repo can grant itself broad tool access, and that grant only takes effect after you accept the workspace trust dialog. Review project skills before you trust a repository — treat installing a skill like installing software, and only use skills from sources you trust.

Build and test your first skill

  1. Create the directory

    Pick a scope and make the folder. For a personal skill: mkdir -p ~/.claude/skills/summarize-changes. The directory name (summarize-changes) becomes the command /summarize-changes.

  2. Write SKILL.md

    Save a SKILL.md with a sharp description (what it does + when to use it) and a body of instructions. Keep the body concise — once a skill is invoked, its content stays in context for the rest of the session, so every line is a recurring cost. The official tip: keep SKILL.md under 500 lines and push deep reference material into separate bundled files.

  3. Test automatic invocation

    Open a project, make a small edit, run claude, and ask something that matches the description — "What did I change?" Claude should load the skill on its own. Claude Code watches skill directories for changes, so edits to an existing skill take effect within the session; only creating a brand-new top-level skills directory needs a restart.

  4. Test direct invocation

    Type /summarize-changes to invoke it explicitly. If it does not show up, ask "What skills are available?" to confirm it loaded, then tighten the description keywords until automatic triggering works the way you want.

building and triggering a skill
… scroll to run this session
A skill triggered two ways: Claude reaches for it from a natural-language ask, and you summon it by name. Same skill, same result.

Knowledge check

You wrote a skill at `.claude/skills/deploy/SKILL.md` with `description: Deploy to production`. Claude keeps deciding to run it on its own whenever your code "looks ready," which you never wanted. What is the right fix?

When to reach for a skill

Skills are not a replacement for CLAUDE.md, hooks, or subagents — they sit alongside them, and the art is matching the tool to the job. Reach for a skill when you have a repeatable procedure or body of expertise — a deploy checklist, your API conventions, a research routine — that you want available on demand without paying for it every session. Reach for CLAUDE.md when you have a stable fact every session needs, like the build command or project layout. And reach for a hook when something must happen with zero exceptions, because a skill, like CLAUDE.md, is guidance Claude chooses to follow, not an enforcement layer.

The honest failure mode: a skill that loaded once can stop influencing behavior if Claude starts preferring other approaches mid-session. The content is usually still there — strengthen the description and instructions so Claude keeps choosing it, re-invoke it after a compaction if the session has grown long, or move the truly non-negotiable part into a hook. Used well, a small library of sharp skills turns Claude from a capable generalist into a specialist who already knows how your team ships software.

Running a skill in its own subagent

Everything so far assumed a skill runs inline — its rendered body drops into your main conversation and shares all the context that came before. Two frontmatter fields flip that. [V] Set context: fork and the skill runs in a forked subagent context instead: the SKILL.md content becomes the prompt that drives an isolated agent, and that agent does not have access to your conversation history. [V] The companion field agent names which subagent type executes it — a built-in Explore, Plan, or general-purpose, or any custom subagent you have defined in .claude/agents/. Omit agent and it defaults to general-purpose.

The point of forking is to keep heavy, self-contained work off your main context window. A research sweep or a PR summary can read dozens of files, burn through tool calls, and return just its conclusion — the intermediate churn never touches the session you are working in. [V] The official docs are blunt about one constraint, though: context: fork only makes sense for skills that carry explicit instructions. A skill that is pure reference material ("use these API conventions") gives the subagent guidelines but no actionable task, so it returns without meaningful output. [P] The tell is whether your skill body reads as a command or as background knowledge — fork the former, leave the latter inline.

One subtlety worth internalizing: [V] the built-in Explore and Plan agents skip CLAUDE.md and git status at startup to stay lean, so a skill forked with agent: Explore sees only its own SKILL.md content plus that agent's system prompt — nothing from your project memory. general-purpose and custom agents still load CLAUDE.md. Pick the agent type to match how much project context the task actually needs.

~/.claude/skills/pr-summary/SKILL.md
yaml
---
name: pr-summary
description: Summarize changes in a pull request
context: fork
agent: Explore
allowed-tools: Bash(gh *)
---
 
## Pull request context
- PR diff: !`gh pr diff`
- PR comments: !`gh pr view --comments`
- Changed files: !`gh pr diff --name-only`
 
## Your task
Summarize this pull request — what changed, why, and any risks
a reviewer should look at first.

Hiding a skill without touching its SKILL.md

Sometimes the skill you want to quiet is not yours to edit — it is checked into a shared project repo, or it arrives from an MCP server. [V] The skillOverrides setting solves this from your own settings.json instead of the frontmatter. It is a map keyed by skill name, where each value is one of four states, and the /skills menu writes it for you: highlight a skill, press Space to cycle states, then Enter to save it to .claude/settings.local.json. [V] A skill that is absent from the map is treated as on. [V] skillOverrides does not apply to plugin skills — manage those through /plugin instead.

This is the precise lever for the "skill descriptions are getting cut short" problem: drop a low-priority skill to name-only and it still appears in the / menu but stops spending description budget that your everyday skills need.

ValueListed to ClaudeIn the / menu
"on"Name and descriptionYes
"name-only"Name only (description collapsed)Yes
"user-invocable-only"Hidden from ClaudeYes
"off"Hidden from ClaudeHidden
The four skillOverrides states, from the official skills docs. Each key is a skill name; the value sets visibility without editing that skill’s SKILL.md.

The skills that ship in the box

You do not have to write a skill to use one. [V] Claude Code bundles a set of prompt-based skills that are available in every session unless you disable them with the disableBundledSkills setting. The distinction from built-in commands matters: most built-ins run fixed logic directly, but a bundled skill hands Claude detailed instructions and lets it orchestrate the work with its own tools. You invoke them the same way as any other skill — type / then the name. [V] In the commands reference they are marked Skill in the Purpose column to set them apart from ordinary built-ins.

CommandWhat it does
/code-reviewReviews the current diff for correctness bugs and for reuse, simplification, and efficiency cleanups. Pass --fix to apply findings, --comment to post them as inline PR comments, or ultra for a deep cloud review.
/simplifyA cleanup-only pass that applies fixes — four review agents run in parallel over reuse, simplification, efficiency, and abstraction level. From v2.1.154 it does not hunt for bugs; use /code-review for that.
/batchOrchestrates a large-scale change: researches the codebase, decomposes the work into 5–30 independent units, and after you approve, spawns one background subagent per unit in its own git worktree — each implements, tests, and opens a PR.
/loopRuns a prompt repeatedly while the session stays open. Omit the interval and Claude self-paces between iterations; omit the prompt and it runs an autonomous maintenance check.
/verifyConfirms a change does what it should by building and running your app and observing the result, rather than relying on tests or type checks.
A sampling of the bundled skills, quoted from the official commands reference. All are prompt-based and invoked like any /skill.

Reach the end and this star joins your charted sky.