Step-by-Step: Build a Skill
Follow the steps in order. Each step has a Goal, what to Do, and how to Verify it. Tick off the matching items in the skills checklist as you go.
Running example: a writing-release-notes skill that turns merged PRs into customer-facing release notes.
Step 1: Define the job
Section titled “Step 1: Define the job”- Goal: Know exactly what the skill should achieve.
- Do:
- Write a problem statement: “When someone asks for release notes, the agent produces inconsistent, developer-speak notes. We want customer-facing notes grouped into New / Improved / Fixed, in our voice.”
- Collect 3–5 real requests, for example “write release notes for v2.4”, “summarise what shipped this sprint for customers”, or “draft the changelog from these PRs”.
- Run those requests without the skill and save the outputs. This is your baseline.
- List what the agent got wrong. That list is exactly what your skill needs to contain, and nothing more.
- Verify: You have a problem statement, the example requests, the baseline outputs, and a list of gaps.
Step 2: Confirm a skill is the right mechanism
Section titled “Step 2: Confirm a skill is the right mechanism”- Goal: Avoid building the wrong thing.
- Do: Walk through the decision tree. A skill is right when the agent can do the task but lacks your procedure or knowledge, and the task comes up sometimes rather than on every request.
- Verify: You can say in one sentence why this isn’t a rule, a subagent, or an MCP server.
Step 3: Name it and write the description
Section titled “Step 3: Name it and write the description”- Goal: A description the agent reliably matches.
- Do:
-
Name: lowercase, hyphens, ≤64 characters, descriptive, and ideally a gerund or noun phrase (
writing-release-notes,pdf-form-filling). Avoidhelper,utils, and names containingclaudeoranthropic. -
Description: third person, ≤1024 characters, saying what it does and when to use it, with the trigger words users actually type:
description: >-Writes customer-facing release notes from merged PRs, commits, or achangelog, grouped into New, Improved and Fixed in the company voice.Use when the user asks for release notes, a changelog, "what shipped",or a customer update about a version or sprint. -
Decide on invocation. Can it run automatically, or should it be
disable-model-invocation: true(manual only)?
-
- Verify: Read the description in isolation. Would the agent pick it for all of your Step 1 requests, and not for a nearby request such as “write a commit message”?
Step 4: Choose the location
Section titled “Step 4: Choose the location”-
Goal: The right audience can see it.
-
Do: Pick from the platform matrix:
Audience Location Just you, every project, Claude Code + Cursor ~/.claude/skills/<name>/Just you, Cursor only ~/.cursor/skills/<name>/Everyone in this repo, Claude Code + Cursor .claude/skills/<name>/(committed)Everyone in this repo, vendor-neutral .agents/skills/<name>/(Cursor, Codex; check your other tools)Many repos or teams A plugin (see Distribution) Claude.ai / Desktop users ZIP upload -
Verify: The folder name exactly matches
name.
Step 5: Scaffold from the template
Section titled “Step 5: Scaffold from the template”- Goal: A valid, detectable skill.
- Do:
- Copy
templates/basic-skill/(ortemplates/skill-with-scripts/if you need scripts) to your chosen location. - Rename the folder and set
nameanddescription. - Run
npm run qain this guide’s folder if you’re developing inside it, or check the frontmatter by eye against the checklist.
- Copy
- Verify: Restart or reload the host. The skill appears when you type
/in Cursor or Claude Code.
Step 6: Write the body (core workflow only)
Section titled “Step 6: Write the body (core workflow only)”- Goal: Concise instructions that close the gaps you found in Step 1.
- Do:
- Start with a Quick start or Workflow section: numbered steps, in the imperative mood.
- Add only what the model doesn’t know, such as your categories, voice, forbidden words, and the output template.
- For multi-step work, include a copyable progress checklist (see the workflow pattern).
- Match the level of freedom to how fragile the task is (see degrees of freedom).
- Keep
SKILL.mdunder 500 lines, and ideally much shorter.
- Verify: Every paragraph answers “what would the agent get wrong without this?” If a paragraph doesn’t, delete it.
Step 7: Move detail into resources
Section titled “Step 7: Move detail into resources”- Goal: Keep level 2 small and push detail down to level 3.
- Do:
- Move long reference material into
references/*.md(style guide, glossary, API details). - Put output templates in
assets/. - Link each file directly from
SKILL.mdwith a sentence saying when to read it:For tone and banned phrases, read [references/voice.md](references/voice.md). - Keep references one level deep. Don’t chain
SKILL.md → a.md → b.md. - Add a table of contents to any reference file over ~100 lines.
- Move long reference material into
- Verify:
SKILL.mdalone is enough for the common case; resources are only needed for the less common ones.
Step 8: Add scripts for deterministic work (optional)
Section titled “Step 8: Add scripts for deterministic work (optional)”- Goal: Reliability and token savings for fragile or mechanical steps.
- Do:
- Write scripts that solve the problem and handle their own errors, and that print clear, actionable messages.
- Document each one in
SKILL.mdwith its exact command and expected output, and say whether to run it or read it. - Document dependencies (for example “requires Python 3.10+,
pip install pypdf”). - Use forward-slash paths (
scripts/validate.py), never backslashes. - Add a validation loop: run → fix → re-run until it passes.
- Verify: Run each script by hand from the skill folder on sample input, and check it fails cleanly on bad input.
Step 9: Test triggering and behaviour
Section titled “Step 9: Test triggering and behaviour”- Goal: Evidence that it works. Don’t settle for a feeling.
- Do: Follow Testing & evaluation:
- Should trigger: each Step 1 request (in a fresh chat) loads the skill.
- Should not trigger: 3+ near-miss requests don’t load it.
- Quality: compare outputs with your baseline. Is every gap from Step 1 closed?
- Explicit:
/skill-nameworks. - Cross-host: repeat on each host you support.
- Test with the models your users actually use. Smaller models may need more explicit steps.
- Verify: The results are recorded in an
evals/file or table (see the template).
Step 10: Iterate with real usage
Section titled “Step 10: Iterate with real usage”- Goal: Improve based on what happens, not on guesses.
- Do:
- Watch real sessions. Where does the agent skip steps, misread instructions, or read the wrong file?
- Fix the specific failure. Usually that means sharpening the description, moving something from a reference into the body (or the reverse), or adding an example.
- Re-run the eval set after every change.
- Verify: The eval pass rate goes up and never regresses.
Step 11: Ship
Section titled “Step 11: Ship”- Goal: Others can use it with zero hand-holding.
- Do: Follow Distribution. Commit it, add a changelog entry (in
metadataor aCHANGELOG.md), and announce it with a one-line summary plus example prompts. - Verify: A colleague triggers it on their machine using only your announcement.
Next: Writing guide · Checklist