Система плагинов OpenClaw позволяет расширять функциональность: добавлять каналы, провайдеры моделей, инструменты, голос и многое другое. Плагины — это npm-пакеты, которые не нужно добавлять в репозиторий OpenClaw. Публикуйте в ClawHub или npm, пользователи устанавливают одной командой.
Что можно сделать с плагином
| Возможность | Метод регистрации | Примеры |
|---|---|---|
| Текстовый LLM | api.registerProvider(...) |
openai, anthropic |
| CLI inference backend | api.registerCliBackend(...) |
openai, anthropic |
| Канал/мессенджинг | api.registerChannel(...) |
msteams, matrix |
| Голос (TTS/STT) | api.registerSpeechProvider(...) |
elevenlabs, microsoft |
| Realtime транскрипция | api.registerRealtimeTranscriptionProvider(...) |
openai |
| Realtime голос | api.registerRealtimeVoiceProvider(...) |
openai |
| Медиа-понимание | api.registerMediaUnderstandingProvider(...) |
openai, google |
| Генерация изображений | api.registerImageGenerationProvider(...) |
openai, google, fal |
| Генерация видео | api.registerVideoGenerationProvider(...) |
qwen |
| Web fetch | api.registerWebFetchProvider(...) |
firecrawl |
| Web search | api.registerWebSearchProvider(...) |
|
| Инструменты агента | api.registerTool(...) |
любые |
| Кастомные команды | api.registerCommand(...) |
любые |
| HTTP routes | api.registerHttpRoute(...) |
любые |
| CLI подкоманды | api.registerCli(...) |
любые |
| Plugin hooks | api.on(...) |
любые |
Быстрый старт: создание tool-плагина
1. package.json + манифест
{
"name": "@myorg/openclaw-my-plugin",
"version": "1.0.0",
"type": "module",
"openclaw": {
"extensions": ["./index.ts"],
"compat": {
"pluginApi": ">=2026.3.24-beta.2",
"minGatewayVersion": "2026.3.24-beta.2"
}
}
}
{
"id": "my-plugin",
"name": "My Plugin",
"description": "Adds a custom tool to OpenClaw",
"configSchema": {
"type": "object",
"additionalProperties": false
}
}
Манифест нужен всегда, даже без конфига.
2. Точка входа (index.ts)
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
import { Type } from "@sinclair/typebox";
export default definePluginEntry({
id: "my-plugin",
name: "My Plugin",
description: "Adds a custom tool to OpenClaw",
register(api) {
api.registerTool({
name: "my_tool",
description: "Do a thing",
parameters: Type.Object({ input: Type.String() }),
async execute(_id, params) {
return { content: [{ type: "text", text: `Got: ${params.input}` }] };
},
});
},
});
Для каналов — defineChannelPluginEntry. Для провайдеров — defineSingleProviderPluginEntry.
3. Тестирование и публикация
# Тест (dry-run)
clawhub package publish your-org/your-plugin --dry-run
# Публикация
clawhub package publish your-org/your-plugin
# Установка
openclaw plugins install clawhub:@myorg/openclaw-my-plugin
OpenClaw проверяет ClawHub перед npm. Bare package specs тоже работают.
Обязательные и опциональные инструменты
register(api) {
// Обязательный — всегда доступен
api.registerTool({
name: "my_tool",
description: "Always available",
parameters: Type.Object({ input: Type.String() }),
async execute(_id, params) {
return { content: [{ type: "text", text: params.input }] };
},
});
// Опциональный — пользователь должен включить в allowlist
api.registerTool(
{
name: "workflow_tool",
description: "Run a workflow",
parameters: Type.Object({ pipeline: Type.String() }),
async execute(_id, params) {
return { content: [{ type: "text", text: params.pipeline }] };
},
},
{ optional: true },
);
}
Пользователи включают опциональные инструменты:
{
"tools": { "allow": ["workflow_tool"] }
}
Все инструменты плагина сразу: "tools": { "allow": ["my-plugin"] }.
Импорты
Всегда импортируйте из конкретных подпутей:
// ✅ Правильно
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
// ❌ Неправильно (deprecated)
import { ... } from "openclaw/plugin-sdk";
Внутри плагина — локальные barrel-файлы (api.ts, runtime-api.ts). Не импортируйте свой плагин через SDK-путь.
Plugin hooks
Хуки позволяют перехватывать события:
| Хук | Что делает | Блокировка |
|---|---|---|
before_tool_call |
Перед вызовом инструмента | { block: true } — стоп, { requireApproval: true } — запрос одобрения |
before_install |
Перед установкой плагина | { block: true } — стоп |
message_sending |
Перед отправкой сообщения | { cancel: true } — отмена |
message_received |
При получении сообщения | — |
/approve обрабатывает exec и plugin approvals. Если exec approval id не найден — retry через plugin approvals.
Архитектура
Плагиновая система имеет 4 слоя:
Plugin shapes
| Shape | Что регистрирует |
|---|---|
plain-capability |
Ровно одну capability (например, mistral — только provider) |
hybrid-capability |
Несколько capabilities (например, openai — text + speech + images) |
hook-only |
Только хуки, без capabilities |
non-capability |
Tools, commands, services, но не capabilities |
Проверить: openclaw plugins inspect
Каналы и shared message tool
Каналам не нужно регистрировать отдельный send/edit/react tool. OpenClaw держит один общий message tool в core, а каналы владеют channel-specific discovery и execution.
Установка плагинов
openclaw plugins install
openclaw plugins list
openclaw plugins inspect
openclaw plugins doctor
OpenClaw проверяет ClawHub, потом npm. Если установка падает с package.json missing openclaw.extensions — плагин использует старый формат. Нужно добавить openclaw.extensions в package.json и указать на built файлы.
Чеклист перед публикацией
package.json содержит правильные openclaw metadataopenclaw.plugin.json манифест валидныйdefinePluginEntry или defineChannelPluginEntryplugin-sdk/📦 Бандлы плагинов (подробно)
OpenClaw может устанавливать плагины из трёх внешних экосистем: Codex, Claude и Cursor. Это так называемые бандлы — пакеты контента и метаданных, которые OpenClaw маппит в нативные фичи: навыки, хуки и MCP-инструменты.
Зачем существуют бандлы
Многие полезные плагины публикуются в формате Codex, Claude или Cursor. Вместо того чтобы требовать от авторов переписывать их как нативные — OpenClaw обнаруживает эти форматы и маппит поддерживаемый контент в нативный набор фич. Вы можете установить пакет команд Claude или бандл навыков Codex и использовать его сразу.
Установка бандла
Шаг 1. Установите из директории, архива или marketplace.
# Локальная директория
openclaw plugins install ./my-bundle
# Архив
openclaw plugins install ./my-bundle.tgz
# Claude marketplace
openclaw plugins marketplace list <marketplace-name>
openclaw plugins install <plugin-name>@<marketplace-name>
Шаг 2. Проверьте обнаружение.
openclaw plugins list
openclaw plugins inspect <id>
Бандлы показываются как Format: bundle с подтипом codex, claude или cursor.
Шаг 3. Перезапустите и используйте.
openclaw gateway restart
Маппированные фичи (навыки, хуки, MCP-инструменты, LSP-настройки) доступны в следующей сессии.
Что OpenClaw маппит из бандлов
Поддерживается сейчас
| Фича | Как маппится | Форматы |
|---|---|---|
| Навыки | Корни навыков бандла загружаются как обычные навыки OpenClaw | Все |
| Команды | commands/ и .cursor/commands/ — как корни навыков |
Claude, Cursor |
| Hook packs | OpenClaw-style HOOK.md + handler.ts |
Codex |
| MCP tools | MCP-конфиг бандла мержится в embedded Pi; stdio и HTTP серверы загружаются | Все |
| LSP servers | .lsp.json и lspServers из манифеста мержятся в LSP defaults |
Claude |
| Settings | settings.json импортируется как defaults для embedded Pi |
Claude |
Навыки
- Корни навыков бандла загружаются как обычные корни навыков OpenClaw
- Claude
commands— дополнительные корни навыков - Cursor
.cursor/commands— дополнительные корни навыков
Hook packs
Работают только при использовании стандартного layout hook-pack OpenClaw. Сегодня это в основном Codex-совместимый случай: HOOK.md + handler.ts или handler.js.
MCP для Pi
- Включённые бандлы могут предоставлять MCP-конфиг
- OpenClaw мержит MCP-конфиг бандла в effective embedded Pi settings как
mcpServers - Поддерживаемые stdio и HTTP серверы запускаются автоматически
- Локальные настройки Pi перекрывают defaults бандла
- Каталоги MCP-инструментов сортируются детерминированно для стабильности кеша
Транспорты:
- Stdio — запускает дочерний процесс (command + args + env)
- HTTP — подключается к MCP-серверу через
sse(по умолчанию) илиstreamable-http
transport:"streamable-http"или"sse"(по умолчанию)- URL только
http:иhttps: headersподдерживают интерполяцию${ENV_VAR}- Запись с
commandиurlодновременно отклоняется - URL-креды редактируются из описаний инструментов и логов
connectionTimeoutMsпереопределяет 30-секундный таймаут
Именование инструментов:
MCP-инструменты бандла регистрируются в формате serverName__toolName. Например, сервер "vigil-harbor" с инструментом memory_search → vigil-harbor__memory_search.
- Символы вне
A-Za-z0-9_-заменяются на- - Префиксы серверов — до 30 символов
- Полные имена — до 64 символов
- Коллизии санитизированных имён разрешаются числовыми суффиксами
Embedded Pi Settings
Claude settings.json импортируется как defaults для embedded Pi. Ключи переопределения shell санитизируются: shellPath, shellCommandPrefix.
Embedded Pi LSP
Включённые Claude-бандлы могут предоставлять LSP-конфиг. OpenClaw загружает .lsp.json и lspServers из манифеста.
Обнаружено, но не выполняется
Эти фичи распознаются и показываются в диагностике, но OpenClaw их не запускает:
- Claude
agents,hooks.jsonautomation,outputStyles - Cursor
.cursor/agents,.cursor/hooks.json,.cursor/rules - Codex inline/app metadata за пределами capability reporting
Форматы бандлов
Codex-бандлы
Маркеры: .codex-plugin/plugin.json
Опциональный контент: skills/, hooks/, .mcp.json, .app.json
Лучше всего работают с корнями навыков и OpenClaw-style hook-pack директориями (HOOK.md + handler.ts).
Claude-бандлы
Два режима обнаружения:
- На манифесте:
.claude-plugin/plugin.json - Без манифеста: стандартный layout Claude (
skills/,commands/,agents/,hooks/,.mcp.json,.lsp.json,settings.json)
Особенности: commands/ — как навыки; settings.json — в embedded Pi; .mcp.json — stdio tools для Pi; hooks/hooks.json — только обнаружение.
Cursor-бандлы
Маркеры: .cursor-plugin/plugin.json
Опциональный контент: skills/, .cursor/commands/, .cursor/agents/, .cursor/rules/, .cursor/hooks.json, .mcp.json
.cursor/commands/ — как навыки. Остальное — только обнаружение.
Приоритет обнаружения
OpenClaw сначала проверяет нативный формат плагина:
openclaw.plugin.jsonили валидныйpackage.jsonсopenclaw.extensions— нативный плагин- Маркеры бандлов (
.codex-plugin/,.claude-plugin/или стандартный layout) — бандл
Если директория содержит оба формата — используется нативный путь.
Безопасность
Бандлы имеют более узкую границу доверия, чем нативные плагины:
- OpenClaw не загружает произвольные runtime-модули бандлов in-process
- Пути навыков и hook-pack должны быть внутри корня плагина (boundary-checked)
- Файлы настроек читаются с теми же проверками границ
- Поддерживаемые stdio MCP-серверы могут запускаться как подпроцессы
Отладка
Бандл обнаружен, но фичи не работают
Запустите openclaw plugins inspect <id>. Если фича перечислена, но помечена как not wired — это ограничение продукта, а не сломанная установка.
Claude command-файлы не появляются
Убедитесь, что бандл включён и markdown-файлы находятся внутри обнаруженного commands/ или skills/ корня.
Claude settings не применяются
Поддерживаются только embedded Pi settings из settings.json. OpenClaw не treats bundle settings как raw config patches.
Claude hooks не выполняются
hooks/hooks.json — только обнаружение. Для запускаемых хуков используйте OpenClaw hook-pack layout или нативный плагин.