openclaw.plugin.json. For compatible bundle layouts (Agent Plugins, Codex, Claude, Cursor), see Plugin bundles.
Compatible bundle formats use their own manifest files instead:
- Agent Plugins bundle:
plugin.jsonat the package root, per the open Agent Plugins standard - Codex bundle:
.codex-plugin/plugin.json - Claude bundle:
.claude-plugin/plugin.json, or the default Claude component layout with no manifest - Cursor bundle:
.cursor-plugin/plugin.json
openclaw.plugin.json schema below. For a compatible bundle, OpenClaw reads bundle metadata, declared skill roots, Claude command roots, Claude settings.json defaults, Claude LSP defaults, and supported hook packs, when the layout matches OpenClaw’s runtime expectations.
Every native OpenClaw plugin must ship openclaw.plugin.json in the plugin root. OpenClaw reads it to validate configuration without executing plugin code. A missing or invalid manifest blocks config validation and is treated as a plugin error.
See Plugins for the full plugin system guide, and Capability model for the native capability model and current external-compatibility guidance.
What this file does
openclaw.plugin.json is metadata OpenClaw reads before loading your plugin code. Everything in it must be cheap enough to inspect without booting plugin runtime.
Use it for:
- plugin identity, config validation, and config UI hints
- auth, onboarding, and setup metadata (alias, auto-enable, provider env vars, auth choices)
- activation hints for control-plane surfaces
- root CLI command names, descriptions, and subcommand markers (
cliCommands) - shorthand model-family ownership
- static capability-ownership snapshots (
contracts) - dashboard widget data bindings and action verbs
- static MCP servers that should exist while the plugin is enabled
- durable and regenerable state- or agent-relative backup resources
- QA runner metadata the shared
openclaw qahost can inspect - channel-specific config metadata merged into catalog and validation surfaces
package.json.
Where each field is documented
Every manifest field is documented on this page or on one of the seven child pages below. The anchors from the single-page version still resolve here.Model fields
Manifest model fields — Manifest model catalog, shorthand family, id normalization, and pricing fields.Provider fields
Manifest provider fields — Manifest generation, media-understanding, endpoint, and request provider metadata.imageGenerationProviderMetadata,videoGenerationProviderMetadata,musicGenerationProviderMetadatamediaUnderstandingProviderMetadataproviderEndpointsproviderRequest
Setup and auth fields
Manifest setup and auth fields — Manifest setup descriptors, auth choices, conversation discovery, and config UI hints.setup.nativeSessionCatalogproviderAuthChoicessetup,providerUsageAuthEnvVarssetup.providerssetupfield tableconfigGroupsuiHints
Capability fields
Manifest capability fields — Manifest capability ownership, tool availability metadata, and activation planning.Host surface fields
Manifest host surface fields — Manifest fields for icons, CLI, MCP, Control UI, dashboard, QA, channel, and backup surfaces.- Plugin icon,
doctorContract,doctorHealthChecks,sessionRouteStateOwners transcriptSourcesbackupResourcesmcpServerscontrolUithemesdashboardcatalogcliCommandscommandAliasesqaRunnerschannelConfigschannelAccountKeyPolicieschannelConfigs.<id>.preferOver
Config and secret fields
Manifest config and secret fields — Manifest dangerous-flag, SecretRef migration, and secret provider preset metadata.Manifest and package.json fields
Manifest versus package.json — Which pre-runtime metadata lives in package.json, and which duplicate plugin id wins.Minimal example
Rich example
Top-level field reference
An
AuthAlias is either a provider id string or an object with provider and
baseUrls. An object alias applies only to the configured model-provider
endpoint after trimming whitespace and trailing slashes. It does not rename
stored credential providers or contribute a new setup provider. Existing profile
order, explicit bindings, and plugin trust checks still apply.
Catalog categories
Choose the one category that best describes why someone would install the plugin. Use its main user purpose, not every tool, provider, or runtime capability it exposes. For example, an agent execution backend belongs inagent-runtimes, document extraction
belongs in documents-files, and a messaging adapter belongs in channels even when
it also provides workspace tools.
Bundled OpenClaw plugins declare exactly one active category. New ClawHub publications
also accept exactly one declared category, using the same array shape, or omit the
field for ClawHub to generate a category.
OpenClaw’s manifest reader continues to accept one to three unique, ordered categories
so previously installed and published packages remain readable. When reading older
multiple-category declarations, the first remains primary and all remain searchable.
The stricter new-publication rule does not invalidate an installed plugin’s manifest.
The active categories below are listed in browse order:
Legacy
tools, runtime, and gateway declarations remain valid so existing
packages keep loading. They are retired from the active browse taxonomy. Choose
active categories for new declarations; legacy values are not automatically
translated into a different category.
Omission remains valid for external plugin compatibility. When an external catalog supplies a
derived fallback, an explicit package declaration takes precedence. Bundled OpenClaw plugins must
declare exactly one active category.
JSON Schema requirements
- Every plugin must ship a JSON Schema, even if it accepts no config.
- An empty schema is acceptable (for example,
{ "type": "object", "additionalProperties": false }). - Config is validated against the manifest schema at config read/write time and before the plugin loads.
- When extending or forking a bundled plugin with new config keys, update that plugin’s
openclaw.plugin.jsonconfigSchemaat the same time. Bundled plugin schemas are strict, so addingplugins.entries.<id>.config.myNewKeyin user config without addingmyNewKeytoconfigSchema.propertieswill be rejected before the plugin runtime loads.
Validation behavior
Capability catalogs
capabilityCatalogEntry declares a lightweight module relative to the selected
plugin root, for example "./capability-catalog.ts". It exports actual speech,
realtime transcription, or realtime voice provider descriptors without importing
the full plugin entry. See the typed SDK contract.
Each supplied family is authoritative, including an empty array. An omitted
family, or a plugin without this declaration, retains the existing register()
discovery contract for installed plugins. A malformed, missing, or broken declared
entry fails with a repair diagnostic; it does not fall through to full registration.
Already registered runtime providers remain authoritative, including live broker
and readiness closures.
The entry uses the same plugin-root boundary checks, installed-owner precedence,
prepared metadata generation, and source/built artifact policy as other plugin
surfaces. Repository builds include declared entries and rewrite emitted manifest
paths to the corresponding JavaScript artifacts. Plugin reload owns invalidation;
catalog requests do not poll files for changes.
Configuration validation
- Required-field errors identify every missing field after schema defaults are applied. For dependencies on multiple fields, the error reports the dependency condition without claiming that fields already present are missing.
- Unknown
channels.*keys are errors, unless the channel id is declared by a plugin manifest. If the same id also appears inplugins.allow,plugins.entries, orplugins.installs(a plugin that is referenced but not currently discoverable), OpenClaw downgrades this to a warning instead. plugins.entries.<id>,plugins.allow, andplugins.denyreferencing unknown plugin ids are warnings (“stale config entry ignored”), not errors, so upgrades and removed/renamed plugins do not block gateway startup. An exact{ enabled: false }plugin entry is an intentional uninstall marker, so validation and Doctor keep it without a stale-config warning.plugins.slots.memoryreferencing an unknown plugin id is an error, except for the knownmemory-lancedbofficial external plugin, which warns instead.- If a plugin is installed but has a broken or missing manifest or schema, validation fails and Doctor reports the plugin error.
- If plugin config exists but the plugin is disabled, the config is kept and a warning is surfaced in Doctor + logs.
plugins.* schema.
Notes
- The manifest is required for native OpenClaw plugins, including local filesystem loads. Runtime still loads the plugin module separately; the manifest is only for discovery + validation.
- Native manifests are parsed with JSON5, so comments, trailing commas, and unquoted keys are accepted as long as the final value is still an object.
- Only documented manifest fields are read by the manifest loader. Avoid custom top-level keys.
channels,providers,cliBackends, andskillscan all be omitted when a plugin does not need them.providerCatalogEntrymust stay lightweight and should not import broad runtime code; use it for static provider catalog metadata or narrow discovery descriptors, not request-time execution.- Exclusive plugin kinds are selected through
plugins.slots.*:kind: "memory"viaplugins.slots.memory(defaultmemory-core),kind: "context-engine"viaplugins.slots.contextEngine(defaultlegacy). - Declare exclusive plugin kind in this manifest. Bundled plugins use manifest kinds without loading their runtime during enablement. Runtime-entry
OpenClawPluginDefinition.kindwas deprecated on 2026-07-25 and remains only as a compatibility fallback for older external plugins; its removal gate is 2026-10-01. See the compatibility policy. - Env-var metadata in
setup.providers[].envVarsis declarative only. Status, audit, cron delivery validation, and other read-only surfaces still apply plugin trust and effective activation policy before treating an env var as configured. - For runtime wizard metadata that requires provider code, see Provider runtime hooks.
- If your plugin depends on native modules, document the build steps and any package-manager allowlist requirements (for example, pnpm
allow-build-scripts+pnpm rebuild <package>).
Related
Building plugins
Getting started with plugins.
Plugin architecture
Internal architecture and capability model.
SDK overview
Plugin SDK reference and subpath imports.
Model fields
Manifest model catalog, shorthand family, id normalization, and pricing fields.
Provider fields
Manifest generation, media-understanding, endpoint, and request provider metadata.
Setup and auth fields
Manifest setup descriptors, auth choices, conversation discovery, and config UI hints.
Capability fields
Manifest capability ownership, tool availability metadata, and activation planning.
Host surface fields
Manifest fields for icons, CLI, MCP, Control UI, dashboard, QA, channel, and backup surfaces.
Config and secret fields
Manifest dangerous-flag, SecretRef migration, and secret provider preset metadata.
Manifest vs package.json
Which pre-runtime metadata lives in package.json, and which duplicate plugin id wins.
Plugin setup and config
Packaging and config schemas that consume this manifest.
Plugin entry points
definePluginEntry and the other entry helpers a plugin’s code exports.Tool plugins
Declaring
contracts.tools for agent tools.Manage plugins
Installing and enabling the plugins this manifest describes.
Backup
The
backupResources surface declared here.