Claude Plugin Manifest Structure: A Complete Guide to plugin.json
Claude plugin manifests are JSON configuration files (plugin.json) located in the repository root or .claude-plugin/ directory that define metadata, versioning, and user configuration schemas required by the Claude Code ecosystem.
The anthropics/claude-plugins-community repository establishes the canonical schema for these manifests, balancing strict validation requirements with flexible support for skills-only plugins. Understanding the precise structure of Claude plugin manifests enables developers to publish discoverable, configurable tools that integrate seamlessly with Claude Code.
Core Structure of plugin.json
Every Claude plugin requires a manifest file named plugin.json. According to the repository structure, this file resides either in the repository root or within the hidden .claude-plugin/ directory. The manifest follows a JSON schema that captures essential metadata for plugin discovery and execution.
Required and Optional Manifest Fields
The schema distinguishes between core metadata required for all plugins and optional configuration objects that enable user customization.
Required Metadata Fields
The following fields constitute the minimum viable manifest:
name: Human-readable identifier used in marketplace listings and plugin loading.description: Brief summary displayed in plugin discovery interfaces.version: Semantic version string (e.g.,1.12.1).author: Object containingnameand optionalemailof the creator.homepage: URL pointing to documentation or project website.repository: Source code location URL.license: SPDX-style identifier (e.g.,MIT).keywords: Array of strings for categorization and searchability.
Optional Configuration with userConfig
Plugins requiring end-user configuration specify a userConfig object. Each key in this object defines a configuration field with the following properties:
title: Display name for the setting.description: Explanation of the configuration purpose.type: Data type specification (e.g.,string).sensitive: Boolean flag indicating whether the value contains secrets like API keys.
A complete example from tres-finance-plugin/.claude-plugin/plugin.json demonstrates this structure:
{
"name": "tres-finance-plugin",
"description": "Financial data integration for Claude",
"version": "1.12.1",
"author": {
"name": "Tres Finance Team",
"email": "support@tres.finance"
},
"homepage": "https://tres.finance",
"repository": "https://github.com/anthropics/claude-plugins-community",
"license": "MIT",
"keywords": ["finance", "accounting", "api"],
"userConfig": {
"API_KEY": {
"title": "API Key",
"description": "Secret key for Tres Finance API access",
"type": "string",
"sensitive": true
}
}
}
Marketplace Aggregation with marketplace.json
When plugins publish to the community marketplace, a higher-level marketplace.json file aggregates multiple entries. Located at .claude-plugin/marketplace.json, this file manages plugin registration through entries containing:
name: Plugin identifier matching the directory name.source: Relative path to the plugin directory.strict: Boolean determining validation strictness.
The strict field controls manifest requirements:
{
"name": "tres-finance-plugin",
"source": "./",
"strict": false
}
When strict is true, the plugin must provide a complete plugin.json. When false, the system permits minimal or synthetic manifests.
Manifest Synthesis for Skills-Only Plugins
For plugins marked with "strict": false that omit a plugin.json file, the validation workflow automatically synthesizes a minimal manifest. This behavior is implemented in .github/actions/validate-plugins/lib/common.sh via the resolve_external_manifest function.
The synthesis process generates a temporary manifest containing only the name field, written to .claude-plugin/plugin.json in a clone directory before validation:
{
"name": "my-skill-only-plugin"
}
This allows lightweight skills to participate in the ecosystem without maintaining full metadata files, while still passing validation checks.
Real-World Examples from the Repository
The anthropics/claude-plugins-community repository provides concrete implementations demonstrating both comprehensive and minimal manifest patterns.
Full Manifest Example
The Tres Finance plugin at tres-finance-plugin/.claude-plugin/plugin.json illustrates a production-ready configuration with userConfig for sensitive credentials and complete metadata for marketplace discovery.
Minimal Manifest Example
Conversely, the TestDino plugin at testdino/.claude-plugin/plugin.json demonstrates a bare-bones configuration without userConfig, suitable for simple tools requiring no end-user configuration.
Summary
- Claude plugin manifests use the filename
plugin.jsonand reside in the repository root or.claude-plugin/directory. - Required fields include
name,description,version,author,homepage,repository,license, andkeywords. - The optional
userConfigobject defines user-configurable settings withtitle,description,type, andsensitiveproperties. - Marketplace aggregation uses
marketplace.jsonwith astrictflag that determines whether full manifests are required. - The
resolve_external_manifestfunction in.github/actions/validate-plugins/lib/common.shsynthesizes minimal manifests for skills-only plugins whenstrictisfalse.
Frequently Asked Questions
Where should the plugin.json file be located?
Claude expects the manifest file at the repository root or within a hidden .claude-plugin/ directory. Both locations are valid, though the .claude-plugin/ directory is preferred for cleaner repository organization.
What is the purpose of the strict field in marketplace.json?
The strict boolean in .claude-plugin/marketplace.json controls validation requirements. When set to true, the plugin must provide a complete plugin.json with all metadata fields. When false, the validation system generates a synthetic manifest containing only the plugin name, accommodating lightweight skills without full configuration files.
How does userConfig handle sensitive information like API keys?
The userConfig object includes a sensitive boolean flag for each configuration field. When set to true, Claude treats the value as a secret, ensuring appropriate handling and storage of credentials like API keys or authentication tokens.
What happens if a plugin omits the plugin.json file entirely?
If a plugin lacks a manifest file but is registered in marketplace.json with "strict": false, the validation workflow automatically creates a synthetic manifest. The resolve_external_manifest function in the validation scripts generates this temporary file containing only the name field, allowing the plugin to pass validation without manual manifest creation.
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 →