Manifest Reference

Complete reference for every field in a plugin's manifest.json file.

Every plugin requires a manifest.json file in its root directory. This file describes the plugin to the host and controls how it's loaded and displayed.

New to plugins? Start with the Getting Started tutorial first.

Complete Example

json
{
  "name": "project-stats",
  "displayName": "Project Stats",
  "version": "2.0.0",
  "description": "Scans the current project and shows file counts, lines of code, and file-type breakdown.",
  "author": "Claude Code UI",
  "icon": "BarChart3",
  "type": "module",
  "slot": "tab",
  "entry": "index.js",
  "server": "server.js",
  "permissions": []
}

Required Fields

name

Typestring
RequiredYes
ValidationMust match /^[a-zA-Z0-9_-]+$/

The unique identifier for your plugin. Used internally for configuration, routing, and directory naming. Must only contain letters, numbers, hyphens, and underscores.

json
"name": "my-awesome-plugin"

Tip: Use kebab-case for consistency. This name appears in API routes (/api/plugins/my-awesome-plugin/...).

displayName

Typestring
RequiredYes

The human-readable name shown in the tab bar and Settings panel. Can contain any characters including spaces and emoji.

json
"displayName": "Project Stats"

entry

Typestring
RequiredYes

Path to the frontend entry file, relative to the plugin's root directory. This must be a JavaScript file that exports mount() and optionally unmount() functions. See the Frontend API Reference for details.

json
"entry": "index.js"

Optional Fields

version

Typestring
Default"0.0.0"

Semantic version string. Displayed in the plugin card in Settings. Purely informational.

json
"version": "1.2.3"

description

Typestring
Default""

Short description shown below the plugin name in Settings. Keep it under 120 characters.

json
"description": "Shows file counts, lines of code, and file-type breakdown for your project."

author

Typestring
Default""

Plugin author name. Displayed in the plugin card.

json
"author": "Jane Developer"

icon

Typestring
Default"Puzzle"

The icon displayed in the tab bar. Can be one of the built-in icon names or a path to a custom SVG file in your plugin directory.

Built-in icon names (from Lucide Icons):

Icon NameDescription
PuzzlePuzzle piece (default)
BoxPackage/box
DatabaseDatabase cylinder
GlobeWeb/globe
TerminalTerminal/console
WrenchSettings/tools
ZapLightning bolt
BarChart3Bar chart
FolderFile folder
MessageSquareChat/message
GitBranchGit branch

Custom icon file:

json
"icon": "icon.svg"

type

Typestring
Default"module"

Set this to "module". Your entry file is loaded as an ES module that exports mount(container, api) and optionally unmount(container).

json
"type": "module"

slot

Type"tab"
Default"tab"

Where the plugin appears in the UI. Currently only tab is supported.

json
"slot": "tab"

server

Typestring | null
Defaultnull

Path to a Node.js server entry file, relative to the plugin directory. When set, the host spawns this as a managed subprocess and proxies RPC calls to it. See Backend Servers for the full guide.

json
"server": "server.js"

Omit this field for frontend-only plugins.

permissions

Typestring[]
Default[]

Reserved for future use. Will be used for declaring capabilities the plugin requires (filesystem access, network access, etc.). For now, set to an empty array or omit entirely.

json
"permissions": []

Validation Rules

The host validates your manifest on installation and every time plugins are scanned. Invalid manifests cause the plugin to be skipped with a warning.

RuleError
Must be a valid JSON objectInvalid manifest: not a JSON object
name must be present and a stringMissing required field: name
displayName must be present and a stringMissing required field: displayName
entry must be present and a stringMissing required field: entry
name must match /^[a-zA-Z0-9_-]+$/Invalid plugin name: must only contain...

Minimal Manifest

The smallest valid manifest:

json
{
  "name": "my-plugin",
  "displayName": "My Plugin",
  "entry": "index.js"
}

Next Steps

Last updated March 9, 2026