knip-mcp-server
Version:
MCP server for knip.dev integration to help AI agents identify and clean up unused code
90 lines • 3.78 kB
JavaScript
import { KnipRemoveUnusedFilesInputSchema } from '../types/index.js';
export function createKnipRemoveUnusedFilesTool(knipClient, config) {
return {
name: 'knip_remove_unused_files',
description: 'Safely remove unused files with backup options',
inputSchema: {
type: 'object',
properties: {
files: {
type: 'array',
items: { type: 'string' },
description: 'Array of file paths to remove. If empty, removes all unused files.',
},
dryRun: {
type: 'boolean',
default: true,
description: 'Run in dry-run mode (no files are actually removed)',
},
createBackup: {
type: 'boolean',
default: true,
description: 'Create backup of files before removing them',
},
backupDir: {
type: 'string',
description: 'Directory to store backups (defaults to .backup next to each file)',
},
maxFiles: {
type: 'number',
default: 50,
description: 'Maximum number of files to remove in one operation',
},
},
required: [],
},
execute: async (args) => {
try {
const input = KnipRemoveUnusedFilesInputSchema.parse(args);
// Get files to remove
let filesToRemove = input.files;
if (!filesToRemove || filesToRemove.length === 0) {
filesToRemove = await knipClient.getUnusedFiles();
}
// Apply safety limits
const maxFiles = config.maxFilesPerOperation || 100;
if (filesToRemove.length > maxFiles) {
return {
success: false,
error: `Too many files to remove (${filesToRemove.length}). Maximum allowed: ${maxFiles}. Please specify specific files or increase the limit.`,
};
}
// Safety check for important files
if (config.enableSafeMode) {
const safetyPatterns = [
/package\.json$/,
/tsconfig\.json$/,
/\.env$/,
/README\.md$/i,
/LICENSE$/i,
/\.git/,
];
const dangerousFiles = filesToRemove.filter(file => safetyPatterns.some(pattern => pattern.test(file)));
if (dangerousFiles.length > 0) {
return {
success: false,
error: `Safe mode prevented removal of important files: ${dangerousFiles.join(', ')}`,
};
}
}
const result = await knipClient.removeUnusedFiles(filesToRemove, {
dryRun: input.dryRun,
createBackup: input.createBackup,
backupDir: input.backupDir || config.backupDir,
});
return {
success: true,
...result,
dryRun: input.dryRun,
};
}
catch (error) {
return {
success: false,
error: error instanceof Error ? error.message : String(error),
};
}
},
};
}
//# sourceMappingURL=knip-remove-unused-files.js.map