{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://catalog.lintel.tools/schemas/claude-code/plugin/latest.json",
  "title": "Claude Code Plugin",
  "description": "Schema for [Claude Code plugin](https://code.claude.com/docs/en/plugins) manifest (`.claude-plugin/plugin.json`). Plugins extend Claude Code with reusable skills, agents, hooks, MCP servers, and LSP servers that can be shared across projects and teams via [marketplaces](https://code.claude.com/docs/en/plugin-marketplaces). The manifest defines plugin metadata and optionally declares custom component paths. Components in default locations (`commands/`, `agents/`, `skills/`, `hooks/hooks.json`, `.mcp.json`, `.lsp.json`) are auto-discovered even without a manifest. The manifest is optional — if omitted, the directory name becomes the plugin name. See [plugin manifest schema](https://code.claude.com/docs/en/plugins-reference#plugin-manifest-schema) for the complete reference.",
  "x-lintel": {
    "source": "https://raw.githubusercontent.com/lintel-rs/catalog/master/schemas/claude-code/plugin.json",
    "sourceSha256": "4378f40a58650eeab0a81afef786240937537e7b51d4f144d1b8940b29173d02",
    "fileMatch": [
      "**/.claude-plugin/plugin.json",
      ".claude-plugin/plugin.json"
    ],
    "parsers": [
      "json"
    ],
    "catalogDescription": "Claude Code plugin manifest."
  },
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Unique identifier for the plugin (kebab-case, no spaces). This name **namespaces all plugin components** — skills appear as `/plugin-name:skill-name`, agents as `plugin-name:agent-name`, etc. Users see this in install commands (e.g. `/plugin install my-plugin@marketplace`). If the manifest is omitted entirely, the directory name is used instead.",
      "pattern": "^[a-z0-9][a-z0-9-]*$",
      "examples": [
        "deployment-tools",
        "code-quality",
        "my-first-plugin"
      ]
    },
    "version": {
      "type": "string",
      "description": "Semantic version (`MAJOR.MINOR.PATCH`). Claude Code uses this to detect updates — if you change code without bumping the version, existing users **won't see updates** due to [caching](https://code.claude.com/docs/en/plugins-reference#plugin-caching-and-file-resolution). If also set in a marketplace entry, the `plugin.json` version takes priority. Use pre-release versions like `2.0.0-beta.1` for testing. See [version management](https://code.claude.com/docs/en/plugins-reference#version-management).",
      "examples": [
        "1.0.0",
        "2.1.0",
        "1.0.0-beta.1"
      ]
    },
    "description": {
      "type": "string",
      "description": "Brief explanation of the plugin's purpose. Shown in the plugin manager when browsing or installing plugins.",
      "examples": [
        "Deployment automation tools",
        "Code quality and review workflows",
        "A greeting plugin to learn the basics"
      ]
    },
    "author": {
      "$ref": "https://catalog.lintel.tools/schemas/claude-code/author/latest.json",
      "description": "Author information for attribution."
    },
    "homepage": {
      "type": "string",
      "description": "URL to the plugin's documentation or landing page.",
      "examples": [
        "https://docs.example.com/plugin"
      ]
    },
    "repository": {
      "type": "string",
      "description": "URL to the plugin's source code repository.",
      "examples": [
        "https://github.com/user/plugin"
      ]
    },
    "license": {
      "type": "string",
      "description": "[SPDX license identifier](https://spdx.org/licenses/).",
      "examples": [
        "MIT",
        "Apache-2.0",
        "ISC"
      ]
    },
    "keywords": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Discovery tags for the plugin. Used when searching or browsing plugins in marketplaces.",
      "examples": [
        [
          "deployment",
          "ci-cd"
        ],
        [
          "code-quality",
          "review"
        ]
      ]
    },
    "commands": {
      "$ref": "https://catalog.lintel.tools/schemas/claude-code/path-or-paths/latest.json",
      "description": "Additional command file or directory paths, relative to the plugin root starting with `./`. These **supplement** the default `commands/` directory — they don't replace it. Paths should point to `.md` files or directories containing `.md` files. See [path behavior rules](https://code.claude.com/docs/en/plugins-reference#path-behavior-rules).",
      "examples": [
        "./custom/commands/special.md",
        [
          "./specialized/deploy.md",
          "./utilities/batch-process.md"
        ]
      ]
    },
    "agents": {
      "$ref": "https://catalog.lintel.tools/schemas/claude-code/path-or-paths/latest.json",
      "description": "Additional agent file or directory paths, relative to the plugin root starting with `./`. These **supplement** the default `agents/` directory.",
      "examples": [
        "./custom/agents/",
        [
          "./custom-agents/reviewer.md",
          "./custom-agents/tester.md"
        ]
      ]
    },
    "skills": {
      "$ref": "https://catalog.lintel.tools/schemas/claude-code/path-or-paths/latest.json",
      "description": "Additional [skill](https://code.claude.com/docs/en/skills) directory paths, relative to the plugin root starting with `./`. These **supplement** the default `skills/` directory. Paths should point to directories containing `SKILL.md` files.",
      "examples": [
        "./custom/skills/"
      ]
    },
    "hooks": {
      "description": "[Hook](https://code.claude.com/docs/en/hooks) configuration — either paths to JSON config files or inline hook definitions. Custom paths **supplement** `hooks/hooks.json` (the default location). Inline definitions map event names to arrays of matcher groups.",
      "oneOf": [
        {
          "type": "string",
          "description": "Path to a hooks JSON config file, relative to the plugin root."
        },
        {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Array of paths to hooks JSON config files."
        },
        {
          "$ref": "https://catalog.lintel.tools/schemas/claude-code/hooks/latest.json",
          "description": "Inline hook definitions."
        }
      ],
      "examples": [
        "./config/hooks.json",
        [
          "./hooks/security-hooks.json",
          "./hooks/format-hooks.json"
        ]
      ]
    },
    "mcpServers": {
      "description": "[MCP server](https://code.claude.com/docs/en/mcp) configuration — either paths to JSON config files or inline server definitions. Custom paths **supplement** `.mcp.json` (the default location). Inline definitions map server names to their transport configuration. MCP servers start automatically when the plugin is enabled. Use `${CLAUDE_PLUGIN_ROOT}` for plugin-relative paths.",
      "oneOf": [
        {
          "type": "string",
          "description": "Path to an MCP config JSON file, relative to the plugin root."
        },
        {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Array of paths to MCP config JSON files."
        },
        {
          "type": "object",
          "description": "Inline MCP server definitions. Each key is a server name.",
          "additionalProperties": {
            "oneOf": [
              {
                "type": "string",
                "description": "Reference to an already-configured MCP server by name."
              },
              {
                "$ref": "https://catalog.lintel.tools/schemas/claude-code/mcp-server-config/latest.json",
                "description": "Inline MCP server definition."
              }
            ]
          }
        }
      ],
      "examples": [
        "./mcp-config.json",
        {
          "plugin-db": {
            "command": "${CLAUDE_PLUGIN_ROOT}/servers/db-server",
            "args": [
              "--config",
              "${CLAUDE_PLUGIN_ROOT}/config.json"
            ]
          }
        }
      ]
    },
    "outputStyles": {
      "$ref": "https://catalog.lintel.tools/schemas/claude-code/path-or-paths/latest.json",
      "description": "Additional output style files or directories, relative to the plugin root starting with `./`.",
      "examples": [
        "./styles/"
      ]
    },
    "lspServers": {
      "description": "[LSP server](https://code.claude.com/docs/en/plugins-reference#lsp-servers) configuration — either paths to JSON config files or inline server definitions. Custom paths **supplement** `.lsp.json` (the default location). LSP integration provides real-time code intelligence: diagnostics, go to definition, find references, and hover information. Users must install the language server binary separately.",
      "oneOf": [
        {
          "type": "string",
          "description": "Path to an LSP config JSON file, relative to the plugin root."
        },
        {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Array of paths to LSP config JSON files."
        },
        {
          "type": "object",
          "description": "Inline LSP server definitions. Each key is a language name.",
          "additionalProperties": {
            "$ref": "https://catalog.lintel.tools/schemas/claude-code/lsp-server-config/latest.json"
          }
        }
      ],
      "examples": [
        "./.lsp.json",
        {
          "go": {
            "command": "gopls",
            "args": [
              "serve"
            ],
            "extensionToLanguage": {
              ".go": "go"
            }
          }
        }
      ]
    }
  },
  "required": [
    "name"
  ]
}
