Guide for creating, validating, and managing Claude Code plugin marketplaces with schema validation tools
Create and validate Claude Code plugin marketplaces with schema validation tools. Use when building `.claude-plugin/marketplace.json` files, validating plugin entries, or managing multi-plugin repositories.
/plugin marketplace add vinnie357/claude-skills/plugin install claude-code@vinnie357This skill is limited to using the following tools:
references/schema-specification.mdscripts/analyze-plugins.nuscripts/format-marketplace.nuscripts/init-marketplace.nuscripts/validate-dependencies.nuscripts/validate-marketplace.nuGuide for creating, validating, and managing plugin marketplaces for Claude Code. Includes schema validation, best practices, and automated tools.
Activate this skill when:
.claude-plugin/marketplace.json filesAll marketplaces must be located at .claude-plugin/marketplace.json in the repository root.
Required Fields:
name: Marketplace identifier (kebab-case, lowercase alphanumeric and hyphens only)owner: Object with maintainer details (name required, email optional)plugins: Array of plugin definitions (can be empty)Optional Metadata:
metadata.description: Summary of marketplace purposemetadata.version: Marketplace version tracking (semantic versioning recommended)metadata.pluginRoot: Base directory for relative plugin source pathsIMPORTANT: Schema Relationship
Plugin entries use the plugin manifest schema with all fields made optional, plus marketplace-specific fields (source, strict, category, tags). This means any field valid in a plugin.json file can also be used in a marketplace entry.
strict: false, the marketplace entry serves as the complete plugin manifest if no plugin.json existsstrict: true (default), marketplace fields supplement the plugin's own manifest fileEach plugin entry in the plugins array requires:
Mandatory:
name: Plugin identifier (kebab-case)source: Location specification (string path or object)Standard Metadata:
description: Brief explanation of plugin functionalityversion: Semantic version numberauthor: Creator information (object with name, optional email)homepage: Documentation or project URLrepository: Source control URLlicense: SPDX license identifier (e.g., MIT, Apache-2.0)keywords: Array of discovery and categorization tagscategory: Organizational groupingtags: Additional searchability termsComponent Configuration:
commands: Custom paths to command files or directoriesagents: Custom paths to agent fileshooks: Custom hooks configuration or path to hooks filemcpServers: MCP server configurations or path to MCP configskills: Array of skill directory pathsStrict Mode Control:
strict: Boolean (default: true)
true: Plugin must include plugin.json; marketplace fields supplement itfalse: Marketplace entry serves as complete manifest (no plugin.json needed)Dependencies:
dependencies: Array of plugin names this plugin depends on (format: "namespace:plugin-name")"source": "./plugins/my-plugin"
// In marketplace metadata
"metadata": {
"pluginRoot": "./plugins"
}
// In plugin entry
"source": "my-plugin" // Resolves to ./plugins/my-plugin
"source": {
"source": "github",
"repo": "owner/plugin-repo",
"path": "optional/subdirectory",
"branch": "main"
}
"source": {
"source": "url",
"url": "https://gitlab.com/team/plugin.git",
"branch": "main"
}
Use ${CLAUDE_PLUGIN_ROOT} in paths to reference the plugin's installation directory:
{
"skills": [
"${CLAUDE_PLUGIN_ROOT}/skills/my-skill"
],
"commands": [
"${CLAUDE_PLUGIN_ROOT}/commands"
]
}
This ensures paths work correctly regardless of installation location.
Use strict: false to define complete plugin manifests inline without requiring plugin.json:
{
"name": "my-plugin",
"source": "./plugins/my-plugin",
"strict": false,
"description": "Complete plugin definition inline",
"version": "1.0.0",
"author": {
"name": "Developer Name"
},
"skills": [
"${CLAUDE_PLUGIN_ROOT}/skills/skill-one",
"${CLAUDE_PLUGIN_ROOT}/skills/skill-two"
]
}
Customize component locations:
{
"name": "custom-paths",
"source": "./plugins/custom",
"strict": false,
"commands": ["${CLAUDE_PLUGIN_ROOT}/custom-commands"],
"agents": ["${CLAUDE_PLUGIN_ROOT}/custom-agents"],
"hooks": {
"onInstall": "${CLAUDE_PLUGIN_ROOT}/hooks/install.sh"
},
"mcpServers": "${CLAUDE_PLUGIN_ROOT}/mcp-config.json"
}
With strict: true, marketplace entries can add metadata not in plugin.json:
{
"name": "existing-plugin",
"source": "./plugins/existing",
"strict": true,
"category": "development",
"keywords": ["added", "from", "marketplace"],
"homepage": "https://docs.example.com"
}
Use the provided Nushell script to validate marketplace.json:
nu ${CLAUDE_PLUGIN_ROOT}/scripts/validate-marketplace.nu .claude-plugin/marketplace.json
This validates:
Validate individual plugin entries:
nu ${CLAUDE_PLUGIN_ROOT}/scripts/validate-plugin-entry.nu .claude-plugin/marketplace.json "plugin-name"
Checks:
Check for circular dependencies and missing dependencies:
nu ${CLAUDE_PLUGIN_ROOT}/scripts/validate-dependencies.nu .claude-plugin/marketplace.json
vinnie357)elixir-phoenix, rust-tools, core-skills)development, language, tools, frontend, backend, metadependencies for plugins that require other pluginsall-skills) that bundles related pluginsall-skills:core)Use strict: false when:
Use strict: true when:
{
"metadata": {
"pluginRoot": "./plugins"
},
"plugins": [
{
"name": "core",
"source": "core" // Resolves to ./plugins/core
},
{
"name": "external",
"source": {
"source": "github",
"repo": "org/repo"
}
}
]
}
// ❌ Invalid
"name": "myPlugin"
"name": "my_plugin"
"name": "My-Plugin"
// ✅ Valid
"name": "my-plugin"
"name": "core-skills"
// ❌ Invalid
{
"name": "marketplace"
}
// ✅ Valid
{
"name": "marketplace",
"owner": {
"name": "Developer Name"
}
}
// ❌ Invalid (path doesn't exist)
"source": "./plugins/nonexistent"
// ✅ Valid (path exists)
"source": "./plugins/core"
// ❌ Invalid
{
"plugins": [
{
"name": "plugin-a",
"dependencies": ["namespace:plugin-b"]
},
{
"name": "plugin-b",
"dependencies": ["namespace:plugin-a"]
}
]
}
mkdir -p .claude-plugin
Use the validation script to generate a template:
nu ${CLAUDE_PLUGIN_ROOT}/scripts/init-marketplace.nu
This creates .claude-plugin/marketplace.json with required fields.
For each plugin, decide on strict mode and add entry:
{
"name": "marketplace-name",
"owner": {
"name": "Your Name",
"email": "you@example.com"
},
"metadata": {
"description": "Your marketplace description",
"version": "1.0.0",
"pluginRoot": "./plugins"
},
"plugins": [
{
"name": "plugin-name",
"source": "plugin-name",
"strict": false,
"description": "Plugin description",
"version": "1.0.0",
"author": {
"name": "Your Name"
},
"license": "MIT",
"category": "development",
"skills": [
"${CLAUDE_PLUGIN_ROOT}/skills/skill-one"
]
}
]
}
nu ${CLAUDE_PLUGIN_ROOT}/scripts/validate-marketplace.nu .claude-plugin/marketplace.json
claude-code install ./
Use the provided script to analyze existing structure:
nu ${CLAUDE_PLUGIN_ROOT}/scripts/analyze-plugins.nu .
This scans for plugin.json files and suggests marketplace.json structure.
source path is correctpluginRoot in metadata if using relative paths${CLAUDE_PLUGIN_ROOT} if neededRun validation script with verbose mode:
nu ${CLAUDE_PLUGIN_ROOT}/scripts/validate-marketplace.nu .claude-plugin/marketplace.json --verbose
For detailed schema specifications and examples, see:
references/schema-specification.md: Complete JSON schemareferences/examples.md: Real-world marketplace examplesreferences/migration-guide.md: Step-by-step migration instructionsAll validation and utility scripts are located in scripts/:
validate-marketplace.nu: Full marketplace validationvalidate-plugin-entry.nu: Individual plugin entry validationvalidate-dependencies.nu: Dependency graph validationinit-marketplace.nu: Generate marketplace templateanalyze-plugins.nu: Analyze existing plugin structureformat-marketplace.nu: Format and sort marketplace.jsonExecute scripts with:
nu ${CLAUDE_PLUGIN_ROOT}/scripts/[script-name].nu [args]
Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.
Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.
Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.