backup_and_edit
Create file backups before editing to prevent data loss. Safely modify files while preserving original versions for recovery.
Instructions
Create backups of files before editing them
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| files | Yes | List of files to backup and edit | |
| operation | Yes | The edit operation to perform |
Implementation Reference
- src/router/operation-router.ts:551-579 (handler)Main handler for 'backup_and_edit' hybrid operation: creates file backups, executes nested edit operation, returns result with backup info or restores backups and rethrows on failure.case 'backup_and_edit': // Create backups with file system const backups = await Promise.all( operation.affectedFiles.map(file => this.fileSystemManager.createBackup(file) ) ); try { // Use Edit for the edits const result = await this.executeWithEdit({ ...operation, type: operation.params.operation.type }); return { ...result, backups }; } catch (error) { // If edits fail, restore backups await Promise.all( operation.affectedFiles.map((file, index) => this.fileSystemManager.restoreBackup(backups[index], file) ) ); throw error; }
- src/index.ts:365-388 (registration)Tool registration defining name, description, input schema, and annotations for 'backup_and_edit'.mcpServer.registerTool({ name: 'backup_and_edit', description: 'Create backups of files before editing them', inputSchema: { type: 'object', properties: { files: { type: 'array', description: 'List of files to backup and edit' }, operation: { type: 'object', description: 'The edit operation to perform' } }, required: ['files', 'operation'] }, annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false } });
- src/index.ts:368-380 (schema)Input schema validation for 'backup_and_edit' tool: requires 'files' array and 'operation' object.inputSchema: { type: 'object', properties: { files: { type: 'array', description: 'List of files to backup and edit' }, operation: { type: 'object', description: 'The edit operation to perform' } }, required: ['files', 'operation']
- Helper function to create timestamped backup of a file, used by backup_and_edit handler.public async createBackup(filePath: string): Promise<string> { try { const content = await this.readFile(filePath); const backupPath = `${filePath}.backup.${Date.now()}`; await this.writeFile(backupPath, content); this.backups.set(filePath, backupPath); return backupPath; } catch (error: any) { throw new Error(`Failed to create backup of ${filePath}: ${error.message}`); }
- Helper function to restore a file from backup, used by backup_and_edit handler on failure.public async restoreBackup(backupPath: string, originalPath: string): Promise<void> { try { const content = await this.readFile(backupPath); await this.writeFile(originalPath, content); } catch (error: any) { throw new Error(`Failed to restore backup ${backupPath} to ${originalPath}: ${error.message}`); }