delete_from_file
Remove specific lines from a file by specifying the start and end line numbers, with content verification to ensure accuracy. Simplifies file editing and data cleanup tasks.
Instructions
Delete content from a file between specified line numbers.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | Yes | Absolute path to the file | |
| line_end | Yes | Ending line number (1-based) | |
| line_start | Yes | Starting line number (1-based) | |
| line_start_contents | Yes | Expected content of the starting line (used for verification) |
Implementation Reference
- src/index.ts:133-166 (handler)The main handler function that performs the deletion of lines from the file after validating the path, file existence, and starting line content.execute: async ({ file_path, line_start, line_end, line_start_contents }) => { const absolutePath = validateAbsolutePath(file_path, 'file_path'); validateFileExists(absolutePath); try { // Verify the starting line content verifyLineContent(absolutePath, line_start, line_start_contents); const content = fs.readFileSync(absolutePath, 'utf-8'); const lines = content.split('\n'); if (line_start > lines.length || line_end > lines.length) { throw new UserError(`Line range ${line_start}-${line_end} is beyond file length (${lines.length} lines).`); } if (line_start > line_end) { throw new UserError('line_start must be less than or equal to line_end.'); } // Remove the specified lines (inclusive) const newLines = [ ...lines.slice(0, line_start - 1), // Lines before start ...lines.slice(line_end) // Lines after end ]; const newContent = newLines.join('\n'); fs.writeFileSync(absolutePath, newContent, 'utf-8'); return `Successfully deleted lines ${line_start}-${line_end} from "${absolutePath}".`; } catch (error: any) { if (error instanceof UserError) throw error; throw new UserError(`Error deleting content from file "${absolutePath}": ${error.message}`); } }
- src/index.ts:127-132 (schema)Zod schema defining the input parameters for the delete_from_file tool.parameters: z.object({ file_path: z.string().describe('Absolute path to the file'), line_start: z.number().int().positive().describe('Starting line number (1-based)'), line_end: z.number().int().positive().describe('Ending line number (1-based)'), line_start_contents: z.string().describe('Expected content of the starting line (used for verification)') }),
- src/index.ts:124-167 (registration)Registration of the delete_from_file tool using server.addTool.server.addTool({ name: 'delete_from_file', description: 'Delete content from a file between specified line numbers.', parameters: z.object({ file_path: z.string().describe('Absolute path to the file'), line_start: z.number().int().positive().describe('Starting line number (1-based)'), line_end: z.number().int().positive().describe('Ending line number (1-based)'), line_start_contents: z.string().describe('Expected content of the starting line (used for verification)') }), execute: async ({ file_path, line_start, line_end, line_start_contents }) => { const absolutePath = validateAbsolutePath(file_path, 'file_path'); validateFileExists(absolutePath); try { // Verify the starting line content verifyLineContent(absolutePath, line_start, line_start_contents); const content = fs.readFileSync(absolutePath, 'utf-8'); const lines = content.split('\n'); if (line_start > lines.length || line_end > lines.length) { throw new UserError(`Line range ${line_start}-${line_end} is beyond file length (${lines.length} lines).`); } if (line_start > line_end) { throw new UserError('line_start must be less than or equal to line_end.'); } // Remove the specified lines (inclusive) const newLines = [ ...lines.slice(0, line_start - 1), // Lines before start ...lines.slice(line_end) // Lines after end ]; const newContent = newLines.join('\n'); fs.writeFileSync(absolutePath, newContent, 'utf-8'); return `Successfully deleted lines ${line_start}-${line_end} from "${absolutePath}".`; } catch (error: any) { if (error instanceof UserError) throw error; throw new UserError(`Error deleting content from file "${absolutePath}": ${error.message}`); } } });
- src/utils.ts:90-124 (helper)Helper function to verify the content of the starting line before deletion, ensuring safety and correctness.export function verifyLineContent(filePath: string, lineNumber: number, expectedContent: string): string { try { const content = fs.readFileSync(filePath, 'utf-8'); const lines = content.split('\n'); if (lineNumber < 1 || lineNumber > lines.length) { throw new UserError( `Line ${lineNumber} does not exist in file "${filePath}". The file has ${lines.length} lines. ` + `Please verify the line number and re-read the file with show_line_numbers=true to see the current content.` ); } const actualContent = lines[lineNumber - 1]; // Convert to 0-based index const normalizedActual = actualContent.trim().replace(/\s+/g, ' '); const normalizedExpected = expectedContent.trim().replace(/\s+/g, ' '); if (normalizedActual !== normalizedExpected) { throw new UserError( `Line content verification failed for line ${lineNumber} in "${filePath}".\n` + `Expected (normalized): "${normalizedExpected}"\n` + `Actual (normalized): "${normalizedActual}"\n` + `Please re-read the file with show_line_numbers=true to see the current content and update your request accordingly.` ); } return actualContent; } catch (error) { if (error instanceof UserError) { throw error; } throw new UserError( `Error reading file "${filePath}" for line verification: ${error instanceof Error ? error.message : String(error)}` ); } }