file-organizer-mcp 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/ARCHITECTURE.md +0 -1
  2. package/CHANGELOG.md +27 -4
  3. package/CONTRIBUTING.md +4 -3
  4. package/MIGRATION.md +1 -1
  5. package/README.md +87 -47
  6. package/dist/config.d.ts +64 -0
  7. package/dist/config.d.ts.map +1 -1
  8. package/dist/config.js +90 -17
  9. package/dist/config.js.map +1 -1
  10. package/dist/constants.js +1 -1
  11. package/dist/constants.js.map +1 -1
  12. package/dist/index.d.ts +6 -0
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +84 -0
  15. package/dist/index.js.map +1 -1
  16. package/dist/schemas/rename.schemas.d.ts +95 -0
  17. package/dist/schemas/rename.schemas.d.ts.map +1 -0
  18. package/dist/schemas/rename.schemas.js +39 -0
  19. package/dist/schemas/rename.schemas.js.map +1 -0
  20. package/dist/server.d.ts.map +1 -1
  21. package/dist/server.js +87 -28
  22. package/dist/server.js.map +1 -1
  23. package/dist/services/auto-organize.service.d.ts +88 -0
  24. package/dist/services/auto-organize.service.d.ts.map +1 -0
  25. package/dist/services/auto-organize.service.js +269 -0
  26. package/dist/services/auto-organize.service.js.map +1 -0
  27. package/dist/services/categorizer.service.d.ts.map +1 -1
  28. package/dist/services/categorizer.service.js +27 -1
  29. package/dist/services/categorizer.service.js.map +1 -1
  30. package/dist/services/index.d.ts +1 -0
  31. package/dist/services/index.d.ts.map +1 -1
  32. package/dist/services/index.js +1 -0
  33. package/dist/services/index.js.map +1 -1
  34. package/dist/services/metadata.service.d.ts +36 -0
  35. package/dist/services/metadata.service.d.ts.map +1 -0
  36. package/dist/services/metadata.service.js +212 -0
  37. package/dist/services/metadata.service.js.map +1 -0
  38. package/dist/services/organizer.service.d.ts +3 -1
  39. package/dist/services/organizer.service.d.ts.map +1 -1
  40. package/dist/services/organizer.service.js +28 -5
  41. package/dist/services/organizer.service.js.map +1 -1
  42. package/dist/services/path-validator.service.d.ts +1 -0
  43. package/dist/services/path-validator.service.d.ts.map +1 -1
  44. package/dist/services/path-validator.service.js +42 -6
  45. package/dist/services/path-validator.service.js.map +1 -1
  46. package/dist/services/renaming.service.d.ts +39 -0
  47. package/dist/services/renaming.service.d.ts.map +1 -0
  48. package/dist/services/renaming.service.js +296 -0
  49. package/dist/services/renaming.service.js.map +1 -0
  50. package/dist/services/rollback.service.js +2 -2
  51. package/dist/services/rollback.service.js.map +1 -1
  52. package/dist/tools/file-organization.d.ts +5 -0
  53. package/dist/tools/file-organization.d.ts.map +1 -1
  54. package/dist/tools/file-organization.js +23 -2
  55. package/dist/tools/file-organization.js.map +1 -1
  56. package/dist/tools/file-renaming.d.ts +65 -0
  57. package/dist/tools/file-renaming.d.ts.map +1 -0
  58. package/dist/tools/file-renaming.js +148 -0
  59. package/dist/tools/file-renaming.js.map +1 -0
  60. package/dist/tools/index.d.ts +4 -0
  61. package/dist/tools/index.d.ts.map +1 -1
  62. package/dist/tools/index.js +12 -0
  63. package/dist/tools/index.js.map +1 -1
  64. package/dist/tools/metadata-inspection.d.ts +41 -0
  65. package/dist/tools/metadata-inspection.d.ts.map +1 -0
  66. package/dist/tools/metadata-inspection.js +220 -0
  67. package/dist/tools/metadata-inspection.js.map +1 -0
  68. package/dist/tools/organization-preview.d.ts +5 -0
  69. package/dist/tools/organization-preview.d.ts.map +1 -1
  70. package/dist/tools/organization-preview.js +23 -3
  71. package/dist/tools/organization-preview.js.map +1 -1
  72. package/dist/tools/watch.tool.d.ts +48 -0
  73. package/dist/tools/watch.tool.d.ts.map +1 -0
  74. package/dist/tools/watch.tool.js +329 -0
  75. package/dist/tools/watch.tool.js.map +1 -0
  76. package/dist/tui/index.d.ts +9 -0
  77. package/dist/tui/index.d.ts.map +1 -0
  78. package/dist/tui/index.js +17 -0
  79. package/dist/tui/index.js.map +1 -0
  80. package/dist/tui/screens.d.ts +2 -0
  81. package/dist/tui/screens.d.ts.map +1 -0
  82. package/dist/tui/screens.js +3 -0
  83. package/dist/tui/screens.js.map +1 -0
  84. package/dist/tui/setup-wizard.d.ts +5 -0
  85. package/dist/tui/setup-wizard.d.ts.map +1 -0
  86. package/dist/tui/setup-wizard.js +229 -0
  87. package/dist/tui/setup-wizard.js.map +1 -0
  88. package/dist/types.d.ts +1 -1
  89. package/dist/types.d.ts.map +1 -1
  90. package/package.json +16 -4
package/ARCHITECTURE.md CHANGED
@@ -580,4 +580,3 @@ type Args = z.infer<typeof ArgsSchema>;
580
580
 
581
581
  **Last Updated:** February 3, 2026
582
582
  **Version:** 3.0.0
583
-
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # Changelog
2
2
 
3
+ ## [3.1.0] - 2026-02-06
4
+
5
+ ### ✨ New Features
6
+ - **Interactive Setup Wizard**: New TUI-based setup (`npx file-organizer-mcp --setup`) for easy configuration of folders, conflict strategies, and Claude Desktop integration.
7
+ - **Smart Metadata Organization**:
8
+ - Organization by Year/Month for images and videos.
9
+ - Organization by Artist/Album for audio files.
10
+ - New tool `file_organizer_inspect_metadata` for safe metadata extraction.
11
+ - **File Watching**:
12
+ - New tools (`watch_directory`, `unwatch_directory`, `list_watches`) to schedule automatic organization.
13
+ - Cron-based scheduling support.
14
+ - **Batch Renaming**: New powerful `file_organizer_batch_rename` tool.
15
+
16
+ ### 🛡️ Improvements
17
+ - **Security Check**: Enforced stricter validation for symlink security.
18
+ - **Free Models**: Updated default configuration to prioritize free models.
19
+
20
+ ### 🐛 Fixed
21
+ - Resolved JSON configuration errors.
22
+ - Fixed Cloud Authentication issues.
23
+ - Fixed server disconnection stability issues.
24
+
25
+ ---
26
+
3
27
  ## [3.0.0] - 2026-02-02
4
28
 
5
29
  ### 🚀 Major: Full TypeScript Migration
@@ -8,7 +32,7 @@ Complete rewrite from monolithic JavaScript to modular TypeScript architecture.
8
32
 
9
33
  ### ✨ Added
10
34
 
11
- **Architecture**
35
+ #### Architecture
12
36
  - New `src/` directory structure with layered architecture
13
37
  - TypeScript strict mode with full type safety
14
38
  - ESLint + Prettier configuration for code quality
@@ -43,7 +67,7 @@ Complete rewrite from monolithic JavaScript to modular TypeScript architecture.
43
67
  - Runtime validation with descriptive error messages
44
68
  - Type inference from schemas
45
69
 
46
- **Testing**
70
+ #### Testing
47
71
  - Comprehensive unit tests for all services
48
72
  - Integration tests for complete workflows
49
73
  - Performance benchmarks
@@ -76,7 +100,6 @@ Complete rewrite from monolithic JavaScript to modular TypeScript architecture.
76
100
  - `eslint`, `prettier`, `rimraf`
77
101
  - `jest` for testing
78
102
 
79
-
80
103
  ---
81
104
 
82
105
  ## [3.0.0-beta.1] - 2026-02-02
@@ -117,4 +140,4 @@ If you were using `../` paths (which was a security bug), those now correctly fa
117
140
  ---
118
141
 
119
142
  ## [2.1.0] - 2026-02-01
120
- (Previous version with path traversal vulnerability - UPGRADE IMMEDIATELY)
143
+ (Previous version with path traversal vulnerability - UPGRADE IMMEDIATELY)
package/CONTRIBUTING.md CHANGED
@@ -8,9 +8,9 @@ This project prioritizes security. All contributions must maintain or improve th
8
8
 
9
9
  ### Reporting Security Vulnerabilities
10
10
 
11
- **⚠️ DO NOT open public issues for security vulnerabilities**
11
+ > **⚠️ DO NOT open public issues for security vulnerabilities**
12
12
 
13
- Instead, email security concerns to: **technocratix902@gmail.com**
13
+ Instead, email security concerns to: **<technocratix902@gmail.com>**
14
14
 
15
15
  We will respond within 48 hours and work with you to address the issue.
16
16
 
@@ -179,6 +179,7 @@ throw new Error(`Invalid path: ${internalPath}`);
179
179
  ### 1. Create an Issue
180
180
 
181
181
  Before starting work, create an issue describing:
182
+
182
183
  - The problem or feature request
183
184
  - Proposed solution (if applicable)
184
185
  - Any breaking changes
@@ -299,7 +300,7 @@ Before submitting your PR, ensure:
299
300
 
300
301
  - **Questions**: Open a discussion on GitHub
301
302
  - **Issues**: Check existing issues or create new one
302
- - **Email**: technocratix902@gmail.com
303
+ - **Email**: <technocratix902@gmail.com>
303
304
 
304
305
  ## 🙏 Recognition
305
306
 
package/MIGRATION.md CHANGED
@@ -344,7 +344,7 @@ When reporting issues, include:
344
344
  - **Advanced duplicate detection** - Fuzzy matching, content similarity
345
345
  - **Performance mode** - Skip security checks for trusted paths
346
346
 
347
- ## 🎉 Migration Complete!
347
+ ## 🎉 Migration Complete
348
348
 
349
349
  If you've followed all steps, you're now running File Organizer MCP v3.0 with enhanced security and reliability.
350
350
 
package/README.md CHANGED
@@ -1,26 +1,25 @@
1
- # File Organizer MCP Server 🗂️
1
+ # <a id="file-organizer-mcp-server"></a>File Organizer MCP Server 🗂️
2
2
 
3
- **Version:** 3.0.0 | **MCP Protocol:** 2024-11-05 | **Node:** ≥18.0.0
3
+ **Version:** 3.1.0 | **MCP Protocol:** 2024-11-05 | **Node:** ≥18.0.0
4
4
 
5
- [Quick Start](#-quick-start) • [Features](#-features) • [Tools](#-tools-reference) • [Examples](#-example-workflows) • [API](API.md) • [Security](#-security) • [Architecture](ARCHITECTURE.md)
5
+ [Quick Start](#quick-start) • [Features](#features) • [Tools](#tools-reference) • [Examples](#example-workflows) • [API](API.md) • [Security](#security-configuration) • [Architecture](ARCHITECTURE.md)
6
6
 
7
7
  ---
8
8
 
9
- [![MCP Registry](https://img.shields.io/badge/MCP-Registry-blue)](https://registry.modelcontextprotocol.io/servers/io.github.kridaydave/file-organizer)
10
- [![npm version](https://img.shields.io/badge/npm-v3.0.0-blue.svg)](https://www.npmjs.com/package/file-organizer-mcp)
9
+ [![npm version](https://img.shields.io/badge/npm-v3.1.0-blue.svg)](https://www.npmjs.com/package/file-organizer-mcp)
11
10
  [![npm downloads](https://img.shields.io/npm/dm/file-organizer-mcp.svg)](https://www.npmjs.com/package/file-organizer-mcp)
12
11
  [![Security](https://img.shields.io/badge/security-hardened-green.svg)](https://github.com/kridaydave/File-Organizer-MCP)
13
12
  [![Node](https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen.svg)](https://nodejs.org)
14
13
  [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
15
- [![Tests](https://img.shields.io/badge/tests-133%20passing-success.svg)](tests/)
14
+ [![Tests](https://img.shields.io/badge/tests-209%20passing-success.svg)](tests/)
16
15
 
17
- **A powerful, security-hardened Model Context Protocol (MCP) server for intelligent file organization with Claude**
16
+ > **A powerful, security-hardened Model Context Protocol (MCP) server for intelligent file organization with Claude**
18
17
 
19
18
  🎯 [Install from MCP Registry](https://registry.modelcontextprotocol.io/servers/io.github.kridaydave/file-organizer) • 📦 [View on NPM](https://www.npmjs.com/package/file-organizer-mcp) • 🐛 [Report Issues](https://github.com/kridaydave/File-Organizer-MCP/issues)
20
19
 
21
20
  ---
22
21
 
23
- ## 🚀 Quick Start
22
+ ## <a id="quick-start"></a>Quick Start 🚀
24
23
 
25
24
  ### Installation
26
25
 
@@ -30,6 +29,9 @@ npm install -g file-organizer-mcp
30
29
 
31
30
  # Option 2: Use npx (no installation)
32
31
  npx file-organizer-mcp
32
+
33
+ # Option 3: Run the interactive setup wizard (Recommended)
34
+ npx file-organizer-mcp --setup
33
35
  ```
34
36
 
35
37
  ### Claude Desktop Configuration
@@ -62,20 +64,24 @@ Add to `claude_desktop_config.json`:
62
64
 
63
65
  ---
64
66
 
65
- ## 🎯 Features
67
+ ## <a id="features"></a>Features 🎯
66
68
 
67
69
  ### Core Functionality
68
70
 
69
71
  * **🤖 Auto-categorization** - Intelligently organizes files into 12+ categories
70
72
  * **🔍 Duplicate Detection** - Finds duplicate files using SHA-256 content hashing
73
+ * **🏷️ Smart Metadata** - Extracts EXIF/ID3 tags for content-aware organization
74
+ * **✏️ Batch Renaming** - Flexible renaming with patterns, regex, and case conversion
71
75
  * **🛡️ Smart Conflict Resolution** - Handles filename conflicts automatically (rename/skip/overwrite)
72
76
  * **👁️ Dry Run Mode** - Preview changes before executing
77
+ * **👀 File Watching** - Schedule automatic organization with cron-based triggers
73
78
  * **📊 Comprehensive Scanning** - Detailed directory analysis with statistics
74
79
  * **📈 Space Analysis** - Quickly identify space-consuming files
75
80
  * **⏮️ Rollback Support** - Undo file organization operations
76
81
  * **⚛️ Safe Atomic Moves** - Uses `COPYFILE_EXCL` to prevent race conditions during file moves
77
82
  * **💾 Automatic Backups** - Safely backs up files before overwriting to `.file-organizer-backups`
78
83
  * **📝 Structured Logging** - JSON-formatted logs with configurable log levels (debug/info/warn/error)
84
+ * **📜 Audit Trail** - Complete logging of all tool inputs, outputs, and execution status for transparency
79
85
  * **💻 Multi-Platform Support** - Native support for Windows, macOS, and Linux (Ubuntu, Debian, etc.)
80
86
 
81
87
  ### Security Features
@@ -105,27 +111,30 @@ This server implements a multi-layered security architecture designed to operate
105
111
  - **Race Condition Mitigation**: Uses atomic copy-then-delete strategy to prevent data loss if a file is modified during a move operation.
106
112
  - **Safe Overwrites**: When `conflict_strategy: 'overwrite'` is used, the existing file is moved to a timestamped backup folder before replacement.
107
113
 
108
- ### What's New in v3
114
+ ### 🚀 Upcoming Features
115
+
116
+ ### ⚙️ Interactive Configuration
117
+ The new TUI Setup Wizard makes configuration easy:
118
+ `npx file-organizer-mcp --setup`
119
+ - **📁 Folder Selection**: Interactively choose which folders to manage.
120
+ - **⚡ Conflict Handling**: Choose between **Rename**, **Skip**, or **Overwrite** strategies.
121
+ - **🤖 Claude Integration**: Automatically generates/updates your `claude_desktop_config.json`.
109
122
 
110
- **Architecture:**
111
- * **TypeScript Migration** - Complete rewrite from JavaScript to TypeScript with strict type safety
112
- * **Modular Design** - Layered architecture with Services, Tools, Utils, and Schemas layers
113
- * **Zod Validation** - Runtime input validation with descriptive error messages
123
+ ### What's New in v3.1.0
114
124
 
115
- **Security:**
116
- * **Secure by Default** - Whitelist-based authorization for directory access
117
- * **System Protection** - Critical system folders are strictly blocked
118
- * **Platform Awareness** - Automatically detects safe folders for Windows, Mac, and Linux
119
- * **8-Layer Path Validation** - Comprehensive validation pipeline preventing path traversal attacks
125
+ **New Features:**
126
+ * **🧙 Interactive Setup Wizard** - Run `npx file-organizer-mcp --setup` for a guided configuration experience.
127
+ * **🎵 Smart Metadata** - Organize images by Year/Month and audio by Artist/Album automatically.
128
+ * **👀 File Watching** - Schedule folders for automatic organization using cron expressions.
129
+ * **🏷️ Batch Renaming** - Powerful bulk renaming with find/replace, regex, and numbering support.
130
+ * **🛡️ Enhanced Security** - Improved symlink detection and path validation.
131
+ * **🆓 Free Models** - Optimized default configuration to use free models.
120
132
 
121
- **Breaking changes:**
122
- * Access is now denied for non-whitelisted directories by default.
123
- * You must add custom paths to `config.json` to access them.
124
- * See [MIGRATION.md](MIGRATION.md) for the upgrade guide.
133
+ See [CHANGELOG.md](CHANGELOG.md) for full details.
125
134
 
126
135
  ---
127
136
 
128
- ## 🛠️ Tools Reference
137
+ ## <a id="tools-reference"></a>Tools Reference 🛠️
129
138
 
130
139
  ### Core Tools
131
140
 
@@ -259,7 +268,7 @@ Automatically organize files into categorized folders.
259
268
 
260
269
  **Parameters:**
261
270
  - `directory` (string, required) - Full path to directory
262
- - `dry_run` (boolean, optional) - Preview without moving (default: false)
271
+ - `dry_run` (boolean, optional) - Preview without moving (default: true)
263
272
  - `conflict_strategy` ('rename'|'skip'|'overwrite'|'overwrite_if_newer', optional) - How to handle conflicts
264
273
  - `response_format` ('json'|'markdown', optional) - Output format
265
274
 
@@ -296,6 +305,34 @@ Reverse file moves and renames from a previous organization.
296
305
 
297
306
  ---
298
307
 
308
+ #### `file_organizer_batch_rename`
309
+
310
+ Batch rename files using pattern matching, case conversion, or sequence numbering.
311
+
312
+ **Parameters:**
313
+ - `directory` (string, optional) - Directory to scan (either this or `files` required)
314
+ - `files` (array, optional) - Specific files to rename
315
+ - `rules` (array, required) - Renaming rules:
316
+ - `type`: 'find_replace' | 'case' | 'add_text' | 'numbering'
317
+ - *...plus rule-specific options (replace, with, conversion, text, position, etc.)*
318
+ - `dry_run` (boolean, optional) - Preview only (default: true)
319
+
320
+ **Annotations:** ⚠️ Destructive (if dry_run=false) • 🔍 Dry-run
321
+
322
+ **Example:**
323
+ ```typescript
324
+ file_organizer_batch_rename({
325
+ directory: "/Docs",
326
+ rules: [
327
+ { type: "find_replace", find: "IMG", replace: "Photo" },
328
+ { type: "case", conversion: "lowercase" }
329
+ ],
330
+ dry_run: true
331
+ })
332
+ ```
333
+
334
+ ---
335
+
299
336
  ### Utility Tools
300
337
 
301
338
  #### `file_organizer_get_categories`
@@ -345,7 +382,7 @@ Permanently delete specified duplicate files. **This operation is destructive an
345
382
 
346
383
  ---
347
384
 
348
- ## 📁 File Categories
385
+ ## File Categories
349
386
 
350
387
  Files are automatically sorted into these categories:
351
388
 
@@ -353,13 +390,16 @@ Files are automatically sorted into these categories:
353
390
  | --- | --- |
354
391
  | **Executables** | `.exe`, `.msi`, `.bat`, `.cmd`, `.sh` |
355
392
  | **Videos** | `.mp4`, `.avi`, `.mkv`, `.mov`, `.wmv`, `.flv`, `.webm`, `.m4v` |
356
- | **Documents** | `.pdf`, `.doc`, `.docx`, `.txt`, `.rtf`, `.odt` |
393
+ | **Documents** | `.pdf`, `.doc`, `.docx`, `.txt`, `.rtf`, `.odt`, `.md`, `.tex` |
357
394
  | **Presentations** | `.ppt`, `.pptx`, `.odp`, `.key` |
358
395
  | **Spreadsheets** | `.xls`, `.xlsx`, `.csv`, `.ods` |
359
396
  | **Images** | `.jpg`, `.jpeg`, `.png`, `.gif`, `.bmp`, `.svg`, `.ico`, `.webp` |
360
397
  | **Audio** | `.mp3`, `.wav`, `.flac`, `.aac`, `.ogg`, `.wma`, `.m4a` |
361
398
  | **Archives** | `.zip`, `.rar`, `.7z`, `.tar`, `.gz`, `.bz2`, `.xz` |
362
399
  | **Code** | `.py`, `.js`, `.ts`, `.java`, `.cpp`, `.c`, `.html`, `.css`, `.php`, `.rb`, `.go`, `.json` |
400
+ | **Tests** | `*test*`, `*spec*`, `.test.ts`, `.spec.ts` |
401
+ | **Logs** | `*debug*`, `*.log` |
402
+ | **Scripts** | `*script*`, `.sh`, `.bat` |
363
403
  | **Installers** | `.dmg`, `.pkg`, `.deb`, `.rpm`, `.apk` |
364
404
  | **Ebooks** | `.epub`, `.mobi`, `.azw`, `.azw3` |
365
405
  | **Fonts** | `.ttf`, `.otf`, `.woff`, `.woff2` |
@@ -367,7 +407,7 @@ Files are automatically sorted into these categories:
367
407
 
368
408
  ---
369
409
 
370
- ## 💡 Example Workflows
410
+ ## <a id="example-workflows"></a>Example Workflows 💡
371
411
 
372
412
  ### Workflow 1: Intelligent Downloads Cleanup
373
413
 
@@ -396,7 +436,7 @@ User: "Claude, organize my project folder at ~/myproject"
396
436
  Claude:
397
437
  1. Scans the project → 423 files across multiple subdirectories
398
438
  2. Identifies file types → Code (289), Assets (87), Docs (47)
399
- 3. Suggests organization → Preserves src/ structure, organizes root files
439
+ 3. Suggestions organization → Preserves src/ structure, organizes root files
400
440
  4. Previews changes → Shows (47) items to organize
401
441
  5. Executes → Moves config files, readmes, screenshots to proper folders
402
442
 
@@ -441,9 +481,9 @@ Result: Clear visibility into space usage with actionable insights
441
481
 
442
482
  ---
443
483
 
444
- ## 🔐 Security Configuration
484
+ ## <a id="security-configuration"></a>Security Configuration 🔐
445
485
 
446
- **Security Score: 10/10 🌟**
486
+ ### Security Score: 10/10 🌟
447
487
 
448
488
  The server uses a **Secure by Default** approach. Access is restricted to a specific whitelist of user directories. All system directories are blacklisted.
449
489
 
@@ -481,19 +521,19 @@ You can allow access to additional folders by editing the user configuration fil
481
521
  1. Open `config.json`
482
522
  2. Add paths to `customAllowedDirectories`:
483
523
 
484
- ```json
485
- {
486
- "customAllowedDirectories": [
487
- "C:\\Users\\Name\\My Special Folder",
488
- "D:\\Backups"
489
- ],
490
- "settings": {
491
- "maxScanDepth": 10,
492
- "logAccess": true
493
- }
494
- }
495
- ```
496
- > 💡 **Tip:** You can copy a folder path directly from your file explorer's address bar and paste it into `customAllowedDirectories`.
524
+ ```json
525
+ {
526
+ "customAllowedDirectories": [
527
+ "C:\\Users\\Name\\My Special Folder",
528
+ "D:\\Backups"
529
+ ],
530
+ "settings": {
531
+ "maxScanDepth": 10,
532
+ "logAccess": true
533
+ }
534
+ }
535
+ ```
536
+ > 💡 **Tip:** You can copy a folder path directly from your file explorer's address bar and paste it into `customAllowedDirectories`.
497
537
 
498
538
  3. Restart Claude Desktop.
499
539
 
@@ -599,8 +639,8 @@ MIT License - see [LICENSE](LICENSE) file for details
599
639
 
600
640
  ---
601
641
 
602
- **Happy Organizing! 🎯**
642
+ ### Happy Organizing! 🎯
603
643
 
604
- *Built with ❤️ for the MCP community*
644
+ > *Built with ❤️ for the MCP community*
605
645
 
606
- [⬆ Back to Top](#file-organizer-mcp-server-)
646
+ [⬆ Back to Top](#file-organizer-mcp-server)
package/dist/config.d.ts CHANGED
@@ -17,6 +17,70 @@ export declare const CONFIG: {
17
17
  alwaysBlocked: RegExp[];
18
18
  };
19
19
  };
20
+ /**
21
+ * User configuration structure
22
+ */
23
+ export interface UserConfig {
24
+ /** Custom directories allowed for file operations */
25
+ customAllowedDirectories?: string[];
26
+ /** Conflict resolution strategy */
27
+ conflictStrategy?: 'rename' | 'skip' | 'overwrite';
28
+ /** Auto-organize schedule settings */
29
+ autoOrganize?: {
30
+ enabled: boolean;
31
+ schedule?: 'hourly' | 'daily' | 'weekly';
32
+ };
33
+ /** Security settings */
34
+ settings?: {
35
+ maxScanDepth?: number;
36
+ logAccess?: boolean;
37
+ enablePathValidation?: boolean;
38
+ allowCustomDirectories?: boolean;
39
+ };
40
+ /** Organization rules */
41
+ rules?: Array<{
42
+ pattern: string;
43
+ destination: string;
44
+ overwrite?: boolean;
45
+ }>;
46
+ /** Watch list for smart scheduling */
47
+ watchList?: WatchConfig[];
48
+ }
49
+ /**
50
+ * Watch configuration for per-directory scheduling
51
+ */
52
+ export interface WatchConfig {
53
+ /** Directory path to watch */
54
+ directory: string;
55
+ /** Cron expression for scheduling (e.g., "0 9 * * *" for 9am daily) */
56
+ schedule: string;
57
+ /** Organization rules for this watch */
58
+ rules: {
59
+ /** Enable auto-organization */
60
+ auto_organize: boolean;
61
+ /** Minimum file age in minutes before organizing (prevents organizing files being written) */
62
+ min_file_age_minutes?: number;
63
+ /** Maximum files to process per run (0 or undefined = unlimited) */
64
+ max_files_per_run?: number;
65
+ };
66
+ }
67
+ /**
68
+ * Load custom allowed directories from user config file
69
+ */
70
+ export declare function loadUserConfig(): UserConfig;
71
+ /**
72
+ * Update user config with deep merge (preserves existing settings)
73
+ * @deprecated Use updateUserConfig instead
74
+ */
75
+ export declare function saveConfig(config: Partial<UserConfig>): void;
76
+ /**
77
+ * Update user config with deep merge (preserves existing settings)
78
+ */
79
+ export declare function updateUserConfig(updates: Partial<UserConfig>): void;
80
+ /**
81
+ * Get path to user config file
82
+ */
83
+ export declare function getUserConfigPath(): string;
20
84
  /**
21
85
  * Create default user config file if it doesn't exist
22
86
  */
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;CAkBlB,CAAC;AAyKF;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CA4B3C;AAMD,eAAO,MAAM,aAAa,QAAoB,CAAC;AAC/C,eAAO,MAAM,SAAS,QAAuC,CAAC;AAC9D,eAAO,MAAM,SAAS,QAA+B,CAAC;AAEtD,eAAO,MAAM,gBAAgB,2DAA4D,CAAC;AAE1F,eAAO,MAAM,aAAa;;CAEhB,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;CAkBlB,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,qDAAqD;IACrD,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAC;IACpC,mCAAmC;IACnC,gBAAgB,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACnD,sCAAsC;IACtC,YAAY,CAAC,EAAE;QACb,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;KAC1C,CAAC;IACF,wBAAwB;IACxB,QAAQ,CAAC,EAAE;QACT,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAC/B,sBAAsB,CAAC,EAAE,OAAO,CAAC;KAClC,CAAC;IACF,yBAAyB;IACzB,KAAK,CAAC,EAAE,KAAK,CAAC;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC,CAAC;IACH,sCAAsC;IACtC,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,QAAQ,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,KAAK,EAAE;QACL,+BAA+B;QAC/B,aAAa,EAAE,OAAO,CAAC;QACvB,8FAA8F;QAC9F,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,oEAAoE;QACpE,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;CACH;AAgGD;;GAEG;AACH,wBAAgB,cAAc,IAAI,UAAU,CAa3C;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAE5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAqBnE;AAwBD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAe1C;AA4DD;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CA8B3C;AAMD,eAAO,MAAM,aAAa,QAAoB,CAAC;AAC/C,eAAO,MAAM,SAAS,QAAuC,CAAC;AAC9D,eAAO,MAAM,SAAS,QAA+B,CAAC;AAEtD,eAAO,MAAM,gBAAgB,2DAA4D,CAAC;AAE1F,eAAO,MAAM,aAAa;;CAEhB,CAAC"}
package/dist/config.js CHANGED
@@ -6,7 +6,7 @@ import os from 'os';
6
6
  import path from 'path';
7
7
  import fs from 'fs';
8
8
  export const CONFIG = {
9
- VERSION: '3.0.0',
9
+ VERSION: '3.0.1',
10
10
  // Security Settings
11
11
  security: {
12
12
  enablePathValidation: true,
@@ -63,6 +63,14 @@ function getDefaultAllowedDirs() {
63
63
  // Linux: Add common development directories
64
64
  commonDirs.push(path.join(home, 'dev'));
65
65
  }
66
+ // Add project directory when running tests
67
+ const isTestMode = process.env.NODE_ENV === 'test' || process.env.JEST_WORKER_ID !== undefined;
68
+ if (isTestMode) {
69
+ const projectDir = process.cwd();
70
+ if (!commonDirs.includes(projectDir)) {
71
+ commonDirs.push(projectDir);
72
+ }
73
+ }
66
74
  // Only return directories that actually exist
67
75
  return commonDirs.filter((dir) => {
68
76
  try {
@@ -73,27 +81,89 @@ function getDefaultAllowedDirs() {
73
81
  }
74
82
  });
75
83
  }
84
+ /**
85
+ * Deep merge two objects
86
+ */
87
+ function deepMerge(target, source) {
88
+ const result = { ...target };
89
+ for (const key in source) {
90
+ const sourceValue = source[key];
91
+ if (sourceValue !== undefined) {
92
+ const targetValue = result[key];
93
+ if (typeof sourceValue === 'object' &&
94
+ sourceValue !== null &&
95
+ !Array.isArray(sourceValue) &&
96
+ typeof targetValue === 'object' &&
97
+ targetValue !== null &&
98
+ !Array.isArray(targetValue)) {
99
+ result[key] = deepMerge(targetValue, sourceValue);
100
+ }
101
+ else {
102
+ result[key] = sourceValue;
103
+ }
104
+ }
105
+ }
106
+ return result;
107
+ }
76
108
  /**
77
109
  * Load custom allowed directories from user config file
78
110
  */
79
- function loadCustomAllowedDirs() {
111
+ export function loadUserConfig() {
80
112
  try {
81
113
  const configPath = getUserConfigPath();
82
114
  if (fs.existsSync(configPath)) {
83
115
  const configData = fs.readFileSync(configPath, 'utf-8');
84
- const config = JSON.parse(configData);
85
- if (Array.isArray(config.customAllowedDirectories)) {
86
- // Validate that custom directories exist
87
- return config.customAllowedDirectories.filter((dir) => {
88
- try {
89
- return fs.existsSync(dir) && fs.statSync(dir).isDirectory();
90
- }
91
- catch {
92
- console.error(`Warning: Custom directory does not exist: ${dir}`);
93
- return false;
94
- }
95
- });
96
- }
116
+ return JSON.parse(configData);
117
+ }
118
+ }
119
+ catch (error) {
120
+ console.error('Error loading user config:', error.message);
121
+ }
122
+ return {};
123
+ }
124
+ /**
125
+ * Update user config with deep merge (preserves existing settings)
126
+ * @deprecated Use updateUserConfig instead
127
+ */
128
+ export function saveConfig(config) {
129
+ updateUserConfig(config);
130
+ }
131
+ /**
132
+ * Update user config with deep merge (preserves existing settings)
133
+ */
134
+ export function updateUserConfig(updates) {
135
+ try {
136
+ const configPath = getUserConfigPath();
137
+ // Read existing config
138
+ const existingConfig = loadUserConfig();
139
+ // Deep merge the updates
140
+ const mergedConfig = deepMerge(existingConfig, updates);
141
+ // Ensure config directory exists
142
+ const configDir = path.dirname(configPath);
143
+ if (!fs.existsSync(configDir)) {
144
+ fs.mkdirSync(configDir, { recursive: true });
145
+ }
146
+ // Write merged config back to disk
147
+ fs.writeFileSync(configPath, JSON.stringify(mergedConfig, null, 2));
148
+ }
149
+ catch (error) {
150
+ console.error('Error saving config:', error.message);
151
+ }
152
+ }
153
+ function loadCustomAllowedDirs() {
154
+ try {
155
+ const config = loadUserConfig();
156
+ if (Array.isArray(config.customAllowedDirectories)) {
157
+ // Validate that custom directories exist
158
+ return config.customAllowedDirectories.filter((dir) => {
159
+ try {
160
+ return fs.existsSync(dir) && fs.statSync(dir).isDirectory();
161
+ }
162
+ catch {
163
+ console.error(`Warning: Custom directory does not exist: ${dir}`);
164
+ return false;
165
+ }
166
+ });
97
167
  }
98
168
  }
99
169
  catch (error) {
@@ -104,7 +174,7 @@ function loadCustomAllowedDirs() {
104
174
  /**
105
175
  * Get path to user config file
106
176
  */
107
- function getUserConfigPath() {
177
+ export function getUserConfigPath() {
108
178
  const platform = os.platform();
109
179
  const home = os.homedir();
110
180
  if (platform === 'win32') {
@@ -193,11 +263,14 @@ export function initializeUserConfig() {
193
263
  if (!fs.existsSync(configPath)) {
194
264
  const defaultConfig = {
195
265
  customAllowedDirectories: [],
266
+ conflictStrategy: 'rename',
267
+ autoOrganize: {
268
+ enabled: false,
269
+ },
196
270
  settings: {
197
271
  maxScanDepth: 10,
198
272
  logAccess: true,
199
273
  },
200
- _comment: "Add custom directories to 'customAllowedDirectories' array. Example: 'C:\\\\Users\\\\YourName\\\\CustomFolder'",
201
274
  };
202
275
  fs.writeFileSync(configPath, JSON.stringify(defaultConfig, null, 2));
203
276
  console.error(`Created default config file at: ${configPath}`);
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/constants.js CHANGED
@@ -8,7 +8,7 @@
8
8
  export const CATEGORIES = {
9
9
  Executables: ['.exe', '.msi', '.bat', '.cmd', '.sh'],
10
10
  Videos: ['.mp4', '.avi', '.mkv', '.mov', '.wmv', '.flv', '.webm', '.m4v'],
11
- Documents: ['.pdf', '.doc', '.docx', '.txt', '.rtf', '.odt'],
11
+ Documents: ['.pdf', '.doc', '.docx', '.txt', '.rtf', '.odt', '.md', '.tex'],
12
12
  Presentations: ['.ppt', '.pptx', '.odp', '.key'],
13
13
  Spreadsheets: ['.xls', '.xlsx', '.csv', '.ods'],
14
14
  Images: ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.svg', '.ico', '.webp'],
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAA4C;IAC/D,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;IACpD,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;IACzE,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IAC5D,aAAa,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC;IAChD,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC;IAC/C,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;IAC1E,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IAChE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;IAC/D,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC;IAClG,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IACpD,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;IAC3C,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC;IAC1C,MAAM,EAAE,EAAE;CACJ,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAA4B,MAAM,CAAC,IAAI,CAAC,UAAU,CAAmB,CAAC;AAEjG;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,SAAiB;IACzC,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9D,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,QAAwB,CAAC;QACpC,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAA4C;IAC/D,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;IACpD,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;IACzE,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC;IAC3E,aAAa,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC;IAChD,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC;IAC/C,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;IAC1E,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IAChE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;IAC/D,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC;IAClG,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IACpD,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;IAC3C,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC;IAC1C,MAAM,EAAE,EAAE;CACJ,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAA4B,MAAM,CAAC,IAAI,CAAC,UAAU,CAAmB,CAAC;AAEjG;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,SAAiB;IACzC,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9D,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,QAAwB,CAAC;QACpC,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC"}