shutter-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@shutter-mcpscan my photo library and generate a cull report"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
shutter-mcp

Point Claude, or any MCP client, at a folder of RAW and JPEG files. It can scan the library, break down which cameras and lenses actually got used, find duplicates, flag the shots that are probably blurry, or write a full cull report. It never gets a tool that can touch a file: read-only means read-only, all the way down.
Why this exists: culling tools that touch your shoots ask for a subscription or your client's files on somebody else's cloud. This asks for neither. It reads the metadata and pixels already sitting on your disk and answers in text, not files, and it is deliberately the read-only first step of a bigger local-first project (see Roadmap; the write-capable half is shutter-cull-mcp).
Tools
Tool | Description | Read/write |
| Recursively count files under a root by extension, size, and mtime range | read-only |
| Aggregate EXIF stats across a library: camera, lens, focal length, ISO, year-month | read-only |
| Flattened EXIF fields for one file | read-only |
| Exact (sha256) or visual (perceptual hash) duplicate groups | read-only |
| Laplacian-variance blur ranking for jpg files | read-only |
| Markdown report combining all of the above | read-only |
Every tool is read-only. None of them write, move, rename, or delete a file.
Related MCP server: Docalyze
Install
Requires Python 3.11+.
With uv (recommended):
uv tool install shutter-mcpWith pipx:
pipx install shutter-mcpFrom source, for development:
git clone https://github.com/keivanmalhani/shutter-mcp.git
cd shutter-mcp
uv venv
uv pip install -e ".[dev]"Usage
shutter-mcp takes one or more --root directories at launch. Every tool call is validated against this allowlist, so the server can only ever see the folders you explicitly grant it.
shutter-mcp --root /path/to/photos --root /path/to/scansClaude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"shutter-mcp": {
"command": "shutter-mcp",
"args": ["--root", "/Users/you/Pictures/2026-shoot"]
}
}
}Claude Code
claude mcp add shutter-mcp -- shutter-mcp --root /Users/you/Pictures/2026-shootSecurity model
Read-only. No tool writes, moves, renames, or deletes user files.
cull_reportreturns markdown text; it never writes a file.Root allowlist. The server only accepts
--rootdirectories at launch. Every path argument a tool receives is resolved (Path.resolve, symlinks included) and rejected if it falls outside every allowed root, even if a symlink inside the root points elsewhere.No network calls at runtime. Everything happens on your filesystem.
No image bytes returned. Tools return paths and metadata only, never base64 or raw pixel data.
No telemetry, no analytics.
Format support
Capability | Extensions |
EXIF read ( | jpg, jpeg, tif, tiff, png, dng, arw, raf, nef, cr2, cr3 (best effort on RAW) |
Pixel decode ( | jpg, jpeg, png, tiff |
RAW pixel decode (blur scoring and visual dedup on ARW/RAF/etc.) is out of scope for this MVP; EXIF reading works today on both. See Roadmap.
Development
uv pip install -e ".[dev]"
uv run pytestTests generate their own fixture images with Pillow at run time; no binary fixtures are committed to the repo.
Roadmap
RAW pixel decode (ARW, RAF, and friends) via rawpy, for blur scoring and visual dedup
XMP rating/flag writeback so cull decisions show up in Lightroom Classic
Integration as the agent interface for the local-first photo culling engine
Publish to PyPI and the MCP registry
Family
shutter-cull is the photo engine and shutter-select the video one. shutter-cull-mcp is the side that does write, with human confirmation and undo. This is the read-only one, and that guarantee is structural rather than a promise in the docs.
License
MIT, see LICENSE.
This server cannot be deployed
Maintenance
Related MCP Connectors
Read-only MCP server over the JENRIKS daily photoblog: one photo per day since 2006. No auth.
OCR, transcription, file extraction, and image generation for AI agents via MCP.
Holiday photo MCP server: list and fetch personal holiday photos inline in Claude chat.
An MCP server that provides read access to your cloud storage providers, bank accounts and more.
Related MCP Servers
- FlicenseAqualityBmaintenanceAn MCP server for Immich self-hosted photo management that provides AI-accessible tools for browsing, searching, organizing, and managing photo libraries with duplicate detection and safe deletion workflows.431-
- AlicenseBqualityDmaintenanceAn MCP server that lets AI assistants read and visually analyze local documents — PDFs, Excel spreadsheets, CSV files, Word documents, PowerPoint presentations, and images.442 npm72 PyPIMIT
- AlicenseNot gradedqualityDmaintenanceThis MCP server enables AI tools to interact with your Apple Photos library via the osxphotos CLI, providing tools for querying and managing photos.1MIT
- AlicenseNot gradedqualityBmaintenanceA local Ollama-backed MCP server that gives coding assistants a portable photo-understanding toolset including photo analysis, OCR, scene inspection, comparison, and metadata extraction.MIT