Skip to Content
PluginsPlugins

Claude Code Plugins

This folder contains complete plugin examples that bundle multiple Claude Code features into cohesive, installable packages.

Overview

Claude Code Plugins are bundled collections of customizations (slash commands, subagents, MCP servers, and hooks) that install with a single command. They represent the highest-level extension mechanism—combining multiple features into cohesive, shareable packages.

Plugin Architecture

Plugin Loading Process

Plugin Types & Distribution

TypeScopeSharedAuthorityExamples
OfficialGlobalAll usersAnthropicPR Review, Security Guidance
CommunityPublicAll usersCommunityDevOps, Data Science
OrganizationInternalTeam membersCompanyInternal standards, tools
PersonalIndividualSingle userDeveloperCustom workflows

Plugin Definition Structure

Plugin manifest uses JSON format in .claude-plugin/plugin.json:

{ "name": "my-first-plugin", "description": "A greeting plugin", "version": "1.0.0", "author": { "name": "Your Name" }, "homepage": "https://example.com", "repository": "https://github.com/user/repo", "license": "MIT" }

Plugin Structure Example

my-plugin/ ├── .claude-plugin/ │ └── plugin.json # Manifest (name, description, version, author) ├── commands/ # Skills as Markdown files │ ├── task-1.md │ ├── task-2.md │ └── workflows/ ├── agents/ # Custom agent definitions │ ├── specialist-1.md │ ├── specialist-2.md │ └── configs/ ├── skills/ # Agent Skills with SKILL.md files │ ├── skill-1.md │ └── skill-2.md ├── hooks/ # Event handlers in hooks.json │ └── hooks.json ├── .mcp.json # MCP server configurations ├── .lsp.json # LSP server configurations ├── settings.json # Default settings ├── templates/ │ └── issue-template.md ├── scripts/ │ ├── helper-1.sh │ └── helper-2.py ├── docs/ │ ├── README.md │ └── USAGE.md └── tests/ └── plugin.test.js

LSP server configuration

Plugins can include Language Server Protocol (LSP) support for real-time code intelligence. LSP servers provide diagnostics, code navigation, and symbol information as you work.

Configuration locations:

  • .lsp.json file in the plugin root directory
  • Inline lsp key in plugin.json

Field reference

FieldRequiredDescription
commandYesLSP server binary (must be in PATH)
extensionToLanguageYesMaps file extensions to language IDs
argsNoCommand-line arguments for the server
transportNoCommunication method: stdio (default) or socket
envNoEnvironment variables for the server process
initializationOptionsNoOptions sent during LSP initialization
settingsNoWorkspace configuration passed to the server
workspaceFolderNoOverride the workspace folder path
startupTimeoutNoMaximum time (ms) to wait for server startup
shutdownTimeoutNoMaximum time (ms) for graceful shutdown
restartOnCrashNoAutomatically restart if the server crashes
maxRestartsNoMaximum restart attempts before giving up

Example configurations

Go (gopls):

{ "go": { "command": "gopls", "args": ["serve"], "extensionToLanguage": { ".go": "go" } } }

Python (pyright):

{ "python": { "command": "pyright-langserver", "args": ["--stdio"], "extensionToLanguage": { ".py": "python", ".pyi": "python" } } }

TypeScript:

{ "typescript": { "command": "typescript-language-server", "args": ["--stdio"], "extensionToLanguage": { ".ts": "typescript", ".tsx": "typescriptreact", ".js": "javascript", ".jsx": "javascriptreact" } } }

Available LSP plugins

The official marketplace includes pre-configured LSP plugins:

PluginLanguageServer BinaryInstall Command
pyright-lspPythonpyright-langserverpip install pyright
typescript-lspTypeScript/JavaScripttypescript-language-servernpm install -g typescript-language-server typescript
rust-lspRustrust-analyzerInstall via rustup component add rust-analyzer

LSP capabilities

Once configured, LSP servers provide:

  • Instant diagnostics — errors and warnings appear immediately after edits
  • Code navigation — go to definition, find references, implementations
  • Hover information — type signatures and documentation on hover
  • Symbol listing — browse symbols in the current file or workspace

Plugin Options (v2.1.83+)

Plugins can declare user-configurable options in the manifest via userConfig. Values marked sensitive: true are stored in the system keychain rather than plain-text settings files:

{ "name": "my-plugin", "version": "1.0.0", "userConfig": { "apiKey": { "description": "API key for the service", "sensitive": true }, "region": { "description": "Deployment region", "default": "us-east-1" } } }

Persistent Plugin Data (${CLAUDE_PLUGIN_DATA}) (v2.1.78+)

Plugins have access to a persistent state directory via the ${CLAUDE_PLUGIN_DATA} environment variable. This directory is unique per plugin and survives across sessions, making it suitable for caches, databases, and other persistent state:

{ "hooks": { "PostToolUse": [ { "command": "node ${CLAUDE_PLUGIN_DATA}/track-usage.js" } ] } }

The directory is created automatically when the plugin is installed. Files stored here persist until the plugin is uninstalled.

Inline Plugin via Settings (source: 'settings') (v2.1.80+)

Plugins can be defined inline in settings files as marketplace entries using the source: 'settings' field. This allows embedding a plugin definition directly without requiring a separate repository or marketplace:

{ "pluginMarketplaces": [ { "name": "inline-tools", "source": "settings", "plugins": [ { "name": "quick-lint", "source": "./local-plugins/quick-lint" } ] } ] }

Plugin Settings

Plugins can ship a settings.json file to provide default configuration. This currently supports the agent key, which sets the main thread agent for the plugin:

{ "agent": "agents/specialist-1.md" }

When a plugin includes settings.json, its defaults are applied on installation. Users can override these settings in their own project or user configuration.

Standalone vs Plugin Approach

ApproachCommand NamesConfigurationBest For
Standalone/helloManual setup in CLAUDE.mdPersonal, project-specific
Plugins/plugin-name:helloAutomated via plugin.jsonSharing, distribution, team use

Use standalone slash commands for quick personal workflows. Use plugins when you want to bundle multiple features, share with a team, or publish for distribution.

Practical Examples

Example 1: PR Review Plugin

File: .claude-plugin/plugin.json

{ "name": "pr-review", "version": "1.0.0", "description": "Complete PR review workflow with security, testing, and docs", "author": { "name": "Anthropic" }, "repository": "https://github.com/anthropic/pr-review", "license": "MIT" }

File: commands/review-pr.md

--- name: Review PR description: Start comprehensive PR review with security and testing checks --- # PR Review This command initiates a complete pull request review including: 1. Security analysis 2. Test coverage verification 3. Documentation updates 4. Code quality checks 5. Performance impact assessment

File: agents/security-reviewer.md

--- name: security-reviewer description: Security-focused code review tools: read, grep, diff --- # Security Reviewer Specializes in finding security vulnerabilities: - Authentication/authorization issues - Data exposure - Injection attacks - Secure configuration

Installation:

/plugin install pr-review # Result: # ✅ 3 slash commands installed # ✅ 3 subagents configured # ✅ 2 MCP servers connected # ✅ 4 hooks registered # ✅ Ready to use!

Example 2: DevOps Plugin

Components:

devops-automation/ ├── commands/ │ ├── deploy.md │ ├── rollback.md │ ├── status.md │ └── incident.md ├── agents/ │ ├── deployment-specialist.md │ ├── incident-commander.md │ └── alert-analyzer.md ├── mcp/ │ ├── github-config.json │ ├── kubernetes-config.json │ └── prometheus-config.json ├── hooks/ │ ├── pre-deploy.js │ ├── post-deploy.js │ └── on-error.js └── scripts/ ├── deploy.sh ├── rollback.sh └── health-check.sh

Example 3: Documentation Plugin

Bundled Components:

documentation/ ├── commands/ │ ├── generate-api-docs.md │ ├── generate-readme.md │ ├── sync-docs.md │ └── validate-docs.md ├── agents/ │ ├── api-documenter.md │ ├── code-commentator.md │ └── example-generator.md ├── mcp/ │ ├── github-docs-config.json │ └── slack-announce-config.json └── templates/ ├── api-endpoint.md ├── function-docs.md └── adr-template.md

Plugin Marketplace

The official Anthropic-managed plugin directory is anthropics/claude-plugins-official. Enterprise admins can also create private plugin marketplaces for internal distribution.

Marketplace Configuration

Enterprise and advanced users can control marketplace behavior through settings:

SettingDescription
extraKnownMarketplacesAdd additional marketplace sources beyond the defaults
strictKnownMarketplacesControl which marketplaces users are allowed to add
deniedPluginsAdmin-managed blocklist to prevent specific plugins from being installed

Additional Marketplace Features

  • Default git timeout: Increased from 30s to 120s for large plugin repositories
  • Custom npm registries: Plugins can specify custom npm registry URLs for dependency resolution
  • Version pinning: Lock plugins to specific versions for reproducible environments

Marketplace definition schema

Plugin marketplaces are defined in .claude-plugin/marketplace.json:

{ "name": "my-team-plugins", "owner": "my-org", "plugins": [ { "name": "code-standards", "source": "./plugins/code-standards", "description": "Enforce team coding standards", "version": "1.2.0", "author": "platform-team" }, { "name": "deploy-helper", "source": { "source": "github", "repo": "my-org/deploy-helper", "ref": "v2.0.0" }, "description": "Deployment automation workflows" } ] }
FieldRequiredDescription
nameYesMarketplace name in kebab-case
ownerYesOrganization or user who maintains the marketplace
pluginsYesArray of plugin entries
plugins[].nameYesPlugin name (kebab-case)
plugins[].sourceYesPlugin source (path string or source object)
plugins[].descriptionNoBrief plugin description
plugins[].versionNoSemantic version string
plugins[].authorNoPlugin author name

Plugin source types

Plugins can be sourced from multiple locations:

SourceSyntaxExample
Relative pathString path"./plugins/my-plugin"
GitHub{ "source": "github", "repo": "owner/repo" }{ "source": "github", "repo": "acme/lint-plugin", "ref": "v1.0" }
Git URL{ "source": "url", "url": "..." }{ "source": "url", "url": "https://git.internal/plugin.git" }
Git subdirectory{ "source": "git-subdir", "url": "...", "path": "..." }{ "source": "git-subdir", "url": "https://github.com/org/monorepo.git", "path": "packages/plugin" }
npm{ "source": "npm", "package": "..." }{ "source": "npm", "package": "@acme/claude-plugin", "version": "^2.0" }
pip{ "source": "pip", "package": "..." }{ "source": "pip", "package": "claude-data-plugin", "version": ">=1.0" }

GitHub and git sources support optional ref (branch/tag) and sha (commit hash) fields for version pinning.

Distribution methods

GitHub (recommended):

# Users add your marketplace /plugin marketplace add owner/repo-name

Other git services (full URL required):

/plugin marketplace add https://gitlab.com/org/marketplace-repo.git

Private repositories: Supported via git credential helpers or environment tokens. Users must have read access to the repository.

Official marketplace submission: Submit plugins to the Anthropic-curated marketplace for broader distribution.

Strict mode

Control how marketplace definitions interact with local plugin.json files:

SettingBehavior
strict: true (default)Local plugin.json is authoritative; marketplace entry supplements it
strict: falseMarketplace entry is the entire plugin definition

Organization restrictions with strictKnownMarketplaces:

ValueEffect
Not setNo restrictions — users can add any marketplace
Empty array []Lockdown — no marketplaces allowed
Array of patternsAllowlist — only matching marketplaces can be added
{ "strictKnownMarketplaces": [ "my-org/*", "github.com/trusted-vendor/*" ] }

Warning: In strict mode with strictKnownMarketplaces, users can only install plugins from allowlisted marketplaces. This is useful for enterprise environments requiring controlled plugin distribution.

Plugin Installation & Lifecycle

Plugin Features Comparison

FeatureSlash CommandSkillSubagentPlugin
InstallationManual copyManual copyManual configOne command
Setup Time5 minutes10 minutes15 minutes2 minutes
BundlingSingle fileSingle fileSingle fileMultiple
VersioningManualManualManualAutomatic
Team SharingCopy fileCopy fileCopy fileInstall ID
UpdatesManualManualManualAuto-available
DependenciesNoneNoneNoneMay include
MarketplaceNoNoNoYes
DistributionRepositoryRepositoryRepositoryMarketplace

Plugin CLI Commands

All plugin operations are available as CLI commands:

claude plugin install <name>@<marketplace> # Install from a marketplace claude plugin uninstall <name> # Remove a plugin claude plugin list # List installed plugins claude plugin enable <name> # Enable a disabled plugin claude plugin disable <name> # Disable a plugin claude plugin validate # Validate plugin structure

Installation Methods

From Marketplace

/plugin install plugin-name # or from CLI: claude plugin install plugin-name@marketplace-name

Enable / Disable (with auto-detected scope)

/plugin enable plugin-name /plugin disable plugin-name

Local Plugin (for development)

# CLI flag for local testing (repeatable for multiple plugins) claude --plugin-dir ./path/to/plugin claude --plugin-dir ./plugin-a --plugin-dir ./plugin-b

From Git Repository

/plugin install github:username/repo

When to Create a Plugin

Plugin Use Cases

Use CaseRecommendationWhy
Team Onboarding✅ Use PluginInstant setup, all configurations
Framework Setup✅ Use PluginBundles framework-specific commands
Enterprise Standards✅ Use PluginCentral distribution, version control
Quick Task Automation❌ Use CommandOverkill complexity
Single Domain Expertise❌ Use SkillToo heavy, use skill instead
Specialized Analysis❌ Use SubagentCreate manually or use skill
Live Data Access❌ Use MCPStandalone, don’t bundle

Testing a Plugin

Before publishing, test your plugin locally using the --plugin-dir CLI flag (repeatable for multiple plugins):

claude --plugin-dir ./my-plugin claude --plugin-dir ./my-plugin --plugin-dir ./another-plugin

This launches Claude Code with your plugin loaded, allowing you to:

  • Verify all slash commands are available
  • Test subagents and agents function correctly
  • Confirm MCP servers connect properly
  • Validate hook execution
  • Check LSP server configurations
  • Check for any configuration errors

Hot-Reload

Plugins support hot-reload during development. When you modify plugin files, Claude Code can detect changes automatically. You can also force a reload with:

/reload-plugins

This re-reads all plugin manifests, commands, agents, skills, hooks, and MCP/LSP configurations without restarting the session.

Managed Settings for Plugins

Administrators can control plugin behavior across an organization using managed settings:

SettingDescription
enabledPluginsAllowlist of plugins that are enabled by default
deniedPluginsBlocklist of plugins that cannot be installed
extraKnownMarketplacesAdd additional marketplace sources beyond the defaults
strictKnownMarketplacesRestrict which marketplaces users are allowed to add
allowedChannelPluginsControl which plugins are permitted per release channel

These settings can be applied at the organization level via managed configuration files and take precedence over user-level settings.

Plugin Security

Plugin subagents run in a restricted sandbox. The following frontmatter keys are not allowed in plugin subagent definitions:

  • hooks — Subagents cannot register event handlers
  • mcpServers — Subagents cannot configure MCP servers
  • permissionMode — Subagents cannot override the permission model

This ensures that plugins cannot escalate privileges or modify the host environment beyond their declared scope.

Publishing a Plugin

Steps to publish:

  1. Create plugin structure with all components
  2. Write .claude-plugin/plugin.json manifest
  3. Create README.md with documentation
  4. Test locally with claude --plugin-dir ./my-plugin
  5. Submit to plugin marketplace
  6. Get reviewed and approved
  7. Published on marketplace
  8. Users can install with one command

Example submission:

# PR Review Plugin ## Description Complete PR review workflow with security, testing, and documentation checks. ## What's Included - 3 slash commands for different review types - 3 specialized subagents - GitHub and CodeQL MCP integration - Automated security scanning hooks ## Installation ```bash /plugin install pr-review

Features

✅ Security analysis ✅ Test coverage checking ✅ Documentation verification ✅ Code quality assessment ✅ Performance impact analysis

Usage

/review-pr /check-security /check-tests

Requirements

  • Claude Code 1.0+
  • GitHub access
  • CodeQL (optional)
## Plugin vs Manual Configuration **Manual Setup (2+ hours):** - Install slash commands one by one - Create subagents individually - Configure MCPs separately - Set up hooks manually - Document everything - Share with team (hope they configure correctly) **With Plugin (2 minutes):** ```bash /plugin install pr-review # ✅ Everything installed and configured # ✅ Ready to use immediately # ✅ Team can reproduce exact setup

Best Practices

Do’s ✅

  • Use clear, descriptive plugin names
  • Include comprehensive README
  • Version your plugin properly (semver)
  • Test all components together
  • Document requirements clearly
  • Provide usage examples
  • Include error handling
  • Tag appropriately for discovery
  • Maintain backward compatibility
  • Keep plugins focused and cohesive
  • Include comprehensive tests
  • Document all dependencies

Don’ts ❌

  • Don’t bundle unrelated features
  • Don’t hardcode credentials
  • Don’t skip testing
  • Don’t forget documentation
  • Don’t create redundant plugins
  • Don’t ignore versioning
  • Don’t overcomplicate component dependencies
  • Don’t forget to handle errors gracefully

Installation Instructions

Installing from Marketplace

  1. Browse available plugins:

    /plugin list
  2. View plugin details:

    /plugin info plugin-name
  3. Install a plugin:

    /plugin install plugin-name

Installing from Local Path

/plugin install ./path/to/plugin-directory

Installing from GitHub

/plugin install github:username/repo

Listing Installed Plugins

/plugin list --installed

Updating a Plugin

/plugin update plugin-name

Disabling/Enabling a Plugin

# Temporarily disable /plugin disable plugin-name # Re-enable /plugin enable plugin-name

Uninstalling a Plugin

/plugin uninstall plugin-name

The following Claude Code features work together with plugins:

  • Slash Commands - Individual commands bundled in plugins
  • Memory - Persistent context for plugins
  • Skills - Domain expertise that can be wrapped into plugins
  • Subagents - Specialized agents included as plugin components
  • MCP Servers - Model Context Protocol integrations bundled in plugins
  • Hooks - Event handlers that trigger plugin workflows

Complete Example Workflow

PR Review Plugin Full Workflow

1. User: /review-pr 2. Plugin executes: ├── pre-review.js hook validates git repo ├── GitHub MCP fetches PR data ├── security-reviewer subagent analyzes security ├── test-checker subagent verifies coverage └── performance-analyzer subagent checks performance 3. Results synthesized and presented: ✅ Security: No critical issues ⚠️ Testing: Coverage 65% (recommend 80%+) ✅ Performance: No significant impact 📝 12 recommendations provided

Troubleshooting

Plugin Won’t Install

  • Check Claude Code version compatibility: /version
  • Verify plugin.json syntax with a JSON validator
  • Check internet connection (for remote plugins)
  • Review permissions: ls -la plugin/

Components Not Loading

  • Verify paths in plugin.json match actual directory structure
  • Check file permissions: chmod +x scripts/
  • Review component file syntax
  • Check logs: /plugin debug plugin-name

MCP Connection Failed

  • Verify environment variables are set correctly
  • Check MCP server installation and health
  • Test MCP connection independently with /mcp test
  • Review MCP configuration in mcp/ directory

Commands Not Available After Install

  • Ensure plugin was installed successfully: /plugin list --installed
  • Check if plugin is enabled: /plugin status plugin-name
  • Restart Claude Code: exit and reopen
  • Check for naming conflicts with existing commands

Hook Execution Issues

  • Verify hook files have correct permissions
  • Check hook syntax and event names
  • Review hook logs for error details
  • Test hooks manually if possible

Additional Resources

Last updated on