From john-skills
Creates and configures GitHub-hosted Claude Code plugin marketplaces. Scaffolds repos via init_marketplace.py, adds plugins to marketplace.json (local, GitHub, or URL sources), sets team metadata, and handles skills auto-discovery.
npx claudepluginhub jbdamask/john-claude-skills --plugin john-skillsThis skill uses the workspace's default tool permissions.
Create Claude Code plugin marketplaces—catalogs that distribute plugins to teams and communities via GitHub.
Guides creation of Claude Code plugin marketplaces with marketplace.json manifests, directory structures, schema, owner metadata, and distribution strategies for teams.
Guides creating, validating, and managing Claude Code plugin marketplaces including marketplace.json schema, plugin entries, and best practices for setup and distribution.
Guides creating and managing Claude Code plugin marketplaces. Validates marketplace.json schema, configures plugin entries, and troubleshoots repository setups.
Share bugs, ideas, or general feedback.
Create Claude Code plugin marketplaces—catalogs that distribute plugins to teams and communities via GitHub.
scripts/init_marketplace.py <name> --path <output-dir> to scaffold.claude-plugin/marketplace.json to add plugins/plugin marketplace add owner/repomarketplace-repo/
├── .claude-plugin/
│ └── marketplace.json # Required: marketplace definition
├── plugins/ # Optional: local plugins
│ └── my-plugin/
│ └── .claude-plugin/
│ └── plugin.json
└── README.md
Plugins containing skills should have this structure:
plugins/my-plugin/
├── .claude-plugin/
│ └── plugin.json # NO "skills" field - skills are auto-discovered
└── skills/
└── my-skill/
└── SKILL.md
Important: Do NOT add a skills field to plugin.json. Skills are automatically discovered from the skills/ directory.
{
"name": "marketplace-name",
"owner": {
"name": "Team Name",
"email": "team@example.com"
},
"plugins": []
}
{
"metadata": {
"description": "Brief description",
"version": "1.0.0",
"pluginRoot": "./plugins"
}
}
claude-code-marketplace, claude-code-plugins, claude-plugins-official, anthropic-marketplace, anthropic-plugins, agent-skills, life-sciences
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Kebab-case identifier |
source | string|object | Yes | Where to fetch plugin |
description | string | No | Brief description |
version | string | No | Semantic version |
author | object | No | {name, email} |
category | string | No | For organization |
keywords | array | No | Search tags |
strict | boolean | No | Require plugin.json (default: true) |
Local path:
{"source": "./plugins/my-plugin"}
GitHub:
{"source": {"source": "github", "repo": "owner/repo"}}
Git URL:
{"source": {"source": "url", "url": "https://gitlab.com/team/plugin.git"}}
{
"name": "company-tools",
"owner": {
"name": "DevTools Team",
"email": "devtools@company.com"
},
"metadata": {
"description": "Internal development tools",
"version": "1.0.0"
},
"plugins": [
{
"name": "code-formatter",
"source": "./plugins/formatter",
"description": "Auto-format code on save",
"version": "1.0.0",
"category": "development"
},
{
"name": "deploy-tools",
"source": {"source": "github", "repo": "company/deploy-plugin"},
"description": "Deployment automation",
"category": "devops"
}
]
}
Add to project's .claude/settings.json for automatic installation:
{
"extraKnownMarketplaces": {
"team-tools": {
"source": {"source": "github", "repo": "org/claude-plugins"}
}
},
"enabledPlugins": {
"code-formatter@team-tools": true
}
}
Pre-flight checks (REQUIRED before running init script):
Check git config for user identity:
git config --get user.name
git config --get user.email
If either is not set, ASK THE USER for their name and email before proceeding. Use these values with --owner-name and --owner-email flags.
Check if target directory already has a git repo:
ls -la <target-path>/.git 2>/dev/null
If .git exists, do NOT run git init when setting up the repository.
# 1. Initialize (script auto-detects git config for owner info)
python scripts/init_marketplace.py my-marketplace --path ./output
# Or with explicit owner info if git config is not set:
python scripts/init_marketplace.py my-marketplace --path ./output \
--owner-name "Your Name" --owner-email "you@example.com"
# 2. Validate
python scripts/validate_marketplace.py ./output
# 3. Push to GitHub (skip git init if .git already exists)
cd output
# Only run 'git init' if there's no existing .git directory
git add -A && git commit -m "Initial"
# Create repo on GitHub and push
# 4. Test in Claude Code
# /plugin marketplace add owner/my-marketplace
# Add local plugin
python scripts/add_plugin.py ./marketplace --name my-plugin --source ./plugins/my-plugin
# Add GitHub plugin
python scripts/add_plugin.py ./marketplace --name external --source github:org/repo
Marketplace not loading: Verify .claude-plugin/marketplace.json exists at repo root.
Plugin install fails: Check source is accessible. For private repos, ensure authentication.
Team can't see marketplace: Verify extraKnownMarketplaces in .claude/settings.json.
references/plugin-schema.md - Complete plugin.json schemareferences/examples.md - Additional marketplace examples