
O Problema com a Duplicação 'Sombra' Gerada por IA
Agentes de IA são incríveis em escrever funções. Eles são ainda melhores em duplicar acidentalmente toda a lógica do seu negócio sem que você perceba.
Se você usa Claude Code, Cursor ou qualquer agente baseado em LLM para refatorar código, provavelmente já viu o padrão. Você pede para 'extrair essa lógica em uma utilidade reutilizável', e enquanto a nova função funciona perfeitamente, alguns dias depois, há uma versão ligeiramente diferente daquela mesma lógica escondida em outro serviço. Os nomes das variáveis são diferentes, o espaço em branco é atualizado para formatação moderna, mas a complexidade subjacente— a implementação estrutural real— é idêntica.
Isso é 'duplicação sombra.' Não aparece em um grep padrão ou em um diff simples. Um revisor humano pode não perceber isso durante uma PR porque a sintaxe superficial parece nova. Mas à medida que a base de código cresce, sua dívida técnica não está apenas se acumulando; está se mutando.
Eu construí o Detector de Clones de Código do MCP especificamente para eliminar esse padrão na origem, dando aos agentes de IA uma maneira de 'ver' através do ruído sintático.
A Falha da Detecção Baseada em Sintaxe
A detecção de duplicação padrão geralmente depende da correspondência literal de strings. Se você mudar let userCount = 0 para const totalUsers = 0, a maioria das ferramentas básicas sinaliza isso como um bloco de código novo e único.
Para um agente de IA, este é o modo de operação padrão. Os agentes tendem a 'personalizar' o código— eles renomeiam variáveis para corresponder ao contexto local ou limpam comentários. Se sua estratégia de detecção apenas procura correspondências exatas de caracteres, você está essencialmente cego para 80% da duplicação sendo introduzida em fluxos de trabalho modernos de agentes.
Para resolver isso, precisamos nos afastar de olhar para o que o código diz e começar a olhar para o que o código é.
Normalização: Eliminando o Ruído
A primeira ferramenta neste MCP é generate_normalized_signature. Esta é, sem dúvida, a parte mais importante do pipeline.
Antes de tentarmos comparar dois blocos, os passamos por um processo de normalização. Removemos comentários, normalizamos todo o espaço em branco (convertendo tabs/espaços em um formato uniforme) e— o mais crítico— anonimamos variáveis.
Ao substituir nomes de variáveis específicas por tokens genéricos, criamos o que eu chamo de 'esqueleto estrutural.' Se você tiver duas funções que iteram sobre um array, verificam uma condição nula e incrementam um contador, suas assinaturas normalizadas parecerão quase idênticas, independentemente de o código original chamá-las de index, i ou counter.
Isso permite que o agente realize uma análise estrutural sem precisar de um parser AST (Árvore de Sintaxe Abstrata) pesado rodando em sua janela de contexto. Reduzimos o problema de 'compreensão semântica' para 'correspondência estrutural.'
Detectando Correspondências Exatas vs. Próximas
O servidor fornece duas camadas distintas de detecção:
Clones Estruturais Idênticos (
identify_exact_duplicates): Isso usa hashing determinístico nas assinaturas normalizadas. Uma vez que temos essa versão simplificada e anonimizada do código, uma simples comparação de hash nos diz se a lógica subjacente é um clone exato. É incrivelmente rápido e captura aquelas refatorações de 'copiar-colar' onde o desenvolvedor (ou agente) apenas duplicou um bloco e mudou o nome da função.A Distância de Levenshtein (
identify_near_matches): É aqui que as coisas ficam interessantes. Às vezes, o código não é um clone exato, mas é funcionalmente 'próximo o suficiente' para justificar uma investigação. Usamos o algoritmo de distância de Levenshtein para calcular a distância de edição entre essas assinaturas normalizadas.
Não apenas lhe damos um 'sim/não' binário. Você pode ajustar o limite de similaridade entre 0 e 1. O padrão é definido em 0.8. Se o agente encontrar um bloco com uma similaridade de 0.85, isso significa que há apenas uma pequena quantidade de diferença estrutural— provavelmente apenas uma condição extra ou um tipo de loop ligeiramente diferente. Isso captura os 'clones evoluídos' que ferramentas padrão ignoram.
Por que isso importa para seu Fluxo de Trabalho Agente
Quando você está trabalhando no Cursor ou Claude com uma conexão MCP, o agente não deve apenas estar escrevendo código; ele deve estar auditando seu próprio impacto em sua arquitetura.
Imagine um fluxo de trabalho como este:
- Você pede ao agente para implementar um novo recurso.
- O agente escreve a implementação.
- Você aciona o Detector de Clones de Código através de uma chamada de ferramenta MCP.
- O agente escaneia a base de código existente em busca de correspondências próximas usando sua nova capacidade.
- O agente percebe: 'Espere, eu acabei de reinventar a lógica de
calculateTaxque já existe emutils/finance.ts. Eu deveria refatorar isso para usar a função existente em vez disso.'
Isso transforma a IA de um gerador de código em um administrador de código. Move a responsabilidade de manter os princípios DRY (Don't Repeat Yourself) do seu processo de revisão manual diretamente para o loop de execução do agente.
Começando
Você não precisa configurar callbacks OAuth complexos ou gerenciar ambientes locais. Como isso roda no Vinkius, você apenas pega um token de conexão e cola em seu cliente.
Se você quiser começar a auditar seu projeto em busca dessas duplicações estruturais ocultas, você pode encontrar o servidor aqui: https://vinkius.com/mcp/code-clone-detector
Pare de deixar seus agentes acumularem sombras em sua base de código.
MCPs são a música dos Agentes de IA. Nós construímos o catálogo. Descubra Catálogo MCP Vinkius.
Empresas brasileiras que utilizam agentes de IA para desenvolvimento de software devem estar atentas à duplicação de código. A implementação de ferramentas de detecção de duplicação pode reduzir a dívida técnica e melhorar a eficiência do desenvolvimento. Isso é crucial para manter a qualidade do software em um ambiente de trabalho cada vez mais automatizado.
