Create and configure Claude Code marketplaces and plugins. Use when the user wants to create a marketplace, publish plugins, set up team plugin distribution, or configure marketplace.json or plugin.json files. Triggers: create marketplace, publish plugin, plugin distribution, marketplace.json, plugin.json, team plugins, share plugins
Inherits all available tools
Additional assets for this skill
This skill inherits all available tools. When active, it can use any tool Claude has access to.
examples/development-tools.mdexamples/specialized-domains.mdexamples/team-workflows.mdreference/best-practices.mdreference/syntax-guide.mdreference/troubleshooting.mdtemplates/basic-marketplace.mdtemplates/enterprise-marketplace.mdtemplates/multi-plugin.mdtemplates/multi-repo.mdtemplates/plugin-structure.mdA comprehensive guide to creating Claude Code marketplaces and plugins for distributing commands, agents, skills, hooks, and MCP servers.
Critical concept: These are NOT the same thing.
| Concept | What It Is | Analogy |
|---|---|---|
| Marketplace | JSON catalog listing where plugins live | Library catalog |
| Plugin | Packaged collection of components | Book |
| Components | Commands, agents, skills, hooks, MCP servers | Chapters |
Relationship: One marketplace → many plugins → many components per plugin
Key insight: Marketplaces don't HOST plugins. They INDEX them. Plugins can live anywhere (GitHub, GitLab, private git, local paths).
Minimal marketplace.json:
{
"name": "marketplace-name",
"owner": {"name": "Owner Name"},
"plugins": [
{
"name": "plugin-name",
"source": "./path-to-plugin",
"description": "What this plugin does",
"version": "1.0.0"
}
]
}
Minimal plugin.json (inside .claude-plugin/):
{
"name": "plugin-name",
"description": "What this plugin does",
"version": "1.0.0"
}
Team settings.json (inside .claude/):
{
"extraKnownMarketplaces": {
"marketplace-name": {
"source": {"source": "github", "repo": "owner/repo"}
}
},
"enabledPlugins": {
"plugin-name@marketplace-name": true
}
}
| Type | Syntax | Best For |
|---|---|---|
| GitHub | {"source": "github", "repo": "owner/repo"} | Public plugins |
| Git URL | {"source": "git", "url": "https://..."} | Private/GitLab |
| Directory | {"source": "directory", "path": "./path"} | Monorepo |
| Relative | "./path" | Shorthand for directory |
# Add a marketplace
/plugin marketplace add owner/repo
/plugin marketplace add https://gitlab.com/org/repo.git
/plugin marketplace add ./local-marketplace
# List marketplaces
/plugin marketplace list
# Update marketplace catalog
/plugin marketplace update marketplace-name
# Browse and install plugins
/plugin # Interactive browser
/plugin install plugin-name@marketplace # Direct install
# Manage plugins
/plugin enable plugin@marketplace
/plugin disable plugin@marketplace
/plugin uninstall plugin@marketplace
# Validate structure
claude plugin validate .
Use AskUserQuestion to understand the user's needs:
What are you distributing?
How many plugins?
Who is the audience?
What hosting?
Document the answers before proceeding.
Based on requirements, recommend one of these patterns:
Use when: One plugin, simple distribution
my-marketplace/
├── .claude-plugin/
│ ├── plugin.json
│ └── marketplace.json
├── commands/
└── agents/
Use when: Related plugins, unified versioning, team ownership
company-plugins/
├── .claude-plugin/
│ └── marketplace.json
├── plugins/
│ ├── formatter/
│ │ ├── .claude-plugin/plugin.json
│ │ └── commands/
│ ├── linter/
│ │ ├── .claude-plugin/plugin.json
│ │ └── commands/
│ └── tester/
│ ├── .claude-plugin/plugin.json
│ └── agents/
Use when: Independent plugins, different owners, community collection
# Marketplace repo
my-marketplace/
└── .claude-plugin/
└── marketplace.json # Points to other repos
# Plugin repos (separate)
tool-a/
├── .claude-plugin/plugin.json
└── commands/
tool-b/
├── .claude-plugin/plugin.json
└── agents/
Use when: Mix of internal and external tools, strict access control
{
"plugins": [
{"name": "internal-tool", "source": {"source": "git", "url": "https://git.corp/..."}},
{"name": "community-tool", "source": {"source": "github", "repo": "public/tool"}}
]
}
Decision tree:
For each plugin, create this structure:
plugin-name/
├── .claude-plugin/
│ └── plugin.json # Required: plugin manifest
├── commands/ # Optional: slash commands
│ └── my-command.md
├── agents/ # Optional: subagents
│ └── my-agent.md
├── skills/ # Optional: skills
│ └── my-skill/
│ └── SKILL.md
├── hooks/ # Optional: event handlers
│ └── hooks.json
└── .mcp.json # Optional: MCP servers
Write plugin.json:
{
"name": "plugin-name",
"description": "Clear description of what this plugin provides",
"version": "1.0.0",
"author": {
"name": "Author Name",
"email": "author@example.com"
},
"homepage": "https://docs.example.com",
"repository": "https://github.com/owner/repo",
"license": "MIT"
}
Naming conventions:
kebab-case (e.g., code-formatter)MAJOR.MINOR.PATCHverb-noun.md (e.g., format-code.md)role-name.md (e.g., code-reviewer.md)Create .claude-plugin/marketplace.json:
For monorepo (plugins in same repo):
{
"name": "company-tools",
"owner": {
"name": "Company Name",
"email": "team@company.com"
},
"metadata": {
"description": "Company development tools",
"version": "1.0.0",
"pluginRoot": "./plugins"
},
"plugins": [
{
"name": "formatter",
"source": "./plugins/formatter",
"description": "Code formatting tools",
"version": "1.0.0"
},
{
"name": "linter",
"source": "./plugins/linter",
"description": "Code linting tools",
"version": "1.0.0"
}
]
}
For multi-repo (plugins in separate repos):
{
"name": "community-collection",
"owner": {
"name": "Community",
"email": "maintainers@example.com"
},
"plugins": [
{
"name": "tool-a",
"source": {
"source": "github",
"repo": "community/tool-a"
},
"description": "Tool A description",
"version": "2.1.0"
},
{
"name": "tool-b",
"source": {
"source": "github",
"repo": "community/tool-b"
},
"description": "Tool B description",
"version": "1.3.0"
}
]
}
No additional setup. Add marketplace locally:
/plugin marketplace add ./path-to-marketplace
Add to project's .claude/settings.json:
{
"extraKnownMarketplaces": {
"team-tools": {
"source": {
"source": "github",
"repo": "company/claude-plugins"
}
}
},
"enabledPlugins": {
"formatter@team-tools": true,
"linter@team-tools": true
}
}
How it works:
.claude/settings.jsonPush marketplace repo to GitHub
Document installation in README:
## Installation
Add the marketplace:
```bash
/plugin marketplace add owner/repo
Install plugins:
/plugin install formatter@owner-tools
.claude/settings.json in project templates# Validate marketplace structure
claude plugin validate .
# Manual JSON validation
python3 -c "import json; json.load(open('.claude-plugin/marketplace.json'))"
python3 -c "import json; json.load(open('.claude-plugin/plugin.json'))"
# Add marketplace locally
/plugin marketplace add ./path-to-marketplace
# Verify it appears
/plugin marketplace list
# Browse available plugins
/plugin
# Install a plugin
/plugin install plugin-name@marketplace-name
# Verify components work
/help # Check commands appear
/command-name to test/agents or try invoking via TaskStructure:
company-plugins/
├── .claude-plugin/
│ └── marketplace.json
├── plugins/
│ ├── plugin-a/
│ ├── plugin-b/
│ └── plugin-c/
└── README.md
Pros:
Cons:
Best for: Team tools, related plugins, unified ownership
Structure:
# Marketplace repo
tools-marketplace/
└── .claude-plugin/marketplace.json
# Separate plugin repos
plugin-a/ # github.com/org/plugin-a
plugin-b/ # github.com/org/plugin-b
plugin-c/ # github.com/org/plugin-c
Pros:
Cons:
Best for: Community collections, mixed ownership, independent plugins
Structure:
{
"plugins": [
{"name": "core", "source": "./plugins/core"},
{"name": "community", "source": {"source": "github", "repo": "community/tool"}},
{"name": "internal", "source": {"source": "git", "url": "https://git.corp/..."}}
]
}
Pros:
Cons:
Best for: Enterprise, mature ecosystems, gradual migration
Wrong: Thinking marketplace.json IS the plugin Right: marketplace.json POINTS TO plugins
marketplace.json is a catalog. The actual plugin code lives in separate directories or repos.
Wrong: Using GitHub shorthand for private repos
{"source": "github", "repo": "private-org/private-repo"} // May fail
Right: Use git URL for private repos
{"source": "git", "url": "git@github.com:private-org/private-repo.git"}
marketplace.json required:
nameowner.nameplugins arrayplugin.json required:
namedescriptionversionWrong: Relative paths from wrong directory
{"source": "../plugins/tool"} // Relative to what?
Right: Paths relative to marketplace.json location
{"source": "./plugins/tool"} // Relative to .claude-plugin/
Keep versions in sync:
plugin.json versionmarketplace.json plugin entry versionWhen you update a plugin, update both files.
Always run before publishing:
claude plugin validate .
Users MUST explicitly trust marketplaces. You cannot force-install plugins on team members. The settings.json only PRE-CONFIGURES - users still approve.
Use marketplace-builder when:
Don't use when:
templates/basic-marketplace.md - Single plugin, simple setuptemplates/plugin-structure.md - Complete plugin creation guidetemplates/multi-plugin.md - Monorepo patterntemplates/multi-repo.md - Distributed plugins patterntemplates/enterprise-marketplace.md - Enterprise with team configexamples/development-tools.md - 6 dev tool pluginsexamples/team-workflows.md - 6 team workflow pluginsexamples/specialized-domains.md - 6 domain-specific pluginsreference/syntax-guide.md - Complete JSON schemasreference/best-practices.md - Design principlesreference/troubleshooting.md - Common issues and debugging