Skip to main content
Glama

slop-scorer-mcp

コードベースまたはレンダリングされたWebページのどの部分が機械生成のテンプレート出力として読めるかを、引用付きでコーディングエージェントに伝え、それぞれを削除する正確な編集を返すMCPサーバです。

このサーバのどこにもモデルは関与していません。すべての指摘は、ファイル名と行番号、またはCSSセレクタと算出スタイル値を引用しているため、自分で確認しに行けます。70のルールはすべてデータであり、すべてが独自の反論を備えています。

claude mcp add slop-scorer -- npx -y github:Yuve21/slop-scorer-mcp

Node 20以降だけで、他には何も必要ありません。まだnpmには公開されていないため、その行はこのリポジトリからインストールします。初回起動時にコンパイルが行われ、約1分かかります。詳細と、もう2つの導入方法は、Installにあります。


なぜこれが存在するのか

興味深い部分は検出ではありません。それは list_rules です。コーパス全体を返すので、エージェントは何かを生成する前に、何を生成してはいけないかを読めます。

検出は、最終的に負ける競争です。生成器は改善され、兆候は劣化し、兆候のコーパスは減価する資産です。予防は劣化しません。コーパスを先に読んだエージェントは、コーパスが発火しない成果物を書くからです。これは、使えば使うほど強くなる、ここで唯一のループです。

Related MCP server: Sensory-Grounding MCP

これがやらないこと

これは機能リストよりも重要なので、最初にあります。

  • 人がAIを使ったとは決して言いません。 このサーバが出力できるすべての文は同じ文法を持ちます。主語はサーバ、目的語は成果物、動詞はサーバが行った何かです。「この成果物を15の決定的ルールに対してチェックし、88%のカバレッジで4つが一致しました。」「これはAIです」とは言いません。フォーマッタは後者の文を表現できず、@slop/core のテストは、禁止された語句がソースに現れるとビルドを失敗させます。

  • 棄権は結果であり、失敗ではありません。 statusassessed(調べた)、inconclusive(調べたが数値は出さない)、not_assessed(調べなかった)のいずれかです。どちらの棄権も score: null とコード化された理由を伴います。これらは低スコアでもなければ、問題なしの証明書でもありません。分岐は status に対して行い、決して score に対して行わないでください。

  • スコアは99で止まります。 確実性に到達する証拠の組み合わせは存在しません。

  • 不完全な読み取りはスコアを完全に保留します。 半分しかレンダリングされていないページは、きれいなページとまったく同じに見えます。部分的な読み取りに対して自信満々の数値を出力することは、このサーバができる最も不誠実なことです。

  • 正確性の数値は、どこにも公開しません。 packages/core/test/no-claims.test.ts は、テスト実行のたびに出荷されたすべてのソースファイルとすべてのREADMEをスキャンし、もし1つでも現れればビルドを失敗させます。推論に関する正確性の主張は、FTC法第5条(In re Workado、2026)の下では裏付けを要する主張です。したがって、正確性の主張を保持する唯一の弁護可能な方法は、テスト時に名前付きコーパスから計算することです。数値が欲しいなら、npm run backtest を実行して、自分自身の数値を読んでください。

  • ファイルを書き込むことは決してありません。 ファイルシステムへの書き込みも exec も、書き込みアクセスの要求も、パッケージのどこにもありません。修正は、通常の承認フローの下でエージェントが適用できるデータとして返されます。

インストール

slop-scorer-mcpまだnpmレジストリにありません。そのため、ここにあるすべてのコマンドはこのリポジトリからインストールします。これは正常に動作しますが、インストールが壊れたと判断する前に読んでおく価値のある注意点が1つあります。

初回起動時はソースからコンパイルします。 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-mcp

Claude Desktop

macOSでは ~/Library/Application Support/Claude/claude_desktop_config.json、Windowsでは %APPDATA%\Claude\claude_desktop_config.json です。その後、アプリを再起動してください。

{ "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 に登録します。claude CLIがPATH上にない場合は、静かに失敗する代わりに、手で貼り付けるためのJSONブロックを出力します。

npmに公開されたら

claude mcp add slop-scorer -- npx -y slop-scorer-mcp

レジストリのtarballはコンパイル済みで配布されるため、ビルドステップもコールドスタートもありません。これは今日の時点では404になります。

GitHubインストールの仕組み

npx -y github:... はリポジトリのROOTを解決し、npmにはgitスペックをサブディレクトリに向ける方法がありません。そのため、ここにあるルートの package.json には、bin(npxが実行可能ファイルを選べるようにする単一エントリ)、prepare スクリプト(npmがgit依存関係に対して実行する唯一のライフサイクルフックで、prepack はそこで実行されません)、packages/mcp-server/dist を指定する files リスト(dist/ はgitignoreされており、npmはパッキング時に .gitignore にフォールバックするため、そのままだとバイナリが取り除かれたtarballが配布されてしまいます)、そしてesbuildバンドルが外部のままにする2つのランタイム依存関係が含まれています。それらの隣にルートの .npmignore を置くことで、.gitignore は一切参照されません。

scan_ui にはブラウザが必要

npx playwright install chromium

これがないと、scan_uistatus: "not_assessed" を返し、その理由を述べます。サーバHTMLを読むフォールバックは行いません。フェッチだけの読み取りは、誰も見ないドキュメントについて自信満々の指摘を生み出します。実際、あるヘッディングチェックが、ハイドレーションまでヘッディングが存在しないルートに対して「このルートにはH1が0個」と報告したことがあります。


5つのツール

ツール

機能

list_rules

コーパス全体をコンパクトに返します。生成前に読んでください。

scan_codebase

チェックアウトの静的解析と、git履歴。

scan_ui

URLまたは開発サーバをChromiumでレンダリングし、レンダリングされたドキュメントを測定します。

propose_fixes

再スキャンし、各指摘を正確で条件付きの編集として返します。

verify_fix

再スキャンし、修正前後の指摘セットを並べて表示します。

list_rules

2つのコーパスにわたる70のルールがあります。Web 51、コード19です。デフォルトではコンパクトです。何かを生成する前に呼び出されることを求めるツールが、小さなコンテキストウィンドウの5分の1を消費するわけにはいかないからです。

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 out
modality: "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.

その出力の中で、設計上注目に値する点が4つあります。

  1. 反対証拠は減算されます。 4件の一致のうち2件は成果物に有利に働き、合わせると反対するすべてよりも価値があります。非難しかできないコーパスは、注意深く書かれたコードベースをすべて生成物としてスコア付けするでしょう。

  2. ファミリーには上限があります。 "Verification floor" は23ポイントに寄与し、AT CAP とマークされています。したがって、相関する兆候の単一グループだけで評決を下すことはできません。

  3. レシートは整合します。 ベースレートと、表示されたすべての寄与を足すと、表示されたスコアに整数で正確に一致します。その数値を手で再計算できます。

  4. サプレッサが発火し、その旨を明言しました。 一致した行がパターンを定義するパターンテーブルそのものであるため、19件のプレースホルダ一致が取り下げられました。フェーズ2のサプレッサは、成果物についてではなく検出器についての証拠を取り下げることがありますが、その場合はルール、ファイル、理由をレシートの中で名指ししなければならず、そこで確認できます。

実際の応答では、スキャンした成果物からコピーされたすべての値は 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.

このビルドには1つの機能が欠けており、それは意図的に欠けています。 画像内部にレンダリングされたテキストはここでは復元されません。復元機能はプロジェクトのプライベートな半分に存在するため、このリポジトリの packages/ocr-text は、問い合わせを受けたすべての画像に理由を添えて常に棄権します。したがって、3つの imgtext.* ルールは実際の scan_ui 実行では発火できません。それらは list_rules に残り(コピーをJPEGに埋め込まないという助言はどちらにせよ読む価値があります)、凍結されたコーパス成果物のスコアリングも行われるため、アーカイブされた数値は動きません。これは黙って省略されるのではなく明記されています。読まれていない画像は、言葉のない画像と同じではないからです。

propose_fixes

ターゲットを再スキャンし、すべての指摘を提案として返します。ファミリーごとにグループ化され、4つに分類されるため、エージェントは「これらN件は適用、これらM件はスキップ」として提示できます。

バケット

意味

readyToApply

replace_rangeinsertreplace_file。ロケータと置換内容の両方が確定しています。

needsConfirmation

delete_file。唯一の破壊的な種類で、ゲート可能なように専用のバケットになっています。

needsSourceLocation

ui_change。セレクタ、プロパティ、値は正確です。それらを宣言しているファイルは、レンダリングされた読み取りからは知ることができません。

decideYourself

manual。人間が決定します。ロケータと、良い回答がどのようなものかが示され、発明された値はありません。

{
  "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属性、ブランドパレットは、すべて機械が即座に生成できるものであり、その機械による生成こそがこのコーパスが測定する欠陥です。生成されたaltテキストが最も明確な例です。チェッカーは満たすものの、誰も見ていない画像について、スクリーンリーダーユーザーに自信満々に伝えます。そのため、それらのルールはギャップを名指しして止まります。

このツールのどこでも成り立つ制約が2つあります。

  • パッチを提案できるのは決定的な読み取りだけです。 検出器が確実性を棄権する場合、修正はそれを主張できません。

  • すべての修正には、ルール自身の反論と明示的な 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 を設定します。2つの指摘を解決して1つを新たに生み出す変更は、何かを壊しているからです。差し引きで報告する検証器は、それを改善と呼んでしまうでしょう。このセッションでターゲットの以前の読み取りが保持されていない場合は、何もないものと比較するのではなく、その旨を述べます。初回実行は決して全問題なしではありません。


ループ

スキャン、提案、適用、検証。 重要なのはレポートではなく、変更でした。

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サーバの中に置くことは、より多くのコード、より多くのリスク、そしてより少ない制御をもたらすだけです。

このリポジトリの内容

package

説明

packages/mcp-server

サーバー。5つのツール、stdioバイナリ、publish-shape バンドル。

packages/core

ルール契約、スコアリングエンジン、レシート、キャリブレーション用ハーネス。

packages/detectors-code

コードコーパス: 19ルールと、16のラベル付きリポジトリ(人間作成10、生成4、合成2)。

packages/detectors-web

ウェブコーパス: 51ルールと、9のラベル付きページ(人間作成5、生成4)。

packages/ocr-text

scan_ui で説明されている、判定を棄権する画像テキスト用の代役。

公開されたnpmパッケージは自己完結型です。npm run build は、esbuildを使って3つの内部ワークスペースパッケージを dist/bin.jsdist/index.js にバンドルし、それらの型宣言も同梱します。したがって、tarball内のどこにも、公開されていないパッケージを指すものはありません。@modelcontextprotocol/sdkzod は実際の外部依存関係のままです。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 baseline

npm test はブラウザを起動しません。ウェブテストは保存されたアーティファクトに対して実行されます。これこそがキャリブレーションを再現可能にしている理由でもあります。

コントリビューティング

まず CONTRIBUTING.md を読んでください。短く言うと、このリポジトリのルールとは、背後に算術を伴う告発です。したがって合格基準は npm run backtest であり、「テストが通っている」ことではありません。すべてのルールには、必ず発火するポジティブフィクスチャと、発火してはならないミューテーション済みフィクスチャが同梱され、メタスイートはすべてのテスト実行でその両方を実行します。明記され、検証可能な由来を持つコーパスメンバーを追加することは、ルールを追加することよりも大きな貢献です。

ライセンス

MIT。LICENSE を参照してください。

Maintenance

ActivityMaintained
ResponsivenessSyncing

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

Related MCP Servers

Latest Blog Posts

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