Skip to main content

immich-photo-manager

immich-photo-manager

CI License: MIT immich-photo-manager MCP server GitHub Release Immich PyPI

Tested live on Immich 2.7.5 and 3.1.0 54 unit tests on every push 11 demos from real sessions

MCP server for intelligent photo management with Immich — your self-hosted library, understood.

If your Immich library has grown past what you can manage by hand, immich-photo-manager gives any AI assistant direct access to your instance — search, organize, deduplicate, and curate albums through natural conversation. Works with Claude, Gemma, or any MCP-compatible client. Runs locally and talks only to your Immich; your originals stay on your server (see what leaves your network).

Tested, not assumed. Every push runs 54 unit tests on CI. Every release is also run live against real Immich 2.7.5 and 3.1.0 (Docker, all 55 tools over the MCP protocol, state re-read after each write) before it is tagged. The kit is in tests/live/, reproducible by anyone. The demos in doc/demos/ are transcripts of real sessions, Demo 11 is this exact flow prompt by prompt. Details: How it's tested.

immich-photo-manager demo


What It Does

Say "create albums for all my trips" and watch it work:

Geographic album creation

GPS coordinates, CLIP visual search, and temporal matching — combined in one request to create dozens of curated albums. No scripts, no manual sorting.


Quick Start

Prerequisites

Install (Claude Code plugin)

git clone https://github.com/drolosoft/immich-photo-manager.git
cd immich-photo-manager
pip3 install -r src/requirements.txt      # the plugin runs on your system python3

claude plugin marketplace add ./
claude plugin install immich-photo-manager

Open Claude Code (restart it if it was already open) and connect it to your Immich. Guided:

/setup-immich-photo-manager

It asks for your server URL and API key, checks them against the server, saves them, and shows your library numbers:

/setup-immich-photo-manager: connected, Immich version and library size

Or skip the guide and say it in one line (same thing underneath):

Update my Immich credentials to http://immich.local:2283 with API key <your API key>

Either way the credentials are saved for every session from then on; repeat to change server or key. Confirm any time with:

What Immich version am I connected to?

That's the whole install. Claude Desktop, Cowork or another MCP client instead of Claude Code? That is the plain MCP server without the skills: see Getting Started, route B.

Update the plugin

One line, no reinstall:

cd immich-photo-manager && git pull      # the clone you installed from
claude plugin marketplace update drolosoft-marketplace
claude plugin update immich-photo-manager@drolosoft-marketplace

Then restart Claude Code. drolosoft-marketplace is the name the marketplace gets when you add it from the clone (claude plugin marketplace list shows it). Your saved credentials carry over.

What leaves your network

The plugin process runs on your machine and only talks to your Immich. But everything the assistant reads through it goes to the model you use: filenames, dates, EXIF, album lists, and, when you ask it to look at pictures, thumbnails (250px by default, 1440px previews on request). Originals are never fetched. With Claude that means those thumbnails leave your network; with a local model over MCP (LM Studio, Ollama) nothing does. Nothing is sent unless you ask for it: listing albums or fixing dates moves text only, "tell me what's in these photos" moves images.

Connect, check, switch — all by talking

You never edit config files after setup. The connection is managed in conversation:

You say What happens
"What Immich version am I connected to?" Reports the server version and the URL it's talking to
"Update my Immich credentials to https://photos.example.com with API key " Validates the key against that server, hot-swaps the live connection, persists it — no restart
"Show my Immich connection" URL + masked API key

One connection at a time: to work with a second Immich (a test instance, a friend's server), say the update sentence again; say it once more to go back. Wrong URL or key? It tells you, and keeps the previous connection.

Try the full walkthrough: Demo 11 — Album Walkthrough — read an album item by item, find who repeats, create a sub-album, tag and describe every photo.

Works in Claude Code

The same plugin runs in Claude Code — search your library, curate albums, and generate galleries right from the terminal.

Split screen: Claude Code terminal generating a photo gallery on the left, browser showing the resulting gallery with album cards on the right

Full conversation transcript: Claude Code demo

Works with Any MCP Client

immich-photo-manager is an MCP server — it works with any AI assistant that speaks the Model Context Protocol, not just Claude.

Use the package entry point directly with uvx:

{
  "mcpServers": {
    "immich": {
      "command": "uvx",
      "args": ["immich-photo-manager"],
      "env": {
        "IMMICH_BASE_URL": "https://your-immich-server.com",
        "IMMICH_API_KEY": "your-api-key"
      }
    }
  }
}

immich-photo-manager defaults to MCP stdio transport. Set MCP_TRANSPORT=http when you want to run the server as a Streamable HTTP service.

Claude Desktop on macOS: the app does not see your shell's PATH, so write the full path to uvx in "command" (run which uvx in a terminal; typically /Users/<you>/.local/bin/uvx or /opt/homebrew/bin/uvx). Run uvx immich-photo-manager --help once in a terminal so the first download is done, then quit Claude Desktop with Cmd+Q and reopen it. If it still does not show up, the reason is in ~/Library/Logs/Claude/mcp-server-immich.log.

============================================================
IMMICH-PHOTO-MANAGER × GEMMA 4 (LM STUDIO)
============================================================

Immich: https://your-immich-server.com
Model:  gemma4-26b-it (local, LM Studio)
Query:  "Show me my Lanzarote albums"

1. Getting MCP tool schemas...
   55 MCP tools available

2. Asking Gemma 4...
   Gemma 4 chose: list_albums({})

3. Executing 'list_albums' against Immich...
   Found 124 total albums, 14 Lanzarote albums:
     - Lanzarote Amarillo (26 photos)
     - Lanzarote Rojo (201 photos)
     - Lanzarote Azul (187 photos)
     - Lanzarote Marrón (208 photos)
     - Lanzarote Negro (193 photos)
     - Lanzarote Verde (201 photos)
     - Lanzarote Gasolina (174 photos)
     ...

4. Gemma 4 interpreting results...
   "I found 14 Lanzarote albums — 7 color-themed with
    1,190 photos and 7 location-specific albums."

RESULT: Zero cloud dependency — fully self-hosted stack.
Client Status
Claude Code Tested
Claude Desktop Tested
LM Studio (Gemma 4) Tested
Cursor, Windsurf, VS Code, Cline, Zed Compatible (MCP stdio)

Full transcript: Gemma 4 demo · Test script: test-lmstudio-mcp.py


Highlights

  • AI-powered search — natural language photo search via CLIP ("sunset at the beach", "birthday cake")
  • Geographic albums — create albums organized by place, combining GPS + CLIP + temporal matching
  • Metadata repair — fix noon/midnight timestamps, infer missing GPS from neighboring photos, correct timezone offsets
  • Library cleanup — detect screenshots, duplicates, and low-quality images with multi-signal analysis
  • Duplicate detection — cross-source analysis using perceptual hashing (finds re-encoded copies across Apple Photos, Google Photos, and other imports)
  • Bulk rotation — rotate entire albums or selections at once (90°/180°/270°); non-destructive, accumulates across calls, one-click revert
  • Video frames — cut evenly spaced frames out of any clip so Claude can describe what happens in it; Immich itself keeps one poster per video (needs PyAV via pip install immich-photo-manager[video] or ffmpeg)
  • People & face management — list, search, merge, and organize recognized people; reassign misidentified faces; view face thumbnails
  • Trash & asset lifecycle — safely delete assets to trash, permanently remove, restore from trash; complete asset lifecycle management
  • Library health — one command for asset inventory, metadata quality, storage breakdown, and recommendations
  • Tags & organization — create, apply, and manage tags across your library; bulk tag and untag assets
  • Interactive galleries — self-contained HTML pages with embedded thumbnails, 3 themes, 4 view modes, and a Cowork Actions Panel for batch operations

Interactive gallery with Cowork Actions

Select photos in the gallery, click an action, and paste the command into Claude. See Skills Reference for all 12 skills.


Why immich-photo-manager?

Immich is excellent at storing and viewing your photos. But managing a large library — deduplication, metadata repair, album curation, storage analysis — still requires manual effort or custom scripts.

Manual / scripts immich-photo-manager
🔍 Write API calls, parse JSON Natural language — "find my sunset photos from Italy"
🗺️ Export GPS, cluster manually Geographic albums — automatic GPS + CLIP + temporal matching
🧹 Hash files, diff checksums Perceptual hashing — finds re-encoded duplicates across import sources
🔧 Edit EXIF one file at a time Metadata repair — batch-fix timestamps, infer GPS, correct timezones
📊 Query database, build reports Library health — one command for metadata quality, storage, recommendations
🔄 Rotate one photo at a time Bulk rotation — rotate entire albums at once, non-destructive
🏷️ No tag management in UI Tags — create, bulk apply/remove across assets
🛡️ Manual review of every action Safety first — shows findings, asks before acting

How it's tested

  • Unit suite, every push: 44 pytest cases on Python 3.10 and 3.13 (HTTP mocked), plus ruff. Releases are tagged only when this gate is green.
  • Live, every tool, two Immich versions: tests/live/ starts real Immich 2.7.5 and 3.1.0 in Docker, fills them with a small library, and drives all 55 tools over the MCP protocol, re-reading state after each write. Run before every release; last full run 2026-08-26, 72/72 checks on both.
  • In use: PyPI downloads, merged PRs from four outside contributors, and the demos in doc/demos/ are transcripts of real sessions.

Built with Claude

This is a Claude plugin, and Claude is a collaborator on the code: the design, the API compatibility decisions, and what to test are the author's; a good part of the implementation and the test harness were written with Claude Code. Every change ships through the same gate either way: tests on CI, and for anything touching Immich's API, the live run above.

Documentation

Document Description
Getting Started Installation, manual MCP setup, deployment options, and troubleshooting
Environment Setup Detailed setup: git, Python, venv, HTTP/stdio launch, Open WebUI, and common issues
Skills Reference All 12 skills — workflows, triggers, parameters, output formats
MCP Tools Reference All 55 MCP tools — parameters, return types, examples
Architecture How base64-embedded thumbnails solve the Cowork sandbox restriction
CORS Setup Guide Optional — enable direct URL thumbnail loading for browser-viewed galleries

🦙 Glama Score

immich-photo-manager on Glama


Contributing

Contributions are welcome — bug fixes, new skills, feature ideas. Open an issue or submit a PR.

If immich-photo-manager helps manage your library, consider giving it a star on GitHub — it helps others discover the project.


Support

If immich-photo-manager saved you time or made your photo library easier to manage, consider buying me a coffee — it keeps the next one coming!

Buy Me A Coffee


License

MIT License — free to use, modify, and distribute.

Forged by Drolosoft · Tools we wish existed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

immich_photo_manager-1.6.0.tar.gz (33.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

immich_photo_manager-1.6.0-py3-none-any.whl (34.8 kB view details)

Uploaded Python 3

File details

Details for the file immich_photo_manager-1.6.0.tar.gz.

File metadata

  • Download URL: immich_photo_manager-1.6.0.tar.gz
  • Upload date:
  • Size: 33.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for immich_photo_manager-1.6.0.tar.gz
Algorithm Hash digest
SHA256 b72cf1c85f90671765fe11d223c281147881b583d63fd8f70ba4330672415b67
MD5 5287e0c2147b025dbe4b74be61622128
BLAKE2b-256 916950be18ab8044bdf5139119a56739c999f77f7793b1b9dc76a993ec9b6210

See more details on using hashes here.

Provenance

The following attestation bundles were made for immich_photo_manager-1.6.0.tar.gz:

Publisher: release.yml on drolosoft/immich-photo-manager

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file immich_photo_manager-1.6.0-py3-none-any.whl.

File metadata

File hashes

Hashes for immich_photo_manager-1.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e71f1f260089b61f124fa25c03915fd0ca77945aea75b063ee025722e3e068e8
MD5 461be25c98319faf755e44060418f77f
BLAKE2b-256 d0dcac1654e094d2f88d8bd411dca45cb4a3154fab697ae4b4625f68b6567f28

See more details on using hashes here.

Provenance

The following attestation bundles were made for immich_photo_manager-1.6.0-py3-none-any.whl:

Publisher: release.yml on drolosoft/immich-photo-manager

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

1.6.0 This release

2 files

1.5.3

2 files

1.5.2

2 files

1.5.1

2 files

1.5.0

2 files

1.4.0

2 files

1.3.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page