Naar inhoud

Chaos-MCP

Breek je code met opzet, en ontdek wat je tests nooit opmerkten.

Chaos (Χάος) is in de Griekse kosmogonie het allereerste wat bestond, de gapende leegte die Hesiodus in de Theogonie voor alles laat komen. Orde ontstond eruit, niet andersom. De naam betekent 'kloof' of 'afgrond', en dat is precies waar deze tool naar zoekt.

Wat het doet

Dekking zegt dat een regel is uitgevoerd, niet dat iemand heeft gecontroleerd wat die regel deed. Verander een > in een >=, draai de suite, en als die nog steeds slaagt, dan heeft niets in die suite die vergelijking ooit getoetst, hoe groen het rapport ook was.

Chaos-MCP doet dat met opzet, en systematisch. Drie tools: audit_code_resilience (één bestand auditen), triage_test_coverage (een hele boom zwakste-eerst rangschikken) en estimate_audit (een goedkope schatting vooraf van het aantal mutanten en de looptijd). Elke overlevende mutant is een concrete regel met een concrete wijziging die je suite liet passeren, en dat is een veel scherpere aanwijzing dan een percentage.

Elke run gebeurt in een sandbox: je echte werkruimte wordt nooit aangeraakt, en er wordt gecontroleerd dat het echte pad van het doelbestand binnen die sandbox ligt voordat een engine draait. Vier mutation-engines dekken vier ecosystemen: StrykerJS voor TypeScript en JavaScript, cosmic-ray voor Python, cargo-mutants voor Rust en Infection voor PHP, elk native of via een vastgepind container-image, zodat de host de toolchain niet hoeft te installeren.

Snel starten

Chaos-MCP staat nog niet op npm, dus installeer het vanaf de broncode.

bash
git clone https://github.com/AraneaDev/Chaos-MCP.git
cd Chaos-MCP
npm install
npm run build
claude mcp add chaos-mcp -- node /absolute/path/to/Chaos-MCP/build/index.js

Voorbeelden

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

Een snelle schatting vooraf, zonder dat er een mutatie draait:

Aanroep (estimate_audit):

json
{ "filePath": "src/utils/path-safety.ts" }

Resultaat:

json
{
  "target": "src/utils/path-safety.ts",
  "language": "typescript",
  "mutants": 36,
  "fidelity": "approx",
  "basis": "source heuristic: 31 constructs",
  "note": "Approximate mutant count from a source-parse heuristic; the real audit may differ. Run audit_code_resilience for exact results."
}

Een volledige audit van een klein bestand:

Aanroep (audit_code_resilience):

json
{ "filePath": "src/utils/ignore-dirs.ts", "maxSurvivors": 5 }

Resultaat:

json
{
  "target": "src/utils/ignore-dirs.ts",
  "mutationScore": "100.00%",
  "summary": { "total": 8, "killed": 8, "survived": 0 },
  "survivors": [],
  "noCoverage": [],
  "note": "No surviving mutants — the test suite caught every mutation.",
  "runId": "f17fcb15"
}

Mogelijkheden

ToolWat het doet
audit_code_resilienceMuteert één bestand en rapporteert per regel welke mutanten je tests wel en niet doodden
triage_test_coverageRangschikt een hele boom zwakste-eerst, met optionele git-diff-scoping
estimate_auditSnelle schatting van het aantal mutanten en, optioneel, de looptijd, voorafgaand aan een volledige run
TaalEngineInstalleren in het doelprojectNauwkeurigheid van estimate_audit
TypeScript/JavaScriptStrykerJS@stryker-mutator/core, plus @stryker-mutator/vitest-runner bij een vitest-projectapprox
Pythoncosmic-raypipx install cosmic-rayapprox
Rustcargo-mutantscargo install cargo-mutantsexact
PHPInfectioncomposer require --dev infection/infection, met Xdebug of PCOVapprox

Rust is als enige exact, omdat cargo-mutants --list opsomt welke mutanten het gaat genereren. De andere drie schatten op basis van een bronheuristiek. De audit zelf scoort vervolgens minder Rust-mutanten dan de schatting: mutanten die niet compileren tellen niet mee in de noemer en komen als incompetent in het rapport.

Elke audit draait desgewenst in een vastgepinde container in plaats van native op de host. Een runId uit een eerdere audit laat je precies die overlevende mutanten herverifiëren nadat je tests hebt aangevuld. Mutanten die logisch equivalent zijn aan het origineel kun je onderdrukken, waarna ze buiten de score blijven. minScore zet elke audit of triage om in een pass/fail-veld voor CI, zonder ooit zelf af te breken.

Configuratie

Chaos-MCP leest chaos-mcp.config.json uit de root van je werkruimte.

json
{
  "defaultTimeoutMs": 300000,
  "mutatorDenylist": ["StringLiteral"],
  "concurrency": 4,
  "defaultMaxFiles": 25,
  "defaultMaxSurvivors": 10,
  "defaultSeverityFloor": "medium",
  "container": {
    "mode": "auto",
    "runtime": "docker",
    "cpus": 2,
    "memoryMb": 4096
  }
}

mutatorDenylist sluit mutatortypen globaal uit. defaultMaxSurvivors en defaultSeverityFloor begrenzen hoeveel overlevende mutanten een rapport toont en vanaf welke ernst. container.mode: "auto" gebruikt een container zodra de geconfigureerde runtime bereikbaar is, en valt anders terug op native uitvoering.