Skills
Skills are reusable prompt files that teach Claude how to perform a specific task. They live as SKILL.md files and are invoked via slash commands.
File Locations
| Scope | Path |
|---|---|
| Personal (all projects) | ~/.claude/skills/<name>/SKILL.md |
| Project | .claude/skills/<name>/SKILL.md |
SKILL.md Structure
---
name: deploy
description: Deploy the app to production
disable-model-invocation: true # only user can invoke, not Claude automatically
allowed-tools: Bash(npm *) # tools Claude can use without asking
---
Instructions for Claude go here. This is plain markdown.Frontmatter Fields
| Field | Description |
|---|---|
name | Slug used as /name slash command |
description | Shown in /help; also used by Claude to decide when to auto-invoke |
disable-model-invocation: true | Prevents Claude from invoking the skill automatically |
user-invocable: false | Hides from slash commands; Claude-only |
allowed-tools | Tools usable without per-call approval (e.g. Read, Grep, Bash(git *)) |
argument-hint | Text shown in autocomplete, e.g. [filename] [style] |
context: fork | Run skill in an isolated subagent |
agent | Subagent type to use when context: fork is set |
String Substitutions
| Variable | Value |
|---|---|
$ARGUMENTS | All arguments passed to the slash command |
$0, $1, $2 | Positional arguments |
${CLAUDE_SKILL_DIR} | Absolute path to the skill's directory |
${CLAUDE_SESSION_ID} | Current session ID |
Dynamic Context Injection
Use !`command` to run a shell command and inline the output before Claude reads the skill:
## Changes to review
!`git diff HEAD~1`
Check for security issues and performance problems.Invocation
/skill-name
/skill-name arg1 arg2
Claude can also invoke skills automatically when the task matches the skill's description, unless disable-model-invocation: true is set.
Plugins
Plugins are packaged collections of skills, agents, hooks, and MCP servers — distributed and versioned for sharing across projects and teams.
Structure
my-plugin/
├── .claude-plugin/
│ └── plugin.json # required manifest
├── skills/
│ └── my-skill/
│ └── SKILL.md
├── agents/
├── hooks/
│ └── hooks.json
└── .mcp.json
Manifest (plugin.json)
{
"name": "my-plugin",
"description": "What this plugin does",
"version": "1.0.0",
"author": { "name": "Your Name" }
}Required fields: name, description, version. The name becomes the namespace prefix for all skills.
Invoking Plugin Skills
Plugin skills are namespaced to avoid conflicts:
/my-plugin:skill-name
Installation
# Browse and install via the plugin UI
/plugin
# Load a local plugin during development
claude --plugin-dir ./my-pluginSkills vs. Plugins
| Skills | Plugins | |
|---|---|---|
| Slash command | /skill-name | /plugin-name:skill-name |
| Stored in | .claude/skills/ | Directory with plugin.json |
| Versioned | No | Yes (semver) |
| Can bundle MCP servers | No | Yes |
| Best for | Single-project extensions | Sharing across teams |