Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Immich Photo Manager

PYPI · IMMICH-PHOTO-MANAGER · 2 COMPONENTS

Photo management for self-hosted Immich: search, albums, duplicates, faces, PDF reports. 94 tools.

+15 this week 91 Trust /100

Last scanned (22 hours ago)

Scores higher than 94% of PyPI servers

Category Design and Media

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security100
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • Runs hatchling.build at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
  • 1 of 35 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency100
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to drolosoft/immich-photo-manager). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 29 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability72
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 14205 tokens (~151/item across 94 items; 94 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage71
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 0% of tool parameters carry a description.Fail
  • Structured output schemas are declared (96% of tools); any adoption earns full credit.Pass
Tool Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 0 of 12 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "revert_asset_edits" implies "remove" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
  • An AI judge read all 95 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 1 Nov 26 0
    • Stability: 0.97 → pass security
  • 31 Oct 26 0
    • Stability: pass → 0.97 functional
  • 30 Oct 26 +15
    • Malware scan: unverified → pass ▲ security
  • 25 Oct 26 0
    • Stability: 0.97 → pass security
  • 24 Oct 26 0
    • Stability: pass → 0.97 functional
  • 18 Oct 26 0
    • Stability: 0.97 → pass security
  • 17 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.

  • 15 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 4 Nov 2026 · Analysed pypi/immich-photo-manager@2.0.11

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem pypi
Reason Verified
Discovered via Registry attestation endpoint
Source repo drolosoft/immich-photo-manager
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/drolosoft/immich-photo-manager/.github/workflows/release.yml@refs/tags/v2.0.11
Rekor log index 2704450450
Predicate type PyPI publish attestation https://docs.pypi.org/attestations/publish/v1
Subject digest sha256:e1807a5d5b607b1d7cae7d9632f460bdcb9c3251fefc826b38c7c35e99e6aa11

Background: How many MCP packages publish verified provenance →

Install scripts 1 script
Hook Tier Command
build_backend allowlisted hatchling.build

Background: Why install scripts are a supply-chain risk →

Dependencies 35 packages
Packages resolved 35
No linked repository 1
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 94 exposed · ~14,186 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
list_assets ~246

List assets with simple filters (no search query needed). Use this to browse the library by status (favorites, archived, trashed) or type. For finding specific content, use search_metadata (structured) or search_smart (visual AI). Read-only. Args: is_favorite: true = only favorites, false = only non-favorites, omit = all. is_archived: true = only archived, false = only non-archived, omit = all. is_trashed: true = only trashed items; false/omit = active library (Immich never mixes both). asset_type: 'IMAGE' or 'VIDEO'. Omit for both. page: Page number, starting from 1 (default 1). size: Results per page (1-200, default 50). Returns: JSON with total count, current page, and assets array with IDs, filenames, dates, and types.

NameTypeReqDescription
asset_typestring––
is_archived–––
is_favorite–––
is_trashed–––
pageinteger––
sizeinteger––
NameTypeReqDescription
resultstringyes–

No examples provided.

list_memories ~199

List memories — Immich's "on this day" collections of photos from past years. Use this to build a 'tal día como hoy' story, album or PDF: each memory carries the year it looks back to and the assets Immich picked for it. Read-only. Args: for_date: ISO date — return the memories Immich shows on that day (e.g. today for the classic on-this-day feed). Omit for all memories. is_saved: If true, only memories the user saved; if false, only unsaved. size: Maximum memories to return (default 50). Returns: JSON with total and a memories array; each has id, type, memory_at, the year it remembers, is_saved, asset_count and a trimmed assets list (id, filename, date).

NameTypeReqDescription
for_datestring––
is_saved–––
sizeinteger––
NameTypeReqDescription
resultstringyes–

No examples provided.

list_partners ~73

Who shares their library with this account, and who this account shares with. Partner sharing is Immich's family feature: each side keeps its own library but can see the other's. Read-only. Returns: JSON with shared_with_me and shared_by_me arrays (id, name, email, in_timeline).

Input schema present but exposes no named parameters.

NameTypeReqDescription
resultstringyes–

No examples provided.

list_people ~138

List all recognized people (face clusters) in the library. Use this to browse who appears in the photo library or find a person's ID. For searching by name, use search_people instead. Read-only. Args: page: Page number, starting from 1 (default 1). size: Results per page (default 50). with_hidden: Include people marked as hidden (default false). Returns: JSON with total count, page, and people array (each with id, name, thumbnailPath, photoCount).

NameTypeReqDescription
pageinteger––
sizeinteger––
with_hiddenboolean––
NameTypeReqDescription
resultstringyes–

No examples provided.

list_shared_links ~64

List all shared links (public gallery URLs). Use this to see what's currently shared publicly or to find a link ID for updates/deletion. Read-only. Returns: JSON with total count and links array (each with id, key, type, description, album info).

Input schema present but exposes no named parameters.

NameTypeReqDescription
resultstringyes–

No examples provided.

list_stacks ~83

List every stack in the library. Use this to see what is already grouped before creating new stacks or to find a stack's id. Read-only. Args: primary_asset_id: Only the stack fronted by this asset. Returns: JSON with total and a stacks array (id, primary_asset_id, assets).

NameTypeReqDescription
primary_asset_idstring––
NameTypeReqDescription
resultstringyes–

No examples provided.

list_tags ~57

List all tags in the library. Use this to discover existing tags before creating new ones or to find a tag ID for tagging operations. Read-only. Returns: JSON with total count and tags array (each with id, name, color).

Input schema present but exposes no named parameters.

NameTypeReqDescription
resultstringyes–

No examples provided.

list_users ~59

The users visible on this Immich server. Use this to find the id that create_partner needs, or to see who could be shared with. Read-only. Returns: JSON with total and a users array of {id, name, email}.

Input schema present but exposes no named parameters.

NameTypeReqDescription
resultstringyes–

No examples provided.

merge_people ~214

Merge multiple person clusters into one. Use this when the same real person has been split into multiple face clusters. DESTRUCTIVE and IRREVERSIBLE: merged persons are permanently deleted and all their faces transfer to the target. Without confirm=true nothing happens: the call returns who would be kept and who would disappear, so the user can check the names before the merge. Side effect: with confirm=true, permanently deletes the merged persons; without it the call only previews and changes nothing. Args: person_id: The target person UUID to keep (receives all merged faces). merge_ids: List of person UUIDs to absorb into the target. These persons are permanently deleted. confirm: Pass true only after the user has seen the preview and agreed. Returns: JSON with the preview (confirm_required, keep, merge, failed) or the merge result.

NameTypeReqDescription
confirmboolean––
merge_idsarrayyes–
person_idstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

ping ~44

Check Immich server connectivity. Use this to verify the server is reachable before running other operations. Read-only. Returns: JSON with 'server' status ('pong' if healthy).

Input schema present but exposes no named parameters.

NameTypeReqDescription
resultstringyes–

No examples provided.

reassign_face ~120

Reassign a detected face to a different person. Use this to correct face recognition mistakes (e.g. a face wrongly attributed to Person A should be Person B). Get face_id from get_asset_faces first. Side effect: permanently changes face-to-person mapping. Args: face_id: The face detection UUID (from get_asset_faces results). person_id: The correct person UUID to assign this face to. Returns: JSON with the updated face assignment.

NameTypeReqDescription
face_idstringyes–
person_idstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

record_action ~193

Remember something the plugin did to assets and why, for audit or undo: which album they went into and from what prompt, what date they had before a fix, why they were rotated. Side effect: writes the plugin's metadata key on each asset; other apps' keys are untouched. Args: asset_ids: The assets the action touched. action: Short verb-like label (e.g. 'added_to_album', 'date_fixed', 'rotated'). detail: Free text with the context worth keeping (album name, previous value, the user's request). Returns: JSON with success, the number of assets recorded, the action, and a failed array of {asset_id, error} for any asset that could not be written. Success is true only when nothing failed.

NameTypeReqDescription
actionstringyes–
asset_idsarrayyes–
detailstring––
NameTypeReqDescription
resultstringyes–

No examples provided.

remove_assets_from_album ~108

Remove assets from an album without deleting them. The photos remain in the library and other albums. Use this to un-curate mistakenly added assets. Side effect: modifies album membership. Args: album_id: Album UUID to remove assets from. asset_ids: List of asset UUIDs to remove from this album. Returns: JSON with album_id, count removed, and per-asset result details.

NameTypeReqDescription
album_idstringyes–
asset_idsarrayyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

remove_partner ~63

Stop sharing this account's library with a user. Their own photos are not touched. Side effect: revokes their access. Args: user_id: The user to unshare with. Returns: JSON confirming the removal.

NameTypeReqDescription
user_idstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

resolve_duplicates ~106

Resolve duplicate groups by choosing which assets to keep and which to trash. Use this after reviewing results from get_duplicates. Trashed assets can still be recovered via restore_assets. Side effect: moves rejected duplicates to trash. Args: groups: List of dicts, each with: duplicateId (from get_duplicates), assetIds (UUIDs to KEEP), trashIds (UUIDs to TRASH). Returns: JSON with count of resolved groups.

NameTypeReqDescription
groupsarrayyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

restore_assets ~86

Restore specific assets from trash back to the active library. Use this to selectively recover accidentally deleted photos. For restoring everything at once, use restore_trash instead. Side effect: moves specified assets out of trash. Args: asset_ids: List of asset UUIDs currently in trash to restore. Returns: JSON with count of restored assets.

NameTypeReqDescription
asset_idsarrayyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

restore_trash ~61

Restore ALL trashed assets back to the library. Use this to undo an accidental bulk deletion. For restoring specific assets only, use restore_assets instead. Side effect: moves all trashed assets back to the active library. Returns: JSON with success confirmation.

Input schema present but exposes no named parameters.

NameTypeReqDescription
resultstringyes–

No examples provided.

reverse_geocode ~109

Resolve GPS coordinates to a place name using Immich's own offline geodata. Use this to name the location of a marker from get_map_markers or of an asset's EXIF coordinates — no external service is contacted. Read-only. Args: lat: Latitude in decimal degrees. lon: Longitude in decimal degrees. Returns: JSON with total and a places array of {city, state, country} candidates.

NameTypeReqDescription
latnumberyes–
lonnumberyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

revert_asset_edits ~126

Remove all non-destructive edits (rotation, crop, mirror) from assets, restoring original appearance. Use this to undo rotate_assets or any other display transforms. Provide EITHER asset_ids OR album_id. Side effect: deletes all edit records for the assets. Args: asset_ids: List of asset UUIDs to revert. Mutually exclusive with album_id. album_id: Revert all assets in this album. Mutually exclusive with asset_ids. Returns: JSON with reverted/failed counts.

NameTypeReqDescription
album_idstring––
asset_ids–––
NameTypeReqDescription
resultstringyes–

No examples provided.

review_assets ~230

Remember a review verdict on assets, with the reason, so a later session does not redo the analysis and the why survives. Use this after deciding what to do with a photo in a cleanup or duplicate pass — together with a tag when the user must see the state in Immich (tags are visible there, notes are not). Side effect: writes the plugin's metadata key on each asset; other apps' keys are untouched. Args: asset_ids: The assets the verdict applies to. verdict: One of 'keep', 'delete_candidate', 'duplicate_of', 'needs_check'. reason: Free text explaining the verdict (e.g. 'near-identical to IMG_6367, keep that one'). Short and concrete beats long. Returns: JSON with success, the number of assets reviewed, the verdict, and a failed array of {asset_id, error} for any asset that could not be written. Success is true only when nothing failed.

NameTypeReqDescription
asset_idsarrayyes–
reasonstring––
verdictstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

rotate_assets ~179

Apply a non-destructive clockwise rotation to one or more assets. Use this to fix orientation issues. The original file is never modified — rotation is a display transform only. Use revert_asset_edits to undo. Provide EITHER asset_ids OR album_id. Side effect: writes rotation edits to Immich; accumulates with existing rotation. Args: angle: Clockwise degrees, must be a multiple of 90 (90, 180, or 270). Default: 90. asset_ids: List of asset UUIDs to rotate. Mutually exclusive with album_id. album_id: Rotate all assets in this album. Mutually exclusive with asset_ids. Returns: JSON with rotated/failed counts and the applied angle.

NameTypeReqDescription
album_idstring––
angleinteger––
asset_ids–––
NameTypeReqDescription
resultstringyes–

No examples provided.

search_cities ~75

Every city that appears in the library, one representative asset each. Unlike search_explore this has no minimum-asset threshold, so it is the reliable way to answer 'which places are in this library?'. Read-only. Returns: JSON with a cities array of {city, country, asset_id, date}.

Input schema present but exposes no named parameters.

NameTypeReqDescription
resultstringyes–

No examples provided.

search_explore ~145

Overview of what the library contains, grouped by explore field: one representative asset per city and per detected concept (Immich's Explore page). Use this to get oriented in an unknown library before searching for anything specific — it answers 'what is in here?' in one call. A city only appears once it holds at least 5 assets (Immich's own threshold), so small libraries can come back empty. Read-only. Returns: JSON with total (how many fields came back) and a fields array; each field has its name (e.g. 'exifInfo.city') and items pairing each value with one representative asset_id.

Input schema present but exposes no named parameters.

NameTypeReqDescription
resultstringyes–

No examples provided.

search_large_assets ~145

The biggest files in the library, largest first. Use this to find what is eating storage before a cleanup — videos and originals show up immediately. Read-only. Args: min_size_mb: Only assets at least this many megabytes (0 = no minimum). size: How many assets to return (1-200, default 20). asset_type: 'IMAGE' or 'VIDEO'. Omit for both. Returns: JSON with total and an assets array of {asset_id, filename, size_mb, date}, largest first.

NameTypeReqDescription
asset_typestring––
min_size_mbinteger––
sizeinteger––
NameTypeReqDescription
resultstringyes–

No examples provided.

search_metadata ~444

Search assets by EXIF metadata fields. Use this when you know specific criteria like city, camera model, or date range. For natural language visual queries (e.g. 'sunset at the beach'), use search_smart instead. For browsing without criteria, use list_assets. Read-only. Args: city: City name from EXIF GPS reverse-geocoding (case-sensitive, e.g. 'Barcelona'). state: State or region name. country: Country name (e.g. 'Spain', 'Egypt'). make: Camera manufacturer (e.g. 'Apple', 'Canon', 'Sony'). model: Camera model string (e.g. 'iPhone 14 Pro', 'EOS R5'). taken_after: ISO date — return only assets captured after this date. taken_before: ISO date — return only assets captured before this date. is_favorite: If true, only return favorites. asset_type: 'IMAGE' or 'VIDEO'. Omit for both. ocr: Text recognized inside the image (tickets, signs, documents). Needs OCR enabled on the server — check with get_capabilities. person_ids: Only assets showing ALL of these people (ids from list_people). tag_ids: Only assets carrying these tags (ids from list_tags). album_ids: Only assets inside these albums. page: Page number, starting from 1 (default 1). size: Results per page (1-200, default 50). Returns: JSON with total match count, current page, and assets array with IDs, filenames, and dates.

NameTypeReqDescription
album_ids–––
asset_typestring––
citystring––
countrystring––
is_favorite–––
makestring––
modelstring––
ocrstring––
pageinteger––
person_ids–––
sizeinteger––
statestring––
tag_ids–––
taken_afterstring––
taken_beforestring––
NameTypeReqDescription
resultstringyes–

No examples provided.

search_people ~100

Search for people by name (partial match). Use this when you know the person's name. For browsing all people, use list_people instead. Read-only. Args: name: Full or partial name to match (case-insensitive). with_hidden: Include hidden people in results (default false). Returns: JSON array of matching people with id, name, and photo count.

NameTypeReqDescription
namestringyes–
with_hiddenboolean––
NameTypeReqDescription
resultstringyes–

No examples provided.

search_places ~99

Look a place name up in Immich's built-in gazetteer (no assets involved). Use this to resolve a spelling or get coordinates for a place before a geographic search. Read-only. Args: name: Place name to look for (e.g. 'Lisbon'). Returns: JSON with a places array of {name, admin1name, admin2name, latitude, longitude}.

NameTypeReqDescription
namestringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

search_random ~195

Random assets from the library, optionally filtered. Use this for sampling — a quick feel of what a filter matches, a surprise pick for a story, or spot checks over a big library. Read-only. Args: size: How many random assets to return (default 10, max 100). city: Only assets from this city. country: Only assets from this country. make: Only assets from this camera make. model: Only assets from this camera model. is_favorite: If true, only favorites. ocr: Only assets whose recognized text matches (needs OCR on the server). Returns: JSON with the matching assets array.

NameTypeReqDescription
citystring––
countrystring––
is_favorite–––
makestring––
modelstring––
ocrstring––
sizeinteger––
NameTypeReqDescription
resultstringyes–

No examples provided.

search_smart ~351

AI-powered visual search using CLIP embeddings. Use this when describing what a photo looks like in natural language (e.g. 'sunset at the beach', 'dog playing fetch'). For structured criteria (city, camera, date), use search_metadata instead. Requires Immich ML service with Smart Search enabled. Read-only. Args: query: Natural language description of the visual content to find. city: Optional city filter to narrow results geographically. state: Optional state/region filter. country: Optional country filter. taken_after: ISO date — only assets captured after this date. taken_before: ISO date — only assets captured before this date. ocr: Text recognized inside the image, combined with the visual query. Needs OCR enabled on the server — check with get_capabilities. person_ids: Only assets showing ALL of these people (ids from list_people). tag_ids: Only assets carrying these tags (ids from list_tags). album_ids: Only assets inside these albums. page: Page number, starting from 1 (default 1). size: Results per page (1-200, default 50). Returns: JSON with total count, page, and assets ranked by visual similarity to the query.

NameTypeReqDescription
album_ids–––
citystring––
countrystring––
ocrstring––
pageinteger––
person_ids–––
querystringyes–
sizeinteger––
statestring––
tag_ids–––
taken_afterstring––
taken_beforestring––
NameTypeReqDescription
resultstringyes–

No examples provided.

search_statistics ~295

Count how many assets match a filter WITHOUT fetching them. Use this instead of search_metadata whenever only the number matters ('how many photos from Spain?', 'how many did I take in 2019?') — it costs one integer instead of pages of assets. Read-only. Args: city: Count assets from this city. country: Count assets from this country. state: Count assets from this state/region. make: Count assets from this camera make. model: Count assets from this camera model. is_favorite: If true, count only favorites. ocr: Count assets whose recognized text matches (needs OCR on the server). created_after: ISO date lower bound on upload date (when it reached Immich). created_before: ISO date upper bound on upload date. taken_after: ISO date lower bound on capture date (when the photo was taken). taken_before: ISO date upper bound on capture date. Returns: JSON {total}.

NameTypeReqDescription
citystring––
countrystring––
created_afterstring––
created_beforestring––
is_favorite–––
makestring––
modelstring––
ocrstring––
statestring––
taken_afterstring––
taken_beforestring––
NameTypeReqDescription
resultstringyes–

No examples provided.

search_suggestions ~188

Distinct values present in the library for one field — the exact spellings search_metadata expects. Use this before filtering by city or camera to avoid guessing (e.g. 'iPhone 14 Pro' vs 'iPhone14,3'). Read-only. Args: suggestion_type: One of 'country', 'state', 'city', 'camera-make', 'camera-model', 'camera-lens-model'. country: Narrow city/state suggestions to this country. state: Narrow city suggestions to this state. make: Narrow model suggestions to this camera make. model: Narrow lens suggestions to this camera model. Returns: JSON with total and a suggestions array of strings.

NameTypeReqDescription
countrystring––
makestring––
modelstring––
statestring––
suggestion_typestringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

tag_assets ~111

Apply a tag to multiple assets at once. Use this to bulk-categorize photos (e.g. tag all vacation photos). Side effect: adds tag association to assets. Args: tag_id: The tag UUID to apply (from list_tags or create_tag). asset_ids: List of asset UUIDs to tag. Must not be empty. Returns: JSON with tag_id, count tagged, and per-asset results.

NameTypeReqDescription
asset_idsarrayyes–
tag_idstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

untag_assets ~104

Remove a tag from multiple assets. The tag itself remains; only the association is removed. Side effect: removes tag-to-asset links. Args: tag_id: The tag UUID to remove from assets. asset_ids: List of asset UUIDs to untag. Must not be empty. Returns: JSON with tag_id, count untagged, and per-asset results.

NameTypeReqDescription
asset_idsarrayyes–
tag_idstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

update_album ~108

Update an album's name or description. Use this to rename or re-describe an existing album. Side effect: modifies album metadata in Immich. Args: album_id: The album's UUID. name: New album name. Leave empty to keep current name. description: New description. Leave empty to keep current description. Returns: JSON with the updated album object.

NameTypeReqDescription
album_idstringyes–
descriptionstring––
namestring––
NameTypeReqDescription
resultstringyes–

No examples provided.

update_asset_metadata ~253

Update metadata fields on a specific asset. Use this to fix dates, correct GPS, add descriptions, or change favorite/rating status. Only provided fields are modified. Side effect: permanently changes asset metadata in Immich. Args: asset_id: The asset's UUID. date_time_original: ISO 8601 datetime (e.g. '2019-07-14T15:23:41.000Z'). latitude: GPS latitude, decimal degrees (-90.0 to 90.0). longitude: GPS longitude, decimal degrees (-180.0 to 180.0). description: Free-text description/caption for the asset. is_favorite: Set favorite status (true/false). rating: -1 to reject the photo, or 1 to 5 stars. A rating cannot be cleared from here, and 0 is not a rating Immich 3.x accepts. Returns: JSON with the updated asset object.

NameTypeReqDescription
asset_idstringyes–
date_time_originalstring––
descriptionstring––
is_favorite–––
latitude–––
longitude–––
rating–––
NameTypeReqDescription
resultstringyes–

No examples provided.

update_assets_metadata ~243

Update the same metadata fields on many assets in ONE call — the whole roll of a scanned album gets its real date, a trip's photos get their GPS, a selection becomes favorites. Same fields as update_asset_metadata; only the provided ones change. Side effect: permanently changes the metadata of every listed asset. Args: asset_ids: The assets to update. date_time_original: ISO 8601 datetime applied to all of them. latitude: GPS latitude, decimal degrees. longitude: GPS longitude, decimal degrees. description: Description/caption applied to all of them. is_favorite: Set favorite status on all of them. rating: -1 to reject them, or 1 to 5 stars. A rating cannot be cleared from here, and 0 is not a rating Immich 3.x accepts. Returns: JSON with success and the number of assets updated.

NameTypeReqDescription
asset_idsarrayyes–
date_time_originalstring––
descriptionstring––
is_favorite–––
latitude–––
longitude–––
rating–––
NameTypeReqDescription
resultstringyes–

No examples provided.

update_credentials ~133

Update the Immich connection credentials. Use this when the API key has been rotated or the server URL changed. Validates credentials before applying. Side effect: persists new credentials to disk and hot-swaps the live connection. Args: base_url: Full Immich server URL including protocol (e.g. 'https://photos.example.com'). api_key: A valid Immich API key (generated in Immich > User Settings > API Keys). Returns: JSON with success status, photo/video counts confirming access, and persistence path.

NameTypeReqDescription
api_keystringyes–
base_urlstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

update_memory ~127

Update a memory: save it for later, move its date, or mark it seen. Side effect: modifies the memory on the server. Args: memory_id: The memory to update. is_saved: True to save the memory, false to unsave it. memory_at: New ISO date to show the memory on. seen_at: ISO timestamp marking when the user viewed it. Returns: JSON with the updated memory.

NameTypeReqDescription
is_saved–––
memory_atstring––
memory_idstringyes–
seen_atstring––
NameTypeReqDescription
resultstringyes–

No examples provided.

update_partner ~131

Show or hide a partner's photos inside the main timeline (they stay reachable either way). Only works on a partner who shares their library with this account (someone in shared_with_me), because the flag controls how THEIR photos appear in THIS timeline. Side effect: updates the setting on the server. Args: user_id: The partner whose setting changes. in_timeline: True to mix their photos into the timeline, false to keep them separate. Returns: JSON with the updated partner entry.

NameTypeReqDescription
in_timelinebooleanyes–
user_idstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

update_person ~216

Update a person's profile details. Use this to name unnamed faces, set birth dates, hide clutter faces, or change the representative thumbnail. Only provided fields are modified. Side effect: changes person metadata in Immich. Args: person_id: The person's UUID. name: Display name (e.g. 'John Smith'). Set to name unnamed face clusters. birth_date: ISO date (e.g. '1990-05-15'). is_hidden: Hide from the People view (useful for strangers/clutter). is_favorite: Mark as a favorite person. feature_face_asset_id: Asset UUID whose face crop becomes the person's thumbnail. color: Hex color label for UI grouping. Returns: JSON with the updated person object.

NameTypeReqDescription
birth_datestring––
colorstring––
feature_face_asset_idstring––
is_favorite–––
is_hidden–––
namestring––
person_idstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

update_shared_link ~168

Update a shared link's permissions or expiry. Use this to tighten/loosen access or set an expiration date. Side effect: changes public link behavior immediately. Args: link_id: The shared link's UUID. allow_download: Allow visitors to download original files. show_metadata: Show EXIF data to visitors. allow_upload: Allow visitors to upload photos to the shared album. description: Link description. Empty string clears it. expiry_at: ISO 8601 expiry datetime. Empty string removes expiry (link never expires). Returns: JSON with the updated shared link object.

NameTypeReqDescription
allow_download–––
allow_upload–––
description–––
expiry_at–––
link_idstringyes–
show_metadata–––
NameTypeReqDescription
resultstringyes–

No examples provided.

update_stack ~90

Change which asset fronts a stack (the one the library shows). Side effect: updates the stack on the server. Args: stack_id: The stack to update. primary_asset_id: The asset that should become the cover. It must already belong to the stack. Returns: JSON with the updated stack.

NameTypeReqDescription
primary_asset_idstringyes–
stack_idstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

update_tag ~141

Update a tag's color. Side effect: changes apply to all assets using this tag. Immich's API cannot rename a tag (TagUpdateDto only carries `color`); to rename, create_tag with the new name, tag_assets, then delete_tag the old one. Args: tag_id: The tag's UUID. name: Not supported by Immich — passing it returns an error explaining the workaround. color: New hex color (e.g. '#FF5733'). Omit to keep current. Returns: JSON with the updated tag object.

NameTypeReqDescription
color–––
name–––
tag_idstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

upload_asset ~163

Upload a local photo or video file to Immich. Use this to ingest new media into the library. Constraints: max 25MB, allowed types: jpg, jpeg, png, heic, mp4, mov, gif, webp. Symlinks are rejected for security. The original file is NOT modified or deleted. Side effect: creates a new asset in Immich. Args: file_path: Absolute path to the local file (e.g. '/tmp/photo.jpg'). Must exist. album_id: Optional album UUID to add the uploaded asset to immediately. Returns: JSON with new asset id, filename, size_mb, and album assignment status if applicable.

NameTypeReqDescription
album_idstring––
file_pathstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

Install

How do I install the Immich Photo Manager MCP server?

Immich Photo Manager runs locally as a PyPI package, launched with uvx immich-photo-manager. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

pypi · immich-photo-manager

# add to Claude Code
claude mcp add drolosoft-immich-photo-manager -- uvx immich-photo-manager
Common questions

What is the Immich Photo Manager MCP server?

Immich Photo Manager is an MCP server listed in the public MCP registry as io.github.drolosoft/immich-photo-manager. Photo management for self-hosted Immich: search, albums, duplicates, faces, PDF reports. 94 tools. This page covers its PyPI package (immich-photo-manager).

Is the Immich Photo Manager MCP server safe to use?

Immich Photo Manager scores 91 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 4 November 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Immich Photo Manager MCP server expose?

Immich Photo Manager exposes 94 tools: ping, get_server_version, get_capabilities, get_statistics, update_credentials, and 89 more. Their descriptions and schemas cost roughly 14,186 tokens of context every time the server is loaded.

Is the Immich Photo Manager MCP server still maintained?

Immich Photo Manager is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the Immich Photo Manager MCP server under?

Immich Photo Manager declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.