Перейти до основного вмісту
Просунутий8 хв1345 слів

MCP Tasks vs synchronous tool calls: як виконувати довгі операції

Практичний вибір між звичайним MCP tools/call і експериментальними MCP Tasks для довгих операцій: capability negotiation, стани, polling, cancellation, безпека, тести та rollout.

Зміст статті
  1. 01Коротка відповідь: Task потрібен для durable execution, а не для кожного повільного tool
  2. 02Два рівні negotiation захищають від уявної сумісності
  3. 03Task state machine не замінює стан бізнес-операції
  4. 04Polling, progress і backoff мають bounded budget
  5. 05Authorization прив'язує Task до контексту, а не лише до складного ID
  6. 06Тестова матриця перевіряє переходи, повтори й невизначений результат
  7. 07Rollout: experimental adapter, вузький canary і перевірений fallback

Передумови

Коротка відповідь: Task потрібен для durable execution, а не для кожного повільного tool

Залишайте звичайний tools/call, коли операція вкладається у bounded request timeout, результат можна повернути одразу, а розрив з'єднання не вимагає окремого відновлення. Розглядайте MCP Task, коли робота триває довго, має пережити один request, потребує polling, deferred result, cancellation або проміжного input_required. У специфікації MCP 2025-11-25 Tasks входять до протоколу, але позначені experimental: це причина ізолювати функцію за capability gate, а не вважати її універсальним baseline.

Task не є чергою, workflow engine чи гарантією exactly-once. Він стандартизує видиму клієнту оболонку тривалої операції: receiver створює task ID, повідомляє стан, а requestor перевіряє status і забирає результат. Business operation усе одно потребує власного operation ID, authorization, idempotency, durable state та reconciliation із системою-власником. Якщо процес можна безпечно завершити за один короткий call, Task лише додає стани та cleanup.

  • Коротке читання або bounded compute → звичайний tools/call.
  • Тривала робота з deferred result → кандидат на Task.
  • Потрібне додаткове рішення користувача → Task зі станом input_required.
  • Наслідкова дія → domain operation ledger незалежно від protocol wrapper.
  • Peer не оголосив capability → не надсилайте task augmentation.

architecture

Карта системи: MCP Tasks vs synchronous tool calls: як виконувати довгі операції

Схема побудована з ключових секцій статті та показує послідовність або архітектурні блоки, які потрібно опрацювати.

comparison

Критерії вибору й порівняння

Візуалізація використовує тези, приклади та наступні кроки статті як перевірювані контрольні точки, а не декоративні елементи.

Два рівні negotiation захищають від уявної сумісності

Підтримка Tasks узгоджується під час initialization. Для task-augmented tool call server оголошує tasks.requests.tools.call; без цієї capability client не повинен запускати tool як Task. Далі конкретний tool уточнює execution.taskSupport: forbidden є default, optional дозволяє обидва режими, required вимагає Task. Перевіряйте обидва рівні на кожній сесії та не кешуйте висновок лише за назвою server або версією SDK.

Створіть capability manifest із protocol version, server implementation version, session evidence, task operations list/get/result/cancel і tool-level mode. Router порівнює manifest із вимогами workflow до першого виклику. Якщо потрібна функція відсутня, fallback має бути явним: короткий synchronous path, окремий job API, human handoff або контрольована відмова. Мовчазне перетворення required Task на довгий HTTP request створює іншу timeout і recovery semantics.

Task state machine не замінює стан бізнес-операції

MCP Task починається у working і може перейти в input_required, completed, failed або cancelled за дозволеними переходами специфікації. taskId генерує receiver; TTL визначає, коли запис може бути видалений; pollInterval підказує частоту перевірки. requestor отримує фактичний результат через tasks/result лише після terminal completion. Збережіть last observed status, lastUpdatedAt, correlation ID і наступний дозволений poll, щоб reconnect не починав роботу заново.

Паралельно ведіть DomainOperation зі стабільним idempotency key, actor, tenant, object version, intended effect, downstream receipt і authoritative outcome. completed у Task означає, що protocol result готовий, але не доводить, що зовнішня система прийняла платіж, publish або deployment. cancelled також не гарантує компенсацію вже виконаного effect. UI показує окремо transport/task state і підтверджений domain outcome, а unknown outcome спрямовує на reconciliation до retry.

  • Task state → що повідомляє receiver про виконання request.
  • Domain state → що підтверджує system of record про бізнес-наслідок.
  • Cancellation → запит зупинити подальшу роботу, не автоматичний rollback.
  • TTL expiry → lifecycle protocol record, не право забути audit evidence.

Polling, progress і backoff мають bounded budget

Client поважає pollInterval, додає jitter, обмежує загальну тривалість і припиняє polling після terminal state. Частий poll не прискорює job, але збільшує навантаження та ризик rate limit. Progress notification може покращувати UX, проте не скидає абсолютний deadline безмежно. Після network loss client відновлює спостереження за відомим taskId, а не повторює originating tool call.

Визначте окремі бюджети для create, status reads, result retrieval і business reconciliation. Зберігайте лише мінімально необхідний response envelope: status, version, timestamps, sanitized message та evidence handles. Помилка tasks/get може означати expiry, authorization failure або server loss; вона не перетворює unknown domain outcome на failed. Для великих artifacts result краще повертати bounded metadata та авторизоване посилання, а не необмежений payload у model context.

Authorization прив'язує Task до контексту, а не лише до складного ID

Специфікація вимагає прив'язувати Tasks до authorization context, коли він доступний. tasks/get, list, result і cancel повторно перевіряють actor, tenant та дозволену operation; знання taskId саме по собі не є permission. Якщо peer не може ідентифікувати requestor, потрібні криптографічно непередбачувані IDs, коротший TTL і обмеження discovery; server без надійного context binding не повинен відкривати task listing.

Не записуйте token, sensitive elicitation data або повний downstream result у statusMessage чи logs. URL mode elicitation корисна для out-of-band credential або payment flow, але accept означає лише згоду перейти за URL, а не завершення зовнішньої дії. Для input_required фіксуйте requested field class, expiry і redaction rule; після зміни identity чи відкликання scope продовження Task проходить authorization заново.

Тестова матриця перевіряє переходи, повтори й невизначений результат

Contract suite покриває initialize, відсутню capability, кожне значення taskSupport, create, get, list, result, cancel, invalid transition, expired TTL і pagination. Fault injection розриває transport до та після CreateTaskResult, між completed і result retrieval, під час input_required і після cancel request. Assertions перевіряють, що originating call не повторюється автоматично, status переходить лише дозволеним шляхом, а duplicate delivery не створює другий domain effect.

Security cases намагаються прочитати або скасувати Task іншого tenant, вгадати ID, отримати result після втрати scope, підмінити related-task metadata і вставити prompt injection у status чи result. Load test вимірює bounded concurrent jobs, polling amplification, cleanup і backpressure на downstream. Model-in-the-loop eval потрібен лише там, де модель вирішує запустити tool або інтерпретує result; protocol conformance і authorization лишаються deterministic gates.

  • Hard gate → cross-tenant access, invalid transition, duplicate effect або secret leakage.
  • Recovery gate → reconnect продовжує відомий Task без повторного start.
  • Cancellation gate → terminal semantics і domain reconciliation перевірені окремо.
  • Compatibility gate → fallback працює з peer без Tasks capability.

Rollout: experimental adapter, вузький canary і перевірений fallback

Почніть з одного read-only або reversible workflow, де Task дає вимірювану operational benefit: переживає request timeout, зменшує ручне відновлення або робить довгу операцію спостережуваною. Зафіксуйте protocol і SDK versions, capability manifest, allowed tools, max TTL, concurrency, status retention, owners та kill switch. Shadow mode може порівняти state projection із чинним job API, але не запускає бізнес-операцію двічі.

Canary просувають лише після contract, security, load і recovery gates. Rollback блокує нові task-augmented starts, залишає watcher для вже створених Tasks, reconcile-ить in-flight domain operations і повертає перевірений synchronous або job-API path. Retest запускають після зміни MCP specification, task experimental status, SDK, transition schema, authorization context, transport або downstream idempotency. Це локальний verdict для конкретної сумісності, а не твердження, що Tasks кращі для всіх MCP server.

Практичні приклади

Довгий export із безпечним відновленням

Tool створює read-only export і повертає Task. Client зберігає taskId та domain exportId, polling робить за рекомендованим інтервалом, а після completed отримує manifest із checksum і короткоживучим download handle. Розрив мережі відновлює polling; він не створює другий export.

Deployment, де cancelled не означає rolled back

Task обгортає deployment job. Cancel зупиняє наступні кроки, але controller окремо перевіряє, чи застосовано частину змін. UI показує cancelled task і reconciliation_required domain outcome, доки system of record не підтвердить rollback або стабільний release.

FAQ

Чи MCP Tasks уже стабільні для production?

Tasks описані у версії MCP 2025-11-25, але сама специфікація позначає їх experimental. Використовуйте explicit capability negotiation, pinned compatibility, canary і fallback; перевіряйте актуальний статус перед rollout.

Чи Task робить tools/call асинхронним автоматично?

Ні. Server і конкретний tool мають оголосити підтримку, а receiver повинен реалізувати durable execution, status, result, cancellation, authorization і cleanup.

Коли краще залишити власний job API?

Коли клієнти не підтримують Tasks, workflow потребує багатшої orchestration semantics або чинний job API вже має необхідні SLA, audit і recovery. MCP Task може бути adapter до нього, а не заміною.

Чи можна повторити tools/call, якщо create response загубився?

Не сліпо. Спочатку reconcile за client operation ID або idempotency key. Інакше загублена відповідь після успішного start може створити дубльовану операцію.

Пов’язані матеріали

Model Context Protocol: архітектура і безпечна інтеграція

Як MCP стандартизує зв’язок між AI-хостом і серверами інструментів, які ролі мають host, client і server та де проходять межі довіри.

Тестування MCP-інтеграцій

Тестування MCP-інтеграцій має перевіряти не лише happy path, а й negotiation, schema compatibility, authorization, недовірені результати та невизначені side effects. Будуємо багаторівневу стратегію від unit-тестів до end-to-end eval.

Observability для MCP

Observability для MCP пов’язує protocol session, запит моделі, tool call, policy-рішення і downstream effect. Матеріал визначає корисні метрики, безпечні traces, кореляцію помилок, SLO та діагностику без витоку prompt, токенів і персональних даних.

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 server

MCP server перетворює дані й операції системи на типізовані ресурси, промпти та інструменти. Матеріал показує, як спроєктувати вузький контракт, валідовувати запити, обмежувати повноваження і тестувати сервер незалежно від конкретної моделі.

Розробка MCP client

MCP client відкриває capabilities серверів для AI-застосунку та відповідає за discovery, consent, маршрутизацію і безпечне виконання. Розглядаємо життєвий цикл сесії, роботу зі схемами, ізоляцію результатів, сумісність і відмовостійкість.

Deployment MCP server

Розгортання MCP server — це керування transport, identity, конфігурацією, масштабуванням і сумісністю протоколу. Розбираємо локальний stdio та віддалений HTTP, ізоляцію, health signals, zero-downtime rollout і перевірний rollback.

Authorization у MCP

Authorization у MCP визначає, хто й за яких умов може звертатися до захищених capabilities. Стаття пояснює OAuth-базований потік, resource indicators, audience binding, consent, захист токенів і перевірку повноважень на кожній операції.

MCP form vs URL elicitation: як безпечно запитувати дані користувача

Практичний вибір між form і URL elicitation у MCP: capability negotiation, sensitive data, third-party OAuth, completion, phishing controls, тести та rollout.

Tool calling і контракти інструментів

Як дозволити LLM викликати функції без передачі їй необмежених повноважень: schema, policy, idempotency, timeouts, verification і audit trail.

Retries, rate limits та idempotency

Як повторювати тимчасові збої без retry storm, обробляти 429, використовувати exponential backoff, jitter, retry budget та idempotency keys для безпечних операцій.

Черги і background jobs для AI

Тривалі AI-операції не повинні утримувати HTTP-з’єднання та губитися після timeout. Розбираємо контракт job, delivery semantics, idempotency, retries, DLQ, progress, cancellation, backpressure й аудит.

Джерела

  1. Tasks — MCP specification 2025-11-25первинне
  2. Lifecycle — MCP specification 2025-11-25первинне
  3. Tools — MCP specification 2025-11-25первинне
  4. Authorization — MCP specification 2025-11-25первинне
  5. Elicitation — MCP specification 2025-11-25первинне