Навыки агентов, MCP-серверы или файлы правил: что выбрать
Сравнение способов передачи контекста для AI-агентов. Узнайте, как навыки, MCP-серверы и файлы правил влияют на расход токенов и стоимость поддержки в долгосрочной перспективе.
Навыки агентов, MCP-серверы и файлы правил: краткий ответ
Навыки агентов, MCP-серверы и файлы правил предоставляют кодирующему агенту необходимые данные. Выбор инструмента зависит от типа этих данных. Протокол MCP (Model Context Protocol) предназначен для информации, которая может измениться при следующем обращении. Навык (skill) подходит для процедур, которые можно описать сегодня и которые останутся актуальными через 6 недель. Файл правил (rules file) предназначен для небольшого набора фактов, которые должны соблюдаться в каждой сессии.
У этого выбора есть цена, и эта цена — контекст. Каждый токен, потраченный на ненужную агенту инструкцию, — это токен, который нельзя использовать для анализа кода. Вы платите за этот токен при каждом запросе, так как всё окно контекста отправляется заново. Поэтому правильный вопрос заключается не в том, какой механизм может выполнить задачу. В большинстве случаев с ней справятся все три. Вопрос в том, какой из них потребляет меньше всего ресурсов в режиме ожидания.
Стоимость использования каждого компонента
Эти три механизма загружаются в разное время, и именно этот временной фактор определяет разницу между ними.
Файл правил загружается полностью при запуске в каждой сессии, независимо от того, нужен он или нет. Claude Code считывает CLAUDE.md в начале каждого диалога и загружает его целиком, какой бы длины он ни был, пропуская только файлы размером более 4 MiB. Рекомендуемый объем — менее 200 строк на файл, так как более длинный файл потребляет больше контекста и хуже соблюдается моделью. Оба этих фактора действуют в одном направлении, поэтому файл правил на 900 строк приносит больше вреда, чем пользы.
Навык (skill) загружается в два этапа. При запуске в контекст попадает только строка description из frontmatter каждого файла SKILL.md, чтобы модель знала о существовании навыка и понимала, когда его применять. Тело навыка загружается только в момент его вызова. Таким образом, справочный документ на 400 строк практически не потребляет ресурсы до того момента, пока он не понадобится.
Раньше MCP-сервер был самым затратным компонентом, и именно здесь большинство прочитанных вами сравнений уже устарели. В текущей версии Claude Code поиск инструментов (tool search) включен по умолчанию. При запуске сессии загружаются только имена инструментов и поле инструкций сервера, а полные JSON-схемы (JavaScript object notation) откладываются до тех пор, пока Claude не начнет их поиск. Добавление сервера больше не требует предварительной загрузки тысяч токенов. Затраты все еще существуют, и они по-прежнему требуют полной предварительной загрузки в конфигурациях, где поиск инструментов отключен.
Данные, на которых построен график
[
{
"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 обрезает поле инструкций сервера и описание каждого инструмента, загружаемого при старте, до 4,096 символов по умолчанию, а описание инструмента, загружаемое через поиск, — до 16,384 символов, так что для этой части существует верхний предел. До версии v2.1.296 более короткий лимит составлял 2,048 символов, и CLAUDE_CODE_MAX_MCP_DESCRIPTION_LENGTH заменяет оба этих лимита, если вы его зададите. В следующем разделе показано, как получить ваши собственные реальные показатели.
Рассматривайте первые две строки вместе. Файл правил стоит 2,500 токенов в сессии, где он никому не понадобился. Навык стоит 40 токенов в той же сессии и 3,000 в одной из десяти сессий, где он срабатывает. Последние две строки — это один и тот же сервер с включенным и выключенным поиском инструментов: 500 токенов против 4,500. Этот разрыв — причина, по которой старые советы о переполнении контекста через MCP все еще циркулируют.
По состоянию на октябрь 2026 года Claude Code использует поиск инструментов в моделях Claude Opus 4, Sonnet 4, Haiku 4.5 и более поздних, а также в Opus 4.5, Sonnet 4.5, Haiku 4.5 и более поздних на платформе Google Cloud Agent Platform. В более ранних моделях и в развертываниях Microsoft Foundry на Azure каждый инструмент MCP загружается при старте независимо от ваших настроек. При использовании ANTHROPIC_BASE_URL, направленного на LLM-шлюз, поиск инструментов включен по умолчанию начиная с версии v2.1.304; в старых версиях он был там отключен, если вы не активировали его вручную. Используйте ENABLE_TOOL_SEARCH для управления этой функцией: false загружает все схемы при старте, true откладывает их загрузку с теми же правилами выбора модели и развертывания, что и при отсутствии настройки, а auto загружает их при старте, только если они помещаются в 10% окна контекста. Сервер, настроенный с помощью "alwaysLoad": true, загружает свои инструменты при старте независимо от ENABLE_TOOL_SEARCH.
# 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. Все найденные файлы объединяются, а не переопределяют друг друга, при этом файлы, расположенные ближе к вашей рабочей директории, считываются в последнюю очередь.
Начиная с версии 2.1.277, Claude Code также считывает AGENTS.md, но по умолчанию делает это только при отсутствии CLAUDE.md, .claude/CLAUDE.md или CLAUDE.local.md в вашей рабочей директории или выше неё. Если в вашем репозитории присутствуют оба варианта, Claude считывает только файлы CLAUDE.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. Файл правил, содержащий frontmatter 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 в frontmatter, отличающееся от имени каталога, задает команду, которая отображается в меню / (если только это имя уже не занято другой командой; имя каталога при этом все равно вызывает навык).
После вызова навыка его отрендеренное содержимое добавляется в диалог как единое сообщение и остается там до конца сессии. Claude Code не перечитывает файл при последующих обращениях. Пишите постоянные инструкции, а не разовые шаги, и делайте тело навыка лаконичным, так как с этого момента каждая строка становится постоянным расходом токенов в каждом запросе. После автоматического сжатия Claude Code повторно прикрепляет последний вызов каждого навыка, сохраняя первые 5000 токенов каждого из них в рамках общего лимита в 25000 токенов. Если вызвать несколько крупных навыков за одну сессию, самые старые из них будут полностью удалены, поэтому может показаться, что навык перестал работать после долгого разговора. Вызовите его снова, и он вернется. Навык с большим количеством процедур делает этот компромисс очевидным: неленивый навык и его метод Depth Tree расходует реальный контекст на контрольные точки и файл плана взамен на агента, который перестает преждевременно объявлять работу завершенной. Если одна и та же процедура применима к нескольким кодовым базам, используйте один навык для нескольких репозиториев вместо копирования файла.
Когда вам нужен 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-сервер — это долгоживущий сервис, и ему требуется то же, что и любому другому долгоживущему сервису, начиная с отдельного пользователя. Создайте пользователя mcp, от имени которого будет работать приведенный ниже юнит, и предоставьте ему доступ к директории сервера:
sudo useradd --system --home-dir /srv/notes-mcp --shell /usr/sbin/nologin mcp
sudo chown -R mcp:mcp /srv/notes-mcp[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, чтобы каждый сервер подключался при запуске, или 1, чтобы включить кэширование. Для получения более полной картины ознакомьтесь с разделом управление контекстным окном Claude Code, где описано, что сохраняется после сжатия, а в разделе во сколько на самом деле обходятся эти токены приведен расчет стоимости в денежном выражении.
Почему мой навык никогда не срабатывает?
Обычно причина кроется в description. Это единственный текст в контексте перед запуском навыка, поэтому если он не описывает ситуацию, совпадений не будет. Впишите триггер в предложение: "Use when the user asks what changed, wants a commit message, or asks to review their diff." Расплывчатые описания приводят к молчаливому отказу, из-за чего проблему трудно заметить.
Вторая причина — опечатка во frontmatter, и в Claude Code она также проходит незаметно. Имя поля должно совпадать в точности, включая дефисы, а Claude Code игнорирует нераспознанные поля без вывода ошибки. Уведомление появляется только при упаковке навыка или его загрузке в claude.ai или Skills API, которые принимают меньше полей и сразу отклоняют остальные:
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 выполняет поиск. Начиная с версии v2.1.304, это касается и сессий, работающих через LLM-шлюз, настроенный с помощью ANTHROPIC_BASE_URL. Предварительная загрузка всё ещё происходит при использовании ENABLE_TOOL_SEARCH=false, для сервера, настроенного через "alwaysLoad": true, на моделях старше Claude Opus 4 и Sonnet 4 (старше поколения 4.5 на платформе Google Cloud Agent Platform), а также в развертываниях Microsoft Foundry, размещенных в Azure. Запустите /context, чтобы увидеть, в какой ситуации находитесь вы, так как цифры в старых сравнительных статьях основаны на предположении о предварительной загрузке.
Читает ли Claude Code файл AGENTS.md?
Да, начиная с версии v2.1.277, но по умолчанию только при отсутствии CLAUDE.md, .claude/CLAUDE.md или CLAUDE.local.md в вашем рабочем каталоге или выше него. Если в репозитории есть и то, и другое, Claude читает только файлы CLAUDE.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 не поможет, так как импортируемые файлы раскрываются и загружаются при запуске вместе с файлом, который на них ссылается. Любая многошаговая процедура, а не постоянный факт, должна быть оформлена как навык, так как тело навыка не потребляет ресурсы, пока он не вызван.