Skip to main content
Glama

Servidor MCP para la gestión inteligente de fotos con Immich: tu biblioteca autohospedada, comprendida.

Si tu biblioteca de Immich ha crecido más allá de lo que puedes gestionar manualmente, immich-photo-manager le da a cualquier asistente de IA acceso directo a tu instancia: busca, organiza, elimina duplicados y cura álbumes mediante conversación natural. Funciona con Claude, Gemma o cualquier cliente compatible con MCP. Se ejecuta localmente: tus fotos nunca salen de tu servidor.


Qué hace

Di "crea álbumes para todos mis viajes" y observa cómo trabaja:

Coordenadas GPS, búsqueda visual CLIP y coincidencia temporal: combinados en una sola solicitud para crear docenas de álbumes curados. Sin scripts, sin clasificación manual.


Related MCP server: exif-mcp

Inicio rápido

Requisitos previos

Instalar como plugin de Claude (recomendado)

git clone https://github.com/drolosoft/immich-photo-manager.git
cd immich-photo-manager

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

Eso es todo. Pregúntale a Claude: "¿qué tan saludable está mi biblioteca de fotos?"

Para la configuración manual del servidor MCP, consulta Getting Started.

Funciona en Claude Code

El mismo plugin se ejecuta en Claude Code: busca en tu biblioteca, cura álbumes y genera galerías directamente desde la terminal.

Transcripción completa de la conversación: Claude Code demo

Funciona con cualquier cliente MCP

immich-photo-manager es un servidor MCP: funciona con cualquier asistente de IA que hable el protocolo Model Context Protocol, no solo Claude.

============================================================
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...
   38 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.

Cliente

Estado

Claude Code

Probado

Claude Desktop

Probado

LM Studio (Gemma 4)

Probado

Cursor, Windsurf, VS Code, Cline, Zed

Compatible (MCP stdio)

Transcripción completa: Gemma 4 demo · Script de prueba: test-lmstudio-mcp.py


Aspectos destacados

  • Búsqueda impulsada por IA: búsqueda de fotos en lenguaje natural mediante CLIP ("atardecer en la playa", "pastel de cumpleaños")

  • Álbumes geográficos: crea álbumes organizados por lugar, combinando GPS + CLIP + coincidencia temporal

  • Reparación de metadatos: corrige marcas de tiempo de mediodía/medianoche, infiere GPS faltante de fotos cercanas, corrige desfases horarios

  • Limpieza de biblioteca: detecta capturas de pantalla, duplicados e imágenes de baja calidad con análisis de múltiples señales

  • Detección de duplicados: análisis entre fuentes mediante hashing perceptual (encuentra copias recodificadas en Apple Photos, Google Photos y otras importaciones)

  • Rotación masiva: rota álbumes completos o selecciones a la vez (90°/180°/270°); no destructivo, se acumula entre llamadas, reversible con un clic

  • Gestión de personas y rostros: lista, busca, fusiona y organiza personas reconocidas; reasigna rostros mal identificados; ve miniaturas de rostros

  • Papelera y ciclo de vida de activos: elimina activos de forma segura a la papelera, elimina permanentemente, restaura desde la papelera; gestión completa del ciclo de vida de los activos

  • Salud de la biblioteca: un comando para inventario de activos, calidad de metadatos, desglose de almacenamiento y recomendaciones

  • Galerías interactivas: páginas HTML autónomas con miniaturas incrustadas, 3 temas, 4 modos de visualización y un panel de acciones Cowork para operaciones por lotes

Selecciona fotos en la galería, haz clic en una acción y pega el comando en Claude. Consulta Skills Reference para ver las 11 habilidades.


¿Por qué immich-photo-manager?

Immich es excelente para almacenar y ver tus fotos. Pero gestionar una biblioteca grande (desduplicación, reparación de metadatos, curación de álbumes, análisis de almacenamiento) todavía requiere esfuerzo manual o scripts personalizados.

Manual / scripts

immich-photo-manager

🔍

Escribir llamadas API, analizar JSON

Lenguaje natural — "encuentra mis fotos de atardeceres de Italia"

🗺️

Exportar GPS, agrupar manualmente

Álbumes geográficos — GPS automático + CLIP + coincidencia temporal

🧹

Archivos hash, sumas de verificación diff

Hashing perceptual — encuentra duplicados recodificados entre fuentes de importación

🔧

Editar EXIF un archivo a la vez

Reparación de metadatos — corrige marcas de tiempo por lotes, infiere GPS, corrige zonas horarias

📊

Consultar base de datos, crear informes

Salud de la biblioteca — un comando para calidad de metadatos, almacenamiento, recomendaciones

🔄

Rotar una foto a la vez

Rotación masiva — rota álbumes completos a la vez, no destructivo

🛡️

Revisión manual de cada acción

Seguridad primero — muestra hallazgos, pregunta antes de actuar


Documentación

Documento

Descripción

Getting Started

Instalación, configuración manual de MCP, opciones de despliegue y solución de problemas

Skills Reference

Las 12 habilidades: flujos de trabajo, disparadores, parámetros, formatos de salida

MCP Tools Reference

Las 38 herramientas MCP: parámetros, tipos de retorno, ejemplos

Architecture

Cómo las miniaturas incrustadas en base64 resuelven la restricción del sandbox de Cowork

CORS Setup Guide

Opcional: habilita la carga directa de miniaturas por URL para galerías vistas en navegador


Contribución

Las contribuciones son bienvenidas: correcciones de errores, nuevas habilidades, ideas de funciones. Abre un issue o envía un PR.

Si immich-photo-manager ayuda a gestionar tu biblioteca, considera darle una estrella en GitHub: ayuda a otros a descubrir el proyecto.


Soporte

Si immich-photo-manager te ahorró tiempo o hizo que tu biblioteca de fotos fuera más fácil de gestionar, considera invitarme a un café: ¡ayuda a que el próximo llegue!


Licencia

Licencia MIT: libre de usar, modificar y distribuir.

Forjado por Drolosoft · Herramientas que desearíamos que existieran

Available Tools

94 tools
add_assets_to_albumA

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.

Args:
    album_id: Target album UUID.
    asset_ids: List of asset UUIDs to add to the album.

Returns: JSON with album_id, count added, and per-asset success/error details.
ParametersJSON Schema
NameRequiredDescriptionDefault
album_idYes
asset_idsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses a side effect: 'modifies album membership.' This adds behavioral context beyond the schema. However, it does not mention authentication needs, rate limits, or other potential consequences.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured: a clear action statement, usage context, side effect, then parameter details. Every sentence adds value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple nature of the tool (add assets to album), the description covers the core functionality. The return summary is helpful even though an output schema exists. However, it omits prerequisites like album existence and potential error handling details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% coverage (no descriptions). The description's Args section provides clear semantics: 'Target album UUID' for album_id and 'List of asset UUIDs to add to the album' for asset_ids. This compensates for the schema's lack of descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Add existing assets to an album.' It provides a specific use case: 'Use this to curate albums from search results or other asset lists.' This distinguishes it from sibling tools like 'create_album' (create new) and 'remove_assets_from_album' (remove).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says when to use the tool (curate albums from lists) and notes that assets can belong to multiple albums simultaneously, which guides decision-making. It does not explicitly state when not to use it or list alternatives, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clear_asset_notesA

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.

Args:
    asset_ids: The assets to clear.

Returns: JSON with success, how many assets were cleared, and a failed array
of {asset_id, error}. Success is true only when nothing failed.
ParametersJSON Schema
NameRequiredDescriptionDefault
asset_idsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does a good job: it discloses the side effect ('deletes the notes on the server'), the narrow scope ('Only the plugin's own key is removed'), and the success semantics ('Success is true only when nothing failed'). It does not cover permissions or irreversibility explicitly, but the key behavioral traits are transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently structured: the main purpose is front-loaded, follow-up sentences add scope and side-effect detail, and the Args/Returns block is clearly labeled. There is no filler or redundant prose; every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter destructive operation, the description covers the purpose, scope, side effect, and return value semantics, including a failed-array explanation. An output schema exists per context, so the explicit Returns block is a bonus. Minor omissions like handling of invalid or missing asset IDs do not significantly hamper correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. However, it only says 'asset_ids: The assets to clear,' which barely adds meaning beyond the schema's title 'Asset Ids' and array-of-strings type. No format, edge-case behavior, or array semantics are explained, leaving the parameter mostly self-explanatory by name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Forget the plugin's notes on assets (reviews and actions).' It further scopes the operation by noting 'Only the plugin's own key is removed; metadata other apps stored stays,' which clearly distinguishes it from generic note-related tools in the sibling list such as get_asset_notes and review_assets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit when-to-use guidance, prerequisites, or exclusions. It does not mention alternatives or caution against using it when preserving plugin notes is desired. The intended usage is only implied by the verb 'Forget,' so an agent has to infer when this tool should be selected over related siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_activityA

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.

Args:
    album_id: The album to comment on.
    comment: The comment text. Leave empty when sending a like.
    asset_id: Attach the comment/like to this asset instead of the album.
    like: True to send a like instead of a comment.

Returns: JSON with the created activity's id and type.
ParametersJSON Schema
NameRequiredDescriptionDefault
likeNo
commentNo
album_idYes
asset_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly states the important side effect that the activity appears for everyone the album is shared with, and also notes the return value. It does not cover permissions or reversibility, but the main behavioral traits are disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded: a one-sentence purpose, a clear side-effect note, a compact parameter list, and a return line. Every sentence adds useful information, with no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple creation tool, the description covers the purpose, target selection, all parameters, a key side effect, and the return format. The lack of annotations is compensated by the explicit behavior disclosure and complete argument semantics.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description's Args section fully documents all four parameters: album_id, comment, asset_id, and like. It adds meaningful relationships, such as 'Leave empty when sending a like' and 'attach to asset instead of the album', which go well beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Post a comment (or a like)') and a clear resource ('on a shared album or on one asset in it'). It distinguishes itself from related siblings like list_activities and delete_activity by describing exactly what kind of activity is created.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool by explaining its purpose and target scope, and clarifies the album vs. asset distinction. However, it does not explicitly state when not to use it or name alternative tools for related actions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_albumA

Create a new album, optionally pre-populated with assets. Use this to organize photos into collections. Side effect: creates a new album in Immich.

Args:
    name: Album display name (e.g. 'Roma, Italia', 'Birthday 2024').
    description: Optional album description text.
    asset_ids: Optional list of asset UUIDs to add immediately on creation.

Returns: JSON with the new album's id, name, and asset count.
ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
asset_idsNo
descriptionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry full behavioral burden. It mentions the side effect of creating an album in Immich but does not disclose potential errors (e.g., duplicate names), permissions required, or whether the operation is reversible. For a creation tool, this is adequate but not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (4 sentences) and includes a structured parameter breakdown. However, the parameter list could be integrated more seamlessly into the main description to be more front-loaded. No unnecessary words but slightly fragmented.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple nature of the tool (create album with optional fields and pre-population), the description covers the main use case and return values. It lacks details on error handling or constraints (e.g., name uniqueness) but is sufficient for a basic creation operation. Siblings provide contrast.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description fully compensates. It provides clear semantics for each parameter: name with an example format, description as optional text, asset_ids as optional list of UUIDs. It also explains the return value structure (id, name, asset count), which is not in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool creates a new album, optionally pre-populated with assets, distinguishing it from siblings like add_assets_to_album (adds to existing) or update_album. The verb 'create' and resource 'album' are specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly notes using the tool to organize photos into collections and mentions optional pre-population. However, it lacks explicit guidance on when not to use it (e.g., for adding assets to an existing album, use add_assets_to_album) or alternatives. Still, the context is clear enough for an AI agent to infer basic usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_memoryA

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.

Args:
    memory_at: ISO date the memory is shown on (usually today's month and day).
    year: The past year the memory looks back to (required by Immich).
    asset_ids: Assets to include. May be empty, but an empty memory shows nothing.

Returns: JSON with the created memory's id, type, memory_at, the year it
remembers, is_saved, asset_count and a trimmed assets list (id, filename, date).
ParametersJSON Schema
NameRequiredDescriptionDefault
yearYes
asset_idsNo
memory_atYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It explicitly discloses the mutation with 'Side effect: creates a memory on the server' and warns that an empty asset list yields an empty memory. However, it omits permission requirements, conflict/duplicate behavior, and reversibility, leaving gaps for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Efficiently structured with a one-line purpose, a usage workflow sentence, a clean Args list, and a Returns specification. No filler, and the core verb/resource is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, usage context, all three parameters, side effects, and the return shape in a compact definition. It omits error handling, permissions, and potential conflicts, but for a creation tool with no annotations it is still notably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, but the Args section compensates fully: memory_at is explained as the ISO date shown on, year as the required past year, and asset_ids with the empty-list caveat. This gives the agent everything needed to build correct parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Create an "on this day" memory from chosen assets.' It clearly differentiates from sibling memory tools (list_memories, update_memory, delete_memory) by describing the creation action and the Immich memories feed effect.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear workflow context: 'Use this after curating a set of photos from the same past date (e.g. via search_metadata with a date range).' This tells the agent when to invoke the tool, but it doesn't explicitly state alternatives or when not to use it, so it's not a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_partnerA

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.

Args:
    user_id: The user to share with.

Returns: JSON with the new partner entry.
ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the behavioral transparency burden. It explicitly discloses the key side effect: 'grants the user read access to the whole library,' which is crucial for a mutating, security-relevant operation. It could go further by mentioning behavior on duplicate partners or reversibility, but the most important side effect is clearly stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded with the main action, followed by the side effect, parameter, and return value. The 'Returns' line is slightly redundant given an output schema exists, but the overall structure is tight and every remaining sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter tool, the description covers the action, the side effect, how to find the required ID, and the return value. It does not mention how this compares to shared links or what happens if a partner already exists, but the essential information needed to call the tool correctly is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the JSON schema provides only the title 'User Id' and no description, the tool description compensates fully with 'Args: user_id: The user to share with.' It also tells the agent how to obtain a valid value ('Find the id with list_users'), giving the single parameter both meaning and provenance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Share'), a concrete resource ('this account's library'), and a clear recipient ('another user on the server'). It distinguishes itself from sibling tools by explaining the result: 'The other user will see these photos next to their own.' This makes the tool's role unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool—sharing with another server user—and provides a concrete prerequisite: 'Find the id with list_users.' It does not explicitly name alternatives like create_shared_link or remove_partner, but the phrasing 'another user on the server' helps disambiguate from link-based sharing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_stackA

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.

Args:
    asset_ids: The assets to group, at least two. Order matters: the first is
        the cover.

Returns: JSON with the new stack's id, primary_asset_id and asset list.
ParametersJSON Schema
NameRequiredDescriptionDefault
asset_idsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the full burden; it is unusually transparent, disclosing a server-side side effect, the primary-asset rule ('The first id becomes the primary'), a minimum of two assets, and that assets are kept rather than deleted. It does not address reversibility or conflict behavior, but the core state-changing traits are clearly stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The text is compact, front-loaded with the core behavior, and organized with Args/Returns sections. Each sentence adds information—purpose, effect, parameter constraint, return shape—with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter create operation, the description covers what, when, why, how parameters behave, side effects, and the return shape. The output schema exists and the description also spells out the returned fields, leaving little for an agent to guess.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the schema only declares asset_ids as a string array. The description compensates fully: it imposes the 'at least two' constraint, explains that order matters, and defines the first element as the cover/primary—making the single parameter fully meaningful.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the specific action 'Group near-identical assets into one stack' and differentiates it from a hard delete by describing it as 'a gentler cleanup than deleting.' The 'Side effect: creates the stack on the server' confirms a create operation distinct from stack list/get/update/delete siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: use when you have near-identical assets (burst, retries) and want to reduce clutter while keeping all shots. It contrasts with deleting, implying this is the non-destructive alternative, though it does not explicitly name sibling alternatives or state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_tagA

Create a new tag for categorizing assets. Use list_tags first to avoid duplicates. Side effect: creates a new tag in Immich.

Args:
    name: Tag display name (e.g. 'Vacation', 'Family', 'Work'). Must be unique.
    color: Optional hex color for the tag (e.g. '#FF5733').

Returns: JSON with the new tag's id, name, and color.
ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
colorNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It mentions 'Side effect: creates a new tag in Immich' and describes the return format, but it lacks details on authorization needs, rate limits, or other behavioral traits. The description is minimal for a creation tool without annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, with only a few sentences. It front-loads the purpose, then provides usage hints, parameter details, and return information. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose, usage hint, parameter semantics, and return value. Given the low complexity (2 params, one required) and the existence of an output schema (return fields mentioned), it provides sufficient context for an agent to use the tool correctly, despite missing annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description adds meaning by providing examples for 'name' (e.g., 'Vacation') and 'color' (e.g., '#FF5733'), and states that name must be unique. This compensates for the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Create a new tag for categorizing assets.' This is a specific verb+resource, and it differentiates itself from sibling tools like delete_tag, update_tag, and list_tags by being the creation operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description advises 'Use list_tags first to avoid duplicates,' providing clear guidance on when to use this tool and a prerequisite action. It does not explicitly mention when not to use it, but the given hint is valuable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_activityA

Remove one comment or like. Side effect: deletes it for everyone.

Args:
    activity_id: The activity to remove (from list_activities).

Returns: JSON confirming the deletion.
ParametersJSON Schema
NameRequiredDescriptionDefault
activity_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly warns of the destructive side effect ('deletes it for everyone') and states the return format (JSON confirming the deletion), covering the most important behavioral aspects for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core action and side effect, followed by concise args and returns sections. Every sentence earns its place and there is no redundant elaboration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has one required parameter, no enums, and an output schema, so the description only needs to cover purpose, parameter source, and side effects—all of which are present. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must clarify the parameter. It adds crucial context by specifying that activity_id is 'The activity to remove (from list_activities)', grounding the opaque string ID. For a single-parameter tool, this is sufficient compensation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Remove') and a clearly scoped resource ('one comment or like', i.e., an activity). This distinguishes it from sibling deletion tools like delete_assets, delete_album, and delete_tag, and it further grounds the resource by referencing list_activities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly establishes when to use the tool: to remove a single comment or like, with the activity_id sourced from list_activities. While it does not explicitly name alternatives or exclusions, the resource scoping makes the intended use unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_albumA

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).

Args:
    album_id: The album's UUID to delete.

Returns: JSON with success, the deleted album's id and album_id.
ParametersJSON Schema
NameRequiredDescriptionDefault
album_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description bears the full burden — and meets it. 'permanently deletes the album (cannot be undone)' discloses irreversibility, and the NOT-deleted photos caveat prevents a destructiv misunderstanding. These are exactley the safety-relevant facts an agent needs before invoking a destructiv tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Roughly 60 words, front-loaded with the core action, followed by the key caveat, use case, side-effect warning, parameter, and return type. Every sentence earns its place and no filler exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter destructive tool with zero annotation coverage, all gaps are closed: action, side effect, permenance, parameter format, and return shape. Nothing needed to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% — the schema only says album_id is a string. The description fully compensates with 'The album's UUID to delete,' adding both the required format (UUID) and the parameter's role. For a single-parameter tool this is complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Delete') + resource ('album container') and immediately distinguishes itself from siblings by clarifying 'The photos inside are NOT deleted — they remain in the library.' This sets it apart from delete_assets and remove_assets_from_album without needing to open those tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use this to remove unwanted album groupings' gives a clear intended scenario. The photos-remain caveat implicitly routes away from photo-deletion tools, but alternatives are not explicitly named, so it stops short of the explicit when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_assetsA

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.

Args:
    asset_ids: List of asset UUIDs to delete.
    force: false (default) = move to trash (recoverable). true = PERMANENTLY delete (no undo).

Returns: JSON with count deleted and whether force was used.
ParametersJSON Schema
NameRequiredDescriptionDefault
forceNo
asset_idsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavioral traits: default soft-delete, permanent deletion with force=true, side effect of moving/deleting, and return format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with an Args section and clear separation of modes. It could be slightly more concise but remains efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity and lack of annotations, the description covers essential aspects: behavior, parameters, side effects, and return value. The existing output schema is referenced.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema coverage, the description adds meaning by explaining asset_ids as UUIDs and force default false, plus its effect on deletion permanence.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool deletes assets with two modes (soft-delete and permanent), and distinguishes it from restoring assets via restore_assets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains when to use (remove unwanted photos/videos) and provides context for the two modes, but doesn't explicitly state when not to use or alternative tools beyond restore_assets.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_memoryA

Delete a memory. The photos stay in the library — only the memory entry goes away. Side effect: removes the memory from the server.

Args:
    memory_id: The memory to delete.

Returns: JSON confirming the deletion.
ParametersJSON Schema
NameRequiredDescriptionDefault
memory_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description carries the behavioral burden and explains that the memory is removed from the server while photos remain in the library. This discloses the destructive scope and the non-destructive side effect, which is valuable for an agent deciding whether to invoke a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core action, followed by the key side effect, parameter documentation, and return clarification. Each sentence serves a distinct purpose, and there is no unnecessary elaboration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter destructive tool, the description provides enough context: what is deleted, what is preserved, where the deletion happens, and what the response is. It does not discuss irreversibility or error cases, but the 'goes away' language sufficiently implies permanence.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It documents memory_id as 'The memory to delete,' which, while minimal, is sufficient for a single required parameter and confirms its role beyond the bare schema property name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies a specific action ('Delete a memory') and clearly separates 'memory entry' from photos, so the tool is not confused with photo/asset deletion. It also differentiates from sibling memory tools like create_memory and update_memory by stating the resource and effect precisely.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly communicates that this tool removes a memory while preserving photos, which tells the agent when to use it and explicitly what it does not do. It does not name alternative tools, but the exclusion of photo deletion provides clear contextual guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_stackA

Dissolve a stack. The assets are NOT deleted — they simply show as individual items again. Side effect: removes the grouping on the server.

Args:
    stack_id: The stack to dissolve.

Returns: JSON confirming the deletion.
ParametersJSON Schema
NameRequiredDescriptionDefault
stack_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure, and it does so well. It clearly states the non-destructive nature ('assets are NOT deleted'), the immediate user-visible effect ('show as individual items again'), and the server-side side effect ('removes the grouping on the server'). It also mentions the return type. Minor omissions like reversibility or permission requirements prevent a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and every sentence earns its place. The first sentence states the core action, the second clarifies the most important non-destructive caveat, the third describes the side effect, and the Args/Returns lines are minimal and useful. No redundant wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter tool with an output schema, the description covers the purpose, the key behavioral nuance, the parameter role, and the return value. It does not discuss error cases or authorization, but these are not essential for this low-complexity operation. The main gap is the lack of explicit guidance about when to choose this over similar stack or deletion tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only provides the parameter name and type with no description, so the schema description coverage is 0%. The description compensates with 'stack_id: The stack to dissolve,' clarifying the role of the single parameter. It does not add details like ID format or lookup behavior, but for a single simple parameter this is sufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Dissolve a stack.' It also resolves the ambiguity of the tool name by explicitly stating that assets are NOT deleted, which distinguishes it from deleting assets or deleting other entities. This clearly differentiates delete_stack from siblings like delete_assets and delete_album.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the operation's effect obvious but does not explicitly state when to use this tool versus alternatives. It implies usage by context (for dissolving a stack) but does not name related stack operations or exclude cases like deleting a whole stack's assets, which a cautious agent might confuse.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_tagA

Delete a tag and remove it from all assets. The assets themselves are unaffected. Side effect: permanently deletes the tag (cannot be undone).

Args:
    tag_id: The tag's UUID to delete.

Returns: JSON with success, the deleted tag's id and tag_id.
ParametersJSON Schema
NameRequiredDescriptionDefault
tag_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description carries the full burden and does it well. It explicitly discloses the permanent, irreversible nature of the deletion and states that assets are not affected. This is exactly the kind of side-effect transparency needed for a destructive operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short, front-loaded with the primary action, and uses clear sections for side effects, arguments, and return value. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter destructive tool with an output schema, the description covers the action, the irreversible side effect, the parameter meaning, and the return value. Nothing essential is missing for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only provides 'type: string' and 'title: Tag Id', so the description fully compensates by specifying that tag_id is 'The tag's UUID to delete'. This adds both type detail (UUID) and purpose, which is sufficient for the single required parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Delete') and resource ('a tag'), then clarifies the key differentiator: the tag is removed from all assets but the assets themselves are unaffected. This clearly distinguishes it from asset deletion and other tag-related operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use it: when a tag should be permanently deleted and removed from all assets. It doesn't explicitly name an alternative like untag_assets, but the behavior is clear enough that an agent can infer when this tool is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

download_archiveA

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.

Args:
    output_path: Where to write the zip (an existing file is refused).
    album_id: Download the whole album.
    asset_ids: Or download just these assets.

Returns: JSON with path, bytes written and how many assets went in, or an error.
ParametersJSON Schema
NameRequiredDescriptionDefault
album_idNo
asset_idsNo
output_pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does it well: it discloses the side effect of writing a file on the server machine, streaming to disk for large albums, and the no-overwrite guarantee. It also states the return shape. These are meaningful behavioral details beyond what the schema provides.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear first-sentence purpose, a useful usage hint, behavioral facts, then a labeled Args and Returns section. Every sentence adds value and nothing feels redundant or padded. It is appropriately sized for the complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations and no schema descriptions, the description covers all essential aspects an agent needs: purpose, parameter selection, side effects, safety, and return format. The existence of an output schema covers detailed return structure. It even names the related get_download_info tool for size checks. No critical decision-making information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains each parameter: output_path (where to write, existing file refused), album_id (whole album), asset_ids (just those assets). It adds the mutual exclusivity via 'or' and the refusal behavior. It lacks explicit detail on what happens if both or neither are provided, but the core semantics are clear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Download an album or a selection as one zip of the original files') and the destination ('written to a local path'). It distinguishes from siblings by specifying the zip of original files and local-path output, which separates it from get_download_info, export_pdf, and thumbnail/image tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly directs the agent to call get_download_info first when size matters, which is a clear alternative and condition. It also presents the album_id vs asset_ids choice with 'or'. However, it does not explicitly state when not to use this tool (e.g., for previews or PDF exports), so it falls slightly short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

empty_trashA

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.

Returns: JSON with success confirmation.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Labels as 'DESTRUCTIVE and IRREVERSIBLE' and describes side effects (permanently destroys trashed assets, frees storage). No annotations were provided, so description fully covers behavioral traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences plus a return line, all essential. Front-loaded with purpose and warning. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no parameters and an output schema exists (return value described), the description is fully sufficient. Covers purpose, usage, side effects, and result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters in input schema, so description need not explain them. It adds return value description ('Returns: JSON with success confirmation'). Baseline for 0 params is 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'permanently delete' and the resource 'ALL assets currently in trash'. It distinguishes from siblings like 'delete_assets' and 'restore_trash'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly advises to use only after user confirmation and provides an alternative tool ('delete_assets') for deleting specific items.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_pdfA

Build a PDF (cover, index, places, one section per asset) from an album or a list of assets, on the machine running this server. Immich metadata (date, place, camera, people, tags) is always included; pass captions {asset_id: text} with what you saw to add your analysis. Video frames go straight into the PDF and cost no tokens (up to 120 per video). The PDF never enters the conversation unless return_base64=True. If the user asked for a PDF without saying how they want it, call get_export_preview first and ask them about the choices it lists.

Keep the selection coherent: one story per PDF. Never mix unrelated assets
(two videos about different things, photos from different events) just to
show more; if the user's material spans several stories, offer one PDF per
story instead.

Args:
    album_id: Album UUID, or asset_ids: explicit asset UUIDs (exactly one of the two).
    output_path: Where to write (default ~/Desktop/<title>.pdf). Existing files are never overwritten.
    title: Cover title (default: album name or "Immich export <date>").
    captions: {asset_id: text} written after looking at the images.
    layout: 'detail' (one asset per page with its data, default), 'grid' (six per page)
        or 'photobook' (one asset per page, image as large as it fits, caption under
        it; a video with several chosen frames unfolds into one full page per frame).
    frames_per_video: Frames per video, evenly spaced (0-120, default 4; 0 = poster only).
    frame_interval: One frame every N seconds instead of frames_per_video (same 120 cap).
    frame_times: {asset_id: [seconds, ...]} exact moments for specific videos, chosen
        after looking at their frames ("the representative frame"). Wins over
        frames_per_video/frame_interval for the listed videos; others keep the spread.
    frame_captions: {asset_id: [text, ...]} one caption per extracted frame, in frame
        order (photobook prints each on its frame's page; other layouts ignore them).
    image_size: 'original' (default): photos go in at the stored file's quality,
        re-encoded to at most 3000px (a format the server cannot decode, like
        some HEIC, falls back to preview with a note); 'preview' (1440px) or
        'thumbnail' for smaller files.
    frame_size: video frame size in the PDF: 'auto' (default, same as 'preview':
        quality is free inside the PDF) or 'thumbnail' for a smaller file.
    language: 'en' (default) or 'es' for the fixed labels on the pages (Index,
        Places, Camera, page numbers); captions stay in whatever language you wrote.
    map: Draw an OpenStreetMap map on the Places page when assets carry GPS
        (default True; tiles come from tile.openstreetmap.org, the only
        third-party call this server makes — pass map=False to skip it).
    cover, index, places: Include each front-matter page (all default True;
        turn them off for a print-ready photobook of bare pages).
    footer: 'full' (plugin name, server and page number, default), 'pages'
        (just the page number) or 'none'.
    header: Repeat the title at the top of every page except the cover
        (default False).
    videos_position: Where the video pages (frame strips or frame pages) go:
        'mixed' with the photos in the general order (default), 'first' or 'last'.
    order: 'auto' (albums read oldest to newest, like the frames inside a video;
        asset_ids keep the order you passed), 'oldest', 'newest' or 'given'.
    confirm: Only asked for when explicit asset_ids mix videos more than 90 days
        apart (different stories). Pass True only when the user themselves asked
        to mix them; exporting a whole album never needs it.
    limit: Max assets (1-500, default 100).
    return_base64: Also return the PDF bytes (skipped above 2 MB; every MB is
        roughly 350k tokens in the conversation).

Returns: JSON {path, pages, bytes, assets_included, assets_skipped:[{id, reason}], warnings:[...]}.
ParametersJSON Schema
NameRequiredDescriptionDefault
mapNo
coverNo
indexNo
limitNo
orderNoauto
titleNo
footerNofull
headerNo
layoutNodetail
placesNo
confirmNo
album_idNo
captionsNo
languageNoen
asset_idsNo
frame_sizeNoauto
image_sizeNooriginal
frame_timesNo
output_pathNo
return_base64No
frame_captionsNo
frame_intervalNo
videos_positionNomixed
frames_per_videoNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does: PDFs are written to disk, existing files are never overwritten, the PDF never enters the conversation unless return_base64=True, video frames cost no tokens, the map uses a third-party OSM tile server, and undeciable formats fall back to preview. Side effects, costs, and failure/fallback behavior are all disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Though long, the structure is efficient: purpose first, then key behavioral notes, then usage guidance, then a well-grouped argument list. Every sentence adds information an agent needs; nothing is redundant with the schema since the schema has no descriptions. The length is justified by the tool's 24-parameter complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the two mutually exclusive selectors, all defaults, the return JSON shape, edge cases (HEIC fallback, video frame cap, 2 MB base64 limit, third-party map call), language options, and the one-story-per-PDF rule. Combined with the schema defaults and the described output object, an agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully explain the 24 parameters, and it does in detail. It clarifies defaults, mutual exclusivity (album_id vs asset_ids), parameter interactions (frame_times wins over frames_per_video/frame_interval; frame_captions only matter in photobook layout), numeric bounds (0-120, 1-500), and the meaning of each enum-like string (layout, order, footer, etc.).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states exactly what the tool does: 'Build a PDF (cover, index, places, one section per asset) from an album or a list of assets' with the location ('on the machine running this server'). It also names the sibling get_export_preview and explicitly says to call it first when the user hasn't specified choices, so the agent can distinguish this tool from that one.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance: call get_export_preview first if the user asked for a PDF without specifying how; keep one story per PDF; offer one PDF per story rather than mixing unrelated assets; and when confirm is required (explicit assets mixing videos more than 90 days apart), only pass True if the user explicitly asked. This is direct, actionable usage guidance with clear alternatives and exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_albumA

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.

Args:
    album_id: The album's UUID (from list_albums or create_album).

Returns: JSON with album metadata, a flat list of all asset_ids, and an assets array
(id, filename, type, date, recognized people) so "who appears in this album / who
repeats" can be answered without further calls.
ParametersJSON Schema
NameRequiredDescriptionDefault
album_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states 'Read-only' and explains the exact return shape: 'JSON with album metadata, a flat list of all asset_ids, and an assets array.' It also notes that the returned recognized people data can answer questions about who appears in an album without further calls, which is a useful behavioral promise. It does not cover error conditions or authentication requirements, but for a read-only single-resource fetch this is a minor gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: the purpose is front-loaded in the first sentence, followed by usage guidance, parameter explanation, and return details. Every section earns its place, and there is no redundant padding. The 'Args' and 'Returns' sections are clearly labeled, making it easy for an agent to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read-only fetch with an output schema, the description is complete: it states purpose, when to use it, what album_id should be, and what the response contains. It also contextualizes the return data with the 'who appears in this album / who repeats' use case. No critical information for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for the parameter's meaning. It does: 'album_id: The album's UUID (from list_albums or create_album).' This adds format guidance and tells the agent where to obtain valid values, which is genuinely helpful beyond the bare schema. The one parameter is fully addressed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Get full details for a specific album including all its asset IDs.' It clearly distinguishes itself from list_albums by stating, 'For listing all albums, use list_albums instead.' This makes the tool's purpose unambiguous and differentiates it from its closest sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use this tool: 'to inspect album contents or retrieve asset IDs for further operations (thumbnails, metadata, rotation).' It also gives an explicit exclusion: 'For listing all albums, use list_albums instead.' This provides clear routing for an agent choosing between tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_album_imagesA

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.

Args:
    album_id: The album's UUID.
    size: 'thumbnail' (250px) or 'preview' (1440px). Default: 'thumbnail'.
    limit: Max thumbnails to return (1-50, default 20).

Returns: A list of image blocks suitable for visual display.
ParametersJSON Schema
NameRequiredDescriptionDefault
sizeNothumbnail
limitNo
album_idYes

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the safety burden; it states 'Read-only' and describes return type and size/limit behavior. It doesn't document error handling or output structure details, so while transparent, it isn't exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose, usage-routing, read-only safety, args, and return are all covered in a compact, front-loaded layout. No filler sentences; the Args list is scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete enough to invoke correctly without opening sibling definitions or schemas: it identifies the album resource, optional parameters with defaults, output type, and the key alternative. The absence of an output schema is mitigated by the Returns line.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but description documents all three parameters: album_id as UUID, size values with pixel dimensions and default, and limit range 1-50 with default. This fully compensates for the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Get'), a clear resource ('an album'), and a concrete output type ('image blocks for inline visual display'). It also names the sibling alternative get_album_thumbnails, making the distinction explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use this to visually browse an album in clients that render images' and directs to get_album_thumbnails for HTML gallery generation with base64 data URIs. This gives an agent a clear decision rule rather than relying on tool names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_album_thumbnailsA

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.

Args:
    album_id: The album's UUID.
    size: 'thumbnail' (250px) or 'preview' (1440px). Default: 'thumbnail'.
    limit: Max thumbnails to return (1-50, default 20).

Returns: JSON with album info and thumbnails array (each with asset_id, base64 data, filename, date).
ParametersJSON Schema
NameRequiredDescriptionDefault
sizeNothumbnail
limitNo
album_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, but the description states the tool is read-only, describes the return format (JSON with album info and thumbnails array including asset_id, base64 data, filename, date), and clarifies parameter behavior (size options with pixel dimensions, limit range). This full context compensates for the lack of annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise yet comprehensive: a clear purpose sentence, usage guidelines, read-only note, and structured parameter list with return details. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite the tool having 53 siblings, the description sufficiently differentiates it and covers all needed context: input, output, behavior, and use case. The output schema exists, but the description still clarifies return structure, which is helpful.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, but the description fully explains all three parameters: album_id (UUID), size (two options with default and pixel dimensions), and limit (range 1-50, default 20). This adds complete semantic meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Get base64-encoded thumbnails for photos in an album.' It explicitly distinguishes from the sibling tool get_thumbnails_batch, ensuring proper differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance: 'Use this to generate visual HTML galleries from an existing album. For thumbnails from search results (no album), use get_thumbnails_batch instead.' This tells both when and when not to use the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_asset_facesA

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.

Args:
    asset_id: The asset's UUID.

Returns: JSON array of face detections (each with face_id, person_id, person_name, bounding box).
ParametersJSON Schema
NameRequiredDescriptionDefault
asset_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Declares 'Read-only' and describes return shape. No annotations exist, so description carries burden. Lacks details on permissions or error conditions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Short, front-loaded purpose, uses clear sections for Args and Returns. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Describes return format despite no output schema. Lacks error handling or permission details but adequate for a simple read operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides no description for asset_id. The description adds 'The asset's UUID,' clarifying the parameter. This adds value beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it retrieves detected faces with person assignments. Differentiates from siblings like reassign_face (modifies) and get_person (single person).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly guides to use for seeing who is in a photo or finding face IDs for reassign_face. Lacks 'when not to use' but positive context is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_asset_imageA

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.

Args:
    asset_id: The asset's UUID.
    size: 'thumbnail' (250px, fast) or 'preview' (1440px, higher quality). Default: 'thumbnail'.

Returns: An image block (MCP ImageContent) for visual display.
ParametersJSON Schema
NameRequiredDescriptionDefault
sizeNothumbnail
asset_idYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden, and it delivers. It explicitly states 'Read-only', describes the exact return type ('MCP ImageContent'), and explains the behavioral consequences of the size parameter (250px/fast vs 1440px/higher quality). This is sufficient behavioral disclosure for a simple retrieval tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is tightly structured: purpose, usage context, parameter docs, and return type are each given in compact, front-loaded statements. There is no filler or redundancy; every sentence contributes distinctive information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter, single-asset image retrieval tool with no output schema, the description covers everything an agent needs: intended client environments, alternative for a different use case, full parameter semantics, return format, and read-only status. No critical information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully compensate, and it does. It documents asset_id as 'The asset's UUID' and size with its two values, dimensions, quality implications, and default. This adds far more meaning than the bare schema fields, which only list type and default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Get a single asset's thumbnail as an image block for inline visual display.' It also explicitly distinguishes itself from the sibling get_asset_thumbnail, naming the exact alternative and its different return type, so an agent can immediately tell them apart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage context: 'Use this in clients that render images (Open WebUI, Claude Desktop).' It then states the exclusion condition and alternative: 'For HTML gallery generation with base64 data URIs (Cowork/skills), use get_asset_thumbnail instead — it returns JSON.' This is precisely the when-to-use vs when-not-to-use guidance an agent needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_asset_infoA

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.

Args:
    asset_id: The asset's UUID (from search results, album listings, or list_assets).
    with_notes: Also include the plugin's notes on the asset (past review
        verdicts and recorded actions, see get_asset_notes). One extra request.

Returns: JSON with EXIF data, GPS, dates, dimensions, file size, camera
make/model, and owner; plus a `notes` object (reviews and actions) when
with_notes is true.
ParametersJSON Schema
NameRequiredDescriptionDefault
asset_idYes
with_notesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the behavioral disclosure burden. It clearly states 'Read-only', discloses that with_notes incurs 'One extra request', and describes what the returned notes object contains. It does not discuss auth requirements or failure behavior, but for a simple metadata retrieval tool this is reasonably transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, followed by clear usage guidance, parameter explanations, and return-value summary. Every sentence earns its place, and the format with Args and Returns sections makes it easy for an agent to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter, single-asset metadata lookup, this description covers the key context: when to use it, how to obtain asset_id, the optional with_notes behavior, cost implications, and the shape of the response. The presence of an output schema means the return-value summary in the description is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains both parameters: asset_id is 'The asset's UUID (from search results, album listings, or list_assets)' and with_notes is described as including notes at the cost of one extra request. This adds meaningful guidance beyond the schema's bare type definitions, though it does not enumerate the exact notes structure.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Get full metadata for a single asset.' It distinguishes the tool from its siblings by explicitly naming the metadata types (EXIF, GPS, camera info, file properties) and contrasting with search_metadata and search_smart, which are for finding assets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool ('Use this when you need EXIF details, GPS coordinates, camera info, or file properties for a known asset ID') and provides clear alternatives ('For finding assets, use search_metadata or search_smart instead'). It also signals the read-only nature, helping the agent avoid unsafe or irrelevant choices.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_asset_notesA

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.

Args:
    asset_id: The asset to read.

Returns: JSON with asset_id, reviews [{at, verdict, reason}] and
actions [{at, action, detail}].
ParametersJSON Schema
NameRequiredDescriptionDefault
asset_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full responsibility for behavioral disclosure. It explicitly states the operation is read-only, notes the ordering ('newest last'), and defines the empty-list behavior when the asset was never annotated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The key purpose and behavior are front-loaded in the first sentence, followed by compact Args and Returns sections. Every sentence earns its place with no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read-only tool, the description covers the input, the full return shape, ordering, and edge case behavior. Nothing essential is missing for an agent to select and invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema gives no description for asset_id, so the description must compensate. It explains that asset_id identifies 'the asset to read,' which is sufficient for a simple string parameter, though it adds no further constraints or format details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('get'), a specific resource ('notes on one asset'), and the content of those notes (review verdicts and recorded actions). This distinguishes it from the plural sibling get_assets_notes and other note-related tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly scopes the tool to a single asset ('one asset') and labels it read-only, so an agent can infer when to use it. It does not explicitly name alternatives or say when not to use it, but the singular scope is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_assets_notesA

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.

Args:
    asset_ids: The candidates to check (an album's assets, a search result).

Returns: JSON with checked (how many were asked), annotated (one compact row
per asset that has notes — asset_id, last_verdict, last_reason, last_review_at,
and the reviews/actions counts) and a failed array of {asset_id, error} for the
assets that could not be read. Success is true only when nothing failed.
ParametersJSON Schema
NameRequiredDescriptionDefault
asset_idsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations at all, the description carries the full burden and delivers thoroughly: it explicitly declares 'Read-only', explains the per-asset server query batching, discloses the cost profile (no tokens on assets without notes), and defines partial-failure semantics (failed array of {asset_id, error}; 'Success is true only when nothing failed'). This is rich behavioral context far beyond the bare schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first sentence and the text is cleanly organized into Args and Returns sections. It runs a bit long (~150 words) and the Returns paragraph overlaps with the existing output schema, but given 0% parameter schema coverage and absent annotations, the length is largely justified.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a batch read tool with variable-length input, partial-failure handling, and no annotations, the description is complete: purpose, use case, cost/safety behavior, parameter semantics, return shape, and a precise success criterion. Nothing an agent needs to invoke the tool or interpret its result is left to guesswork.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% — asset_ids has only a title and array-of-string type. The description compensates fully by defining it as 'the candidates to check' with concrete examples ('an album's assets, a search result'), which tells an agent exactly what to pass and where that list comes from.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific, actionable purpose: it returns which of a batch of candidate assets already carry notes and their last verdict. The plural framing ('these assets', 'an album's assets') and the candidates-to-check semantics distinguish it from the singular sibling get_asset_notes, and no other sibling reads notes in batch, so an agent can select it confidently.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete when-to-use scenario — a cleanup pass that wants to skip assets an earlier session already reviewed — and explains the cost rationale (the server is queried once per asset, no tokens spent on unannotated ones). It does not explicitly state when not to use it or name an alternative, so it stops one step short of full exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_asset_thumbnailA

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.

Args:
    asset_id: The asset's UUID.
    size: 'thumbnail' (250px, fast) or 'preview' (1440px, higher quality). Default: 'thumbnail'.

Returns: JSON with 'data' (base64 string) and 'type' (MIME type, e.g. 'image/jpeg').
ParametersJSON Schema
NameRequiredDescriptionDefault
sizeNothumbnail
asset_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description reveals the read-only nature and the return format (JSON with 'data' and 'type'). It does not mention potential error scenarios but adequately discloses core behavior beyond what annotations would provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured: purpose sentence, usage guidance, parameter details, return format. Every sentence adds value with no extraneous text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for this simple tool, covering purpose, when to use, parameters, returns, and behavioral read-only trait. Even with an output schema existing, the description provides necessary context for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema description coverage, the description adds full meaning: asset_id is a UUID, size has two options with pixel dimensions and a default. This compensates entirely for the schema's lack of descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves a base64-encoded thumbnail for a single asset, using a specific verb and resource. It distinguishes itself from siblings by naming alternative tools for batch or album thumbnails.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use ('visually inspect one photo') and when not to (multiple photos: use get_thumbnails_batch or get_album_thumbnails). It also marks the operation as read-only, providing clear context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_calendar_heatmapA

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 the question. Read-only.

Args:
    from_date: ISO date lower bound (e.g. '2026-01-01'). Omit for the server
        default on Immich 3.x; on 2.x an omitted bound means the last 365 days,
        because an open-ended range would walk every month of the library.
    to_date: ISO date upper bound. Omit for the server default.
    heatmap_type: 'Taken' (capture date, default) or 'Upload' (when it reached
        Immich; 3.x only).

Returns: JSON with source ('immich' or 'timeline'), total and a series of
{date, count} for the days that have activity, oldest first (a day missing
from the series had nothing).
ParametersJSON Schema
NameRequiredDescriptionDefault
to_dateNo
from_dateNo
heatmap_typeNoTaken

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure, and it succeeds thoroughly. It declares read-only status, explains Immich 3.x vs 2.x behavior, documents request costs, describes defaults for omitted bounds, and clarifies that days missing from the series mean zero activity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average but every sentence earns its place: purpose, use cases, version caveats, parameter details, and return shape. It is front-loaded with the core purpose and progresses logically through args and returns, making the length justified by the complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers everything an agent needs to select and invoke this tool correctly: use cases, version-specific behavior, performance implications, parameter semantics, defaults, and the return structure. Even though an output schema exists, the description's own return description adds useful interpretation, such as oldest-first ordering and how missing days are represented.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully explain the parameters, and it does. It documents ISO date format with an example, server defaults on each version, the meaning of omitted bounds, and defines heatmap_type values 'Taken' and 'Upload' including version restrictions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a concrete one-sentence definition: 'How many photos per day, over a date range — the data behind a calendar heatmap.' It clearly identifies the queried resource, the aggregation unit, and the date-range scope, and it distinguishes itself from asset-listing tools by framing its use as a health/gap check without listing assets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use this tool: to find gaps, busy periods, or check library health 'without listing assets.' It also gives strong behavioral guidance for version differences, warns about cost on Immich 2.x, and advises passing the narrowest range that answers the question. No ambiguity remains about when this tool is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_capabilitiesA

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.

Returns: JSON with server_version, immich_major, features (the server's own
flags: ocr, smartSearch, facialRecognition, map, trash...) and quirks (plain
sentences about version-specific behaviour the caller should know). When the
API key may not read the feature flags, features is empty and a note says so;
the version and the quirks still come back.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full responsibility. It discloses that the tool is read-only, describes the degradation behavior when the API key lacks feature-flag access ('features is empty and a note says so; the version and the quirks still come back'), and explains the format of quirks. This is significant behavioral context beyond any schema or annotation, giving the agent realistic expectations of output under permission limitations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well organized with a front-loaded summary, a usage directive, and a detailed 'Returns:' section. It is slightly longer than the absolute minimum but every sentence carries useful information—none is wasted. The colon-separated list of feature flags is dense but readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the tool's purpose, usage timing, return fields, quirks format, permission degradation, and read-only nature. Given the empty input schema and existing output schema, nothing essential is missing. An agent can invoke it and interpret its output confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline of 4 applies. The description does not need to explain parameters because there are none. It focuses on return semantics, which is appropriate given the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the resource (server capabilities) and the specific aspects returned: version, feature flags, and known quirks. It goes beyond a simple verb+noun by enumerating the exact features ('OCR, smartSearch, facialRecognition, map, trash') and explicitly separates this tool from get_server_version and ping through scope. An agent can understand what this tool does and what it uniquely provides.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit timing and purpose: 'Use this once at the start of a session to learn whether OCR, smart search or facial recognition are available before offering them.' It also explains when version-specific behavior matters. It does not name alternatives or explicitly say when not to use it, but the context is clear enough for an agent to select it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_connection_infoA

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.

Returns: JSON with base_url and api_key_masked (first 8 + last 4 chars only).
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description effectively discloses read-only nature and the intentional masking of the API key. It also mentions thumbnails use base64 data URIs, adding useful behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five sentences, each serving a distinct purpose: main function, use case, security reason, read-only note, and return format. No waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and presence of output schema, the description fully explains what the tool returns and why, making it complete for an agent to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, so the description does not need to add parameter info. It correctly focuses on the return values and usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it returns the Immich base URL and a masked API key, with a specific use case of populating gallery template placeholders. It is distinct from all sibling tools, which serve different purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says when to use it (populate template placeholders) and explains the key masking for security. Could be more precise about when not to use, but the use case is well-defined.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_download_infoA

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.

Args:
    album_id: Size the whole album.
    asset_ids: Or size just these assets.

Returns: JSON with total_size_mb, asset_count and the number of archives
Immich would split the download into.
ParametersJSON Schema
NameRequiredDescriptionDefault
album_idNo
asset_idsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, but the description explicitly states the operation is read-only and that the zip is not actually built. It also describes the return content. It does not mention potential errors or authentication requirements, but the core behavioral profile is clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: purpose first, then usage guidance, then parameter explanations, then return summary. Every sentence contributes useful information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the tool's purpose, parameters, read-only behavior, and return shape, while the output schema handles exact return details. The only notable gap is that it does not explicitly state that at least one of album_id or asset_ids should be provided, which matters given the schema marks both as optional.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has no descriptions, so the description carries the full burden. It explains that album_id sizes the whole album and asset_ids sizes specific assets, which adds real meaning beyond the bare schema. However, it does not explicitly clarify whether exactly one of the two is required or what happens if both are provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states what the tool does: estimate the size of a zip before building it, for either an album or a selection of assets. It also distinguishes itself from the sibling tool download_archive by framing this as a pre-flight sizing step.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells the agent when to use this tool: warn the user about size before deciding whether to call download_archive. It also names the alternative tool and the decision context, which is strong usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_duplicatesA

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.

Args:
    album_id: Optional. Restrict to groups that touch this album; each group then also
        reports which of its assets are inside/outside the album.

Returns: JSON array of duplicate groups (each with duplicateId, assets array, and similarity scores).
ParametersJSON Schema
NameRequiredDescriptionDefault
album_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does well: it discloses that the operation is read-only, that it depends on the ML service, and that results are duplicate groups with similarity scores. It does not mention failure modes or authorization, but the key behavioral traits are covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized with a front-loaded purpose, an explicit note, an Args section, and a Returns section. Every sentence contributes meaningful information, and the format makes it easy for an agent to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given only one optional parameter and an output schema, the description fully covers the tool's behavior, input semantics, return shape, and dependency. An agent has enough context to decide whether and how to invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does for the only parameter. It explains album_id is optional, restricts to groups touching the album, and changes the returned group metadata to include inside/outside asset status.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource ('Get ML-detected duplicate asset groups') and clarifies the meaning as 'same image stored more than once.' It also explicitly distinguishes itself from related tools like get_album and get_asset_faces, so an agent can immediately tell what this tool is for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly states when to use the tool ('review potential duplicates before resolving them with resolve_duplicates'), when not to use it ('not the same person'), and names alternative tools for the other case. It also flags the dependency on the Immich ML service.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_export_previewA

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.

The result also carries `options`: every choice export_pdf accepts, with its
default. When the user asked for a PDF without saying how they want it, show
them these choices and ask (layout, cover pages, which video moments, captions)
before exporting; when they did give specs, or just want "a PDF, defaults are
fine", export directly.

Args:
    album_id: Album UUID, or
    asset_ids: Explicit asset UUIDs (search results, a selection).
    limit: Max assets (1-500, default 100).

Returns: JSON {title, count, assets:[...], warnings:[...]} or {"error": ...}.
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
album_idNo
asset_idsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It explicitly says 'Read-only', describes the returned options with defaults, and gives the return shape including error format. This is strong behavioral disclosure for a read-only preview tool. It could add what happens if both album_id and asset_ids are supplied, but the 'Pass exactly one' instruction covers the main contract.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is organized into clear sections: purpose, usage guidance, args, and return format. Each sentence adds value; the options-explanation is directly actionable and the parameter list is compact. Length is appropriate for the tool's complexity without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema, but the description still covers the practical decision flow, parameter semantics, return values, and error case. It even explains how to use the returned options to decide between preview-guided asking and direct export. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, and the description fully compensates by explaining each parameter: album_id as Album UUID, asset_ids as explicit asset UUIDs, and limit as max assets with range and default. It also adds the critical exclusivity rule that the schema alone does not convey. Every parameter is given meaningful context beyond its title.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('List'), a specific resource ('what export_pdf would include'), and the included fields (id, type, filename, date, place, people, video duration). It clearly positions this as a preview tool and distinguishes it from its sibling export_pdf. The read-only note and the exclusivity requirement further sharpen the purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: call it before looking at images and writing captions to know which assets exist. It also explains what to do with the returned options: when the user gave no PDF preferences, show the choices and ask; when they gave specs or want defaults, export directly. This effectively routes the agent between this tool and export_pdf.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_images_batchA

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.

Args:
    asset_ids: List of asset UUIDs to fetch thumbnails for.
    size: 'thumbnail' (250px) or 'preview' (1440px). Default: 'thumbnail'.
    limit: Max thumbnails to return (1-50, default 20). Only the first N IDs are fetched.

Returns: A list of image blocks suitable for visual display.
ParametersJSON Schema
NameRequiredDescriptionDefault
sizeNothumbnail
limitNo
asset_idsYes

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full transparency burden, and it explicitly marks the operation as 'Read-only.' It also discloses the limit truncation behavior ('Only the first N IDs are fetched') and the return shape, which is useful behavioral context beyond the bare schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with purpose and usage, followed by a structured Args block. Every sentence adds information: usage context, alternative routing, read-only status, parameter details, and return type. There is no filler or tautology.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only tool with three parameters and no output schema, the description is complete: all inputs are documented with defaults and behaviors, the return type is stated, and the main sibling alternative is explicitly distinguished. No critical information needed to invoke the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: asset_ids are defined as asset UUIDs, size is explained with concrete pixel values ('thumbnail' 250px/'preview' 1440px), and limit is given a range (1-50), default (20), and selection behavior. Every parameter receives meaningful semantics not present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Get thumbnails for arbitrary asset IDs') and the exact output type ('image blocks for inline visual display'). It further distinguishes itself from the sibling get_thumbnails_batch by naming the alternative and the scenario where that tool should be used instead.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says when to use this tool ('visually show search results in clients that render images') and names the alternative tool for HTML gallery generation with base64 data URIs. This gives an agent clear routing guidance between two similarly named batch thumbnail tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_map_markersA

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.

Args:
    file_created_after: ISO date lower bound (e.g. '2023-01-01').
    file_created_before: ISO date upper bound.
    is_favorite: If true, only return favorites.

Returns: JSON with total count and markers array (each with asset ID, lat, lon).
ParametersJSON Schema
NameRequiredDescriptionDefault
is_favoriteNo
file_created_afterNo
file_created_beforeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does well: it states 'Read-only' (safety), 'Returns up to 500 markers' (limit), and includes a Returns section describing the output structure. It could additionally mention pagination or authentication requirements, but for a simple read operation, these are sufficient. The description provides key behavioral traits beyond what annotations might have covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: a main sentence, use case, sibling reference, read-only and limit statements, followed by an Args/Returns section. It is concise but not sparse. The pseudo-docstring format adds clarity though some information (like read-only) is repeated. Overall, it uses space efficiently and is easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity (3 optional parameters, no required, no enums, output schema exists), the description covers all essential aspects: purpose, usage context, parameters, return structure, and limits. The output schema exists, so detailed return description isn't needed, but the description still outlines the output. The sibling differentiation also adds contextual completeness. There are no gaps that would hinder an AI agent from using the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It lists all three parameters with explanations: file_created_after and file_created_before get ISO date examples, and is_favorite is described as 'If true, only return favorites.' This adds meaningful context beyond the schema, which only provides types and defaults. The descriptions are clear but could be slightly more detailed (e.g., date inclusivity), hence a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Get GPS map markers for all geotagged assets.' It includes specific use cases (discover photo locations, build travel maps) and explicitly distinguishes from the sibling tool 'search_metadata' by noting that the sibling is for city/country searches. This provides a clear, specific verb+resource combination with sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance: 'Use this to discover where photos were taken or to build travel maps. For searching by city/country name, use search_metadata instead.' This clearly states when to use the tool and when not to, with an alternative tool named, fulfilling the usage guidelines dimension fully.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_personA

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.

Args:
    person_id: The person's UUID (from list_people or search_people).

Returns: JSON with person details (id, name, birthDate, isHidden, photoCount, thumbnailPath).
ParametersJSON Schema
NameRequiredDescriptionDefault
person_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Declares 'Read-only' which is key behavioral disclosure. With no annotations, the description carries full burden; it also lists return fields. However, it does not mention potential errors or authorization, but for a simple read operation it is sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no fluff: purpose, usage context, args/returns. Front-loaded with key information, every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a simple single-parameter tool with an output schema, the description adds necessary context about the person_id source and the fields included in the response, making it fully self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even though schema description coverage is 0%, the description adds crucial meaning: 'The person's UUID (from list_people or search_people)' explains the expected format and source, fully compensating for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Get' and resource 'full details for a specific person including name, birth date, and photo count'. It distinguishes from siblings like list_people and search_people by focusing on a single person's detailed retrieval.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states 'Use this after finding a person via list_people or search_people', providing clear context for when to use and sourcing for the required person_id parameter.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_person_thumbnailA

Get a base64-encoded face crop thumbnail for a person. Use this to visually identify a person before merging or renaming. Read-only.

Args:
    person_id: The person's UUID.

Returns: JSON with 'data' (base64 string of face crop) and 'type' (MIME type).
ParametersJSON Schema
NameRequiredDescriptionDefault
person_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, but description declares 'Read-only' and specifies return format (JSON with 'data' and 'type'). Adequate disclosure for a simple read operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two paragraphs plus parameter description, each sentence adds value. No fluff, well structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Simple operation with one parameter; description covers purpose, usage context, parameter, and output format completely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but description adds 'The person's UUID' to the parameter, clarifying its purpose beyond type/title.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource: 'Get a base64-encoded face crop thumbnail for a person.' Clear distinction from siblings like get_person or merge_people.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use: 'Use this to visually identify a person before merging or renaming.' Lacks explicit when-not-to or alternatives, but context is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_server_versionA

Get the Immich server version. Use this to check compatibility or report the running server version. Read-only.

Returns: JSON with major, minor, and patch version numbers.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It explicitly states 'Read-only' and describes the return format (major, minor, patch). This is adequate disclosure for a nondestructive, safe operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: two sentences with no wasted words. It front-loads the purpose and includes important details (read-only, return format) efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with an output schema, the description is complete. It explains the tool's purpose, behavior, and return structure, leaving no gaps for an AI agent to misunderstand.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has no parameters and schema coverage is 100%, so the baseline is 4. The description does not need to add any parameter information, and it appropriately avoids redundancy.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Get') and resource ('Immich server version'), and provides specific use cases (check compatibility, report version), distinguishing it well from sibling tools like 'ping' or others.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly mentions when to use the tool ('to check compatibility or report the running server version'). It does not provide when-not-to-use or alternatives, but the context is sufficiently clear for a simple read-only operation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_stackA

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.

Args:
    stack_id: The stack to fetch.

Returns: JSON with id, primary_asset_id and the asset list.
ParametersJSON Schema
NameRequiredDescriptionDefault
stack_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral disclosure burden. It explicitly states 'Read-only,' which is a key behavioral trait, and describes the return payload (id, primary_asset_id, asset list), giving the agent a clear expectation of side-effect-free behavior and output shape. It could add more detail about errors or not-found cases, but the core transparency is present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: a one-sentence purpose, a one-sentence usage context, a read-only flag, and a clear returns section. It is front-loaded with the most important information and contains no filler or redundant content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity tool with one parameter, no annotations, and an output schema, the description covers the essential aspects: what it does, when to use it, and what it returns. It is complete enough for an agent to invoke get_stack correctly, though a more explicit note on where to obtain stack_id (e.g., from list_stacks output) would make it fully self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides only a type and title for stack_id with 0% description coverage, so the description must compensate. The Args line 'stack_id: The stack to fetch' is essentially a restatement, but the body's instruction to use the tool 'after list_stacks' implies that stack_id originates from list_stacks output, adding contextual meaning beyond the schema. Still, the parameter description is minimal and could explicitly state the source or format.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool fetches a single stack and its assets, using a specific verb ('get') and resource ('stack'). It explicitly distinguishes itself from list_stacks by noting it returns a single stack's full asset list, and positions it relative to create_stack, so an agent can select it correctly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides concrete when-to-use guidance: '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.' This establishes the correct workflow and ties to sibling tools without needing further inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_statisticsA

Get library statistics. Use this for a quick overview of library size without listing individual assets. Read-only.

Returns: JSON with total photo count, video count, and storage usage in bytes.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, but description declares read-only and describes return format (photo count, video count, storage usage). Adequate disclosure for a simple statistics tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences, front-loaded with purpose, then usage, then return format. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity and presence of output schema, the description covers purpose, usage context, and return structure fully. No missing information for a read-only statistics tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters in schema, so baseline 4 applies. Description does not need to add parameter info.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb-resource (Get library statistics) and distinguishes from siblings by noting it's for a quick overview without listing individual assets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use (quick overview) and implies when not (if you need individual assets, use list_assets). No explicit exclusions, but sufficient for context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_tagA

Get details for a specific tag. Use this to inspect a tag's properties. Read-only.

Args:
    tag_id: The tag's UUID (from list_tags).

Returns: JSON with tag id, name, color, and usage count.
ParametersJSON Schema
NameRequiredDescriptionDefault
tag_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the tool is 'Read-only,' a key behavioral trait. It also outlines the return structure, though it could mention that tag_id is required and must be valid.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with three lines covering purpose, usage, and return value. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one parameter, output schema present), the description fully covers what the tool does, how to use the parameter, and what is returned.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description compensates by explaining that tag_id is 'The tag's UUID (from list_tags),' guiding the agent on how to obtain the ID.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get details for a specific tag,' specifying the precise verb and resource. This distinguishes it from sibling tools like list_tags (list all tags) and create_tag.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description advises 'Use this to inspect a tag's properties. Read-only,' clearly indicating the tool's context. It does not explicitly exclude other tools, but the purpose is clear enough for appropriate selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_thumbnails_batchA

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.

Args:
    asset_ids: List of asset UUIDs to fetch thumbnails for.
    size: 'thumbnail' (250px) or 'preview' (1440px). Default: 'thumbnail'.
    limit: Max thumbnails to return (1-50, default 20). Only the first N IDs are fetched.

Returns: JSON with thumbnails array (each with asset_id, base64 data, filename, date).
ParametersJSON Schema
NameRequiredDescriptionDefault
sizeNothumbnail
limitNo
asset_idsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Mentions read-only nature and return format. No annotations provided, so description carries burden. Could add details on authentication or rate limits, but covers key behavioral traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise, well-structured with Args and Returns sections. Every sentence adds value; no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for a batch thumbnail tool with output schema. Explains return structure and parameter constraints. No missing context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All three parameters are explained with details not in schema: asset_ids as UUIDs, size with pixel dimensions, limit with range and behavior. Compensates for 0% schema description coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it retrieves base64-encoded thumbnails for arbitrary asset IDs without needing an album. Distinguishes from siblings like get_album_thumbnails and get_asset_thumbnail.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly describes when to use (visual display of search results or ad-hoc sets) and when not to (use album-based for albums, single for single photos). Names alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_timeline_bucketA

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.

Args:
    time_bucket: The bucket key exactly as get_timeline_buckets returned it
        (e.g. '2026-03-01').
    album_id: Only assets in this album.
    person_id: Only assets showing this person.
    tag_id: Only assets carrying this tag.
    is_favorite: If true, only favorites.

Returns: JSON with an assets array; each row has asset_id, date, is_image,
is_favorite, duration, city and country.
ParametersJSON Schema
NameRequiredDescriptionDefault
tag_idNo
album_idNo
person_idNo
is_favoriteNo
time_bucketYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the behavioral disclosure burden. It explicitly marks the tool as 'Read-only' and describes the return format (JSON with an assets array and listed fields), which provides useful behavioral transparency. It doesn't mention pagination limits or error behavior, but that's not a major gap for a read-only bucket fetch.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the tool's purpose and usage context, then cleanly lists arguments and return shape. Every sentence adds information and there is no fluff or repetition of schema defaults. It is appropriately sized for a tool with five parameters and no schema descriptions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the core invocation contract: exact bucket key, optional filters, read-only behavior, and return fields. Given the output schema exists, it doesn't need to over-explain return values. A minor gap is that it doesn't state how multiple filters combine (e.g., AND vs OR), but the tool is otherwise complete enough to be called correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully explain the parameters. It does: time_bucket must be the exact key from get_timeline_buckets (with example), and each optional ID/filter parameter is explained with its meaning. This goes well beyond the bare schema property names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies what the tool returns—the assets for one month bucket—and explicitly ties it to get_timeline_buckets, distinguishing this retrieval tool from its sibling. The phrase 'Use the two tools together to walk a library month by month' clarifies the tool's specific role in the workflow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a clear usage context: pair with get_timeline_buckets to navigate a library month by month and avoid expensive searches. It does not explicitly state when not to use it or compare against alternative search tools, but the intended workflow is evident.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_timeline_bucketsA

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.

Args:
    album_id: Only count assets in this album.
    person_id: Only count assets showing this person.
    tag_id: Only count assets carrying this tag.
    is_favorite: If true, only count favorites.
    order: 'desc' for newest month first (the default), 'asc' for oldest first.

Returns: JSON with total_buckets and a buckets array of {timeBucket, count},
newest month first unless order='asc'.
ParametersJSON Schema
NameRequiredDescriptionDefault
orderNo
tag_idNo
album_idNo
person_idNo
is_favoriteNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full disclosure burden and meets it: it declares 'Read-only,' characterizes the call as cheap ('one cheap call'), and discloses ordering defaults ('newest month first unless order="asc"') plus per-filter counting semantics for every argument. This gives an agent a reliable safety, cost, and behavior picture that the empty schema and absent annotations do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a memorable summary, followed by a single purpose-driven usage sentence, then compact Args/Returns blocks. Given that the schema provides zero descriptions, every section earns its place, and the structured line layout keeps it scannable without bloat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no annotations and an empty schema, an agent can select and invoke this tool correctly: all parameters are optional and documented, defaults are explicit, and the return shape (total_buckets plus buckets array of {timeBucket, count}) is stated even though an output schema exists. The only minor omission, the concrete type of timeBucket, is covered by the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the tool description must carry all parameter meaning, and it does: a documented Args block explains all five parameters (album_id, person_id, tag_id, is_favorite, order), including what each filter counts and the order value/default. This fully compensates for the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific resource and behavior: 'Month-by-month map of the library: one bucket per month with its asset count,' which clearly defines an aggregation tool over time buckets. It implicitly distinguishes itself from the sibling get_timeline_bucket (singular) by describing a full month-by-month map, and frames its role as a pre-fetch navigation aid rather than a per-item lookup.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use this before fetching assets' gives an explicit point-in-workflow trigger, and the description names concrete use cases: 'finding gaps, busy periods, or navigating a large library without paging through everything.' It does not name specific alternative tools or state when not to use it, so it stops just short of full exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_video_framesA

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 estimated_tokens instead of images: show it to the user and call again with confirm=true only if they agree. Hard cap 120 per call. For base64 JSON with timestamps use get_video_frames_json. Read-only.

Args:
    asset_id: The video asset's UUID.
    count: Frames evenly spaced over the segment (default 6). Ignored when interval > 0.
    size: 'thumbnail' (250px, ~1.6k tokens per frame) or 'preview' (1440px, ~6.4k). Default 'thumbnail'.
    start: Segment start in seconds (default 0).
    end: Segment end in seconds (0 = to the end).
    interval: One frame every N seconds instead of count (1 = one per second, the maximum granularity).
    confirm: Required (true) when more than 12 frames would be produced; ask the user first.
    sheet: Pack the frames into contact sheets (30 per image, timestamps burned in):
        a long video becomes one or two images instead of dozens, so no
        confirmation is needed. Use it to skim, then cut the moments that matter.

Returns: JPEG image blocks in time order, or JSON (confirmation plan / error).
ParametersJSON Schema
NameRequiredDescriptionDefault
endNo
sizeNothumbnail
countNo
sheetNo
startNo
confirmNo
asset_idYes
intervalNo

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full responsibility for behavioral disclosure. It does so thoroughly: it is read-only, it downloads the video and cuts frames locally, it depends on PyAV 1.7.1+ or ffmpeg, every frame becomes one model image, and frames above 12 trigger a confirmation plan rather than images. It also exposes the hard cap and token estimates, giving the agent a strong model of cost and side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence earns its place: it front-loads the core purpose, then explains the workflow, limits, alternative format, and each argument in a scannable Args block. Technical details like the PyAV dependency and token estimates are not padding; they affect invocation decisions. The structure mirrors how an agent actually needs to reason about the call.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 8 parameters, no output schema, and no annotations, this description is remarkably complete. It covers what the tool returns (JPEG image blocks in time order, or JSON), when confirmation is required, the hard cap, the sheet alternative, and the sibling tool for timestamped base64 JSON. An agent has everything needed to select this tool and invoke it correctly in the tricky >12-frames case.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate entirely — and it does. Every parameter gets an explanation beyond its schema title: asset_id is the video asset's UUID, count is evenly spaced frames, size includes pixel dimensions and approximate token cost, start/end are seconds, interval means one frame every N seconds, confirm is required past 12 frames, and sheet packs frames into contact sheets with timestamps. This is exemplary compensation for a schema with no parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: "Get frames of a video as image blocks, to 'watch' a clip." It clearly distinguishes itself from the sibling by explicitly naming get_video_frames_json as the alternative for base64 JSON with timestamps. This is far more than a tautology and fully differentiates the tool's scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit workflow: try 6 frames first, narrow with start/end, or use interval down to 1 second. It also gives a decision rule for >12 frames (show the JSON plan, call again with confirm=true only if the user agrees), states the hard cap of 120, and names the alternative tool for a different return format. This is complete, actionable usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_video_frames_jsonA

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.

Args:
    asset_id: The video asset's UUID.
    count: Frames evenly spaced over the segment (default 6). Ignored when interval > 0.
    size: 'thumbnail' (250px, ~1.6k tokens per frame) or 'preview' (1440px, ~6.4k). Default 'thumbnail'.
    start: Segment start in seconds (default 0).
    end: Segment end in seconds (0 = to the end).
    interval: One frame every N seconds instead of count (1 = one per second, the maximum granularity).
    confirm: Required (true) when more than 12 frames would be produced; ask the user first.

Returns: JSON {asset_id, duration, backend, count, frames:[{timestamp, data, type}]},
a confirmation plan {confirm_required, frames_planned, estimated_tokens, ...}, or {"error": ...}.
ParametersJSON Schema
NameRequiredDescriptionDefault
endNo
sizeNothumbnail
countNo
startNo
confirmNo
asset_idYes
intervalNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and handles it well: it states read-only behavior, the confirmation gate above 12 frames, the 120-frame cap, parameter interactions (interval overrides count), and the exact return shapes including confirmation and error objects. This is unusually thorough behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a one-sentence summary, then organized into Args and Returns sections. Every line carries needed information: parameter semantics, defaults, constraints, and output structure. It is dense but not bloated, and the structure makes it easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given seven parameters, zero schema descriptions, and no annotations, the description covers all necessary invocation details, including the confirmation flow and return shapes. The presence of an output schema reduces the need to document return values, yet the description still provides an accurate summary, making the tool fully self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description fully compensates by documenting every parameter with type, default, meaning, and constraints. It adds valuable semantics like '600px preview is ~6.4k tokens per frame' and 'interval is mutually exclusive with count', which the bare schema cannot convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns video frames as base64 JPEGs with timestamps, which is specific and distinguishes it from the sibling get_video_frames. It also names the intended use cases (HTML galleries and skills) and explicitly references the sibling to clarify the relationship.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear context for when this tool is appropriate by mentioning HTML galleries and skills, and by framing it as a read-only JSON-returning variant of get_video_frames. It does not explicitly state 'use this instead of get_video_frames when...', but the intended use is clear enough without exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_activitiesA

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.

Args:
    album_id: The album whose activity to read.
    asset_id: Only activity on this asset within the album.
    activity_type: 'comment' or 'like'. Omit for both.

Returns: JSON with total and an activities array (id, type, comment, asset_id,
user name, created_at).
ParametersJSON Schema
NameRequiredDescriptionDefault
album_idYes
asset_idNo
activity_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden, and it does well by explicitly stating 'Read-only' and describing the JSON return shape including total and an activities array with fields. It does not mention pagination, error cases, or auth requirements, but for a simple list operation the disclosed behavior is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: a plain-language summary first, then a clear Args section, then a Returns section. Every sentence adds information, and the read-only note is placed early where it matters most.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully covers the three parameters, the purpose, the read-only nature, and the return format. Given that the tool has only one required parameter and the output schema is already available, nothing essential is missing for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does thoroughly. Each parameter is explained: album_id identifies the album, asset_id restricts to a specific asset, and activity_type accepts 'comment' or 'like' with omission meaning both. This adds meaningful semantics beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool reads comments and likes on a shared album or a specific photo within it. The phrase 'Use this to read what the people an album is shared with have said' is a specific verb-plus-resource statement that separates it from create/delete activity siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear guidance on when to use the tool: to read activity on an album or one of its photos. It does not explicitly name alternatives or state when not to use it, but the read-only framing and the focus on social activity make the intended context unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_albumsA

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.

Args:
    shared: true = only shared albums, false = only non-shared, omit = all albums.

Returns: JSON with total count and albums array (each with id, name, description, assetCount, shared status).
ParametersJSON Schema
NameRequiredDescriptionDefault
sharedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It declares the operation as read-only, which is key. It also describes the return format. However, it does not mention potential pagination limits if 'all' is large, but given the context, this is minor.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured with a clear purpose and Args/Returns sections. However, the Args section slightly duplicates information already in the description, but overall efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the low complexity (1 optional param) and the presence of an output schema, the description covers all essential aspects: purpose, usage guidance, parameter behavior, and return format. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds significant meaning for the single parameter 'shared': true for shared, false for non-shared, omit for all. This is much more informative than the schema's type (boolean or null) and covers all possible values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists all albums with summary info. It distinguishes from siblings by specifying it's for discovery and finding album IDs, which contrasts with other tools like get_album for details or create_album for adding.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use: to discover existing albums before creating new ones or to find an album ID. Also declares it's read-only, implicitly guiding away from mutation tasks.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_assetsA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
sizeNo
asset_typeNo
is_trashedNo
is_archivedNo
is_favoriteNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it delivers: it declares 'Read-only', documents the tri-state behavior of favorite/archived flags, and exposes the Immich-specific quirk that trashed items and active library items are never mixed. This goes well beyond a bare action statement, though it could add more detail on filter interactions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is stated first, followed by a compact Args block that earns its place. Every sentence conveys operational value, and there is no repetition of schema defaults that are already visible.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the operation, filters, pagination, and a summary of return fields. An agent has enough to invoke list_assets correctly and interpret the result, especially given the output schema is also provided. No critical guidance is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate fully, and it does. Every one of the six parameters is explained with accepted values, defaults, and omission behavior. This makes the tool callable without needing to infer anything from ambiguous schema titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'List assets with simple filters', and clarifies it is for browsing, not search. It also explicitly distinguishes itself from search_metadata and search_smart, so an agent can tell siblings apart at a glance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states exactly when to use this tool ('browse the library by status or type') and names the alternatives for finding specific content ('search_metadata (structured) or search_smart (visual AI)'). This is explicit when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_memoriesA

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).
ParametersJSON Schema
NameRequiredDescriptionDefault
sizeNo
for_dateNo
is_savedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly states 'Read-only' and describes the return shape in detail. It also clarifies that each memory includes a trimmed assets list, which is useful behavioral context. It does not cover error behavior or authentication, but for a simple read-only list tool the disclosure is solid.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear purpose statement, a usage hint, a compact Args section, and a Returns section. Every sentence adds information; there is no redundancy or fluff. The most important information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with three optional parameters and an output schema, the description covers all the essential information: what the tool does, when to use it, the meaning of each parameter, and what fields the response contains. Nothing critical is missing for an agent to call it correctly. Minor omissions like null filter behavior or error handling are not substantial given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, yet the description fully compensates: every parameter is explained with its semantics. for_date is described as an ISO date with behavior and an example, is_saved is defined for true/false, and size is given a default and meaning. This far exceeds what the bare schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource ('List memories') and clarifies what memories are in Immich's domain: 'on this day' collections of photos from past years. This clearly distinguishes the tool from sibling tools like list_assets, create_memory, update_memory, and delete_memory by defining the unique concept it operates on.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a concrete use case: 'Use this to build a tal día como hoy story, album or PDF.' It clearly implies when to call this tool, but it does not explicitly mention when not to use it or name alternatives like list_assets for raw asset listing. This is clear context without exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_partnersA

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).
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states the operation is read-only, explains the partner-sharing model ('each side keeps its own library but can see the other's'), and describes the returned structure. This is solid transparency for a simple no-parameter listing operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded, opening with the core question the tool answers. The partner-sharing explanation and return-format note each add distinct value, with no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no parameters and an output schema, the description is complete. It clarifies the domain concept, confirms read-only behavior, and summarizes the response shape, so an agent has enough to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so no parameter documentation is needed. The description instead adds useful semantic detail about what the result represents, which is appropriate for a parameterless tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly defines the tool as querying partner-sharing relationships: 'Who shares their library with this account, and who this account shares with.' It also distinguishes this from other listing tools by explicitly describing the partner-sharing concept, so an agent can tell it apart from list_people, list_users, and list_shared_links.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when this tool is relevant: it is the family/partner-sharing listing operation, and 'Read-only' signals it is a query rather than a mutation like create_partner or update_partner. It does not explicitly name alternatives or state when not to use it, but the context is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_peopleA

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).
ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
sizeNo
with_hiddenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description states the tool is 'Read-only' and describes the return format, but does not disclose potential rate limits, authentication requirements, or any side effects beyond the listed behavior. However, for a simple read operation, the level of disclosure is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise yet comprehensive, with a clear structure: purpose, usage note, parameter block, and return note. Every sentence adds value, and the length is appropriate for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the low complexity and the presence of an output description (though no formal output schema), the description covers all contextual needs: what the tool does, when to use it, parameters, and return format. It is fully self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds meaningful descriptions for each parameter (page, size, with_hidden) beyond the schema's basic type/default definitions. The schema had 0% coverage, but the description fully compensates by explaining the semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('list'), the resource ('all recognized people'), and the context (face clusters in the library). It also distinguishes the tool from its sibling `search_people`, avoiding ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells when to use this tool ('browse who appears... or find a person's ID') and when not to ('For searching by name, use search_people instead'). This provides clear usage context and alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_stacksA

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).
ParametersJSON Schema
NameRequiredDescriptionDefault
primary_asset_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden and clearly declares the operation is read-only. It also describes the return JSON shape, which helps an agent know what to expect. It omits details like limits or ordering, but these are not required for a simple read-only listing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-organized, with separate lines for action/usage, arguments, and return value. Every sentence contributes value, and the main use cases are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one optional parameter and no required arguments, the description covers the action, use cases, parameter filter, and return shape. An output schema exists, so the return description is a nice addition. The only minor gap is not explicitly stating what happens when the filter is omitted, but that is easily inferred.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description compensates by explaining the one parameter: 'Only the stack fronted by this asset.' This adds real meaning beyond the schema's type and default. It is concise but lacks an example, so a 4 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the action ('List every stack') and the resource (stacks in the library). It also gives practical use cases, which helps an agent understand when to call it. However, it does not explicitly distinguish itself from the sibling get_stack, so it stops short of full differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states when to use the tool: to see existing groupings before creating new stacks and to find a stack's id. It does not mention when not to use it or alternative tools, so it gets a 4 rather than a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_tagsA

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).
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Declares 'Read-only' and describes the return format (JSON with total count and tags array). With no annotations provided, this sufficiently discloses the tool's non-destructive nature and output structure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences: purpose, usage guidance, return format. No extraneous words, well-structured, and front-loaded with key information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers what, when, and return format. For a zero-parameter tool with an output schema, this is sufficient. Missing details on error handling or edge cases, but acceptable for a simple list operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0 parameters, so baseline is 4. The description adds no parameter details, but none are needed. It appropriately implies no inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List all tags in the library' with a specific verb and resource. It further explains usage context ('discover existing tags before creating new ones or to find a tag ID'), effectively distinguishing it from sibling tools like create_tag or get_tag.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly advises using it to discover existing tags before creating new ones or to find tag IDs. While alternatives are not named, the context implies when to use this tool vs. others (e.g., get_tag for a single known tag).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_usersA

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}.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly states the operation is read-only and clarifies the scope of results to users visible on the server. It also describes the response shape, which is useful behavioral context beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded: it states the resource, the use case, the read-only nature, and the response format in a few short sentences. Every sentence adds value without unnecessary elaboration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter list operation, the description is complete: it explains what is returned, why an agent might want to call it, and that it is safe and read-only. No critical information needed for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the parameter semantics dimension is trivially satisfied. The description correctly omits parameter details because none exist, and the return structure is summarized to compensate for the empty input schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states what the tool does: it lists the users visible on the Immich server. It goes beyond the tool name by explaining the intended use case and scoping the results to visible users, which distinguishes it from potentially similar operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete guidance on when to use it: to find the id needed by create_partner or to see who could be shared with. It does not explicitly name alternatives or when not to use it, but the use cases are clear enough for an agent to decide.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

merge_peopleA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNo
merge_idsYes
person_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden, and it does so thoroughly: it discloses destructiveness, irreversibility, permanent deletion of merged persons, the transfer of faces, the preview behavior when confirm is false, and the side effects with confirm=true. The description is explicit that without confirm=true nothing happens, which is essential for an agent to avoid accidental data loss.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but organized: a clear purpose sentence, a behavioral warning, a workflow explanation, then a compact Args list and Returns line. Every sentence earns its place. Slightly long, but the destructive complexity justifies the length; the Args section could arguably be tightened, but it remains highly scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that there are no annotations and no schema descriptions for parameters, this description provides everything an agent needs: purpose, when to use, destructive consequences, the confirm gate, parameter semantics, and return shape. The output schema exists and the description even names the preview keys, making the return behavior clear without redundantly restating the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain all three parameters, and it does: person_id is the target UUID that keeps faces, merge_ids are the persons absorbed and permanently deleted, and confirm is the boolean switch between preview and execution. It also mentions the default behavior (nothing happens without confirm=true) and the return structure, which adds meaning far beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Merge multiple person clusters into one') and adds the crucial scoping detail that it is for the case where the same real person has been split into multiple face clusters. It is clearly distinguished from siblings like update_person, reassign_face, or delete_assets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use it ('when the same real person has been split into multiple face clusters') and explains the confirm=true vs confirm=false workflow, telling the agent to pass true only after the user has seen the preview and agreed. It also warns about irreversibility, which serves as a clear exclusion criterion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pingA

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).
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It clearly states the operation is read-only and describes the return format ('server' status with 'pong' if healthy). This fully informs the agent about behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise with no wasted words. It front-loads the purpose and provides necessary details in just three lines.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (0 parameters, straightforward output), the description covers all needed aspects: purpose, usage timing, read-only nature, and return format. It is fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema is empty (no parameters). The description adds no parameter details but compensates by explaining the return value, which is relevant since the agent must understand what the tool outputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'check' and the resource 'Immich server connectivity'. It distinguishes itself from sibling tools by indicating it's a readiness check, not a data manipulation operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to use this to verify reachability before other operations, providing clear context. It does not mention alternatives, but due to the tool's simplicity, this is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reassign_faceA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
face_idYes
person_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Discloses side effect: 'permanently changes face-to-person mapping' and return type. Lacks details on permissions or reversibility but acceptable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences with clear structure: purpose, usage, args, returns. No wasted words; front-loaded with main action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple mutation tool with 2 required params and output schema present, description covers purpose, usage, side effect, and parameter semantics. Could mention error conditions or idempotency, but adequately complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% (only titles), so description compensates well. Explains face_id as 'from get_asset_faces results' and person_id as 'correct person UUID', adding meaning beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the verb 'reassign' and the resource 'face to person', with explicit use case for correcting recognition mistakes. Distinguishes from sibling tools like 'merge_people' or 'update_person' which operate on different entities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Specifies when to use: 'correct face recognition mistakes' and provides prerequisite: 'Get face_id from get_asset_faces first'. Lacks explicit when-not-to-use or alternatives, but context is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

record_actionA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes
detailNo
asset_idsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and delivers: it discloses the side effect ('writes the plugin's metadata key on each asset'), scopes it ('other apps' keys are untouched'), and explains partial-failure semantics ('Success is true only when nothing failed', with a failed array of {asset_id, error}). This is exactly the behavioral context an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, the side effect follows immediately, then a tight Args/Returns structure. Every sentence earns its place — the examples in Args serve as operational guidance, not padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-parameter tool with no annotations and no schema descriptions, the description is complete: purpose, side effects, parameter semantics, return format, and success criteria are all covered. The only minor gap is whether the metadata key is overwritten or appended on re-record, which is negligible against the overall coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate — and it does. The Args section gives all three parameters real meaning: asset_ids ('the assets the action touched'), action with example labels ('added_to_album', 'date_fixed', 'rotated'), and detail with concrete content guidance ('album name, previous value, the user's request'). Fully compensates for the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Remember something the plugin did to assets') and names the purpose ('for audit or undo'), with concrete examples of what gets recorded. This clearly positions it as a logging/audit tool distinct from the many sibling mutation tools (rotate_assets, tag_assets, delete_assets) and undo tools (restore_assets, revert_asset_edits).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context for when to use it: after the plugin changes assets, to preserve prior state and rationale for audit or undo. The examples (which album, previous date, why rotated) make the trigger scenario concrete. It doesn't explicitly name exclusions or alternative tools, but no sibling fills this recording role, so the context is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_assets_from_albumA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
album_idYes
asset_idsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It clearly states side effects: 'modifies album membership' and confirms no deletion. It also describes the return value structure. This adequately discloses behavior for a non-destructive operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is relatively short (three sentences plus Args and Returns sections). Every sentence adds value: purpose, side effect, parameter details, output. Could be slightly more compact, but no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations and no provided output schema, the description covers all necessary aspects: what the tool does, parameter roles, side effects, and return value. It is self-contained and sufficient for correct selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% coverage (no descriptions). The description fully explains both parameters: album_id as 'Album UUID' and asset_ids as 'List of asset UUIDs'. It also describes the output, adding significant meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Remove assets from an album without deleting them.' It specifies the resource (album), verb (remove), and key constraint (assets remain in library and other albums). This distinguishes it from siblings like delete_assets and add_assets_to_album.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides a clear use case: 'Use this to un-curate mistakenly added assets.' While it doesn't explicitly list when not to use or alternative tools, the use case is specific and implies context. Sibling differentiation is not explicit but is evident from the description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_partnerA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden of disclosing side effects. It explicitly notes that the user's own photos are not touched and that the side effect is revoking their access. This is valuable transparency for a mutating operation and goes beyond merely restating the tool's name.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the main action. Every sentence earns its place: the action, the non-destructive clarification, the side effect, the argument explanation, and the return value. There is no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter tool, the description covers the action, the effect on the target user, the argument semantics, and the return type. Nothing critical is missing for an agent to invoke it successfully.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description compensates by explaining 'user_id: The user to unshare with.' This adds role semantics beyond the bare schema property. For a single required parameter, this is sufficient guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Stop sharing this account's library with a user.' This is a specific verb-resource pairing that distinguishes it from sibling tools like create_partner, update_partner, and list_partners. It also reassures that the user's own photos are untouched, which sharpens the purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool: when the account should no longer share its library with a given user. It does not explicitly name alternatives or exclusions, but the action is unambiguous enough that an agent can select it appropriately among the partner-related siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resolve_duplicatesA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
groupsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description discloses a key side effect: moving rejected duplicates to trash. It also notes recoverability via restore_assets. This provides essential behavioral insight beyond basic mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three concise sentences plus a structured Args block. Every sentence adds value, and the purpose is front-loaded. No redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the single parameter and presence of an output schema, the description covers all necessary aspects: purpose, when to use, parameter structure, side effects, and return format. It references sibling tools appropriately.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero description coverage (only 'type: object, additionalProperties: true'). The description fully compensates by detailing the exact fields required: duplicateId, assetIds, trashIds, with data types and source references. This is indispensable for correct invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool resolves duplicate groups by choosing which assets to keep and trash, explicitly referencing the parent tool get_duplicates, which distinguishes it from sibling tools like merge_people or delete_assets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear context to use this after reviewing results from get_duplicates, and mentions that trashed assets can be recovered via restore_assets. While it doesn't explicitly state when not to use, the guidance is sufficient for typical workflows.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

restore_assetsA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
asset_idsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses the side effect of moving assets out of trash. However, no annotations are present, so the description carries the full transparency burden. Could mention error handling or permissions, but the side effect is a key behavioral detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences plus structured Args/Returns. Front-loaded with main purpose, no wasted words. The important guidance about selective recovery is placed early.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the essential information: what it does, when to use, side effect, parameter, and return value. Could be improved by mentioning validation or whether the operation is idempotent, but it's sufficient for safe usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description explains that 'asset_ids' is a list of asset UUIDs currently in trash, which adds context beyond the schema's type definition (array of strings). With 0% schema description coverage, the tool description effectively documents the parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the verb 'restore', resource 'assets from trash', and destination 'active library'. Distinguishes from sibling 'restore_trash' by specifying selective recovery vs mass restore.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use this tool (selective recovery) and when not to use it (use restore_trash for everything at once), directly naming the alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

restore_trashA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, but description discloses side effect (moves all trashed assets back to active library) and return format (JSON success confirmation). Could mention if operation is reversible or requires permissions, but adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences with no wasted words. First sentence states purpose, second provides usage guidance, third adds behavioral detail and return info.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless tool with an output schema, the description covers purpose, use case, side effect, and return format. No obvious gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has no parameters; description clarifies that it acts on all trashed assets globally, implying no user choice. No param info needed, baseline high.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Restore ALL trashed assets back to the library' with specific verb and resource, and distinguishes from sibling tool 'restore_assets' which restores specific assets only.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use (undo accidental bulk deletion) and provides alternative (restore_assets for specific assets).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reverse_geocodeA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
latYes
lonYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the sole burden of behavioral disclosure. It compensates well by explicitly stating the operation is read-only, uses offline geodata, and contacts no external service, which are key behavioral traits for an agent deciding whether to call it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: a one-line purpose, a usage context, an explicit read-only note, and clearly separated Args and Returns sections. Every sentence adds information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter read-only lookup, the description is complete: it explains what the tool does, when to use it, what the inputs mean, and what the response shape is. No critical information for invoking it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must define the parameters itself. It does so by stating lat and lon are in decimal degrees, adding meaningful semantic detail beyond the schema's bare 'number' type. It could add ranges or validation expectations, but the core meaning is clear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb-resource pair: 'Resolve GPS coordinates to a place name using Immich's own offline geodata.' It clearly distinguishes itself from sibling search tools by noting the offline nature and by tying its use to get_map_markers or asset EXIF coordinates.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance on when to use the tool: to name the location of a marker from get_map_markers or an asset's EXIF coordinates. It does not mention explicit alternatives or exclusions, so it stops short of a 5, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

revert_asset_editsA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
album_idNo
asset_idsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses side effect: 'Side effect: deletes all edit records for the assets.' No annotations provided, so description carries the full burden. This is sufficient for a revert operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is moderately concise, but includes a separate 'Args:' section that largely repeats parameter info from the schema description (which is absent). Could be tightened, but structure is logical: purpose, usage, args, returns.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description provides return format ('JSON with reverted/failed counts'). Mentions side effect and mutual exclusivity. No annotations, but behavioral side effect is covered. Lacks error handling info, but acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but description adds full meaning: asset_ids (list of UUIDs, mutually exclusive with album_id) and album_id (revert all in album). Also clarifies the mutual exclusivity and provides argument context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses specific verb 'remove' and resource 'non-destructive edits (rotation, crop, mirror) from assets', clearly distinguishing from siblings like rotate_assets. It explicitly states the restoration of original appearance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit usage context: 'Use this to undo rotate_assets or any other display transforms.' Also explains mutual exclusivity of asset_ids and album_id. Lacks explicit when-not-to-use, but the non-destructive scope is implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

review_assetsA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNo
verdictYes
asset_idsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and exceeds it: it discloses the write side effect ('writes the plugin's metadata key on each asset; other apps' keys are untouched') and the partial-failure semantics ('Success is true only when nothing failed'). This is precisely the behavioral context an agent needs beyond bare schema fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average but front-loads purpose and usage before side effects, args, and returns, and every section earns its place. The Args/Returns layout is scannable; a slight tightening of the example prose would make it a 5, but there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-parameter, 2-required write tool with zero schema descriptions and no annotations, the description is fully self-sufficient: purpose, when-to-use, side effect, all parameter semantics, and return shape with failure handling are covered. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must supply all parameter meaning — and it does critically, by enumerating the valid verdict values ('keep', 'delete_candidate', 'duplicate_of', 'needs_check') that the schema omits as an enum. It also adds format guidance for reason with a concrete example and a 'short and concrete beats long' rule.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific purpose — persisting a review verdict with its reason so later sessions skip re-analysis — with a clear resource ('assets') and a precise outcome ('the why survives'). It also differentiates from siblings by noting tags are Immich-visible while these notes are not, which distinguishes it from tag_assets and record_action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use this after deciding what to do with a photo in a cleanup or duplicate pass' gives explicit when-to-use context, and the tag comment provides a real selection condition (user must see the state in Immich). It does not explicitly name sibling tools such as tag_assets or resolve_duplicates as alternatives, so exclusion guidance is implied rather than exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rotate_assetsA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
angleNo
album_idNo
asset_idsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description fully discloses behavioral traits: non-destructive, no file modification, display transform only, edits are written to Immich and accumulate, side effect of persisting rotation. With no annotations provided, the description carries the full burden and meets it exceptionally.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear purpose statement, usage guidance, and an Args section. It is front-loaded with key information. However, a few extra words ('Provide EITHER...') could be trimmed without losing meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, three parameters with mutual exclusivity, and an output schema (implied), the description covers purpose, behavior, parameter usage, return value, and side effects. It is complete and leaves no significant gaps for an agent to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, so the description compensates fully by explaining each parameter: angle (multiples of 90, default 90), asset_ids (list of UUIDs, mutually exclusive with album_id), album_id (string, mutually exclusive with asset_ids). It adds constraints and defaults not present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (non-destructive clockwise rotation), the target (one or more assets), and the purpose (fix orientation issues). It distinguishes from related tools like revert_asset_edits and delete_assets, making its role unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool ('fix orientation issues') and mentions revert_asset_edits as an alternative for undoing. It also clarifies mutual exclusivity of asset_ids and album_id. However, it does not explicitly state when not to use it or compare to other rotation-like tools (none exist among siblings).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_citiesA

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}.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full behavioral burden. It explicitly states the operation is read-only, describes the one-representative-asset behavior, and specifies the return shape. This goes beyond the tool name and gives an agent reliable behavioral expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured, with the core purpose first, a useful sibling comparison second, and return format last. Every sentence adds value and there is no redundant or vague wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only search operation with an output schema, the description is complete. It covers what is returned, how cities are selected, the comparison to a sibling tool, and the read-only nature, leaving no meaningful gap for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema coverage is 100%, so there is no parameter documentation burden. Per the baseline for zero-parameter tools, a 4 is appropriate since nothing more is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns every city in the library, with one representative asset per city. It also differentiates itself from search_explore by noting the lack of a minimum-asset threshold, making its purpose specific and distinct among sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly identifies when to use this tool: to answer 'which places are in this library?'. It also contrasts with search_explore, giving a concrete alternative and explaining the key difference, which is strong usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_exploreA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and meets it: it explicitly declares 'Read-only,' so the agent knows this is a safe read. It also discloses a non-obvious edge case — cities only appear once they hold at least 5 assets, so small libraries can come back empty — and explains the 'one representative asset per city/concept' selection behavior. This goes well beyond what structured fields could have conveyed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, followed by usage guidance, then edge-case and safety notes, each earning its place. The only redundancy is the 'Returns:' section, which partially overlaps with the existing output schema — though it does add a concrete example field name ('exifInfo.city') and the asset_id pairing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only tool with an output schema, nothing an agent needs to invoke it correctly is missing: semantics, usage timing, edge-case empty returns, and safety are all covered. The missing annotations are fully compensated by the explicit 'Read-only' statement and the small-library warning. The output schema handles the detailed return structure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters and the schema's properties object is empty, so the 0-param baseline of 4 applies and there is no parameter gap to compensate for. The description instead uses the space to clarify what the response represents, which is appropriate. No parameter-level meaning is missing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource — 'Overview of what the library contains, grouped by explore field' — and grounds it in Immich's Explore page. It answers 'what is in here?' in one call, clearly distinguishing this library-wide overview from the targeted search_* siblings such as search_metadata and search_cities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use this to get oriented in an unknown library before searching for anything specific' is an explicit, actionable when-to-use instruction. It implies a temporal when-not — once you want something specific, move on to targeted search tools — but it never names an alternative sibling, leaving the agent to infer which search_* tool to use next. Clear context with an implied exclusion, but no explicit alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_large_assetsA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
sizeNo
asset_typeNo
min_size_mbNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of behavioral disclosure, and it does well by stating 'Read-only' explicitly. It also discloses the return shape and sort order, so the agent knows the call has no side effects and what to expect in the response.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded, with the core purpose and use case in the first sentence. The args and returns sections are efficiently formatted. Minor redundancy exists ('largest first' appears in both intro and returns), but it does not bloat the description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only search tool with no annotations, the description covers the purpose, when to use it, all parameters, defaults, allowed values, sorting, and return payload structure. Nothing needed to call the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description fully compensates by explaining all three parameters: min_size_mb meaning and zero behavior, size range and default, and asset_type allowed values ('IMAGE'/'VIDEO') plus omission behavior. This is complete and unambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'The biggest files in the library, largest first,' which clearly identifies the verb, resource, and ordering. It distinguishes itself from the many other search_* siblings by focusing on file size and storage cleanup, so an agent can select it without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to use this tool: 'Use this to find what is eating storage before a cleanup.' This is clear contextual guidance. It does not name alternatives or exclusions, but the use case is specific enough that an agent knows this is for size-based triage rather than general metadata search.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_metadataA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
ocrNo
cityNo
makeNo
pageNo
sizeNo
modelNo
stateNo
countryNo
tag_idsNo
album_idsNo
asset_typeNo
person_idsNo
is_favoriteNo
taken_afterNo
taken_beforeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It explicitly declares 'Read-only,' discloses a server-side prerequisite for the ocr parameter ('Needs OCR enabled on the server — check with get_capabilities'), and notes case-sensitivity for city. It also describes the return shape. Missing are filter-combination semantics (AND vs OR across fields) and sorting behavior, but the key behavioral traits are disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is cleanly organized: a purpose-and-routing paragraph, a complete Args list covering all 15 parameters, and a one-line Returns note. Every sentence earns its place, and the length is fully justified given that the schema provides zero descriptions for the parameters. Information is front-loaded with purpose before detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a high-complexity tool (15 optional parameters, no annotations, 0% schema coverage), the description covers everything needed to call it correctly: purpose, routing, all parameter semantics, return format, and the OCR prerequisite. An output schema exists, so return values need no further elaboration. The only implicit detail is cross-filter AND combination, which is minor given the 'only' qualifiers on each filter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully compensate — and it does. Every one of the 15 parameters gets meaning, format hints, and often concrete examples ('Barcelona', 'iPhone 14 Pro', 'EOS R5'). It clarifies case-sensitivity, ISO date semantics, the ALL-matching rule for person_ids, omit-for-both behavior for asset_type, and the 1-200 range for size. This is exemplary compensation for a zero-coverage schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'Search assets by EXIF metadata fields' — a specific verb, resource, and mechanism. It further distinguishes itself from siblings by name: search_smart for natural language visual queries and list_assets for browsing without criteria. An agent can pick this tool correctly without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use this when you know specific criteria like city, camera model, or date range' and then gives named alternatives with conditions: 'For natural language visual queries... use search_smart instead. For browsing without criteria, use list_assets.' This is textbook when/when-not/alternatives guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_peopleA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
with_hiddenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Declares 'Read-only' and describes return fields. No annotations provided, so description carries full burden. Missing details on potential errors or pagination, but sufficient for a simple search tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five well-structured sentences, including an Args section. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, usage, parameters, return format, and sibling differentiation. Output schema exists but description already mentions return fields. Complete for a simple tool with 2 parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but description adds meaning for both parameters: name is case-insensitive partial match, with_hidden includes hidden people and default false. This goes beyond schema titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Search for people by name (partial match)' with a specific verb and resource. It distinguishes from sibling 'list_people' by noting that list_people is for browsing all.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use this when you know the person's name. For browsing all people, use list_people instead.' Provides clear when-to-use and alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_placesA

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}.
ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the burden; it discloses read-only behavior, the absence of asset involvement, and a JSON places array return. This is adequate for a simple lookup, though it does not describe edge cases such as no-match or multiple ambiguous matches.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Tight and well-structured with Args and Returns sections; every sentence adds information and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose, usage, parameter meaning, and return shape, and an output schema exists. Minor details like partial-match behavior or empty-result handling are missing, but this is acceptable for a one-parameter gazetteer lookup.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides no description for 'name' (0% coverage). The description compensates fully with a clear explanation and an example: 'name: Place name to look for (e.g. 'Lisbon')'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Look a place name up in Immich's built-in gazetteer (no assets involved)'. The 'no assets involved' clause distinguishes it from sibling asset-focused searches like search_smart or search_metadata.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit use case: 'Use this to resolve a spelling or get coordinates for a place before a geographic search.' This clarifies when to call, though it does not name alternative tools to prefer instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_randomA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
ocrNo
cityNo
makeNo
sizeNo
modelNo
countryNo
is_favoriteNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and clearly discloses 'Read-only' along with the JSON return format. It also flags the OCR dependency ('needs OCR on the server') and that results are random, which are non-obvious behavioral traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized: purpose and usage up front, then an Args block, then Returns. Each sentence contributes necessary information, and nothing is redundant or wasteful given the 7-parameter surface.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only random-search tool with no annotations and 7 optional parameters, the description covers purpose, use cases, parameter semantics, safety (read-only), and return shape. The output schema provides the formal structure, so the description fully equips an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully compensate, and it does. Every parameter (size, city, country, make, model, is_favorite, ocr) gets a plain-language meaning, with size's default/max and the OCR server dependency highlighted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description opens with 'Random assets from the library, optionally filtered' – a specific verb, resource, and mode that sets it apart from all other search_* siblings. The sampling use cases ('quick feel', 'surprise pick', 'spot checks') further clarify its unique role without confusion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use the tool with concrete use cases like sampling and spot checks. It does not name alternative tools or give exclusion criteria, but the context is clear enough that an agent can decide this is the random/sampling choice among the many search tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_smartA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
ocrNo
cityNo
pageNo
sizeNo
queryYes
stateNo
countryNo
tag_idsNo
album_idsNo
person_idsNo
taken_afterNo
taken_beforeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and meets it: it declares 'Read-only,' discloses the server-side dependency, and flags that the ocr parameter requires OCR enabled, pointing to get_capabilities as a check. It also reveals non-obvious behavior — results are 'ranked by visual similarity to the query.'

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: purpose, usage condition, alternative, prerequisite, and safety are front-loaded before the structured Args block. The per-line parameter format is compact and consistent, with examples and constraints inline, and the Returns line closes with the essential output shape.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter tool with no annotations and zero schema descriptions, the description covers what the tool does, when to use it, the alternative, prerequisites, every parameter's semantics, and the return shape. Since an output schema exists for detailed return structure, the brief Returns line is sufficient; nothing needed to select or invoke the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the Args block must compensate — and it fully does. Every one of the 12 parameters gains meaning beyond the schema titles: the ALL constraint on person_ids, ISO date semantics for taken_after/taken_before, source hints like 'ids from list_people' and 'ids from list_tags,' and the 1-200 range for size.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource — 'AI-powered visual search using CLIP embeddings' — and clarifies the input modality with concrete natural-language examples. It explicitly differentiates itself from sibling search_metadata ('For structured criteria (city, camera, date), use search_metadata instead'), so an agent can select it without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use rule ('Use this when describing what a photo looks like in natural language') and names the exact alternative for structured criteria. It also states the prerequisite ('Requires Immich ML service with Smart Search enabled'), which tells the agent when the tool is available.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_statisticsA

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}.
ParametersJSON Schema
NameRequiredDescriptionDefault
ocrNo
cityNo
makeNo
modelNo
stateNo
countryNo
is_favoriteNo
taken_afterNo
taken_beforeNo
created_afterNo
created_beforeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly states 'Read-only,' 'WITHOUT fetching them,' and highlights the efficiency benefit of returning one integer instead of pages of assets. It also notes the OCR server prerequisite, which is useful behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The main purpose and usage guidance are front-loaded in the first sentence, followed by a compact and necessary Args list. Every sentence earns its place, and the examples clarify usage without adding fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 11 parameters, no annotations, and no visible output schema details, the description covers everything needed: purpose, alternative tool, parameter semantics, return shape ({total}), and behavior. There are no significant gaps for an agent to invoke and interpret this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully document parameters. It provides a meaningful one-line explanation for all 11 parameters, including critical distinctions such as created_after (upload date when it reached Immich) vs taken_after (capture date when the photo was taken). This goes well beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Count how many assets match a filter WITHOUT fetching them.' It also explicitly differentiates from search_metadata, making it clear this tool returns a count rather than asset pages.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says to use this instead of search_metadata whenever only the number matters, with concrete natural-language examples like 'how many photos from Spain?' This provides a clear when-to-use condition and names the alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_suggestionsA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
makeNo
modelNo
stateNo
countryNo
suggestion_typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full behavioral weight. It discloses that the tool is read-only, returns distinct values, and provides a JSON response with total and suggestions. It does not cover every edge case, but the essential behavioral traits are transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is tightly written, front-loads the core behavior and usage example, and organizes the argument documentation clearly. Every sentence adds value, and the length is appropriate for the complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the 5 parameters, missing schema descriptions, no annotations, and existing output schema, the description covers all essential context: purpose, when to use, all parameter meanings, and the return shape. Nothing critical is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully document parameters. It does: suggestion_type is listed with all six allowed values, and country, state, make, and model each get a clear narrowing explanation. This adds substantial meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific purpose: returning distinct values for one field, with the exact spellings search_metadata expects. This clearly distinguishes it from the many search-related sibling tools and explains what the tool accomplishes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly advises using this tool before filtering by city or camera to avoid guessing, which gives clear contextual guidance. It does not explicitly name alternative tools or state when not to use it, but the usage context is strong enough for an agent to decide.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tag_assetsA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
tag_idYes
asset_idsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Mentions 'Side effect: adds tag association to assets' which is good, but lacks details on idempotency, error handling, or prerequisites. With no annotations, more behavioral context would be beneficial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences plus structured Args and Returns sections. No redundant information, every part is useful and front-loaded with purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, side effects, parameter details, and return format. Lacks error handling or limits, but for a straightforward bulk-operation tool, it is largely complete given the output schema exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but description includes a detailed Args section explaining each parameter's origin (tag_id from list_tags/create_tag) and constraints (asset_ids must not be empty), adding significant value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Apply a tag to multiple assets at once' with a specific verb and resource. It distinguishes from siblings like untag_assets and create_tag by noting bulk application.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a clear use case (bulk-categorize vacation photos) and lists required args. However, it does not explicitly discuss exclusions or when to use alternatives, though the context differentiates it from untag_assets.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

untag_assetsA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
tag_idYes
asset_idsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description clearly states the side effect (only removes association, not the tag) and the return structure (tag_id, count, per-asset results). It also notes the constraint that asset_ids must not be empty. With no annotations, it carries the full burden but omits permissions or error conditions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short paragraphs with clear separation for Args and Returns. Every sentence provides necessary information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple and the description covers the core function, side effect, parameter constraints, and output shape. Given the output schema exists, the description is complete enough, though it could mention potential errors or rate limits for a higher score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema coverage, the description adds meaning: it specifies that tag_id is a UUID, asset_ids are UUIDs, and asset_ids must not be empty. This is more informative than the schema's type/title alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the action 'Remove a tag from multiple assets', names the key resources (tag and assets), and distinguishes from sibling tools like 'delete_tag' (which deletes the tag itself) and 'tag_assets' (which adds the association).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage (untagging many assets) but does not explicitly say when to choose this over alternatives, such as if a single asset needs untagging or if the tag should be deleted instead. No 'when-not' guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_albumA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
album_idYes
descriptionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It mentions a side effect ('modifies album metadata in Immich') and describes parameter behavior ('Leave empty to keep current name/description'). It could disclose more about authorization or reversibility, but the provided context is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (4 lines plus Args and Returns sections) and front-loaded with the purpose. Every sentence adds value, and the structure is clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (3 params, 1 required) and the presence of an output schema, the description covers the essential behavior and parameter details. It could mention error scenarios or additional effects, but it is complete enough for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description compensates fully by explaining each parameter: album_id as 'The album's UUID,' name and description with 'Leave empty to keep current.' This adds critical meaning absent from the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Update an album's name or description' and 'Use this to rename or re-describe an existing album,' providing a specific verb and resource. It distinguishes itself from sibling tools like create_album and delete_album.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use this to rename or re-describe an existing album,' providing clear when-to-use guidance. It lacks explicit when-not-to-use or alternative tool mentions, but the context is sufficient for this straightforward tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_asset_metadataA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
ratingNo
asset_idYes
latitudeNo
longitudeNo
descriptionNo
is_favoriteNo
date_time_originalNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full disclosure burden and delivers: 'permanently changes asset metadata in Immich' warns of the irreversible side effect, 'Only provided fields are modified' clarifies partial-update semantics, and the rating caveat ('cannot be cleared from here, 0 is not a rating Immich 3.x accepts') flags version-specific behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose, use cases, and side effect are front-loaded in three tight sentences; the Args list maps 1:1 to schema parameters in a scannable format; the single Returns line closes the contract. Every sentence earns its place given 7 parameters need documentation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter mutation tool with no annotations and no schema-level descriptions, the description covers purpose, when to use it, side effects, every parameter's format and range, and the return shape (backed by the output schema). Nothing an agent needs to construct a correct call is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description fully compensates by documenting all 7 parameters with real semantics: UUID for asset_id, an ISO 8601 example for date_time_original, decimal-degree ranges for latitude/longitude, and the -1/1-5 rating scale with rejection semantics that the bare schema could never convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Update metadata fields on a specific asset.' The singular framing distinguishes it from the sibling update_assets_metadata, and the concrete use cases (fix dates, correct GPS, add descriptions, change favorite/rating) make the tool's scope unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use context via 'Use this to fix dates, correct GPS, add descriptions, or change favorite/rating status.' However, it does not name the batch alternative update_assets_metadata or state when not to use this tool, so it stops short of full when/when-not routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_assets_metadataA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
ratingNo
latitudeNo
asset_idsYes
longitudeNo
descriptionNo
is_favoriteNo
date_time_originalNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of disclosing side effects, and it does: it states the change 'permanently changes the metadata of every listed asset' and notes that only provided fields change. It also flags rating limitations (cannot be cleared, 0 rejected). This is strong behavioral disclosure for a mutating tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and efficiently front-loaded: it opens with the core batch purpose, gives relatable examples, then lists parameters in a scannable Args block. Every sentence adds value, including the side-effect warning and return type.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 7 parameters, no annotations, and a meaningful sibling distinction, the description covers purpose, usage, parameter semantics, side effects, and return value. Nothing critical is missing for an agent to select and invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description fully compensates by explaining each parameter's meaning: ISO 8601 for date_time_original, decimal degrees for GPS, favorite status semantics, and the special -1/0/1-5 rating rules. This adds meaning well beyond the raw schema field names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Update'), a clear resource ('metadata fields on many assets'), and the batch nature in 'ONE call'. It explicitly differentiates itself from the singular sibling update_asset_metadata by emphasizing multi-asset operation, so an agent can distinguish the tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete usage scenarios (scanned album roll, trip photos, selection favorites) and references update_asset_metadata as the same-fields counterpart. It implies the singular tool is for single assets, though it does not explicitly state 'use update_asset_metadata for one asset', so some inference remains.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_credentialsA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
api_keyYes
base_urlYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses side effects: persists to disk, hot-swaps live connection, and validates credentials. Also mentions return structure (success status, counts, persistence path). No annotations provided, so description fully covers behavioral traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise with no wasted words. Structured in clear paragraphs: purpose, when to use, side effects, args, returns. Front-loaded with purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all necessary aspects: purpose, usage, behavior, parameters, and return. Output schema exists, so return details are sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 0% description coverage, but the description adds detailed explanations for both parameters, including expected format and example for base_url, and origin for api_key.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly specifies the verb 'Update' and the resource 'Immich connection credentials'. Distinct from sibling tools like get_connection_info (read-only).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use: when API key is rotated or server URL changed. Does not mention when not to use, but the use case is specific enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_memoryA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
seen_atNo
is_savedNo
memory_atNo
memory_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden and it explicitly flags 'Side effect: modifies the memory on the server' and states the return payload. It stops short of discussing reversibility, permissions, or failure behavior, so it is not a 5, but the side-effect disclosure is meaningful.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loaded with the core operation, and every section—summary, side effect, args, returns—earns its place. There is no filler or redundant restatement of the schema types.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple 4-parameter update with an output schema, the description covers what the tool does, side effects, all argument meanings, and the response shape. It does not explicitly explain that only supplied optional fields are updated or how the operations combine in one call, but these are minor gaps given the schema's optional defaults.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema description coverage, every parameter gets a plain-language semantic explanation: is_saved gets true/false behavior, memory_at is described as the new ISO date to display, and seen_at is tied to the user viewing action. This is exactly the meaning the raw schema, with only types and defaults, cannot convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific operation on a specific resource and then enumerates three concrete behaviors: saving the memory, moving its date, and marking it seen. This clearly distinguishes it from sibling memory tools such as create_memory, list_memories, and delete_memory.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The use case is implied by 'Update a memory' and the listed operations, but the description does not explicitly say when to use this tool instead of create_memory or delete_memory. An agent must infer that modifying an existing memory is this tool's job.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_partnerA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYes
in_timelineYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the disclosure burden and does a solid job: it notes the photos remain reachable either way, the operation only applies to shared-with-me partners, and the setting is persisted server-side. It stops short of discussing permissions or error behavior, but the key behavioural traits are covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: purpose in the first sentence, precondition in the second, side-effect note, then a clean Args list. No filler; every line adds information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has only two required parameters and no nested objects, and an output schema exists. The description covers the return value ('JSON with the updated partner entry'), the precondition, and the parameter semantics, so an agent has enough to call it correctly; only error/edge-case behavior is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description is the only documentation for both parameters. It fully explains user_id ('the partner whose setting changes') and in_timeline ('True to mix their photos into the timeline, false to keep them separate'), adding meaning the schema lacks.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action — toggling whether a partner's photos appear in the main timeline — and clarifies that the photos remain accessible. It clearly differentiates this from partner management siblings like create_partner/remove_partner by focusing on the timeline visibility flag.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a clear precondition: 'Only works on a partner who shares their library with this account (someone in shared_with_me).' It implies the tool is for adjusting visibility rather than membership, but it does not name alternative tools or explicitly say when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_personA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
colorNo
is_hiddenNo
person_idYes
birth_dateNo
is_favoriteNo
feature_face_asset_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It mentions a side effect ('changes person metadata in Immich') and states that only provided fields are modified. However, it does not discuss permissions, rate limits, or reversibility of actions like hiding a person.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a brief overview paragraph followed by an Args list. It is front-loaded with purpose and every sentence is useful. However, the Args section could be slightly more concise, but overall efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the 7 parameters and lack of annotations, the description covers all parameters with context and explains the side effect. The return type is mentioned as 'JSON with the updated person object,' which is sufficient given the presence of an output schema (context signals indicate one exists). The description is fairly complete for a moderate-complexity tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, but the description provides detailed semantics for each of the 7 parameters in the Args section, including examples (e.g., '1990-05-15' for birth_date) and specific guidance (e.g., set name to name unnamed face clusters). This adds significant meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Update a person's profile details' and lists specific use cases like naming unnamed faces, setting birth dates, hiding clutter faces, and changing the thumbnail. This distinguishes it from sibling tools such as get_person or search_people.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use this to name unnamed faces, set birth dates, hide clutter faces, or change the representative thumbnail.' This provides clear context for when to use the tool, though it does not mention when not to use it or suggest alternatives explicitly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_stackA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
stack_idYes
primary_asset_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It explicitly states the side effect ('updates the stack on the server') and the input constraint on primary_asset_id, which goes beyond the raw schema. It does not cover error behavior or permissions, but for a simple non-destructive update the disclosure is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short, front-loaded with the core purpose, and uses a compact Args block followed by a Returns line. Every sentence contributes necessary information without redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with an output schema, the description covers purpose, side effects, parameter meanings, a key validation constraint, and the return type. It lacks explicit notes on error handling or authorization, but that is a minor gap given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must provide all parameter meaning. It does this fully: stack_id is 'The stack to update' and primary_asset_id is 'The asset that should become the cover' with the important precondition that it already belongs to the stack.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Change which asset fronts a stack', and clarifies the domain effect with '(the one the library shows)'. This clearly distinguishes the tool from sibling stack operations like create_stack, list_stacks, get_stack, and delete_stack.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool: when updating which asset serves as the stack cover. It also gives a precondition ('It must already belong to the stack'), but it does not explicitly name alternatives or when-not-to-use conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_tagA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
colorNo
tag_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly states the side effect on all assets using the tag, the API limitation about renaming, the error behavior for `name`, and the return value. This goes well beyond the input schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-structured: purpose, side effect, limitation, workaround, and per-argument semantics are all covered in a compact format. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple update operation, the description covers the action, side effects, unsupported parameters, workaround, and return format. The presence of an output schema further reduces the need to describe the response object in more detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description fully documents all three parameters: `tag_id` as the UUID, `name` as unsupported with a concrete consequence, and `color` with a hex format example and 'omit to keep current'. This compensates completely for the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states a specific verb and resource ('Update a tag's color'), immediately distinguishing it from create_tag, delete_tag, and tag_assets. It also clarifies the tool's scope boundary by explicitly noting that renaming is not supported.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly routes rename workflows to create_tag, tag_assets, and delete_tag, and warns that passing `name` returns an error explaining the workaround. This gives clear when-to-use and when-not-to-use guidance relative to sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_assetA

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
album_idNo
file_pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and delivers thoroughly. It explains side effects (creates new asset), security restrictions (symlinks rejected), and that the original file is untouched. The return format is also described.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized, starting with a clear purpose, followed by constraints in a bullet-like format, and parameter details. Every sentence adds value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the description covers all necessary aspects: purpose, usage context, behavioral details, parameter semantics, and return value. No gaps are evident.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite the input schema having no parameter descriptions (0% coverage), the description adds rich meaning: file_path is an absolute path that must exist, and album_id is an optional UUID for immediate album assignment. This fully compensates for the schema's lack of detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Upload' and the resource 'local photo or video file to Immich', and specifies its use for ingesting new media. It distinguishes itself from sibling tools which perform other operations like album management or search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit constraints (max 25MB, allowed types, symlinks rejected) and context for when to use the tool. However, it does not explicitly mention when not to use it or suggest alternatives, though the context of siblings makes it clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 41 tool updatesv2.0.2
    • Addedclear_asset_notes
    • Addedcreate_activity
    • Addedcreate_memory
    • Addedcreate_partner
    • Addedcreate_stack
    • Addeddelete_activity
    • Addeddelete_memory
    • Addeddelete_stack
    • Addeddownload_archive
    • Changedget_asset_info1 field changed
      • addedInput schema / properties / with_notes
        Added value: +{
        +  "default": false,
        +  "title": "With Notes",
        +  "type": "boolean"
        +}
    • Addedget_asset_notes
    • Addedget_assets_notes
    • Addedget_calendar_heatmap
    • Addedget_capabilities
    • Addedget_download_info
    • Addedget_stack
    • Addedget_timeline_bucket
    • Addedget_timeline_buckets
    • Addedlist_activities
    • Addedlist_memories
    • Addedlist_partners
    • Addedlist_stacks
    • Addedlist_users
    • Changedmerge_people1 field changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "default": false,
        +  "title": "Confirm",
        +  "type": "boolean"
        +}
    • Addedrecord_action
    • Addedremove_partner
    • Addedreverse_geocode
    • Addedreview_assets
    • Addedsearch_cities
    • Addedsearch_explore
    • Addedsearch_large_assets
    • Changedsearch_metadata4 fields changed
      • addedInput schema / properties / album_ids
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Album Ids"
        +}
      • addedInput schema / properties / ocr
        Added value: +{
        +  "default": "",
        +  "title": "Ocr",
        +  "type": "string"
        +}
      • addedInput schema / properties / person_ids
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Person Ids"
        +}
      • addedInput schema / properties / tag_ids
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Tag Ids"
        +}
    • Addedsearch_places
    • Addedsearch_random
    • Changedsearch_smart4 fields changed
      • addedInput schema / properties / album_ids
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Album Ids"
        +}
      • addedInput schema / properties / ocr
        Added value: +{
        +  "default": "",
        +  "title": "Ocr",
        +  "type": "string"
        +}
      • addedInput schema / properties / person_ids
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Person Ids"
        +}
      • addedInput schema / properties / tag_ids
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Tag Ids"
        +}
    • Addedsearch_statistics
    • Addedsearch_suggestions
    • Addedupdate_assets_metadata
    • Addedupdate_memory
    • Addedupdate_partner
    • Addedupdate_stack
  2. 8 tool updatesv2.0.1
    • Addedexport_pdf
    • Addedget_album_images
    • Addedget_asset_image
    • Changedget_duplicates1 field changed
      • addedInput schema / properties / album_id
        Added value: +{
        +  "default": "",
        +  "title": "Album Id",
        +  "type": "string"
        +}
    • Addedget_export_preview
    • Addedget_images_batch
    • Addedget_video_frames
    • Addedget_video_frames_json
  3. 28 tool updatesv1.2.1
    • Addedcreate_tag
    • Addeddelete_assets
    • Addeddelete_shared_link
    • Addeddelete_tag
    • Addedempty_trash
    • Addedget_asset_faces
    • Addedget_duplicates
    • Addedget_person
    • Addedget_person_thumbnail
    • Addedget_shared_link
    • Addedget_tag
    • Addedlist_assets
    • Addedlist_people
    • Addedlist_tags
    • Addedmerge_people
    • Addedreassign_face
    • Addedresolve_duplicates
    • Addedrestore_assets
    • Addedrestore_trash
    • Addedrevert_asset_edits
    • Addedrotate_assets
    • Addedsearch_people
    • Addedtag_assets
    • Addeduntag_assets
    • Addedupdate_person
    • Addedupdate_shared_link
    • Addedupdate_tag
    • Addedupload_asset
  4. 1 tool updatev1.1.0
    • Addedupdate_asset_metadata
  5. 21 tool updatesv1.0.0
    • First observedadd_assets_to_album
    • First observedcreate_album
    • First observedcreate_shared_link
    • First observeddelete_album
    • First observedget_album
    • First observedget_album_thumbnails
    • First observedget_asset_info
    • First observedget_asset_thumbnail
    • First observedget_connection_info
    • First observedget_map_markers
    • First observedget_server_version
    • First observedget_statistics
    • First observedget_thumbnails_batch
    • First observedlist_albums
    • First observedlist_shared_links
    • First observedping
    • First observedremove_assets_from_album
    • First observedsearch_metadata
    • First observedsearch_smart
    • First observedupdate_album
    • First observedupdate_credentials

TDQS

A3.8/5.0

Scored across 94 tools

Disambiguation3/5

Most tools are distinct, but there are several overlapping clusters: restore_assets/restore_trash, get_asset_thumbnail/get_asset_image/get_thumbnails_batch/get_images_batch/get_album_thumbnails/get_album_images, and search_metadata/search_smart/search_random/search_explore/search_cities/search_places/search_suggestions/search_statistics. The descriptions help differentiate them, but the sheer number of similar search and thumbnail tools creates ambiguity.

Naming Consistency4/5

The naming is mostly consistent with verb_noun patterns (list_*, get_*, create_*, update_*, delete_*, search_*). Minor deviations exist: ping, restore_assets vs restore_trash, and the pair get_video_frames/get_video_frames_json are acceptable but slightly inconsistent. Overall the pattern is predictable.

Tool Count1/5

94 tools is far beyond the typical well-scoped MCP server. While the domain is broad (photos, albums, people, tags, sharing, memories, stacks, exports, notes), the count is extreme and will overwhelm agents. Many tools could be consolidated (e.g., thumbnail variants, search variants).

Completeness4/5

The tool surface is remarkably comprehensive: CRUD for albums, tags, people, shared links, memories, stacks, plus search, upload, delete/restore, duplicates, export, and notes. Minor gaps exist (e.g., no direct asset rename, no video upload beyond 25MB, no way to move assets between albums in one call), but agents can work around them.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    C
    quality
    D
    maintenance
    Image Tools MCP is a Model Context Protocol (MCP) service that retrieves image dimensions and compresses images from URLs and local files using the TinyPNG API. It supports converting images to formats like webp, jpeg/jpg, and png, providing detailed information on width, height, type, and compressi
    2
    10
    10
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    An offline MCP server that allows LLMs or humans to extract and analyze metadata from images using the exifr library, supporting various image formats and metadata segments without external tools.
    11
    39
    BSD 2-Clause "Simplified"
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides AI assistants with persistent memory through local ChromaDB vector storage, featuring automated file ingestion and batch processing for over 70 file types. It enables advanced vector search, EXIF metadata extraction for photos, and duplicate file detection across local directories.
    MIT