Apps / Bulk File Ops
Bulk File Ops v1.0.0
Bulk-organise files in a folder: move everything of a given extension into a destination, sort files into date-based subfolders, or flatten a nested tree back to one level - every operation previews as a dry-run first and can be undone.
The omniscient:// link needs a protocol handler on your machine, which is not built yet. Until then it does nothing — use the commands below.
Actions
Jump to:
move_by_extensionsort_by_dateflattenundo
Move by extension
move_by_extension
Destructive
Move every file matching one or more extensions from a folder into a destination folder.
Inputs
Name Type Required / default Values and notes
folder
path
required
dest
path
required
extensions
string
required
recursive
bool
optional, default true
on_conflict
enum
optional, default rename
renameskipoverwrite
Outputs
Name Type Notes
moved
int
skipped
int
dest
path
changes
json
Sort by date
sort_by_date
Destructive
Sort files into date-based subfolders (year, month or day), using the file's modified/created timestamp or a date found in its filename.
Inputs
Name Type Required / default Values and notes
folder
path
required
dest
path
optional, default ""
source
enum
optional, default modified
modifiedcreatedfilename
granularity
enum
optional, default month
yearmonthday
recursive
bool
optional, default false
on_conflict
enum
optional, default rename
renameskipoverwrite
Outputs
Name Type Notes
moved
int
skipped
int
dest
path
changes
json
Flatten folder
flatten
Destructive
Move every file out of nested subfolders directly into the top-level folder, then remove the subfolders it emptied.
Inputs
Name Type Required / default Values and notes
folder
path
required
delete_empty
bool
optional, default true
on_conflict
enum
optional, default rename
renameskipoverwrite
Outputs
Name Type Notes
moved
int
skipped
int
removed_dirs
int
changes
json
Undo last operation
undo
Destructive
Reverse the most recent move/sort/flatten run on a folder, using the journal Bulk File Ops keeps.
Inputs
Name Type Required / default Values and notes
folder
path
required
Outputs
Name Type Notes
restored
int
changes
json
Requires
Python >=3.10
Packages none
Models none
Use it
move_by_extension
sort_by_date
flatten
undo
Move by extension
Command line
shell Copy
python app.py --action move_by_extension --params '{"folder": "D:/path/to/folder", "dest": "D:/path/to/dest", "extensions": "<extensions>"}'
# preview first - destructive action, nothing is changed:
python app.py --action move_by_extension --params '{"folder": "D:/path/to/folder", "dest": "D:/path/to/dest", "extensions": "<extensions>"}' --dry-run
Run from the app’s own folder. Single quotes work in bash and PowerShell; in cmd.exe use double quotes and escape the inner ones.
MCP tool
mcp Copy
run_action("bulk-file-ops", "move_by_extension", {"folder": "D:/path/to/folder", "dest": "D:/path/to/dest", "extensions": "<extensions>"})
# preview first:
run_action("bulk-file-ops", "move_by_extension", {"folder": "D:/path/to/folder", "dest": "D:/path/to/dest", "extensions": "<extensions>"}, dry_run=true)
Workflow node
json Copy
{
"id": "n0",
"app": "bulk-file-ops",
"action": "move_by_extension",
"params": {
"folder": "D:/path/to/folder",
"dest": "D:/path/to/dest",
"extensions": "<extensions>"
},
"inputs": {}
}
Sort by date
Command line
shell Copy
python app.py --action sort_by_date --params '{"folder": "D:/path/to/folder"}'
# preview first - destructive action, nothing is changed:
python app.py --action sort_by_date --params '{"folder": "D:/path/to/folder"}' --dry-run
Run from the app’s own folder. Single quotes work in bash and PowerShell; in cmd.exe use double quotes and escape the inner ones.
MCP tool
mcp Copy
run_action("bulk-file-ops", "sort_by_date", {"folder": "D:/path/to/folder"})
# preview first:
run_action("bulk-file-ops", "sort_by_date", {"folder": "D:/path/to/folder"}, dry_run=true)
Workflow node
json Copy
{
"id": "n0",
"app": "bulk-file-ops",
"action": "sort_by_date",
"params": {
"folder": "D:/path/to/folder"
},
"inputs": {}
}
Flatten folder
Command line
shell Copy
python app.py --action flatten --params '{"folder": "D:/path/to/folder"}'
# preview first - destructive action, nothing is changed:
python app.py --action flatten --params '{"folder": "D:/path/to/folder"}' --dry-run
Run from the app’s own folder. Single quotes work in bash and PowerShell; in cmd.exe use double quotes and escape the inner ones.
MCP tool
mcp Copy
run_action("bulk-file-ops", "flatten", {"folder": "D:/path/to/folder"})
# preview first:
run_action("bulk-file-ops", "flatten", {"folder": "D:/path/to/folder"}, dry_run=true)
Workflow node
json Copy
{
"id": "n0",
"app": "bulk-file-ops",
"action": "flatten",
"params": {
"folder": "D:/path/to/folder"
},
"inputs": {}
}
Undo last operation
Command line
shell Copy
python app.py --action undo --params '{"folder": "D:/path/to/folder"}'
# preview first - destructive action, nothing is changed:
python app.py --action undo --params '{"folder": "D:/path/to/folder"}' --dry-run
Run from the app’s own folder. Single quotes work in bash and PowerShell; in cmd.exe use double quotes and escape the inner ones.
MCP tool
mcp Copy
run_action("bulk-file-ops", "undo", {"folder": "D:/path/to/folder"})
# preview first:
run_action("bulk-file-ops", "undo", {"folder": "D:/path/to/folder"}, dry_run=true)
Workflow node
json Copy
{
"id": "n0",
"app": "bulk-file-ops",
"action": "undo",
"params": {
"folder": "D:/path/to/folder"
},
"inputs": {}
}
Example prompts
Things you can say to Claude, Cursor or Codex once the MCP server is registered.
move every .pdf and .docx from D:/Downloads into D:/Downloads/Documents sort my Downloads folder into month subfolders by date modified, preview first flatten this nested export folder into one flat directory undo the last bulk file operation on D:/Downloads