# Marketplace Schema
The `marketplace.json` file defines a collection of plugins that users can install.
## Location
`.claude-plugin/marketplace.json` (at marketplace root)
## Structure
```json
{
"name": "marketplace-name",
"owner": {
"name": "Your Organization",
"email": "team@your-org.com"
},
"metadata": {
"description": "Marketplace description",
"version": "1.0.0"
},
"plugins": [
{
"name": "plugin-name",
"description": "What the plugin does",
"version": "1.0.0",
"author": {
"name": "Author Name"
},
"source": "./plugins/plugin-name",
"category": "utilities",
"tags": ["tag1", "tag2"],
"keywords": ["keyword1", "keyword2"]
}
]
}
```
## Required Fields
### Marketplace Level
- **name**: kebab-case string, unique marketplace identifier
- **owner**: Object with `name` (required) and optional `email`
- **plugins**: Array of plugin entries
### Plugin Entry
- **name**: Plugin name (must match `plugin.json`)
- **source**: Relative path to plugin directory OR git URL
## Optional Fields
### Marketplace Level
- **metadata**: Object with:
- **description**: Brief marketplace description
- **version**: Marketplace version
- **pluginRoot**: Base path for relative plugin sources (allows resolving relative plugin paths)
### Plugin Entry
**Standard metadata fields:**
- **description**: Brief description
- **version**: SemVer version
- **author**: String or object with `name`, `email`, `url`
- **category**: Category string (e.g., "utilities", "productivity")
- **tags**: Array of tags for filtering
- **keywords**: Array of keywords for search
- **homepage**: Plugin homepage URL
- **repository**: Plugin repository URL
- **license**: License identifier (e.g., "MIT")
- **strict**: Boolean (default: true) - Require plugin.json in plugin folder
**Component configuration fields:**
- **commands**: String or array - Custom paths to command files or directories
- **agents**: String or array - Custom paths to agent files
- **hooks**: String or object - Custom hooks configuration or path to hooks file
- **mcpServers**: String or object - MCP server configurations or path to MCP config
## Source Types
### Local Path (Development)
```json
{
"source": "./plugins/my-plugin"
}
```
### Git Repository
Simple string format:
```json
{
"source": "https://github.com/user/repo"
}
```
Object format for advanced configuration:
```json
{
"source": {
"source": "github",
"repo": "owner/plugin-repo"
}
}
```
### Git URL Source
```json
{
"source": {
"source": "url",
"url": "https://gitlab.com/team/plugin.git"
}
}
```
### Git with Subdirectory
```json
{
"source": "https://github.com/user/repo/tree/main/plugins/my-plugin"
}
```
## Examples
### Local Dev Marketplace
```json
{
"name": "dev-marketplace",
"owner": {
"name": "Developer",
"email": "dev@localhost"
},
"metadata": {
"description": "Local development marketplace",
"version": "0.1.0"
},
"plugins": [
{
"name": "my-plugin",
"description": "Plugin in development",
"source": "../my-plugin"
}
]
}
```
### Team Marketplace
```json
{
"name": "acme-tools",
"owner": {
"name": "ACME Corp",
"email": "tools@acme.com"
},
"metadata": {
"description": "ACME internal tools for Claude Code",
"version": "1.0.0"
},
"plugins": [
{
"name": "code-review",
"description": "ACME code review standards",
"version": "2.1.0",
"author": {
"name": "DevTools Team"
},
"source": "./plugins/code-review",
"category": "development",
"tags": ["code-review", "standards"],
"keywords": ["review", "quality", "standards"]
},
{
"name": "deploy-tools",
"description": "Deployment automation",
"version": "1.5.0",
"author": {
"name": "DevOps Team"
},
"source": "./plugins/deploy-tools",
"category": "devops",
"tags": ["deployment", "automation"],
"keywords": ["deploy", "ci", "cd"]
}
]
}
```
### Advanced Plugin Entry
Plugin entries can override default component locations and provide inline configuration:
```json
{
"name": "enterprise-tools",
"source": {
"source": "github",
"repo": "company/enterprise-plugin"
},
"description": "Enterprise workflow automation tools",
"version": "2.1.0",
"author": {
"name": "Enterprise Team",
"email": "enterprise@company.com"
},
"homepage": "https://docs.company.com/plugins/enterprise-tools",
"repository": "https://github.com/company/enterprise-plugin",
"license": "MIT",
"keywords": ["enterprise", "workflow", "automation"],
"category": "productivity",
"commands": [
"./commands/core/",
"./commands/enterprise/",
"./commands/experimental/preview.md"
],
"agents": [
"./agents/security-reviewer.md",
"./agents/compliance-checker.md"
],
"hooks": "./config/hooks.json",
"mcpServers": {
"enterprise-db": {
"command": "${CLAUDE_PLUGIN_ROOT}/servers/db-server",
"args": ["--config", "${CLAUDE_PLUGIN_ROOT}/config.json"]
}
},
"strict": false
}
```
**Schema relationship**: Plugin entries are based on 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. When `strict: false`, the marketplace entry serves as the complete plugin manifest if no `plugin.json` exists. When `strict: true` (default), marketplace fields supplement the plugin's own manifest file.
**Environment variables**: Use `${CLAUDE_PLUGIN_ROOT}` in hooks and mcpServers configurations. This variable resolves to the plugin's installation directory and ensures paths work correctly regardless of where the plugin is installed.
## Usage
### Add Marketplace (Local)
```bash
/plugin marketplace add /path/to/marketplace
```
### Add Marketplace (GitHub)
```bash
/plugin marketplace add your-org/your-repo
```
### Install Plugin from Marketplace
```bash
/plugin install plugin-name@marketplace-name
```
### Team Auto-Install
In project `.claude/settings.json`:
```json
{
"extraKnownMarketplaces": {
"team-tools": {
"source": {
"source": "github",
"repo": "your-org/marketplace-repo"
}
}
},
"enabledPlugins": {
"plugin-name@team-tools": true
}
}
```
## Testing Workflow
1. Create dev marketplace:
```bash
mkdir -p dev-marketplace/.claude-plugin
# Create marketplace.json pointing to ../your-plugin
```
2. Add to Claude Code:
```bash
/plugin marketplace add ./dev-marketplace
```
3. Install plugin:
```bash
/plugin install your-plugin@dev-marketplace
```
4. After changes, reinstall:
```bash
/plugin uninstall your-plugin@dev-marketplace
/plugin install your-plugin@dev-marketplace
```
## Best Practices
- **Use kebab-case** for marketplace and plugin names
- **Keep descriptions concise** (< 100 chars)
- **Add meaningful tags** for discoverability
- **Version consistently** using SemVer
- **Test locally** before publishing to GitHub
- **Document plugins** in their README files
## Common Mistakes
❌ **Plugin name mismatch**
```json
// marketplace.json
{ "name": "my-plugin", "source": "./plugins/other-plugin" }
// plugin.json (in other-plugin/)
{ "name": "other-plugin" } // Names don't match!
```
✅ **Names must match**
```json
// marketplace.json
{ "name": "my-plugin", "source": "./plugins/my-plugin" }
// plugin.json
{ "name": "my-plugin" } // Matches!
```
❌ **Absolute source paths**
```json
{
"source": "/Users/you/plugins/my-plugin"
}
```
✅ **Relative source paths**
```json
{
"source": "./plugins/my-plugin"
}
```
## Validation
Use `/plugin-development:validate` to check marketplace structure.