O Muro Stateful: Por Que o MCP Não Escalava
Quando o Model Context Protocol (MCP) foi lançado no final de 2024, era elegante — mas construído para um único cliente falando com um único servidor numa máquina local. O transporte original dependia de sessões stateful: um handshake initialize, um header Mcp-Session-Id e estado persistente no servidor.
Esse design colapsa sob workloads cloud-native. Quando você deploya servidores MCP atrás de um load balancer, o session pinning significa que a requisição de um usuário precisa sempre rotear para o mesmo pod — ou você recebe erros 400 Session Not Found. Escala horizontal, deploys contínuos e funções serverless simplesmente não funcionam com sessões fixas.
O Google bateu nessa parede ao escalar MCP pela sua infraestrutura cloud. A solução não foi um patch — foi um redesenho no nível do protocolo. A especificação MCP release candidate 2026-07-28 remove o gerenciamento de sessão no nível do transporte completamente. Essa é a maior mudança na spec desde o lançamento do MCP, e é uma mudança boa.
Resumo: se você está construindo agentes de IA para produção, essa atualização é seu bilhete para escalabilidade real.

O Que Realmente Mudou: De Handshakes para Requisições Autodescritivas
Antes: O Handshake Stateful (2025-11-25)
Toda conexão exigia um setup de sessão:
// POST /mcp - Handshake legado 2025-11-25
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-11-25",
"capabilities": {},
"clientInfo": {
"name": "my-app",
"version": "1.0"
}
}
}
O servidor respondia com um header Mcp-Session-Id que precisava ser incluído em toda requisição subsequente. Sem o session ID? Sem acesso.
Depois: Requisições Stateless e Autodescritivas (2026-07-28)
O handshake initialize morreu. O header Mcp-Session-Id morreu. Em vez disso, toda requisição carrega sua própria versão do protocolo, informações do cliente e capacidades num campo _meta:
POST /mcp HTTP/1.1
Host: mcp-server.example
MCP-Protocol-Version: 2026-07-28
Mcp-Method: tools/call
Mcp-Name: search
Content-Type: application/json
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "search",
"arguments": {
"q": "lontras"
},
"_meta": {
"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientCapabilities": {},
"io.modelcontextprotocol/clientInfo": {
"name": "my-app",
"version": "1.0"
}
}
}
}
Toda requisição agora é independente. Qualquer instância do servidor pode processá-la. Esse é o cerne da mudança: o estado vai da camada de transporte para a camada de aplicação.
Headers HTTP: Tornando o Tráfego Roteável
O SEP-2243 introduz headers HTTP padrão que espelham o corpo JSON-RPC:
Mcp-Protocol-Version: versão do protocoloMcp-Method: o método JSON-RPC (ex.:tools/call)Mcp-Name: a ferramenta, prompt ou recurso específico
Proxies, gateways e load balancers agora podem rotear e limitar tráfego sem inspecionar o corpo da requisição. Se headers e corpo discordarem, o servidor rejeita com erro de mismatch -32020.
Operações Longas: Tasks Extension
E quanto a chamadas de ferramenta que levam 30 segundos — como backup de banco ou reembolso? O modelo antigo segurava a conexão aberta. A nova spec retorna um taskId imediatamente e processa em background:
// Exemplo: Iniciando uma task assíncrona num servidor TypeScript
server.tool(
"process_refund",
{ orderId: z.string(), amount: z.number() },
async ({ orderId, amount }) => {
const taskId = randomUUID();
// Armazena o estado inicial da task num datastore compartilhado (ex.: Redis)
await setTaskState(taskId, { status: "trabalhando" });
// Processa o reembolso assíncronamente em background
processRefundAsync(taskId, orderId, amount);
// Retorna imediatamente para manter a conversa fluindo
return {
content: [
{
type: "text",
text: JSON.stringify({
taskId,
status: "trabalhando",
message: `Reembolso de R${amount} para o pedido ${orderId} está sendo processado. Task ID: ${taskId}`
})
}
]
};
}
);
O cliente faz polling com tasks/get ou assina via tasks/update. Chega de filas de conexão.
Upgrades de Segurança Que Você Precisa Conhecer
A spec adiciona um parâmetro iss nas respostas de autorização para prevenir session hijacking. O suporte a JSON Schema agora inclui oneOf, anyOf, allOf e definições locais de $ref para validação mais estrita.
Também há uma política formal de deprecação: features passam por Active → Deprecated → Removed com janela mínima de 12 meses. Três features entram em deprecação agora, incluindo stderr para conexões stdio — use OpenTelemetry no lugar.

Migração: O Que Você Precisa Fazer Hoje
Todos os quatro SDKs Tier-1 (TypeScript, Python, Go, C#) têm releases beta suportando a spec 2026-07-28. Comece a testar em staging agora.
Python: A API do decorator MCPServer é totalmente compatível.
pip install "mcp[cli]==2.0.0b1"
TypeScript: O v2 substitui o monolítico @modelcontextprotocol/sdk por pacotes modulares:
npm install @modelcontextprotocol/server@beta
npm install @modelcontextprotocol/client@beta
Use o codemod para renames de API (como .tool() → registerTool):
npx @modelcontextprotocol/codemod@beta v1-to-v2 .
Limitações e Cuidados
Esta spec é um release candidate, não final. A janela de deprecação de 12 meses significa que clientes e servidores antigos vão coexistir — teste a interoperabilidade com cuidado. Além disso, o gerenciamento de estado vai para sua camada de aplicação: você agora precisa de Redis ou similar para estado de tasks, o que é um novo fardo operacional.
Próximos Passos
Se você está deployando agentes em escala, este é o sinal verde. O core stateless torna load balancing algo trivial, autoscaling contínuo e MCP serverless uma realidade. Comece com os betas dos SDKs, atualize seus tool servers e teste o roteamento do seu gateway com os novos headers. Para mais padrões de deploy seguro, veja este guia sobre progressive rollouts com feature flags. E se você também está de olho no ecossistema Python, confira as novidades do Python 3.14.3.

Conclusão
O MCP acabou de crescer. A spec 2026-07-28 o transforma de uma camada de integração local promissora para a infraestrutura aberta e fundamental para aplicações de IA enterprise. A sessão morreu — viva a requisição stateless.
Sua jogada: pegue um serviço não-crítico, migre para o SDK beta e faça deploy atrás de um load balancer HTTP padrão. A diferença será imediata.