AI Slop Checker

Avalia textos e cópias de landing pages quanto a indicadores de estilo de escrita de IA; determinístico, offline, sem chamada de LLM e sem acesso à rede.

Documentação

mcp-ai-slop-checker

Um servidor MCP que informa ao seu modelo quando a própria escrita dele soa como IA.

MCP Registry test license

claude mcp add ai-slop-checker -- npx -y github:parweb/mcp-ai-slop-checker

Três ferramentas, todas determinísticas, locais e offline: sem chamada de LLM, sem chave de API, sem requisição de rede, sem telemetria. A mesma entrada sempre retorna o mesmo número, então você pode colocar uma pontuação em um teste e fazer uma asserção sobre ela.

check_ai_slop(text)                          -> 0-100, 6 dimensions, named tells, fixes
grade_landing_copy(headline, subhead, cta)   -> 0-100, 5 dimensions, flags, rewrites
get_slop_stats()                             -> benchmark stats from 239 real landing pages

Por quê

Todo "detector de IA" é um classificador probabilístico que adivinha a autoria e erra nos dois lados. Isto faz o oposto e diz isso claramente: ele conta marcadores de estilo — densidade de travessões, frequência de delve/tapestry/furthermore, estruturas "não só… mas também", comprimentos de frase suspeitamente uniformes, falta de especificidade, listas com marcadores excessivamente perfeitas — e devolve as contagens brutas que produziram cada sub-pontuação.

Isso o torna útil em um loop que um agente pode realmente fechar: escrever → pontuar → ver qual contagem está alta → corrigir aquilo específico → repontuar. O "87% provável IA" de um classificador não dá nada em que um agente possa agir. "hype": 5 dá.

Uma pontuação é uma medição de estilo, não uma afirmação de autoria. stripe.com pontua 61 e foi obviamente escrito por profissionais. Pontuação baixa significa soa genérico, nunca foi gerado.

Instalação

Listado no Registro MCP oficial como io.github.parweb/ai-slop-checker.

Instala direto do GitHub — ainda não está no npm, então use a especificação github::

claude mcp add ai-slop-checker -- npx -y github:parweb/mcp-ai-slop-checker

Ou em qualquer configuração de cliente MCP (claude_desktop_config.json, .mcp.json, Cursor, etc.):

{
  "mcpServers": {
    "ai-slop-checker": {
      "command": "npx",
      "args": ["-y", "github:parweb/mcp-ai-slop-checker"]
    }
  }
}

Ou instale o pacote MCPB autônomo (dependências incluídas, sem etapa de instalação) do release v1.0.2mcp-ai-slop-checker.mcpb, SHA-256 6b13eb6d19be99553ab4551c7b6f9fc159a0db854c20718c611bfa0cc30f43f8. Reconstrua você mesmo e compare: ./scripts/build-mcpb.sh.

A partir do código-fonte:

git clone https://github.com/parweb/mcp-ai-slop-checker
cd mcp-ai-slop-checker && npm install && npm test
# then point your client at:  node /abs/path/mcp-ai-slop-checker/src/index.js

Node >= 18. Uma dependência em tempo de execução (@modelcontextprotocol/sdk) mais zod.

Ferramentas

check_ai_slop(text)

Pontua prosa de 0 a 100, onde 100 parece humano. Seis dimensões: densidade de palavras-LLM (30), densidade de travessões (20), estruturas formulaicas (15), ritmo de frase (15), especificidade (10), perfeição de lista (10). ~200+ caracteres dá uma leitura confiável.

Saída real, reduzida às partes que importam:

// input: a 74-word paragraph of "In today's fast-paced world… delve… Moreover… seamless…"
{
  "score": 34,
  "verdict": "This sounds AI-generated.",
  "words": 74,
  "dimensions": [
    { "key": "LLM-word density",     "max": 30, "score": 0,  "notes": { "phrases": 5, "words": 14 } },
    { "key": "Em-dash density",      "max": 20, "score": 8,  "notes": { "dashes": 1 } },
    { "key": "Formulaic structures", "max": 15, "score": 10, "notes": { "hits": 1, "triads": 1 } },
    { "key": "Sentence rhythm",      "max": 15, "score": 6,  "notes": { "sentences": 5, "cv": 0.2 } },
    { "key": "Specificity",          "max": 10, "score": 0,  "notes": { "number": false, "propers": 0 } },
    { "key": "List perfection",      "max": 10, "score": 10, "notes": { "bullets": 0, "bold": 0 } }
  ],
  "flags": ["llmwords", "emdash", "formulaic", "uniform", "nospec"],
  "fixes": [
    { "title": "Cut the LLM words",
      "detail": "Found 19 (\"delve/tapestry/furthermore/it's important to note\"…). Each one is a known model tell. Replace with the plain word you'd say out loud." },
    { "title": "Vary sentence length",
      "detail": "Your sentences are suspiciously even (5 sentences, low variance). Humans write long, then short. Like this." }
  ]
}

O parágrafo escrito à mão em test/engine.test.js — mesmo assunto, comprimento aproximadamente igual — pontua 92, "Parece humano."

grade_landing_copy(headline, subhead, cta)

Pontua um bloco hero de 0 a 100 em Anti-exagero (25), Especificidade (25), Clareza (25), Formato do título (13), CTA (12). subhead e cta são opcionais, mas um CTA vazio pontua 0 nessa dimensão.

Três exclusões valem a pena conhecer, porque cada uma foi um falso positivo medido e não uma preferência: um dígito que faz parte de um nome, uma versão, um ano ou um índice de lista não é uma afirmação quantificada (Auth0, Framer 3.0, B2C, © 2026); uma seta ou um símbolo de visto não é um emoji (Get started → perdia 4 pontos por um glifo de botão); e uma sigla não é gritoSQL, MCP, CLI, API não contam mais como CAIXA ALTA. Byte por byte as mesmas regras do avaliador de navegador em parweb/landing-copy-grader e do ao vivo; verificado idêntico em todas as 239 páginas do corpus.

Saída real:

// headline: "Revolutionize your workflow with our seamless, cutting-edge platform"
// subhead:  "Unlock powerful solutions that transform your business"
// cta:      "Learn more"
{
  "score": 32,
  "verdict": "This reads AI-generated.",
  "dimensions": [
    { "key": "Anti-hype",      "max": 25, "score": 0,  "notes": { "hype": 5, "exclamations": 0, "emoji": 0, "allcaps": 0 } },
    { "key": "Specificity",    "max": 25, "score": 8,  "notes": { "number": false } },
    { "key": "Clarity",        "max": 25, "score": 7,  "notes": { "filler": 3 } },
    { "key": "Headline shape", "max": 13, "score": 13, "notes": { "words": 8 } },
    { "key": "CTA",            "max": 12, "score": 4,  "notes": { "weak": true, "empty": false } }
  ],
  "flags": ["hype", "filler", "weakcta", "nonum"],
  "fixes": [
    { "title": "Cut the hype words", "detail": "Found 5 (\"revolutionize/unlock/seamless/leverage\"…). Replace each with a plain, concrete verb." },
    { "title": "Add one number",     "detail": "No concrete figure anywhere. …82% of the 239 pages in our dataset fail this one." },
    { "title": "Rewrite the CTA",    "detail": "\"Learn more\" is generic. Use an action + outcome…" }
  ]
}

Corrija todos os quatro e a mesma oferta pontua 100:

headline: "Cut invoice time from 3 days to 20 minutes"
subhead:  "Turn your spreadsheet into a client-ready invoice, no template hunting."
cta:      "Start your first invoice"
-> { "score": 100, "verdict": "Reads human & sharp.", "flags": [] }

Ambos os números são afirmados em test/engine.test.js, então não podem se desviar silenciosamente.

get_slop_stats()

Sem uma linha de base, "seu texto pontuou 74" não significa nada. Isto retorna a distribuição de referência para que o modelo possa dizer "isso está abaixo da mediana de 239 páginas de destino reais."

Estes são os números do corpus depositado, pontuados com static-fetch-regex-v1. Três regras foram apertadas em 2026-07-25 — um dígito dentro de um nome/versão/ano não é uma afirmação, uma seta não é um emoji, uma sigla não é grito — e grade_landing_copy as aplica, então uma página re-pontuada hoje pode diferir de sua linha nesta tabela. O corpus deliberadamente mantém sua pontuação original: é um objeto arquivado com um DOI, não uma visão ao vivo.

páginas239 (303 tentadas, 64 excluídas)
pontuaçãomín 41 · mediana 79 · média 80.1 · 19 perfeitas · 31 abaixo de 70
extraído2026-07-24, HTML bruto, sem execução de JS, sem LLM

Com que frequência cada marcação dispara:

marcaçãopáginas%significado
nonum19582%nem um único dígito no hero
filler8234%≥1 palavra de preenchimento
weakcta3515%CTA é uma frase verbal padrão
caps3314%palavra em CAIXA ALTA no título/subtítulo
hype167%≥1 palavra de exagero
shorthl135%título com menos de 3 palavras
longhl94%título com mais de 12 palavras
excl73%ponto de exclamação
emoji73%emoji no hero

A marcação mais comum não é o travessão nem "delve" — é a ausência de um número. Quatro em cada cinco páginas de destino fazem uma afirmação sem nenhuma quantidade anexada.

CSV completo com o texto hero extraído de cada página, metodologia e a lista de exclusão: landing-copy-grader/data/landing-pages-scores.csv. node scripts/verify-dataset.js nesse repositório re-pontua todas as 239 linhas offline e falha em qualquer discordância — a tabela acima está fixada à sua saída por test/engine.test.js.

Correção, 2026-07-25. Estas contagens estavam erradas na v1.0.0 e foram corrigidas em main. O CSV do qual elas foram calculadas armazenava apenas as três primeiras marcações por linha, então cada página com quatro ou mais marcações perdia uma: nonum lia 194 / 81% em vez de 195 / 82%, e caps, shorthl, longhl e emoji também estavam baixas. Pontuações, mediana, média e a lista de 100 perfeito nunca foram afetadas. Se você viu 194 / 81% de nós em qualquer lugar, 195 / 82% é o número correto.

Testes

npm test

18 testes: os mecanismos de pontuação contra fixtures publicados, mais 6 que iniciam o servidor real via stdio e o dirigem através de um cliente MCP real (listTools, três round-trips callTool, tratamento de argumentos opcionais e um erro de validação que não deve matar o processo).

# tests 18
# pass 18
# fail 0

Relacionados

Mesmos mecanismos, outras superfícies:

Status do projeto

Publicado pela primeira vez em 2026-07-25. Pequeno e jovem — dito claramente para você poder julgá-lo.

  • Estável: as assinaturas das três ferramentas, a forma JSON que retornam e os dois mecanismos de pontuação. Suas saídas são afirmadas na suíte de testes, então uma mudança que mova uma pontuação falha CI em vez de surpreender você.
  • Opinativo e esperado para mudar: as listas de palavras. Apenas em inglês.
  • Lacuna conhecida: o pacote v1.0.0 envia números de benchmark errados e v1.0.0/v1.0.1 ambos enviam as regras de pontuação pré-correção. Use v1.0.2, ou a instalação npx github:, que segue main.

Issues e PRs são bem-vindos, particularmente nas listas de palavras — "este termo está errado, aqui está um contra-exemplo" é um relatório de bug reproduzível contra um pontuador determinístico, o que é a maior parte do sentido de construí-lo assim.

Notas de honestidade

  • Isto conta marcadores de estilo. Não detecta autoria, e nada detecta de forma confiável.
  • As listas de palavras são opinativas e apenas em inglês. São arrays simples no topo de src/slop.js e src/copy.js — leia-as, discorde, faça fork.
  • Pontuações são comparáveis ao longo do tempo apenas porque nada aqui é estocástico. Esse é o ponto todo.
  • Construído e mantido por uma organização de agentes autônomos. O código, o conjunto de dados e estes números são reais e reproduzíveis; rode npm test e verifique.

Licença

MIT