slop-scorer
slop-scorer-mcp
MCP-сервер, который сообщает агенту, пишущему код, со ссылками на источники, какие части кодовой базы или отрисованной веб-страницы выглядят как машинный шаблонный вывод, и возвращает точную правку, которая удалит каждую из них.
В этом сервере не задействована ни одна модель. Каждая находка ссылается на файл и номер строки или на CSS-селектор и вычисленное значение стиля, которые вы можете проверить самостоятельно. Семьдесят правил, все они — данные, и у каждого есть собственное опровержение.
claude mcp add slop-scorer -- npx -y github:Yuve21/slop-scorer-mcpНужен Node 20 или новее, и больше ничего. На npm его пока нет, поэтому эта команда устанавливает из этого репозитория; первый запуск компилирует и занимает около минуты. Полные подробности и два других способа подключения — в разделе Установка.
Почему это существует
Интересная часть — не обнаружение. Это list_rules, который возвращает весь корпус, чтобы агент мог прочитать, чего не следует создавать, до того как он что-либо создаст.
Обнаружение — это гонка, которая в конце концов проигрывается: генераторы совершенствуются, признаки выцветают, а корпус признаков — обесценивающийся актив. Предотвращение не выцветает, потому что агент, который сначала читает корпус, создаёт такой материал, на который корпус не срабатывает. Это единственный цикл здесь, который становится сильнее, чем больше его используют.
Related MCP server: Sensory-Grounding MCP
Чего он не будет делать
Это важнее списка возможностей, поэтому оно стоит первым.
Он никогда не говорит, что человек использовал ИИ. Каждое предложение, которое он может выдать, имеет одну и ту же грамматику: подлежащее — сервер, дополнение — артефакт, глагол — действие, которое совершил сервер. «Мы проверили этот артефакт по 15 детерминированным правилам, и 4 совпали, при 88% покрытии». А не «это ИИ». Форматтер не может выразить другое предложение, и тест в
@slop/coreроняет сборку, если в исходном коде появляется запрещённая фраза.Воздержание — это результат, а не сбой.
statusпринимает значениеassessed,inconclusive(мы посмотрели и не публикуем число) илиnot_assessed(мы не смотрели). Оба воздержания содержатscore: nullи закодированную причину. Это не низкие оценки и не справки о полной чистоте. Ориентируйтесь наstatus, никогда наscore.Оценка останавливается на 99. Не существует такой комбинации доказательств, которая достигает полной уверенности.
Неполное чтение полностью скрывает оценку. Страница, отрисованная лишь наполовину, выглядит точно так же, как чистая страница, и печать уверенного числа на основе частичного чтения была бы самой нечестной вещью, которую этот сервер мог бы сделать.
Он нигде не публикует показатель точности.
packages/core/test/no-claims.test.tsпри каждом прогоне тестов сканирует каждый поставляемый исходный файл и каждый README и роняет сборку, если такой показатель появляется. Заявление о точности относительно умозаключения — это утверждение, требующее обоснования, в смысле раздела 5 Закона о FTC (In re Workado, 2026), поэтому единственный способ, которым такое утверждение можно защитить, — вычислить его на именованном корпусе во время теста. Если вам нужна цифра, запуститеnpm run backtestи прочитайте свою.Он никогда не записывает файлы. Никакой записи в файловую систему, никакого
exec, нигде в пакете нет запроса на доступ на запись. Исправления возвращаются как данные, которые ваш агент применяет в вашем обычном процессе подтверждения.
Установка
slop-scorer-mcp пока нет в реестре npm, поэтому каждая команда здесь устанавливает из этого репозитория. Это работает нормально, но есть одна оговорка, которую стоит прочитать, прежде чем вы решите, что установка сломалась.
Первый запуск компилирует из исходников. Замерено на холодную, с пустым кэшем npm: 69 секунд. Большинство MCP-клиентов дают серверу 30 секунд на ответ, поэтому первое подключение может сообщить connection timed out, хотя ничего не сломано. Переподключитесь или сначала прогрейте кэш:
npx -y github:Yuve21/slop-scorer-mcp # wait for "listening on stdio", then Ctrl-CКаждый последующий запуск идёт из кэша и происходит мгновенно.
Claude Code
claude mcp add slop-scorer -- npx -y github:Yuve21/slop-scorer-mcpClaude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json в macOS, %APPDATA%\Claude\claude_desktop_config.json в Windows. После этого перезапустите приложение.
{ "mcpServers": { "slop-scorer": { "command": "npx", "args": ["-y", "github:Yuve21/slop-scorer-mcp"] } } }Cursor
~/.cursor/mcp.json глобально или .cursor/mcp.json для каждого проекта. Тот же блок. Перезагрузите окно.
{ "mcpServers": { "slop-scorer": { "command": "npx", "args": ["-y", "github:Yuve21/slop-scorer-mcp"] } } }Из чекаута
Используйте это, если собираетесь изменить правило и посмотреть, как оно сработает.
git clone https://github.com/Yuve21/slop-scorer-mcp
cd slop-scorer-mcp
npm install # `prepare` builds it for you
npm run install:local --workspace=packages/mcp-serverЭта последняя строка регистрирует собранный бинарник с помощью claude mcp add по абсолютному пути. Если CLI claude нет в PATH, он печатает JSON-блок для ручной вставки, а не молча падает.
Когда он появится на npm
claude mcp add slop-scorer -- npx -y slop-scorer-mcpНет шага сборки, нет холодного старта, потому что тарбол из реестра поставляется скомпилированным. Сегодня это отдаёт 404.
Как работает установка из GitHub
npx -y github:... разрешается в корень репозитория, и у npm нет способа указать git-спеке на поддиректорию. Поэтому корневой package.json здесь содержит bin (одну запись — именно это позволяет npx выбрать исполняемый файл), скрипт prepare (единственный хук жизненного цикла, который npm запускает для git-зависимости: prepack там не выполняется), список files, в котором указан packages/mcp-server/dist (потому что dist/ в .gitignore, а npm при упаковке откатывается к .gitignore, что привело бы к поставке тарбола с удалённым бинарником), и две зависимости времени выполнения, которые бандл esbuild оставляет внешними. Рядом с ними лежит корневой .npmignore, так что .gitignore вообще не задействуется.
scan_ui требует браузер
npx playwright install chromiumБез него scan_ui возвращает status: "not_assessed" и объясняет почему. Он не будет откатываться к чтению HTML сервера: чтение только через fetch даёт уверенные находки о документе, которого никто не видит, — именно так проверка заголовков однажды сообщила «на этом маршруте 0 H1» для маршрута, чей заголовок не существует до гидратации.
Пять инструментов
инструмент | что делает |
| Весь корпус, компактно. Прочитайте перед генерацией. |
| Статический анализ чекаута плюс история git. |
| Отрисовывает URL или dev-сервер в Chromium и измеряет отрисованный документ. |
| Повторно сканирует и возвращает каждую находку как точную правку с оговорками. |
| Повторно сканирует и показывает наборы находок до и после рядом. |
list_rules
Семьдесят правил в двух корпусах: 51 для веба, 19 для кода. По умолчанию компактно, потому что инструмент, который просит вызвать его до того, как вы что-то сгенерируете, не может стоить пятой части небольшого контекстного окна.
index every rule, one line: id | family | polarity/severity | weight | rationale
fullEntries why it reads as generated, the counter-evidence that rebuts it, how to avoid it
retrieval a sentence on every response saying how to get what was left outmodality: "web" | "code" | "all" optional
family: e.g. "agent-artifact" optional
ruleIds: ["craft.no-og-image", ...] full entries for these only
verbose: true, full entries for every rule costs roughly 18k tokensОбычный паттерн после сканирования — ruleIds: [...the ids that fired], что стоит несколько сотен токенов и возвращает ровно то опровержение и ту заметку о предотвращении, которые нужны, чтобы на них отреагировать.
scan_codebase
path: absolute path to the repository root
include: optional patterns, e.g. ["src/**/*.ts"]
readHistory: read git history for the commit-shape rules (default true)
maxFiles: cap on files walked (default 5000)Реальное чтение, полученное наведением этого сервера на его собственный чекаут. Здесь ничего не набрано вручную: это байты ответа, слегка обрезанные для краткости. Обратите внимание: он находит вещи и в нас.
SLOP RECEIPT 20 / 99 band: few known signals
corpus code-corpus-2026.09 | coverage 100% | families fired 2
evidence kind: deterministic | detectors: code.static-rules
We checked this artifact against 19 deterministic rules from code-corpus-2026.09 and 4
matched, on 100% coverage. That places it in the "few known signals" band at 20 of 99.
Every match below cites what we read and where.
15 base rate before any evidence
+26 scaffold.placeholder-markers [scaffold-residue / medium] -> 41
Unfilled placeholders left in shipped source
evidence: line packages/detectors-code/src/artifact.ts:73 = "lorem ipsum"
(expected "a real value")
evidence: line packages/detectors-code/src/artifact.ts:109 = "TODO: implement"
(expected "a real value")
evidence: line packages/detectors-code/src/suppression.ts:18 = "lorem ipsum"
(expected "a real value")
... and 4 more, 5 counted toward the weight
caveat: TODOs are a normal and healthy way to record known gaps, and a mature
codebase carries plenty. Markers that name an owner or a ticket are
excluded as tracked work. Suppressed by suppress.self-defining-pattern:
19 match(es) were withdrawn as self-referential: the cited lines in
packages/detectors-code/src/scan.ts are the DEFINITION of the patterns
that matched them, not uses of them.
+23 verify.tautological-tests [verification-floor / high] -> 64
Tests that cannot fail
evidence: file packages/detectors-code/test/corpus/index.ts
= "93 lines, 0 assertions" (expected "at least one assertion")
evidence: file packages/detectors-web/test/corpus/index.ts
= "60 lines, 0 assertions" (expected "at least one assertion")
caveat: A deliberate smoke test that only checks a module imports without
throwing looks like this, and an assertion helper the scanner does not
recognise reads as zero assertions.
-42 counter.rationale-comments [counter-evidence / counter] -> 22
Comments that record a reason, not a restatement
evidence: line packages/core/src/assessment.ts:61 = "We read the artifact cleanly
and it carried no declared provenance either way. ABSENCE OF PROVENANCE
IS NOT EVIDENCE OF GENERATION."
... and 3 more, 4 counted toward the weight
caveat: A rationale comment can be copied along with the code it explains, and an
agent prompted to explain its reasoning will write plausible ones. The
signal is real but it is not proof.
-2 counter.real-test-coverage [counter-evidence / counter] -> 20
Tests dense enough to actually fail
evidence: metric "26 test files against 63 source files"
= "606 assertions, 0 tautologies"
20 TOTAL (base 15 + 4 contribution(s))
FAMILY CAPS
Scaffold residue +26 pts logit 1.37 of 1.60 allowed
Verification floor +23 pts logit 1.35 of 0.96 allowed AT CAP
Global counter-evidence logit -2.00 AT CAP (bypasses family caps)
WHAT WOULD CHANGE THIS SCORE
-26 scaffold.placeholder-markers: Fail the build on the placeholder strings your
scaffold ships with. They are the ones nobody notices.
-23 verify.tautological-tests: Mutation-test the test: break the code it covers and
confirm it goes red. If it stays green, delete it or fix it.
A high score means this artifact resembles generated-template output. It is not proof that
a tool made it, and it is not a judgement of the person who made it.Четыре вещи в этом выводе заслуживают внимания, потому что в них и заключается дизайн:
Контрдоказательства вычитаются. Два из четырёх совпадений говорят в пользу артефакта, и вместе они весят больше, чем всё против него. Корпус, который умел бы только обвинять, оценил бы любую аккуратную кодовую базу как сгенерированную.
Семейства ограничены потолком. «Verification floor» внёс 23 очка и помечен как
AT CAP, поэтому ни одна отдельная коррелированная группа признаков не может сама по себе вынести вердикт.Чек сходится. Базовый уровень плюс каждое напечатанное слагаемое даёт напечатанную оценку, точно, в целых числах. Вы можете пересчитать число вручную.
Суппрессор сработал и заявил об этом. Девятнадцать совпадений-заглушек были отозваны, потому что совпавшие строки — это таблица паттернов, определяющая паттерн. Суппрессор второй фазы может отозвать доказательства о детекторе, а не об артефакте, но обязан назвать правило, файл и причину в чеке, где вы можете это увидеть.
В реальном ответе каждое значение, скопированное из сканированного артефакта, обёрнуто в ограждение untrusted, и полезная нагрузка завершается предупреждением об инъекции в промпт, потому что сканер, цитирующий чужой исходник в контексте агента, — это вектор инъекции. Выше ограждения убраны только для того, чтобы пример читался.
scan_ui
url: https://example.com/pricing
port: 3000 (instead of url, for a local dev server)
viewportWidth: default 390
viewportHeight: default 844Отрисовывает в Chromium и измеряет отрисованный документ: отпечатки конструктора сайтов, визуальный язык по умолчанию, дефекты, выдающие конвейерную работу, однородность структуры и движения, признаки в текстах. Реальная находка:
+7 css.crushed-tracking [visual-default / medium] -> 34
Headline letter-spacing is crushed at a heavy weight
evidence: css letter-spacing on h1 = "-0.04em at weight 800"
(expected "-0.02em or looser at weight 700+")
caveat: Some faces genuinely want negative tracking at display size, and a
type-literate designer may choose exactly this. It is a taste signal,
not a provenance signal.В этой сборке отсутствует одна возможность, и отсутствует намеренно. Текст, отрисованный внутри изображения, здесь не извлекается: восстановитель живёт в приватной половине проекта, поэтому packages/ocr-text в этом репозитории всегда воздерживается, прикрепляя указанную причину к каждому изображению, о котором его спросили. Три правила imgtext.* поэтому не могут сработать в живом запуске scan_ui. Они остаются в list_rules (совет не прятать свой текст в JPEG стоит прочитать в любом случае) и по-прежнему оценивают замороженные артефакты корпуса, так что архивные числа не меняются. Это записано, а не молча опущено, потому что непрочитанное изображение — это не изображение без слов.
propose_fixes
Повторно сканирует цель и возвращает каждую находку как предложение, сгруппированное по семействам и разделённое на четыре категории, чтобы ваш агент мог подать это как «применить эти N, пропустить эти M».
категория | значение |
|
|
|
|
|
|
|
|
{
"id": "agent.instruction-file-committed#1",
"ruleId": "agent.instruction-file-committed",
"applicability": "confirm",
"destructive": true,
"blastRadius": "file",
"remediation": {
"kind": "delete_file",
"path": "CLAUDE.md",
"bytes": 4200,
"summary": "Remove CLAUDE.md from the repository and from the index.",
"rebuttal": "This says how the repository was worked on, not who wrote any given line.",
"doNotApplyIf": "this file is a deliberate part of how the team works. In that case keep it and say so in the README, which answers the finding without deleting anything."
}
}Большинство правил намеренно предлагают manual. Заголовок страницы, мета-описание, атрибут alt и фирменная палитра — всё это машина может создать мгновенно, и всё это случаи, где машинное производство и есть тот дефект, который измеряет этот корпус. Сгенерированный альтернативный текст — самый ясный случай: он удовлетворяет проверку и уверенно сообщает пользователю скринридера об изображении, на которое никто не смотрел. Поэтому эти правила называют пробел и останавливаются.
В этом инструменте повсюду действуют два ограничения:
Только детерминированное чтение может предлагать патч. Там, где детектор воздерживается от уверенности, исправление не может на ней настаивать.
Каждое исправление несёт собственное опровержение правила и явный
doNotApplyIf, подставляемый изfalsePositiveNoteправила, чтобы исправление и аргумент против него никогда не могли разойтись.Контрдоказательства никогда не устранимы. Контрнаходка говорит в пользу артефакта. Корпус падает при загрузке, если кто-то прикрепляет к ней исправление.
verify_fix
Before: 9 finding(s). After: 6. 3 no longer present, 6 still present, 0 newly present.
Score moved by -14 point(s).Он не сообщает об успехе. noLongerPresent — это список правил, которые больше не совпадают по этим локаторам; это факт о повторном сканировании, а не утверждение, что проблема решена. newlyPresent указывается первым и устанавливает regression: true, потому что изменение, которое устраняет две находки и вносит одну, что-то сломало, а верификатор, сообщивший бы итог нетто, назвал бы это улучшением. Если в этой сессии нет более раннего чтения цели, он говорит об этом, а не сравнивает с ничем: первый запуск никогда не означает, что всё чисто.
Цикл
scan, propose, apply, verify. Отчёт никогда не был целью; целью было изменение.
1. scan_codebase / scan_ui what is there, with a locator on every claim
2. propose_fixes the same findings as precise, caveated edits
3. YOUR agent applies them with its own edit tools, under the user's normal approval
4. verify_fix re-scan, and show which findings are no longer presentШаг 3 намеренно не является задачей этого сервера. У вашего агента уже есть инструменты редактирования, запрос подтверждения и пользователь, который им доверяет. Вторая, худшая копия этого механизма внутри MCP-сервера означала бы больше кода, больше риска и меньше контроля.
Что в этом репозитории
пакет | что это |
| Сервер. Пять инструментов, бинарный файл stdio, бандл publish-shape. |
| Контракт правил, движок оценки, квитанция, калибровочный стенд. |
| Кодовый корпус: 19 правил и 16 размеченных репозиториев (10 человеческих, 4 сгенерированных, 2 синтетических). |
| Веб-корпус: 51 правило и 9 размеченных страниц (5 человеческих, 4 сгенерированных). |
| Воздерживающийся заменитель пары «изображение-текст», описанный в разделе |
Опубликованный npm-пакет самодостаточен: npm run build собирает три внутренних пакета рабочей области в dist/bin.js и dist/index.js с помощью esbuild и встраивает их объявления типов, так что ничто в тарболе не указывает на пакет, который никогда не публиковался. @modelcontextprotocol/sdk и zod остаются настоящими внешними зависимостями; playwright остаётся опциональной peer-зависимостью.
Соберите самостоятельно
npm install
npm run build # tsc -b, then the esbuild bundle
npm test # the rule suite, both calibration corpora, the security and FTC guards
npm run backtest # the gate: replay both frozen corpora and diff against the baselinenpm test никогда не запускает браузер. Веб-тесты выполняются на сохранённых артефактах, что и делает калибровку воспроизводимой.
Участие в разработке
Сначала прочтите CONTRIBUTING.md. Короткая версия: правило в этом репозитории — это обвинение, за которым стоит арифметика, поэтому планка — npm run backtest, а не «тесты зелёные». Каждое правило поставляет позитивный фикстур, который должен срабатывать, и мутированный фикстур, который не должен, и мета-набор тестов прогоняет оба при каждом запуске тестов. Добавление элемента корпуса с указанным и проверяемым происхождением — более значимый вклад, чем добавление правила.
Лицензия
MIT. См. LICENSE.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Lints + auto-fixes how AI coding agents discover any new product. 24 rules, 6 tools, score 0-100.
Trust signals for AI agents: an open agent-readiness standard and developer tool guide. Read-only.
Browser-backed QA with evidence and fix-ready reports for coding agents.
Evidence-backed x402 web verification for AI agents, with auditable decisions for every condition.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to scan code for security and quality issues and receive machine-readable reports with suggested fixes and verification criteria.722MIT
- AlicenseNot gradedqualityBmaintenanceGives AI coding agents a closed-loop verification cycle for visual, audio, and video output, with enforcement hooks that make verification mandatory.Apache 2.0
- AlicenseNot gradedqualityDmaintenanceEnables AI coding agents to record auditable work ledgers with evidence chains, from contract to proof packet, via MCP tools for file scanning, code review, and issue triage.48MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI coding agents like Claude and Cursor to audit websites for AI agent readiness, checking 199 rules across agentic discovery, content structure, and technical SEO.17Apache 2.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Yuve21/slop-scorer-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server