8.7 KiB
Creating Skills
Step-by-step guidance for creating new Agent Skills in Claude Code.
Quick Start
1. Choose Skill Location
Personal Skills (~/.claude/skills/):
- Individual workflows
- Experimental skills
- Personal productivity tools
Project Skills (.claude/skills/):
- Team workflows
- Project-specific expertise
- Shared utilities (commit to git)
Plugin Skills (plugin's skills/ directory):
- Distributable skills
- Part of a plugin package
- Automatically available when plugin installed
2. Create Skill Directory
# Personal
mkdir -p ~/.claude/skills/my-skill-name
# Project
mkdir -p .claude/skills/my-skill-name
# Plugin
mkdir -p path/to/plugin/skills/my-skill-name
3. Create SKILL.md
Minimum required structure:
---
name: Your Skill Name
description: What it does and when to use it (include trigger terms)
---
# Your Skill Name
## Instructions
Provide clear, step-by-step guidance.
## Examples
Show concrete examples of using this skill.
Writing Effective Descriptions
The description field is critical for skill discovery.
Requirements
- Write in third person (goes into system prompt)
- Include WHAT the skill does
- Include WHEN to use it
- Add specific trigger terms users would mention
- Maximum 1024 characters
Good Examples
PDF Processing:
description: Extract text and tables from PDF files, fill forms, merge documents. Use when working with PDF files or when the user mentions PDFs, forms, or document extraction.
Excel Analysis:
description: Analyze Excel spreadsheets, create pivot tables, generate charts. Use when analyzing Excel files, spreadsheets, tabular data, or .xlsx files.
Git Commit Helper:
description: Generate descriptive commit messages by analyzing git diffs. Use when the user asks for help writing commit messages or reviewing staged changes.
Bad Examples
description: Helps with documents # Too vague
description: Processes data # Not specific enough
description: Does stuff with files # No trigger terms
Skill Structure Guidelines
Keep Skills Focused
One skill = one capability
Good (focused):
- "PDF form filling"
- "Excel data analysis"
- "Git commit messages"
Too broad (split into multiple skills):
- "Document processing"
- "Data tools"
- "File operations"
Use Progressive Disclosure
Keep SKILL.md under 500 lines. Split content into separate files.
Pattern:
my-skill/
├── SKILL.md # Main instructions (< 500 lines)
├── reference.md # Detailed API docs
├── examples.md # Usage examples
└── scripts/
└── helper.py # Utility scripts
In SKILL.md:
# My Skill
## Quick Start
[Brief overview and common usage]
## Advanced Features
For complete API documentation, see [reference.md](reference.md).
For usage patterns, see [examples.md](examples.md).
Claude loads additional files only when needed.
Avoid Deeply Nested References
Keep references one level deep from SKILL.md.
Bad (too deep):
# SKILL.md
See [advanced.md](advanced.md)...
# advanced.md
See [details.md](details.md)...
# details.md
Here's the actual information...
Good (one level):
# SKILL.md
**Basic usage**: [instructions in SKILL.md]
**Advanced features**: See [advanced.md](advanced.md)
**API reference**: See [reference.md](reference.md)
**Examples**: See [examples.md](examples.md)
Structure Longer Reference Files
For reference files >100 lines, include a table of contents:
# API Reference
## Contents
- Authentication and setup
- Core methods (create, read, update, delete)
- Advanced features (batch operations, webhooks)
- Error handling patterns
- Code examples
## Authentication and Setup
...
## Core Methods
...
Content Guidelines
Be Concise
Challenge each piece of information:
- Does Claude really need this explanation?
- Can I assume Claude knows this?
- Does this justify its token cost?
Good (concise):
## Extract PDF Text
Use pdfplumber:
```python
import pdfplumber
with pdfplumber.open("file.pdf") as pdf:
text = pdf.pages[0].extract_text()
```
Bad (too verbose):
## Extract PDF Text
PDF (Portable Document Format) files are a common file format that contains
text, images, and other content. To extract text from a PDF, you'll need to
use a library. There are many libraries available for PDF processing, but we
recommend pdfplumber because it's easy to use and handles most cases well.
First, you'll need to install it using pip. Then you can use the code below...
Use Consistent Terminology
Choose one term and use it throughout:
Good:
- Always "API endpoint"
- Always "field"
- Always "extract"
Bad:
- Mix "API endpoint", "URL", "API route", "path"
- Mix "field", "box", "element", "control"
Avoid Time-Sensitive Information
Bad:
If you're doing this before August 2025, use the old API.
Good:
## Current Method
Use the v2 API: `api.example.com/v2/messages`
## Old Patterns
<details>
<summary>Legacy v1 API (deprecated 2025-08)</summary>
The v1 API used: `api.example.com/v1/messages`
This endpoint is no longer supported.
</details>
Tool Restrictions (Optional)
Use allowed-tools to limit which tools Claude can use when the skill is active:
---
name: Safe File Reader
description: Read files without making changes. Use when you need read-only file access.
allowed-tools: Read, Grep, Glob
---
# Safe File Reader
This skill provides read-only file access.
## Instructions
1. Use Read to view file contents
2. Use Grep to search within files
3. Use Glob to find files by pattern
When this skill is active, Claude can only use the specified tools without asking permission.
Use cases:
- Read-only skills that shouldn't modify files
- Limited scope skills (e.g., only data analysis, no file writing)
- Security-sensitive workflows
Testing Your Skill
1. Test by Asking Relevant Questions
Ask questions that match your description:
Example: If your description mentions "PDF files":
Can you help me extract text from this PDF?
Claude should autonomously use your skill.
2. Check Skill Discovery
List all skills: Ask Claude: "What skills are available?"
Verify file structure:
# Personal
ls ~/.claude/skills/my-skill/SKILL.md
# Project
ls .claude/skills/my-skill/SKILL.md
3. Debug Common Issues
Skill doesn't activate:
- Make description more specific
- Include trigger terms users would mention
- Add "when to use" guidance
YAML syntax errors:
cat SKILL.md | head -n 10
Ensure:
- Opening
---on line 1 - Closing
---before markdown - Valid YAML (no tabs, correct indentation)
Wrong location: Check skill is in correct directory with SKILL.md file.
Complete Examples
Simple Skill (Single File)
commit-helper/
└── SKILL.md
SKILL.md:
---
name: Generating Commit Messages
description: Generates clear commit messages from git diffs. Use when writing commit messages or reviewing staged changes.
---
# Generating Commit Messages
## Instructions
1. Run `git diff --staged` to see changes
2. Suggest a commit message with:
- Summary under 50 characters
- Detailed description
- Affected components
## Best Practices
- Use present tense
- Explain what and why, not how
Multi-File Skill
pdf-processing/
├── SKILL.md
├── FORMS.md
├── REFERENCE.md
└── scripts/
├── fill_form.py
└── validate.py
SKILL.md:
---
name: PDF Processing
description: Extract text, fill forms, merge PDFs. Use when working with PDF files, forms, or document extraction. Requires pypdf and pdfplumber packages.
---
# PDF Processing
## Quick Start
Extract text:
```python
import pdfplumber
with pdfplumber.open("doc.pdf") as pdf:
text = pdf.pages[0].extract_text()
```
For form filling, see [FORMS.md](FORMS.md).
For detailed API reference, see [REFERENCE.md](REFERENCE.md).
## Requirements
Install packages:
```bash
pip install pypdf pdfplumber
```
Best Practices Summary
✅ Do:
- Write descriptions in third person
- Include trigger terms in description
- Keep SKILL.md under 500 lines
- Use progressive disclosure for large content
- Be concise - assume Claude is smart
- Use consistent terminology
- Test with relevant questions
- Keep skills focused (one capability per skill)
❌ Don't:
- Write vague descriptions
- Include time-sensitive information
- Nest references more than one level deep
- Over-explain things Claude already knows
- Create overly broad skills
- Use inconsistent terminology