Что выбрать: команда, навык, субагент, MCP или хук

К этому моменту раздел разобрал все механизмы расширения по отдельности. Задача этой статьи — одна: дать инструмент для выбора между ними в конкретной ситуации. Неверный выбор не ломает систему мгновенно, но накапливается: команды с логикой, которая туда не влезает; субагенты там, где хватило бы навыка; хуки, которые пытаются «рассуждать». Хороший стек кастомизации — это когда каждый механизм делает только то, для чего он создан.

Пять механизмов: главные различия

МеханизмЧто делаетКогда срабатываетИмеет логику?Изолирует контекст?
Slash-командаПодставляет шаблон промптаПо вызову /name
SkillЗагружает переносимую экспертизуПо необходимости✅ (скрипты)
СубагентЗапускает отдельный экземпляр ClaudeПо вызову агента
MCP-серверПодключает внешние системы как инструментыЧерез tool call✅ (внешний код)
HookВыполняет shell-команду детерминированноНа событии цикла✅ (shell)

Output style в эту таблицу не попал — это не механизм расширения функциональности, а настройка поведения агента (тон, формат, роль). Если задача — изменить то, что Claude делает, смотрите таблицу. Если задача — изменить как Claude отвечает — это output style.

Проверь себя
Посмотрите на таблицу: какое свойство есть только у субагента и больше ни у одного механизма расширения?

Дерево решений

flowchart TD A[Новая задача расширения] --> B{Событие жизненного цикла?} B -->|Да| C[Hook] B -->|Нет| D{Внешняя система?} D -->|Да| E[MCP-сервер] D -->|Нет| F{Нужна изоляция контекста?} F -->|Да| G[Субагент] F -->|Нет| H{Переносимая экспертиза?} H -->|Да| I[Skill] H -->|Нет| K[Slash-команда]
flowchart TD
    A[Новая задача расширения] --> B{Событие жизненного цикла?}
    B -->|Да| C[Hook]
    B -->|Нет| D{Внешняя система?}
    D -->|Да| E[MCP-сервер]
    D -->|Нет| F{Нужна изоляция контекста?}
    F -->|Да| G[Субагент]
    F -->|Нет| H{Переносимая экспертиза?}
    H -->|Да| I[Skill]
    H -->|Нет| K[Slash-команда]
Дерево решений: какой механизм расширения выбрать

Дерево читается сверху вниз для любой новой задачи. Если ответ «да» на первый вопрос — всё остальное не важно: нужен Hook.

Разбор по конкретным сценариям

#### «Хочу вызывать стандартный code review одной командой»

Slash-команда. Классический шаблон: /review подставляет промпт с критериями в контекст, $ARGUMENTS принимает имя файла или указание. Никакой логики не нужно, никакой изоляции тоже.

# .claude/commands/review.md
---
description: Стандартный code review для файла или директории
---
Проведи code review для `$ARGUMENTS`.
Проверь: читаемость, потенциальные баги, соответствие стилю проекта.
Выдай список замечаний с указанием строк.

Типичная ошибка — вписать в файл команды условную логику («если TypeScript, проверяй типы; если Python, проверяй docstrings»). Команда это не умеет: она шаблон, не скрипт. Условная логика — в Skills.

#### «Хочу, чтобы Claude знал процедуру нашего деплоя»

Skill. Процедура деплоя — переносимая экспертиза: SKILL.md с шагами плюс вспомогательные скрипты рядом. Навык загружается только когда нужен (progressive disclosure) и не занимает контекст в остальное время.

Ошибка — добавить эти инструкции в CLAUDE.md. Если они нужны только при деплое, а не при каждом вопросе о кодовой базе — это лишний балласт при каждой сессии.

#### «Нужно параллельно проверить 20 файлов конфигурации»

Субагент. Каждый файл — отдельный агент с изолированным контекстом. Главная сессия получает только итоговую сводку. Без субагентов вся переписка про 20 файлов оказалась бы в одном окне, съев значительную часть контекстного окна.

Антипаттерн — запускать субагент для задачи, которая решается одним вызовом инструмента. Субагент — дорогой механизм. Если задача небольшая — навык или прямой запрос.

#### «Хочу, чтобы Claude делал SQL-запросы в нашу базу»

MCP-сервер. Это единственный правильный ответ. MCP добавляет инструмент — готовый postgres-сервер из официального реестра или собственный — который Claude вызывает в любой момент сессии. Ни навык, ни команда, ни субагент не дают прямого подключения к внешней системе.

#### «Хочу автоматически запускать prettier после каждого редактирования файла»

Hook на PostToolUse (событие Write). Это детерминированное действие, которое должно происходить всегда, без участия модели. Hook — единственный механизм, гарантирующий выполнение вне зависимости от решения Claude.

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write",
        "hooks": [
          {
            "type": "command",
            "command": "jq -r '.tool_input.file_path' | xargs prettier --write"
          }
        ]
      }
    ]
  }
}

Ошибка — реализовывать это через субагент или навык. Модель может «забыть» вызвать навык. Hook работает детерминированно.

Проверь себя
Коллега добавил в hook shell-скрипт, который анализирует вывод тестов и «решает», откатывать ли последние изменения. Что здесь концептуально неверно?

Пересечения: где выбор неочевиден

Skill vs Slash-команда. Начните с команды. Когда появляются скрипты, условия, вспомогательные файлы — переходите к навыку. Это естественная точка роста.

Skill vs Субагент. Один вопрос: нужна ли изоляция контекста? Если задача большая и не должна «загрязнять» основную сессию — субагент. Если нужна только экспертиза, которую Claude применяет прямо здесь — навык.

Hook vs Субагент. Hook — когда нужно детерминированно и всегда. Субагент — когда нужна AI-логика для обработки результата. Пример: автоформат → hook; анализ качества кода с рекомендациями → субагент.

MCP vs Skill + Bash. Иногда достаточно добавить в навык bash-скрипт, делающий curl. MCP оправдан, когда нужно постоянное, интерактивное подключение к системе с несколькими инструментами: чтение, запись, управление состоянием. Для разового вызова внешнего API нередко хватает скрипта в навыке.

Плагин — не шестой механизм

Плагин — это не ещё один тип расширения, а упаковка нескольких механизмов в одну устанавливаемую единицу. Когда стек кастомизации вырос (команды + навыки + хуки + MCP), плагин позволяет версионировать и распространять его как один артефакт — с одним plugin.json на всю команду.


Быстрое повторение
Output Style (тон, формат, роль) — это механизм расширения функциональности Claude Code?
Быстрое повторение
Почему процедуру деплоя лучше добавить в Skill, чем в CLAUDE.md?
Быстрое повторение
Когда нужен Hook вместо Skill или Субагента для автоматизации?

See also