skill-best-practices
dboeckli/ai-agent-skills
Guide for creating, structuring, and improving Claude skills (SKILL.md).
What is skill-best-practices?
Reference for building, reviewing, and troubleshooting Claude skills. Use when creating a new skill, reviewing an existing one, writing SKILL.md frontmatter, defining trigger conditions, or planning skill distribution. Covers planning, structure, validation, and iteration.
- Guides skill creation from use-case planning through YAML frontmatter and body instructions
- Provides templates and examples for three skill categories: Document & Asset Creation, Workflow Automation, and MCP Enhancement
- Explains how to write effective descriptions that control when Claude auto-loads a skill
- Covers troubleshooting common problems: undertriggering, overtriggering, and instructions not being followed
- Includes validation scripts to check YAML syntax and skills CLI compatibility
- Specifies mandatory updates to CLAUDE.md and README.md skill tables after any skill change
How to install skill-best-practices
npx skills add https://github.com/dboeckli/ai-agent-skills --skill skill-best-practices- Familiarity with Markdown and YAML syntax
- Access to a skill repository (e.g., dboeckli/ai-agent-skills)
- Bash shell for running validation scripts
- Understanding of your use case and target trigger phrases
How to use skill-best-practices
- 1.Identify your skill's category (Document & Asset Creation, Workflow Automation, or MCP Enhancement) and define 2–3 concrete use cases
- 2.Create a kebab-case folder and SKILL.md file with required YAML frontmatter (name and description)
- 3.Write the description to include WHAT the skill does and WHEN to use it, with specific trigger phrases
- 4.Write the body instructions following the template: ## Instructions → numbered steps → ## Examples → ## Troubleshooting
- 5.Run the validation script (bash .claude/skills/skill-best-practices/scripts/validate-skills.sh) to check YAML and CLI compatibility
- 6.Update CLAUDE.md and README.md skill tables to keep them in sync with your changes
- 7.Test triggering with 10–20 relevant queries; iterate on the description if undertriggering or overtriggering occurs
Use cases
- Building a new skill from scratch: define use cases, create folder structure, write frontmatter and instructions, test triggering
- Reviewing an existing skill: audit frontmatter, body structure, trigger phrases, and suggest improvements
- Troubleshooting a skill that doesn't auto-trigger: diagnose missing or vague trigger phrases and rewrite description
- Planning skill distribution: determine which category (Document, Workflow, or MCP) fits your use case
- Validating skill syntax: run the provided bash script to catch YAML and CLI compatibility issues before committing
- AI agent skill developers building skills for Claude Code, Cursor, or Claude.ai
- Teams maintaining skill repositories who need consistent structure and documentation
- Developers troubleshooting skill triggering or instruction-following issues
- Anyone creating reusable, composable workflows as installable skills
skill-best-practices FAQ
Document & Asset Creation produces consistent output (docs, designs, code) using style guides and templates. Workflow Automation handles multi-step processes with validation gates and loops. MCP Enhancement provides workflow guidance on top of MCP tool access with sequential calls and embedded domain expertise.
A good description includes WHAT the skill does and WHEN to use it with specific trigger phrases. Test it by asking Claude: 'When would you use the [skill name] skill?' If Claude quotes the description back accurately and would load it on your target queries, it's effective.
Check if the description is too generic (e.g., 'Helps with projects' won't work). Add specific trigger phrases users would actually say. Rewrite the description to be more concrete, then test with 10–20 relevant queries.
Yes. Step 5 explicitly states this is mandatory and must not be skipped. Both files must stay in sync after any skill creation or modification.
Only SKILL.md is required (case-sensitive). Optional folders are scripts/ (executable code), references/ (documentation), and assets/ (templates, fonts, icons).
Full instructions (SKILL.md)
Source of truth, from dboeckli/ai-agent-skills.
name: skill-best-practices description: "Guide for creating, structuring, and improving Claude skills (SKILL.md). Use when building a new skill, reviewing an existing skill, writing SKILL.md frontmatter, defining trigger conditions, troubleshooting skill problems (not triggering, over-triggering, instructions not followed), or planning skill distribution. When working on any skill in this repository: also load the cc-best-practices skill, and always update both CLAUDE.md and README.md skill tables after any skill change. Do NOT use for general Claude Code configuration or hook setup."
Skill Best Practices
Reference: https://resources.anthropic.com/hubfs/The-Complete-Guide-to-Building-Skill-for-Claude.pdf
Instructions
Step 1: Identify your use case category
Determine which type of skill you're building:
- Document & Asset Creation — consistent output (docs, designs, code)
- Workflow Automation — multi-step processes with consistent methodology
- MCP Enhancement — workflow guidance on top of MCP tool access
Define 2–3 concrete use cases before writing anything (see Planning section below).
Step 2: Create the folder and SKILL.md
- Name the folder in kebab-case (e.g.
my-skill-name) - Create exactly
SKILL.md(case-sensitive) inside it - Write YAML frontmatter with
nameanddescription(see Technical requirements)
Step 3: Write the description — this is the most critical part
The description controls when Claude loads your skill. It must include:
- WHAT the skill does
- WHEN to use it (specific trigger phrases)
- Optional: negative triggers ("Do NOT use for...")
See "Writing effective descriptions" for good/bad examples.
Step 4: Write the body instructions
Follow the recommended template: ## Instructions → numbered steps → ## Examples → ## Troubleshooting.
Be specific and actionable. Move detailed docs to references/ and link to them.
Step 5: Update CLAUDE.md and README.md
After creating or modifying any skill in this repository, always update the skill tables in both files:
CLAUDE.md— skill table under "Included Skills" (Trigger column: one-line description of when it fires)README.md— skill table under "Enthaltene Skills" (Beschreibung column: German one-liner)
Both files must stay in sync. This step is mandatory and must not be skipped.
Also invoke the cc-best-practices skill when working on skills in this repository to ensure context and session management follow project standards.
Step 6: Validate YAML and skills CLI compatibility
Run the validation script from the repository root before testing or committing:
bash .claude/skills/skill-best-practices/scripts/validate-skills.sh
Fix any FAIL lines before continuing. Common issues:
descriptionuses block scalar (>or|) → replace with a quoted single-line string- Sub-keys under a parent mapping key not indented → add two-space indent
After pushing, also run the remote check to confirm npx skills add --list finds all skills:
bash .claude/skills/skill-best-practices/scripts/validate-skills.sh --remote
Step 7: Test triggering and functional behavior
Run 10–20 test queries. Target: skill triggers on ~90% of relevant queries and never on unrelated topics. Iterate on the description until triggering is reliable (see Testing approach).
Step 7: Iterate based on signals
- Undertriggering → add more trigger phrases to description
- Overtriggering → add negative triggers, narrow scope
- Instructions ignored → move critical steps to top, use explicit language
Examples
Example 1: Building a new skill from scratch
User says: "Help me create a skill that plans sprints in Linear"
Actions:
- Identify category: Workflow Automation + MCP Enhancement
- Define use case: trigger = "plan sprint", "create sprint tasks"; steps = fetch Linear status → analyze velocity → create tasks
- Create folder
linear-sprint-planner/SKILL.md - Write description: "Manages Linear sprint planning workflows. Use when user says 'plan sprint', 'create sprint tasks', or 'set up iteration'."
- Write step-by-step instructions with Linear MCP tool calls
- Test with 10 trigger phrases; adjust description if skill doesn't auto-load
Result: Functional skill that auto-triggers on sprint planning requests and executes the full workflow without user re-explaining the steps each time.
Example 2: Reviewing an existing skill
User says: "Review my SKILL.md and suggest improvements"
Actions:
- Read the SKILL.md frontmatter — check name (kebab-case?), description (WHAT + WHEN? under 1024 chars? trigger phrases present?)
- Check body — is it under 5,000 words? Are instructions specific and actionable? Is there a Troubleshooting section? Examples?
- Simulate triggering — would the description cause Claude to load this skill for the right queries?
- Report findings as: PASS / WARN / FAIL per criterion
Result: Prioritized list of improvements with specific fixes for each issue.
Example 3: Troubleshooting a skill that doesn't trigger
User says: "My skill never loads automatically, I always have to invoke it manually"
Actions:
- Read the description field — is it too generic? ("Helps with projects" won't work)
- Check for missing trigger phrases — does it include words users would actually say?
- Ask Claude: "When would you use the [skill name] skill?" — Claude quotes the description back; gaps become obvious
- Rewrite description to add specific trigger phrases and retest
Result: Updated description with concrete triggers; skill auto-loads on relevant queries.
What is a skill?
A skill is a folder containing:
SKILL.md(required): Instructions in Markdown with YAML frontmatterscripts/(optional): Executable code (Python, Bash, etc.)references/(optional): Documentation loaded as neededassets/(optional): Templates, fonts, icons used in output
Core design principles
Progressive Disclosure — three levels:
- YAML frontmatter: always in system prompt; tells Claude when to load the skill
- SKILL.md body: loaded when relevant; full instructions
- Linked files in
references/: loaded on demand
Composability — skills work alongside others; don't assume exclusivity.
Portability — works identically across Claude.ai, Claude Code, and API.
Planning: Start with use cases
Before writing, define 2–3 concrete use cases:
Use Case: <name>
Trigger: User says "<phrase>" or "<phrase>"
Steps:
1. ...
2. ...
Result: <expected outcome>
Ask yourself:
- What does the user want to accomplish?
- What multi-step workflow is required?
- Which tools are needed (built-in or MCP)?
- What domain knowledge should be embedded?
Three skill categories
| Category | When to use | Key techniques |
|---|---|---|
| Document & Asset Creation | Consistent, high-quality output (docs, designs, code) | Style guides, templates, quality checklists |
| Workflow Automation | Multi-step processes with consistent methodology | Step-by-step with validation gates, iterative loops |
| MCP Enhancement | Workflow guidance on top of MCP tool access | Sequential MCP calls, embedded domain expertise |
Technical requirements
File & folder naming
- Folder: kebab-case only (
notion-project-setup) — no spaces, underscores, or capitals - File: exactly
SKILL.md(case-sensitive) — no variations - No
README.mdinside the skill folder (put docs inSKILL.mdorreferences/)
YAML frontmatter
Minimal required format:
---
name: your-skill-name
description: What it does. Use when user asks to [specific phrases].
---
name (required):
- kebab-case, no spaces or capitals
- Must match folder name
description (required):
- MUST include BOTH: what the skill does AND when to use it (trigger conditions)
- Under 1024 characters
- No XML tags (
<or>) - Include specific trigger phrases users would actually say
- Mention file types if relevant
Optional fields:
license: MIT
compatibility: "Requires Python 3.10+"
metadata:
author: Your Name
version: 1.0.0
mcp-server: server-name
Security restrictions — forbidden in frontmatter:
- XML angle brackets (
< >) - Names containing "claude" or "anthropic" (reserved)
Writing effective descriptions
Structure: [What it does] + [When to use it] + [Key capabilities]
Good examples:
# Specific and actionable
description: Analyzes Figma design files and generates developer handoff docs.
Use when user uploads .fig files, asks for "design specs", "component
documentation", or "design-to-code handoff".
# Includes trigger phrases
description: Manages Linear project workflows including sprint planning and
task creation. Use when user mentions "sprint", "Linear tasks", or asks
to "create tickets".
Bad examples:
# Too vague
description: Helps with projects.
# Missing triggers
description: Creates sophisticated multi-page documentation systems.
# Too technical, no user triggers
description: Implements the Project entity model with hierarchical relationships.
Writing instructions (SKILL.md body)
Recommended structure:
# Your Skill Name
## Instructions
### Step 1: [First Major Step]
Clear explanation of what happens.
### Step 2: ...
## Examples
### Example 1: [Common scenario]
User says: "..."
Actions:
1. ...
Result: ...
## Troubleshooting
### Error: [Common error message]
**Cause:** Why it happens
**Solution:** How to fix
Best practices for instructions
Be specific and actionable:
# Good
Run `python scripts/validate.py --input {filename}` to check data format.
If validation fails, common issues:
- Missing required fields (add to CSV)
- Invalid date formats (use YYYY-MM-DD)
# Bad
Validate the data before proceeding.
Include error handling — document common errors with cause and solution.
Reference bundled resources clearly:
Before writing queries, consult `references/api-patterns.md` for:
- Rate limiting guidance
- Pagination patterns
Use progressive disclosure — keep SKILL.md focused on core instructions; move detailed docs to references/ and link to them. Keep SKILL.md under 5,000 words.
For critical validations, prefer a bundled script over language instructions — code is deterministic, language interpretation isn't.
Testing approach
1. Triggering tests
Run 10–20 queries. Skill should trigger on ~90% of relevant queries and NOT trigger on unrelated topics.
Should trigger:
- "Help me set up a new ProjectHub workspace"
- "I need to create a project in ProjectHub"
Should NOT trigger:
- "What's the weather?"
- "Help me write Python code"
Debugging: Ask Claude "When would you use the [skill name] skill?" — it will quote the description back.
2. Functional tests
- Valid outputs generated
- API calls succeed
- Error handling works
- Edge cases covered
3. Performance comparison
Compare token count, tool calls, and back-and-forth messages with vs. without the skill.
Pro tip: Iterate on a single challenging task until Claude succeeds, then extract the winning approach into a skill.
Troubleshooting
Skill won't upload
| Error | Cause | Fix |
|---|---|---|
| "Could not find SKILL.md" | Wrong filename | Rename exactly to SKILL.md |
| "Invalid frontmatter" | YAML formatting | Add --- delimiters, close quotes |
| "Invalid skill name" | Spaces or capitals in name | Use kebab-case |
Skill doesn't trigger (undertriggering)
- Description too generic
- Missing trigger phrases users actually say
- Missing relevant file type mentions
Fix: Add more specific keywords and phrases to the description.
Skill triggers too often (overtriggering)
Add negative triggers and narrow the scope:
description: Advanced data analysis for CSV files. Use for statistical modeling,
regression, clustering. Do NOT use for simple data exploration.
Instructions not followed
- Too verbose — keep concise, use bullet points, move details to
references/ - Instructions buried — put critical instructions at top, use
## Criticalheaders - Ambiguous language — be explicit: "CRITICAL: Before calling X, verify: ..."
- Model laziness — add to user prompts (more effective than SKILL.md): "Take your time, quality over speed, do not skip validation steps"
Large context / slow responses
- Move detailed docs to
references/ - Keep SKILL.md under 5,000 words
- Reduce simultaneous enabled skills (evaluate if you have more than 20–50)
Workflow patterns
Five patterns cover most skill types: Sequential orchestration, Multi-MCP coordination, Iterative refinement, Context-aware tool selection, and Domain-specific intelligence.
For detailed examples and implementation templates for each pattern, consult references/patterns.md.
Quick checklist
Before you start:
- Identified 2–3 concrete use cases
- Tools identified (built-in or MCP)
- Planned folder structure
During development:
- Folder named in kebab-case
-
SKILL.mdexists (exact spelling, case-sensitive) - YAML frontmatter has
---delimiters -
name: kebab-case, no spaces, no capitals -
descriptionincludes WHAT and WHEN - No XML tags (
< >) anywhere - Instructions clear and actionable
- Error handling included
- Examples provided
- References clearly linked
Repository sync (mandatory for this repo):
-
CLAUDE.mdskill table updated -
README.mdskill table updated -
cc-best-practicesskill was loaded during this session -
validate-skills.shrun — noFAILlines - After push:
validate-skills.sh --remoterun — all skills found bynpx skills
Before upload:
- Triggers on obvious tasks
- Triggers on paraphrased requests
- Does NOT trigger on unrelated topics
- Functional tests pass
After upload:
- Test in real conversations
- Monitor for under/over-triggering
- Iterate on description and instructions
Related skills
More from dboeckli/ai-agent-skills and the wider catalog.

camel-matrix
Generate Apache Camel Spring Boot compatibility matrices with version range support.

cc-best-practices
Master Claude Code with context management, verification strategies, and the explore-plan-implement workflow.

project-references
Look up conventions and patterns from your own GitHub repositories checked out locally.

claude-command-converter
Convert Claude Code commands to portable Agent Skills format for multi-runtime compatibility.

speckit-analyze
Analyze spec.md, plan.md, and tasks.md for consistency, coverage gaps, and quality issues.

speckit-baseline
Generate feature specifications by analyzing existing source code.