Momus-MCP
Controleer of tests productiegedrag toetsen en mocks overeenkomen met de productiecontracten.
Momus-MCP is genoemd naar Momus, de personificatie van kritiek in de Griekse mythologie.
- TypeScript
- MCP
- Vitest
- Jest
- PHPUnit
- Pest
- pytest
- mockall
GitHub (opent in een nieuw tabblad)README (opent in een nieuw tabblad)Changelog (opent in een nieuw tabblad)
Op deze paginaTestkwaliteit controleren
Testkwaliteit controleren
Geslaagde tests kunnen weinig bewijs geven over productiegedrag. Een assertion die een waarde met zichzelf vergelijkt, slaagt altijd. Een assertion die alleen de ingestelde retourwaarde van een mock controleert, toetst de testopzet in plaats van de implementatie. Een stub kan ook verwijzen naar een method die niet meer op de productieclass bestaat. Zulke problemen kunnen in gegenereerde tests ontstaan wanneer de opdracht vooral gericht is op een geslaagde testsuite.
Momus-MCP leest tests en de aangesproken productiecode, bouwt een symbol-graph van classes en interfaces en controleert mocks, spies en assertions aan de hand van die graph. De audit voert je code niet uit, gebruikt het netwerk niet en schrijft niet naar je werkruimte. Bevindingen zijn deterministisch: een audit van dezelfde werkruimte levert byte voor byte dezelfde bevindingen op.
Snel starten
Momus-MCP staat nog niet op npm. Installeer uit de broncode met Node.js 20 of nieuwer en de Claude Code CLI:
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" serveVoorbeelden
Deze voorbeelden zijn vastgelegd tijdens runs op de bronrepository van Momus-MCP.
De regelcatalogus opvragen:
$ 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) — mocked name is not exported by the target module (vi.mock factory keys, Python patch targets)
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 fixturemap vanuit een schone checkout auditen:
$ 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:trueDetectieregels en taalondersteuning
| Categorie | Regels | Wat wordt gedetecteerd |
|---|---|---|
| Tautologische assertions | TAUT-001 t/m TAUT-006 | Zelfvergelijking, mock-echo, constante tautologie, mock-only-assertions, zero-reach-stubs, ongeconfigureerde spy-assertions |
| Mock-contractdrift | DRIFT-001 t/m DRIFT-006 | Ontbrekende members, signature-mismatches, return-type-mismatches, constructor-drift, ontbrekende exports, verouderde mocks (op basis van git-diff) |
| Mock-hygiëne | MOCK-001, MOCK-002 | Overmocking (saturatie), het mocken van de module die wordt getest |
Dertien van de veertien regels gelden voor alle vier de talen. Constructordrift is alleen voor PHP; de TypeScript-compiler controleert ontbrekende constructorargumenten al. Elke taalparser verwerkt de productiesymbolen uit het betreffende ecosysteem om contracten te vergelijken.
| Taal | Testframeworks | Ondersteunde mock-API's | Ingeschakeld |
|---|---|---|---|
| TypeScript/JavaScript | Vitest, Jest | vi.mock, vi.fn, vi.spyOn, vi.mocked en de Jest-equivalenten | standaard |
| PHP | PHPUnit, Pest | createMock, getMockForAbstractClass, de mock() van Mockery | standaard |
| Python | pytest, unittest | patch, patch.object, Mock(spec=), mocker, monkeypatch | languages.python |
| Rust | ingebouwde testharness | mockall (#[automock], mock!, expect_*().returning()), mockito | languages.rust |
Python en Rust staan standaard uit. Schakel de betreffende parsers in om deze talen mee te nemen in de audit van een bestaande werkruimte.
Configuratie
Momus-MCP leest .momusrc uit de root van de werkruimte. Gebruik npx momus init om een configuratiebestand te genereren:
{
"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 schakelt elke parser per project in of uit. ignorePatterns sluit gegenereerde code en meegeleverde code van derden uit. rules stelt de ernst per regel in. tokenBudget begrenst de rapportgrootte voor verwerking door een model; het bevindingenformaat houdt één bevinding onder 100 tokens.