Туториал
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.