Immich Photo ManagerBLOCK
MCP server and Claude Code plugin for self-hosted Immich: CLIP and OCR search, geographic albums, duplicates, people and faces, metadata repair, PDF photobooks. 94 tools, tested live on Immich 2.x and 3.x.
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
immich-photo-manager
MCP server for intelligent photo management with [Immich](https://immich.app): your self-hosted library, understood.
An unofficial community plugin by Drolosoft. It is not affiliated with, sponsored by or endorsed by Immich or FUTO; "Immich" is their name and is used here only to say which server the plugin works with. It talks to your Immich server through its public API.
If your [Immic
3ce653a10a01OBSERVED · 2026-10-08Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.
claude mcp add immich-photo-manager --env IMMICH_API_KEY=${IMMICH_API_KEY} --env IMMICH_API_KEY=${IMMICH_API_KEY} -- uvx immich-photo-manager==2.0.13claude mcp add immich-photo-manager:2.0.13 --env IMMICH_API_KEY=${IMMICH_API_KEY} --env IMMICH_API_KEY=${IMMICH_API_KEY} -- docker run -i --rm ghcr.io/drolosoft/immich-photo-manager:2.0.13:NoneExposed tools (94)
59 read · 22 write · 13 destructive. Blast radius: 13 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.
| Tool | Risk | Description |
|---|---|---|
add_assets_to_album | write | Add existing assets to an album. Use this to curate albums from search results |
clear_asset_notes | destructive | Forget the plugin |
create_activity | write | Post a comment (or a like) on a shared album or on one asset in it. |
create_album | write | Create a new album, optionally pre-populated with assets. Use this to organize |
create_memory | write | Create an |
create_partner | write | Share this account |
create_shared_link | write | Create a public shared link for an album, making it accessible via URL without |
create_stack | write | Group near-identical assets (a burst, retries of the same shot) into one |
create_tag | write | Create a new tag for categorizing assets. Use list_tags first to avoid duplicates. |
delete_activity | destructive | Remove one comment or like. Side effect: deletes it for everyone. |
delete_album | destructive | Delete an album container. The photos inside are NOT deleted — they remain in |
delete_assets | destructive | Delete assets (soft-delete to trash or permanent). Use this to remove unwanted |
delete_memory | destructive | Delete a memory. The photos stay in the library — only the memory entry |
delete_shared_link | destructive | Delete (revoke) a shared link, making the public URL immediately inaccessible. |
delete_stack | destructive | Dissolve a stack. The assets are NOT deleted — they simply show as |
delete_tag | destructive | Delete a tag and remove it from all assets. The assets themselves are unaffected. |
download_archive | read | Download an album or a selection as one zip of the original files, written |
empty_trash | destructive | Permanently delete ALL assets currently in trash. DESTRUCTIVE and IRREVERSIBLE. |
export_pdf | read | Build a PDF (cover, index, places, one section per asset) from an album or a |
get_album | read | Get full details for a specific album including all its asset IDs. Use this to |
get_album_images | read | Get an album |
get_album_thumbnails | read | Get base64-encoded thumbnails for photos in an album. Use this to generate visual |
get_asset_faces | read | Get all detected faces in a photo with their person assignments. Use this to see |
get_asset_image | read | Get a single asset |
get_asset_info | read | Get full metadata for a single asset. Use this when you need EXIF details, |
get_asset_notes | read | The plugin |
get_asset_thumbnail | read | Get a base64-encoded thumbnail image for a single asset. Use this to visually |
get_assets_notes | read | Which of these assets already carry notes, and their last verdict — the |
get_calendar_heatmap | read | How many photos per day, over a date range — the data behind a calendar |
get_capabilities | read | What this Immich server can do: version, feature flags and known quirks. |
get_connection_info | read | Return the Immich base URL and a masked API key. Use this to populate gallery |
get_download_info | read | How big the zip of an album or selection would be, BEFORE building it. |
get_duplicates | read | Get ML-detected duplicate asset groups (same image stored more than once). Use this |
get_export_preview | read | List what export_pdf would include (id, type, filename, date, place, people, |
get_images_batch | read | Get thumbnails for arbitrary asset IDs as image blocks for inline visual |
get_map_markers | read | Get GPS map markers for all geotagged assets. Use this to discover where photos |
get_person | read | Get full details for a specific person including name, birth date, and photo count. |
get_person_thumbnail | read | Get a base64-encoded face crop thumbnail for a person. Use this to visually |
get_server_version | read | Get the Immich server version. Use this to check compatibility or report |
get_shared_link | read | Get full details of a shared link including permissions, expiry, and linked assets. |
get_stack | read | One stack with its assets. Use this after list_stacks to see everything a |
get_statistics | read | Get library statistics. Use this for a quick overview of library size |
get_tag | read | Get details for a specific tag. Use this to inspect a tag |
get_thumbnails_batch | read | Get base64-encoded thumbnails for arbitrary asset IDs without needing an album. |
get_timeline_bucket | read | The assets of one month bucket from get_timeline_buckets. Use the two tools |
get_timeline_buckets | read | Month-by-month map of the library: one bucket per month with its asset count. |
get_video_frames | read | Get frames of a video as image blocks, to |
get_video_frames_json | read | Frames of a video as base64 JPEG with timestamps, for HTML galleries and |
list_activities | read | Comments and likes on a shared album, newest context included. Use this to |
list_albums | read | List all albums in the library with summary info. Use this to discover existing |
list_assets | read | List assets with simple filters (no search query needed). Use this to browse |
list_memories | read | List memories — Immich |
list_partners | read | Who shares their library with this account, and who this account shares |
list_people | read | List all recognized people (face clusters) in the library. Use this to browse |
list_shared_links | read | List all shared links (public gallery URLs). Use this to see what |
list_stacks | read | List every stack in the library. Use this to see what is already grouped |
list_tags | read | List all tags in the library. Use this to discover existing tags before creating |
list_users | read | The users visible on this Immich server. Use this to find the id that |
merge_people | write | Merge multiple person clusters into one. Use this when the same real person has |
ping | read | Check Immich server connectivity. Use this to verify the server is reachable |
reassign_face | read | Reassign a detected face to a different person. Use this to correct face recognition |
record_action | read | Remember something the plugin did to assets and why, for audit or undo: |
remove_assets_from_album | destructive | Remove assets from an album without deleting them. The photos remain in the |
remove_partner | destructive | Stop sharing this account |
resolve_duplicates | read | Resolve duplicate groups by choosing which assets to keep and which to trash. |
restore_assets | read | Restore specific assets from trash back to the active library. Use this to |
restore_trash | read | Restore ALL trashed assets back to the library. Use this to undo an accidental |
reverse_geocode | read | Resolve GPS coordinates to a place name using Immich |
revert_asset_edits | destructive | Remove all non-destructive edits (rotation, crop, mirror) from assets, restoring |
review_assets | read | Remember a review verdict on assets, with the reason, so a later session |
rotate_assets | write | Apply a non-destructive clockwise rotation to one or more assets. Use this to |
search_cities | read | Every city that appears in the library, one representative asset each. |
search_explore | read | Overview of what the library contains, grouped by explore field: one |
search_large_assets | read | The biggest files in the library, largest first. Use this to find what is |
search_metadata | read | Search assets by EXIF metadata fields. Use this when you know specific criteria |
search_people | read | Search for people by name (partial match). Use this when you know the person |
search_places | read | Look a place name up in Immich |
search_random | read | Random assets from the library, optionally filtered. Use this for sampling — |
search_smart | read | AI-powered visual search using CLIP embeddings. Use this when describing what a |
search_statistics | read | Count how many assets match a filter WITHOUT fetching them. Use this instead |
search_suggestions | read | Distinct values present in the library for one field — the exact spellings |
tag_assets | write | Apply a tag to multiple assets at once. Use this to bulk-categorize photos |
untag_assets | destructive | Remove a tag from multiple assets. The tag itself remains; only the association is |
update_album | write | Update an album |
update_asset_metadata | write | Update metadata fields on a specific asset. Use this to fix dates, correct GPS, |
update_assets_metadata | write | Update the same metadata fields on many assets in ONE call — the whole |
update_credentials | write | Update the Immich connection credentials. Use this when the API key has been |
update_memory | write | Update a memory: save it for later, move its date, or mark it seen. |
update_partner | write | Show or hide a partner |
update_person | write | Update a person |
update_shared_link | write | Update a shared link |
update_stack | write | Change which asset fronts a stack (the one the library shows). Side effect: |
update_tag | write | Update a tag |
upload_asset | write | Upload a local photo or video file to Immich. Use this to ingest new media into |
Trust audit
BLOCKgrade D · trust 69/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | WARN |
| L2 | Instruction surface (what it tells the agent) | FAIL |
| L3 | Class-specific surface | WARN |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (2 observation(s))
- Network
- declared (6 observation(s))
- Shell
- none-observed
- Dependencies
- not all pinned
- Secrets in source
- found
Findings (25)
Do not tell the user to open the file directly. OpenStreetMap answers a page opened from disk
python -c "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8626/health', timeout=4)"> 1. Your Immich server URL (e.g., `http://192.168.1.100:2283`)
> 1. Your Immich server URL (e.g., `http://192.168.1.100:2283`)
> 1. Your Immich server URL (e.g., `http://192.168.1.100:2283`)
API_KEY = "fake-immich-key-0123456789abcdef"
clear_asset_notes, delete_activity, delete_album, delete_assets, delete_memory, delete_shared_link, delete_stack, delete_tag, empty_trash, remove_assets_from_album, remove_partner, revert_asset_edits,
.mcp.http.json.example
.mcp.json.example
.plugin-scanner.toml
if curl -fsS http://127.0.0.1:8626/health; then echo; exit 0; fi
@font-face{font-family:'Caveat';font-style:normal;font-weight:400 700;font-display:swap;src:url(data:font/woff2;base64,d09GMgABAAAAASNMABIAAAACdVAAASLbAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoFRG4GGchyXOD9IV.hero-bg{position:absolute;inset:0;background-image:url('data:image/webp;base64,UklGRrg6AABXRUJQVlA4WAoAAAAgAAAATAEA+QAASUNDUOABAAAAAAHgbGNtcwQgAABtbnRyUkdCIFhZWiAH4gADABQACQAOAB1hY3NwTVNGVAAAAABzYXdz<img class="header-icon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAACXBIWXMAAAsTAAALEwEAmpwYAAAk+UlEQVR4nO2dd7gcZ33vP++Undl+uk6Rjnq1ZMkW9tgU2xtSTIdLKsEBY0pYUjEOJRdIcglc
<img class="footer-icon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAACXBIWXMAAAsTAAALEwEAmpwYAAAk+UlEQVR4nO2dd7gcZ33vP++Undl+uk6Rjnq1ZMkW9tgU2xtSTIdLKsEBY0pYUjEOJRdIcglc
decodable = all(len(base64.b64decode(t["data"])) > 50 for t in thumbs)
report("get_asset_image (image block)", img is not None and len(base64.b64decode(img.data)) > 50,raw = base64.b64decode(data) if data else b""
entry.images = [base64.b64decode(frame["data"]) for frame in result["frames"]]
return base64.b64decode(thumb["data"])
b64decode( ... subprocess.
b64decode( ... subprocess.
mcp, httpx, uvicorn, av, fpdf2
- **The README lists everything the plugin runs, sends and fetches**: the local server process, the calls to your Immich, the map tiles of a PDF report, what the generated pages load in the browser (G
A PDF report follows the same rule: `export_pdf` writes the file to disk on the machine running the server, and it is not sent anywhere unless you pass `return_base64=true`. The file goes where `outpu
Gates applied: instruction_override, no_behavioural_pass.
3ce653a10a01full audit observations/trust-audit/mcp-server/drolosoft__immich-photo-manager.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-08 | 3ce653a10a01 | BLOCK | D | 69 | first audit |
Questions
What is the Immich Photo Manager MCP server?
MCP server and Claude Code plugin for self-hosted Immich: CLIP and OCR search, geographic albums, duplicates, people and faces, metadata repair, PDF photobooks. 94 tools, tested live on Immich 2.x and 3.x.
What tools does Immich Photo Manager expose?
94 in total: 59 read-only, 22 that write, and 13 that can delete or overwrite (clear_asset_notes, delete_activity, delete_album, delete_assets, delete_memory). Every one is listed on this page with its risk.
Is Immich Photo Manager safe to connect to an agent?
No — not without reading the findings first. The audit graded it D (69/100) and found 1 critical or high issue in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 13 of its tools can destroy data, so scope the token you give it to what you actually need.
What credentials does Immich Photo Manager need?
It reads IMMICH_API_KEY and IMMICH_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.
How does Immich Photo Manager run?
It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as immich-mcp-crosscheck-ts-client at 2.0.13.
How current is this page?
The grade is for one exact copy of the source (3ce653a10a01), read on 2026-10-08. The repository is watched and re-audited when it changes.