My Junk Drawer of Python Libraries, and the MCP Feature That Finally Cleaned It Out

My pip install history looks like a junk drawer. Pillow for images. python-docx for Word files. PyPDF2 for PDFs. openpyxl for spreadsheets. imageio for whatever Pillow refuses to touch. Six single-purpose spatulas, no actual knife, and I still had to Google which spatula flips a .heic file without turning it into soup.

Then I got to Roots, and the drawer started looking a lot less necessary.

Roots is one of the more understated MCP primitives — it doesn’t do anything flashy on its own. What it does is let the client hand the server exactly one boundary: “here’s a folder, subfolders included, and nothing outside it.” The server doesn’t get the whole filesystem. It gets the one drawer you actually agreed to open, not the keys to the house.

Something like this, conceptually, on the client side:

roots = [
    Root(uri="file:///Users/brian/projects/incoming_photos"),
]

That’s it. That’s the whole boundary. The server can look inside incoming_photos and every subfolder underneath it, and nowhere else. It’s the scoped version of “sure, come on in” — the digital equivalent of leaving out exactly one drawer for the babysitter instead of the whole kitchen.

Here’s where it clicked for me: once Claude can see that folder, I stop needing six libraries to guess at six formats. I don’t need to know in advance whether the folder’s full of .png, .heic, or some cursed proprietary format a scanner invented in 2011. I just point Claude at the folder and ask it to convert whatever’s in there. The format-hunting — the part where I used to lose forty-five minutes deciding whether Pillow or imageio was going to be the one that actually opened the file — just isn’t my problem anymore.

Combine Roots with Resources — which I wrote about a couple weeks back — and you get something close to real autocomplete. Claude already knows what’s sitting in that folder, so instead of typing IMG_4826_final_FINAL_v2.jpg from memory and getting it wrong twice, it’s just… there. Suggested. Correct the first time.

Where this is actually headed for me: I’ve got a Python + Claude API project brewing that pulls photos straight off a camera. Cameras are chaos — RAW here, HEIC there, some proprietary format a manufacturer cooked up on a Tuesday because why not. Point Roots at the folder the camera dumps into, and the format stops being a decision I have to make in advance. Whatever shows up, shows up. That’s not a job for six spatulas anymore. That’s just Claude’s problem now.

Small feature. Bigger effect: it’s the difference between “I need to know every format in advance” and “I need a folder and a reasonable request.” That’s the kind of quiet infrastructure decision that doesn’t show up in a demo video, but saves you an entire junk drawer’s worth of dependencies down the line.