Что выбрать: команда, навык, субагент, 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-команда]Дерево читается сверху вниз для любой новой задачи. Если ответ «да» на первый вопрос — всё остальное не важно: нужен 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 работает детерминированно.
Пересечения: где выбор неочевиден
Skill vs Slash-команда. Начните с команды. Когда появляются скрипты, условия, вспомогательные файлы — переходите к навыку. Это естественная точка роста.
Skill vs Субагент. Один вопрос: нужна ли изоляция контекста? Если задача большая и не должна «загрязнять» основную сессию — субагент. Если нужна только экспертиза, которую Claude применяет прямо здесь — навык.
Hook vs Субагент. Hook — когда нужно детерминированно и всегда. Субагент — когда нужна AI-логика для обработки результата. Пример: автоформат → hook; анализ качества кода с рекомендациями → субагент.
MCP vs Skill + Bash. Иногда достаточно добавить в навык bash-скрипт, делающий curl. MCP оправдан, когда нужно постоянное, интерактивное подключение к системе с несколькими инструментами: чтение, запись, управление состоянием. Для разового вызова внешнего API нередко хватает скрипта в навыке.
Плагин — не шестой механизм
Плагин — это не ещё один тип расширения, а упаковка нескольких механизмов в одну устанавливаемую единицу. Когда стек кастомизации вырос (команды + навыки + хуки + MCP), плагин позволяет версионировать и распространять его как один артефакт — с одним plugin.json на всю команду.
See also
- Слэш-команды: встроенные и кастомные — детали frontmatter и синтаксис
$ARGUMENTS - Skills — переносимые навыки — SKILL.md, progressive disclosure, вспомогательные файлы
- Субагенты и контекстная изоляция — когда изоляция контекста критична
- Hooks — события жизненного цикла — PreToolUse, PostToolUse, Stop, SessionStart
- Model Context Protocol: архитектура и основы — примитивы MCP: tools, resources, prompts
- Подключение MCP-серверов в Claude Code —
claude mcp addи скоупы - Plugins и marketplace — упаковка стека в один артефакт
- Output styles и статусная строка — кастомизация поведения агента, а не его возможностей
- CLAUDE.md и система памяти — куда класть проектный контекст, который не является навыком