MetaMeta skill

How to Write Skills (and Call Them)

The one skill that teaches the rest: how to write a SKILL.md and how to make Claude use it.

New to skills? Watch, then try it

A few minutes, no code. See how a skill works, then build your first one step by step.

Scene 1 of 6 · Your helper forgets
Why skills exist

Same ask, different pancakes

Every morning you ask your AI helper for pancakes. Every morning they come out a bit different.

That is because you explain it a little differently each time, and the helper does not remember.

"make my pancakes please"
Monday
Tuesday
Wednesday

What it does

You explain the same task to an AI assistant over and over, and every time you get something slightly different back. The instructions live in your head, so they arrive in a slightly different shape each time, and the result drifts with them.

A skill is a single file that holds those instructions permanently. This one teaches you to write it: what the two lines at the top do, how to describe the job so the assistant recognises the request without being told, what to put in the body, and where to save the file so it loads on its own. It also covers the part people usually miss, which is testing whether the skill actually activates when you ask normally rather than only when you name it.

You finish with a working skill file, a short set of test requests that prove it fires on the right ones and stays quiet on the near-misses, and a review checklist you can reuse for the next one.

You end up with a working skill file, test requests that prove it triggers, and a checklist for the next one.

When to reach for it

Use it the first time you notice you are re-explaining a task, and any time an existing skill is being ignored or gives inconsistent results. It is also the right place to start if you want to understand how every other skill on this page works before copying one.

Skip it for a one-off task. Writing a skill only pays off for work that repeats, and a single request is faster to just ask for.

What's inside

write-and-call-skills/
├── SKILL.md
├── references/
│   ├── checklist.md
│   └── examples.md
└── scripts/
    └── validate_skill.py
SKILL.md
---
name: write-and-call-skills
description: Teaches how to write a skill (a SKILL.md file that gives an AI assistant one repeatable job) and how to get it to actually run - frontmatter rules, description writing that triggers reliably, where to save the file, and how to test it. Use when creating a new skill, improving one, or when a skill exists but never activates.
license: Apache-2.0
metadata:
  source: anthropics/skills
---

# Write and Call Skills

You help someone turn a task they repeat into a skill: one file that teaches an assistant how to do that job their way, every time. You also make sure it gets used, which is a separate problem from writing it well.

A skill is not code. If the person can describe the job as a checklist, they can have a skill.

## How a skill loads

Three levels, and knowing them is what keeps a skill small:

1. **Name and description** are always in view. This is the only part the assistant sees before deciding to open the skill. Roughly 100 words.
2. **The SKILL.md body** loads when the skill triggers. Keep it under 500 lines; under 250 is better.
3. **Bundled files** (`references/`, `scripts/`, `assets/`) load only when the body points at them, and a script can run without ever being read.

So the body carries the workflow, and anything long, rarely needed, or purely illustrative moves into a bundled file that the body names.

## Workflow

1. **Find the real job.** Ask what task they repeat, what a good result looks like, and what has gone wrong before. If the current conversation already contains the workflow ("turn this into a skill"), pull the steps, corrections, and formats out of the history first and confirm them.
2. **Narrow it to one job.** "Summarize meetings" is a skill. "Handle my communication" is a category. Split anything that has two unrelated outputs.
3. **Draft the frontmatter.** Name and description, in the exact form below. Do this before the body, because the description forces you to state what the skill is for.
4. **Write the body.** Role line, workflow steps, an example, rules for thin or ambiguous input. Explain why each instruction matters instead of stacking commands in capitals; the reasoning is what makes the assistant handle a case you did not anticipate.
5. **Show the output shape.** The exact sections, order, and length limits. A skill without an output shape drifts run to run.
6. **Push depth into bundled files.** Long examples, lookup tables, and per-framework variants go to `references/`. Repeated deterministic work goes to `scripts/`.
7. **Validate the file.** Run `scripts/validate_skill.py` on the folder to catch the mechanical errors before wasting a test run on them.
8. **Test triggering and doing, separately.** A skill can be well written and never fire, or fire on the wrong request. See "Test it properly" below.
9. **Improve from real failures.** Each time the output is wrong in a specific way, add the one line that fixes that case. Skills get good by accretion, not by being written well once.

```text
Skill review checklist
[ ] One job, stated in a sentence
[ ] Name is kebab-case and matches the folder name
[ ] Description says what it does AND when to use it, in third person
[ ] Body has a workflow, an example, and rules for thin input
[ ] Output shape is explicit
[ ] Every bundled file is mentioned in the body, with when to read or run it
[ ] Nothing time-sensitive (versions, prices, dates) in the body
[ ] Tested on a real task in a fresh session, with none of the author's context
```

## The frontmatter

```markdown
---
name: meeting-notes-to-actions
description: Turns a meeting transcript or rough notes into a list of decisions and owned action items with dates. Use when someone shares notes, a transcript, or a recording summary and wants to know who agreed to do what by when.
---
```

Two fields carry all the weight.

**name** is a short id, lowercase with hyphens, matching the folder it lives in. No version numbers.

**description** is the trigger. It is the only text the assistant reads when deciding whether to open your skill, so it must contain both halves:

- *what it does*, in third person ("Turns a transcript into..."), not first person and not a title;
- *when to use it*, in the words a person would actually use, including the file types, tools, or phrases that signal this task.

Assistants under-trigger far more often than they over-trigger, so lean explicit: name the situations rather than hinting at them. Compare:

- Weak: `description: Helps with dashboards.`
- Strong: `description: Builds a fast single-page dashboard from a data file or query result, with the chart types chosen to match the data. Use whenever someone mentions a dashboard, a metrics view, charts of internal data, or wants to "see the numbers" from a spreadsheet or export.`

The second one fires. The first one sits there.

## The starter file

A new skill begins as six lines. Fill the frontmatter, then write the body under the heading.

```markdown
---
name: skill-name-here
description: What this skill does, and when it should be used.
---

# Skill Name Here
```

## Where the file goes

- **claude.ai** - paste the skill into a Project's custom instructions, or keep it in a document and paste it at the start of a chat.
- **One repository** - `.claude/skills/<name>/SKILL.md`, committed with the project so the team gets it too.
- **Every project on your machine** - `~/.claude/skills/<name>/SKILL.md`.

Bundled files sit beside SKILL.md in that same folder: `references/examples.md`, `scripts/check.py`, and so on. Reference them from the body with relative forward-slash paths, one level deep.

## How a skill gets called

Most of the time nobody calls it. The person asks for the task in their own words, the description matches, and the skill loads. That is the design, and it is why the description matters more than the body.

To be explicit:

- Name it: "Use the meeting-notes-to-actions skill on this transcript."
- In Claude Code, type `/` and pick the skill from the list.
- In a Project, a skill in the instructions is always active for that Project.

If a skill never activates on its own, the fix is almost always the description, not the body.

## Test it properly

**Does it fire?** Write about ten realistic requests: six or seven that should trigger the skill, three or four near-misses that should not. Near-misses are the useful ones - requests that share vocabulary but need something else. Run them in fresh sessions and note which loaded the skill. Anything that should have fired and did not is a missing situation in the description.

Keep the test requests concrete and messy, the way people actually type: file names, a bit of backstory, lowercase, abbreviations. A one-line request like "read this file" will not trigger any skill, because the assistant can just do it; those make poor test cases.

**Does it work?** Give the skill a real task in a fresh session, with none of the context that is in the author's head. Every place the result surprises you is information that belonged in the skill.

## Example

**Request.** "I write the same kind of release note every sprint and they come out inconsistent. Make this a skill."

**What you produce.** First, the frontmatter, checked with them:

```markdown
---
name: release-notes-writer
description: Writes customer-facing release notes from a list of merged pull requests or a changelog, grouped into new features, improvements, and fixes, in plain language with no internal jargon. Use when someone shares a changelog, a list of merged PRs, or asks for release notes or "what shipped this sprint".
---
```

Then a body with: a one-line role statement, the workflow (group changes, drop internal-only work, rewrite each line as a user-visible outcome, order by impact), the exact output shape (three headed sections, one line each, no version numbers in the headings), and two rules learned from their past failures ("never invent a benefit the change does not deliver", "keep the team's own product names, do not rename features").

Then the trigger test: "write release notes for this changelog" fires it, and so does "what shipped this sprint"; "write a blog post about our new feature" correctly does not.

## Rules

- One job per skill. Two jobs means two files.
- Write the body to the assistant, in imperative voice, but keep it readable for the human who will edit it later.
- Explain why a rule exists. A rule with a reason survives cases you did not think of; a bare command does not.
- Keep time-sensitive facts out. Model names, prices, and version numbers age badly inside a file nobody re-reads.
- Never write a skill that hides what it does. If describing the skill honestly would surprise the person running it, it is the wrong skill.
- If the body passes about 400 lines, that is a structure problem: move the depth into `references/` and leave a pointer.

## Edge cases

- **The person is not sure what the skill should do.** Do not draft yet. Ask for one real example of the task, done well, and generalize from that.
- **The skill exists and gets ignored.** Rewrite the description first, add the situations and the vocabulary they actually use, and re-run the trigger test. Only touch the body if it fires and then behaves badly.
- **The skill fires on the wrong requests.** The description is too broad or shares words with a neighbouring task. Name the boundary explicitly ("for transcripts, not for support tickets").
- **The job is genuinely long.** Split it: a main skill with the workflow, plus reference files per variant, each named in the body with a line about when to read it.
- **The output is subjective** (writing voice, visual taste). Skip the pass-or-fail testing and judge the outputs directly with the person; forcing a checkable assertion onto taste produces a worse skill.

## Files

- `references/examples.md` - three complete builds: a repeated task turned into a skill, a description rewritten until it triggered, and a skill split in two because it was doing two jobs. Read before drafting your first skill.
- `references/checklist.md` - the review pass to run before shipping a skill, plus the trigger-test procedure written out with example request sets. Read when a skill is drafted and you are deciding whether it is done.
- `scripts/validate_skill.py` - run it, do not read it: `python scripts/validate_skill.py path/to/skill-folder`. Checks frontmatter fields, the name format, description length, body size, and whether every bundled file is mentioned in the body. It checks mechanics only; it cannot tell you whether the skill is any good.

## Attribution

Adapted from the `skill-creator` skill in [anthropics/skills](https://github.com/anthropics/skills/tree/main/skills/skill-creator), Apache-2.0. The authoring loop, the progressive-disclosure model, the description-triggering guidance and the validation script come from there. The eval and benchmark tooling in the original is deliberately left out; the trigger test here is its lightweight equivalent.

Install it

Claude Code (this project)

Unzip the download into .claude/skills/. The folder is already named right.

Claude Code (every project)

Unzip into ~/.claude/skills/ to use it everywhere.

claude.ai

Upload the zip under Settings, then Capabilities, then Skills (paid plans).

How to call it

Just describe the task. The description line inside the skill does the matching. Or call it directly:

/write-and-call-skills help me write a skillhow do skills actually workturn this into a skill I can reusemy skill never activates, whymake this repeated task automatic

Works beyond Claude

Skills use the open Agent Skills format. The exact same folder works in OpenAI Codex, Gemini CLI, Cursor, GitHub Copilot and other tools that read the format.

Using a plain chat app? Paste SKILL.md into ChatGPT or Gemini as instructions. You lose auto-triggering, but the method still works.

agentskills.io

Pattern credit: anthropics/skills — skill-creator

Related skills