Туториал

AI Agent Skills vs MCP vs Plugins: что выбирать разработчику в 2026? От обнаружения до JSON Schema

Не спрашивайте, что выбрать. Спросите, везёте ли вы бриф, руку или ящик, который должен ехать вместе.

Вчера Google Agent Plugins 2026 показал форму ящика. Сегодня — вопрос ревью, который задают не так: «Skills, MCP или Plugins — что берём?» Неверно: это не три продукта. Скилл — бриф, который читает модель; формат: Agent Skills. MCP — рука рантайма; протокол: Что такое MCP. Плагин — пакетный формат августа 2026; спека: Agent Plugins 1.0.0. Google написал открыто: один скилл, один MCP-сервер или один клиент — не повод паковать. Статья ведёт обнаружение и JSON Schema до решения и передаёт в MCP и JSON Schema. Облачный образец по-прежнему google-cloud-developer.

Неверный вопрос: они не соперники на одном слое

Обычный провал ревью — три карточки на столе и один голос. Скилл не отдаёт tools/list и не принимает tools/call. Это каталог плюс SKILL.md: при старте в контекст входят только name и description (около ста токенов); тело и scripts/, references/ грузятся по требованию. Нет JSON-RPC, нет handshake, нет «схемы входа скилла» на проводе. MCP наоборот: процесс или HTTP-эндпоинт, аргументы, которые должны валидироваться как JSON. Плагин не делает ни того ни другого. Он фиксирует каталог и два закрытых манифеста. Считать плагин «более сильным MCP» — принимать коробку за двигатель.

Обнаружение тоже не один путь. Скилл находят по строке описания: напишите «что делает + когда применять», иначе модель его не выберет. MCP находят через tools/list — имена плюс inputSchema. Плагин — по корневому plugin.json, затем фиксированные skills/ и mcp.json. Три слоя можно сложить: клиент видит ящик, затем метаданные скилла, затем список инструментов MCP. Сложение не замена. Нет руки, а вы пишете более длинный скилл — вы ставите, что модель сымитирует API через shell. Это галлюцинация, не интеграция.

Боковое делегирование не на этих трёх карточках. Как находят другого агента и дают ему Task — A2A Agent Card; см. A2A vs MCP. Сегодня решаете только: нужен ли репозиторию бриф, рука, и надо ли запереть их в один переносимый каталог. Сначала слои, потом выбор.

Что выбираете Что решает Поверхность обнаружения
SkillПовторный поток, формат, ограждения; опционально локальные скриптыname / description в SKILL.md
MCP-серверДетерминированные вызовы в живые системы (БД, API, облако)tools/list + inputSchema
PluginНе дать скиллу и MCP разъехаться при смене клиентаplugin.json, затем фиксированные каталоги

Четыре вопроса ведут дерево решений

Сверните выбор в четыре вопроса. Отвечайте по порядку, не прыгайте. Первый: должна ли модель трогать живую систему вне репозитория — базу, поиск официальных доков, billing API, gcloud? Да — нужен хотя бы MCP (или уже существующий нативный инструмент вроде локального gh). Нет — не поднимайте пустой сервер «для солидности». Второй: нужно ли зафиксировать поток вроде «сначала проект, потом биллинг, ключи в git не коммитить» и держать его между сессиями? Да — пишите скилл. Вставленный системный промпт пропадает, когда окно сжимается.

Третий: ответы на первый и второй должны ехать вместе? MCP счетов без скилла недельной сводки будут злоупотреблять; скилл без MCP демо только на фейковых данных. Только тогда думайте о плагине. Четвёртый: отдаёте ли это больше чем одному клиенту — Cursor, Claude Code, Antigravity, Codex? Одна IDE с нативной установкой MCP / Skills короче как нативный конфиг. Google забил это в Developers Blog: плагин окупается, когда части делят цель и должны путешествовать вместе.

Ниже запись решения, которую можно коммитить. Это не поле спеки. Это JSON-фикстура с ревью: четыре ответа, выбор и имена компонентов, которые собираетесь паковать. Пусть парсится, затем в CI утверждайте, что choice не спорит с четырьмя флагами — mustTravelTogether false и choice plugin значит упаковали рано.

{
  "task": "weekly-invoice-summary",
  "needRuntimeTools": true,
  "needReusableBrief": true,
  "mustTravelTogether": true,
  "clients": ["cursor", "claude-code", "antigravity"],
  "choice": "plugin",
  "components": [
    "skill:write-weekly-summary",
    "mcp:invoice-tools"
  ]
}

Только Skill: обнаружение — description, tools/call нет

Скилл выигрывает в трёх вещах: нет handshake, загрузка по требованию, люди могут делать diff. При старте клиент вставляет только метаданные; модель читает тело, когда сработало описание. Значит описание должно говорить и что, и когда, от третьего лица, с ключевыми словами, с лимитами (name 64, description 1024). Внутренний коднейм или слоган от первого лица — нулевая поверхность обнаружения. Формат принадлежит Agent Skills; Plugins лишь говорит, что он живёт в skills/<name>/SKILL.md.

Скилл может везти scripts/. Это не новые MCP-инструменты. Это значит «запусти это уже имеющимся shell». Подходит локальным CLI: gh, gcloud, ваш lint.sh. Скрипт держит детерминированную работу вне промпта и возвращает краткое. Транспорта всё равно нет: нет OAuth-обнаружения, нет inputSchema; argv проверяет скрипт. Нужны стабильные JSON-аргументы или удалённая авторизация — не притворяйтесь, что скрипт это MCP.

Только скилл подходит под форматы выхода (тело PR, отчёт об инциденте), локальные CLI-потоки и доменные ограждения («сначала прочитай этот checklist»). Антипример: скилл «спросить прод» который просит модель выдумать SQL и прогнать через общий shell. Бриф прикидывается рукой. На этапе обнаружения форму аргументов тоже не проверить — схемы нет.

Только MCP: обнаружение — tools/list, контракт — inputSchema

MCP выигрывает в трёх вещах, которых скилл не даёт: живое соединение, структурированный вход, граница отказа. Клиент коннектится, tools/list отдаёт имена и inputSchema, модель заполняет arguments, рантайм зовёт tools/call. Проходят ли arguments — дело JSON Schema, не «модель звучала уверенно». Auth, квоты, версии транспорта остаются на спеке MCP; безсостоятельная редакция 2026-07-28 может сидеть за обычным HTTP-балансировщиком. Скилл не делает ни один из этих слоёв.

Один клиент, один сервер: лучше нативный MCP-конфиг этого клиента, не плагин сначала. mcp.json — переносимая форма Agent Plugins; поля не обязаны совпадать с Cursor или Gemini CLI. Клиент мапит. Одна IDE делает слой маппинга лишним. Появился второй клиент — сверните то же соединение в корневой mcp.json и добавьте plugin.json, даже без skills/. Отсутствующий каталог skills — не ошибка; спека говорит пропускать отсутствующее место.

Цепочка обнаружения короткая: коннект → tools/list → заполнить из inputSchema. Не кидайте целый OpenAPI MCP-клиенту как список инструментов и не копируйте поля манифеста плагина в inputSchema. Контракт пакета отвечает «ящик на месте?». Контракт инструмента — «легальны ли arguments этого хопа». Оба JSON Schema, но на разных хопах. Ниже переносимый фрагмент MCP, который можно написать до упаковки — потом он ляжет в корень плагина как есть.

{
  "$schema": "https://agent-plugins.org/schemas/1.0.0/mcp.schema.json",
  "mcpServers": {
    "invoice-tools": {
      "type": "stdio",
      "command": "./bin/invoice-mcp",
      "args": ["--data", "${PLUGIN_DATA}/invoices"],
      "cwd": "${PLUGIN_ROOT}"
    }
  }
}

Когда паковать: Plugin окупается при многих компонентах и клиентах

Плагин стоит того, когда одновременно горят вопросы три и четыре. Типичная пара: MCP, который тянет цифры, плюс скилл, который пишет человеческую недельную сводку; или пара Google — скиллы ограждений gcloud плюс MCP Developer Knowledge. Каждый без другого используют неправильно: одна рука выдумывает отчёт; один бриф не имеет заземлённого поиска доков. После упаковки Antigravity, Claude Code и Codex делят раскладку. plugin.json закрыт, mcp.json отдельно, секреты в переменных окружения, не в headers.

Ранняя упаковка стоит манифеста на поддержку и галлюцинации ревью: «у нас теперь плагин». Ящик не делает из скилла инструмент и не даёт MCP брифа. Независимые компоненты падают независимо: один сервер в mcp.json может не стартовать, скиллы всё равно грузятся; сломанный frontmatter одного SKILL.md не валит остальных. Это спека. Если CI отвергает весь пакет из-за одного неизвестного поля верхнего уровня, вы строже клиента — знайте это.

Ещё раз линия A2A. Плагин отвечает, как этот агент получает набор скиллов и инструментов. Как находят агента счетов другой команды — Agent Card, не запихивание его одним tool в ваш mcp.json. Многоходовые уточнения и асинхронные колбэки рвут форму вызова функции. Одно предложение про порядок: сначала рука, потом бриф, ящик в конце. Плагин без руки — заказывать коробки, не зная, что продаёте.

{
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
  "name": "reports-plugin",
  "version": "1.0.0",
  "description": "Invoice MCP plus the weekly-summary skill, shipped together"
}
Ситуация Выбор по умолчанию Не делать
Формат тела PR, шаблон отчёта об инцидентеТолько SkillПоднимать ради этого пустой MCP-сервер
API счетов для одной IDEНативный MCP-конфиг этой IDEСобрать плагин и смапить обратно на один клиент
MCP запросов + скилл сводки, три клиентаPlugin (plugin.json + skills/ + mcp.json)Запихнуть целого удалённого агента в один tool

Три схемы, три обнаружения; проверить в JSONVue

Разложите контракты по хопам. Первый: plugin.schema.json — можно ли найти ящик; $schema на https://agent-plugins.org/schemas/1.0.0/plugin.schema.json. Второй: mcp.schema.json — как коннектиться; type обязан быть явным. Третий: inputSchema каждого инструмента — проходят ли arguments. Frontmatter скилла — YAML, не одна из этих трёх; не «JSON Schema»-ьте целый SKILL.md. Обнаружение проверяет первые две; вызов — третью.

Оставьте минимум пять фикстур: запись решения выше, легальный plugin.json, манифест с лишним полем верхнего уровня, переносимый mcp.json, реальный объект arguments tools/call. Запись ловит спор четырёх вопросов и choice. Манифесты ловят контракт пакета. Arguments — контракт инструмента. Developer Knowledge берёт API-ключ в рантайме клиента; mcp.json в git не должен держать секреты.

В браузере достаточно:Форматировать JSON— парсятся ли запись и оба манифеста;Проверить JSON Schema— $schema, name, mcpServers и inputSchema;JSON Diff— сравнить переносимый mcp.json с нативным экспортом. Данные не уходят с этой машины. Дальше:MCP и JSON Schema, обзор Plugins и как A2A и MCP делят работу.

Связанное: Google Agent Plugins 2026, MCP и JSON Schema, Что такое MCP, A2A vs MCP.

FAQ

Скрипты внутри скилла заменяют MCP?

Да, если локальный CLI уже есть, аргументы — argv и не нужна удалённая auth-discovery. Нет, если нужны стабильный JSON-вход, OAuth или HTTP-инструменты между машинами. Скрипт — вложение скилла, не первоклассный инструмент на tools/list.

Только MCP, скилла нет — всё равно делать плагин?

Один клиент: нет, нативный конфиг. Два и больше и хотите одно описание соединения: плагин только с mcp.json валиден; skills/ может отсутствовать. Не добавляйте пустой скилл, чтобы дерево выглядело готовым.

Плагины заменят MCP или Skills?

Нет. v1 признаёт только эти два типа и не определяет установку, права и песочницу. Заменяет он «каждый клиент изобретает свою обёртку». Исполнение остаётся MCP и Agent Skills.

Три JSON Schema можно слить в один файл?

Бизнес-поля могут жить в одной канонической схеме и порождать MCP inputSchema. Не кладите поля plugin.json и arguments инструмента в один файл «общей проверки». Отказ обнаружения и отказ вызова обрабатывают по-разному.

Итог и следующие шаги

Выбор между Skills, MCP и Plugins в 2026 сжимается в одно предложение: нужна ли рука, нужен ли бриф, должны ли они ехать вместе, поставит ли это больше одного клиента. Не тройное голосование. Слои, которые складываются.

Порядок выпуска: четыре ответа как JSON записи решения; нужна рука — сначала inputSchema; нужен бриф — сначала description; оба горят и вы пересекаете клиентов — добавьте plugin.json. Три контракта смотрите в JSONVue. Форма ящика — обзор Plugins; проводной протокол — статьи MCP; работа между агентами — статья A2A.