
Atualização do Claude Desktop quebrou meu servidor MCP: JSON Schema draft-07 vs 2020-12
Se o seu aplicativo Claude Desktop se atualizou durante a noite e seus servidores MCP locais pararam de registrar na manhã seguinte, essa é provavelmente a razão. Não é sua configuração, e não é o código do seu servidor. Um cliente MCP mais recente começou a rejeitar seus esquemas de ferramenta devido a uma string de versão no esquema.
O erro
No Windows, a versão MSIX do Claude Desktop se atualizou automaticamente para 1.32352.1.0. Depois disso, meu servidor MCP de sistema de arquivos se recusou a registrar em sessões Cowork:
Tool 'list_directory' has an invalid outputSchema: JSON Schema declares an unsupported
dialect ("$schema": "http://json-schema.org/draft-07/schema#"). The default validator
supports JSON Schema 2020-12 only
Re-adicionar o servidor nas configurações não ajudou. Outro usuário reproduziu a mesma falha exata com um servidor MCP n8n, 33 ferramentas, mesmo erro. Não era um servidor ruim.
O que realmente mudou
Claude Desktop envia sua própria cópia do SDK TypeScript MCP. A versão atualizada agrupa @modelcontextprotocol/client 2.0.0-beta.4, e seu validador padrão (Ajv) lança um erro em qualquer esquema de ferramenta que declare um dialeto $schema diferente de 2020-12.
A parte que dói: a especificação MCP (SEP-1613) diz que 2020-12 é apenas o padrão quando $schema está ausente. Declarar draft-07 é legal. O cliente beta foi mais rigoroso do que a especificação.
A outra metade da história: se você construiu um servidor MCP com o SDK TypeScript 1.x, zod-to-json-schema carimbou draft-07 em cada inputSchema e outputSchema que gerou. Portanto, uma atualização do lado do cliente quebrou servidores que nunca mudaram uma linha.
A correção upstream já foi implementada. O PR #2534 do modelcontextprotocol/typescript-sdk foi mesclado e enviado no cliente 2.0.0, que valida qualquer dialeto que você declarar em vez de rejeitar tudo, exceto 2020-12. Claude Desktop ainda agrupa o cliente beta mais antigo. Detalhe interessante: o Claude Code CLI já agrupa o cliente corrigido, mesmos esquemas, mesmo dia, sem erro. O atraso é específico do desktop, e como o MSIX se atualiza automaticamente, você não pode realmente fixar uma versão anterior do desktop.
A correção que funciona hoje
Opção 1: um pequeno proxy stdio que limpa $schema
O proxy inicia seu servidor real, passa mensagens inalteradas e reescreve as respostas tools/list para que nenhuma ferramenta declare um dialeto rejeitado. Duas pessoas confirmaram que isso funciona, 14 de 14 e 33 de 33 ferramentas registrando, com chamadas de ferramentas reais sucedendo após a reescrita.
// mcp-dialect-fix.mjs
import { spawn } from "node:child_process";
import readline from "node:readline";
// inicia o servidor real
const server = spawn("npx", ["-y", "@modelcontextprotocol/server-filesystem", "C:/data"], {
stdio: ["pipe", "pipe", "inherit"],
});
const rl = readline.createInterface({ input: server.stdout });
rl.on("line", (line) => {
try {
const msg = JSON.parse(line);
// as respostas tools/list carregam result.tools mas não o campo method
if (msg.result && Array.isArray(msg.result.tools)) {
for (const tool of msg.result.tools) {
// delete a declaração do dialeto, ou defina-a para a URI 2020-12
for (const key of ["inputSchema", "outputSchema"]) {
if (tool[key]?.$schema) delete tool[key].$schema;
}
}
}
process.stdout.write(JSON.stringify(msg) + "\n");
} catch {
process.stdout.write(line + "\n");
}
}
Empresas brasileiras que utilizam servidores MCP precisam estar atentas a atualizações de software que podem impactar a funcionalidade de suas ferramentas. A implementação de soluções como proxies pode garantir a continuidade dos serviços sem interrupções.

