Your First Custom Skill
Build a working SKILL.md from scratch. Go from an empty folder to a tested, running skill in 15 minutes — a meeting notes formatter you'll actually use.
Premium Course Content
This lesson is part of a premium course. Upgrade to Pro to unlock all premium courses and content.
- Access all premium courses
- 1000+ AI skill templates included
- New content added weekly
Let’s Build Something Real
🔄 Quick Recall: In Lesson 1, you learned that skills have three layers: metadata (name + description), instructions (the SKILL.md body), and linked files (scripts, references, assets). Now let’s put that knowledge to work.
We’re going to build a meeting notes formatter — a skill that takes raw meeting notes and turns them into a structured document with action items, decisions, and next steps. It’s practical, useful, and simple enough for a first skill.
By the end of this lesson, you’ll have a working skill running on your agent.
Step 1: Create the Skill Folder
Every skill lives in its own folder. Create it:
mkdir -p ~/.openclaw/skills/meeting-notes-formatter
For Claude Code, the path would be .claude/skills/meeting-notes-formatter/. For VS Code Copilot, .github/skills/meeting-notes-formatter/.
Step 2: Write the Frontmatter
Create a file called SKILL.md inside your new folder. Start with the frontmatter:
---
name: meeting-notes-formatter
description: >
Formats raw meeting notes into a structured document with sections
for attendees, key decisions, action items with owners, and next
steps. Use when the user shares meeting notes, asks to organize
meeting minutes, or wants to extract action items from a meeting.
---
Let’s break down why this description works:
| Element | Why It Matters |
|---|---|
| “Formats raw meeting notes” | Tells the agent the input type |
| “structured document with sections” | Tells the agent the output format |
| “attendees, key decisions, action items” | Specifies what sections to create |
| “Use when…” | Explicit activation triggers for the agent |
✅ Quick Check: The description says “Use when the user shares meeting notes, asks to organize meeting minutes, or wants to extract action items.” Why list three triggers instead of one? (Answer: Different users phrase the same request differently. Multiple triggers increase the chance the agent recognizes when to activate your skill.)
Step 3: Write the Instructions
Below the frontmatter, write the instructions the agent will follow:
---
name: meeting-notes-formatter
description: >
Formats raw meeting notes into a structured document with sections
for attendees, key decisions, action items with owners, and next
steps. Use when the user shares meeting notes, asks to organize
meeting minutes, or wants to extract action items from a meeting.
---
# Meeting Notes Formatter
When the user provides raw meeting notes, format them into this structure:
## Output Template
### Meeting: [Title or Topic]
**Date:** [Extract from notes or ask]
**Attendees:** [List names mentioned]
### Key Decisions
- [Decision 1]
- [Decision 2]
### Action Items
| Action | Owner | Deadline |
|--------|-------|----------|
| [Task] | [Person] | [Date if mentioned, otherwise "TBD"] |
### Discussion Summary
[2-3 sentence summary of the main topics discussed]
### Next Steps
- [What happens next]
- [Follow-up meetings if mentioned]
## Rules
- If attendees aren't mentioned, ask the user
- If deadlines aren't mentioned, mark as "TBD"
- Keep the summary concise — no more than 3 sentences
- Preserve direct quotes if they contain decisions
- Always end with "Next Steps" even if it's just "No follow-up needed"
Step 4: Test It
Restart your agent (or reload skills if your platform supports hot-reloading). Then send a test message:
“Here are my meeting notes from today: Met with Sarah and David about the Q2 marketing plan. Sarah said we should increase social media budget by 20%. David agreed but wants to see ROI metrics first. We decided to run a 2-week pilot. Sarah will create the campaign brief by Friday. David will pull last quarter’s social metrics by Wednesday. Next meeting is February 20th.”
Your agent should format this into the structured template you defined.
Step 5: Review and Iterate
Compare the output to your template. Common issues:
| Problem | Fix |
|---|---|
| Missing sections | Add explicit “Always include ALL sections” to the rules |
| Too verbose summary | Add word limit: “Summary must be under 50 words” |
| Didn’t extract action items | Add example: “Action items are things someone committed to DO” |
| Wrong date format | Specify: “Use YYYY-MM-DD format for all dates” |
Send feedback directly to the agent and adjust the SKILL.md. The beauty of skills is they’re just text files — edit, save, reload.
What Makes a Good Instruction Body
After building dozens of skills, here are the patterns that work:
Structure the output explicitly. Don’t say “format nicely” — show the exact template. Agents follow examples better than vague instructions.
Include rules and constraints. “Keep it concise” is vague. “Maximum 3 sentences per section” is clear. “Don’t make up information” prevents hallucination.
Handle edge cases. What if the meeting notes don’t mention attendees? What if there are no action items? Your instructions should cover these scenarios.
Write for the agent, not the user. The SKILL.md is read by an AI, not a human. Be explicit about what to do, when to ask questions, and what format to use.
✅ Quick Check: Your skill’s output always includes a “Budget Discussion” section even for meetings that didn’t discuss budgets. How do you fix this? (Answer: The template is too rigid. Change it to only include sections when relevant content exists: “Include sections only when the meeting notes contain relevant content. Omit empty sections.”)
Adding a References Directory
Let’s enhance the skill with a style guide. Create a references folder:
meeting-notes-formatter/
├── SKILL.md
└── references/
└── style-guide.md
In references/style-guide.md:
# Meeting Notes Style Guide
## Tone
- Professional but not stiff
- Use active voice: "Sarah will create" not "The brief will be created by Sarah"
## Formatting
- Use title case for section headers
- Use bullet points for lists of 3+ items
- Use tables for action items (always include Owner and Deadline columns)
## Action Items
- Must start with a verb: "Create...", "Review...", "Send..."
- Must have an owner (if not mentioned, write "Unassigned")
- Must have a deadline (if not mentioned, write "TBD")
Then reference it in your SKILL.md:
## Style
Follow the conventions in references/style-guide.md for tone,
formatting, and action item structure.
The agent will read the style guide when it needs formatting guidance — Layer 3 progressive disclosure in action.
Your Skill Is Portable
Here’s the best part: the skill you just built doesn’t only work in OpenClaw. Copy the folder to:
.claude/skills/— works in Claude Code.github/skills/— works in VS Code Copilot- Your Codex CLI skills directory — works there too
Same skill, multiple platforms. That’s the power of an open standard.
Key Takeaways
- A skill is a folder with a SKILL.md file and optional supporting files
- The frontmatter needs
nameanddescription— the description determines when the agent uses it - The instruction body is for the agent — be explicit, show templates, define rules
- Test immediately and iterate based on output quality
- References directories add depth without bloating the main instructions
- Skills are portable across Claude Code, VS Code, Codex CLI, and OpenClaw
Up Next
Your first skill works with static instructions. In the next lesson, you’ll make it dynamic — accepting parameters that change its behavior. You’ll learn the $ARGUMENTS syntax and shell expansion to build skills that adapt to what the user needs.
Knowledge Check
Complete the quiz above first
Lesson completed!