Tools for creating and validating Claude Code plugins and marketplaces with schema compliance checking.
- ✅ Validate plugin.json - Ensures plugin manifests comply with Claude Code schema
- ✅ Validate marketplace.json - Ensures marketplace catalogs are well-formed
- ✅ Detect common errors - Catches mistakes like author as string, invalid fields
- ✅ Fix suggestions - Provides specific remediation guidance
- 📋 Templates - Ready-to-use minimal and full manifest examples
- 🎨 Color-coded output - Green for valid, red for errors, yellow for warnings
/plugin marketplace add plinde/claude-plugins
/plugin install plugin-creator@plinde-pluginsAfter installation, validation scripts are available in the plugin directory:
# Find plugin installation path
PLUGIN_DIR=$(find ~/.claude/plugins -name "plugin-creator*" -type d | head -n 1)
# Validate a plugin manifest
$PLUGIN_DIR/scripts/validate-plugin.sh path/to/plugin.json
# Validate a marketplace catalog
$PLUGIN_DIR/scripts/validate-marketplace.sh path/to/marketplace.jsonExample templates are in $PLUGIN_DIR/examples/:
plugin.json.minimal- Minimal valid plugin manifestplugin.json.full- Full-featured plugin manifestmarketplace.json.minimal- Minimal marketplace catalogmarketplace.json.full- Full marketplace with multiple plugins
Required Fields:
name(string) - Plugin identifier, kebab-case
Valid Optional Fields:
version(string) - Semantic versiondescription(string) - Brief plugin descriptionauthor(object) - Must be object withname, optionallyemail,urlhomepage(string) - Plugin homepage URLrepository(string) - Git repository URLlicense(string) - License identifier (e.g., "MIT")keywords(array) - Search keywords
Invalid Fields (Will Cause Errors):
- ❌
claudeCode- Not recognized - ❌
tags- Usekeywordsinstead - ❌
readme- Not needed in manifest - ❌
authoras string - Must be object
// ❌ WRONG - author as string
{
"author": "Peter Linde"
}
// ✅ CORRECT - author as object
{
"author": {
"name": "Peter Linde",
"email": "[email protected]"
}
}
// ❌ WRONG - invalid fields
{
"tags": ["github", "security"],
"readme": "README.md"
}
// ✅ CORRECT - use keywords
{
"keywords": ["github", "security"]
}mkdir -p my-plugin/.claude-pluginUse the minimal template:
cat $PLUGIN_DIR/examples/plugin.json.minimal > my-plugin/.claude-plugin/plugin.jsonOr create from scratch:
{
"name": "my-plugin",
"version": "1.0.0",
"description": "My plugin description",
"author": {
"name": "Your Name"
},
"license": "MIT"
}Add commands, hooks, agents, etc. as needed:
my-plugin/
├── .claude-plugin/
│ └── plugin.json
├── commands/ # Optional: slash commands
├── hooks/ # Optional: event hooks
├── agents/ # Optional: custom agents
└── scripts/ # Optional: helper scripts
$PLUGIN_DIR/scripts/validate-plugin.sh my-plugin/.claude-plugin/plugin.json/plugin marketplace add ./my-plugin
/plugin install my-plugin@localmkdir -p my-marketplace/.claude-pluginUse the minimal template:
cat $PLUGIN_DIR/examples/marketplace.json.minimal > my-marketplace/.claude-plugin/marketplace.jsonEdit the plugins array to include your plugins.
The source field determines where plugins are installed from:
Local Path (for development/testing):
{
"name": "my-plugin",
"source": "./my-plugin",
"description": "Plugin description",
"version": "1.0.0"
}GitHub URL (recommended for published marketplaces):
{
"name": "my-plugin",
"source": "https://github.com/owner/repo",
"description": "Plugin description",
"version": "1.0.0"
}Combined Approach (best practice):
- Keep plugin source code in your repository for version control
- Use GitHub URL in marketplace.json for stable installations
- Users install from published GitHub version
- You maintain code locally and push updates
Example repository structure:
my-marketplace/
├── .claude-plugin/
│ └── marketplace.json # Uses GitHub URLs
├── my-plugin/ # Source code in repo
│ └── .claude-plugin/
│ └── plugin.json
└── another-plugin/ # Source code in repo
└── .claude-plugin/
└── plugin.json
$PLUGIN_DIR/scripts/validate-marketplace.sh my-marketplace/.claude-plugin/marketplace.json/plugin marketplace add ./my-marketplaceValidating: plugin.json
✅ name: my-plugin
✅ author.name: Your Name
✅ version: 1.0.0
✅ description: My plugin description
✅ license: MIT
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ Validation passed!
Validating: plugin.json
✅ name: my-plugin
❌ Invalid author format: must be object, not string
Current: "author": "Your Name"
Fix: "author": {"name": "Your Name"}
❌ Invalid fields found:
- tags
Fix: Use 'keywords' instead of 'tags'
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
❌ Validation failed with 2 error(s)
plugin-creator/
├── .claude-plugin/
│ └── plugin.json
├── scripts/
│ ├── validate-plugin.sh
│ └── validate-marketplace.sh
├── examples/
│ ├── plugin.json.minimal
│ ├── plugin.json.full
│ ├── marketplace.json.minimal
│ └── marketplace.json.full
└── README.md
- Claude Code v0.1.0 or higher
jqfor JSON parsing
MIT License
Peter Linde