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 bouwde voor de Minotaurus, 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 klasse 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 dat endpoint consumeert, 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 gesuperviseerd, met een resource-limiet, en hun uitvoer telt pas mee nadat die een schema- en limietcontrole doorstaat. 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 vanaf 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 daar zelf niets van nodig hoeft te hebben. De Rust-worker wordt in een builder-stage gecompileerd en als binary gekopieerd, dus ook een Rust-toolchain zit niet in de runtime-image.
docker build -t knossos-mcp:dev .
docker run --rm knossos-mcp:dev doctor --jsonVoorbeelden
Twee aanroepen, echt uitgevoerd op de eigen broncode van Knossos-MCP, ingekort met '…'.
Een scan van de repository:
$ 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 resulterende graph:
$ 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
| Categorie | Tools (selectie) | Wat het beantwoordt |
|---|---|---|
| Oriëntatie | server_info, diagnose_runtime | Welke roots toegankelijk zijn, of de runtimes gezond zijn |
| Projecten en historie | scan_project, list_snapshots, snapshot_diff, quality_gate | De graph bouwen of verversen, wat er tussen twee scans veranderde, of een wijziging architectuurbudgetten doorbreekt |
| Componenten vinden en lezen | find_component, inspect_component, list_usages, architecture_summary | Kandidaten bij een halve naam, de rollen en relaties van een component, elke usage met bewijs |
| Structuur- en impactanalyse | impact_analysis, explain_flow, dependency_cycles, change_impact, test_impact, review_diff | Wat van een symbol afhangt, hoe A bij B komt, circulaire afhankelijkheden, hoe ver een wijziging uitstraalt, welke tests erdoor geraakt worden |
| Onderhoud | annotate_component, remove_project, cleanup_stale_scans, maintain_database | Een blijvende annotatie vastleggen, projecten opruimen, database-integriteit bewaken |
| Taal | Extractie | Framework-verrijking |
|---|---|---|
| PHP 8.3+ | Declaraties, overerving, aanroepen, constructie, types, injectie | Laravel, Symfony |
| TypeScript/JavaScript | Compiler-symboolresolutie, imports, aanroepen, types, project references | Next.js, React, Vue, stores, endpoints |
| Python 3.11+ | AST uit de standaardbibliotheek, in een geïsoleerde interpreter; manifests, packages, aanroepen, routes | FastAPI, Django, Flask, Celery |
| Rust 1.82+ | syn-parsing; Cargo-manifesten, impl-blokken over bestanden heen, routes. Roept nooit cargo of rustc aan | axum, 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.
Gemengde repositories komen samen in één graph. impact_analysis en verwante tools labelen elke conclusie met een confidence (certain, probable, possible) in plaats van hem 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:
{
"$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 grenzen; policies verbiedt specifieke relaties tussen die grenzen, en check_architecture toetst elke wijziging eraan. quality_budgets zet harde drempels op regressies zoals nieuwe circulaire afhankelijkheden of grensoverschrijdingen, gecontroleerd door quality_gate.