MCP tools vs resources vs prompts: что и когда использовать
Практическое сравнение MCP tools, resources и prompts: control plane, discovery, schemas, permissions, freshness, UX, тестирование и безопасный дизайн server.
Содержание статьи
- 01Короткий ответ: действие, контекст и шаблон взаимодействия — разные контракты
- 02Control plane определяет UX, но не дает authorization
- 03Tools: типизированный 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.
- Запускает выбранное пользователем повторяемое взаимодействие → prompt.
- Нужны две роли → композиция primitives с отдельными contracts.
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. Subscriptions и 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. Server проверяет URI, authorization и resource permission при каждом read. Не помещайте секрет в предсказуемый URI и не считайте, что неотображаемый элемент невозможно прочитать прямым request.
Resource подходит для context, но не гарантирует, что модель использовала или процитировала его корректно. Eval должен проверять current revision, passage support, conflict disclosure, no-answer behavior и cross-scope canary. Для часто меняющегося business fact иногда лучше read-only tool с authoritative lookup в момент запроса; для browseable документации со стабильными identifiers resource дает лучший discovery и cache contract.
- Стабильный browseable content → resource или resource template.
- Live parameterized fact → часто read-only tool.
- Subscription не заменяет revision check перед важным решением.
- Видимость URI не равна 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.
Версионируйте содержание 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 как 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.
Перед реализацией заполните короткую contract card: 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 с комбинаций capabilities: 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.
Связанные материалы
Практический выбор между обычным текстовым или structured MCP-ответом и интерактивным MCP App: критерии ценности, архитектура, безопасность, fallback, тестирование и rollout.
MCP Tasks vs синхронные tool calls: как выполнять долгие операцииПрактический выбор между обычным MCP tools/call и экспериментальными MCP Tasks для долгих операций: capability negotiation, состояния, polling, cancellation, безопасность, тесты и rollout.
Human-in-the-loop для AIПрактическая production-архитектура человеческого контроля: человек подключается в конкретной точке риска и получает достаточно контекста для реального, а не формального контроля. Материал охватывает контракты, границы полномочий, failure modes, оценивание и контролируемый rollout.