.claude-plugin/plugin.json, который заменяет или добавляет к этой папке, и имя, которое видит пользователь. Для полной таблицы полей каждого ключа см. справочник манифеста.
Используйте эту страницу для добавления компонента в плагин, который уже загружается.
После добавления компонента запустите /reload-plugins в работающей сессии или начните новую, чтобы Claude Code загрузил его. Чтобы проверить файл компонента перед загрузкой, запустите claude plugin validate . в вашей оболочке из директории плагина.
Эти случаи рассматриваются на других страницах:
- Создание вашего первого плагина: начните с Create a plugin
- Установка плагина кого-то другого: см. Install plugins
- Ваши пользователи плагина находятся на claude.ai или в Cowork: там загружается другой набор компонентов. См. Plugins on claude.ai and in Cowork
Изучите каталог плагинов
Обозреватель показывает пример плагинаmy-plugin, который содержит по одному компоненту каждого вида в его расположении по умолчанию:
- Skill для проверки и команду
about - Subagent для проверки безопасности
- Hook, который форматирует файлы после редактирования Claude, и папку
scripts/, которую он вызывает - Монитор логов
- Стиль вывода и цветовую тему
- Workflow для аудита маршрутов
- Исполняемый файл
hello-plugin - Параметры по умолчанию
- Локальный MCP сервер и языковой сервер Go
Добавление каждого вида компонента
Каждый раздел ниже охватывает один вид компонента: где его файлы находятся в плагине, пример, который проходит валидацию, что видит пользователь после загрузки плагина, и ключ манифеста, который изменяет расположение по умолчанию. Добавляйте те, которые нужны вашему плагину; ни один не требуется.Skills
Skill — это файлSKILL.md, который Claude может загрузить, когда его описание совпадает с задачей. Пользователь также может запустить его как команду. Сохраняйте каждый skill в его собственной директории под skills/:
SKILL.md description, чтобы Claude знал, когда его использовать:
skills/review/SKILL.md
/my-plugin:review запускает skill. Имя команды и кто может её вызвать следуют этим правилам:
- Имя команды:
/<plugin>:<directory>, поэтомуskills/review/SKILL.mdвmy-plugin— это/my-plugin:review. Если вы установитеnameв frontmatter, он заменит последний сегмент, и префикс плагина остаётся. См. как skill получает имя команды - Кто вызывает: Claude, пользователь или оба, контролируется frontmatter. См. Control who invokes a skill
skills/:
- Дополнительные директории: перечислите их в ключе манифеста
skills. Они добавляются к сканированию по умолчаниюskills/, а не заменяют его, в отличие отcommandsиagents - Один skill в корне плагина: без директории
skills/и без ключа манифестаskills,SKILL.mdв корне плагина загружается как один skill. Установитеnameв его frontmatter, потому что иначе установка из marketplace назовёт skill по его директории кэша, а не по вашему плагину
CLAUDE.md в корне плагина, и claude plugin validate предупреждает CLAUDE.md at the plugin root is not loaded as project context.
Для полей frontmatter и вспомогательных файлов см. Skills.
Команды
Команда — это один файл Markdown, который пользователь запускает по имени, например/my-plugin:about.
Команды — это более старый формат, и skills их заменяют для новой работы. Skill запускается по имени таким же образом, и он также может содержать вспомогательные файлы в своей директории. Сохраняйте
commands/ для файлов, которые вы переносите из .claude/commands/.commands/<file>.md и она становится /<plugin>:<file>. Подпапка добавляет сегмент, поэтому commands/db/migrate.md — это /my-plugin:db:migrate.
Файлы команд принимают тот же frontmatter, что и skills.
Определение команд в манифесте
Это нужно только, если вы хотите сохранить файлы команд где-то в другом месте, чемcommands/, или определить короткую команду внутри plugin.json без отдельного файла Markdown. Установите ключ манифеста commands, и Claude Code читает его вместо сканирования commands/. Ключ принимает путь, массив путей или объект, который отображает каждое имя команды либо на файл source, либо на встроенное content.
Этот манифест определяет /my-plugin:about встроенным образом, без файла Markdown:
.claude-plugin/plugin.json
/my-plugin:about в сессии, чтобы подтвердить, что он загрузился.
Для полного синтаксиса ключа см. commands.
Агенты
Подагент — это отдельный помощник с собственными инструкциями и окном контекста, которому Claude может делегировать задачу. Каждый файл Markdown подagents/ определяет один:
agents/security-reviewer.md
my-plugin:security-reviewer, и пользователь может вызвать его явно с помощью @agent-my-plugin:security-reviewer. Форма имени — <plugin>:<name>, где <name> берётся из frontmatter или из имени файла, когда его нет.
Ключ agents манифеста заменяет сканирование agents/.
Организация агентов в подпапках
Вы можете поместить файлы агентов плагина в подпапкиagents/. Claude Code загружает их рекурсивно и объединяет имя плагина, каждое имя подпапки и имя файла с двоеточиями, чтобы сформировать имя агента с областью видимости. Например, agents/review/security.md в плагине с именем my-plugin загружается как my-plugin:review:security. Два параметра изменяют это имя:
- Frontmatter
name: он заменяет только имя файла, поэтомуname: auditвagents/review/security.mdзагружается какmy-plugin:review:audit - Манифест
agentsполе: файл, который вы там перечислите, загружается без имён подпапок, поэтому"agents": "./custom/review/security.md"загружается какmy-plugin:security
Поля frontmatter в агентах плагина
Frontmatter агента плагина следует этим правилам:- Поддерживаемые поля:
name,description,model,effort,maxTurns,tools,disallowedTools,skills,memory,background,omitClaudeMd,isolation,colorи ключcacheTtlизexperimental. Единственное допустимое значениеisolation— это"worktree". См. поддерживаемые поля frontmatter для того, что делает каждое - Игнорируемые поля:
permissionMode,hooks,mcpServersиinitialPrompt. Файл агента не может добавлять hooks или MCP серверы самостоятельно, поэтому добавляйте их как плагин hooks и MCP серверы вместо этого - Frontmatter, который не парсится: агент всё ещё загружается со всеми полями, игнорируемыми. Он назван по имени файла, и его описание читается как
Agent from my-plugin plugin. Запуститеclaude plugin validateв вашей оболочке, чтобы найти эти файлы
Hooks
Hook запускает что-то автоматически в точке жизненного цикла Claude Code, например, после каждого редактирования файла: команду оболочки, HTTP запрос, вызов инструмента MCP, prompt к модели или подагента. Сохраняйте hooks плагина вhooks/hooks.json в корне плагина, под верхним уровнем ключа "hooks", в той же форме, что и объект hooks в settings.json. Это позволяет вам скопировать существующий hook параметров без изменений.
Этот hook запускает встроенный скрипт после каждого Write или Edit:
hooks/hooks.json
scripts/format.sh и сделайте его исполняемым.
Загрузите плагин и попросите Claude отредактировать файл. Hook PostToolUse, который выходит с кодом 0, ничего не показывает в транскрипте, поэтому подтвердите, что он запустился с помощью debug logging или по тому, что сам скрипт изменяет.
Hooks в hooks/hooks.json и в ключе манифеста hooks оба загружаются. Для каждого события и его payload см. Hook events.
Когда запускаются hooks плагина
Hooks плагина не ждут использования одного из skills или команд плагина. Claude Code регистрирует их, когда сессия загружает плагин, и они запускаются на своих событиях с этого момента. Чтобы ограничить, когда запускается hook, сузьте егоmatcher.
Если hook никогда не запускается, см. hooks that don’t fire.
Окружение, кавычки и соответствие инструментам MCP
Окружение hook, кавычки${CLAUDE_PLUGIN_ROOT} и matchers для собственных инструментов MCP плагина работают следующим образом:
- Окружение: каждый процесс hook получает
CLAUDE_PLUGIN_ROOTиCLAUDE_PLUGIN_DATAв своём окружении, плюсCLAUDE_PLUGIN_OPTION_<KEY>для каждого значения конфигурации пользователя, поэтому ваш скрипт может читать их оттуда - Кавычки: когда
commandне имеетargs, он запускается через оболочку, поэтому оберните путь${CLAUDE_PLUGIN_ROOT}в двойные кавычки, как примерhooks/hooks.jsonпод Hooks делает, чтобы сохранить развёрнутый путь одним словом оболочки. Когда вы передаётеargsвместо этого, каждый элемент передаётся как один аргумент без оболочки и не нуждается в кавычках. См. exec form and shell form - Соответствие собственным инструментам MCP плагина: инструмент из MCP сервера, который объявляет этот плагин, назван
mcp__plugin_<plugin>_<server>__<tool>, поэтому напишите это полное имя в matcher. Matcher только на имя сервера никогда не запускается. См. Match MCP tools
MCP серверы
MCP сервер предоставляет Claude инструменты из внешней системы. Объявите его в.mcp.json в корне плагина, в той же форме, что и проект .mcp.json. Этот .mcp.json объявляет один сервер с именем db:
.mcp.json
mcpServers и поместить db на верхний уровень файла.
Загрузите плагин и запустите /mcp, чтобы подтвердить, что сервер появляется как plugin:my-plugin:db.
claude plugin validate проверяет .mcp.json и сообщает запись сервера, которую Claude Code отбросит во время загрузки, как ошибку. Требуется Claude Code v2.1.281 или позже.
Для того, где плохая запись появляется во время загрузки, см. MCP servers that don’t start.
Ключ манифеста mcpServers принимает встроенную карту сервера, путь к файлу JSON или массив этих. Когда сервер манифеста имеет то же имя, что и один в .mcp.json, сервер манифеста заменяет его.
Достижение пользователей на claude.ai и Cowork
Локальный сервер stdio, такой как серверdb под MCP servers, работает в Claude Code и в сессии Cowork, которая работает на вашей машине в приложении Claude Desktop, но не на claude.ai. Чтобы достичь пользователей там тоже, ссылайтесь на удалённый сервер по его URL https://, который claude.ai и Cowork предлагают пользователю как соединитель.
Имена серверов, имена инструментов и перезагрузки
Имена сервера, подстановка переменных и поведение перезагрузки следуют этим правилам:- Имя сервера:
plugin:<plugin>:<server>, поэтому серверdbвmy-plugin— этоplugin:my-plugin:dbв/mcp. Используйте ту же форму для именования сервера в hookmcp_tool - Имена инструментов:
mcp__plugin_<plugin>_<server>__<tool>, поэтому инструментqueryна том сервереdb— этоmcp__plugin_my-plugin_db__query. Это имя, которое нужно использовать в правилах разрешений и matchers hook - Подстановка:
${CLAUDE_PLUGIN_ROOT}и другие переменные пути подставляются вcommand,argsиenv. Кавычки не нужны вargs, потому что каждый элемент передаётся как один аргумент - Перезагрузка: когда пользователь запускает
/reload-pluginsи перезагрузка применяется, сервер, конфигурация которого не изменилась, сохраняет своё соединение. Сервер, конфигурация которого изменилась, переподключается, и тот, который вы удалили, отключается
Включение упакованного MCPB сервера
КлючmcpServers также принимает упакованный сервер как файл MCPB, расширение которого .mcpb или более старое .dxt. Укажите ключ на файл, как путь внутри плагина или URL https://:
.claude-plugin/plugin.json
name в манифесте пакета.
Для транспортов и аутентификации см. MCP.
LSP серверы
LSP сервер предоставляет Claude диагностику и навигацию по коду для языка. Если официальный плагин code intelligence уже охватывает ваш язык, установите его вместо написания собственного. Иначе объявите сервер в.lsp.json в корне плагина:
.lsp.json
command — это имя двоичного файла, с его аргументами в args. extensionToLanguage нуждается по крайней мере в одном расширении, каждое начинается с ..
claude plugin validate не читает этот файл. Когда любая запись недействительна, весь файл пропускается при загрузке и Invalid LSP server config for ".lsp.json" появляется на вкладке Errors в /plugin.
Ваш плагин конфигурирует соединение, но не устанавливает двоичный файл сервера, и каждое расширение файла получает один сервер:
- Отсутствующий двоичный файл: Claude Code запускает
commandпо имени изPATHпользователя. Когда двоичный файл там не находится, сервер не запускается иclaude --debugлогируетLSP server <name> failed to start - Конфликты расширений: когда два включённых сервера претендуют на одно и то же расширение, первый зарегистрированный обрабатывает эти файлы, а другой не используется для них, независимо от того, поступают ли серверы из одного плагина или двух. Вкладка Errors в
/pluginпоказывает предупреждениеLSP server "<name>" is not used for <ext> files
lspServers принимает ту же карту встроенной, путь к файлу JSON или массив этих, и его серверы добавляются к тем, что в .lsp.json. Когда сервер манифеста имеет то же имя, что и один в .lsp.json, сервер манифеста заменяет его.
Для transport, timeouts, restarts и других полей см. lspServers.
Отправляйте вывод логов в stderr, а не stdout. Claude Code читает stdout сервера только как сообщения протокола и принимает заголовки сообщений до 64 КиБ и тело сообщения до 32 МиБ.
Claude Code отключает сервер, который превышает любой лимит или пишет вывод, не являющийся протоколом, в stdout, и считает отключение сбоем для restartOnCrash и maxRestarts. Когда вы запускаете с --debug, Claude Code пишет ошибку, называющую причину, в журнал отладки.
Исполняемые файлы
Файлы вbin/ в корне плагина находятся на PATH оболочки инструмента Bash, пока плагин включен, поэтому Claude может запустить их как простые команды. Добавьте исполняемый скрипт:
bin/hello-plugin
chmod +x bin/hello-plugin и загрузите плагин. Когда вы просите Claude запустить hello-plugin, результат инструмента Bash показывает вывод скрипта.
Директории bin/ плагина идут после собственных записей PATH пользователя, поэтому плагин не может затенять git, ls или другую системную команду.
claude.ai и Cowork не устанавливают плагин, который имеет директорию bin/ верхнего уровня, включая тот, который вы распространяете через параметры организации claude.ai.
Параметры по умолчанию
Чтобы установить значения по умолчанию, которые применяются, пока плагин включен, добавьтеsettings.json в корень плагина или поместите тот же объект встроенным в ключ манифеста settings. Два ключа вступают в силу, agent и subagentStatusLine, и все остальные ключи отбрасываются.
Установите agent для запуска одного из собственных агентов плагина как основного потока:
settings.json
security-reviewer.
Для всего, что контролирует ключ, см. параметр agent.
Когда один и тот же ключ установлен в более чем одном месте, эти правила решают, какое значение применяется:
- Файл над манифестом: когда оба существуют и
settings.jsonустанавливает по крайней мере один поддерживаемый ключ,settings.jsonприменяется иsettingsманифеста игнорируется - Параметры пользователя над значениями по умолчанию плагина: во всех источниках параметров значения по умолчанию плагина — это самый низкий уровень, поэтому собственный
agentпользователя в~/.claude/settings.jsonпереопределяет ваш - Два плагина устанавливают один и тот же ключ: значение из плагина, загруженного последним, применяется, и
claude --debugлогируетoverrides setting
subagentStatusLine см. subagent status lines.
Темы и стили вывода
Плагин может включать цветовые темы и стили вывода. Оба появляются в тех же выборщиках, что и собственные пользователя. Для любого из них установка ключа манифеста заменяет сканирование папки.
Темы плагина доступны только для чтения, поэтому когда пользователь редактирует одну в
/theme, редактирование сохраняется как копия в их собственной директории тем.
Эта тема перекрашивает акцент prompt и текст ошибки на тёмном предустановке:
themes/dracula.json
Каналы
Канал позволяет внешней системе, такой как приложение чата, отправлять сообщения в сессию. В плагине канал — это один из MCP серверов плюс записьchannels, которая привязывает к нему и может запросить собственную конфигурацию. Этот манифест привязывает канал к серверу telegram и запрашивает токен бота:
.claude-plugin/plugin.json
server должен совпадать с ключом в mcpServers. Per-channel userConfig принимает ту же форму, что и верхний уровень ключа userConfig.
Для того, что должен реализовать сервер и как пользователи включают плагин канала, см. Package as a plugin в справочнике каналов. Для таблицы полей см. channels.
Мониторы
Монитор — это команда оболочки, которая работает в фоне для всей сессии. То, что она выводит, достигает Claude как уведомления, поэтому Claude может реагировать на журнал или изменение статуса без просьбы наблюдать за ним. Сохраняйте записи вmonitors/monitors.json:
monitors/monitors.json
- Только интерактивные сессии: мониторы плагина запускаются в интерактивной сессии и никогда в неинтерактивном режиме с флагом
-p. Они также запускаются только там, где доступен инструмент Monitor - Нет конфигурации пользователя:
commandполучает переменные пути и${ENV_VAR}из окружения, но никогда${user_config.*}. Монитор, который ссылается на один, не запускается, и процессы монитора также не получаютCLAUDE_PLUGIN_OPTION_<KEY> - Отключение во время сессии: если вы отключите плагин во время сессии, Claude Code не останавливает мониторы, которые уже работают. Они останавливаются, когда сессия заканчивается
experimental.monitors принимает тот же массив встроенным или путь к файлу JSON и читается вместо monitors/monitors.json.
Для триггера when и других полей см. monitors.
Запрос значений конфигурации у пользователя
Объявите значения, которые ваш плагин нужен от пользователя, в ключе манифестаuserConfig, чтобы пользователи не редактировали settings.json сами. Каждый вариант появляется в диалоге с его title как метка и его description под ней.
Установите "sensitive": true для токена или пароля. Диалог затем маскирует ввод, и значение хранится в защищённом хранилище, а не в settings.json.
Этот манифест запрашивает конечную точку и токен:
.claude-plugin/plugin.json
Когда появляется диалог конфигурации
Диалог появляется только в интерактивном интерфейсе/plugin. Он открывается для любого варианта, который ещё не установлен, когда пользователь делает любое из следующего:
- Устанавливает плагин в
/plugin - Запускает
/plugin install <plugin>@<marketplace>внутри сессии - Включает плагин из вкладки Installed в
/plugin
/plugin configure <plugin>@<marketplace>.
Команда оболочки claude plugin install никогда не запрашивает значения userConfig. Чтобы установить значения из оболочки, передайте каждое как --config KEY=VALUE. Когда варианты остаются неустановленными, команда выводит строку userConfig options not yet set, которая называет оба способа их установки. The userConfig dialog never appears цитирует строку.
Для полей варианта, где хранится каждое значение, как компонент ссылается на сохранённое значение и какие поля отклоняют ${user_config.*}, см. User configuration.
Ссылка на пути плагина и хранение данных
Вы не знаете, где будет установлен ваш плагин, поэтому ссылайтесь на его файлы и данные через эти переменные, а не через фиксированные пути. Они подставляются в содержимое skill, команды и агента, в команды hook и монитора, а также в конфигурации MCP и LSP сервера. Они также экспортируются в процессы hook, MCP и LSP:${CLAUDE_PLUGIN_ROOT}: директория установки плагина. Каждая версия имеет свою собственную директорию кэша, поэтому путь изменяется при обновлении плагина. Не пишите состояние там${CLAUDE_PLUGIN_DATA}: директория, которая выживает обновления, дляnode_modules, виртуальных окружений и кэшей. Она разрешается в~/.claude/plugins/data/<id>/и создаётся при первой ссылке${CLAUDE_PROJECT_DIR}: корень проекта, то же значение, которое получают hooks
<id> — это идентификатор плагина со всеми символами, кроме букв, цифр, _ и -, заменённых на -, поэтому my-plugin@my-marketplace становится my-plugin-my-marketplace.
На Windows подставленные пути используют прямые слэши, поэтому оболочка не читает обратные слэши как экранирование.
Установка зависимостей в директорию данных
Для плагина, установленного из marketplace, Claude Code автоматически устанавливает подходящие зависимости пакета Node.js при кэшировании плагина, поэтому вам может не потребоваться устанавливать их самостоятельно. Когда вам нужно, этот hookSessionStart устанавливает node_modules в ${CLAUDE_PLUGIN_DATA} при первом запуске и снова после обновления, которое изменяет package.json:
hooks/hooks.json
~/.claude/plugins/data/<id>/node_modules существует. MCP сервер может затем установить NODE_PATH в ${CLAUDE_PLUGIN_DATA}/node_modules в его env. Для того, какие поля подставляют какую переменную, см. Environment variables.
Следующие шаги
- Plugin manifest reference: поля
plugin.json, правила пути и стандартная раскладка - Test plugins with evals: проверьте, что компоненты, которые вы добавили, изменяют поведение Claude так, как вы намеревались
- Publish and distribute a plugin: версионируйте плагин и поместите его в marketplace
- Troubleshoot plugins: что делать, когда компонент не загружается или hook не запускается