MCP tools vs resources vs prompts: що і коли використовувати
Практичне порівняння MCP tools, resources і prompts: control plane, discovery, schemas, permissions, freshness, UX, тестування та безпечний вибір primitive для MCP server.
Зміст статті
- 01Коротка відповідь: дія, контекст і шаблон взаємодії — різні контракти
- 02Control plane визначає UX, але не надає authorization
- 03Tools: typed operation contract із найвищим authority risk
- 04Resources: URI, freshness і context budget мають бути явними
- 05Prompts: reusable workflow із видимими arguments, не policy boundary
- 06Decision matrix і anti-patterns для одного доменного workflow
- 07Contract tests, canary rollout і rollback
Передумови
Коротка відповідь: дія, контекст і шаблон взаємодії — різні контракти
MCP tool описує операцію, яку модель може запропонувати викликати з типізованими аргументами: знайти замовлення, обчислити тариф або створити чернетку. Resource надає контекст, який host application може прочитати за URI й додати до розмови: файл, schema, довідник або snapshot. Prompt є параметризованим шаблоном повідомлень, який користувач свідомо обирає для повторюваного workflow. Це не три способи опублікувати одну функцію, а три різні control planes.
Вибирайте primitive за власником наступного кроку. Якщо потрібна зовнішня операція або authoritative lookup з runtime parameters — tool. Якщо користувач чи application має вибрати й прочитати матеріал як контекст — resource. Якщо продукту потрібна видима стартова команда з аргументами й підготовленими messages — prompt. Один server може мати всі три: prompt формує task, resource додає policy, tool виконує дозволений lookup. Prompt або resource не повинні маскувати side effect, а tool не варто використовувати лише для передачі статичного тексту.
- Змінює або обчислює стан за runtime input → tool.
- Надає адресований content для context → resource.
- Запускає user-selected reusable interaction → prompt.
- Потребує двох ролей → композиція primitives із окремими contracts.
architecture
Карта системи: MCP tools vs resources vs prompts: що і коли використовувати
comparison
Критерії вибору й порівняння
Контрольна теза з матеріалу статті.
Контрольна теза з матеріалу статті.
Контрольна теза з матеріалу статті.
Контрольна теза з матеріалу статті.
Resources: URI, freshness і context budget мають бути явними
Resource має унікальний URI й може містити text або binary content із MIME type. Resource templates публікують параметризовані URI, а optional completion допомагає підібрати argument. Client спочатку робить resources/list або templates/list, а потім resources/read. Підписки й listChanged є окремими optional capabilities; сам факт підтримки resources не означає automatic refresh.
Для production додайте source owner, data classification, revision або lastModified, allowed audience, size budget і cache policy. Annotations `audience`, `priority` та `lastModified` є hints для client, а не access-control decisions. Server перевіряє URI, authorization і resource permission на кожне read. Не вкладайте секрет у передбачуваний URI й не припускайте, що невідображений елемент неможливо прочитати прямим request.
Resource підходить для context, але не гарантує, що модель його використала або процитувала правильно. Eval має перевіряти current revision, passage support, conflict disclosure, no-answer behavior і cross-scope canary. Для frequently changing business fact іноді кращий read-only tool, який робить authoritative lookup у момент запиту; для browseable документації зі стабільними identifiers resource дає кращий discovery та cache contract.
- Stable browseable content → resource або resource template.
- Live parameterized fact → часто read-only tool.
- Subscription не замінює revision check перед важливим рішенням.
- URI visibility не дорівнює permission.
Prompts: reusable workflow із видимими arguments, не policy boundary
Prompt definition має name, optional title і description та список arguments. prompts/get повертає description і messages, куди server підставляє перевірені arguments. Messages можуть містити text, image, audio або embedded resource. Хороший prompt пояснює outcome й очікувані inputs: `review_incident` із incident ID і review depth корисніший за нечіткий `analyze`.
Prompt зручний для discoverable slash-command, onboarding або стандартизованої послідовності аналізу. Він не є server-side automation і не гарантує виконання інструкцій моделлю. Не вставляйте hidden approval, credential чи незворотну дію в template. Якщо workflow потребує tool, prompt може підготувати messages і попросити аналіз, але client усе одно застосовує tool policy, а server повторно авторизує call.
Versionуйте зміст template або принаймні зберігайте hash у evaluation evidence. listChanged повідомляє, що каталог змінився, але активна розмова могла вже включити старі messages. Regression set має перевіряти argument escaping, prompt injection у user-provided field, відсутні arguments, locale, embedded-resource permissions і поведінку після зміни template.
Decision matrix і anti-patterns для одного доменного workflow
Уявімо support server. `support://policies/refunds/2026-09` — resource, бо це versioned policy content для читання. `draft_refund_review` — prompt, бо користувач обирає повторюваний review template з ticket ID. `tickets.get` і `refunds.create_draft` — tools, бо вони роблять runtime lookup та створюють контрольований draft. Остаточний `refunds.submit` варто відокремити з сильнішим scope і confirmation. Така композиція робить source, reasoning workflow і authority видимими окремо.
Поширені помилки: опублікувати кожний database row як tool; заховати write request у resource URI; повертати stale policy через tool без revision; використати prompt як system policy; дублювати однаковий content у prompt, resource і tool description; оголосити один mega-tool для всіх API. Вони погіршують discovery, збільшують context, розмивають permissions і роблять eval нездатним локалізувати failure.
Перед реалізацією заповніть коротку картку: user outcome, controller, data owner, freshness, input/output shape, side effects, permission check, audit event, failure semantics, context cost і rollback. Якщо дві сутності мають різні authority або lifecycle, дайте їм різні primitives навіть тоді, коли backend endpoint спільний.
- Context failure → перевірте resource revision і selection.
- Instruction failure → перевірте prompt version і argument handling.
- Execution failure → перевірте tool schema, policy, effect і reconciliation.
- Змішаний failure → збережіть окремі receipts для кожної межі.
Contract tests, canary rollout і rollback
Contract suite починайте з capability combinations: server із кожною primitive окремо, усіма трьома та зі змінами catalog. Перевірте pagination, unknown names/URI, invalid arguments, MIME handling, structured output, listChanged і resource subscription лише там, де capability оголошена. Negative security cases підміняють tenant, target, URI, prompt argument і tool result; додають indirect injection у resource та повторюють write після ambiguous timeout.
Проведіть end-to-end eval на synthetic support case: користувач обирає prompt, client читає конкретну policy revision, model пропонує read tool, а write draft проходить окреме confirmation. Evidence pack містить protocol version, capability manifest, catalog hashes, resource revision, rendered prompt, tool inputs/results, approval receipt, final state і reviewer verdict. Це дозволяє визначити, яка межа зламалась, не покладаючись на fluent final answer.
Rollout почніть з одного read-only resource, одного prompt і одного read-only tool. Після перевірки scope та audit додайте reversible draft write; irreversible action залишайте поза model authority до окремого approval contract. Rollback вимикає affected capability або tool, відкликає scope, pin-ить останню перевірену resource/prompt revision і зберігає read-only diagnostics. Повторна активація потребує regression для зміненого primitive та всієї композиції, яку він живить.
- Hard gate → cross-tenant read, hidden side effect або unauthorized write.
- Quality gate → stale revision, unsupported claim або ambiguous prompt outcome.
- Compatibility gate → advertised capability не відповідає method behavior.
- Recovery gate → retry не дублює effect і не губить audit chain.
Практичні приклади
Support workflow із трьома primitives
Користувач запускає prompt для review ticket. Client читає versioned refund-policy resource. Модель викликає read-only ticket tool, готує висновок і лише після окремого confirmation викликає create-draft tool. Evidence зберігає revisions і receipts на кожній межі.
Коли resource краще за tool
Server публікує каталог versioned API schemas як resource templates. Host дає користувачу picker і кешує незмінні revisions. Tool знадобиться лише для live schema validation проти конкретного deployment, а не для повторної передачі статичного документа.
FAQ
У чому головна різниця між MCP tools, resources і prompts?
Tool є model-controlled operation, resource — application-managed context за URI, prompt — user-selected reusable message template. Конкретний client визначає UI, але authority та permission завжди перевіряються окремо.
Чи може tool повертати resource?
Так. Tool result може містити embedded resource або resource link. Проте виклик лишається operation contract із inputs, errors і audit, а resource зберігає власні URI, permission та freshness semantics.
Коли для читання даних обрати tool, а коли resource?
Resource підходить для browseable, адресованого й часто versioned content. Read-only tool кращий для live parameterized lookup, де результат залежить від runtime input, authorization та authoritative current state.
Чи prompt може автоматично схвалити tool call?
Ні. Запуск prompt не є authorization на наступну дію. Client застосовує confirmation policy, а server перевіряє identity, scope, target і state під час кожного consequential tool call.
Пов’язані матеріали
Як MCP стандартизує зв’язок між AI-хостом і серверами інструментів, які ролі мають host, client і server та де проходять межі довіри.
Розробка MCP serverMCP server перетворює дані й операції системи на типізовані ресурси, промпти та інструменти. Матеріал показує, як спроєктувати вузький контракт, валідовувати запити, обмежувати повноваження і тестувати сервер незалежно від конкретної моделі.
Розробка MCP clientMCP client відкриває capabilities серверів для AI-застосунку та відповідає за discovery, consent, маршрутизацію і безпечне виконання. Розглядаємо життєвий цикл сесії, роботу зі схемами, ізоляцію результатів, сумісність і відмовостійкість.
Tool calling і контракти інструментівЯк дозволити LLM викликати функції без передачі їй необмежених повноважень: schema, policy, idempotency, timeouts, verification і audit trail.
MCP security checklist: як безпечно запустити server і clientПрактичний security checklist для Model Context Protocol: trust boundaries, OAuth, token audience, SSRF, session binding, tool permissions, local-server sandbox, негативні тести, audit evidence і rollback.
Тестування MCP-інтеграційТестування MCP-інтеграцій має перевіряти не лише happy path, а й negotiation, schema compatibility, authorization, недовірені результати та невизначені side effects. Будуємо багаторівневу стратегію від unit-тестів до end-to-end eval.
Observability для MCPObservability для MCP пов’язує protocol session, запит моделі, tool call, policy-рішення і downstream effect. Матеріал визначає корисні метрики, безпечні traces, кореляцію помилок, SLO та діагностику без витоку prompt, токенів і персональних даних.
MCP Apps vs plain tool output: коли AI-інтеграції потрібен UIПрактичний вибір між звичайною текстовою або structured MCP-відповіддю та інтерактивним MCP App: критерії цінності, архітектура, безпека, fallback, тестування і rollout.
MCP Tasks vs synchronous tool calls: як виконувати довгі операціїПрактичний вибір між звичайним MCP tools/call і експериментальними MCP Tasks для довгих операцій: capability negotiation, стани, polling, cancellation, безпека, тести та rollout.
Human-in-the-loop для AIHuman-in-the-loop для AI — практичний розбір production-архітектури: залучення людини в конкретній точці ризику з достатнім контекстом для реального, а не формального контролю. Матеріал охоплює контракти, межі повноважень, failure modes, оцінювання та контрольований rollout.
Retries, rate limits та idempotencyЯк повторювати тимчасові збої без retry storm, обробляти 429, використовувати exponential backoff, jitter, retry budget та idempotency keys для безпечних операцій.