REPO SPOTLIGHT

Внутри finestructure-ai/claude-plugin: плагин Claude Code из семи файлов

Репозиторий finestructure-ai/claude-plugin упаковывает платформу приложений Fine Structure в плагин Claude Code и даёт вам /deploy, /fs-status и /fs-domain плюс размещённый коннектор MCP, который и делает всю работу. Читать его стоит не столько ради того, что он разворачивает, сколько ради того, что он показывает о формате плагинов: всё целиком это markdown и JSON, меньше четырнадцати килобайт, без шага сборки и без скомпилированного вывода.

THE REPOSITORY

finestructure-ai/claude-plugin

Open finestructure-ai/claude-plugin

Весь репозиторий это семь файлов

Склонируйте его, и дерево файлов уместится на одном экране:

.claude-plugin/
  plugin.json        686 B
  marketplace.json   507 B
commands/
  deploy.md          3.3 KB
  fs-domain.md       905 B
  fs-status.md       741 B
skills/
  fine-structure/
    SKILL.md         4.0 KB
LICENSE              MIT
README.md            2.3 KB

Ни package.json, ни файла блокировок, ни CI, ни dist. Ничего не компилируется и не собирается в бандл, и не существует такой версии этого репозитория, сборка которой могла бы упасть. Если вы откладывали написание плагина, потому что предполагали наличие тулчейна, вот поправка: формат это соглашение о структуре каталогов плюс два файла JSON, а всё остальное проза.

Файл plugin.json это указатель, а не программа

Манифест несёт обычные поля идентификации (name, версия 0.1.0, description, author, homepage, repository, license, keywords), а затем один блок, который и делает всю интересную работу:

"mcpServers": {
  "finestructure": {
    "type": "http",
    "url": "https://finestructure.ai/api/mcp"
  }
}

Два ключа. Ни command, ни args, ни env. Сравните это с формой, которую принимает большинство конфигураций MCP: локальный процесс (npx, uvx, путь к бинарнику), список аргументов и карта env с ключом API. Объявление конечной точки streamable HTTP вместо этого выносит сервер за пределы машины пользователя, и именно поэтому 105 инструментов (число, которое приводит файл skill) стоят за манифестом в 686 байт. Ничто в версии Node или Python у пользователя не способно сломать установку, а изменения на стороне сервера доезжают без выпуска новой версии плагина. Плата за это воспроизводимость: зафиксировать набор инструментов со стороны клиента вы не сможете.

Файл marketplace.json превращает репозиторий в собственный канал распространения

Claude Code ставит плагины из маркетплейсов, а не из реестра пакетов, а маркетплейс это файл JSON, который перечисляет плагины с указанием пути к источнику. Второй файл в каталоге .claude-plugin делает именно это, и в его единственной записи плагина стоит "source": "./". Репозиторий одновременно и сам плагин, и раздающий его маркетплейс, так что публикация сводится к публичному git push:

/plugin marketplace add finestructure-ai/claude-plugin
/plugin install finestructure@finestructure

Два одинаковых токена во второй строке это имя плагина при имени маркетплейса, и совпали они потому, что оба называются finestructure. Если копируете такую схему, назовите их по-разному. Инструкция по установке станет понятнее, и у вас останется место, чтобы позже добавить второй плагин.

Команды это шаблоны промптов с frontmatter

Каждый файл в commands/ это frontmatter в формате YAML плюс проза. Файл deploy.md объявляет description и argument-hint, две строки, которые пользователь видит в списке выбора, а затем раскладывает нумерованное дерево решений: проверить корень проекта на наличие .finestructure.json с app_id, иначе вызвать list_apps и поискать совпадение по имени, иначе считать это первым развёртыванием и взять $ARGUMENTS как имя приложения. Файл fs-status.md весит 741 байт и делает работу подкоманды CLI: определить приложение, вызвать get_app_status, get_app_links и get_errors, подвести итог. Файл fs-domain.md по порядку проходит add_custom_domain, get_domain_verification, check_domain_verification, get_domain_ssl_status и set_primary_domain.

Суть замысла в том, что ни один из этих файлов ничего не вызывает. Они называют инструменты, задают порядок и описывают, что делать, когда шаг не удался. Исполнение происходит тогда, когда модель вызывает инструменты MCP. Слэш-команда это промпт, положенный в систему контроля версий, поэтому её ревью сводится к вопросу не о том, верна ли логика, а о том, не двусмысленна ли инструкция.

Лучшие строки здесь запрещающие. Файл deploy.md запрещает инструменты удаления, если пользователь не попросил об этом явно. Файл fs-domain.md отмечает, что распространение DNS занимает от минут до часов, и велит предложить повторить попытку позже, а не крутиться в цикле проверки. Это политика повторных попыток и защитные ограждения, записанные обычными предложениями, и именно этого не хватает наивным плагинам.

skill против command: вытягивание против проталкивания

В файле skills/fine-structure/SKILL.md два поля frontmatter, name и description, причём description читается как условие срабатывания, а не как краткое изложение: использовать всякий раз, когда пользователь хочет развернуть, создать или обновить приложение, подключить домен, поработать с данными или секретами. Такая формулировка выбрана намеренно. Команда срабатывает потому, что человек её набрал. Skill срабатывает потому, что модель сопоставила описание с происходящим.

Отсюда следует и разделение содержимого. Файл SKILL.md это ментальная модель, а не список задач: что здесь считается приложением (страницы JSX, общие компоненты, схемы сущностей, никакого произвольного серверного кода), что такое сущности, какие операции тратят кредиты. Дальше рабочие процессы в виде цепочек инструментов: get_app_files, затем read_app_file, затем write_app_file, затем validate_app, затем publish_app, с наборами изменений для правок в нескольких файлах. Дальше семантика ошибок, у которой самый большой вес на байт: ошибки авторизации означают переподключение, ошибки кредитов означают пополнение, и повторять бессмысленно ни те, ни другие. Агент без этого знания будет в цикле повторять непоправимый сбой, а на платформе со счётчиком у такого цикла есть цена.

Правило для вашего собственного плагина выводится отсюда чисто. Если файл команды объясняет, что такое ваш продукт, этому абзацу место в skill. Команды остаются процедурами.

OAuth это причина, по которой в манифесте нет секретов

Конечная точка аутентифицируется по OAuth 2.1 с динамической регистрацией клиента, поэтому первый же вызов инструмента открывает в браузере страницу согласия, а токен оседает в хранилище учётных данных Claude Code, а не в репозитории. Форк безопасен по построению, отзыв доступа выполняется на стороне сервера, а не правкой конфигурации, которая должна дойти до каждой машины, и никого не просят вставить долгоживущий ключ в файл, до публичного diff которому остаётся один неосторожный коммит.

Что скопировать в свой плагин

Конкретные ориентиры, примерно в порядке сборки:

  • Начните с .claude-plugin/plugin.json, где есть name, version и description. Всё остальное необязательно.
  • Если у вас есть размещённая конечная точка MCP, объявляйте "type": "http" с url вместо локальной команды. Это убирает среду выполнения пользователя из зоны вашей поддержки.
  • Пока плагин один, кладите marketplace.json в тот же репозиторий с "source": "./" и дайте ему имя, отличное от имени плагина.
  • Дайте каждой команде description и argument-hint во frontmatter, написанные как ответы на вопросы, что она делает и что набирать после неё.
  • Используйте $ARGUMENTS вместо изобретения позиционного синтаксиса. Парсера здесь нет, есть только подстановка.
  • Пишите тело команды как дерево решений с явно названными инструментами. Фраза "если файл конфигурации есть, прочитай app_id, иначе вызови list_apps" держится лучше, чем абзац о намерениях.
  • Запишите семантику отказов: какие ошибки окончательные, какие можно повторить, что сказать вместо повтора.
  • Назовите свои разрушительные инструменты прямо в тексте и запретите их, пока о них не попросили.
  • Держите модель предметной области в SKILL.md, а процедуру в команде. Дублирование между ними дурной знак.
  • Проверьте через /plugin marketplace add на локальном пути или на своём форке, прежде чем отправлять кого-то на main.

Шероховатости

Три честных, и ни одна не смертельна. Всё написано по-английски, и формат не предлагает никакой зацепки, чтобы это исправить: ключа locale во frontmatter нет, так что локализация означает либо дублирование файлов команд, либо согласие на несоответствие.

У истории про отсутствие ключей API есть звёздочка. Файл SKILL.md признаёт, что инструменты генерации медиа находятся вне соединения OAuth и требуют статического токена MCP с медийными правами, который создаётся в Studio платформы и отправляется заголовком bearer. Плагин справляется с этим хорошо, велит модели объяснить нехватку, а не биться в стену повторами, но это второй путь аутентификации, прикрученный к дизайну, чьё главное достоинство в том, что путь всего один.

И это версия 0.1.0 без changelog, тестов и CI. Для markdown такое простительно, хотя проверка схемы JSON в pre-commit hook ловила бы единственный класс ошибок, который действительно ломает установку, то есть испорченный манифест. Заявка в каталог на момент написания находится на рассмотрении, так что пока установка идёт по ссылке на репозиторий.

Читайте сначала три файла команд, потом SKILL.md, потом два файла JSON. В таком порядке формат объясняет сам себя: markdown решает, что должно произойти и в каком порядке, сервер MCP решает, что выполняется на самом деле, а манифест это тонкий шов между ними.

QUESTIONS

Asked about this repository

какая минимальная структура файлов нужна плагину Claude Code?
Один файл: .claude-plugin/plugin.json с полями name, version и description. Команды, skills, агенты и hooks это необязательные слои поверх него. Репозиторий finestructure-ai/claude-plugin удобен как ориентир по размеру, потому что использует несколько таких слоёв и всё равно укладывается в семь файлов и меньше четырнадцати килобайт, без шага сборки.
как работают слэш-команды в плагине Claude Code?
Слэш-команда это файл markdown в каталоге commands/, и имя файла становится именем команды. Frontmatter задаёт description и argument-hint для списка выбора, а тело это промпт, который модель получает при запуске команды, где $ARGUMENTS подставляется вместо всего, что шло после неё. Сам файл ничего не выполняет, поэтому реальная работа должна приходить из инструментов, доступных модели, и именно поэтому здесь команды идут в паре с сервером MCP.
нужен ли ключ API, чтобы использовать сервер MCP в плагине Claude Code?
Не нужен, если сервер говорит на OAuth. Этот манифест объявляет только "type": "http" и url, а конечная точка использует OAuth 2.1 с динамической регистрацией клиента, поэтому авторизация проходит в браузере, а токен остаётся в хранилище учётных данных Claude Code. Альтернатива, блок env с ключом, работает, но кладёт долгоживущий секрет в файл, который пользователи копируют туда и обратно. Одна оговорка видна и здесь: инструменты медиа находятся вне этого потока и всё ещё требуют статического токена.
как превратить репозиторий GitHub в маркетплейс плагинов Claude Code?
Добавьте .claude-plugin/marketplace.json с полями name, owner и массивом plugins. Если он раздаёт плагин из того же репозитория, укажите у этого плагина source равным "./", именно так и сделано здесь. Дальше пользователи выполняют /plugin marketplace add owner/repo, а затем /plugin install plugin-name@marketplace-name. Между git push и устанавливаемым плагином нет ни реестра, ни шага публикации.

THE PLATFORM

The platform behind the endpoint

Fine Structure обслуживает размещённый MCP-сервер, к которому обращается этот плагин. В том же аккаунте находятся само приложение, его база данных, вход для пользователей, собственные домены и ИИ-агенты, отвечающие в WhatsApp, веб-чате и по электронной почте, а бесплатный тариф не требует банковской карты.

finestructure.ai