MCP Tasks в Claude Code: фоновые задачи и запросы ввода
Запускайте долгие операции через MCP, не блокируя работу Claude Code. Проверьте версию, протокол и флаги функций, реализуйте корректный возврат задачи и результата, проверьте хуки Elicitation и разберитесь, что происходит при отмене, выходе и смене сеанса.
Содержание

Чтобы запускать MCP Tasks в Claude Code, подключите MCP-сервер с поддержкой этого расширения и вызывайте его инструменты из основного диалога в терминальном клиенте CLI версии v2.1.304 или новее. Сервер принимает задание, Claude продолжает работу, а результат получает после завершения задачи. Прежде чем менять серверный код, проверьте условия доступности: обычный вызов, который автоматически уходит в фон через две минуты, работает по другому механизму.
По состоянию на 2026-10-24 MCP Tasks в Claude Code доступны в рамках открытого бета-тестирования. Ниже разобраны редакция протокола 2026-07-28 и условия, при которых вызов действительно становится задачей MCP.
Зачем нужны Tasks и Elicitation
Используйте Tasks для длительных операций, которые сервер может принять и отслеживать самостоятельно: сборок, запуска тестов, экспорта данных или исследований. Elicitation — это механизм запроса ввода у пользователя: он нужен, когда для продолжения серверу не хватает данных или вашего решения.
На практике легко спутать три варианта выполнения:
| Механизм | Что происходит | Что должен реализовать сервер |
|---|---|---|
| Обычный вызов MCP | Claude ждёт результат инструмента. | Обычную реализацию инструмента. |
| Автоматический перевод в фон | Вызов из основного диалога, который не завершился за две минуты, уходит в фон. Результат приходит позже, но после выхода из сеанса такой фоновый вызов не сохраняется. | Поддержка Tasks не требуется. |
| Задача MCP | Приняв задание, сервер возвращает дескриптор — объект с идентификатором и состоянием задачи. Claude Code отслеживает её и получает результат. Задание на удалённом сервере может продолжить работу после выхода из CLI. | Расширение Tasks и хранение состояния задач для последующего обращения к ним. |
Elicitation работает независимо от Tasks. Например, инструмент подготовки отчёта сначала уточняет, из какого окружения брать данные, а затем запускает экспорт как задачу. Быстрый инструмент может задать тот же вопрос без создания задачи.
Elicitation появился раньше нынешнего обновления: в Claude Code v2.1.76 уже добавили диалоги запроса ввода и обработчики событий — хуки Elicitation и ElicitationResult. Новая возможность здесь — задачи, выполнением которых управляет сервер.
Проверьте, может ли вызов стать задачей MCP
Должны выполняться все условия из официального списка требований. Обновление CLI закрывает только первую строку.
| Что проверить | Необходимое условие |
|---|---|
| Версия Claude Code | v2.1.304 или новее. |
| Реализация сервера | Сервер поддерживает расширение Tasks. Само по себе успешное подключение по MCP этого не подтверждает. |
| Транспорт и протокол | HTTP-сервер, stdio-сервер или сервер коннектора claude.ai использует редакцию протокола 2026-07-28. |
| Принудительный старый режим | Соединение не должно переводиться на старый протокол настройками MCP_SDK_GENERATION=v1 или MCP_PROTOCOL_NEGOTIATION=legacy. |
| Доступность функции | Сеанс получает флаги доступности функций — feature flags, — и Anthropic включила Tasks для этого типа сеанса. |
| Поддерживаемый клиент | Терминальный CLI, Agent SDK или GitHub Actions. Расширение VS Code и настольное приложение пока не поддерживают MCP Tasks. |
| Источник вызова | Инструмент вызывается из основного диалога. Вызовы субагентов не становятся задачами MCP. |
| Режим ввода | Интерактивный сеанс либо сеанс Agent SDK или потокового ввода, отвечающий дополнительным требованиям ниже. |
Для неинтерактивного сеанса Agent SDK или запуска claude -p с --input-format stream-json дополнительно нужны следующие настройки:
CLAUDE_AUTO_BACKGROUND_TASKS=1CLAUDE_CODE_DISABLE_MCP_TASK_BACKGROUNDне равна1CLAUDE_CODE_MCP_AUTO_BACKGROUND_MSне равна0
Оставляйте входной поток открытым: после его закрытия процесс не ждёт завершения MCP Tasks. Разовый запуск claude -p "..." не получает Tasks. Поддержка GitHub Actions не отменяет эти требования к режиму ввода.
В справочнике переменных окружения перечислены настройки, которые блокируют получение флагов:
DISABLE_GROWTHBOOK=1илиtrueDO_NOT_TRACK=1- Любое непустое значение
DISABLE_TELEMETRY - Любое непустое значение
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC
Для двух последних переменных даже 0 или false включают соответствующее отключение. Обычные сеансы через сторонних провайдеров, включая Amazon Bedrock, тоже не загружают флаги. В справочнике описано исключение для встроенных интеграций, в которых провайдером управляет хост-приложение.
Проверьте окружение, из которого запускается Claude Code, и фактически применяемые настройки. Обычно они находятся в ~/.claude/settings.json, .claude/settings.json и .claude/settings.local.json; также могут действовать централизованные настройки организации. Области их действия описаны в справочнике настроек.
Удаление настройки старого режима не добавит новый протокол серверу, который его не поддерживает. Совместимость API через шлюз тоже не подтверждает возможность получать флаги функций. Если в вашей конфигурации необходимо сохранить блокирующую настройку, используйте обычные вызовы инструментов.
В интерактивном сеансе CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS=0 заставляет Claude ждать. Настройка CLAUDE_CODE_DISABLE_MCP_TASK_BACKGROUND=1 также включает ожидание результата Tasks, хотя позднее обычный механизм автоматического перевода в фон может переместить туда долгий вызов. Одна лишь CLAUDE_CODE_DISABLE_BACKGROUND_TASKS=1 не заставляет MCP Tasks оставаться на переднем плане.
Запустите одну задачу и проверьте результат
Начните с сервера, для которого уже пройдена аутентификация, а поддержка Tasks подтверждена документацией или реализацией. Выберите одну операцию, не приводящую к разрушительным изменениям. В Bash проверьте установленную версию и настроенные серверы, затем откройте интерактивный CLI:
claude --version
claude mcp list
claude
Если версия ниже минимальной и ваша установка поддерживает встроенное обновление, выполните claude update, затем снова проверьте версию. Эти команды описаны в справочнике CLI.
Внутри Claude Code откройте /mcp, убедитесь, что сервер подключён, и при необходимости завершите аутентификацию. Если подключён инструмент запуска тестов, можно дать такой запрос:
Запусти тесты этого репозитория через его MCP-инструмент из основного диалога. Пока тесты выполняются, объясни их структуру по README. После завершения сообщи результат и перечисли ошибки.
Проверьте поведение на двух уровнях:
- В Claude Code: найдите счётчик задач MCP и откройте
/tasks. Самого появления записи в/tasksнедостаточно: там отображаются и обычные фоновые вызовы. - В трассировке сервера: убедитесь, что
tools/callвернулresultType: "task", а последующие запросыtasks/getобращаются к тому жеtaskId.
После завершения Claude Code получает результат; попросите Claude сообщить его. Если Claude в этот момент ничем не занят, он может обработать результат автоматически. Если вызов остался обычным, сначала проверьте заявленные возможности в фактическом запросе и условия доступности, а уже затем меняйте реализацию инструмента.
Авторам серверов: верните дескриптор задачи и передайте результат
Реализуйте актуальное расширение Tasks: старые экспериментальные примеры описывают другой порядок работы. В редакции MCP 2026-07-28 метод tasks/result заменили опросом через tasks/get, добавили tasks/update и удалили tasks/list.
Возвращайте задачу, только если текущий запрос это допускает
Проверяйте поддержку в каждом запросе по пути:
params._meta["io.modelcontextprotocol/clientCapabilities"].extensions["io.modelcontextprotocol/tasks"]
Значение этого поля — {}. Со своей стороны сервер объявляет расширение в capabilities.extensions ответа на server/discover. Оба места описаны в обзоре расширения Tasks.
Если клиент заявил поддержку, сервер сам решает, оформлять ли конкретную операцию как задачу. Если поддержки нет, по возможности верните обычный результат. Для операции, которая требует Tasks, расширение определяет ошибку отсутствующей возможности клиента -32021; возвращать дескриптор задачи такому клиенту нельзя.
Сохраните задачу до отправки ответа, чтобы tasks/get уже мог найти её по идентификатору. Она должна оставаться доступной при новых соединениях. При последующих запросах проверяйте аутентификацию и право доступа к задаче.
Ниже показан пример JSON-RPC-ответа о принятии сборки. Идентификатор, время и итоговый результат приведены для иллюстрации; это не журнал выполненной операции:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"resultType": "task",
"taskId": "6f17bfa2-4c5e-4d21-b563-2f7e83a902bc",
"status": "working",
"createdAt": "2026-10-24T08:00:00Z",
"lastUpdatedAt": "2026-10-24T08:00:00Z",
"ttlMs": 3600000,
"pollIntervalMs": 5000
}
}
Поля задачи находятся непосредственно в JSON-RPC result. Дополнительная обёртка task не нужна; массив content в первоначальном дескрипторе тоже не требуется.
| Поле | Требование |
|---|---|
resultType | "task" в первоначальном ответе с задачей. |
taskId | Обязательный идентификатор, который генерирует сервер и который трудно угадать. Claude Code дополнительно ограничивает его длину 128 печатными ASCII-символами без пробелов. |
status | Обязательно одно из значений: working, input_required, completed, failed или cancelled. |
createdAt, lastUpdatedAt | Обязательные строки с временными метками в формате ISO 8601. |
ttlMs | Обязательное целое число миллисекунд с момента создания либо null, если срок хранения не ограничен. Это не оценка продолжительности выполнения. |
pollIntervalMs | Необязательный интервал опроса — целое число миллисекунд. Не передавайте null. |
statusMessage | Необязательный текст о ходе выполнения или состоянии задачи. |
Структура определена в опубликованной схеме расширения. Особенности проверки на стороне Claude Code описаны в документации для авторов серверов.
Если Claude сообщает Unsupported result type 'task' for tools/call, сначала проверьте наличие расширения во входящем запросе. Затем убедитесь, что присутствуют все поля: taskId, status, createdAt, lastUpdatedAt и ttlMs. Недопустимое значение status вызывает ту же ошибку. Некорректный идентификатор задачи приводит к другой ошибке — о неверном формате дескриптора задачи.
Передавайте итоговый результат через tasks/get
На каждый запрос состояния возвращайте актуальные данные задачи. Успешный ответ tasks/get содержит resultType: "complete", даже если status самой задачи всё ещё равен working: завершился запрос состояния, а работа может продолжаться.
Для сборки из примера ответ после завершения выглядит так:
{
"jsonrpc": "2.0",
"id": 2,
"result": {
"resultType": "complete",
"taskId": "6f17bfa2-4c5e-4d21-b563-2f7e83a902bc",
"status": "completed",
"createdAt": "2026-10-24T08:00:00Z",
"lastUpdatedAt": "2026-10-24T08:03:00Z",
"ttlMs": 3600000,
"result": {
"resultType": "complete",
"content": [
{
"type": "text",
"text": "Build completed successfully."
}
]
}
}
}
Во вложенном result находится обычный результат инструмента. Ошибка уровня инструмента с isError: true всё равно относится к задаче со статусом completed. Статус failed предназначен для ошибки выполнения на уровне JSON-RPC, которая передаётся в error.
Реализуйте также tasks/cancel, но учитывайте, что сервер должен сам обработать запрос отмены. Спецификация расширения не гарантирует остановку уже начатой работы. Сейчас Claude Code получает результаты опросом сервера, поэтому не рассчитывайте доставить итог только через notifications/tasks.
Elicitation: как запросить недостающие данные и решение
Уточняйте окружение, место назначения или разрешение до выполнения действия, которое от них зависит. Режим формы позволяет собрать структурированные данные. Режим URL предлагает продолжить действие в браузере — например, пройти вход во внешнюю систему.
Чтобы задать вопрос во время выполнения задачи, верните через tasks/get состояние status: "input_required" и объект inputRequests. Каждая запись в нём должна иметь уникальный ключ и содержать запрашиваемый method, например elicitation/create, вместе с его params. Claude Code передаст ответ через tasks/update, используя соответствующие ключи в inputResponses.
В интерактивном CLI закройте /tasks, если окно с вопросом скрыто за ним. Отказ или нажатие Esc отправляет ответ на запрос ввода; продолжать ли работу после этого, решает сервер.
Если задача запрашивает ввод пользователя в неинтерактивном сеансе, Claude Code просит сервер отменить её, не запуская хуки Elicitation и не вызывая onElicitation из Agent SDK. Передайте необходимые решения до запуска работы без участия пользователя либо используйте интерактивный сеанс. Это ограничение относится именно к запросам ввода через MCP Tasks.
Прежде чем считать ответ на Elicitation подтверждением человека, проверьте хуки. В справочнике хуков описано следующее:
Elicitationможет ответить автоматически, без показа диалога.ElicitationResultможет изменить ответ пользователя. При некорректной реализации он способен заменить отказ согласием.ElicitationResultне запускается, если ответ уже сформировал хукElicitation.
Проверьте действующие хуки из пользовательских, проектных, локальных и централизованных настроек, а также из плагинов. Если посмотреть только файл настроек в репозитории, можно пропустить обработчик, который отвечает за пользователя.
Что происходит при остановке, выходе и смене сеанса
Если хотите запросить отмену удалённой задачи, остановите её явно: выход из CLI этого не делает. В описании жизненного цикла выполнение на сервере отделено от отслеживания задачи в Claude Code.
| Действие | Что произойдёт и что делать дальше |
|---|---|
Выбрать задачу в /tasks и нажать x либо попросить Claude остановить её | Claude Code перестанет отслеживать задачу и запросит отмену. Сервер всё ещё может завершить работу. |
Нажать Esc при обычной работе с диалогом | Фоновая задача не остановится. |
| Выйти, пока выполняется удалённая задача | Задание продолжит работу на сервере. Чтобы снова его отслеживать, возобновите исходный сеанс. |
| Выйти при активной задаче stdio-сервера | Процесс локального сервера остановится. Не рассчитывайте на продолжение работы, если сервер явно не поддерживает выполнение за пределами этого процесса. |
Выполнить /clear, /branch или переключить сеанс через /resume, не закрывая Claude Code | Результат может прийти в текущий диалог. После выхода возобновляйте сеанс, в котором задача была создана. |
| Интерактивно возобновить исходный сеанс | Отслеживание продолжится после подключения сервера, если он ещё знает эту задачу. Сохраните имя сервера и параметры соединения. |
Создать новый сеанс или использовать --fork-session | Новый сеанс не унаследует отслеживание задачи. |
Возобновить сеанс разовым запуском claude -p | Такой запуск не отслеживает задачу. Используйте интерактивное возобновление или потоковый ввод с необходимыми настройками. |
Если сервер отключён, перед остановкой задачи восстановите соединение через /mcp. Иначе запрос отмены не дойдёт до сервера, а Claude Code забудет задачу.
Команда claude --resume позволяет выбрать исходный диалог. Учитывайте срок хранения на сервере: возобновление сеанса не восстановит результат, который сервер уже удалил.
Промпт для аудита MCP-конфигурации
Начните с проверки без изменений, чтобы найти минимально необходимую правку в сервере или настройках. Этот промпт основан на предложении @Voxyz_ai по аудиту MCP и дополнен проверками актуального формата ответов и поведения сеансов с потоковым вводом.
Goal: Audit my Claude Code MCP setup for Tasks and Elicitation.
Read the current official documentation:
https://code.claude.com/docs/en/mcp
https://code.claude.com/docs/en/env-vars
https://code.claude.com/docs/en/hooks
https://modelcontextprotocol.io/extensions/tasks/overview
Scope: Inspect connected MCP servers, their configuration, effective settings, and any MCP server implementation in this repository. Say explicitly if no server implementation is present. Keep credential values out of the report.
Check:
1. Long-running tools: identify builds, test runs, exports, or research that could benefit from Tasks. For my server code, recommend the smallest change to return a valid task handle, persist it across connections, and deliver the final result through tasks/get. For third-party servers, cite evidence for the deployed version's support; otherwise mark support unknown.
2. Eligibility: check the CLI version, transport, actual protocol revision, per-request Tasks capability, feature-flag fetching, provider, supported surface, main conversation versus subagents, and input mode. Include MCP_SDK_GENERATION, MCP_PROTOCOL_NEGOTIATION, privacy/flag-fetching variables, CLAUDE_AUTO_BACKGROUND_TASKS, CLAUDE_CODE_DISABLE_MCP_TASK_BACKGROUND, and CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS. Distinguish one-shot claude -p from stream-json input.
3. Elicitation: find tools that guess missing parameters or perform irreversible actions without obtaining the necessary decision. Inspect Elicitation and ElicitationResult hooks for automatic acceptance or changes to a user's refusal, including hooks outside this repository.
4. Lifecycle: check cancellation, remote versus stdio execution, retention, and resume. Identify unattended Tasks that might request user input.
Output: For each finding, name the tool or setting, cite the evidence, describe current behavior, recommend the smallest change, and give one verification step. Mark conditions you cannot observe as unknown.
Do not edit files, change settings, or invoke operational jobs during this audit. Show recommendations first.