# Best Practices for Writing Claude Skills Comprehensive guide to creating effective, maintainable, and discoverable skills. ## Core Principles ### 1. Be Concise **Why**: Skills extend Claude's knowledge. Claude already has extensive capabilities - only add what's truly new. **How**: - Challenge every sentence: "Does Claude really need this?" - Remove obvious information - Keep SKILL.md under 500 lines - Move extensive details to reference files **Examples**: ```markdown # Too verbose ## Processing Files When you need to process files, first you should read them using the Read tool. The Read tool is a built-in capability that allows you to access file contents. After reading, analyze the content carefully. # Concise (Claude knows this) ## Processing Files Extract key metrics from each file and aggregate results. ``` ### 2. Set Appropriate Degrees of Freedom **Why**: Match specificity to task complexity and fragility. **High Freedom**: For flexible, creative tasks where Claude can adapt ```markdown Analyze the codebase and suggest architectural improvements. ``` **Low Freedom**: For fragile, sequence-critical, or safety-critical operations ```markdown 1. Backup database to `backups/db_YYYYMMDD.sql` 2. Run migration: `npm run migrate:up` 3. Verify migration: check `schema_version` table 4. If verification fails, rollback: `npm run migrate:down` ``` **Balance**: ```markdown # Too restrictive (micro-managing) 1. Open the file 2. Read line 1 3. Parse the date 4. Store in variable called 'date' # Appropriate Extract the date from the first line using format YYYY-MM-DD. Validate it's a valid date before proceeding. ``` ### 3. Clear Naming **Skill Names** (in frontmatter): - Use gerund form (verb + -ing) - Be specific and descriptive - Avoid vague terms ```yaml # Good name: Analyzing Performance Metrics name: Generating API Documentation name: Processing Invoice PDFs # Avoid name: Helper name: Utils name: Manager name: Processor ``` **Directory Names**: ``` # Good performance-analyzer/ api-doc-generator/ invoice-processor/ # Avoid helper/ utils/ thing/ ``` ### 4. Specific Descriptions **Why**: The description determines when Claude chooses to use your skill. **Formula**: [Action] [specific task] [key context/constraints] ```yaml # Excellent description: Analyzes React components for performance anti-patterns including unnecessary re-renders, missing memoization, and inefficient hooks usage # Good description: Processes invoice PDFs to extract vendor, date, items, and total with validation # Too vague (Claude won't know when to use it) description: Helps with documents description: A useful utility ``` **Include key terms**: ```yaml # Include technology names description: Creates TypeScript React components with styled-components and Jest tests # Include output formats description: Converts CSV data to validated JSON following schema.org format # Include constraints description: Generates API documentation from JSDoc comments preserving examples and types ``` ## Writing Effective Instructions ### Structure Your Instructions ```markdown # Good structure ## Overview Brief 1-2 sentence summary ## Prerequisites What must exist or be true before starting ## Workflow 1. Step one with specifics 2. Step two with validation 3. Step three with output format ## Validation How to verify success ## Examples Concrete examples ``` ### Be Specific About Outputs ```markdown # Vague Generate a report. # Specific Generate a report in markdown with: - Summary section with key findings - Metrics table with columns: metric, value, threshold, status - Recommendations list ordered by priority ``` ### Include Validation Steps ```markdown # Without validation 1. Parse the configuration 2. Apply settings 3. Restart service # With validation 1. Parse the configuration 2. Validate required fields exist: host, port, api_key 3. Apply settings 4. Verify service starts successfully (check port is listening) ``` ### Provide Context for Decisions ```markdown # No context Use the fast algorithm. # With context Use the fast algorithm for files under 10MB. For larger files, use the streaming algorithm to avoid memory issues. ``` ## Progressive Disclosure ### When to Use Reference Files Use reference files when: - Background information exceeds 100 lines - API documentation is comprehensive - Multiple detailed examples are needed - Content is optional/advanced ### Self-Contained Skills **IMPORTANT**: Skills must be completely self-contained within their own directory. **DO:** - Reference files within the skill directory: `reference/api-docs.md` - Include all necessary content within the skill structure - Duplicate information if needed across multiple skills **DON'T:** - Reference files outside the skill directory (e.g., `../../CLAUDE.md`) - Reference project files (e.g., `../other-skill/reference.md`) - Depend on external documentation not in the skill directory Why: Skills may be used in different contexts (personal, project, plugin) and must work independently without external dependencies. ### How to Reference ```markdown # Good: Clear purpose, internal reference For complete API reference, see `reference/api-docs.md` See `reference/examples.md` for 10+ real-world examples # Bad: External reference See the project CLAUDE.md for more details Refer to ../../docs/guide.md # Too vague More info in reference folder ``` ### What Stays in SKILL.md Keep in SKILL.md: - Core workflow (the "what" and "how") - Essential constraints - 1-2 key examples - Validation steps - References to detailed docs (within skill directory) Move to reference files: - Extended background ("why" and history) - Comprehensive API documentation - Many examples - Edge cases - Troubleshooting guides ## Documentation Patterns ### Avoid Time-Sensitive Information ```markdown # Avoid (will become outdated) Use the new React hooks API introduced in version 16.8 # Better (timeless) Use React hooks for state management ``` ### Use Consistent Terminology Pick terms and stick with them: ```markdown # Inconsistent 1. Parse the document 2. Extract data from the file 3. Process the input # Consistent 1. Parse the document 2. Extract data from the document 3. Process the document ``` ### Write for the Model Remember: Skills are for Claude, not humans. ```markdown # Too human-centric This is a really helpful tool that makes your life easier! Everyone loves this workflow because it's so intuitive. # Model-focused Extract structured data from unstructured logs using these patterns. ``` ### Provide Concrete Examples ```markdown # Abstract Process dates correctly. # Concrete Convert dates to ISO 8601 format: - Input: "Jan 15, 2024" → Output: "2024-01-15" - Input: "3/7/24" → Output: "2024-03-07" ``` ## Tool Restrictions ### When to Restrict Restrict tools (`allowed-tools`) when: 1. **Safety-critical operations**: Prevent unintended modifications ```yaml allowed-tools: [Read, Grep, Glob] # Read-only analysis ``` 2. **Enforcing workflow**: Must use specific tools in order ```yaml allowed-tools: [Bash] # Only run provided scripts ``` 3. **Compliance**: Must not modify certain files ```yaml allowed-tools: [Read, Grep] # Audit mode ``` ### Common Patterns ```yaml # Analysis only allowed-tools: [Read, Grep, Glob] # File operations allowed-tools: [Read, Write, Edit, Glob, Grep] # Development allowed-tools: [Read, Write, Edit, Bash, Glob, Grep] # Script execution allowed-tools: [Bash, Read] ``` ### Don't Over-Restrict ```yaml # Too restrictive (Claude can't be effective) allowed-tools: [Read] # Better (if editing is needed) allowed-tools: [Read, Edit, Grep, Glob] ``` ## Script Best Practices ### When to Use Scripts Use scripts for: - Deterministic operations (same input → same output) - Complex calculations - API calls - System operations - Validation logic Don't use scripts for: - What Claude can do better (analysis, decision-making) - Simple operations - One-off tasks ### Script Structure ```python #!/usr/bin/env python3 """ Brief description of what this script does. Usage: python script.py input.json output.json Exit codes: 0: Success 1: Validation error 2: File error """ import sys import json def main(): # Clear error handling if len(sys.argv) != 3: print("Usage: script.py input.json output.json", file=sys.stderr) sys.exit(1) # Validate inputs # Process data # Output results if __name__ == "__main__": main() ``` ### Script Documentation In SKILL.md: ```markdown ## Validation Run `scripts/validate.py` to verify output format: \`\`\`bash python scripts/validate.py output.json \`\`\` Returns exit code 0 on success, 1 on validation errors. ``` ## Testing Skills ### Create Test Scenarios Before writing extensive documentation: ```markdown # Test scenarios 1. Input: Simple case Expected: Standard output 2. Input: Edge case (empty file) Expected: Handle gracefully 3. Input: Invalid data Expected: Clear error message ``` ### Iterative Development 1. Start with minimal SKILL.md 2. Test with Claude on real task 3. Note what Claude struggles with 4. Add specific guidance for those areas 5. Repeat until effective ### Evaluation Questions - Does Claude discover the skill appropriately? - Does Claude understand when NOT to use it? - Are outputs consistent and correct? - Does Claude handle edge cases? - Is the skill too restrictive or too loose? ## Common Mistakes ### Mistake 1: Over-Explaining ```markdown # Bad The Read tool is a powerful capability that allows you to read files. You should use it when you need to access file contents. Files are stored on disk and contain data... # Good Read the configuration file and extract the database settings. ``` ### Mistake 2: Vague Descriptions ```yaml # Bad description: Helps with things # Good description: Converts CSV sales data to quarterly revenue reports with charts ``` ### Mistake 3: Missing Examples ```markdown # Bad Format the output appropriately. # Good Format output as JSON: { "metric": "response_time", "value": 245, "unit": "ms" } ``` ### Mistake 4: No Validation ```markdown # Bad 1. Parse config 2. Apply changes 3. Done # Good 1. Parse config 2. Validate required fields: api_key, endpoint, timeout 3. Apply changes 4. Verify: curl endpoint returns 200 ``` ### Mistake 5: Monolithic SKILL.md ```markdown # Bad: Everything in SKILL.md (800 lines) [200 lines of background] [300 lines of API docs] [300 lines of examples] # Good: Progressive disclosure # SKILL.md (200 lines) - Core workflow - Key example - Reference to `reference/api-docs.md` - Reference to `reference/examples.md` ``` ## Skill Maintenance ### Versioning If distributing via plugin: - Increment plugin version in `plugin.json` - Document changes in plugin changelog - Test with current Claude model ### Evolution As skills mature: 1. Monitor usage patterns 2. Refine based on real usage 3. Add missing edge cases 4. Remove unnecessary verbosity 5. Update examples ### Deprecation When deprecating: 1. Update description: "DEPRECATED: Use skill-name-v2 instead" 2. Keep functional for transition period 3. Document migration path 4. Remove after transition ## Performance Optimization ### Reduce Token Usage ```markdown # Higher token usage Detailed explanation of every step with comprehensive background information that Claude likely already knows from pre-training. # Optimized [Concise instructions referencing detailed docs in reference/ as needed] ``` ### Faster Discovery Make skills discoverable with specific descriptions: ```yaml # Faster discovery (specific terms) description: Processes Stripe webhook events for payment.succeeded and payment.failed # Slower discovery (vague) description: Handles webhooks ``` ## Collaboration ### Team Skills When creating skills for teams: - Document project-specific conventions - Include team workflow patterns - Reference team tools and systems - Use consistent terminology across team skills ### Skill Libraries Organize related skills: ``` .claude/skills/ ├── data-processing/ │ ├── csv-processor/ │ ├── json-transformer/ │ └── xml-parser/ └── code-generation/ ├── react-components/ └── api-endpoints/ ``` ## Advanced Patterns ### Skill Composition Reference other skills: ```markdown This skill builds on the "Processing CSVs" skill. First use that skill to parse the data, then apply the transformations below. ``` ### Conditional Workflows ```markdown If dataset < 1000 rows: Process in-memory using standard algorithm If dataset >= 1000 rows: 1. Split into chunks of 1000 rows 2. Process each chunk 3. Aggregate results ``` ### Feedback Loops ```markdown 1. Generate initial output 2. Validate against schema 3. If validation fails: - Review error messages - Adjust output - Re-validate 4. Repeat until valid ``` ## Checklist for High-Quality Skills Before finalizing a skill: - [ ] Name uses gerund form and is specific - [ ] Description is clear, specific, includes key terms - [ ] SKILL.md is under 500 lines - [ ] Examples are concrete and helpful - [ ] Validation steps are included - [ ] Tool restrictions are appropriate (if any) - [ ] Scripts have error handling and documentation - [ ] Reference files are well-organized - [ ] Tested with real scenarios - [ ] No time-sensitive information - [ ] Consistent terminology throughout - [ ] Clear when to use / when not to use ## Key Principles Summary 1. **Be concise**: Only what Claude doesn't know 2. **Be specific**: Clear names, descriptions, examples 3. **Be practical**: Test with real scenarios 4. **Be progressive**: Start simple, add detail as needed 5. **Be consistent**: Terminology, formatting, style 6. **Be validated**: Include verification steps 7. **Be discovered**: Specific descriptions with key terms 8. **Be maintained**: Update based on usage Remember: Skills are extensions of Claude's capabilities. Make them focused, discoverable, and effective by following these practices.