Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Plugins

A plugin bundles related customizations — skills, hooks, sub-agent definitions, MCP server configs, and output styles — into a single installable directory. The plugin system (ADR 0030) is a thin orchestrator: it parses a plugin.json manifest, namespaces items, expands ${CALIBAN_PLUGIN_ROOT}, and is designed to feed everything into the same per-surface loaders that project and user files use.

Only plugin skills are loaded at runtime today

The caliban plugin command manages installs, and the manifest parses every component type. At startup, though, the binary currently wires in only each plugin's skills. Bundled hooks, MCP servers, agents, and commands are parsed but not yet loaded. Plugin output styles are picked up only from the user install directory, by the output-styles loader. The sections below describe the full design; treat the non-skill surfaces as planned.

What a plugin contains

my-plugin/
  plugin.json             # required manifest
  skills/
    my-workflow/
      SKILL.md
  hooks/
    hooks.json
  agents/
    reviewer.md
  output-styles/
    concise.md
  mcp/
    .mcp.json
  commands/
    recap.md

All subdirectories are optional. When a components entry is omitted from the manifest, the loader scans the conventional subdirectory automatically.

The manifest (plugin.json)

{
  "name": "my-plugin",
  "version": "1.0.0",
  "description": "Short description shown in /plugins and trust prompts",
  "author": "Alice <alice@example.com>",
  "license": "MIT",
  "homepage": "https://example.com/my-plugin",
  "components": {
    "skills": ["skills/my-workflow"],
    "hooks": "hooks/hooks.json",
    "agents": ["agents/reviewer.md"],
    "output_styles": "output-styles/concise.md",
    "mcp_servers": "mcp/.mcp.json",
    "commands": ["commands/recap.md"]
  },
  "caliban": {
    "min_version": "0.5.0",
    "platforms": ["macos", "linux"]
  }
}
FieldRequiredDescription
nameYesMatches the directory name. Must be [a-z0-9_-]{1,32}.
versionYesSemver string.
descriptionNoOne-line description.
authorNoFree-form author string.
licenseNoSPDX identifier.
homepageNoURL.
componentsNoPaths to bundled files (string or array).
caliban.min_versionNoSkip when the running caliban is older.
caliban.platformsNoLimit to macos, linux, or windows.

For MCP servers bundled as inline config (matching Claude Code's .mcp.json shape), use the top-level mcpServers key instead of components.mcp_servers.

Discovery roots

Caliban scans three roots at startup. A plugin with the same name in an earlier root replaces later ones — no manifest merging.

PriorityRootScope
1 (highest)<workspace>/.caliban/plugins/<name>/Project
2$XDG_DATA_HOME/caliban/plugins/<name>/ (user install dir)User
3/etc/caliban/plugins/<name>/ (platform analogues)Managed (org policy)

Which plugins load is filtered at startup by the CALIBAN_ENABLED_PLUGINS environment variable (comma-separated names). Managed plugins ignore the filter. caliban plugin enable/disable records the choice in the plugins.enabled setting, but startup does not read that setting yet.

Namespacing

Items loaded from a plugin carry a <plugin>:<item> prefix:

  • Skills: my-plugin:my-workflow
  • Output styles: my-plugin:concise
  • MCP servers: my-plugin:my-server

This prevents collisions with bare-named items at the project or user level. Hooks merge additively across plugins.

The caliban plugin command

# List all installed plugins and their status
caliban plugin list

# Show the manifest of an installed plugin as JSON
caliban plugin info <name>

# Install a plugin from a marketplace
caliban plugin install <name>@<marketplace-url>

# Install a plugin from a local directory
caliban plugin install --dir /path/to/my-plugin

# Update a plugin to the latest marketplace version
caliban plugin update <name>

# Remove a plugin
caliban plugin remove <name>

# Enable / disable a plugin (affects whether it loads at startup)
caliban plugin enable <name>
caliban plugin disable <name>

caliban plugin help prints the full reference.

Marketplace trust

First-time marketplace installs display the manifest, its sha256 hash, and the install URL and prompt for acknowledgement. Acknowledged installs are recorded in $XDG_DATA_HOME/caliban/trust/plugins.json. Re-installs of the same manifest hash skip the prompt; version bumps re-prompt. Sideloads (local --dir installs) skip trust gating because the operator already has filesystem access.

${CALIBAN_PLUGIN_ROOT} expansion

Inside plugin-bundled hook commands and MCP server configs, ${CALIBAN_PLUGIN_ROOT} expands to the plugin's absolute root directory. ${CLAUDE_PLUGIN_ROOT} is a supported alias so existing Claude Code plugins port verbatim.

Note

The --no-plugins flag (or CALIBAN_NO_PLUGINS=1) disables plugin discovery entirely for a single run, treating all plugin roots as empty. This is useful for debugging or for CI environments that should not pick up locally installed plugins.