Skip to main content
Glama

tidy-mcp

Your Downloads folder, cleaned by a local AI. Private. Undoable.

Point tidy at a messy folder. A local model looks at every file, gives it a real name and sorts it into folders. Nothing leaves your machine, and every run can be undone.

🚧 Early release. Feedback welcome.

tidy planning, applying and undoing a messy Downloads folder

IMG_2931.png            →  Receipts/2026-06-12_Amazon_receipt.png
Screenshot 11.04.12.png →  Screenshots/Code/python_KeyError_traceback.png
final_v3_real.pdf       →  Documents/Housing/Lease_Agreement_Bangalore_2025.pdf
IMG_2931 (1).png        →  _tidy_trash/   (duplicate)
Docker.dmg              →  _tidy_trash/   (installer older than 30 days)

How it works

scan → plan (dry run) → preview → apply → undo
  • Runs on Ollama, fully offline

  • Never deletes anything. Duplicates and old installers go to _tidy_trash/

  • Every applied plan can be undone

  • Only touches the top level of the folder you give it. Hidden files and symlinks are skipped

  • Works as a CLI (tidy) and as an MCP server for Claude, Cursor and other clients

Related MCP server: mcp-document-intelligence

Setup

  1. Install Ollama and pull the models:

    ollama pull qwen2.5:7b
    ollama pull qwen2.5vl:7b
  2. Install tidy (needs Python 3.12+):

    uv tool install tidy-mcp      # or: pipx install tidy-mcp

CLI

tidy plan ~/Downloads      # dry run: shows every change, moves nothing
tidy apply last            # asks before moving (or pass a plan ID)
tidy undo last             # puts everything back
tidy dupes ~/Downloads     # list duplicate files

MCP server

Add tidy to your MCP client. For Claude Desktop, edit claude_desktop_config.json:

{
  "mcpServers": {
    "tidy": {
      "command": "uvx",
      "args": ["tidy-mcp"]
    }
  }
}

For Claude Code:

claude mcp add tidy -- uvx tidy-mcp

For Cursor, add the same command and args under mcpServers in ~/.cursor/mcp.json.

Then ask: "Tidy my Downloads folder." The assistant shows the plan and only applies it after you agree.

Tool

What it does

scan_folder

List the files tidy would look at

describe_file

Suggested name and folder for one file

plan_tidy

Build a dry-run plan

apply_plan

Apply an approved plan

undo

Reverse an applied plan

find_duplicates

Groups of identical files

Configuration

Optional. Create ~/.tidy/config.toml:

text_model = "qwen2.5:7b"
vision_model = "qwen2.5vl:7b"
limit = 500                      # max files per run
ignore = ["*.part", "keep-*"]    # file name patterns to leave alone

[[rules]]                        # send matching files to a fixed folder
match = "invoice"
folder = "~/Finance/Invoices"

workers (default 4) sets how many files are described at once. Answers are cached, so re-running on the same files is instant.

Any setting can also come from an environment variable such as TIDY_TEXT_MODEL. Plans and undo logs live in ~/.tidy (or $TIDY_HOME).

Development

uv sync
uv run python scripts/make_fixtures.py   # builds a fake messy folder
uv run pytest                            # includes property-based safety tests
uv run python scripts/eval_quality.py    # scores naming on 30 varied files (needs Ollama)

Current score with qwen2.5:7b + qwen2.5vl:7b: 29/30 folders correct, 30/30 names contain the key words.

Contributing

Issues labeled good first issue are a good place to start. See CONTRIBUTING.md.

Releasing

  1. Move the Unreleased notes in CHANGELOG.md under a new version heading.

  2. uv version --bump minor (or patch / major) and commit.

  3. git tag v$(uv version --short) && git push --tags

The Release workflow tests, builds, publishes to PyPI and creates the GitHub release.

License

MIT

Available Tools

6 tools
apply_planA

Apply a plan the user has approved. Files are moved, never deleted.

NameRequiredDescriptionDefault
plan_idYes

Output Schema

NameRequiredDescription
movesYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=false, and the description usefully explains the mutation semantics that justify that profile: 'Files are moved, never deleted.' That tells the agent the operation relocates rather than removes data, which is meaningful context beyond the hints. It still omits idempotency and partial-failure behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero filler, with the action and the key safety guarantee front-loaded. Nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema and annotations exist, so return values and safety profile are covered. For a mutating one-parameter tool, though, it neglects idempotency, error/partial-application behavior, and the undo sibling that governs recovery.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

A single plan_id parameter with 0% schema description coverage, so the description carries the burden. It implies the plan came from user approval but never says where plan_id originates (presumably a plan_tidy result) or its format.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (apply) plus resource (plan), and the qualifier 'the user has approved' scopes it to a post-review stage. It implicitly separates this from plan_tidy (which produces the plan), though it never names that sibling directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'a plan the user has approved' implies a prerequisite step and ordering, which is real if implicit guidance. It never states when not to use it, nor points to undo as the reversal path when the result is unwanted.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

describe_fileB
Read-only

Ask the local model for a better name and folder for one file.

NameRequiredDescriptionDefault
pathYes

Output Schema

NameRequiredDescription
nameYesNew file name without extension, e.g. 2026-06-12_Amazon_receipt
summaryYesOne short sentence about the file
categoryYesFolder to put it in, e.g. Receipts or Screenshots/Code

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds the valuable detail that a local model is invoked (implying latency and non-deterministic output), but it does not clarify that the result is only a suggestion and that nothing is renamed or moved.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; every word contributes to the meaning and nothing is repeated from structured fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the tool is low complexity with one parameter. However, in a workflow with siblings like plan_tidy, apply_plan and undo, the definition omits where this step fits and that its output is advisory rather than applied, leaving the agent to guess.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the single 'path' property has no description, so the description must carry the load. 'One file' does imply the path points to a single file rather than a directory, but it adds no format, relative-vs-absolute, or error semantics beyond that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action (ask the local model) and a specific output (a better name and folder) scoped to 'one file', which an agent can distinguish from folder-level siblings like scan_folder and plan_tidy. It is clear but never explicitly contrasts itself with those siblings or explains how its per-file suggestion relates to plan_tidy/apply_plan.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to call this versus scan_folder or plan_tidy, nor any mention of prerequisites or ordering within the tidy workflow. The only hint is the phrase 'one file', which implies per-file scope but leaves the agent to infer it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_duplicatesC
Read-only

Groups of identical files. The first in each group is the original and is kept.

NameRequiredDescriptionDefault
pathYes

Output Schema

NameRequiredDescription
groupsYes

TDQS

C2.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds a genuinely useful behavioral convention: files within each group are ordered such that the first is the 'original' kept by downstream steps. However, it leaves other behavior (ordering of groups, how identity is determined, whether it recurses) unstated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no filler, and the key grouping convention is front-loaded. It is efficient, though arguably undersized given how much is left unspecified.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained, but for a tool with an undocumented required parameter and no usage guidance, the description is too thin. It omits the scan scope, recursion behavior, and how it fits with plan_tidy/apply_plan.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the single required parameter 'path' is completely undocumented in both schema and description. The description does not say what the path points to (root folder to scan?), whether it recurses, or what format it takes, so it fails to compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the resource (groups of identical files) but uses a noun phrase with no verb, so the action is only inferable from the tool name. It does add one meaningful semantic detail (the first file in each group is treated as the original), which distinguishes it somewhat, but there is no differentiation from siblings like scan_folder or plan_tidy.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to call this tool versus scan_folder, plan_tidy, or apply_plan, and no statement of prerequisites or typical workflow position. The agent must guess that this is a read step feeding into plan_tidy.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plan_tidyB

Build a dry-run plan for a folder. Nothing is moved. Show the plan to the user.

NameRequiredDescriptionDefault
pathYes
limitNo

Output Schema

NameRequiredDescription
idYes
rootYes
movesNo
createdYes
extra_rootsNoFolders outside root that config rules may move files into

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=false and openWorldHint=false, and the description usefully reinforces this with 'Nothing is moved.' telling the agent the call is a safe dry run. It adds no information about whether a plan artifact is persisted or how long a plan stays valid, which is the remaining behavioral gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action and followed by the safety and UX constraints. Nothing is padded, though the final directive is terse enough that it reads as a fragment rather than a complete instruction.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the tool is structurally simple with one required parameter. The unresolved gap is the unexplained 'limit' parameter and the absence of any note on plan persistence or how the plan connects to apply_plan, leaving the workflow slightly under-specified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description never mentions 'path' or 'limit'. The one required parameter and the pagination default are left entirely for the agent to infer from bare titles, so the description fails to compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb+resource (build a dry-run plan for a folder) and clarifies scope with 'Nothing is moved', which implicitly separates it from apply_plan. It never names the sibling explicitly, so an agent must infer the planning-vs-execution distinction rather than being routed to it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Build a dry-run plan' and 'Show the plan to the user' imply this is the pre-execution step and that the plan should be surfaced rather than acted on. However, it never states when to prefer this over apply_plan or what must happen between planning and applying, so usage is implied rather than spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scan_folderA
Read-only

List the files tidy would look at in a folder (top level only, no hidden files).

NameRequiredDescriptionDefault
pathYes
limitNo

Output Schema

NameRequiredDescription
filesYes

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, but the description adds genuinely non-obvious behavior: only top-level entries are returned and hidden files are excluded, which is tidy's own filtering rule. It still omits anything about the 500-item cap or what happens when a folder exceeds it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with the scope constraint front-loaded in the parenthetical, zero filler and no redundancy with the title or schema. Every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description covers the filtering scope adequately. However, for a scan-like tool it leaves the limit/pagination behavior and the relationship to plan_tidy unaddressed, so it is only minimally sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description explains neither parameter. 'path' is only obliquely implied by 'folder,' and the 'limit' parameter (default 500), which materially changes results, is never mentioned. With two undocumented parameters, the description fails to compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb (list) and resource (files in a folder) plus the exact scope tidy applies, which is specific enough for an agent to recognize it without opening the schema. It does not name or contrast itself with siblings like describe_file or find_duplicates, so it falls short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the phrase 'files tidy would look at' suggests this is a reconnaissance step preceding plan_tidy, but the description never says when to call it, when not to, or which sibling handles the alternative (e.g., finding duplicates or describing a single file). An agent must infer the workflow position.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

undoA

Put every file from an applied plan back where it was.

NameRequiredDescriptionDefault
plan_idYes

Output Schema

NameRequiredDescription
movesYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false, so the safety profile is partly covered. The description adds the meaningful behavioral fact that it restores every file, but omits failure modes (partial undo, files changed since apply, conflicts) that matter for a mutating file operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence with no filler, and the scope qualifier ('from an applied plan') is placed where it matters. Nothing is padded or restated from the name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and annotations cover the safety flags. Still, for a mutating undo operation the description is thin: it does not indicate whether the undo is all-or-nothing, what happens on partial failure, or whether it can be re-applied afterward.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is one parameter with 0% schema description coverage, so the description must carry the burden. 'Applied plan' does clarify that plan_id must reference a plan that has already been applied, which is real added meaning, but format, source of the id, and validation are still unspecified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete action (put files back) and its scope (every file from an applied plan), which clearly pairs it with the sibling apply_plan as its inverse. It stops short of naming apply_plan explicitly, but the phrase 'applied plan' makes the pairing inferable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'from an applied plan' implies the tool is used after apply_plan has run, which is useful context. However, it gives no explicit when-to-use/when-not guidance, no mention of what to do if the plan was never applied or was already undone, and does not contrast with siblings like plan_tidy.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 6 tool updatesv0.1.0
    • First observedapply_plan
    • First observeddescribe_file
    • First observedfind_duplicates
    • First observedplan_tidy
    • First observedscan_folder
    • First observedundo

TDQS

A3.5/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a distinct granularity and action: scan_folder (inventory), describe_file (single-file suggestion), plan_tidy (folder dry-run), apply_plan (execution), undo (reversal), find_duplicates (dedup). No two tools could plausibly be swapped for the same task.

Naming Consistency4/5

Five of six tools follow a clean verb_noun pattern (scan_folder, describe_file, plan_tidy, apply_plan, find_duplicates). The lone outlier is 'undo', which breaks the pattern but is a universally understood primitive verb.

Tool Count5/5

Six tools is well-scoped for a file-tidying assistant: one inventory, one per-file helper, one planning step, one apply step, one undo, and dedup detection. Each earns its place with no filler.

Completeness4/5

The surface covers the full safe lifecycle (scan, plan, apply, undo) plus duplicate handling, which is strong for the domain. Minor gaps remain: no way to list past plans or selectively roll back a single file, and no configuration of naming rules.

Maintenance

ActivityNo data
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides AI assistants with persistent memory through local ChromaDB vector storage, featuring automated file ingestion and batch processing for over 70 file types. It enables advanced vector search, EXIF metadata extraction for photos, and duplicate file detection across local directories.
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to analyze, rename, categorize, and organize local documents using OCR, metadata extraction, and batch processing, with preview mode and undo support.
    1
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    Enables agents to organize messy folders into structured libraries by scanning, planning, and applying reorganization via a manifest-first, non-destructive workflow.
    16
    3 npm
    1
    MIT