How we review

SKILL.md Format Explained: Fields, Folder Layout and an Annotated Example

Updated Oct 26, 2026How we review

SKILL.md is the one required file in every Agent Skill folder. It holds YAML frontmatter with a name and description, then Markdown instructions the agent loads on activation. The rules come from the Agent Skills specification and Anthropic's documentation, checked on 2026-10-21.

We wrote the example below for this page. It is spec-valid and uses one reference file and one script.

---
name: reviewing-pull-requests                      # (1)
description: Reviews a pull request diff for bugs, missing tests and risky changes, then writes a prioritised comment list. Use when the user asks to review a PR, a diff or staged changes.   # (2)
license: Apache-2.0                                # (3)
compatibility: Requires git and Python 3.10+       # (4)
metadata:                                          # (5)
  author: example-team
  version: "1.2"
allowed-tools: Bash(git diff:*) Read               # (6)
---

# Reviewing pull requests                           

## Steps
1. Run `git diff main...HEAD` and read the changed files.
2. Check each change against [references/CHECKLIST.md](references/CHECKLIST.md).   
3. Run `scripts/find_untested.py` to list changed functions without tests.   
4. Write findings as: severity · file:line · problem · fix.

## Edge cases
- Stop and say so when the diff is empty.
# Line What it means Source
1 name: reviewing-pull-requests Lowercase letters and hyphens; equals the folder name Spec
2 description: … Says what the skill does and when, in third person, with task keywords Spec; Anthropic best practices
3 license: Apache-2.0 Optional Spec
4 compatibility: … Optional; up to 500 characters of environment needs Spec
5 metadata: Optional string map; a good home for the version Spec
6 allowed-tools: … Optional and experimental; pre-approves the listed tools Spec; Claude Code docs
7 # Reviewing pull requests The body starts here, in plain Markdown Spec
8 [references/CHECKLIST.md] A reference file, one level deep Spec
9 scripts/find_untested.py Only the script's output enters context Claude platform docs
reviewing-pull-requests/
├── SKILL.md
├── references/CHECKLIST.md
└── scripts/find_untested.py

Spec: 6 fields · 2 required · 64 / 1,024 / 500 characters.

What is a SKILL.md file?

A SKILL.md file is the one required file in every Agent Skill folder. It opens with YAML frontmatter holding a name and a description. Markdown instructions follow, and the agent reads them when the skill activates.

An Agent Skill is "a directory containing, at minimum, a SKILL.md file" (agentskills.io specification). The spec sets the format plainly. The file "must contain YAML frontmatter followed by Markdown content". The frontmatter is the block between two --- lines. Claude Code reads that block only when the opening --- is the file's first line (Claude Code docs).

Anthropic published the format as an open standard, now hosted at agentskills.io. Our concept guide covers what Agent Skills are, and the open standard.

SKILL.md, skill.md or skills.md: which spelling is right?

SKILL.md, in capitals, is the right spelling. The spec names the file SKILL.md throughout. Anthropic's Complete Guide is stricter. It says the file "Must be exactly SKILL.md (case-sensitive)" and lists "skill.md" as wrong (Complete Guide, PDF). Anthropic's Help Center article on custom skills writes "skill.md" in lower case throughout (Help Center). The two official sources conflict, so use SKILL.md and it passes both. "skills.md" is a different thing: a separate service, covered further down.

How does an agent load a SKILL.md?

An agent loads a SKILL.md in three levels, called progressive disclosure:

Level What loads When Size
1. Metadata name and description At startup, for every installed skill About 100 tokens
2. Instructions The full SKILL.md body When the skill activates Under 5,000 tokens recommended
3. Resources Files in scripts/, references/, assets/ Only when the instructions call for them No cost until read

The spec gives these budgets, and the Claude platform docs use the same three levels (platform overview). Claude reads SKILL.md through bash. Scripts run through bash too, and only their output enters context. The choice between installed skills is its own topic: how Claude decides which skill to load.

Which agents and tools read SKILL.md?

Several agents read SKILL.md today. Three examples, each from its own docs:

The full list of clients sits in the concept guide linked above.

What does a SKILL.md file look like?

A SKILL.md file looks like a short Markdown document under a YAML header. The header sits between two lines of three dashes and names the skill and its trigger. Headed instructions, examples and edge cases follow.

The annotated file at the top of this page is a full example. The header names the skill and says when to use it. The body then reads like a short runbook: a heading, numbered steps, and a list of edge cases. Links point to files the agent opens only when a step needs them. The smallest valid SKILL.md, from the spec, has two fields and no body:

---
name: skill-name
description: A description of what this skill does and when to use it.
---

Real skills sit between these two. Anthropic's Frontend Design skill, at commit 8a1541c, uses three frontmatter fields: name, description and license. Its folder holds 2 files: SKILL.md and a licence file. Our verdict on Anthropic's Frontend Design skill, reviewed on 2026-09-30, reads:

Verdict
Recommended
Score
76
Safety grade
A
Confidence
Moderate
Reviewed
2026-09-30, commit 8a1541c

What frontmatter fields does a SKILL.md support?

The Agent Skills spec defines six SKILL.md frontmatter fields: name, description, license, compatibility, metadata and allowed-tools. Only name and description are required. Claude Code supports extra fields, such as context and model, that uploads reject.

Table A lists the six spec fields (agentskills.io specification):

Field Required Rule
name Yes 1 to 64 characters; lowercase a to z, 0 to 9 and hyphens; no leading, trailing or double hyphen; matches the folder
description Yes 1 to 1,024 characters; says what the skill does and when to use it
license No A licence name or a bundled licence file
compatibility No 1 to 500 characters of environment needs
metadata No A string-to-string map, such as author and version
allowed-tools No Space-separated pre-approved tools; experimental

Claude Code reads 14 more fields of its own (Claude Code docs). They are when_to_use, argument-hint, arguments, disable-model-invocation, user-invocable and disallowed-tools. The rest are model, effort, context, agent, background, hooks, paths and shell. Claude Code accepts metadata, license and compatibility too, but does not act on them.

These extras break portability. Claude.ai uploads, the Skills API and Anthropic's package_skill.py accept only the six spec fields. Any other key fails with "Unexpected key(s) in SKILL.md frontmatter". The ALLOWED_PROPERTIES list in quick_validate.py holds the same six keys.

Name and description rules

Claude's platform adds two rules (platform overview). Neither field can contain XML tags. name cannot contain the reserved words "anthropic" or "claude". Anthropic's best practices ask for descriptions in the third person.

The spec gives its own examples. pdf-processing is a valid name. PDF-Processing, -pdf and pdf--processing are invalid. Its good description starts "Extracts text and tables from PDF files, fills PDF forms". Its poor example reads "Helps with PDFs."

Official sources disagree on three points:

  • Description length: the spec and platform docs allow 1,024 characters. The Help Center lists 200 characters. A description under 200 characters satisfies both.
  • Name format: the Help Center example name is "Brand Guidelines", with capitals and a space. The spec and the Complete Guide require kebab-case, such as brand-guidelines.
  • Required fields: the spec requires both fields. Claude Code treats every field as optional and defaults name to the folder name.

In Claude Code, the combined description and when_to_use text is cut at 1,536 characters in the skill listing. Wording matters for selection, which is why the description decides triggering.

The allowed-tools field

The spec defines allowed-tools as a space-separated, experimental list, as in Bash(git:*) Bash(jq:*) Read. In Claude Code, it pre-approves the listed tools for the turn that invokes the skill. It does not restrict other tools. Workspace trust does not gate it. Broad pre-approvals are one reason a verdict's safety grade drops to C, under how safety grades are assigned.

Claude Code-only fields

Field Effect in Claude Code
disable-model-invocation: true Claude cannot load the skill on its own
user-invocable: false Hides the skill from the / menu; only Claude invokes it
context: fork with agent Runs the skill in a subagent
model, effort Override the session's model or effort level
paths Loads the skill only for matching files

Arguments: $ARGUMENTS and argument-hint

Claude Code substitutes arguments into the body. $ARGUMENTS takes everything typed after the command. $ARGUMENTS[N] and $N take one argument by index, and $name takes a named one. argument-hint shows in autocomplete. With no placeholder in the body, Claude Code appends ARGUMENTS: <value>. A body reading "Fix GitHub issue $ARGUMENTS" turns /fix-issue 123 into "Fix GitHub issue 123".

What goes in the SKILL.md body?

The SKILL.md body is what goes in after the frontmatter: the instructions an agent follows once the skill activates. The spec recommends steps, input and output examples, and edge cases. It recommends under 500 lines and 5,000 tokens.

The spec says "There are no format restrictions" and recommends three kinds of content:

  1. Step-by-step instructions
  2. Examples of inputs and outputs
  3. Common edge cases

Size matters because the whole body loads on activation. The spec, Claude Code docs and Anthropic's best practices all name 500 lines. The units differ on the second limit. The spec says under 5,000 tokens for the body. Anthropic's Complete Guide says "Keep SKILL.md under 5,000 words".

Claude Code keeps the body in context once it loads and does not re-read it. After compaction, it keeps the first 5,000 tokens of each re-attached skill. All re-attached skills share a 25,000-token budget (Claude Code docs). Put critical rules near the top.

Claude Code supports two body features that other surfaces ignore. !`command` runs a shell command and inserts its output first. ${CLAUDE_SKILL_DIR} resolves to the skill's own folder. Neither runs in claude.ai chat or through the API.

How is a skill folder around SKILL.md laid out?

A skill folder around SKILL.md is laid out with SKILL.md at its root and three optional folders. Scripts hold code, references hold documents loaded on demand, and assets hold templates and data.

skill-name/
├── SKILL.md          # Required: metadata + instructions
├── scripts/          # Optional: executable code
├── references/       # Optional: documentation
└── assets/           # Optional: templates, resources

SKILL.md links to these files by relative path, one level deep (spec). The spec sets a convention for each folder. Scripts are self-contained or document their dependencies, and they print helpful error messages. Python, Bash and JavaScript are the common languages. Reference files stay short and focused, because agents load them on demand. Assets hold templates, images and data files. Anthropic's Complete Guide adds two rules. Folder names use kebab-case, and no README.md goes inside the skill folder.

Every verdict on this site starts from these files. What a folder contains affects its safety grade:

What the folder contains Safety-grade effect
SKILL.md only No code; eligible for grade A
Reference files No executable code; grade A possible
Scripts Grade B at best
Assets Grade B at best when they hold code
Credentials or broad permissions Grade C

Scripts are the part to read first; see what to check in bundled scripts. Each skill's own breakdown sits in every skill we've scanned, file by file.

scripts/, references/ and assets/

Folder pattern Real example Verdict
SKILL.md plus licence Frontend Design: 2 files Recommended · 76 · safety grade A
References and scripts PDF: 8 Python scripts and 3 reference files, 12 files in all Claude PDF skill verdict: Conditional · 68 · safety grade B
Heavy bundle Skill Creator: 18 files, including 10 Python scripts Skill Creator review: Conditional · 57 · safety grade C

The spec's folder names are conventions. The PDF skill keeps reference files beside SKILL.md, outside a references/ folder.

Where does the skill folder go?

The spec does not mandate a location; it defines only what goes inside the folder. Three locations are common:

Location Used by Source
.agents/skills/ (project) or ~/.agents/skills/ (user) Cross-client convention; VS Code default agentskills.io
.claude/skills/ (project) or ~/.claude/skills/ (personal) Claude Code Claude Code docs; Anthropic Academy
C:/Users/<user>/.claude/skills Claude Code personal path on Windows Anthropic Academy

Claude Code's docs list no .agents/skills/ location, checked 2026-10-21. The full table, with plugin and nested paths, explains where Claude Code looks for skills.

What is a .skill file?

A .skill file is a packaged Agent Skill: a ZIP archive of one skill folder. Anthropic's package_skill.py script writes it for sharing. Unzip it, or rename it to .zip, to read the SKILL.md inside.

Anthropic's packager describes itself as a tool that "Creates a distributable .skill file of a skill folder". It writes {skill_name}.skill with Python's zipfile module. The script ships inside Anthropic's skill-creator. A .skill file holds no new format. No ".skill to .md" conversion is needed, because the Markdown file already sits inside the archive. For claude.ai, the Help Center documents uploads as a ZIP with the skill folder at its root.

To open a .skill file:

  1. Rename it from .skill to .zip, or open it with any unzip tool.
  2. Extract the archive.
  3. Open the SKILL.md inside the extracted folder.

Packaging is a rare use of skill-creator. Our verdict cites pull requests #1681, #1900 and #1796 on packaging and validation. Issue #1467 notes that quick_validate.py imports PyYAML, which is not declared anywhere. The verdict notes that the package_skill.py usage path is wrong (#904). Details sit in our verdict on Anthropic's skill-creator:

Verdict
Conditional
Score
57
Safety grade
C
Confidence
Moderate
Reviewed
2026-09-30, commit 8a1541c

Is SKILL.md the same as skills.md, skill.md or AGENTS.md?

No, SKILL.md is not the same as skills.md, skill.md or AGENTS.md. SKILL.md is the required file inside an Agent Skill folder. The skills.md service runs skills remotely for credits, and AGENTS.md is project context.

This table separates SKILL.md from six similar names:

Name What it is Who writes it Where it lives When the agent reads it
SKILL.md Instructions for one skill The skill's author Root of the skill folder On activation
skills.md (service) A paid service that runs skills remotely The service operator Its own website When an agent calls it
skillsmd.dev A community skill registry Registry contributors Its own website Never; people browse it
Docs-site skill.md Product documentation for AI agents The product's docs team The product's docs site When an agent fetches the URL
AGENTS.md Project context for coding agents The project team The repository With every prompt
CLAUDE.md Project memory for Claude You or your team The project or home folder In every conversation
README.md Notes for human readers The author Outside the skill folder Not part of the skill

The skills.md service sums itself up in one line:

Your agent finds the skill, runs it on skills.md and the files come back

It lists 300+ curated skills and charges credits per run. The skillsmd.dev site calls itself "The Open Agent Skills Registry".

GitBook defines a docs-site skill.md as "structured technical documentation written specifically for AI agents" (GitBook). That post does not cite the agentskills.io spec.

AGENTS.md is sent with every prompt and works best under 150 lines, per Red Hat Developer. Anthropic Academy notes that CLAUDE.md loads into every conversation. A SKILL.md body, by contrast, loads only when its skill activates.

That is the whole file. Before you write one, start from a template and check it.

Where can you get a SKILL.md template?

You can get the simplest SKILL.md template from Anthropic's anthropics/skills repository on GitHub. It holds a name line, a description line and an empty instructions section. Copy the folder, rename it, and write your steps.

Anthropic's template/SKILL.md reads, in full:

---
name: template-skill
description: Replace with description of the skill and when Claude should use it.
---

# Insert instructions below

The spec's two-field minimum, shown earlier, is the same shape. Rename the folder to match the new name. The tutorial walks through how to create an Agent Skill from a template.

How do you check that a SKILL.md is valid?

You check that a SKILL.md is valid with the spec's validator: skills-ref validate ./my-skill tests frontmatter and naming rules. Claude Code's claude plugin validate finds frontmatter that fails to parse.

Three commands cover the checks:

skills-ref validate ./my-skill                 # spec rules (agentskills.io)
claude plugin validate ~/.claude/skills        # YAML parse errors (Claude Code v2.1.233 or later)
python scripts/quick_validate.py ./my-skill    # Anthropic's six-key check (skill-creator)

Anthropic's quick_validate.py checks the six allowed keys and the 64 and 1,024-character limits. Broken YAML is harder to spot in Claude Code. The skill loads with empty metadata, so /skill-name still works. Auto-triggering fails, because Claude has no description to match. For other causes, see why a skill isn't triggering.

Common questions

Can you add comments to a SKILL.md?

Yes: # comments are valid YAML, and the spec's own examples use them. Claude reads the raw file, so every comment costs tokens (platform overview).

Are skills just Markdown files?

No. The core is one Markdown file, but a skill is a folder (spec).

Can a SKILL.md use XML tags?

Yes, in the body, because the spec sets no format restrictions there. Claude's platform forbids XML tags in name and description.

How do you version a skill?

The spec has no version field, so use metadata with a version key. The Complete Guide says "Update version in metadata"; track changes in git.

How do you declare dependencies?

Use compatibility for environment needs and list packages in the instructions (spec, best practices). The Help Center names a dependencies field, but Claude Code's docs say uploads reject non-spec keys.

Is SKILL.md JSON?

No. The header is YAML and the body is Markdown (spec).

Where can you see real SKILL.md examples?

Anthropic's anthropics/skills repository on GitHub holds many. Our verdict pages show each reviewed skill's files.

Part of the Agent Skills guide.

Useful skills, when they are worth sharing.

Get newly reviewed skills, important profile updates, and practical guides. No generic AI news.