A skill from the outside: a folder, not magic
Before opening the hood, the overview. A skill, on disk, is this:
meeting-summary/
├── SKILL.md ← the core: frontmatter + instructions
├── scripts/ ← optional: deterministic supporting code
│ └── format_check.py
└── templates/ ← optional: templates, reference examples
└── example-summary.mdThree observations that frame everything else:
It is text. No binaries, no proprietary format, no compilation. A skill can be read, diffed, and versioned in Git like any other file in the repository. That is a precious property — for review, for audit, for maintenance — and a limit you must know: everything in it will be readable in plain text inside a conversation context.
The SKILL.md is mandatory, the rest is optional. A minimal skill fits in a single file. Scripts and templates only appear when they bring something text cannot guarantee — more on that below.
The folder is self-contained. A well-designed skill does not depend on another skill to work. If you feel the need for an "import", that is the sign of a bad decomposition — back to the drawing board.
The frontmatter: the permanent storefront
Now let's open the file of our connecting thread — the meeting-summary skill we will build for real at step 3. Here is its header:
---
name: meeting-summary
description: Writes meeting summaries in the house format —
Decisions / Actions / Open points sections, factual tone, one
page maximum. Use whenever someone asks for a meeting summary,
minutes, a decision log or a meeting recap.
---Two fields, and one fundamental asymmetry to understand:
name — the identifier. Short, lowercase, hyphenated. It is used to reference the skill (logs, management, explicit invocation). Purely technical role.
description — the storefront. It is the only part of the skill the model sees at all times. Everything else in the file — the instructions, the examples, the rules — is invisible until the model has decided, on the sole basis of this description, that the skill deserves to be loaded.
Read that last sentence again; it is the central mechanism: the model does not "rummage through" your skills on every request. It consults a catalog of descriptions, and loads — or not.
The description under the microscope
Since everything hinges there, let's dissect the one from our thread. It answers two questions, in this order:
1. What does the skill do? — "Writes meeting summaries in the house format — Decisions / Actions / Open points sections, factual tone, one page maximum." Concrete, specific, verifiable. Not "helps with document writing": that is a description that triggers nothing because it could trigger everything.
2. When to use it? — "Use whenever someone asks for a meeting summary, minutes, a decision log or a meeting recap." Note the choice of words: these are the phrasings users actually type, including "minutes". The description speaks the language of the requests it must intercept.
The comparison that makes the principle obvious:
❌ description: Helps produce quality documents for the team.
→ too vague: never loaded (or wrongly loaded on everything)
❌ description: Summary skill v2, replaces the old version,
approved by Marc in March.
→ talks about the skill, not the task: the model finds
no trigger signal in it
✅ description: Writes meeting summaries in the house format
[...] Use whenever someone asks for a meeting summary,
minutes, a decision log or a meeting recap.
→ what + when, in the users' own wordsThe body: the instructions
Once past the frontmatter gate, the body of the SKILL.md is loaded in full. This is where the expertise lives. Here is our thread's body (abridged — the full version is the deliverable of step 3):
# Meeting summary — house format
## Mandatory structure
1. **Context** — one line: date, attendees, purpose.
2. **Decisions** — what was settled. One decision per bullet,
past tense, no conditionals.
3. **Actions** — who / what / by when. Never an action without
an owner and a deadline; if either is missing, record it
under Open points.
4. **Open points** — what remains to be settled, with the
planned next step.
## Tone and style
- Factual. No commentary, no interpretation of intentions.
- One page maximum. Beyond that, summarize harder — no
appendices.
## Edge cases
- Raw notes unreadable or contradictory: produce the summary
of the clear points, explicitly list the gray areas under
Open points. Never invent a decision.
- Sensitive HR or individual information: do not include it;
flag its existence to the requester, outside the summary.Three writing traits to remember, valid for all your future skills:
Imperative and concrete. "One decision per bullet, past tense" — not "decisions should ideally be phrased clearly". A skill is a procedure, not a charter of good intentions.
Edge cases are written down. Contradictory notes, sensitive data: ambiguous situations are settled in the file, calmly, by you — rather than improvised by the model, in the moment, differently each time. That is exactly the value of a documented procedure: repeatability in non-nominal cases. ISO 27001-certified readers will recognize the principle.
Nothing superfluous. Every loaded line costs tokens and attention. Version history, acknowledgments, the project's political context: out. A skill body is judged like a runbook — whatever does not help execution has no place in it.
Bundled scripts: when text is not enough
Last compartment of the folder: supporting scripts. The dividing rule is simple —
Text for judgment, code for determinism.
Writing a synthesis, adapting a tone, settling an edge case: judgment → instructions. Verifying that an output respects a format, converting data, applying an exact transformation: determinism → a script the model executes, rather than an operation it does "in its head" with approximation risk.
In our thread, scripts/format_check.py verifies that the produced summary contains the four sections in order — a mechanical quality control, exactly the kind of task you do not leave to improvisation.
SKILL.md and its scripts/ folder means running unaudited code — the very definition of supply-chain risk. House rule: read everything, beforehand, systematically.📚Going deeper
For the geeks: the numbers behind progressive disclosure. Order of magnitude on our thread: the description ≈ 60 tokens, always visible; the full body ≈ 600 tokens, loaded on demand. With 20 skills on this template: ~1,200 tokens of permanent catalog versus ~12,000 tokens if everything lived in the system prompt — a 1-to-10 ratio, paid on every request, multiplied by the team's volume. The optimization reasoning is the same as in our LLM cost guide. Design corollary: the description must be sufficient to decide, never to do — if your description contains instructions, it is too long; if your body must be read to know when to trigger, the split is wrong.
📚Going deeper
For the geeks: what a SKILL.md is not. Three anti-patterns seen in the enterprise. Not a vault: no API keys, no credentials — the file is loaded in plain text into the context; secrets live on the MCP side and in environment variables (step 7). Not a permission system: writing "never access production" in a skill is a wish, not a control — actual rights are managed at the level of the exposed MCP tools (step 8). Not a knowledge base: if you paste 40 pages of product documentation into the body, you have reinvented a bad RAG — the skill holds the procedure, bulky knowledge stays in its own system with tooled access. The skill/RAG/MCP boundary from step 1 is not academic: each anti-pattern above is a boundary violation.
📍 Skills & MCP path — step 2/9
- 🗺️ The map before the territory
- 🔬 Anatomy of a skill ← you are here
- 🛠️ Create your first skill
- 🏛️ Skills in the enterprise: governance
- 🔌 MCP: the protocol explained
- ⚡ Use an existing MCP server
- ⚙️ Build your minimal MCP server
- 🛡️ Secure your MCP servers
- 📡 The ecosystem: where to find, where it moves
Next step → Create your first skill: we write the full version of our connecting thread, from requirements to testing — with the five-step method for a description that triggers every time.
To place this step on the big map: step 1, the map before the territory.