SSD Nodes Learn 🎉 VPS від $5.50/міс
Посібники Matt ConnorВід Matt Connor · Оновлено 2026-08-13

Skills агентів, MCP-сервери чи rules-файли: що обрати

Порівняйте skills, MCP-сервери й rules-файли: коли кожен механізм завантажує контекст, скільки токенів і супроводу він потребує та що обрати.

Порівняння skills агентів, MCP-серверів і rules-файлів: коротка відповідь

Agent skills, MCP-сервери та rules-файли надають coding agent потрібні знання. Вибір залежить від призначення цих знань. MCP (model context protocol) призначений для даних, які можуть змінитися до наступного звернення. Skill призначений для процедури, яку можна описати сьогодні, і яка залишатиметься правильною через шість тижнів. Rules-файл призначений для кількох фактів, які мають виконуватися в кожному сеансі.

Такий вибір має свою ціну — контекст. Кожен токен, витрачений на інструкцію, яка не була потрібна агенту, недоступний для коду, який він читає. Крім того, ви платите за цей токен під час кожного наступного запиту, оскільки все контекстне вікно надсилається повторно. Тому корисно запитувати не про те, який механізм може виконати завдання. У більшості випадків це можуть усі три. Потрібно визначити, який механізм має найменшу вартість, коли він простоює.

Що саме споживає контекст до початку використання

Три механізми завантажуються в різні моменти. Саме час завантаження визначає головну відмінність між ними.

Файл правил повністю завантажується під час запуску в кожній сесії, незалежно від його актуальності. Claude Code читає CLAUDE.md на початку кожної розмови та завантажує його повністю незалежно від довжини. Рекомендований розмір — до 200 рядків на файл, оскільки довший файл споживає більше контексту і гірше виконується. Обидва ефекти діють в одному напрямку, тому файл правил на 900 рядків гірший, ніж його відсутність.

Skill завантажується у два етапи. Під час запуску до контексту потрапляє лише рядок description із frontmatter кожного SKILL.md, тому модель знає про наявність skill і приблизно розуміє, коли його застосовувати. Тіло завантажується після виклику skill. Тому довідковий документ на 400 рядків майже не споживає ресурсів, доки не знадобиться.

Раніше MCP server був найдорожчим варіантом. Саме тут більшість порівнянь, які ви зараз читаєте, вже застаріла. У сучасному Claude Code пошук інструментів увімкнено за замовчуванням. На початку сесії завантажуються лише назви інструментів і поле instructions сервера. Повні JSON-схеми (JavaScript object notation) завантажуються лише після пошуку Claude потрібних інструментів. Додавання сервера більше не коштує тисяч токенів на початку сесії. Певні витрати все одно є, а в конфігураціях із вимкненим пошуком інструментів завантажується все одразу.

ChartStartup and post-use context cost, estimated tokens
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"
  }
]

Це оцінки, а не вимірювання на вашій машині. Вони ґрунтуються на розмірі тексту, який завантажує кожен механізм, із розрахунку приблизно 4 символи на токен: файл правил на 200 рядків містить близько 10 KB markdown, опис skill — близько 160 символів, а сервер із дванадцятьма інструментами має близько 18 KB схем і блок instructions розміром 2 KB. Claude Code обмежує опис кожного інструмента та поле instructions кожного сервера розміром 2 KB, тому ця частина має верхню межу. У наступному розділі показано, як отримати власні фактичні значення.

Читайте перші два рядки разом. Файл правил споживає 2,500 токенів у сесії, де він нікому не знадобився. Skill у тій самій сесії споживає 40 токенів, а в одній сесії з десяти, де він запускається, — 3,000. Останні два рядки описують той самий сервер двічі: з увімкненим і вимкненим пошуком інструментів: 500 токенів проти 4,500. Саме через цю різницю досі поширюються старі твердження про надмірне споживання контексту MCP.

Для пошуку інструментів потрібна модель, що підтримує блоки tool_reference. Станом на August 2026 це Claude Sonnet 4.5, Haiku 4.5, Opus 4.5 і новіші моделі. Claude Code вимикає цю функцію, коли ANTHROPIC_BASE_URL вказує на host, який не є first party, оскільки більшість проксі не передає такі блоки. Встановіть 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

Визначальне питання: чи змінюються дані між викликами?

Поставте це питання першим, оскільки воно одразу виключає один із варіантів. Якщо агенту потрібно читати або записувати дані, які можуть відрізнятися під час наступної перевірки, потрібен сервер. Це може бути issue tracker, база даних, dashboard моніторингу або власний внутрішній API (application programming interface). Записати ці дані недостатньо, оскільки запис застаріє одразу після того, як хтось інший змінить відповідний запис.

Якщо відповідь залишатиметься правильною через шість тижнів без обслуговування, потрібен skill. Наприклад, checklist випуску, процедура міграції, структура відповідей із помилками або правила написання тестів для цього repository. Skill — це файл у git. Він не має порту, процесу чи іншого способу відмови, окрім неправильного вмісту, що може виявити code review.

Якщо це один факт, який має застосовуватися до роботи, про яку ви ще не думали, додайте його до rules file. Run make lint before committing. Never push to main. Handlers live in src/api/handlers/. По одному рядку на кожен факт. Щойно запис розростається до послідовності кроків, це вже не факт, а процедура, і його слід перенести до skill.

Коли достатньо файлу правил

Файли правил завантажуються з кількох місць — від найзагальнішого до найспецифічнішого: керованого файлу політик, вашого особистого ~/.claude/CLAUDE.md, ./CLAUDE.md або ./.claude/CLAUDE.md проєкту та файлу ./CLAUDE.local.md, який ігнорується Git. Усі знайдені файли об’єднуються, а не перевизначають один одного. Файли ближче до робочого каталогу читаються останніми.

Claude Code читає CLAUDE.md, а не AGENTS.md. Якщо у вашому репозиторії вже є AGENTS.md для інших інструментів, не підтримуйте дві копії, які з часом розходитимуться.

ln -s AGENTS.md CLAUDE.md

У разі успіху symlink нічого не виводить. Запустіть сесію, виконайте /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

Skill — це каталог із файлом SKILL.md. Персональні skills зберігаються в ~/.claude/skills/<name>/SKILL.md і застосовуються до кожного проєкту на вашому комп’ютері. Проєктні skills зберігаються в .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 — єдина частина цього файлу, яка потрапляє в контекст до запуску skill, тому вона виконує дві функції. У ній зазначено, що робить skill і коли його слід застосовувати. Опис на кшталт «Допомагає з деплоями» не дає моделі достатньо інформації, щоб зіставити skill із запитом. У результаті skill непомітно не запускається, і ви робите висновок, що skills не працюють.

Назва каталогу стає командою, тому наведений вище приклад дає вам /summarize-changes. У персональному або проєктному skill поле frontmatter name задає лише відображувану мітку в списках.

Після виклику skill його відрендерений вміст додається до розмови одним повідомленням і залишається там до кінця сеансу. Claude Code не перечитує файл під час наступних повідомлень. Записуйте постійні інструкції, а не одноразові кроки, і тримайте основний текст стислим, оскільки після цього кожен його рядок створює постійні витрати під час кожного запиту. Після автоматичної компактизації Claude Code повторно додає останній виклик кожного skill, зберігаючи перші 5,000 токенів кожного в межах спільного бюджету 25,000 токенів. Якщо за один сеанс викликати кілька великих skills, найстаріші буде повністю вилучено. Через це може здаватися, що skill перестав діяти після тривалої розмови. Викличте його ще раз, і він повернеться. Якщо та сама процедура застосовується до кількох codebase, використовуйте один 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 server він відокремлює власні параметри Claude Code від командного рядка, який запускає ваш server. Якщо його пропустити, --port 8080, призначений для server, буде розібрано як параметр claude mcp add, після чого claude mcp add відхилить його.

claude mcp list
claude mcp get notion

claude mcp add підтверджує операцію рядком Added .... Це лише означає, що конфігурацію записано на диск. claude mcp list — команда, яка показує фактичний стан, оскільки виводить статус працездатності поруч із кожним server: ✔ Connected, ! Needs authentication або ✘ Failed to connect. Статус помилки означає, що Claude Code не зміг підключитися до цього server, а не те, що команда перегляду списку не виконалася. У межах сеансу /mcp показує той самий стан для кожного server і кількість інструментів.

Кожен виклик MCP server є окремим і містить усе необхідне. Саме тому MCP server не пам’ятає ваш попередній запит. Це конструктивне рішення має наслідок, за який відповідаєте ви: будь-який стан, який потрібно зберігати, має міститися за межами 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.target
sudo systemctl daemon-reload
sudo systemctl enable --now notes-mcp
systemctl is-active notes-mcp
journalctl -u notes-mcp -n 50 --no-pager

systemctl is-active має вивести active. Якщо він виводить failed, причина міститься в журналі, а під час першого запуску це майже завжди відсутня змінна середовища або порт, який уже зайнятий іншим процесом. Restart=on-failure тут не є необов’язковим, оскільки MCP-сервер після аварійного завершення не повідомляє про це. Ви дізнаєтеся про проблему лише тоді, коли агент повідомить, що не може прочитати ваш issue tracker.

Прив’яжіть процес до 127.0.0.1 і розмістіть перед ним reverse proxy з TLS (безпекою транспортного рівня). MCP-сервер, який має доступ до вашої бази даних і відповідає на публічному порту без автентифікації, — це опублікована в мережі база даних. У матеріалі Запуск MCP-сервера на VPS належно описано reverse proxy, сертифікат і налаштування firewall.

Потім чесно оцініть регулярні роботи з обслуговування. Сервіс отримує оновлення безпеки за власним графіком, незалежним від агента, який із ним взаємодіє. Термін дії його OAuth-токена спливає, і claude mcp list починає виводити ! Needs authentication у найневдаліший момент. Його облікові дані зберігаються у файлі конфігурації або в заголовку Authorization, тому з ними потрібно поводитися так само обережно, як і з будь-яким іншим секретом. Це окрема велика тема: Як не допустити доступу AI-агента до секретів. Для skill жодна з цих робіт не потрібна.

Перш ніж створювати сервер, порівняйте його з альтернативою. Якщо дані за запропонованим сервером змінюються приблизно раз на квартал, skill, який вказує агенту, де шукати дані та що означають їхні поля, буде дешевшим за сервіс, який потрібно постійно підтримувати в роботі.

Як виміряти вартість власного контексту

Не оцінюйте навмання — запустіть /context у межах сесії. Команда виводить розподіл контексту під час запуску: системний prompt, файли пам’яті, інструменти та MCP servers із token weight кожного елемента.

Перевірте дві речі. У розділі Memory files переконайтеся, що в списку є всі очікувані файли правил. Агент не бачить відсутній файл, тому це перше, що потрібно перевірити, якщо інструкції ігноруються. Потім подивіться, скільки коштують ваші servers. Якщо server, яким ви користуєтеся двічі на місяць, є одним із найбільших рядків у цьому списку, вимкніть його в /mcp і знову ввімкніть для сесій, у яких він потрібен. Конфігурація в будь-якому разі зберігається.

Remote server також може повідомити статус на кшталт cached 2h ago · connects on first use · 5 tools. Це означає, що Claude Code прочитав список інструментів із попередньої сесії, не підключаючись під час запуску, і підключиться під час першого виклику інструмента. Інструменти доступні вже з першого повідомлення, тому нічого виправляти не потрібно. Установіть MCP_DISCOVERY_CACHE=0, якщо потрібно, щоб кожен server підключався під час запуску. Докладніше про це розповідає матеріал керування вікном контексту Claude Code: у ньому описано, що зберігається після compaction, а матеріал скільки насправді коштують вам ці токени допомагає перевести ці числа в гроші.

Чому мій skill ніколи не активується?

Зазвичай причина — description. Це єдиний текст у контексті перед запуском skill, тому якщо в ньому не названо ситуацію, збіг не відбувається. Додайте умову активації безпосередньо в речення: «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

Третя причина — розташування. Project skills завантажуються з .claude/skills/ у робочому каталозі та в кожному батьківському каталозі аж до кореня репозиторію. 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 server, інколи два, підключає системи, вміст яких неможливо передбачити заздалегідь. Якщо ви ще формуєте уявлення про перший із цих механізмів, у матеріалі докладно описано, що насправді таке навичка агента її формат.

Більшість суперечок про те, де щось має розміщуватися, вирішує один тест. Видаліть це, почніть нову сесію та доручіть агенту виконати завдання. Якщо агент лише працює повільніше, це мало бути в skill. Якщо агент упевнено дає неправильну відповідь, це мало бути у файлі правил. Якщо агент взагалі не може отримати потрібну інформацію, вам потрібен server, а разом із ним — план його підтримки в робочому стані.

FAQ

Чи варто створити skill або розгорнути MCP server?

Визначайте це за тим, чи змінюється інформація між послідовними викликами. Якщо агент має читати актуальний стан, який може змінювати хтось інший, наприклад issue tracker, базу даних або dashboard, потрібен MCP server, оскільки будь-який запис застаріває одразу після зміни даних. Якщо відповідь можна записати один раз і вона залишатиметься правильною через шість тижнів, створіть skill. Skill є файлом у git. Для нього не потрібен процес, який треба запускати, порт, який треба відкривати, або графік випуску патчів. Тому це дешевший варіант, якщо його взагалі можна застосувати.

Чи MCP servers і далі заповнюють моє контекстне вікно?

Значно менше, ніж раніше. У сучасному Claude Code за замовчуванням увімкнено пошук інструментів, тому на початку сеансу завантажуються лише назви інструментів і поле інструкцій server. Повні схеми отримуються, коли Claude виконує пошук. Попереднє завантаження все ще відбувається, якщо пошук інструментів вимкнено: за допомогою ENABLE_TOOL_SEARCH=false, якщо ANTHROPIC_BASE_URL вказує на proxy, який не є first-party, або під час роботи з моделлю, старшою за покоління Claude 4.5. Виконайте /context, щоб визначити, яка ситуація у вас, оскільки числа в старіших порівняльних публікаціях передбачають попереднє завантаження.

Чи Claude Code читає AGENTS.md?

Ні. Claude Code читає CLAUDE.md. Якщо у вашому репозиторії вже є AGENTS.md для інших агентів, вкажіть один файл на інший, а не зберігайте дві копії. Виконайте ln -s AGENTS.md CLAUDE.md для звичайного symlink або додайте @AGENTS.md у перший рядок CLAUDE.md, а нижче додайте інструкції для Claude. Потім почніть сеанс і виконайте /context, щоб переконатися, що CLAUDE.md відображається в розділі Memory files.

Чому мій skill перестав діяти в середині сеансу?

Зазвичай причина полягає в автоматичній компактизації контексту. Коли розмову узагальнено, Claude Code повторно додає останній виклик кожного skill. Для кожного з них зберігаються перші 5,000 токенів, а загальний ліміт для всіх skill становить 25,000 токенів. Ліміт заповнюється, починаючи з skill, який викликали найпізніше. Тому якщо ви викликали кілька великих skill, старіші повністю вилучаються. Викличте skill ще раз, щоб відновити його повний вміст.

Як не завантажувати довгий файл правил у кожному сеансі?

Перемістіть частини, які потрібні лише інколи, у файли .claude/rules/ із полем paths у frontmatter. Тоді кожен файл завантажуватиметься лише за умови, що агент працює з відповідним файлом. Поділ файлу на імпорти @path не допоможе, оскільки імпортовані файли розгортаються та завантажуються під час запуску разом із файлом, який на них посилається. Будь-яка багатоетапна процедура, а не постійний факт, має стати skill. Вміст skill не споживає ресурси, доки його не викликано.