How Fuzzy Search Logging Diagnoses Edit Failures in Desktop Commander MCP

Fuzzy search logging captures similarity scores, threshold violations, and character-level diffs in Desktop Commander MCP, enabling developers to pinpoint exactly why text edits fail when exact matches aren't found.

Desktop Commander MCP performs text edits through the performSearchReplace routine in src/tools/edit.ts. When a literal search string does not exist in the target file, the engine falls back to a fuzzy search performed in a worker thread (runFuzzySearchInWorker), and the fuzzy search logging system records detailed diagnostics that expose the root cause of edit-block failures.

How Fuzzy Search Logging Works

The FuzzySearchLogger class in src/utils/fuzzySearchLogger.ts manages a persistent, tab-separated log file that captures every fuzzy search attempt.

Log File Initialization

The logger constructor creates ~/.claude-server-commander-logs/fuzzy-search.log if it doesn't exist. This guarantees a persistent audit trail that survives process restarts and can be inspected later using built-in utilities or external tools.

Capturing Search Results

When performSearchReplace triggers a fuzzy search (lines 75-92 in src/tools/edit.ts), it assembles a FuzzySearchLogEntry object containing:

  • Timestamps and file paths
  • Original search text and found text
  • Similarity ratio between search and found strings
  • exactMatchCount versus expectedReplacements
  • executionTime (captured at lines 65-66) for performance analysis
  • Character-level diff showing exact divergence points
  • characterCodes frequency map generated by getCharacterCodeData (lines 57-72)
  • belowThreshold boolean when similarity falls below the threshold

Writing and Retrieval

The FuzzySearchLogger.log method (lines 75-99) appends entries as tab-separated lines. Helper methods getRecentLogs and clearLog allow developers to view the most recent N entries or reset the log for clean testing sessions.

Diagnostic Insights From Fuzzy Search Logs

The logging system exposes six critical diagnostic vectors that explain edit failures:

Detecting Threshold Violations

Desktop Commander MCP uses FUZZY_THRESHOLD = 0.7 (lines 45-49 in src/tools/edit.ts). When the similarity score falls below this value, the logger sets belowThreshold: true, making it trivial to scan logs for edits rejected due to poor string matches.

Identifying Match Count Mismatches

The log records both exactMatchCount (what was found) and expectedReplacements (what was requested). When these diverge, the edit fails at the "expected count" validation branch (lines 41-53), and the log preserves the evidence.

Character-Level Diff Analysis

The highlightDifferences function (lines 57-86) generates a precise character-level diff stored in the diff field. This reveals off-by-one errors, line-ending mismatches, or hidden whitespace that caused the fuzzy engine to find the wrong text segment.

Exposing Encoding Issues

The getCharacterCodeData function (lines 57-72) records a frequency map of differing characters in the characterCodes field. This exposes encoding problems—such as stray Unicode characters or mixed line endings—that literal searches miss but fuzzy matching detects.

Performance Monitoring

The executionTime field tracks how long the fuzzy scan took in the worker thread. Unexpectedly high values indicate large files or inefficient search patterns that may cause timeouts or UI lag.

Audit Trail Integrity

Every fuzzy attempt is persisted chronologically. When an edit silently fails (the UI reports success but the file remains unchanged), the log confirms whether a fuzzy match was attempted and what threshold or count validation blocked it.

Step-by-Step Diagnostic Workflow

Follow this systematic approach to diagnose edit failures using fuzzy search logs:

  1. Execute the failing edit through performSearchReplace when the target text doesn't exist literally in the file.

  2. Inspect recent entries using FuzzySearchLogger.getRecentLogs(5) or the convenience script at scripts/view-fuzzy-logs.js.

  3. Scan for threshold violations by filtering rows where belowThreshold equals true, indicating the similarity score dropped below 0.7.

  4. Verify replacement counts by comparing exactMatchCount against expectedReplacements to spot validation failures.

  5. Analyze the diff column to identify exactly which characters differed between the search string and the matched text.

  6. Check character codes for unusual Unicode symbols or encoding artifacts that explain mismatch behavior.

  7. Review execution time to determine if file size or pattern complexity caused performance degradation.

Practical Code Examples

Triggering a Log Entry via performSearchReplace

When an exact match fails, the fuzzy path automatically logs the attempt:

import { performSearchReplace } from './src/tools/edit.js';

// This triggers fuzzy logging if "Hello World" doesn't exist literally
await performSearchReplace(
  '/path/to/example.txt',
  { search: 'Hello World', replace: 'Hi Universe' },
  1  // expectedReplacements
);

Retrieving Recent Logs

Access recent diagnostics without leaving your Node environment:

import { fuzzySearchLogger } from './src/utils/fuzzySearchLogger.js';

const recent = await fuzzySearchLogger.getRecentLogs(5);
console.table(recent.map(line => line.split('\t')));

Clearing and Exporting Logs

Reset the log before reproducibility tests:

import { fuzzySearchLogger } from './src/utils/fuzzySearchLogger.js';

await fuzzySearchLogger.clearLog();

Export tab-separated data to CSV for spreadsheet analysis:

node scripts/export-fuzzy-logs.js --output diagnostic.csv

Summary

  • Fuzzy search logging in Desktop Commander MCP captures detailed diagnostics when performSearchReplace falls back to fuzzy matching in src/tools/edit.ts.
  • The logger records similarity ratios, threshold violations (against FUZZY_THRESHOLD = 0.7), and character-level diffs that explain why edits fail validation.
  • Log entries include performance metrics (executionTime) and encoding data (characterCodes) to diagnose Unicode issues and file size problems.
  • The FuzzySearchLogger class in src/utils/fuzzySearchLogger.ts persists data to ~/.claude-server-commander-logs/fuzzy-search.log and provides getRecentLogs and clearLog methods for inspection.
  • Developers can correlate exactMatchCount versus expectedReplacements in the logs to identify count validation failures that block edits.

Frequently Asked Questions

Where is the fuzzy search log stored in Desktop Commander MCP?

The log file is created at ~/.claude-server-commander-logs/fuzzy-search.log by the FuzzySearchLogger constructor in src/utils/fuzzySearchLogger.ts. This location ensures persistence across sessions while remaining accessible for debugging.

What does the similarity ratio indicate in fuzzy search logging?

The similarity ratio is a floating-point value between 0 and 1 that measures how closely the found text matches the search string. Desktop Commander MCP compares this against FUZZY_THRESHOLD = 0.7, and logs mark entries with belowThreshold: true when the ratio is insufficient to proceed with replacement.

How can I view fuzzy search logs without writing code?

You can use the convenience script at scripts/view-fuzzy-logs.js to display recent entries in the console, or run scripts/export-fuzzy-logs.js to generate a CSV file for spreadsheet analysis. Both scripts read from the default log location in the home directory.

Why would a fuzzy search succeed but the edit still fail?

A fuzzy search can locate similar text but fail the subsequent validation if exactMatchCount differs from expectedReplacements (the requested number of replacements). The logger captures both values, allowing you to see whether the failure occurred at the matching stage or the count-validation stage in performSearchReplace.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →