Install and Use Plugin Bundles in OpenClaw
Learn how to install and use Agent Plugins, Codex, Claude, and Cursor bundles as OpenClaw plugins, including setup and verification steps.
Read this when
- You want to install an Agent Plugins, Codex, Claude, or Cursor-compatible bundle
- You need to understand how OpenClaw maps bundle content into native features
- You are debugging bundle detection or missing capabilities
OpenClaw pulls in plugins from four outside ecosystems: the format-agnostic Agent Plugins standard, along with Codex, Claude, and Cursor. These packages, referred to as bundles, carry content and metadata that OpenClaw translates into built-in features such as skills, hooks, and MCP tools.
Info
Bundles differ from OpenClaw's own native plugins. Native plugins execute within the process and can register any capability. Bundles, by contrast, are content packages with selective feature mapping and a more limited trust boundary.
Why bundles exist
Plenty of useful plugins ship in Agent Plugins, Codex, Claude, or Cursor form. Rather than making authors rework them into native OpenClaw plugins, OpenClaw recognizes these formats and converts their supported content into the native feature set. Install an Agent Plugins package, a Claude command pack, or a Codex skill bundle and it works right away.
Install a bundle
Install from a directory, archive, or marketplace
# Local directory
openclaw plugins install ./my-bundle
# Archive
openclaw plugins install ./my-bundle.tgz
# Claude marketplace
openclaw plugins marketplace list <source>
openclaw plugins install <plugin> --marketplace <source>
A local marketplace path/repo or a git/GitHub source is what <source> refers to.
Verify detection
openclaw plugins list
openclaw plugins inspect <id>
Bundles display Format: bundle alongside a Bundle format: value chosen from agent (Agent Plugins), codex, claude, or cursor.
Restart and use
openclaw gateway restart
Mapped features (skills, hooks, MCP tools, LSP defaults) become available starting with the next session.
What OpenClaw maps from bundles
Not every bundle feature is operational in OpenClaw at this time. The list below covers what functions now and what gets detected but remains unwired.
Supported now
| Feature | How it maps | Applies to |
|---|---|---|
| Skill content | Bundle skill roots load as normal OpenClaw skills | All formats |
| Commands | commands/ and .cursor/commands/ treated as skill roots | Claude, Cursor |
| Hook packs | OpenClaw-style HOOK.md + handler.ts layouts | Codex |
| MCP tools | Bundle MCP config merged into embedded OpenClaw settings; supported stdio and HTTP servers loaded | All formats |
| Env contract | PLUGIN_ROOT and PLUGIN_DATA env vars plus placeholder expansion for stdio MCP servers | Agent Plugins |
| LSP servers | Claude .lsp.json and manifest-declared lspServers merged into embedded OpenClaw LSP defaults | Claude |
| Settings | Claude settings.json imported as embedded OpenClaw defaults | Claude |
Skill content
- Bundle skill roots are loaded just like regular OpenClaw skill roots.
- Additional skill roots come from Claude
commands/roots. - Cursor
.cursor/commands/roots also count as extra skill roots.
Both Claude markdown command files and Cursor command markdown pass through the standard OpenClaw skill loader.
Hook packs
Bundle hook roots only work when they follow the standard OpenClaw hook-pack structure: HOOK.md combined with handler.ts or handler.js. As it stands, this mostly covers the Codex-compatible scenario.
MCP for embedded OpenClaw
- Enabled bundles can supply MCP server configuration.
- Bundle MCP config gets merged into the effective embedded OpenClaw settings as
mcpServers. - During embedded OpenClaw agent turns, OpenClaw surfaces supported bundle MCP tools by spawning stdio servers or dialing into HTTP servers.
- The
codingandmessagingtool profiles include bundle MCP tools by default; opt out for an agent or gateway withtools.deny: ["bundle-mcp"]. - Project-local embedded agent settings take precedence after bundle defaults, so workspace settings can override bundle MCP entries when necessary.
- Bundle MCP tool catalogs get sorted deterministically before registration, so shifts in upstream
listTools()order don't disrupt prompt-cache tool blocks.
Transports
MCP servers support either stdio or HTTP transport.
Stdio spawns a child process:
{
"mcp": {
"servers": {
"my-server": {
"command": "node",
"args": ["server.js"],
"env": { "PORT": "3000" }
}
}
}
}
HTTP links to an already-running MCP server, defaulting to sse unless streamable-http is specified:
{
"mcp": {
"servers": {
"my-server": {
"url": "http://localhost:3100/mcp",
"transport": "streamable-http",
"headers": {
"Authorization": "Bearer ${MY_SECRET_TOKEN}"
},
"connectionTimeoutMs": 30000
}
}
}
}
transporttakes either"streamable-http"or"sse"; when omitted,sseis used by default.type: "http"suits CLI-native downstream usage; for OpenClaw config, go withtransport: "streamable-http". Bothopenclaw mcp setandopenclaw doctor --fixstandardize the common alias.- Allowed URL schemes are limited to
http:andhttps:. - Interpolation with
${ENV_VAR}is supported inheadersvalues. - A server entry that includes both
commandandurlgets rejected. - Tool descriptions and logs strip out URL credentials, including userinfo and query parameters.
- The default 30-second connection timeout for stdio and HTTP transports is overridden by
connectionTimeoutMs. Request timeout starts at 60 seconds and can be changed viarequestTimeoutMs.
Tool naming
Provider-safe names are assigned by OpenClaw to bundle MCP tools in the format serverName__toolName. Take a server with the key "vigil-harbor" that exposes a memory_search tool; it registers as vigil-harbor__memory_search.
- Any character outside
A-Za-z0-9_-gets swapped for-. - Fragments beginning with a non-letter receive a letter prefix, meaning numeric server keys like
12306turn into provider-safe tool prefixes. - Server prefixes are limited to 30 characters.
- Tool names can reach up to 64 characters.
- When a server name is empty,
mcpsteps in as the fallback. - Numeric suffixes resolve collisions among sanitized names.
- Tool exposure order is deterministic by safe name, keeping repeated embedded-agent turns cache-stable.
- Profile filtering sees every tool from one bundle MCP server as plugin-owned by
bundle-mcp, so allow/deny lists can target either specific exposed tool names or thebundle-mcpplugin key.
Embedded OpenClaw settings
With the bundle enabled, Claude settings.json loads in as default embedded OpenClaw settings. Before applying shell override keys, OpenClaw sanitizes them:
shellPathshellCommandPrefix
Embedded OpenClaw LSP
- Enabled Claude bundles may supply LSP server configuration.
- OpenClaw pulls in
.lsp.jsonplus any manifest-declaredlspServerspaths. - Bundle LSP config merges into the effective embedded OpenClaw LSP defaults.
- Today only stdio-backed LSP servers that are supported can run; unsupported transports still appear in
openclaw plugins inspect <id>.
Detected but not executed
These are acknowledged and flagged in diagnostics, but OpenClaw leaves them unrun:
- Claude
agents,hooks/hooks.jsonautomation,outputStyles - Cursor
.cursor/agents,.cursor/hooks.json,.cursor/rules - Codex
.app.jsonmetadata beyond capability reporting
Bundle formats
Agent Plugins bundles
Marker: plugin.json sits at the package root, following the open
Agent Plugins 1.0.0 standard
Optional content: skills/, mcp.json
Format behavior:
- The manifest must be strict JSON, not JSON5. OpenClaw demands a non-empty
name; every other field in the manifest is optional, and any unknown fields get ignored - Any immediate child folder of
skills/that includes aSKILL.mdis loaded as a skill; folders lacking one are skipped with a warning, and scanning does not go beyond that first level mcp.jsonhas to specify the 1.0.0$schemaand anmcpServersobject exclusively; thestdio,streamable-http, and olderssetransports are all accepted- For stdio servers, the environment includes
PLUGIN_ROOT(the plugin root) andPLUGIN_DATA(a per-plugin data directory that persists, created by OpenClaw under its state dir); placeholders${PLUGIN_ROOT}and${PLUGIN_DATA}get expanded insideargs,envvalues, andcwdall in one pass - A stdio
commandhas to be either a bare executable name or a./-relative path located within the plugin;cwdmust not leavePLUGIN_ROOTorPLUGIN_DATA - When
mcp.jsonis invalid, MCP gets disabled for the plugin with a diagnostic, though skills still load; individual server entries that are invalid are simply skipped .mcp.json(prefixed with a dot) and inline manifestmcpServersare not read for this format; the closed schema from the standard takes precedence- OpenClaw reads
extensions["ai.openclaw"]; at present it supportsactivationwith the same behavior as other bundle manifests - Extension namespaces from other manifests are ignored and kept aside for their clients
- Client directories using reverse-domain names are ignored and kept aside
Codex bundles
Markers: .codex-plugin/plugin.json
Optional content: skills/, hooks/, .mcp.json, .app.json
Codex bundles work best with OpenClaw when they rely on skill roots and
hook-pack directories in the OpenClaw style (HOOK.md + handler.ts).
Claude bundles
Two detection modes:
- Manifest-based:
.claude-plugin/plugin.json - Manifestless: default Claude layout (
skills/,commands/,agents/,hooks/,.mcp.json,.lsp.json,settings.json)
Behavior specific to Claude:
commands/gets treated as skill contentsettings.jsongets imported into embedded OpenClaw settings (shell override keys are sanitized).mcp.jsonmakes supported stdio tools available to embedded OpenClaw.lsp.jsonpluslspServerspaths declared in the manifest load into the embedded OpenClaw LSP defaultshooks/hooks.jsonis detected but never executed- Custom component paths in the manifest add to the defaults; they extend rather than replace them
Cursor bundles
Markers: .cursor-plugin/plugin.json
Optional content: skills/, .cursor/commands/, .cursor/agents/, .cursor/rules/, .cursor/hooks.json, .mcp.json
.cursor/commands/counts as skill content.cursor/rules/,.cursor/agents/, and.cursor/hooks.jsonare only detected, not executed
Detection precedence
OpenClaw first attempts to identify a native plugin format:
- A
openclaw.plugin.jsonor a validpackage.jsoncontainingopenclaw.extensionsis recognized as a native plugin - Client-specific bundle markers (
.codex-plugin/,.cursor-plugin/,.claude-plugin/) mark the package as a bundle in that format - A root-level
plugin.jsonindicates an Agent Plugins bundle - The default manifestless Claude layout (
skills/,commands/,.mcp.json, ...) is treated as a Claude bundle
When a package includes both a client-specific marker and a root plugin.json,
the client-specific format takes precedence, preserving its richer mappings
for commands, hooks, and settings. If a directory has both a native manifest
and bundle markers, the native path is chosen. This prevents dual-format
packages from being partially installed as bundles.
Runtime dependencies and cleanup
- Third-party compatible bundles do not receive startup
npm installrepair. They should be installed viaopenclaw plugins installand include everything required in the installed plugin directory. - OpenClaw-owned bundled plugins are either shipped lightweight in core or fetched through the plugin installer. Gateway startup never invokes a package manager for them.
openclaw doctor --fixclears stale local bundled-plugin install records and can restore downloadable plugins missing from the local plugin index when config still points to them.
Security
Bundles operate within a tighter trust boundary than native plugins:
- OpenClaw does not load arbitrary bundle runtime modules in-process.
- Skills and hook-pack paths must remain within the plugin root (boundary-checked).
- Settings files are subject to the same boundary checks.
- Supported stdio MCP servers may be launched as subprocesses.
This makes bundles safer by default, but third-party bundles should still be treated as trusted content for the features they expose.
Troubleshooting
Bundle is detected but capabilities do not run
Execute openclaw plugins inspect <id>. If a capability appears but is flagged as
not wired, that indicates a product limit, not a broken install.
Claude command files do not appear
Confirm the bundle is enabled and the markdown files reside within a detected
commands/ or skills/ root.
Claude settings do not apply
Only embedded OpenClaw settings from settings.json are supported. OpenClaw does
not treat bundle settings as raw config patches.
Claude hooks do not execute
hooks/hooks.json is only detected, not executed. For runnable hooks, use the
OpenClaw hook-pack layout or ship a native plugin.
Related
- Install and Configure Plugins
- Building Plugins - create a native plugin
- Plugin Manifest - native manifest schema