Claude Code 2.1.238 позволяет маркетплейсу плагинов выпускать собственные заголовки аутентификации
Поле headersHelper у маркетплейсов типа url и у записей каталога запускает локальную команду, печатающую HTTP-заголовки, поэтому внутренний каталог плагинов за S3 или репозиторием артефактов может аутентифицироваться коротким токеном. Здесь схема, запрос согласия и имена заголовков, которые Claude Code отбрасывает.
Раздача внутренних плагинов Claude Code до сих пор требовала git-репозитория, к которому клиент уже умеет аутентифицироваться. Claude Code 2.1.238, опубликованный в npm 2026-08-20, снимает это ограничение: маркетплейс теперь может запустить локальную команду, печатающую HTTP-заголовки, и эти заголовки уходят вместе с запросом каталога и с загрузкой плагинов. Схему я проверил по сборке 2.1.239 для Windows (commit 9bf8e95, собрана 2026-08-21), где headersHelper впервые появляется в схемах маркетплейса и каталога. В 2.1.224 это поле существовало только в определениях MCP-серверов.
Одна команда, один JSON-объект заголовков
Поле располагается у маркетплейса с источником url, рядом со статической картой headers, которая была там и раньше:
{
"source": {
"source": "url",
"url": "https://artifacts.internal/claude/marketplace.json",
"headersHelper": "/usr/local/bin/mint-artifact-token"
}
}
Команда печатает JSON-объект, её вывод имеет приоритет над headers, и она перезапускается при каждом обновлении этого маркетплейса. Две детали дают о себе знать на практике. Команда выполняется из фиксированного каталога, конфигурационного каталога Claude, а не рабочего каталога сессии, поэтому указывайте команду, разрешимую через PATH, либо абсолютный путь. И её заголовки наследуются загрузками архивов того же источника, что и делает механизм полезным вместе с источником плагина archive: обычный zip по HTTPS на S3, GitLab или nginx, без git и npm на клиенте. Дополните это полем sha256 у записи: оно проверяется при каждой загрузке, и при расхождении установка отклоняется.
Помощники на уровне записи обязаны встроить манифест
Запись каталога может нести собственный headersHelper, который имеет приоритет над маркетплейсным. Он запускается только когда пользователь явно устанавливает или обновляет плагин, и никогда при просмотре каталога, а вместе с ним приходит правило, о которое вы споткнётесь сразу же, если его пропустить:
Plugin "internal-tools" sets headersHelper but is not "strict": false. An entry
with headersHelper must inline its full manifest (strict: false, with
commands/agents/hooks/mcpServers declared in the entry) so users can review what
it ships before the command runs
Согласие должно быть осознанным на основании одной лишь записи, до того как выполнится любая команда. При установке вы видите адрес назначения и саму команду дословно: “runs a local command and sends its output as headers to:”, затем URL и командную строку. claude plugin install -y принимает показанную команду без запроса и обязателен, когда stdin не является TTY.
Заголовки, которые подделать не дадут
Не всякое имя заголовка доживает до запроса. Всё, что объявлено вне управляемых оператором настроек, фильтруется по списку блокировки: host, cookie, forwarded, connection, transfer-encoding, content-length, via, семейство клиентских IP (x-real-ip, true-client-ip, cf-connecting-ip и родственные), а также префиксы x-forwarded-, x-original- и proxy-. Имена предварительно приводятся к нижнему регистру, а подчёркивания нормализуются в дефисы, так что X_Real_IP не проскочит. Отброшенный заголовок пишет предупреждение, а не роняет загрузку.
Администраторы выключают весь механизм через disableCommandPluginSources или allowManagedHooksOnly в управляемых настройках: тогда установка отклоняется, а команда не выполняется вовсе. Это то же направление, что и загрузка плагинов из .zip-архивов в 2.1.128: меньше предположений о том, куда ваш клиент вообще дотянется. Запись о выпуске есть в changelog, а документация по маркетплейсам пока не догнала.
Comments
Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.