Voltar as noticias
A elicitação MCP não mantém mais um stream
MCP ProtocolMediaEN

A elicitação MCP não mantém mais um stream

Dev.to - MCP·28 de agosto de 2026

A elicitação MCP em um Worker é um retorno agora. Você envia input_required, a solicitação termina, e Claude Code desenha o formulário depois que o isolado já foi para casa.

A página na qual muitas pessoas ainda acessam é o guia remoto MCP mais antigo da Cloudflare, aquele que ainda lista McpAgent como a opção de elicitação. Esse caminho aguarda elicitInput em uma sessão ao vivo. A especificação 2026-07-28 substituiu o stream mantido por Multi Round-Trip Requests, e a API do manipulador MCP da Cloudflare diz que o Worker não permanece suspenso enquanto um usuário responde.

Copie o await e você paga por um isolado fixo, ou você expira enquanto o humano ainda está lendo o prompt.

O que precisa ser verdade primeiro

Este é um Worker que você pode colar, não um resumo de por que o MCP se tornou sem estado. O explicador de sessão-movida já cobre isso. Aqui o isolado precisa terminar antes que o formulário esteja disponível.

  • Wrangler 4.x com nodejs_compat e uma compatibility_date em ou após 2026-06-11
  • agents mais @modelcontextprotocol/server@2.0.0 e zod, o pin da API do manipulador da Cloudflare
  • Um segredo de assinatura de pelo menos 32 bytes aleatórios em .dev.vars como MRTR_REQUEST_STATE_KEY
  • Claude Code 2.1.232 ou posterior para que o runtime v2 possa falar o protocolo 2026-07-28 sobre HTTP
  • Uma URL HTTP que termina em /mcp

O diálogo de elicitação em si foi enviado na versão 2.1.76. A tentativa que corresponde a este Worker é o runtime mais recente. Se claude --version for mais antigo que 2.1.232, pare e atualize antes de culpar o manipulador.

Nenhum Objeto Durável é necessário para esta demonstração. O estado da aplicação ainda precisa de um armazenamento. A sessão do protocolo não é esse armazenamento.

Retornar input_required do Worker

Esboço de papel amassado de uma caixa Worker carimbada como FEITO, um cartão de formulário teal e um segundo Worker lendo um chip requestState selado

A primeira solicitação do Worker termina. O formulário é um POST posterior carregando o chip selado.

Pense na primeira tools/call como um ticket numerado deixado no balcão. A loja está fechada. O humano preenche um formulário mais tarde, e depois entra com o ticket. Esse ticket é requestState. Acampando no caixa está o stream de 2025, e é o caminho congelado.

O exemplo atual da Cloudflare é mcp-elicitation-mrtr. A ferramenta é increase-counter. Dois ciclos de entrada, três solicitações de Worker, zero Promessas pendentes.

1. Fixar o manipulador sem estado

McpAgent ainda compila. Também está obsoleto e congelado em recursos. createLegacyMcpHandler é a ponte temporária para pessoas que ainda precisam de um transporte de sessão. Nova elicitação passa por createMcpHandler de agents/mcp/server e uma fábrica que retorna um novo McpServer de @modelcontextprotocol/server.

Passe a fábrica. Uma instância global do servidor é o bug que esta API foi escrita para parar.

npm i agents @modelcontextprotocol/server@2.0.0 zod

legacy: "reject" torna o endpoint apenas sem estado. O padrão legacy: "stateless" ainda aceita ferramentas comuns de clientes mais antigos, e ainda falha elicitation/create empurradas imediatamente. GET e DELETE já retornam 405. Se você queria o antigo stream, escolheu o manipulador errado.

Checkpoint. O Worker inicializa. /mcp é o único caminho. Um cabeçalho Mcp-Session-Id restante é ignorado.

2. Colocar uma chave de assinatura em .dev.vars

requestState faz round-trip através do cliente. A especificação diz para tratá-lo como controlado por um atacante se influenciar qualquer coisa que importe, e protegê-lo com HMAC ou AEAD. O createRequestStateCodec do SDK TypeScript é HMAC-SHA256. Assinado, não criptografado. O cliente pode decodificar o payload em base64url, então mantenha segredos fora dele.

printf 'MRTR_REQUEST_STATE_KEY=%s
' "$(openssl rand -base64 32)" > .dev.vars

A produção é wrangler secret put MRTR_REQUEST_STATE_KEY. Não reutilize o valor local. O README oficial diz pelo menos 32 bytes, e isso é sério.

bind nesta demonstração liga o blob a mcpReq.method, então um token gerado para tools/call não pode pular para um método diferente. Esse é o mínimo, não produção. A especificação diz que se requestState influencia a autenticação ou lógica de negócios, você protege a integridade, e deve vincular o principal autenticado, um TTL curto e um identificador para a solicitação original. O codec TypeScript leva ttlSeconds. Esta demonstração de contador usa o método de vinculação mais HMAC porque não há usuário. Uma ferramenta de reembolso que apenas vinculasse o método ainda poderia ser reproduzida dentro de outro tools/call.

Checkpoint. wrangler dev inicia. Deixe o segredo de lado e o processo lança MRTR_REQUEST_STATE_KEY deve ser configurado em vez de servir um manipulador que não pode selar nada.

3. Retornar input_required na primeira chamada

A especificação de ferramentas permite que tools/call responda com um InputRequiredResult. resultType é input_required. Dentro de inputRequests está um elicitation/create com mode: "form" e um JSON Schema plano. Objetos aninhados estão fora. Senhas estão fora. Um número e um booleano estão dentro.

O manipulador retorna. Ele não await o humano.

Esse retorno é todo o truque. A resposta JSON-RPC é enviada. A solicitação do Worker acabou. Claude Code ainda tem um formulário para desenhar. Esses dois fatos costumavam estar colados juntos por um stream aberto. Eles não estão mais colados agora.

Checkpoint. Chame increase-counter com { "current": 10 }. O resultType do resultado é input_required. wrangler dev já registrou o POST como finalizado.

4. Retomar do requestState selado

O próximo POST é um novo tools/call com um novo id JSON-RPC, os argumentos originais, inputResponses daquela rodada, e o requestState ecoado. A especificação é clara sobre isso. As duas solicitações são independentes.

Aqui está a pegadinha que pega pessoas que tratam isso como uma conversa que se lembra. inputRes

Contexto Triplo Up

As mudanças no protocolo MCP podem impactar empresas brasileiras que utilizam a infraestrutura da Cloudflare. A transição para um modelo sem estado pode exigir adaptações em sistemas que dependem de sessões persistentes. É crucial que as empresas se atualizem para garantir a compatibilidade com as novas especificações.

Noticias relacionadas

Gostou do conteudo?

Receba toda semana as principais novidades sobre WebMCP.