skills
https://github.com/anthropics/skills
https://github.com/openai/skills
How to create custom Skills
Skills can be as simple as a few lines of instructions or as complex as multi-file packages with executable code. The best Skills:
- Solve a specific, repeatable task
- Have clear instructions that model can follow
- Include examples when helpful
- Define when they should be used
- Are focused on one workflow rather than trying to do everything
Create a Skill.md file
Every Skill consists of a directory containing at minimum a Skill.md file, which is the core of the Skill. This file must start with a YAML frontmatter to hold name and description fields, which are required metadata. It can also contain additional metadata, instructions for Claude or reference files, executable scripts, or tools.
Required metadata fields
name: A human-friendly name for your Skill (64 characters maximum)
- Example: Brand Guidelines
description: A clear description of what the Skill does and when to use it.
- This is critical—Claude uses this to determine when to invoke your Skill (200 characters maximum).
- Example: Apply Acme Corp brand guidelines to presentations and documents, including official colors, fonts, and logo usage.
Optional metadata fields
dependencies: Software packages required by your Skill.
- Example: python>=3.8, pandas>=1.5.0
The metadata in the Skill.md file serves as the first level of a progressive disclosure system, providing just enough information for Claude to know when the Skill should be used without having to load all of the content.
Markdown body
The Markdown body is the second level of detail after the metadata, so Claude will access this if needed after reading the metadata. Depending on your task, Claude can access the Skill.md file and use the Skill.
Example Skill.md
Brand guidelines skill
## Metadata
name: Brand Guidelines
description: Apply Acme Corp brand guidelines to all presentations and documents
## Overview
This Skill provides Acme Corp's official brand guidelines for creating consistent, professional materials. When creating presentations, documents, or marketing materials, apply these standards to ensure all outputs match Acme's visual identity. Claude should reference these guidelines whenever creating external-facing materials or documents that represent Acme Corp.
## Brand Colors
Our official brand colors are:
- Primary: #FF6B35 (Coral)
- Secondary: #004E89 (Navy Blue)
- Accent: #F7B801 (Gold)
- Neutral: #2E2E2E (Charcoal)
## Typography
Headers: Montserrat Bold
Body text: Open Sans Regular
Size guidelines:
- H1: 32pt
- H2: 24pt
- Body: 11pt
## Logo Usage
Always use the full-color logo on light backgrounds. Use the white logo on dark backgrounds. Maintain minimum spacing of 0.5 inches around the logo.
## When to Apply
Apply these guidelines whenever creating:
- PowerPoint presentations
- Word documents for external sharing
- Marketing materials
- Reports for clients
## Resources
See the resources folder for logo files and font downloads.
Add resources
If you have too much information to add to a single Skill.md file (e.g., sections that only apply to specific scenarios), you can add more content by adding files within your Skill directory. For example, add a REFERENCE.md file containing supplemental and reference information to your Skill directory. Referencing it in Skill.md will help Claude decide if it needs to access that resource when executing the Skill.
Add scripts
For more advanced Skills, attach executable code files to Skill.md, allowing Claude to run code. For example, our document skills use the following programming languages and packages:
- Python (pandas, numpy, matplotlib)
- JavaScript/Node.js
- Packages to help with file editing
- visualization tools
Note: Claude and Claude Code can install packages from standard repositories (Python PyPI, JavaScript npm) when loading Skills. It’s not possible to install additional packages at runtime with API Skills—all dependencies must be pre-installed in the container.
Package your skill
Once your Skill folder is complete:
- Ensure the folder name matches your Skill’s name.
- Create a ZIP file of the folder.
- The ZIP should contain the Skill folder as its root (not a subfolder).
Correct structure:
my-Skill.zip
└── my-Skill/
├── Skill.md
└── resources/
Incorrect structure:
my-Skill.zip
└── (files directly in ZIP root)
Test your skill
Before uploading
1. Review your Skill.md for clarity
2. Check that the description accurately reflects when Claude should use the Skill
3. Verify all referenced files exist in the correct locations
4. Test with example prompts to ensure Claude invokes it appropriately
After uploading to Claude
1. Enable the Skill in Customize > Skills.
2. Try several different prompts that should trigger it
3. Review Claude’s thinking to confirm it’s loading the Skill
4. Iterate on the description if Claude isn’t using it when expected
Note for Team and Enterprise plans: To make a skill available to all users in your organization, see Provision and manage Skills for your organization.
Best practices
Keep it focused: Create separate Skills for different workflows. Multiple focused Skills compose better than one large Skill.
Write clear descriptions: Claude uses descriptions to decide when to invoke your Skill. Be specific about when it applies.
Start simple: Begin with basic instructions in Markdown before adding complex scripts. You can always expand on the Skill later.
Use examples: Include example inputs and outputs in your Skill.md file to help Claude understand what success looks like.
Test incrementally: Test after each significant change rather than building a complex Skill all at once.
Skills can build on each other: While Skills can’t explicitly reference other Skills, Claude can use multiple Skills together automatically. This composability is one of the most powerful parts of the Skills feature.
Review the open Agent Skills specification: Follow the guidelines at agentskills.io, so skills you create can work across platforms that adopt the standard.
For a more in-depth guide to skill creation, refer to Skill authoring best practices in our Claude Docs.
Security considerations
- Exercise caution when adding scripts to your Skill.md file.
- Don’t hardcode sensitive information (API keys, passwords).
- Review any Skills you download before enabling them.
- Use appropriate MCP connections for external service access.
Example skills to reference
Visit our repository on GitHub for example Skills you can use as templates: https://github.com/anthropics/skills/tree/main/skills.
sample:
| name | description | license |
|---|---|---|
| webapp-testing | Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs. | Complete terms in LICENSE.txt |
Web Application Testing
To test local web applications, write native Python Playwright scripts.
Helper Scripts Available:
scripts/with_server.py– Manages server lifecycle (supports multiple servers)
Always run scripts with --help first to see usage. DO NOT read the source until you try running the script first and find that a customized solution is abslutely necessary. These scripts can be very large and thus pollute your context window. They exist to be called directly as black-box scripts rather than ingested into your context window.
Decision Tree: Choosing Your Approach
User task → Is it static HTML?
├─ Yes → Read HTML file directly to identify selectors
│ ├─ Success → Write Playwright script using selectors
│ └─ Fails/Incomplete → Treat as dynamic (below)
│
└─ No (dynamic webapp) → Is the server already running?
├─ No → Run: python scripts/with_server.py --help
│ Then use the helper + write simplified Playwright script
│
└─ Yes → Reconnaissance-then-action:
1. Navigate and wait for networkidle
2. Take screenshot or inspect DOM
3. Identify selectors from rendered state
4. Execute actions with discovered selectors
Example: Using with_server.py
To start a server, run --help first, then use the helper:
Single server:
python scripts/with_server.py --server "npm run dev" --port 5173 -- python your_automation.py
Multiple servers (e.g., backend + frontend):
python scripts/with_server.py \ --server "cd backend && python server.py" --port 3000 \ --server "cd frontend && npm run dev" --port 5173 \ -- python your_automation.py
To create an automation script, include only Playwright logic (servers are managed automatically):
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True) # Always launch chromium in headless mode
page = browser.new_page()
page.goto('http://localhost:5173') # Server already running and ready
page.wait_for_load_state('networkidle') # CRITICAL: Wait for JS to execute
# ... your automation logic
browser.close()
Reconnaissance-Then-Action Pattern
- Inspect rendered DOM:page.screenshot(path=’/tmp/inspect.png’, full_page=True) content = page.content() page.locator(‘button’).all()
- Identify selectors from inspection results
- Execute actions using discovered selectors
Common Pitfall
❌ Don’t inspect the DOM before waiting for networkidle on dynamic apps ✅ Do wait for page.wait_for_load_state('networkidle') before inspection
Best Practices
- Use bundled scripts as black boxes – To accomplish a task, consider whether one of the scripts available in
scripts/can help. These scripts handle common, complex workflows reliably without cluttering the context window. Use--helpto see usage, then invoke directly. - Use
sync_playwright()for synchronous scripts - Always close the browser when done
- Use descriptive selectors:
text=,role=, CSS selectors, or IDs - Add appropriate waits:
page.wait_for_selector()orpage.wait_for_timeout()
Reference Files
- examples/ – Examples showing common patterns:
element_discovery.py– Discovering buttons, links, and inputs on a pagestatic_html_automation.py– Using file:// URLs for local HTMLconsole_logging.py– Capturing console logs during automation