AI Slop Code Risk Monitor

wonderwhy-er/DesktopCommanderMCP

SlopCodeMonitor badge for wonderwhy-er/DesktopCommanderMCP Adjusted legacy signal; badge bands: 25 / 50 / 75 (different from dashboard bands).

This is MCP server for Claude that gives it terminal control, file system search and diff file editing capabilities

3.9 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for wonderwhy-er/DesktopCommanderMCP, a JavaScript project with 10,181 GitHub stars. SynthScan examined 99,734 lines of code across 457 source files, recording 321 pattern matches distributed across 10 syntactic categories. The legacy adjusted pattern signal is 3.9 (Low 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.

3.9
Adjusted Signal
3.9
Raw Pattern Score
100%
Time Factor
2026-10-30
Last Push
10.2K
Stars
JavaScript
Language
99.7K
Lines of Code
457
Files
321
Pattern Hits
2026-10-31
Scan Date
0.01
HC Hit Rate

Risk Review · Payload v1

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

Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.

Cognitive Ownership Risk 15.7/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.5/100 · LOW

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

Agent Over-Engineering Ratio 13.1/100 · LOW

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

PR Review Velocity Impact 16.8/100 · LOW

Which changes need focused human review? 321 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 3MEDIUM 15LOW 303

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 321 distinct pattern matches across 10 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.

Hyper-Verbose Identifiers238 hits · 238 pts
SeverityFileLineSnippetContext
LOWsetup-claude-server.js265async function enhancedGetTrackingProperties(additionalProps = {}) {CODE
LOWuninstall-claude-server.js548async function removeDesktopCommanderConfig() {CODE
LOWtest/test-markdown-preview.js130async function testWikiRewriteAndRendering() {CODE
LOWtest/test-markdown-preview.js166async function testFailedSaveResyncsEditBaseline() {CODE
LOWtest/test-markdown-preview.js310async function testSuccessfulSaveResetsUndoBaseline() {CODE
LOWtest/test-markdown-preview.js375async function testFullscreenWorkspaceHelpers() {CODE
LOWtest/test-markdown-preview.js401async function testCopyFormatsAndEditorShell() {CODE
LOWtest/test-markdown-preview.js432async function testPartialDocumentBecomesNewEditBaseline() {CODE
LOWtest/test-markdown-preview.js481async function testRefreshDoesNotMisclassifyMarkdownContentAsDeletion() {CODE
LOWtest/test-markdown-preview.js525async function testUnsupportedRawContentPreview() {CODE
LOWtest/test-literal-search.js153async function testLiteralSearchExactMatches() {CODE
LOWtest/test-literal-search.js179async function testRegexVsLiteralDifference() {CODE
LOWtest/test-literal-search.js208async function testSpecialCharactersLiteralSearch() {CODE
LOWtest/test-literal-search.js297async function testRegexFailureLiteralSuccess() {CODE
LOWtest/test-allowed-directories.js118async function testEmptyAllowedDirectories() {CODE
LOWtest/test-allowed-directories.js147async function testSpecificAllowedDirectory() {CODE
LOWtest/test-allowed-directories.js184async function testRootInAllowedDirectories() {CODE
LOWtest/test-allowed-directories.js286async function testSpecificAllowedDirectoryWithSlash() {CODE
LOWtest/test-process-memory.js36async function testFailedSamplingIsReported() {CODE
LOWtest/test-svg-text.js55async function readMultipleFilesAnswersTheText(client, dir) {CODE
LOWtest/test-svg-text.js88async function previewWidgetStillGetsTheUrlImage(client) {CODE
LOWtest/test-svg-text.js100async function previewWidgetStillGetsTheImage(client, dir) {CODE
LOWtest/test-startup-imports.js48async function testNothingLoadedBeforeInitialize(server) {CODE
LOWtest/test-startup-imports.js59async function testLoadedSoonAfterInitialize(server) {CODE
LOWtest/test-startup-imports.js94async function testCallWhileLoadingAnswersAtOnce(server, file) {CODE
LOWtest/test-startup-imports.js112async function testReadMultipleFilesWhileLoading(server, file, second) {CODE
LOWtest/test-startup-imports.js123async function testWritePdfMarkdownStartingWithLink(server, dir) {CODE
LOWtest/test-startup-imports.js135async function testSameCallWorksOnceLoaded(server, file) {CODE
LOWtest/test-startup-imports.js156async function testFailedRequireTriesAgain(server, file) {CODE
LOWtest/test-startup-imports.js170async function testFailedImportSaysRestart(server, file) {CODE
LOWtest/test-default-shell.js64function testDefaultShellDetection(availableShells) {CODE
LOWtest/test-default-shell.js111async function testConfigurationPersistence(availableShells) {CODE
LOWtest/test-markdown-editor-roundtrip.js54async function testPipeTableSurvivesRoundTrip() {CODE
LOWtest/test-markdown-editor-roundtrip.js78async function testAdjacentHeadingsKeepOriginalSpacing() {CODE
LOWtest/test-markdown-editor-roundtrip.js90async function testWikilinkSurvivesRoundTrip() {CODE
LOWtest/test-markdown-editor-roundtrip.js102async function testTrailingNewlineSurvives() {CODE
LOWtest/test-markdown-editor-roundtrip.js114async function testCombinedBugReportFile() {CODE
LOWtest/test-markdown-editor-roundtrip.js127async function testYamlFrontmatterSurvives() {CODE
LOWtest/test-markdown-editor-roundtrip.js139async function testSquareBracketsNotEscaped() {CODE
LOWtest/test-markdown-editor-roundtrip.js151async function testUnderscoresNotEscaped() {CODE
LOWtest/test-markdown-editor-roundtrip.js206async function testReadmeStyleFileNotCollapsed() {CODE
LOWtest/test-markdown-editor-roundtrip.js265async function testTableInsideRealisticDoc() {CODE
LOWtest/test-markdown-editor-roundtrip.js322async function testEmojiPrefixedSoftBreaksRestored() {CODE
LOWtest/test-markdown-editor-roundtrip.js341async function testLinkInTableCellSurvivesRoundTrip() {CODE
LOWtest/test-markdown-editor-roundtrip.js360async function testStarBulletMarkerPreserved() {CODE
LOWtest/test-markdown-editor-roundtrip.js378async function testRelativePathLinksSurvive() {CODE
LOWtest/test-markdown-editor-roundtrip.js402async function testLessThanInProseNotEscaped() {CODE
LOWtest/test-markdown-editor-roundtrip.js428async function testTrailingHardBreakWhitespacePreserved() {CODE
LOWtest/test-markdown-editor-roundtrip.js448async function testBoldAroundInlineCodePreserved() {CODE
LOWtest/test-markdown-editor-roundtrip.js473async function testEscapedPipeInTableCellPreserved() {CODE
LOWtest/test-markdown-editor-roundtrip.js496async function testListItemWithContinuationLine() {CODE
LOWtest/test-pdf-render-resources.js246async function testCallerArgsCannotChangeProfile() {CODE
LOWtest/test-session-blocked.js20async function testRunningProcessNotBlocked() {CODE
LOWtest/test-edit-block-line-endings.js259async function testContextAwareReplacement() {CODE
LOWtest/test-edit-block-line-endings.js429async function runEditBlockLineEndingTests() {CODE
LOWtest/test-feature-flags-timeout.js205async function testRefreshFetchIgnoresAbort() {CODE
LOWtest/test-feature-flags-timeout.js275async function reportPlatformDiagnostics() {CODE
LOWtest/test-process-wait-config.js32async function testCeilingUnderClientTimeout() {CODE
LOWtest/test-process-wait-config.js137async function testNodeLocalWaitsWithinTheCeiling() {CODE
LOWtest/test-pdf-render-options.js178async function testFrontMatterDestOutsideAllowedDirs() {CODE
178 more matches not shown…
Decorative Section Separators14 hits · 42 pts
SeverityFileLineSnippetContext
MEDIUMsrc/utils/files/docx.ts25// ════════════════════════════════════════════════════════════════COMMENT
MEDIUMsrc/utils/files/docx.ts27// ════════════════════════════════════════════════════════════════COMMENT
MEDIUMsrc/utils/files/docx.ts65// ════════════════════════════════════════════════════════════════COMMENT
MEDIUMsrc/utils/files/docx.ts67// ════════════════════════════════════════════════════════════════COMMENT
MEDIUMsrc/utils/files/docx.ts109// ════════════════════════════════════════════════════════════════COMMENT
MEDIUMsrc/utils/files/docx.ts111// ════════════════════════════════════════════════════════════════COMMENT
MEDIUMsrc/utils/files/docx.ts248// ════════════════════════════════════════════════════════════════COMMENT
MEDIUMsrc/utils/files/docx.ts250// ════════════════════════════════════════════════════════════════COMMENT
MEDIUMsrc/utils/files/docx.ts453// ════════════════════════════════════════════════════════════════COMMENT
MEDIUMsrc/utils/files/docx.ts455// ════════════════════════════════════════════════════════════════COMMENT
MEDIUMsrc/utils/files/docx.ts504// ════════════════════════════════════════════════════════════════COMMENT
MEDIUMsrc/utils/files/docx.ts506// ════════════════════════════════════════════════════════════════COMMENT
MEDIUMsrc/utils/files/docx.ts518// ════════════════════════════════════════════════════════════════COMMENT
MEDIUMsrc/utils/files/docx.ts520// ════════════════════════════════════════════════════════════════COMMENT
Over-Commented Block37 hits · 37 pts
SeverityFileLineSnippetContext
LOWtest/test-remote-channel-reconnect.js821 await withQuietLogs(() =>COMMENT
LOWtest/repro/test-exit-after-fetch.js1// Repro: the product's own exit paths abort the process on Windows when theyCOMMENT
LOWtest/repro/test-config-damaged-start.js1// Repro (#692): with a damaged ~/.claude-server-commander/config.json,COMMENT
LOWtest/repro/test-offline-update-exit.js1// Repro: the remote device's shutdown script (blocking-offline-update.js)COMMENT
LOWtest/repro/test-pdf-launch-failure-server.js1// Server-level repro: one failed Chrome launch in write_pdf must not take theCOMMENT
LOWtest/repro/test-config-lock-frozen-holder.js1// Repro: a Desktop Commander process frozen for over 30 s while it holds theCOMMENT
LOWtest/repro/test-read-abort-frees-thread.js1// Demonstration: runWithAbortableTimeout actually CANCELS the underlying readCOMMENT
LOWtest/repro/test-search-child-config-lock.js1// Repro (#768): in a full test run, test-search-without-ripgrep.js took 60.8 sCOMMENT
LOWtest/repro/test-release-packages-ship-contract.js1// Repro: neither release package carries #794's telemetry contract, so theCOMMENT
LOWtest/repro/test-release-packages-ship-contract.js21// files, not a link.COMMENT
LOWtest/repro/test-startup-heavy-imports.js1// Repro (#715): Desktop Commander takes 25-90 s to answer the MCP `initialize`COMMENT
LOWtest/repro/test-withtimeout-leak.js1// Repro: withTimeout() rejects on schedule but does NOT cancel the underlyingCOMMENT
LOWtest/repro/test-config-old-writer.js1// Repro (#697): `desktop-commander remote` beside an older Desktop CommanderCOMMENT
LOWtest/repro/test-search-memory.js1// Repro (#716): a content search with maxResults: 200 on a large project tookCOMMENT
LOWtest/repro/test-search-memory.js21// Measured on the base (4715bd4), default sizes, over 4 runs each on Windows 11COMMENT
LOWtest/repro/test-search-memory.js41// REPRO_V8_LIMIT=1 adds the 540 MB line: set REPRO_TIMEOUT_MS=2400000 andCOMMENT
LOWtest/repro/test-interact-join-stall.js1// Repro (v2): interact_with_process re-join()s the WHOLE buffer every 50ms pollCOMMENT
LOW.github/workflows/release.yml1# Release pipeline for Desktop Commander.COMMENT
LOW.github/workflows/release.yml21# writes to origin. Everything before that push happens in theCOMMENT
LOW.github/workflows/release.yml41# Use it to validate workflow changes end-to-end before a real release —COMMENT
LOWsrc/terminal-manager.ts181COMMENT
LOWsrc/ui/file-preview/src/markdown/editor.ts61 * restoration converts back to the literal `\|` in the output. */COMMENT
LOWsrc/ui/file-preview/src/markdown/editor.ts221 // restore — same shape, different schema-level reason for needing it.COMMENT
LOWsrc/ui/file-preview/src/markdown/editor.ts241 // Tiptap's HTML output path HTML-escapes bare `<` characters inCOMMENT
LOWsrc/ui/file-preview/src/markdown/editor.ts261 // bullet is emitted as `- `. If the source used `*` (or a mix), we'dCOMMENT
LOWsrc/ui/file-preview/src/markdown/editor.ts501 // Quick check: if no candidate escapes are even present in thisCOMMENT
LOWsrc/tools/edit.ts301 //COMMENT
LOWsrc/remote-device/desktop-commander-integration.ts121 }COMMENT
LOWsrc/remote-device/desktop-commander-integration.ts141 // transport.onclose/onerror with its own handlers and the SDK statesCOMMENT
LOWsrc/remote-device/remote-channel.ts81// Cap on a recreate's rebuild step so a hung await can't disable the watchdog.COMMENT
LOWsrc/remote-device/remote-channel.ts101const TOKEN_REFRESH_INTERVAL_MS = 45 * 60 * 1000;COMMENT
LOWsrc/remote-device/remote-channel.ts161 return Math.max(1_000, Math.round(stepMs * Math.max(0, Math.min(1, random()))));COMMENT
LOWsrc/remote-device/remote-channel.ts1201 // otherwise realtime-js never tears the socket down and aCOMMENT
LOWsrc/remote-device/remote-channel.ts1381 // This write asserts status:'online' too, so it MUST respect theCOMMENT
LOWsrc/remote-device/remote-channel.ts1601 // races that matter: a heartbeat tick firing as the signal arrives, andCOMMENT
LOWsrc/remote-device/device.ts281 // rejection means "running, but nothing can reach this device", andCOMMENT
LOWsrc/remote-device/device.ts621 // to THIS SAME PROCESS, so an in-memory check is sufficient and, unlikeCOMMENT
Verbosity Indicators13 hits · 26 pts
SeverityFileLineSnippetContext
LOW⚡test-listener-bug.js97 // Step 1: Start Node.js REPLCOMMENT
LOW⚡test-listener-bug.js107 // Step 2: Send first commandCOMMENT
LOW⚡test-listener-bug.js117 // Step 3: First read_process_output (this might break listeners with removeAllListeners)COMMENT
LOW⚡test-listener-bug.js126 // Step 4: Send second command WITHOUT waiting (so output stays in buffer)COMMENT
LOWtest-listener-bug.js139 // Step 5: Second read_process_output (THIS WILL FAIL if listeners were removed)COMMENT
LOWscripts/validate-tools-sync.js70 // Step 1: Send initialize requestCOMMENT
LOWscripts/validate-tools-sync.js89 // Step 2: Send tools/list requestCOMMENT
LOWsrc/tools/filesystem.ts149 * and we need to check if any of the parent directories existCOMMENT
LOW⚡src/utils/dockerPrompt.ts13 // Step 1: Check if client is Docker MCP GatewayCOMMENT
LOW⚡src/utils/dockerPrompt.ts17 // Step 2: Check if this is their first or second command (0 or 1 total calls)COMMENT
LOW⚡src/remote-device/device-authenticator.ts62 // Step 1: Request device codeCOMMENT
LOW⚡src/remote-device/device-authenticator.ts65 // Step 2: Display user instructions and open browserCOMMENT
LOW⚡src/remote-device/device-authenticator.ts68 // Step 3: Poll for authorizationCOMMENT
Structural Annotation Overuse12 hits · 25 pts
SeverityFileLineSnippetContext
LOW⚡test-listener-bug.js97 // Step 1: Start Node.js REPLCOMMENT
LOW⚡test-listener-bug.js107 // Step 2: Send first commandCOMMENT
LOW⚡test-listener-bug.js117 // Step 3: First read_process_output (this might break listeners with removeAllListeners)COMMENT
LOW⚡test-listener-bug.js126 // Step 4: Send second command WITHOUT waiting (so output stays in buffer)COMMENT
LOWtest-listener-bug.js139 // Step 5: Second read_process_output (THIS WILL FAIL if listeners were removed)COMMENT
LOWscripts/validate-tools-sync.js70 // Step 1: Send initialize requestCOMMENT
LOWscripts/validate-tools-sync.js89 // Step 2: Send tools/list requestCOMMENT
LOW⚡src/utils/dockerPrompt.ts13 // Step 1: Check if client is Docker MCP GatewayCOMMENT
LOW⚡src/utils/dockerPrompt.ts17 // Step 2: Check if this is their first or second command (0 or 1 total calls)COMMENT
LOW⚡src/remote-device/device-authenticator.ts62 // Step 1: Request device codeCOMMENT
LOW⚡src/remote-device/device-authenticator.ts65 // Step 2: Display user instructions and open browserCOMMENT
LOW⚡src/remote-device/device-authenticator.ts68 // Step 3: Poll for authorizationCOMMENT
Cross-Language Confusion (JS/TS)2 hits · 10 pts
SeverityFileLineSnippetContext
HIGHtest/test-enhanced-repl.js88 print(greet(f"Guest {i+1}"))`;CODE
HIGHtest/test-search-code.js95 print("This is a python function")CODE
Synthetic Comment Markers1 hit · 8 pts
SeverityFileLineSnippetContext
HIGHsrc/tools/pdf/extract-images.ts102 // Ignore conversion errors as requestedCOMMENT
Redundant / Tautological Comments2 hits · 3 pts
SeverityFileLineSnippetContext
LOWinstall.sh16# Check if Node.js is installedCOMMENT
LOWinstall-docker.sh79# Check if Docker is availableCOMMENT
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMsrc/utils/capture.ts294 // Is MCP running in a container - use robust detectionCOMMENT
Slop Phrases1 hit · 2 pts
SeverityFileLineSnippetContext
LOWsrc/command-manager.ts161 // Don't forget to add the last commandCOMMENT