Create and share your own Claude Code plugins with this step-by-step guide.
A Claude Code plugin is just a GitHub repository with a specific directory structure and a manifest file. The manifest tells Claude Code what your plugin includes and how to use it.
Zero-friction publishing
Push your plugin to GitHub and we'll automatically discover it within 30 minutes. No submission forms, no waiting for approval - just push and ship.
Here's a typical plugin structure. Only the .claude-plugin/plugin.json manifest is required:
my-awesome-plugin/
├── .claude-plugin/ # Required: Plugin metadata
│ └── plugin.json # Required: Plugin manifest
├── commands/ # Optional: User-invoked slash commands
│ ├── deploy.md
│ └── test.md
├── agents/ # Optional: Specialized agents
│ ├── security-reviewer.md
│ └── test-writer.md
├── skills/ # Optional: Model-invoked capabilities
│ └── api-integration/
│ └── SKILL.md
├── .mcp.json # Optional: MCP server definitions
├── hooks/ # Optional: Lifecycle hooks
│ └── hooks.json
├── README.md # Recommended: Usage documentation
└── LICENSE # Recommended: License fileOnly include what you need! A plugin can be as simple as a single manifest file, or as complex as dozens of commands, agents, skills, and integrations.
Component Locations
All component directories (commands/, agents/, skills/, hooks/) must be at the plugin root, not inside .claude-plugin/. The manifest file is the only thing inside .claude-plugin/.
The manifest file (.claude-plugin/plugin.json) describes your plugin:
{
"name": "my-formatter",
"version": "1.0.0",
"description": "Code formatting plugin for multiple languages",
"keywords": ["formatter", "code-quality", "development"],
"strict": true
}name: Plugin identifier (lowercase, hyphens, no spaces)
version: Semantic version (e.g., "1.0.0", "2.1.3")
description: Clear, concise description of what your plugin does
keywords: Array of tags for discovery and categorization
strict: Enable strict mode (recommended: true)
{
"name": "devops-suite",
"version": "2.1.0",
"description": "Complete DevOps automation with deployment, monitoring, and alerts",
"keywords": ["devops", "deployment", "ci-cd", "monitoring", "automation"],
"strict": true,
"commands": ["./commands/deploy.md", "./commands/rollback.md"],
"agents": ["./agents/infrastructure.md", "./agents/monitoring.md"],
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PLUGIN_ROOT}/scripts/test-runner.sh"
}
]
}
]
},
"mcpServers": {
"aws": {
"command": "npx",
"args": ["@aws-sdk/mcp-server"],
"env": {
"AWS_REGION": "us-east-1"
}
}
}
}Initialize a new public GitHub repository for your plugin. You can use an existing repo too - just add the plugin structure to it.
git init my-awesome-plugin && cd my-awesome-pluginMake the required .claude-plugin directory:
mkdir .claude-pluginCreate .claude-plugin/plugin.json with your plugin metadata. Start simple - you can add more features later.
Add commands, agents, skills, hooks, or MCP servers as needed. Each component is a markdown file with frontmatter:
---
description: Deploy your application to production
---
Deploy the application using the configured deployment strategy.
Include any validation checks and rollback procedures.---
description: Interact with REST APIs
---
Expert in making HTTP requests and handling API responses.
Claude will automatically use this when API interaction is needed.Document how to use your plugin. The README is shown on your plugin's detail page in the marketplace.
Commit and push your plugin to GitHub. Make sure the repository is public.
git add . && git commit -m 'Initial plugin release'git push origin mainThat's it! Our system automatically discovers plugins with valid manifests every 30 minutes. Your plugin will appear in the marketplace once discovered and ingested.
Use clear, lowercase names with hyphens. Good: code-formatter. Avoid: MyPlugin123.
Follow semver (major.minor.patch). Increment the major version for breaking changes, minor for new features, patch for bug fixes.
Use relevant keywords from categories like "development", "productivity", "testing", etc. This helps users discover your plugin.
Document installation, configuration, usage examples, and troubleshooting. Clear docs = happy users.
If you're maintaining a marketplace repository with multiple plugins, you need to understand the relationship between marketplace.json and individual plugin manifests.
Marketplace repositories bundle multiple plugins in a single repo:
my-marketplace/
├── .claude-plugin/
│ └── marketplace.json # Marketplace manifest
├── plugin-one/
│ ├── .claude-plugin/
│ │ └── plugin.json # Required if strict: true
│ └── commands/
├── plugin-two/
│ ├── .claude-plugin/
│ │ └── plugin.json # Required if strict: true
│ └── agents/
└── README.mdImportant: Strict Mode Default
By default, strict: true. This means each plugin directory MUST include .claude-plugin/plugin.json. If you want the marketplace entry to serve as the complete manifest, explicitly set strict: false for that plugin.
/plugin marketplace add ./path before publishingFor complete marketplace schema and examples, see the Plugin marketplaces documentation.
Read Anthropic's official documentation for plugin development standards and best practices.
View DocumentationExplore existing plugins to see how others structure their manifests and components.
Browse PluginsCreate your plugin, push to GitHub, and we'll discover it automatically. No forms, no waiting for approval.