Claude Code plugins explained: when to bundle skills, hooks and slash commands
Plugins package skills, hooks, slash commands and MCP servers into one installable unit. When to make one, what to put in it, and how to distribute it.
A Claude Code plugin is a folder that bundles skills, hooks, slash commands and MCP servers into one installable unit. Use it to share a complete workflow with your team or across your own projects. Plugins drop into .claude/plugins/<name>/ and load automatically.
Slash commands shortcut what you type. Hooks fire on system events. Skills give Claude new capabilities it can choose to use. Plugins bundle all of those together so you can install a whole workflow as a unit.
What’s in a plugin
A typical plugin directory looks like this:
my-plugin/
├── plugin.json # metadata
├── CLAUDE.md # plugin-specific instructions (optional)
├── commands/ # slash commands
│ ├── deploy.md
│ └── audit.md
├── skills/ # skills
│ └── shopify-product/
│ └── SKILL.md
├── hooks/ # hooks defined in settings
│ └── settings.json
└── mcp/ # MCP server configs
└── mcp.json
Drop the folder into .claude/plugins/ (project-scoped) or ~/.claude/plugins/ (user-scoped) and Claude Code picks it up on next session start.
When to make a plugin
- You’ve got a workflow your team repeats. Standardise it. Plugin gets versioned in git, everyone gets the same workflow.
- You operate the same kind of business across multiple repos. A client we work with has 4 separate repos that all benefit from the same Australian-business conventions. One plugin, four installs.
- You’re building tooling for a client. Ship them a plugin folder rather than a CLAUDE.md and “here’s what to copy.”
When not to make a plugin:
- One-off workflow: just use a slash command directly.
- Single project: project-scoped
.claude/folder is simpler. - Two related commands: not enough to justify the abstraction.
A real Australian SMB plugin
Here’s the shape we use at Boring Ventures for our internal boring-ventures-au plugin:
boring-ventures-au/
├── plugin.json # name, version, description
├── CLAUDE.md # AU English rules, $AUD, DD/MM/YYYY, no em dashes
├── commands/
│ ├── standup.md # daily standup from git activity
│ ├── changelog.md # CHANGELOG entry from recent commits
│ ├── aud.md # rewrite text in Australian English
│ └── quote.md # client quote from scope brief
├── skills/
│ ├── australian-context/
│ │ └── SKILL.md # ATO, ASIC, state-rev concepts
│ └── aud-formatter/
│ └── SKILL.md # currency + date formatting
└── hooks/
└── settings.json # date-injection hook, audit log
Installed in every DotVA and Lead Gen Empire repo. Standardises voice + conventions across 30+ repos without copy-pasting CLAUDE.md.
plugin.json shape
{
"name": "boring-ventures-au",
"version": "1.0.0",
"description": "Boring Ventures conventions for Australian business work",
"author": "Boring Ventures Pty Ltd",
"license": "MIT"
}
Currently the only mandatory fields are name and version. The rest is metadata for humans.
Distributing plugins
No central registry yet. Three patterns work:
- Git submodule. Add the plugin repo as a submodule under
.claude/plugins/. Update withgit submodule update --remote. - npm publish. Plugins are just folders, publish as a package and
npm installinto the right location. - Direct clone. Tell your team
git clone <plugin-repo> ~/.claude/plugins/<name>. Simplest, requires manual updates.
For our internal plugin, we use git submodules across all repos. For anything we’d open-source, npm is the better path because it handles version pinning.
What to put in your first plugin
If you’re thinking about your first plugin, start with these three things bundled:
- Your CLAUDE.md. Voice rules, language settings, project conventions.
- One slash command you use weekly.
- One hook, usually the date-injection or audit-log hook.
Tiny scope. Ship it. Add more as patterns surface.
What we wouldn’t put in a plugin (yet)
- Anything project-specific (kept in the project’s local
.claude/) - Anything with secrets (API keys, tokens, they go in env vars, not plugins)
- Anything you’re not sure will outlive a week (test as a local command first)
Common questions
What's the difference between a plugin and a skill?
Can I publish a plugin to a registry?
Do plugins work across Claude Code AND Claude Desktop?
Want this built for your business?
Book a free 30-minute AI audit. We'll map your business and show you exactly which systems we'd build first. No pitch deck, no scoping fee.
Book my free AI audit