Naar inhoud

Knossos-MCP

Het labyrint één keer in kaart, zodat niemand er nog doorheen hoeft te dwalen.

Knossos (Κνωσός) is het bronstijdpaleis in het hart van Minoïsch Kreta, een complex zo uitgestrekt dat de Griekse mythologie het onthield als het Labyrint, de doolhof die Daedalus voor de Minotaurus bouwde en die niemand kon doorkruisen zonder een draad om de weg terug te vinden. Ariadne gaf die draad aan Theseus.

Wat het doet

Vraag een agent wat er van een class afhangt en hij leest de broncode opnieuw, elke sessie, en vertelt je wat hij eruit heeft afgeleid. Knossos-MCP scant de repository één keer en antwoordt uit een graph waarin elk feit een bestand en een regel bij zich draagt. Wat statische analyse niet kan bewijzen, krijgt een confidence-label, geen stille gok.

Vier talen komen samen in dezelfde graph. Een Vue-component die een PHP-endpoint aanroept, een Python-worker die datzelfde endpoint gebruikt, een Rust-binary ernaast: ze worden samengevoegd tot één geheel van nodes en relaties, zodat een impactvraag een taalgrens net zo makkelijk oversteekt als de code zelf.

Scannen installeert nooit dependencies, importeert nooit een module en start nooit een framework op: workers draaien onder toezicht, met een resource-limiet, en hun uitvoer telt pas mee nadat die een schema- en limietcontrole heeft doorstaan. Drieëndertig MCP-tools dekken oriëntatie, projecten en historie, het opzoeken van componenten, structuur- en impactanalyse en onderhoud; alleen server_info heeft geen CLI-equivalent. De vier schrijftools tonen standaard een preview en passen pas iets toe zodra je expliciet execute meegeeft.

Snel starten

Knossos-MCP staat nog niet op Packagist of in een container-registry, dus bouw de image zelf uit de broncode. De aanbevolen distributie is Docker: die pint PHP, Node, Python, Composer, SQLite, de PHP-parser en de TypeScript-compiler vast, zodat het gescande project die dingen zelf niet nodig heeft. De Rust-worker wordt in een builder-stage gecompileerd en als binary gekopieerd, dus ook een Rust-toolchain zit niet in de runtime-image.

bash
docker build -t knossos-mcp:dev .
docker run --rm knossos-mcp:dev doctor --json

Voorbeelden

Twee calls, echt uitgevoerd op de eigen broncode van Knossos-MCP, ingekort met '…'.

Een scan van de repository:

bash
$ knossos scan . --json
{"summary":"Scanned 411 files into 5851 nodes and 33284 relationships.",
 "data":{"files":411,"nodes":5851,"edges":33284,"diagnostics":0,"mode":"full",
   "scanner_metadata":{"knossos.php":{"files_scanned":377},
     "knossos.typescript":{"files_scanned":17,"programs":1},
     "knossos.python":{"files_scanned":7,"parser":"python.ast"},
     "knossos.rust":{"files_scanned":10,"parser":"rust.syn"}},
   "metrics":{"elapsed_ms":6494.8, …}}}

Alle vier de workers dragen bij aan die ene scan, en er komt geen enkele diagnostic uit.

Jezelf oriënteren in de graph die daaruit komt:

bash
$ knossos architecture-summary project_1b4f41… --json
{"summary":"Knossos-MCP contains 5851 nodes and 33284 relationships.",
 "data":{"node_kinds":[{"kind":"method","count":3979},{"kind":"class","count":437},
   {"kind":"external_method","count":407},{"kind":"external_function","count":310},
   {"kind":"function","count":297}, …],
   "languages":[{"kind":"php","count":377},{"kind":"javascript","count":17},
     {"kind":"rust","count":10},{"kind":"python","count":7}]}}

Mogelijkheden

CategorieTools (selectie)Wat het beantwoordt
Oriëntatieserver_info, diagnose_runtimeWelke roots toegankelijk zijn, of de runtimes gezond zijn
Projecten en historiescan_project, list_snapshots, snapshot_diff, quality_gateDe graph bouwen of verversen, wat er tussen twee scans veranderde, of een wijziging architectuurbudgetten overschrijdt
Componenten vinden en lezenfind_component, inspect_component, list_usages, architecture_summaryKandidaten bij een halve naam, de rollen en relaties van een component, elk gebruik met bewijs
Structuur- en impactanalyseimpact_analysis, explain_flow, dependency_cycles, change_impact, test_impact, review_diffWat van een symbool afhangt, hoe A bij B komt, circulaire afhankelijkheden, hoe ver een wijziging doorwerkt, welke tests erdoor geraakt worden
Onderhoudannotate_component, remove_project, cleanup_stale_scans, maintain_databaseEen blijvende annotatie vastleggen, projecten opruimen, database-integriteit bewaken
TaalExtractieFramework-verrijking
PHP 8.3+Declarations, inheritance, calls, construction, types, injectionLaravel, Symfony
TypeScript/JavaScriptCompiler symbol resolution, imports, calls, types, project referencesNext.js, React, Vue, stores, endpoints
Python 3.11+AST uit de standard library, in een geïsoleerde interpreter; manifests, packages, calls, routesFastAPI, Django, Flask, Celery
Rust 1.82+syn-parsing; Cargo-manifests, impl-blokken over bestanden heen, routes. Roept nooit cargo of rustc aanaxum, actix, Rocket

Rust is de enige taal die optioneel is bij een native installatie: zonder cargo is er geen Rust-worker, en de container heeft er altijd een.

impact_analysis en verwante tools labelen elke conclusie met een confidence (certain, probable, possible) in plaats van die als zekerheid te presenteren. Een relatie waar de scanner niet voor kan instaan, laat hij weg. Dat is een bewuste false negative.

Configuratie

Knossos-MCP leest knossos.json (of knossos.jsonc) uit de root van het gescande project. Dit is de configuratie van Knossos-MCP zelf:

json
{
  "$schema": "./schemas/project-config-v1.schema.json",
  "version": 1,
  "ignores": ["tests/Fixtures"],
  "boundaries": [
    { "name": "core", "path_prefix": "src" },
    { "name": "php-worker", "path_prefix": "workers/php" },
    { "name": "typescript-worker", "path_prefix": "workers/typescript" },
    { "name": "python-worker", "path_prefix": "workers/python" },
    { "name": "tooling", "path_prefix": "tools" },
    { "name": "tests", "path_prefix": "tests" }
  ],
  "policies": [
    {
      "id": "workers-are-out-of-process",
      "from_boundary": "php-worker",
      "deny_targets": ["core"]
    }
  ],
  "quality_budgets": {
    "new_cycles": 0,
    "boundary_violations": 0,
    "error_diagnostics": 0,
    "warning_diagnostics": 0,
    "hub_degree_growth": 25,
    "unreferenced_candidates": 110
  }
}

boundaries verdeelt de codebase in benoemde gebieden; policies verbiedt specifieke relaties tussen die gebieden, en check_architecture toetst elke wijziging eraan. quality_budgets stelt harde grenzen aan regressies zoals nieuwe circulaire afhankelijkheden of grensoverschrijdingen, en quality_gate toetst ze.

Sessie-oriëntatie voor Claude Code

De server beantwoordt structuurvragen zodra een agent eraan denkt om er een te stellen. Een aparte plugin zorgt dat de agent eraan denkt.

De installatie voegt twee dingen toe aan je Claude Code-sessie. Een SessionStart-hook schrijft een korte briefing: één regel over de vraag of de graph nog klopt met de broncode, en daarbij de boundary rules en de vastgelegde annotaties van het project. De entry points en de hubs komen er alleen bij als die ene regel zegt dat de graph actueel is.

De tweede helft is een skill die de sessie vertelt welke vragen naar de graph gaan en welke niet. Een configuratiesleutel, een foutmelding of een TODO blijven bij grep, want structuur is wat de graph indexeert. Een bestand dat je zo gaat bewerken blijft bij Read, want Edit werkt op de exacte bytes. En zolang de briefing zegt dat de graph verouderd is, heeft geen enkele structuurvraag zin.

Niets roept die skill bij naam aan. De slotregel van de briefing zet hem op scherp, en daarom valt die regel buiten het tekenbudget van de briefing: een briefing die binnen haar budget blijft door de verwijzing te schrappen, laat de skill de hele sessie ongebruikt.

bash
knossos install-agent-plugin           # previews; add --execute to apply

De plugin levert zelf geen binary mee. De hook draait de eerste knossos die hij vindt in een bewust kort lijstje, KNOSSOS_BIN, dan PATH, dan drie gebruikelijke locaties, want een lange zoektocht maakt het starten van een sessie traag. Vindt hij er geen, dan stopt hij zwijgend, zoals elke fout in die hook: een hook die de start van een sessie kapotmaakt, kost meer dan de briefing ooit waard was. Een symlink in ~/.local/bin, een van die drie, is meestal de enige stap die ontbreekt.

Er is bewust geen publieke marketplace-route. De descriptor wordt gegenereerd in een map die buiten git blijft en nooit wordt meegecommit, dus claude plugin marketplace add AraneaDev/Knossos-MCP faalt met Marketplace file not found. Dat moet ook: de kloon waar hij anders op uit zou komen heeft geen vendor/, dus zijn eigen bin/knossos draait niet, en een installatie die elke keer zwijgend faalt levert niets op en vertelt je ook niet waarom.