Plugin Manifest Format for Claude Plugins: Schema, Validation, and Examples
The Claude plugin manifest format is a JSON schema defined in either .claude-plugin/plugin.json or plugin.json that specifies metadata, user configuration options, and MCP server connections, validated by the Claude CLI using the resolve_external_manifest() function in the community validation toolkit.
Claude plugins published to the marketplace require a structured metadata file that defines capabilities, authorship, and runtime configuration. In the anthropics/claude-plugins-community repository, this plugin manifest format follows a strict JSON schema enforced by the validate-plugins GitHub Action and the Claude CLI validation tool.
Core Manifest Schema and Required Fields
Every plugin manifest must include four fundamental fields that establish the plugin's identity and versioning:
name– A unique string identifier that serves as the command namespace for the plugin.description– A human-readable summary displayed in the marketplace.version– A semantic version string following theMAJOR.MINOR.PATCHformat.author– An object containing"name"and"email"strings that identifies the maintainer.
These fields form the minimal valid manifest that the Claude marketplace will accept. According to the validation logic in .github/actions/validate-plugins/lib/common.sh, the resolve_external_manifest() function checks for these required keys before allowing publication.
Optional Fields and Configuration Options
Beyond the core schema, the manifest supports several optional fields that enhance discoverability and functionality:
homepage– URL string pointing to documentation or the plugin's website.repository– Source code location, typically a GitHub URL.license– SPDX license identifier (e.g.,"MIT","Apache-2.0").keywords– Array of strings used as tags for marketplace search and filtering.
User Configuration with userConfig
The userConfig object declares configuration values that end-users set during installation. Each key defines a specific setting with the following structure:
{
"CONFIG_KEY_NAME": {
"title": "Human-readable label",
"description": "Detailed explanation of the setting",
"type": "string",
"sensitive": true
}
}
The sensitive boolean flag determines whether the value appears in logs. When set to true, the Claude CLI masks the value in output, protecting API keys and secrets.
MCP Server Declarations with mcpServers
The mcpServers object describes Model Context Protocol server connections required by the plugin. This field enables the marketplace loader to provision necessary infrastructure:
{
"mcpServers": {
"prod": {
"url": "https://mcp.mycompany.com",
"auth": {
"type": "token",
"envVar": "MCP_TOKEN"
}
}
}
}
Manifest Location and Discovery
The validation system searches for the manifest in two specific locations, checking them in order:
.claude-plugin/plugin.jsonplugin.json(repository root)
As implemented in anthropics/claude-plugins-community, the resolve_external_manifest() function in .github/actions/validate-plugins/lib/common.sh implements this lookup logic (lines 152–166 of the script). If neither file exists and the plugin operates under strict:false mode (skills-only plugins), the function synthesizes a minimal manifest containing only the name field.
This synthesis behavior mirrors the runtime behavior of the Claude marketplace, ensuring that every plugin has a valid manifest for validation purposes. The test suite in .github/actions/validate-plugins/test-external-manifest.sh (lines 66–68) verifies this fallback mechanism.
Validation Workflow and CLI Integration
The plugin manifest format undergoes a three-stage validation process before marketplace acceptance:
-
Detection – The
validate-pluginsGitHub Action scans the repository for.claude-plugin/plugin.jsonfirst, falling back toplugin.jsonat the root. -
Synthesis – For entries marked
strict:falsewithout a manifest, the action creates a minimal JSON file containing only the requirednamefield viaresolve_external_manifest(). -
Schema Validation – The CLI command
claude plugin validate <manifest-path>verifies that the JSON conforms to the schema, checking for unknown keys, missing required fields, and type mismatches.
You can run this validation locally before submission:
# Validate from the .claude-plugin directory
claude plugin validate .claude-plugin/plugin.json
# Or validate a root-level manifest
claude plugin validate plugin.json
The CLI outputs either a success message or a detailed list of schema violations, including invalid field types or prohibited top-level keys.
Complete Manifest Example: Tres Finance Plugin
The following example from the tres-finance-plugin in the community repository demonstrates a production-ready manifest with all optional fields populated:
{
"name": "tres-finance-plugin",
"description": "The first official TRES Finance plugin for Claude Code — blockchain accounting workflows, ledger management, and transaction analysis. Connects to the hosted TRES Finance MCP server; collects no usage telemetry.",
"version": "1.12.1",
"author": {
"name": "Nadav Gilliam",
"email": "nadav@tres.finance"
},
"homepage": "https://tres.finance",
"repository": "https://github.com/Tres-Finance-Public/tres-claude-plugin",
"license": "MIT",
"keywords": [
"tres-finance",
"blockchain",
"accounting",
"ledger",
"crypto"
],
"userConfig": {
"DEBANK_API_KEY": {
"title": "DeBank API Key",
"description": "Your DeBank Pro API key for balance validation (from https://cloud.debank.com)",
"type": "string",
"sensitive": true
}
}
}
This manifest leverages the .claude-plugin/plugin.json path and includes sensitive configuration handling for API credentials.
Summary
- The plugin manifest format for Claude plugins requires a JSON file at
.claude-plugin/plugin.jsonorplugin.jsoncontaining at minimumname,description,version, andauthorfields. - The
userConfigobject enables secure collection of user-specific settings, with thesensitiveflag protecting credentials from log exposure. - The
mcpServersfield declares required Model Context Protocol connections for marketplace provisioning. - Validation occurs through the
validate-pluginsGitHub Action, which usesresolve_external_manifest()in.github/actions/validate-plugins/lib/common.shto locate or synthesize manifests. - Run
claude plugin validate <path>locally to verify schema compliance before submitting to the community repository.
Frequently Asked Questions
Where should I place the plugin.json file in my repository?
Place your manifest in either .claude-plugin/plugin.json (preferred) or plugin.json at the repository root. The validation system checks the .claude-plugin/ directory first, as defined in the resolve_external_manifest() function within .github/actions/validate-plugins/lib/common.sh.
What happens if I don't include a manifest file?
If you submit a skills-only plugin without a manifest under strict:false mode, the marketplace validation synthesizes a minimal manifest containing only the name field. However, you should provide a full manifest to maximize discoverability and enable user configuration features.
How do I validate my plugin manifest locally?
Use the Claude CLI command claude plugin validate followed by the path to your manifest file. For example: claude plugin validate .claude-plugin/plugin.json. The CLI will report schema violations such as missing required fields, incorrect types, or unknown keys.
What is the purpose of the sensitive flag in userConfig?
The sensitive boolean in userConfig entries marks values that should be hidden from logs and CLI output. Set this to true for API keys, tokens, and passwords to prevent accidental exposure during plugin operation or debugging sessions.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →