Claude Code MCP Tasks: tareas en segundo plano y Elicitation

Ejecuta herramientas MCP de larga duración sin bloquear Claude Code. Comprueba la versión, el protocolo y los flags de funciones; devuelve un descriptor de tarea y su resultado; audita los hooks de Elicitation y entiende qué ocurre al cancelar, salir o cambiar de sesión.

Índice
Claude Code MCP Tasks: tareas en segundo plano y Elicitation

Para usar MCP Tasks en Claude Code, conecta un servidor MCP compatible con Tasks e invoca su herramienta desde la conversación principal en la CLI de terminal, con v2.1.304 o posterior. El servidor acepta el trabajo, Claude sigue trabajando y recibe el resultado cuando termina. Comprueba los requisitos antes de modificar el servidor: una llamada normal que pasa automáticamente a segundo plano después de dos minutos utiliza un mecanismo distinto.

A fecha de 2026-10-24, Claude Code documenta MCP Tasks como una beta pública. Esta guía cubre la revisión actual del protocolo, 2026-07-28, y las condiciones que determinan si una llamada puede convertirse en una tarea.

Para qué sirven Tasks y Elicitation

Usa Tasks para trabajos largos que el servidor pueda aceptar y seguir de forma independiente, como compilaciones, ejecuciones de pruebas, exportaciones o investigaciones. Usa Elicitation cuando el servidor necesite una decisión o información que falta antes de continuar.

Conviene distinguir tres comportamientos que pueden parecer similares:

MecanismoQué ocurreQué debe implementar el servidor
Llamada MCP normalClaude espera el resultado de la herramienta.Una implementación normal de la herramienta.
Paso automático a segundo planoUna llamada de la conversación principal que sigue ejecutándose después de dos minutos pasa a segundo plano. Su resultado llega más tarde, pero la llamada en segundo plano no se conserva al salir de la sesión.No hace falta compatibilidad con Tasks.
MCP TaskEl servidor devuelve un descriptor de tarea al aceptar el trabajo. Claude Code sigue ese descriptor y recupera el resultado. Los trabajos de un servidor remoto pueden continuar después de salir de la CLI.La extensión Tasks y una gestión persistente de las tareas.

Elicitation es una capacidad independiente. Una herramienta de informes puede preguntar qué entorno debe consultar y luego ejecutar la exportación como una tarea. Una herramienta rápida puede pedir la misma aclaración sin crear ninguna tarea.

Elicitation también es anterior a este lanzamiento: la versión v2.1.76 de Claude Code introdujo los diálogos de solicitud de datos y los hooks Elicitation y ElicitationResult. La capacidad más reciente en este caso es Tasks, con tareas gestionadas por el servidor.

Comprueba si tu llamada puede convertirse en una MCP Task

Deben cumplirse todas las condiciones de la lista oficial de requisitos. Instalar una CLI más reciente solo resuelve la primera fila.

ComprobaciónCondición necesaria
Versión de Claude Codev2.1.304 o posterior.
Implementación del servidorEl servidor admite la extensión Tasks. Una conexión MCP por sí sola no demuestra esa compatibilidad.
Transporte y protocoloUn servidor HTTP, stdio o de un conector de claude.ai conectado con la revisión 2026-07-28 del protocolo.
Ajustes que fuerzan el modo antiguoNi MCP_SDK_GENERATION=v1 ni MCP_PROTOCOL_NEGOTIATION=legacy deben estar forzando la conexión al protocolo anterior.
Disponibilidad de la funciónLa sesión obtiene los flags que activan funciones y Anthropic habilita Tasks para ese tipo de sesión.
Cliente o entorno compatibleCLI de terminal, Agent SDK o GitHub Actions. La extensión de VS Code y la aplicación de escritorio todavía no admiten MCP Tasks.
Origen de la llamadaLa llamada parte de la conversación principal. Las llamadas realizadas por subagentes no se convierten en MCP Tasks.
Modo de entradaUna sesión interactiva, o una sesión de Agent SDK o con entrada en streaming que cumpla los requisitos indicados a continuación.

Para funcionar de forma no interactiva, una sesión de Agent SDK o una ejecución de claude -p con --input-format stream-json también necesita:

  • CLAUDE_AUTO_BACKGROUND_TASKS=1
  • CLAUDE_CODE_DISABLE_MCP_TASK_BACKGROUND sin establecer en 1
  • CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS sin establecer en 0

Mantén abierto el flujo de entrada: cuando se cierra, la ejecución no espera a que terminen las MCP Tasks. Una invocación puntual de claude -p "..." no obtiene Tasks. Que GitHub Actions sea un entorno compatible no elimina estos requisitos del modo de entrada.

La referencia de variables de entorno identifica varios ajustes que bloquean la obtención de flags:

  • DISABLE_GROWTHBOOK=1 o true
  • DO_NOT_TRACK=1
  • Cualquier valor no vacío de DISABLE_TELEMETRY
  • Cualquier valor no vacío de CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC

En las dos últimas variables, incluso 0 o false desactiva el comportamiento correspondiente. Las sesiones habituales con proveedores externos, incluido Amazon Bedrock, tampoco obtienen esos flags; la referencia documenta una excepción para integraciones en las que la aplicación anfitriona administra el proveedor.

Revisa el entorno desde el que se inicia Claude Code y la configuración efectiva. Los archivos habituales son ~/.claude/settings.json, .claude/settings.json y .claude/settings.local.json, aunque también puede aplicarse configuración administrada. La referencia de configuración explica el alcance de cada una.

Eliminar un ajuste que fuerza el modo antiguo no actualiza un servidor que carece del protocolo nuevo. Del mismo modo, la compatibilidad de API a través de una pasarela no demuestra que la sesión pueda obtener los flags necesarios. Si tu despliegue debe conservar un ajuste que bloquea Tasks, utiliza llamadas normales a herramientas.

En sesiones interactivas, CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS=0 hace que Claude espere. CLAUDE_CODE_DISABLE_MCP_TASK_BACKGROUND=1 también hace que espere a Tasks, aunque el mecanismo normal de paso automático a segundo plano puede trasladar después una llamada larga. CLAUDE_CODE_DISABLE_BACKGROUND_TASKS=1 por sí sola no obliga a las MCP Tasks a permanecer en primer plano.

Ejecuta un trabajo y comprueba el resultado

Empieza con un servidor en el que ya te hayas autenticado y cuya documentación o implementación confirme la compatibilidad con Tasks. Prueba un trabajo que no realice cambios destructivos. En Bash, comprueba la instalación y los servidores configurados antes de abrir la CLI interactiva:

claude --version
claude mcp list
claude

Si la versión está por debajo del mínimo y tu instalación tiene actualización integrada, ejecuta claude update y vuelve a comprobarla. Estos comandos están documentados en la referencia de la CLI.

Dentro de Claude Code, usa /mcp para confirmar que el servidor está conectado y completar cualquier autenticación pendiente. Si tienes conectada una herramienta que ejecuta pruebas, puedes pedir lo siguiente:

Ejecuta el conjunto de pruebas de este repositorio a través de su herramienta MCP desde la conversación principal. Mientras se ejecuta, explica la organización de las pruebas a partir del README. Cuando termine, informa del resultado y de los fallos que haya.

Comprueba el comportamiento en dos niveles:

  1. En Claude Code: busca el contador de tareas MCP e inspecciona /tasks. Una entrada en /tasks por sí sola no basta, porque las llamadas normales en segundo plano también aparecen ahí.
  2. En la traza del servidor: confirma que tools/call devolvió resultType: "task" y que las solicitudes posteriores de tasks/get hacen referencia al mismo taskId.

Al terminar, Claude Code recibe el resultado; pídele a Claude que lo comunique. Si está inactivo, puede procesarlo automáticamente. Si la llamada sigue siendo normal, revisa las capacidades de la solicitud real y la lista de requisitos antes de reescribir la herramienta.

Para autores de servidores: devuelve un descriptor y entrega el resultado

Implementa la extensión Tasks actual en lugar de copiar un ejemplo experimental antiguo. Los cambios de MCP 2026-07-28 sustituyeron tasks/result por consultas periódicas mediante tasks/get, añadieron tasks/update y eliminaron tasks/list.

Devuelve una tarea solo cuando la solicitud lo permita

Comprueba la capacidad en cada solicitud, en esta ruta:

params._meta["io.modelcontextprotocol/clientCapabilities"].extensions["io.modelcontextprotocol/tasks"]

Su valor es {}. Tu servidor anuncia la extensión correspondiente en capabilities.extensions dentro de su respuesta a server/discover. La descripción general de la extensión Tasks documenta ambas ubicaciones.

Cuando el cliente declara compatibilidad, el servidor decide si esa operación concreta debe convertirse en una tarea. Si no declara la capacidad, devuelve un resultado normal cuando sea posible. Si la operación requiere Tasks, la extensión define el error de capacidad ausente -32021; no devuelvas un descriptor de tarea a un cliente que no pueda procesarlo.

Guarda la tarea de forma persistente antes de responder, de modo que tasks/get ya pueda encontrarla por su ID. Mantén ese ID accesible entre conexiones y comprueba la autenticación y el acceso a la tarea en las solicitudes posteriores.

Esta respuesta JSON-RPC ilustrativa acepta una compilación. El ID, las marcas de tiempo y el resultado posterior son ejemplos, no un registro de ejecución:

{
  "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
  }
}

Los campos de la tarea se sitúan directamente dentro de result en JSON-RPC. No hay una envoltura task adicional y el descriptor inicial no necesita un array content.

CampoRequisito
resultType"task" para la respuesta inicial que devuelve la tarea.
taskIdObligatorio, generado por el servidor y difícil de adivinar. Claude Code lo limita además a un máximo de 128 caracteres ASCII imprimibles sin espacios.
statusObligatorio: working, input_required, completed, failed o cancelled.
createdAt, lastUpdatedAtCadenas obligatorias con marcas de tiempo ISO 8601.
ttlMsNúmero entero obligatorio de milisegundos medidos desde la creación, o null para una retención sin límite. No es una estimación de la duración del trabajo.
pollIntervalMsIntervalo de consulta opcional, expresado como un número entero de milisegundos; no envíes null.
statusMessageTexto opcional sobre el progreso o el estado.

El esquema publicado de la extensión define la estructura. La validación específica de Claude Code está documentada en la referencia para autores de servidores.

Si Claude muestra Unsupported result type 'task' for tools/call, comprueba si la solicitud entrante incluía la extensión y después verifica que no falte ninguno de estos campos: taskId, status, createdAt, lastUpdatedAt o ttlMs. Un valor de status no admitido produce el mismo error. Un ID de tarea no válido produce, en cambio, un error de descriptor de tarea mal formado.

Incluye el resultado final de la herramienta en tasks/get

Responde a cada consulta con el estado actual de la tarea. Una respuesta correcta a tasks/get utiliza resultType: "complete" aunque el status del trabajo siga siendo working: ha terminado la solicitud de consulta, no necesariamente el trabajo.

Para la compilación del ejemplo anterior, una respuesta al finalizar sería:

{
  "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."
        }
      ]
    }
  }
}

El result anidado contiene el resultado normal de la herramienta. Un error de la herramienta que utilice isError: true sigue correspondiendo a una tarea completed; failed se reserva para un error de ejecución JSON-RPC incluido en error.

Implementa también tasks/cancel, pero ten en cuenta que la cancelación requiere la cooperación del servidor. La especificación de la extensión no garantiza que cancelar detenga un trabajo que ya está en marcha. Claude Code recupera actualmente los resultados mediante consultas periódicas, así que no dependas de notifications/tasks para entregarlos.

Usa Elicitation para decisiones que la herramienta no puede tomar

Solicita el entorno, el destino o la aprobación que falte antes de realizar la acción que depende de esa información. El modo de formulario recoge campos estructurados; el modo URL ofrece un flujo en el navegador, como el inicio de sesión en un servicio externo.

Durante una tarea, presenta la pregunta a través de tasks/get, con status: "input_required" y un mapa inputRequests. Cada entrada utiliza una clave única y contiene el method solicitado, por ejemplo elicitation/create, junto con sus params. Claude Code envía la respuesta mediante tasks/update, usando las claves correspondientes en inputResponses.

En la CLI interactiva, cierra /tasks si la pregunta queda oculta detrás. Rechazarla o pulsar Esc envía una respuesta a la solicitud de datos; el servidor decide si su trabajo continúa.

Si una tarea solicita datos del usuario en una sesión no interactiva, Claude Code pide al servidor que la cancele sin ejecutar los hooks Elicitation ni llamar al callback onElicitation de Agent SDK. Proporciona las decisiones necesarias antes de iniciar un trabajo desatendido o utiliza una sesión interactiva. Esta restricción es específica de las solicitudes de datos realizadas a través de MCP Tasks.

Revisa también los hooks antes de interpretar una respuesta a Elicitation como una aprobación humana. La referencia de hooks documenta lo siguiente:

  • Elicitation puede responder automáticamente y suprimir el diálogo.
  • ElicitationResult puede modificar la respuesta del usuario, incluso sustituir un rechazo por una aceptación si está mal implementado.
  • ElicitationResult no se ejecuta cuando un hook Elicitation ya ha respondido.

Revisa los hooks efectivos de la configuración de usuario, proyecto, local, administrada y de los plugins. Comprobar únicamente el archivo de configuración del repositorio puede dejar fuera el hook que está respondiendo.

Qué ocurre al detener, salir, limpiar o reanudar la sesión

Detén una tarea remota explícitamente si quieres solicitar su cancelación; salir de la CLI no lo hace. El ciclo de vida documentado distingue entre la ejecución en el servidor y el seguimiento que realiza Claude Code.

AcciónResultado y siguiente paso
Seleccionar la tarea en /tasks y pulsar x, o pedir a Claude que la detengaClaude Code deja de seguirla y solicita su cancelación. El servidor todavía puede terminarla.
Pulsar Esc durante la interacción habitualNo detiene una tarea en segundo plano.
Salir mientras se ejecuta una tarea remotaEl trabajo continúa en el servidor. Reanuda su sesión original para volver a seguirlo.
Salir con una tarea de un servidor stdioEl proceso del servidor local se detiene. No presupongas que el trabajo continúa salvo que el servidor admita explícitamente ejecutarlo fuera de ese proceso.
Usar /clear, /branch o cambiar de sesión con /resume mientras Claude Code sigue abiertoEl resultado puede llegar a la conversación actual. Después de salir, reanuda la sesión en la que se creó la tarea.
Reanudar la sesión original de forma interactivaEl seguimiento se reanuda cuando el servidor vuelve a conectarse, siempre que aún conozca la tarea. Conserva su nombre y los parámetros de conexión.
Iniciar una sesión nueva o usar --fork-sessionLa nueva sesión no hereda el seguimiento de la tarea.
Reanudar mediante una ejecución puntual de claude -pEsa ejecución no sigue la tarea; utiliza la reanudación interactiva o una entrada en streaming que cumpla los requisitos.

Si el servidor está desconectado, vuelve a conectarlo desde /mcp antes de detener la tarea. De lo contrario, no le llegará ninguna solicitud de cancelación y Claude Code olvidará la tarea.

Usa claude --resume para seleccionar la conversación original. La política de retención del servidor sigue siendo relevante: una conversación que puede reanudarse no puede recuperar un resultado que el servidor ya haya eliminado.

Un prompt para auditar tu configuración MCP

Haz primero una auditoría de solo lectura para identificar el cambio mínimo útil antes de modificar servidores o ajustes. Este prompt adapta la propuesta de auditoría MCP de @Voxyz_ai y añade comprobaciones del formato de respuesta actual y del comportamiento de las sesiones con entrada en streaming.

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.

¿Quieres optimizar tu flujo de trabajo con LLM?

Conecta modelos mediante una API, gestiona claves y controla el gasto en IA.

Empezar gratis