Claude Code reference

What a Claude Code skills plugin actually is

A skill is one folder with a SKILL.md. A plugin is a bundle that wraps one or more skills plus optional MCP servers, slash commands, hooks, and subagents, distributed through a marketplace. Below: the literal install path, the folder layout that separates the two, and the extra wrinkle when Claude Code runs inside a wrapper that pre-installs its own skills.

M
Matthew Diakonov
10 min read

Direct answer (verified 2026-05-14)

A Claude Code plugin is a directory that bundles one or more Skills (each a folder containing a SKILL.md) plus any combination of MCP servers, slash commands, hooks, output styles, and subagents. Plugins are distributed through marketplaces and installed with /plugin install <name>@<marketplace>. A Skill is the atomic unit (instructions Claude loads on demand). A Plugin is the shipping container. The official marketplace is named claude-plugins-official and is auto-registered on first run; you can also add third-party marketplaces from any GitHub repo, git URL, or local path.

Verified against code.claude.com/docs/en/discover-plugins and the anthropics/skills repo on 2026-05-14.

Skill vs plugin: the folder layout makes the difference obvious

The confusion in this space comes from documentation that uses “skill” and “plugin” interchangeably. They are not interchangeable. A skill is one folder; a plugin is a directory tree that can contain many skills plus other things. Side-by-side:

Two folder shapes you'll see in the wild

~/.claude/skills/my-task/
  SKILL.md           # YAML frontmatter + markdown
  scripts/
    helper.py        # optional supporting files
  resources/
    template.md
-120% more files in a plugin

Loose skills live under ~/.claude/skills/<name>/ and are read by Claude Code on every startup. Plugins live under ~/.claude/plugins/cache/<marketplace>/<plugin>/ after install, with their installation registered in ~/.claude/settings.json under enabledPlugins. A plugin's skills are addressed with a namespace prefix: /<plugin-name>:<skill-name>. Loose skills have no prefix.

The four-step install path, end to end

From a clean Claude Code install, going from “no plugins” to “working plugin” is four commands. Each step is independently undoable.

  1. 1

    Add the marketplace

    /plugin marketplace add anthropics/claude-code (or any owner/repo, git URL, or local path)

  2. 2

    Browse the catalog

    /plugin opens a tabbed UI: Discover, Installed, Marketplaces, Errors

  3. 3

    Install one plugin

    /plugin install commit-commands@anthropics-claude-code (user, project, or local scope)

  4. 4

    Activate without restart

    /reload-plugins picks up the new skills, commands, MCP servers, and hooks

Two notes that aren't in the official walkthrough. First, /plugin marketplace add never installs anything; it just registers a catalog. You can have ten marketplaces added and zero plugins installed. Second, /reload-plugins is the difference between “the install succeeded but the new skill isn't firing” and “the new skill is live in this session.” If you forget the reload step and the skill doesn't fire, that's usually why.

The wrinkle: wrapped Claude Code clients can also bundle skills

Most guides assume you're running claude in a terminal. A growing number of users now run Claude Code inside a wrapper that speaks Agent Client Protocol (Zed, Fazm, and others). The agent loop is identical (the same Node.js process the CLI spawns), so every /plugin command still works. But the wrapper may add a second delivery channel for skills that exists independent of any marketplace.

Two ways skills land in ~/.claude/skills/

User runs /plugin install pdf-toolkit@some-marketplace. Claude Code downloads the plugin tree from a git source, caches it under ~/.claude/plugins/cache/, and the skill becomes addressable as /pdf-toolkit:pdf. Updates require running /plugin marketplace update or having auto-update enabled. Fully network-dependent on first install.

  • Triggered by a slash command
  • Lives under ~/.claude/plugins/cache/
  • Namespaced as /<plugin>:<skill>
  • Updates via marketplace refresh

The two approaches don't conflict. Claude Code reads any folder under ~/.claude/skills/ on startup, regardless of how it got there. A plugin installed via the official marketplace and a skill bundled by a wrapper can coexist on the same machine. The only collision risk is if you try to hand-edit a bundled skill; the wrapper's checksum reconcile will overwrite your edit on the next launch because the bundled file is treated as a first-party app resource.

What that looks like in practice: the 17 skills Fazm pre-installs

For a concrete example of bundled-with-the-app skills, here's Fazm's current inventory at the resource path Contents/Resources/BundledSkills/ (v2.9.17, May 14 2026). Each card is a single .skill.md file that ends up at ~/.claude/skills/<name>/SKILL.md after first launch. The two accent cards (google-workspace-setup and find-skills) are the ones that span two columns in the onboarding UI because the categoryMap inside SkillInstaller.swift groups them as “Productivity” and “Discovery”.

pdf

Read, split, merge, extract text and tables from local PDF files.

docx

Create, read, edit Word documents including tables and frontmatter.

xlsx

Open, read, edit, and repair spreadsheets (.xlsx, .xlsm, .csv, .tsv).

pptx

Create and read slide decks including pitch decks and presentations.

google-workspace-setup

Walk through Google Cloud OAuth without copy-pasting between tabs.

telegram

Send and read Telegram messages from a CLI hook the model can call.

ai-browser-profile

Read your real Chrome profile so the agent has your accounts and prefs.

deep-research

Multi-source synthesis with citation tracking and 10+ source verification.

travel-planner

Trips, itineraries, budgets, with one-time profile collection.

web-scraping

Python-based web scraping and structured data extraction.

video-edit

Edit long videos into short clips using transcript analysis + ffmpeg.

frontend-design

Production-grade UI designs with tokens and accessibility checks.

canvas-design

Posters and static visual art as .png and .pdf documents.

doc-coauthoring

Structured workflow for technical specs, proposals, and decision docs.

social-autoposter

Posts to Reddit and X with engagement tracking (npm-updated).

social-autoposter-setup

First-run wizard creating the database and verifying platform logins.

find-skills

Search skillhu.bz and skills.sh, present matches, install the chosen one.

None of these are Claude Code plugins in the marketplace sense; they're plain SKILL.md files. The plugin format only becomes the right tool when a bundle needs to ship more than just instructions (an MCP server, slash commands, hooks). For pure-instructions skills like these, the loose-folder layout is simpler and faster to update.

When to reach for a plugin vs a loose SKILL.md

A quick decision rule that holds up in practice:

  • One repeatable instruction, no external code? Drop a SKILL.md into ~/.claude/skills/<name>/ and move on. No manifest, no marketplace, no version pin. The simplest thing that could possibly work.
  • Multiple skills that share a theme, or an MCP server, or hooks, or slash commands? Build a plugin. The manifest holds them together and the namespace prefix keeps the parts from colliding with anything else on the user's machine.
  • Distribution to a team or the public? Plugin, then a marketplace. The marketplace handles versioning, auto-update, and scoping (user, project, local) for free. Try to ship a SKILL.md as a public artifact and you'll end up reinventing all three.
  • Bundled with an app the user already trusts? Neither a plugin nor a loose folder is quite right. Use the SkillInstaller pattern: ship the files inside the signed app, sync to ~/.claude/skills/ on launch, checksum-compare on subsequent launches. This is what Fazm does for its 17 bundled skills because the audience is Mac owners who won't run git clone or npm install.

Frequently asked questions

Is a Claude Code skills plugin the same thing as a skill?

No. A skill is a folder containing a single SKILL.md (plus optional scripts and resources) that Claude Code loads dynamically when its frontmatter description matches the active task. A plugin is the shipping container: a directory with a .claude-plugin/plugin.json (or marketplace entry) that can include one or more skills, plus any combination of MCP servers, slash commands, hooks, output styles, and subagents. The plugin format exists so that a single /plugin install command pulls down a whole capability bundle instead of cloning seven repos by hand. If a tool only adds one SKILL.md, the plugin format is overkill; if it adds a SKILL.md, an MCP server config, and a few slash commands together, the plugin format is what holds them together.

What does /plugin install <name>@claude-plugins-official actually do?

It looks up the named plugin in the local marketplace cache, downloads the plugin's directory tree from its git source, copies it into ~/.claude/plugins/cache/<marketplace>/<plugin>/, and registers it in your user-scope settings under enabledPlugins. Each skill the plugin contains becomes addressable as /<plugin-name>:<skill-name>, each slash command becomes a top-level slash command, each MCP server is registered, and each hook is wired into the relevant lifecycle event. If you install while a Claude Code session is open, you also need to run /reload-plugins to pick up the new skills/commands/hooks/servers without restarting. The cache directory is the reason "files not found after installation" errors show up when a plugin references files outside its own folder: only the files inside the plugin directory get copied.

Where does the official Anthropic marketplace live and what's in it?

It's a built-in marketplace named claude-plugins-official, automatically registered on first run. It includes three main families: code intelligence plugins that wire up Language Server Protocol for clangd, gopls, pyright, rust-analyzer, sourcekit-lsp, typescript-language-server, and friends (each is a separate plugin); external-integration plugins that bundle pre-configured MCP servers for github, gitlab, atlassian, asana, linear, notion, figma, vercel, firebase, supabase, slack, and sentry; and development workflow plugins like commit-commands, pr-review-toolkit, agent-sdk-dev, and plugin-dev. The full catalog is browsable inside Claude Code with /plugin (Discover tab) or on the web at claude.com/plugins.

Can I run /plugin install inside Fazm the same way I would on the bare CLI?

Yes, because Fazm runs the real Claude Code under the hood via @agentclientprotocol/claude-agent-acp 0.29.2 (pinned in /Users/matthewdi/fazm/acp-bridge/package.json line 15). The agent loop is not a reimplementation; it's the same Node.js process that the claude CLI spawns, just driven through ACP and rendered in a native SwiftUI window. Slash commands like /plugin install, /plugin marketplace add owner/repo, and /reload-plugins all work because they're handled by Claude Code itself, not by the wrapper. The wrapper adds a sidecar layer (custom MCP servers for browser and accessibility-API control, persistent windows, no auto-compact) on top of that loop, but it never replaces the Claude Code primitives.

How are Fazm's bundled skills different from skills I'd install from a plugin marketplace?

Both end up in the same place (~/.claude/skills/<name>/SKILL.md), and Claude Code does not distinguish between them at load time. The delivery channel differs. A marketplace plugin is fetched over the network from a git source the first time you run /plugin install, cached under ~/.claude/plugins/cache/, and refreshed when you run /plugin marketplace update or when auto-update fires at startup. A Fazm bundled skill ships inside the signed .app bundle at Contents/Resources/BundledSkills/<name>.skill.md, is installed to ~/.claude/skills/<name>/SKILL.md on first launch, and is reconciled on every subsequent launch via a SHA-256 checksum compare (SkillInstaller.swift lines 118-122). The practical implication: bundled skills update when you accept a Fazm app update (via Sparkle), marketplace plugins update when you run /plugin marketplace update or have auto-update on for that marketplace.

Can I create my own plugin and install it locally?

Yes. The minimum viable plugin is a directory with a .claude-plugin/plugin.json declaring the plugin's name and a skills/ subfolder with one or more <skill-name>/SKILL.md files. Drop it into a directory you control, run /plugin marketplace add ./path/to/your-marketplace (the marketplace can be the same directory if it also has a .claude-plugin/marketplace.json file listing the plugin), then /plugin install <plugin-name>@<marketplace-name>. The plugin-dev plugin in the official marketplace ships scaffolding for this. The /plugin marketplace add command also accepts a direct path to a marketplace.json file or a GitHub owner/repo shorthand.

What's the practical difference between a plugin and just dropping a SKILL.md into ~/.claude/skills/?

If you only need to teach Claude one repeatable workflow, dropping a SKILL.md is the smaller and more transparent option: one file, no manifest, no marketplace. Plugins start being worth the overhead when you need to ship more than just instructions: MCP server configurations, slash commands (so the user can type /yourthing:command instead of asking Claude to do something), hooks (pre-tool-use and post-tool-use callbacks), subagent definitions, or output style overrides. Plugins are also versioned and updatable through the marketplace; loose SKILL.md files are not. Most users land somewhere in the middle: a few personal skills as loose ~/.claude/skills/ folders, and one or two heavier capabilities as installed plugins.

What happens when a bundled skill name collides with a marketplace plugin's skill name?

The two namespaces don't share names by default. Marketplace plugins install skills under their plugin namespace: /<plugin-name>:<skill-name>. Bundled and hand-installed skills live at ~/.claude/skills/<skill-name>/SKILL.md and are addressed by Claude without a prefix. So a plugin named pdf-toolkit that ships a pdf skill becomes /pdf-toolkit:pdf and does not collide with Fazm's bundled pdf skill at ~/.claude/skills/pdf/SKILL.md. If you do install a loose SKILL.md with the same name as a bundled one, Fazm's SkillInstaller will reconcile it back to the bundled version on next launch via the SHA-256 compare, which is the documented tradeoff: bundled skills are treated as first-party app resources, not user data.

How do I check whether a plugin I installed is actually loaded?

Two ways. Inside Claude Code, run /plugin and go to the Installed tab. Plugins with load errors or unresolved dependencies appear at the top of the list; disabled plugins are folded under a collapsed footer. The Errors tab shows specific load failures (most commonly an LSP plugin whose required binary isn't on $PATH). From the shell, the cache lives under ~/.claude/plugins/cache/<marketplace>/<plugin>/, and the user-scope manifest is at ~/.claude/settings.json under enabledPlugins. If a skill in a plugin isn't firing, the usual fixes are /reload-plugins (picks up changes without restarting), clearing the cache with rm -rf ~/.claude/plugins/cache and reinstalling, or checking that the skill's frontmatter description matches the kind of task you're asking about.

Does the plugin system replace MCP, or does it sit on top of MCP?

On top. Plugins are a packaging and distribution format; MCP is still the transport for tools that need to call out to external services or run code. A plugin like github@claude-plugins-official ships a pre-configured MCP server entry inside its plugin.json, so installing the plugin registers the MCP server automatically. You can also still configure an MCP server manually via mcp servers in your settings.json, no plugin required. The plugin format is the easier on-ramp; the manual MCP path is what power users still use when they need to run a server with custom env vars or a non-standard command line.

Want to see this run on your own Mac?

Fifteen minutes, screen-share. Bring a workflow you already know is repetitive and we'll wire it up as a skill while you watch.

How did this page land for you?

React to reveal totals

Comments ()

Leave a comment to see what others are saying.

Public and anonymous. No signup.