MCP Apps vs plain tool output: коли AI-інтеграції потрібен UI
Практичний вибір між звичайною текстовою або structured MCP-відповіддю та інтерактивним MCP App: критерії цінності, архітектура, безпека, fallback, тестування і rollout.
Зміст статті
- 01Коротка відповідь: UI потрібен для взаємодії, а не для прикрашання
- 02Як MCP App доповнює звичайний tool contract
- 03Матриця рішення: читання, дослідження, введення і виконання
- 04Sandbox зменшує ризик, але не створює довіру
- 05Fallback і portability проєктують до першого render
- 06Тести мають охопити протокол, доступність і наслідки
- 07Rollout: один interaction slice і явний шлях назад
Передумови
Коротка відповідь: UI потрібен для взаємодії, а не для прикрашання
Залишайте plain tool output, коли результат можна надійно прочитати, процитувати або передати наступному кроку як компактний текст чи typed data. Обирайте MCP App, коли користувачеві треба досліджувати багатовимірні дані, керувати станом форми, переглядати rich media або послідовно працювати з багатьма об’єктами. Офіційна extension дозволяє tool оголосити інтерактивний UI resource, який сумісний host показує всередині розмови.
MCP App не робить tool точнішим і не надає йому додаткових прав. Це окремий presentation та interaction layer поверх серверних capabilities. Якщо таблиця з десяти рядків і чітка рекомендація вже закривають намір, iframe, JavaScript bundle, event protocol і нова security surface лише збільшать вартість. Починайте з task analysis: яку дію людина не може зручно або безпечно завершити через звичайну відповідь?
- Коротка відповідь, citation або machine-readable handoff → plain tool result.
- Фільтри, drill-down, canvas, media controls або multi-step review → кандидат на MCP App.
- Наслідкова дія → server-side policy та explicit confirmation незалежно від UI.
- Host не підтримує extension → корисний text/structured fallback.
- Немає перевірюваної interaction benefit → не додавайте app layer.
architecture
Карта системи: MCP Apps vs plain tool output: коли AI-інтеграції потрібен UI
comparison
Критерії вибору й порівняння
Контрольна теза з матеріалу статті.
Контрольна теза з матеріалу статті.
Контрольна теза з матеріалу статті.
Контрольна теза з матеріалу статті.
Контрольна теза з матеріалу статті.
Як MCP App доповнює звичайний tool contract
У базовому патерні tool definition містить `_meta.ui.resourceUri`, що посилається на `ui://` resource. Host отримує HTML resource, зазвичай рендерить його в sandboxed iframe і передає tool result у view. UI та host спілкуються через JSON-RPC поверх `postMessage`: app може отримувати результати, просити host викликати дозволений server tool або оновити model context. Сам tool і його schema залишаються канонічним execution contract.
Розділяйте три типи стану. Authoritative domain state живе у системі-власнику; tool result є versioned snapshot або handle; ephemeral view state містить вибраний tab, фільтр чи незавершене поле. Не приховуйте єдиний ідентифікатор операції лише у браузерному state. Після refresh, повторного render або переходу на fallback користувач має відновити контекст через явний resource ID і перевірену сервером версію.
Матриця рішення: читання, дослідження, введення і виконання
Для читання одного факту, списку висновків або невеликого набору records plain output краще індексується в transcript, легше перевіряється моделлю і працює в ширшому наборі clients. Для дослідження cohort heatmap, карти, часової шкали або великої таблиці UI з локальним sort/filter зменшує повторні model calls. Проте app повинен передавати моделі лише значущі user decisions, а не кожен hover чи scroll event.
Для введення простих відсутніх параметрів достатньо host-native elicitation або наступного conversational turn. MCP App виправданий для взаємозалежних полів, live preview чи багатоетапного review. Для виконання writes UI готує exact-action proposal, але сервер повторно перевіряє identity, tenant, object version, scope і approval. Кнопка з написом «Approve» не є доказом authorization, а приховане поле з role не є trusted claim.
- Один результат і до п’яти простих полів → спершу text, structured content або native form.
- Великий набір із локальним exploration → app із bounded snapshot і provenance.
- Залежна конфігурація з preview → app, але validation дублюється на server.
- Платіж, publish, delete або production change → proposal, policy gate, idempotency і reconciliation.
- Різні client capabilities → progressive enhancement, не дві різні бізнес-логіки.
Sandbox зменшує ризик, але не створює довіру
Офіційна модель ізолює app від parent DOM, cookies і local storage host та проводить комунікацію через контрольований channel. Resource metadata може оголошувати Content Security Policy origins і запитувані permissions. Host вирішує, які capabilities надати. Отже, app має працювати з мінімальними connect, resource і permission allowlists; microphone, camera, clipboard або external navigation не слід просити про запас.
Розглядайте HTML/JavaScript resource, tool result і дані інших tools як окремі недовірені inputs. Host перевіряє resource URI, extension negotiation, message origin, method allowlist, payload size і correlation ID. Server ніколи не покладається на disabled button або client-side validation. Secrets і bearer tokens не передаються в model context чи view bundle; app викликає server tool через host, а credential boundary залишається поза iframe.
Fallback і portability проєктують до першого render
MCP Apps є opt-in extension, а підтримка залежить від host та конкретної версії. Tool повинен повертати корисний semantic result навіть коли UI не рендериться: короткий content summary для людини, `structuredContent` для client/model і стабільні identifiers для наступного call. Не повертайте лише фразу «відкрийте віджет», бо вона перетворює extension negotiation або render failure на втрату функції.
Progressive enhancement означає одну server-side business operation і кілька presentation paths. App не отримує прихований privileged endpoint, якого немає у звичайного client flow. Якщо rich interaction принципово не переноситься, визначте мінімальний fallback: read-only summary, downloadable artifact або безпечне посилання на standalone product. Analytics окремо позначає app, fallback і unsupported-host outcomes, не трактуючи render як успішно виконану бізнес-дію.
Тести мають охопити протокол, доступність і наслідки
Contract suite перевіряє tool metadata, `ui://` resource, MIME profile, initialization, tool-result delivery, message validation і коректну деградацію без extension. Browser tests покривають sandbox, CSP denial, slow bundle, refresh, duplicate event, stale snapshot, offline state і два одночасні views. Security tests намагаються викликати неоголошений tool, підмінити object ID, нав’язати зовнішній origin і повторити consequential request.
Interaction quality перевіряють keyboard-only navigation, focus order, labels, error announcement, color contrast, zoom і narrow viewport. Модельний eval окремо оцінює, чи правильно assistant обирає tool, пояснює app і використовує лише релевантні user selections. Головні product signals — task completion, correction rate, time до перевіреного outcome і fallback success; click count або render count самі по собі не доводять користі.
Rollout: один interaction slice і явний шлях назад
Оберіть один read-heavy сценарій, де UI має очевидну перевагу: наприклад, exploration витрат із фільтрами та drill-down. Зафіксуйте baseline plain-output flow, реалізуйте app як progressive enhancement і проведіть replay на однакових snapshots. Canary обмежте тестовими tenants та read-only tools; writes відкривайте після negative tests, accessibility review, policy evidence та idempotent reconciliation.
Feature flag має окремо вимикати app resource, не вимикаючи базовий tool. Rollback припиняє нові renders, повертає plain response, інвалідовує проблемний asset version і звіряє незавершені operations. Audit пов’язує server, tool, resource version, host capability, view session, user action, policy verdict і authoritative outcome без запису sensitive form fields. Після rollout видаляйте app, якщо він не покращує визначений outcome або створює неприйнятний operator burden.
Практичні приклади
Expense explorer без автономного approval
Tool повертає bounded expense snapshot, currency, generatedAt, source references і structured summary. Сумісний host показує MCP App із фільтрами, chart та drill-down; fallback показує головні anomalies і IDs. Коли користувач обирає records для review, app надсилає typed proposal. Окремий server tool повторно читає актуальні records, перевіряє tenant і version та створює review queue, але не approve payment.
FAQ
Чи MCP App замінює web application?
Не завжди. Він корисний для bounded interaction у контексті розмови. Повний продукт із власною навігацією, account lifecycle та складними workflows може залишатися окремим web app.
Чи можна покладатися лише на MCP App без text fallback?
Це звужує portability й робить render failure функціональною відмовою. Повертайте корисний semantic result і стабільні identifiers навіть для host без extension.
Чи безпечний sandboxed iframe за замовчуванням?
Sandbox є важливою межею, але host усе одно перевіряє origins, messages, capabilities й payloads, а server повторно застосовує authorization та domain policy.
Коли використовувати elicitation замість MCP App?
Для кількох відсутніх полів або простого confirmation достатньо native interaction. App доречніший для rich preview, залежних полів, navigation і повторюваного multi-item review.
Пов’язані матеріали
MCP server перетворює дані й операції системи на типізовані ресурси, промпти та інструменти. Матеріал показує, як спроєктувати вузький контракт, валідовувати запити, обмежувати повноваження і тестувати сервер незалежно від конкретної моделі.
Розробка MCP clientMCP client відкриває capabilities серверів для AI-застосунку та відповідає за discovery, consent, маршрутизацію і безпечне виконання. Розглядаємо життєвий цикл сесії, роботу зі схемами, ізоляцію результатів, сумісність і відмовостійкість.
Model Context Protocol: архітектура і безпечна інтеграціяЯк MCP стандартизує зв’язок між AI-хостом і серверами інструментів, які ролі мають host, client і server та де проходять межі довіри.
Authorization у MCPAuthorization у MCP визначає, хто й за яких умов може звертатися до захищених capabilities. Стаття пояснює OAuth-базований потік, resource indicators, audience binding, consent, захист токенів і перевірку повноважень на кожній операції.
Тестування 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, токенів і персональних даних.
Human-in-the-loop для AIHuman-in-the-loop для AI — практичний розбір production-архітектури: залучення людини в конкретній точці ризику з достатнім контекстом для реального, а не формального контролю. Матеріал охоплює контракти, межі повноважень, failure modes, оцінювання та контрольований rollout.
Tool calling і контракти інструментівЯк дозволити LLM викликати функції без передачі їй необмежених повноважень: schema, policy, idempotency, timeouts, verification і audit trail.
Custom GPT vs ChatGPT app: що створювати для свого сценаріюПрактичний вибір між custom GPT із instructions, knowledge та actions і ChatGPT app на Apps SDK/MCP: інтерфейс, інтеграція, дистрибуція, permissions, тестування й exit plan.
ChatGPT plugins vs apps vs custom GPTs: що обрати для workflowПрактичне порівняння ChatGPT plugins, connected apps і custom GPTs: роль кожного шару, permissions, MCP та Actions, rollout, тести й безпечний вибір для команди.
MCP sampling vs direct LLM API: як мігрувати після deprecationПрактичний вибір між MCP sampling і прямою інтеграцією з LLM provider API після deprecation у специфікації 2026-07-28: authority, credentials, portability, elicitation, міграція та rollback.
Джерела
- MCP Apps overview — Model Context Protocolофіційне
- MCP Apps specification 2026-01-26первинне
- MCP Apps API overviewофіційне
- MCP Extensions support matrixофіційне