---
title: "MCP Tasks no Claude Code: a aprovação precisa saber qual commit a pessoa viu"
slug: mcp-tasks-aprovacao-commit
date: 2026-10-26
category: "Arquitetura"
tags: ["ia", "agentes", "mcp", "go", "claude-code"]
readTime: "4 min"
excerpt: "Desde 23 de outubro, um servidor MCP pode devolver um ID de tarefa para jobs longos e pedir confirmação humana no meio do caminho. Só que a confirmação pode chegar horas depois. O padrão que eu seguiria no desenho do servidor para a aprovação continuar valendo."
url: https://eliseu.dev/blog/mcp-tasks-aprovacao-commit
---

Uma tool MCP que dispara um deploy agora pode responder na hora com um ID, rodar por meia hora e, no meio, pedir pra uma pessoa confirmar. Essa confirmação pode chegar duas horas depois. Se nesse intervalo alguém fez push na branch, o "sim" foi dado pra um commit e o deploy sai com outro.

## O que mudou

Em 23 de outubro, a Anthropic colocou MCP Tasks e Elicitations no Claude Code CLI, em beta pública a partir da versão 2.1.304. Na prática:

- **Tasks.** Em vez de segurar a conexão, o servidor responde o `tools/call` com um objeto de tarefa (`taskId`, `status`, datas). O Claude Code consulta o andamento com `tasks/get`, por padrão a cada 2 segundos, e o modelo segue trabalhando enquanto isso. Uma tarefa num servidor remoto continua rodando mesmo se você fechar o terminal.
- **Elicitations.** A tarefa pode ir para `input_required` e pedir um formulário ou abrir uma URL, por exemplo pra confirmar um estorno ou preencher um dado que falta. Quem responde é a pessoa, num diálogo fora do modelo.

Junto com isso, a documentação traz três detalhes que mudam o desenho do servidor:

1. Num servidor HTTP, a resposta com a tarefa precisa sair dentro do timeout da requisição. Então primeiro você aceita o job e responde, depois trabalha.
2. Quando o servidor não reconhece mais o ID, o Claude Code reporta "outcome unknown" e avisa que uma segunda chamada pode repetir o trabalho.
3. Em sessão não interativa, uma tarefa que pede input é cancelada. Elicitation não serve como gate de aprovação dentro do CI.

Detalhe extra pra quem leu sobre dobrar subagentes no loop principal: chamada feita por subagente não vira MCP Task.

## O padrão

Uma confirmação é um retrato do estado no momento em que a pessoa olhou. Por isso a regra é guardar junto com ela o que foi mostrado e conferir de novo antes de executar. Um esboço em Go:

```go
// A aprovação fica presa ao estado que a pessoa viu no diálogo.
type Approval struct {
	TaskID    string
	Branch    string
	Commit    string // SHA exibido na elicitation
	ExpiresAt time.Time
}

var ErrStale = errors.New("estado mudou desde a aprovação")

func (s *Server) deploy(ctx context.Context, a Approval) error {
	if time.Now().After(a.ExpiresAt) {
		return ErrStale
	}
	head, err := s.git.Head(ctx, a.Branch)
	if err != nil {
		return err
	}
	if head != a.Commit {
		// volta para input_required mostrando o SHA novo
		return ErrStale
	}
	// mesma chave, mesmo deploy: repetir a chamada não duplica o efeito
	return s.ci.Trigger(ctx, a.Commit, "deploy-"+a.TaskID)
}
```

As regras que esse trecho carrega:

- **O ID sobrevive à conexão.** A tarefa mora num banco ou fila, nunca na memória do processo. A própria doc pede que o ID continue respondendo depois de uma reconexão.
- **A pergunta mostra o que vai acontecer.** Branch, SHA, ambiente. Se o diálogo diz só "confirmar deploy?", a pessoa aprova no escuro.
- **A aprovação expira e é conferida de novo.** Mudou o commit ou passou do prazo, a tarefa volta a pedir confirmação.
- **Efeito com chave de idempotência.** Como "outcome unknown" pode levar a uma segunda chamada, o efeito colateral precisa reconhecer que já foi feito.
- **Pergunta e resposta no mesmo registro.** O servidor grava o que exibiu e o que recebeu, com o mesmo ID. Sem isso, daqui a um mês você tem o "sim" e não sabe pra qual tela.

Banco de dados resolve esse problema há décadas com lock otimista: você só grava se a versão ainda é a que você leu. Aprovação humana em agente é o mesmo caso, com um intervalo bem maior entre ler e gravar.

## Fontes

- [Connect Claude Code to tools via MCP](https://code.claude.com/docs/en/mcp), documentação do Claude Code, seções sobre MCP tasks e elicitation
- [MCP Tasks](https://modelcontextprotocol.io/extensions/tasks/overview), Model Context Protocol, extensão de tarefas
- [Anúncio de MCP Tasks e Elicitations](https://x.com/ClaudeDevs/status/2113698001889927608), ClaudeDevs no X, 23 de outubro de 2026
- [Post de David Soria Parra sobre agentes longos via MCP](https://x.com/dsp_/status/2113700167287496989), X, 23 de outubro de 2026