Навыки агентов, MCP-серверы или файлы правил: что выбрать
Сравнение способов передачи контекста для AI-агентов. Узнайте, как навыки, MCP-серверы и файлы правил влияют на расход токенов и стоимость поддержки в долгосрочной перспективе.
Навыки агентов, MCP-серверы и файлы правил: краткий ответ
Навыки агентов, MCP-серверы и файлы правил предоставляют кодирующему агенту необходимые данные. Выбор инструмента зависит от типа этих данных. Протокол MCP (Model Context Protocol) предназначен для информации, которая может измениться при следующем обращении. Навык (skill) подходит для процедур, которые можно описать сегодня и которые останутся актуальными через 6 недель. Файл правил (rules file) предназначен для небольшого набора фактов, которые должны соблюдаться в каждой сессии.
У этого выбора есть цена, и эта цена — контекст. Каждый токен, потраченный на ненужную агенту инструкцию, — это токен, который нельзя использовать для анализа кода. Вы платите за этот токен при каждом запросе, так как всё окно контекста отправляется заново. Поэтому правильный вопрос заключается не в том, какой механизм может выполнить задачу. В большинстве случаев с ней справятся все три. Вопрос в том, какой из них потребляет меньше всего ресурсов в режиме ожидания.
Стоимость использования каждого компонента
Эти три механизма загружаются в разное время, и именно этот временной фактор определяет разницу в их стоимости.
Файл правил загружается целиком при запуске в каждой сессии, независимо от того, актуален он или нет. Claude Code считывает CLAUDE.md в начале каждого диалога и загружает его полностью, невзирая на объем. Рекомендуемый лимит составляет менее 200 строк на файл, так как более длинный файл потребляет больше контекста и хуже учитывается моделью. Оба этих фактора работают в одном направлении, поэтому файл правил на 900 строк приносит больше вреда, чем пользы.
Skill загружается в два этапа. При запуске в контекст попадает только строка description из frontmatter каждого SKILL.md, чтобы модель знала о существовании навыка и понимала, когда его применять. Тело навыка загружается только в момент его вызова. Таким образом, справочный документ на 400 строк практически не расходует ресурсы до тех пор, пока он не понадобится.
Раньше MCP server считался наиболее затратным компонентом, и именно здесь большинство прочитанных вами сравнений уже устарели. В текущей версии Claude Code поиск инструментов (tool search) включен по умолчанию. При запуске сессии загружаются только имена инструментов и поле инструкций сервера, а полные JSON (JavaScript object notation) схемы откладываются до момента, когда Claude начнет их поиск. Добавление сервера больше не требует предварительной траты тысяч токенов. Затраты все еще существуют, и они по-прежнему требуют полной предварительной загрузки в конфигурациях, где поиск инструментов отключен.
The data behind this chart
[
{
"label": "Rules file, 200 lines",
"at_startup": "2,500",
"after_use": "2,500"
},
{
"label": "Skill, 12 KB body",
"at_startup": 40,
"after_use": "3,000"
},
{
"label": "MCP server, tool search on",
"at_startup": 500,
"after_use": "3,200"
},
{
"label": "MCP server, tool search off",
"at_startup": "4,500",
"after_use": "4,500"
}
]Это оценочные значения, а не измерения с вашей машины. Они основаны на объеме текста, который загружает каждый механизм, исходя из расчета примерно четыре символа на токен: файл правил на 200 строк — это около 10 KB markdown, описание навыка — около 160 символов, а сервер, предоставляющий двенадцать инструментов, содержит около 18 KB схем плюс 2 KB блока инструкций. Claude Code обрезает каждое описание инструмента и каждое поле инструкций сервера на отметке 2 KB, поэтому для этой части существует верхний предел. В следующем разделе показано, как получить реальные цифры для вашей системы.
Рассматривайте первые две строки вместе. Файл правил стоит 2,500 токенов в сессии, где он никому не понадобился. Skill стоит 40 токенов в той же сессии и 3,000 в одной из десяти сессий, где он был задействован. Последние две строки — это один и тот же сервер в двух режимах, с включенным и выключенным поиском инструментов: 500 токенов против 4,500. Этот разрыв — причина, по которой старые советы о раздувании контекста через MCP все еще циркулируют.
Для работы поиска инструментов требуется модель, поддерживающая блоки tool_reference, что по состоянию на август 2026 года означает Claude Sonnet 4.5, Haiku 4.5, Opus 4.5 и более поздние версии. Claude Code отключает эту функцию, если ANTHROPIC_BASE_URL указывает на сторонний хост, так как большинство прокси не пересылают такие блоки. Используйте ENABLE_TOOL_SEARCH для управления этим поведением: false загружает все схемы сразу, true откладывает загрузку всех схем, а auto загружает их заранее только в том случае, если они укладываются в 10% окна контекста.
# Load schemas up front only if they fit in 5% of the window
ENABLE_TOOL_SEARCH=auto:5 claudeРешающий вопрос: меняются ли данные между вызовами?
Задайте этот вопрос первым, так как он сразу исключает один из вариантов. Если агенту нужно читать или записывать данные, которые могут измениться к следующему обращению, вам нужен сервер. Это может быть баг-трекер, база данных, панель мониторинга или ваш собственный внутренний API (интерфейс прикладного программирования). Запись данных в файл не поможет, так как информация устареет в тот же момент, когда кто-то другой изменит запись. Ваша кодовая база также относится к этой категории, так как её структура меняется с каждым коммитом. Именно поэтому агенту лучше предоставлять разобранную карту репозитория через MCP, а не описывать структуру в файле, который быстро устаревает.
Если ответ останется верным через шесть недель без какого-либо обслуживания, вам нужен навык (skill). Чек-лист релиза. Процедура миграции. Формат ответов об ошибках. Требования к написанию тестов в этом репозитории. Навык — это файл в git. У него нет порта, нет процесса и нет режимов отказа, кроме неверного содержания, которое можно выявить при проверке кода (code review).
Если это факт, который должен применяться к задачам, о которых вы еще не думали, поместите его в файл правил. Run make lint before committing. Never push to main. Handlers live in src/api/handlers/. По одной строке на каждый факт. Как только запись превращается в последовательность шагов, она перестает быть фактом и становится процедурой, поэтому её следует перенести в навык.
Когда достаточно файла правил
Файлы правил загружаются из нескольких источников, от наиболее общих к наиболее специфичным: управляемый файл политики, ваш личный ~/.claude/CLAUDE.md, проектный ./CLAUDE.md или ./.claude/CLAUDE.md, а также игнорируемый git файл ./CLAUDE.local.md. Все найденные файлы объединяются, а не переопределяют друг друга, при этом файлы, расположенные ближе к вашей рабочей директории, считываются в последнюю очередь.
Claude Code считывает CLAUDE.md, а не AGENTS.md. Если в вашем репозитории уже есть AGENTS.md для других инструментов, не поддерживайте две копии, которые со временем начнут различаться.
ln -s AGENTS.md CLAUDE.mdСимволическая ссылка не выводит ничего при успешном выполнении. Запустите сессию, выполните /context и убедитесь, что CLAUDE.md появился в разделе Memory files. Если его там нет, агент его не обнаружил, и никакая переформулировка не поможет. Если вам также нужны строки, специфичные для Claude, используйте форму импорта и разместите их после импорта.
@AGENTS.md
## Claude Code
Use plan mode for changes under `src/billing/`.Здесь кроется одна ловушка. Импорты @path не сохраняют контекст. Импортируемый файл разворачивается и загружается при запуске вместе с файлом, который на него ссылается, с глубиной вложенности до четырех уровней. Разделение файла правил на 600 строк на шесть импортов делает его удобнее для чтения людьми, но не меняет стоимость токенов абсолютно никак. Стоит ознакомиться с соглашениями, лежащими в основе AGENTS.md и его аналога для людей, прежде чем утверждать структуру.
Что действительно снижает стоимость, так это .claude/rules/ с полем paths. Файл правил, содержащий paths в заголовке, загружается только тогда, когда агент обращается к файлу, соответствующему одному из шаблонов.
---
paths:
- "src/api/**/*.ts"
---
# API rules
- Every endpoint validates its input.
- Use the standard error response shape.Правило без поля paths загружается при запуске с тем же приоритетом, что и .claude/CLAUDE.md. Поэтому рабочая схема — это короткие безусловные правила плюс список paths для всего, что имеет значение только внутри одной директории.
Когда вам нужен навык
Навык — это каталог, внутри которого находится SKILL.md. Персональные навыки хранятся в ~/.claude/skills/<name>/SKILL.md и применяются ко всем проектам на вашей машине. Проектные навыки находятся в .claude/skills/<name>/SKILL.md, перемещаются вместе с репозиторием и могут быть проверены в pull request, как и любой другой файл.
mkdir -p ~/.claude/skills/summarize-changes---
name: summarize-changes
description: Summarizes uncommitted changes and flags anything risky. Use when the user asks what changed, wants a commit message, or asks to review their diff.
---
Run `git status` and `git diff` against the merge base.
Group the changes by intent, not by file.
Call out anything touching auth, migrations or deletions.description — это единственная часть файла, которая попадает в контекст до запуска навыка, поэтому она выполняет две задачи. Она описывает, что делает навык, и определяет условия его вызова. Описание вида "Помогает с развертыванием" не дает модели данных для сопоставления с запросом, поэтому навык просто никогда не активируется, и вы решите, что навыки не работают.
Имя каталога становится командой, поэтому в примере выше вы получаете /summarize-changes. В персональном или проектном навыке параметр name в заголовке задает только отображаемую метку в списках.
После вызова skill его отрендеренное содержимое добавляется в контекст одним сообщением и остаётся там до конца сеанса. Claude Code не перечитывает файл при последующих запросах. Формулируйте постоянные инструкции, а не шаги для однократного выполнения, и делайте текст компактным: с этого момента каждая его строка увеличивает затраты на каждом запросе. После автоматической компактизации Claude Code повторно подключает последний вызов каждого skill. При этом в общий бюджет 25,000 токенов помещаются первые 5,000 токенов каждого skill. Если за один сеанс вызвать несколько больших skill, самые старые будут полностью удалены. Поэтому может показаться, что skill перестал влиять на работу после долгого диалога. Вызовите его снова, и он вернётся. Skill с большим количеством процедур наглядно показывает этот компромисс: skill unlazy и его метод Depth Tree расходует значительную часть контекста на контрольные этапы и файл плана, зато агент перестаёт преждевременно объявлять работу завершённой. Если одна и та же процедура применяется к нескольким кодовым базам, используйте один skill в нескольких репозиториях, а не копируйте файл.
Когда вам нужен MCP server
Добавление сервера выполняется одной командой, а способ взаимодействия определяется транспортом.
# Remote HTTP server
claude mcp add --transport http notion https://mcp.notion.com/mcp
# Remote HTTP server behind a bearer token
claude mcp add --transport http secure-api https://api.example.com/mcp \
--header "Authorization: Bearer your-token"
# Local stdio server: everything after -- is passed through untouched
claude mcp add --env AIRTABLE_API_KEY=YOUR_KEY --transport stdio airtable \
-- npx -y airtable-mcp-serverСимвол -- имеет значение. Для сервера, работающего через stdio, он отделяет параметры Claude Code от командной строки, запускающей ваш сервер. Если его пропустить, --port 8080, предназначенный для сервера, будет интерпретирован как опция для claude mcp add, которая затем отклонит его.
claude mcp list
claude mcp get notionclaude mcp add подтверждает действие строкой Added ..., которая лишь сообщает о том, что конфигурация была записана на диск. claude mcp list — это команда, которая показывает реальное положение дел, так как она выводит статус работоспособности рядом с каждым сервером: ✔ Connected, ! Needs authentication или ✘ Failed to connect. Статус ошибки означает, что Claude Code не смог связаться с этим сервером, а не то, что команда вывода списка не работает. Внутри сессии /mcp предоставляет такой же обзор по каждому серверу вместе с количеством доступных инструментов.
Каждый вызов MCP server является независимым и содержит всё необходимое, и именно поэтому MCP server не запоминает ваш предыдущий запрос. Это архитектурное решение, которое влечет за собой следующее следствие: любое состояние, которое необходимо сохранить, должно находиться на стороне сервера, в базе данных или файле, и теперь это компонент, которым вы управляете.
MCP-сервер — это процесс, который нужно запускать
Вот расходы, которые упускают из виду при сравнении поставщиков. Skill — это файл. MCP-сервер — это программное обеспечение, которое где-то работает, и если это «где-то» является вашим VPS (виртуальным частным сервером), вы отвечаете за его время безотказной работы.
Stdio-сервер — это простой и дешевый вариант. Claude Code запускает его как дочерний процесс при старте сессии, и он завершается вместе с ней. Его не нужно мониторить или обновлять по отдельному графику. Удаленный HTTP-сервер — это долгоживущий сервис, и ему требуется всё то же, что и любому другому долгоживущему сервису.
[Unit]
Description=Notes MCP server
After=network-online.target
Wants=network-online.target
[Service]
User=mcp
WorkingDirectory=/srv/notes-mcp
ExecStart=/usr/bin/node /srv/notes-mcp/dist/server.js
Environment=PORT=8931
Restart=on-failure
RestartSec=5
NoNewPrivileges=true
PrivateTmp=true
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable --now notes-mcp
systemctl is-active notes-mcp
journalctl -u notes-mcp -n 50 --no-pagersystemctl is-active должен выводить active. Если он выводит failed, причина указана в журнале; при первом запуске это почти всегда отсутствие переменной окружения или порт, занятый другим процессом. Restart=on-failure здесь обязателен, так как упавший MCP-сервер не сообщает о своей неработоспособности. Вы узнаете об этом только тогда, когда агент сообщит, что не может прочитать ваш трекер задач.
Привяжите процесс к 127.0.0.1 и установите перед ним reverse proxy с TLS (transport layer security). MCP-сервер, который имеет доступ к вашей базе данных и отвечает на публичном порту без аутентификации — это база данных, которую вы выставили в открытый доступ. Запуск MCP-сервера на VPS подробно описывает настройку прокси, сертификатов и межсетевого экрана.
Затем честно оцените объем регулярной работы. Сервис требует обновлений безопасности по собственному графику, независимо от агента, который с ним взаимодействует. Его OAuth-токен истекает, и claude mcp list начинает выводить ! Needs authentication в самый неподходящий момент. Его учетные данные хранятся в конфигурационном файле или заголовке Authorization, поэтому они требуют такого же внимания, как и любые другие секреты, что является отдельной большой темой: защита секретов от доступа AI-агентов. Для skill такой работы не существует.
Взвесьте все за и против, прежде чем приступать к разработке. Если данные, стоящие за предлагаемым сервером, меняются примерно раз в квартал, то skill, который подсказывает агенту, где искать информацию и что означают поля, обойдется дешевле, чем сервис, который нужно постоянно поддерживать в рабочем состоянии.
Как оценить стоимость собственного контекста
Прекратите гадать и запустите /context в рамках сессии. Команда выведет подробную информацию о запуске: системный промпт, файлы памяти, инструменты и MCP-серверы с указанием веса токенов для каждого из них.
Проверьте два момента. В разделе Memory files убедитесь, что в списке присутствуют все ожидаемые файлы правил. Отсутствующий файл невидим для агента, поэтому это первое, что нужно исключить, если инструкции игнорируются. Если файл в списке есть, а правило всё равно пропускается, причина кроется в другом, и стоит изучить причины, по которым агент игнорирует видимую инструкцию, прежде чем переписывать строку заново. Затем посмотрите на стоимость ваших серверов. Если сервер, который вы используете дважды в месяц, занимает одну из самых больших строк в списке, отключите его в /mcp и включайте обратно только для тех сессий, где он необходим. Конфигурация при этом сохраняется.
Удаленный сервер также может сообщать статус вроде cached 2h ago · connects on first use · 5 tools. Это означает, что Claude Code считал список инструментов из предыдущей сессии вместо подключения при запуске; соединение будет установлено при первом вызове инструмента. Инструменты доступны с вашего первого сообщения, поэтому исправлять ничего не нужно. Установите MCP_DISCOVERY_CACHE=0, если хотите, чтобы каждый сервер подключался при запуске. Для более широкого обзора, управление окном контекста Claude Code описывает, что сохраняется после сжатия, а во что на самом деле обходятся эти токены переводит цифры в денежный эквивалент.
Почему мой навык не срабатывает?
Обычно причина кроется в description. Это единственный текст в контексте перед запуском навыка, поэтому если он не описывает ситуацию, совпадения не будет. Впишите триггер в предложение: "Use when the user asks what changed, wants a commit message, or asks to review their diff." Расплывчатые описания приводят к молчаливому отказу, из-за чего проблему трудно заметить.
Вторая причина — опечатка в frontmatter, и в этом случае система выдает явную ошибку. Неизвестный ключ отклоняется сразу:
Unexpected key(s) in SKILL.md frontmatter: argument-hint. Allowed properties are: allowed-tools, compatibility, description, license, metadata, nameТретья причина — расположение. Навыки проекта загружаются из .claude/skills/ в вашей рабочей директории и во всех родительских папках вплоть до корня репозитория. Навыки во вложенных директориях ниже той, из которой вы запустились, при старте не загружаются. Они появляются только тогда, когда агент впервые читает или редактирует файл внутри этой поддиректории, поэтому до этого момента они не отображаются в автодополнении и их нельзя вызвать по имени.
Аналогом такого молчаливого отказа в MCP является запись .mcp.json с url, но без type. Claude Code считывает любую запись без type как stdio-сервер, поэтому пропускает её и сообщает:
MCP server "notes" has a "url" but no "type"; add "type": "http" (or "sse" / "ws") to this entryСовместное использование всех трех механизмов
Эти механизмы не конкурируют друг с другом. Эффективная конфигурация использует каждый из них там, где это наиболее целесообразно. Файл правил содержит несколько строк, которые верны для любых условий. Навыки (skills) содержат процедуры и загружаются только тогда, когда они применимы. Один MCP-сервер, иногда два, связывают системы, содержимое которых невозможно предсказать заранее. Если вы все еще формируете свое представление о первом из них, что на самом деле представляет собой навык агента подробно описывает этот формат.
Один тест позволяет разрешить большинство споров о том, где должно находиться решение. Удалите его, начните новый сеанс и дайте агенту соответствующую задачу. Если агент стал работать медленнее — значит, решение относилось к навыку. Если агент уверенно ошибается — значит, место было в файле правил. Если агент вообще не может получить информацию — значит, вам требовался сервер, и теперь вам также нужен план по обеспечению его работоспособности.
FAQ
Что выбрать: навык (skill) или MCP-сервер?
Выбор зависит от того, меняется ли информация между вызовами. Если агенту нужно считывать актуальное состояние, которое может изменять кто-то другой (например, трекер задач, база данных или дашборд), вам нужен MCP-сервер, так как любые записанные данные устаревают сразу после изменения записи. Если вы можете записать ответ один раз, и он останется верным через шесть недель, создавайте навык. Навык — это файл в git, для которого не нужно запускать процесс, открывать порт или планировать обновления, поэтому это более экономный вариант во всех случаях, когда это возможно.
Занимают ли MCP-серверы всё ещё место в контекстном окне?
Гораздо меньше, чем раньше. В текущей версии Claude Code поиск инструментов включен по умолчанию, поэтому при запуске сессии загружаются только имена инструментов и поле инструкций сервера, а полные схемы подгружаются, когда Claude выполняет поиск. Предварительная загрузка всё ещё происходит, если поиск инструментов отключен: при использовании ENABLE_TOOL_SEARCH=false, при указании ANTHROPIC_BASE_URL на сторонний прокси или при работе с моделью старше поколения Claude 4.5. Запустите /context, чтобы проверить текущий режим, так как цифры в старых сравнительных обзорах основаны на предварительной загрузке.
Читает ли Claude Code файл AGENTS.md?
Нет. Claude Code читает CLAUDE.md. Если в вашем репозитории уже есть AGENTS.md для других агентов, настройте один файл на другой вместо хранения двух копий. Выполните ln -s AGENTS.md CLAUDE.md для создания обычной символической ссылки или добавьте @AGENTS.md в первую строку CLAUDE.md, а инструкции для Claude разместите ниже. Затем начните сессию и выполните /context, чтобы убедиться, что CLAUDE.md отображается в разделе Memory files.
Почему мой навык перестал работать в середине сессии?
Обычно причина в автоматической компрессии (auto-compaction). Когда история диалога суммируется, Claude Code повторно подключает последний вызов каждого навыка, сохраняя первые 5000 токенов каждого из них в рамках общего лимита в 25000 токенов на все навыки. Этот лимит заполняется начиная с наиболее недавно вызванного навыка, поэтому, если вы вызвали несколько объёмных навыков, старые будут полностью удалены. Вызовите навык снова, чтобы восстановить его полное содержимое.
Как предотвратить загрузку длинного файла правил в каждой сессии?
Перенесите части, которые нужны лишь иногда, в файлы .claude/rules/ с полем paths в их метаданных (frontmatter), чтобы каждый из них загружался только тогда, когда агент обращается к соответствующему файлу. Разделение файла на импорты @path не поможет, так как импортируемые файлы раскрываются и загружаются при запуске вместе с файлом, который на них ссылается. Любая многошаговая процедура, а не постоянный факт, должна быть оформлена как навык, так как тело навыка не потребляет ресурсы, пока он не вызван.