shutter-mcp
Click on "Install 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
English | Espanol

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: immich-mcp
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 installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceThis MCP server aids users in searching and analyzing their photo library by location, labels, and people, offering functionalities like photo analysis and fuzzy matching for enhanced photo management.24MIT
- 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.456MIT
- 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.MIT
Related MCP Connectors
OCR, transcription, file extraction, and image generation for AI agents via MCP.
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
Scans MCP servers for tool poisoning, prompt injection and supply chain risks.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/keivanmalhani/shutter-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server