AI Slop Code RIsk Monitor

jgraph/drawio-mcp

6.4 Moderate pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for jgraph/drawio-mcp, a JavaScript project with 5,605 GitHub stars. SynthScan examined 26,287 lines of code across 79 source files, recording 90 pattern matches distributed across 3 syntactic categories. The legacy adjusted pattern signal is 6.4 (Moderate pattern signal); it is not an authorship estimate.

Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.

6.4
Adjusted Signal
6.4
Raw Pattern Score
100%
Time Factor
2026-10-10
Last Push
5.6K
Stars
JavaScript
Language
26.3K
Lines of Code
79
Files
90
Pattern Hits
2026-10-12
Scan Date
0.00
HC Hit Rate

Risk Review · v3

Use each vector to guide manual verification of the underlying findings.

Cognitive Ownership Risk 7.6/100 · LOW

Can maintainers explain intent, assumptions, and trade-offs? 48 finding(s).

Hallucinated Dependency & Supply Chain Risk 0.0/100 · LOW

Are imports declared and package/API names verified? 0 finding(s).

Agent Over-Engineering Ratio 23.2/100 · LOW

Are wrappers, guards, and repeated structures necessary? 55 finding(s).

PR Review Velocity Impact 28.2/100 · MEDIUM

Which changes need focused human review? 90 finding(s).

What These Metrics Mean

Adjusted Signal
Legacy pattern score normalized per 1,000 scanned lines and multiplied by the repository-level time factor. It is not an estimate of AI authorship.
Raw Pattern Score
Sum of severity- and context-weighted pattern findings before applying the time factor.
Time Factor
A coarse multiplier based on repository last-push metadata. It does not identify when individual code was written.
Pattern Hits
Count of configured pattern findings. Review each location and surrounding code before acting.
HC Hit Rate
High- and critical-severity findings per scanned file. Severity is a configured detector weight, not proof of a vulnerability or authorship.
Lines / Files
Scan coverage denominators used by the legacy normalized score.

Pattern-Signal History

This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.

Severity Breakdown

Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.

CRITICAL 0HIGH 0MEDIUM 42LOW 48

Directory Score Breakdown

This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.

Pattern Findings

The scanner identified 90 distinct pattern matches across 3 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.

Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.

Decorative Section Separators42 hits · 126 pts
SeverityFileLineSnippetContext
MEDIUMmcp-tool-server/test/libavoid-pass.test.js60// ─── No-ops ──────────────────────────────────────────────────────COMMENT
MEDIUMmcp-tool-server/test/libavoid-pass.test.js73// ─── Routing ─────────────────────────────────────────────────────COMMENT
MEDIUMmcp-tool-server/test/libavoid-pass.test.js128// ─── Pages (#73) ─────────────────────────────────────────────────COMMENT
MEDIUMmcp-tool-server/test/libavoid-pass.test.js128// ─── Pages (#73) ─────────────────────────────────────────────────COMMENT
MEDIUMmcp-tool-server/test/libavoid-pass.test.js170// ─── Wrapped cells ───────────────────────────────────────────────COMMENT
MEDIUMmcp-tool-server/test/libavoid-pass.test.js203// ─── Determinism ─────────────────────────────────────────────────COMMENT
MEDIUMmcp-tool-server/test/libavoid-pass.test.js254// ─── Unroutable connectors ───────────────────────────────────────COMMENT
MEDIUMmcp-tool-server/test/libavoid-pass.test.js312// ─── Rotated shapes ──────────────────────────────────────────────COMMENT
MEDIUMmcp-tool-server/test/mermaid-elk.test.js9// ─── Diagram type (drawio-dev's getMermaidDiagramType) ───────────COMMENT
MEDIUMmcp-tool-server/test/mermaid-elk.test.js37// ─── Selecting the ELK layout ────────────────────────────────────COMMENT
MEDIUMmcp-tool-server/test/mermaid-elk.test.js96// ─── The trigger draw.io actually uses ───────────────────────────COMMENT
MEDIUMmcp-tool-server/test/elk-pass.test.js63// ─── No-ops (no ELK bundle needed) ───────────────────────────────COMMENT
MEDIUMmcp-tool-server/test/elk-pass.test.js74// ─── Layout ──────────────────────────────────────────────────────COMMENT
MEDIUMmcp-tool-server/test/elk-pass.test.js267// ─── Headless mxGraph shim ───────────────────────────────────────COMMENT
MEDIUMmcp-tool-server/test/normalize-model.test.js166// ─── Entities in attribute values ────────────────────────────────COMMENT
MEDIUMmcp-tool-server/test/normalize-model.test.js230// ─── Edges written without a geometry ────────────────────────────COMMENT
MEDIUMmcp-tool-server/test/normalize-model.test.js255// ─── Containers that clip their children ─────────────────────────COMMENT
MEDIUMmcp-tool-server/src/elk-pass.js57// ─── Layout ──────────────────────────────────────────────────────COMMENT
MEDIUMshape-search/generate-index.js58// ── Create jsdom with minimal stubs ──────────────────────────────────────────COMMENT
MEDIUMshape-search/generate-index.js157// ── Load app.min.js ──────────────────────────────────────────────────────────COMMENT
MEDIUMshape-search/generate-index.js171// ── Intercept template entry calls ───────────────────────────────────────────COMMENT
MEDIUMshape-search/generate-index.js227// ── Build a minimal Sidebar and run initPalettes ─────────────────────────────COMMENT
MEDIUMshape-search/generate-index.js324// ── Run initPalettes to trigger all shape registrations ──────────────────────COMMENT
MEDIUMshape-search/generate-index.js339// ── Deduplicate by style string ──────────────────────────────────────────────COMMENT
MEDIUMshape-search/generate-index.js357// ── Derive titles for shapes that have tags but no title ────────────────────COMMENT
MEDIUMshape-search/generate-index.js411// ── Write output ─────────────────────────────────────────────────────────────COMMENT
MEDIUMshared/shape-search.js1// ── Shape search ─────────────────────────────────────────────────────────────COMMENT
MEDIUMshared/mx-xml.js21// ─── Parsing ─────────────────────────────────────────────────────COMMENT
MEDIUMshared/mx-xml.js239// ─── Model construction ──────────────────────────────────────────COMMENT
MEDIUMshared/mx-xml.js347// ─── Write-back ──────────────────────────────────────────────────COMMENT
MEDIUMshared/icon-search.js1// ── Icon search ──────────────────────────────────────────────────────────────COMMENT
MEDIUMshared/mx-model.js31// ─── mxGraph globals ─────────────────────────────────────────────COMMENT
MEDIUMshared/mx-model.js137// ─── Model ───────────────────────────────────────────────────────COMMENT
MEDIUMshared/mx-model.js646// ─── Graph ───────────────────────────────────────────────────────COMMENT
MEDIUMshared/mx-model.js786// ─── Normalization (mirrors Graph.prototype.normalizeModel) ──────COMMENT
MEDIUMmcp-app-server/src/worker.js61// ── Sessions ─────────────────────────────────────────────────────────────────COMMENT
MEDIUMmcp-app-server/src/worker.js159// ── MCP ──────────────────────────────────────────────────────────────────────COMMENT
MEDIUMmcp-app-server/src/shared.js1238// ─── Layout gate ─────────────────────────────────────────────────COMMENT
MEDIUMmcp-app-server/src/shared.js6414// ── Diagram validation ───────────────────────────────────────────────────────COMMENT
MEDIUMmcp-app-server/src/shared.js6580// ── Fallback for clients without an MCP Apps UI ──────────────────────────────COMMENT
MEDIUMmcp-app-server/src/shared.js6690// ── Server ───────────────────────────────────────────────────────────────────COMMENT
MEDIUMmcp-app-server/src/shared.js6929 // ── search_shapes tool (only registered when shapeIndex is provided) ───────COMMENT
Over-Commented Block35 hits · 28 pts
SeverityFileLineSnippetContext
LOWmcp-tool-server/src/elk-engine.js1// Loads the drawio-elk bundle (ELK engine + mxGraph bridge) for theCOMMENT
LOWmcp-tool-server/src/index.js81const sharedMermaidPath = join(__dirname, "..", "..", "shared", "mermaid-reference.md");COMMENT
LOWmcp-tool-server/src/libavoid-pass.js1// Server-side libavoid edge-routing pass for open_drawio_xml.COMMENT
LOWmcp-tool-server/src/libavoid-pass.js21const __dirname = dirname(fileURLToPath(import.meta.url));COMMENT
LOWmcp-tool-server/src/cdn-cache.js1// Local cache for browser sources loaded from the draw.io CDN, withCOMMENT
LOWmcp-tool-server/src/cdn-cache.js21// npm's postinstall primes the routing core (src/postinstall.js) so the firstCOMMENT
LOWmcp-tool-server/src/elk-pass.js1// Server-side ELK layout pass for open_drawio_xml (`postLayout: "elk"`).COMMENT
LOWshared/mx-xml.js1// mxGraphModel XML <-> headless model, for the server-side diagram passes.COMMENT
LOWshared/icon-search.js1// ── Icon search ──────────────────────────────────────────────────────────────COMMENT
LOWshared/mx-model.js1// Headless mxGraph model for the servers' diagram passes.COMMENT
LOWshared/normalize-model.js1// Model normalization for generated diagrams.COMMENT
LOWshared/normalize-model.js21// Two more mistakes travel with the same diagrams and are repaired in theCOMMENT
LOWshared/mermaid-elk.js1// Mermaid → ELK layout selector.COMMENT
LOWmcp-app-server/wrangler.toml21# OpenAI plugin-directory domain verification token, served verbatim atCOMMENT
LOWmcp-app-server/src/build-html.js61COMMENT
LOWmcp-app-server/src/index.js81{COMMENT
LOWmcp-app-server/src/libavoid-versions.js1// ETag-versioned CDN URLs for the libavoid script block.COMMENT
LOWmcp-app-server/src/shared.js61 // execution. The routing pass awaits __libavoidReady on demand; failuresCOMMENT
LOWmcp-app-server/src/shared.js1361{COMMENT
LOWmcp-app-server/src/shared.js1381// Placement rules: the config key must live INSIDE the frontmatter (MermaidCOMMENT
LOWmcp-app-server/src/shared.js1641 {COMMENT
LOWmcp-app-server/src/shared.js2501COMMENT
LOWmcp-app-server/src/shared.js3321// CSS-transform based soft-follow. mxGraph's view stays at scale=1,COMMENT
LOWmcp-app-server/src/shared.js3341// while staying compact enough that the user doesn't see a big emptyCOMMENT
LOWmcp-app-server/src/shared.js3361// the latest few cells — if it includes most of the diagram, theCOMMENT
LOWmcp-app-server/src/shared.js3381// view, small enough that there's a visible pull-back at finalize.COMMENT
LOWmcp-app-server/src/shared.js3401var STREAM_BATCH_PULLBACK_MIN = 0.45;COMMENT
LOWmcp-app-server/src/shared.js3421var recentVertexQueue = [];COMMENT
LOWmcp-app-server/src/shared.js3781// camera follows those jumps faithfully, which reads as visibleCOMMENT
LOWmcp-app-server/src/shared.js4001 // (max-height, viewport, etc.) can clamp our requested height,COMMENT
LOWmcp-app-server/src/shared.js5281// --- Layout button: toggles between as-authored and one alternative ---COMMENT
LOWmcp-app-server/src/shared.js5721 {COMMENT
LOWmcp-app-server/src/shared.js6241// When the tab becomes visible, re-notify our size so the host canCOMMENT
LOW.github/workflows/publish-tool-server.yml1name: Publish Tool ServerCOMMENT
LOW.github/workflows/publish-app-server-image.yml1name: Publish App Server ImageCOMMENT
Hyper-Verbose Identifiers13 hits · 13 pts
SeverityFileLineSnippetContext
LOWmcp-app-server/src/index.js169async function startStreamableHTTPServer()CODE
LOWmcp-app-server/src/shared.js635function expandEdgesToEndpointVertexIds(graph, ids)CODE
LOWmcp-app-server/src/shared.js776function firstMermaidDirectiveLine(text)CODE
LOWmcp-app-server/src/shared.js821function isMermaidHorizontalFlowchart(text)CODE
LOWmcp-app-server/src/shared.js1303function rememberMermaidConversion(text, xml)CODE
LOWmcp-app-server/src/shared.js2719function waitForPendingAnimationsToSettle()CODE
LOWmcp-app-server/src/shared.js3150function hideAndRedrawEdgesForMorph(graph, morphedIdSet)CODE
LOWmcp-app-server/src/shared.js3258function penDrawAllEdgesAfterMorph(graph)CODE
LOWmcp-app-server/src/shared.js3663function computeTransitionDuration(curS, curTx, curTy, tgtS, tgtTx, tgtTy, viewportSpan)CODE
LOWmcp-app-server/src/shared.js4534function enableViewerInteractivity(graph)CODE
LOWmcp-app-server/src/shared.js5262function computeTopAnchoredTransform(targetScale)CODE
LOWmcp-app-server/src/shared.js5311function captureOriginalCellGeometries(graph)CODE
LOWmcp-app-server/src/shared.js5331function restoreOriginalGeometriesToModel(model)CODE