{"name":"io.github.drolosoft/immich-photo-manager","slug":"drolosoft-immich-photo-manager","title":"Immich Photo Manager","description":"Photo management for self-hosted Immich: search, albums, duplicates, faces, PDF reports. 94 tools.","url":"https://mcp.market/server/drolosoft-immich-photo-manager","rating":null,"grade":"B","score":82,"certified":false,"status":"active","category":"search","tags":["search","media"],"presence":{"score":46,"stars":50,"forks":10,"downloads_week":203,"last_push_at":"2026-09-03T22:23:20.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"mixed","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/drolosoft/immich-photo-manager","website":"https://github.com/drolosoft/immich-photo-manager","version":"2.0.11","remotes":[],"packages":[{"registryType":"pypi","registryBaseUrl":"https://pypi.org","identifier":"immich-photo-manager","version":"2.0.11","runtimeHint":"uvx","transport":{"type":"stdio"},"environmentVariables":[{"description":"URL of your Immich server, for example https://photos.example.com","isRequired":true,"name":"IMMICH_BASE_URL"},{"description":"Immich API key (Account Settings, API Keys). Both variables can also be set later from the client with the update_credentials tool.","isRequired":true,"isSecret":true,"name":"IMMICH_API_KEY"}]},{"registryType":"oci","identifier":"ghcr.io/drolosoft/immich-photo-manager:2.0.11","runtimeHint":"docker","transport":{"type":"streamable-http","url":"http://localhost:8626/mcp"},"runtimeArguments":[{"description":"Publish the MCP port; the server listens on 8626 inside the container","isRequired":true,"value":"8626:8626","type":"named","name":"-p"},{"description":"Directory on the host for the PDFs and zips the tools write, and for credentials set from the client","value":"{exports_dir}:/data","variables":{"exports_dir":{"description":"Host directory to mount on /data","format":"filepath"}},"type":"named","name":"-v"}],"environmentVariables":[{"description":"URL of your Immich server. Optional at start: without it every tool answers with the fix and one update_credentials call connects the container.","name":"IMMICH_BASE_URL"},{"description":"Immich API key","isSecret":true,"name":"IMMICH_API_KEY"},{"description":"Extra hostnames the container may be reached under (a reverse proxy, another container). DNS-rebinding protection stays on.","name":"MCP_ALLOWED_HOSTS"}]}],"tools":[{"name":"_duration_seconds","description":"Video duration in seconds from an Immich asset.","write_action":false,"price_micros":0,"input_schema":null},{"name":"_now","description":"UTC timestamp for a note. Isolated so tests can pin it.","write_action":false,"price_micros":0,"input_schema":null},{"name":"_trim_memory","description":"The API answers with full asset objects; the model only needs the essentials.","write_action":false,"price_micros":0,"input_schema":null},{"name":"_trim_stack","description":"Full asset objects are heavy; the model needs ids and filenames.","write_action":false,"price_micros":0,"input_schema":null},{"name":"_video_plan","description":"Download the video, plan the frames, and either extract or return the gate JSON.","write_action":false,"price_micros":0,"input_schema":null},{"name":"add_assets_to_album","description":"Add existing assets to an album. Use this to curate albums from search results or other asset lists. Assets can belong to multiple albums simultaneously. Side effect: modifies album membership.","write_action":false,"price_micros":0,"input_schema":null},{"name":"clear_asset_notes","description":"Forget the plugin's notes on assets (reviews and actions). Only the plugin's own key is removed; metadata other apps stored stays. Side effect: deletes the notes on the server.","write_action":false,"price_micros":0,"input_schema":null},{"name":"create_activity","description":"Post a comment (or a like) on a shared album or on one asset in it. Side effect: the activity appears for everyone the album is shared with.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_album","description":"Create a new album, optionally pre-populated with assets. Use this to organize photos into collections. Side effect: creates a new album in Immich.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_memory","description":"Create an \"on this day\" memory from chosen assets. Use this after curating a set of photos from the same past date (e.g. via search_metadata with a date range) to make them show up in Immich's memories feed. Side effect: creates a memory on the server.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_partner","description":"Share this account's library with another user on the server. The other user will see these photos next to their own. Find the id with list_users. Side effect: grants the user read access to the whole library.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_shared_link","description":"Create a public shared link for an album, making it accessible via URL without authentication. Use this to publish a gallery for external viewing. Side effect: creates a publicly accessible URL.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_stack","description":"Group near-identical assets (a burst, retries of the same shot) into one stack. The library then shows the stack as a single item fronted by its primary asset, which keeps every shot without the visual clutter — a gentler cleanup than deleting. The first id becomes the primary. Side effect: creates the stack on the server.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_tag","description":"Create a new tag for categorizing assets. Use list_tags first to avoid duplicates. Side effect: creates a new tag in Immich.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_activity","description":"Remove one comment or like. Side effect: deletes it for everyone.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_album","description":"Delete an album container. The photos inside are NOT deleted — they remain in the library. Use this to remove unwanted album groupings. Side effect: permanently deletes the album (cannot be undone).","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_assets","description":"Delete assets (soft-delete to trash or permanent). Use this to remove unwanted photos/videos. Default is soft-delete (recoverable via restore_assets). With force=true, deletion is PERMANENT and IRREVERSIBLE. Side effect: moves/deletes assets.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_memory","description":"Delete a memory. The photos stay in the library — only the memory entry goes away. Side effect: removes the memory from the server.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_shared_link","description":"Delete (revoke) a shared link, making the public URL immediately inaccessible. The album and its photos are unaffected. Side effect: permanently removes the link.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_stack","description":"Dissolve a stack. The assets are NOT deleted — they simply show as individual items again. Side effect: removes the grouping on the server.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_tag","description":"Delete a tag and remove it from all assets. The assets themselves are unaffected. Side effect: permanently deletes the tag (cannot be undone).","write_action":true,"price_micros":0,"input_schema":null},{"name":"download_archive","description":"Download an album or a selection as one zip of the original files, written to a local path. Use get_download_info first when the size matters. The file is streamed to disk (safe for big albums) and an existing file is never overwritten. Side effect: writes a file on the machine running the server.","write_action":false,"price_micros":0,"input_schema":null},{"name":"empty_trash","description":"Permanently delete ALL assets currently in trash. DESTRUCTIVE and IRREVERSIBLE. Use this only after confirming the user wants to purge all trashed items. For deleting specific assets, use delete_assets instead. Side effect: permanently destroys all trashed assets and frees storage.","write_action":false,"price_micros":0,"input_schema":null},{"name":"export_pdf","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_album","description":"Get full details for a specific album including all its asset IDs. Use this to inspect album contents or retrieve asset IDs for further operations (thumbnails, metadata, rotation). For listing all albums, use list_albums instead. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_album_images","description":"Get an album's thumbnails as image blocks for inline visual display. Use this to visually browse an album in clients that render images. For HTML gallery generation with base64 data URIs (Cowork/skills), use get_album_thumbnails instead — it returns JSON with filenames and dates. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_album_thumbnails","description":"Get base64-encoded thumbnails for photos in an album. Use this to generate visual HTML galleries from an existing album. For thumbnails from search results (no album), use get_thumbnails_batch instead. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_asset_faces","description":"Get all detected faces in a photo with their person assignments. Use this to see who is in a specific photo or to find face IDs for reassign_face. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_asset_image","description":"Get a single asset's thumbnail as an image block for inline visual display. Use this in clients that render images (Open WebUI, Claude Desktop). For HTML gallery generation with base64 data URIs (Cowork/skills), use get_asset_thumbnail instead — it returns JSON. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_asset_info","description":"Get full metadata for a single asset. Use this when you need EXIF details, GPS coordinates, camera info, or file properties for a known asset ID. For finding assets, use search_metadata or search_smart instead. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_asset_notes","description":"The plugin's notes on one asset: past review verdicts with reasons and recorded actions, newest last. Empty lists when it was never annotated. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_asset_thumbnail","description":"Get a base64-encoded thumbnail image for a single asset. Use this to visually inspect one photo. For multiple photos, use get_thumbnails_batch (by IDs) or get_album_thumbnails (by album). Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_assets_notes","description":"Which of these assets already carry notes, and their last verdict — the call that lets a cleanup pass skip what an earlier session reviewed. Immich cannot search this metadata, so the server is asked once per asset (no tokens spent on the ones without notes). Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_calendar_heatmap","description":"How many photos per day, over a date range — the data behind a calendar heatmap. Use this to find gaps (months with nothing), busy periods, or to check a library's health at a glance without listing assets. Immich 3.x answers natively; on Immich 2.x the same shape is built from the timeline (taken dates only), which costs one request per month in the range, so pass the narrowest range that answers","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_capabilities","description":"What this Immich server can do: version, feature flags and known quirks. Use this once at the start of a session to learn whether OCR, smart search or facial recognition are available before offering them, and which behaviours differ between Immich 2.x and 3.x. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_connection_info","description":"Return the Immich base URL and a masked API key. Use this to populate gallery template placeholders (e.g. {{IMMICH_URL}}). The API key is intentionally masked for security — thumbnails use base64 data URIs, not direct API calls. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_download_info","description":"How big the zip of an album or selection would be, BEFORE building it. Use this to warn the user about the size (originals and videos add up fast) and then decide whether to call download_archive. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_duplicates","description":"Get ML-detected duplicate asset groups (same image stored more than once). Use this to review potential duplicates before resolving them with resolve_duplicates. Requires Immich ML service. Note: \"duplicates\" means the same picture, not the same person — for people use get_album (assets[].people) or get_asset_faces. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_export_preview","description":"List what export_pdf would include (id, type, filename, date, place, people, video duration) so you know which assets exist before looking at images and writing captions. Pass exactly one of album_id / asset_ids. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_images_batch","description":"Get thumbnails for arbitrary asset IDs as image blocks for inline visual display. Use this to visually show search results in clients that render images. For HTML gallery generation with base64 data URIs (Cowork/skills), use get_thumbnails_batch instead — it returns JSON with filenames and dates. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_map_markers","description":"Get GPS map markers for all geotagged assets. Use this to discover where photos were taken or to build travel maps. For searching by city/country name, use search_metadata instead. Read-only. Returns up to 500 markers.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_person","description":"Get full details for a specific person including name, birth date, and photo count. Use this after finding a person via list_people or search_people. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_person_thumbnail","description":"Get a base64-encoded face crop thumbnail for a person. Use this to visually identify a person before merging or renaming. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_server_version","description":"Get the Immich server version. Use this to check compatibility or report the running server version. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_shared_link","description":"Get full details of a shared link including permissions, expiry, and linked assets. Use this to inspect a specific link's configuration. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_stack","description":"One stack with its assets. Use this after list_stacks to see everything a group holds before changing its cover or dissolving it, or to check what create_stack actually grouped. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_statistics","description":"Get library statistics. Use this for a quick overview of library size without listing individual assets. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_tag","description":"Get details for a specific tag. Use this to inspect a tag's properties. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_thumbnails_batch","description":"Get base64-encoded thumbnails for arbitrary asset IDs without needing an album. Use this to visually display search results or any ad-hoc set of photos. For album-based thumbnails, use get_album_thumbnails. For a single photo, use get_asset_thumbnail. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_timeline_bucket","description":"The assets of one month bucket from get_timeline_buckets. Use the two tools together to walk a library month by month without expensive searches. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_timeline_buckets","description":"Month-by-month map of the library: one bucket per month with its asset count. Use this before fetching assets — it shows in one cheap call which months hold photos and how many, ideal for finding gaps, busy periods, or navigating a large library without paging through everything. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_video_frames","description":"Get frames of a video as image blocks, to \"watch\" a clip. Immich keeps one poster per video; this downloads the video and cuts frames locally (PyAV, a dependency since 1.7.1, or ffmpeg on PATH). Every frame is one image for the model. Workflow: 6 frames first; to look closer, narrow with start/end or use interval (down to 1 s). Above 12 frames the tool returns a JSON plan with frames_planned and e","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_video_frames_json","description":"Frames of a video as base64 JPEG with timestamps, for HTML galleries and skills. Same parameters, gate (confirm above 12) and cap (120) as get_video_frames. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_activities","description":"Comments and likes on a shared album, newest context included. Use this to read what the people an album is shared with have said about it or about one of its photos. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_albums","description":"List all albums in the library with summary info. Use this to discover existing albums before creating new ones or to find an album ID. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_assets","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_memories","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_partners","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_people","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_shared_links","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_stacks","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_tags","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_users","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"merge_people","description":"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 c","write_action":false,"price_micros":0,"input_schema":null},{"name":"ping","description":"Check Immich server connectivity. Use this to verify the server is reachable before running other operations. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"reassign_face","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"record_action","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"remove_assets_from_album","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"remove_partner","description":"Stop sharing this account's library with a user. Their own photos are not touched. Side effect: revokes their access.","write_action":true,"price_micros":0,"input_schema":null},{"name":"resolve_duplicates","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"restore_assets","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"restore_trash","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"reverse_geocode","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"revert_asset_edits","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"review_assets","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"rotate_assets","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_cities","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_explore","description":"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. Re","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_large_assets","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_metadata","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_people","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_places","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_random","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_smart","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_statistics","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_suggestions","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"tag_assets","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"untag_assets","description":"Remove a tag from multiple assets. The tag itself remains; only the association is removed. Side effect: removes tag-to-asset links.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_album","description":"Update an album's name or description. Use this to rename or re-describe an existing album. Side effect: modifies album metadata in Immich.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_asset_metadata","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_assets_metadata","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_credentials","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_memory","description":"Update a memory: save it for later, move its date, or mark it seen. Side effect: modifies the memory on the server.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_partner","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_person","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_shared_link","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_stack","description":"Change which asset fronts a stack (the one the library shows). Side effect: updates the stack on the server.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_tag","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"upload_asset","description":"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.","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":82,"grade":"B","scanned_at":"2026-09-20T16:17:17.279Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-20T16:17:17.301Z","components":{"code":{"score":25,"max":25,"notes":["55 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":15,"max":15,"notes":["last push 17 days ago"]},"identity":{"score":7,"max":10,"notes":["registry namespace matches repository owner"]}},"findings":[],"inputs":{"packages":[{"registryType":"pypi","identifier":"immich-photo-manager","version":"2.0.11","found":true,"weeklyDownloads":203,"license":"MIT","dependencyCount":10,"publishedAt":"2026-09-03T22:05:18.507913Z","repositoryUrl":"https://github.com/drolosoft/immich-photo-manager"}],"repo":{"found":true,"owner":"drolosoft","repo":"immich-photo-manager","archived":false,"pushedAt":"2026-09-03T22:23:20Z","stars":50,"forks":10,"openIssues":0,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/270151826?v=4","ownerCreatedAt":"2026-03-22T15:31:58Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/270151826?v=4&s=128","source":"github"},"presence":{"stars":50,"forks":10,"downloadsWeek":203,"license":"MIT","lastPushAt":"2026-09-03T22:23:20.000Z","score":46}}}},"grade_history":[],"reviews":[]}