Naar inhoud

Momus-MCP

De felste criticus onder de goden, gericht op je testsuite.

Momus is de Griekse personificatie van satire, spot en blaam, de enige god wiens hele taak het was om fouten te vinden, en die van de Olympus werd gegooid omdat hij dat te goed deed.

Wat het doet

Een testsuite kan groen zijn om de verkeerde reden. Een assertie die een waarde met zichzelf vergelijkt, een mock die precies de waarde teruggeeft die je hem net hebt opgedragen te geven, een stub voor een methode die de klasse die hij nabootst niet meer heeft: alle drie slagen ze, en geen van drieën bewijst dat de code werkt. Coding agents zijn goed in precies dit soort testen schrijven, want een groene suite is het doel dat ze meekregen, geen middel daarnaartoe.

Momus-MCP leest je testsuite en de productiecode die erdoor wordt aangesproken, bouwt daaruit een symbol-graph van de echte klassen en interfaces, en toetst elke mock, spy en assertie aan die graph. Het voert je code nooit uit, praat nooit met het netwerk en schrijft nooit naar je werkruimte. Bevindingen zijn deterministisch: dezelfde werkruimte levert elke keer dat je hem auditeert byte voor byte dezelfde uitvoer op.

Snel starten

Momus-MCP staat nog niet op npm, dus installeer het vanaf de broncode. Vereist: Node.js 20 of nieuwer en de Claude Code CLI.

bash
git clone https://github.com/AraneaDev/Momus-MCP.git
cd Momus-MCP
npm install
npx momus audit .
claude mcp add momus -- "$(pwd)/node_modules/.bin/momus" serve

Voorbeelden

Twee aanroepen, allebei echt uitgevoerd op de eigen broncode van Momus-MCP.

De regelcatalogus opvragen:

bash
$ npx momus rules | head -20
TAUT-001 self-comparison (error) — assertion compares an expression with itself
TAUT-002 mock-echo (error) — assertion re-asserts a stub's own configured return
TAUT-003 constant-tautology (error) — both assertion sides are compile-time constants
TAUT-004 mock-only-assertion (warning) — test exercises no production code
TAUT-005 zero-reach-stub (warning) — mock configured but never invoked or asserted
TAUT-006 unconfigured-spy-assert (warning) — toHaveBeenCalled* on a spy with no stub and no call path
DRIFT-001 missing-member (error) — stubbed member does not exist on the production target
DRIFT-002 signature-mismatch (warning) — stub call signature diverges from production (arity)
DRIFT-003 return-type-mismatch (warning) — configured value not assignable to the production return type
DRIFT-004 constructor-drift (error) — double construction omits required constructor parameters (PHP)
DRIFT-005 missing-export (error) — vi.mock factory keys reference exports that do not exist
DRIFT-006 stale-mock (warning) — mock target changed since the base ref but the mock file was not updated (git-diff mode)
MOCK-001 mock-saturation (warning) — over-mocking heuristic
MOCK-002 mock-of-self (info) — the test mocks a module it also imports as the SUT

Suppression: // @momus-ignore | // @momus-ignore:RULE | /** @momus-ignore */ | // @momus-ignore-file[:RULE]

Een map met fixtures auditen vanaf een schone checkout:

bash
$ npx momus audit packages/parser-typescript/test/fixtures 2>&1 | head -20
# Momus audit — packages/parser-typescript/test/fixtures

Audited 59 files · 0 issues (0 error · 0 warning · 0 info) · 6951ms — CLEAN:true

Mogelijkheden

CategorieRegelsWat het opspoort
Tautologische assertiesTAUT-001 t/m TAUT-006Zelfvergelijking, mock-echo, constante tautologie, mock-only-asserties, zero-reach stubs, ongeconfigureerde spy-asserties
Mock-contractdriftDRIFT-001 t/m DRIFT-006Ontbrekende members, signature mismatches, mismatches in return-type, constructordrift, ontbrekende exports, verouderde mocks (git-diff aware)
Mock-hygiëneMOCK-001, MOCK-002Overmocking (saturatie), het mocken van de module die wordt getest

Dezelfde regels gelden voor TypeScript en JavaScript (Vitest, Jest), PHP (PHPUnit, Pest, Mockery), Python (pytest, unittest, opt-in) en Rust (mockall, opt-in).

Configuratie

Momus-MCP leest .momusrc uit de root van je werkruimte; npx momus init genereert er een voor je.

jsonc
{
  "languages": { "typescript": true, "php": false },
  "testFilePatterns": ["**/*.{test,spec}.{ts,tsx,js,jsx,mjs}", "**/__tests__/**"],
  "ignorePatterns": ["**/node_modules/**", "**/dist/**", "**/.git/**"],
  "rules": {
    "TAUT-002": { "severity": "error" }
  },
  "tokenBudget": { "maxIssuesPerReport": 50, "maxIssueLineTokens": 100 },
  "cache": { "dir": ".momus/cache", "enabled": true }
}

languages zet een parser per project aan of uit. ignorePatterns houdt gegenereerde en vendored code buiten de audit. rules laat je de ernst van een specifieke regel aanscherpen of juist verzachten. tokenBudget begrenst wat één rapport een agent kost om te lezen, zodat een het contract een bevinding onder de 100 tokens houdt.