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.
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.2 —
mcp-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 é grito — SQL, 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áginas | 239 (303 tentadas, 64 excluídas) |
| pontuação | mín 41 · mediana 79 · média 80.1 · 19 perfeitas · 31 abaixo de 70 |
| extraído | 2026-07-24, HTML bruto, sem execução de JS, sem LLM |
Com que frequência cada marcação dispara:
| marcação | páginas | % | significado |
|---|---|---|---|
nonum | 195 | 82% | nem um único dígito no hero |
filler | 82 | 34% | ≥1 palavra de preenchimento |
weakcta | 35 | 15% | CTA é uma frase verbal padrão |
caps | 33 | 14% | palavra em CAIXA ALTA no título/subtítulo |
hype | 16 | 7% | ≥1 palavra de exagero |
shorthl | 13 | 5% | título com menos de 3 palavras |
longhl | 9 | 4% | título com mais de 12 palavras |
excl | 7 | 3% | ponto de exclamação |
emoji | 7 | 3% | 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:nonumlia 194 / 81% em vez de 195 / 82%, ecaps,shorthl,longhleemojitambé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:
- Isso soa IA? —
check_ai_slopno navegador - Leaderboard de páginas de destino — todas as 239 páginas, pontuadas, com o texto hero
- parweb/landing-copy-grader — o avaliador de navegador em arquivo único e o conjunto de dados
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.0envia números de benchmark errados ev1.0.0/v1.0.1ambos enviam as regras de pontuação pré-correção. Usev1.0.2, ou a instalaçãonpx github:, que seguemain.
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.jsesrc/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 teste verifique.
Licença
MIT