immich-mcp
Provides tools for managing an Immich instance via the official Immich API, covering assets, albums, people, tags, search, memories, shared links, users, jobs, libraries, trash, stacks, faces, activities, duplicates, sessions, API keys, queues, backups, and admin configuration. Supports uploading and downloading files, with optional filtering and read-only mode.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@immich-mcpsearch my library for beach photos from last summer and add them to a new album"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
immich-mcp
A free and open-source Model Context Protocol (MCP) server for managing an Immich instance.
It exposes every operation of the official Immich API (276 tools, generated from the
OpenAPI specification) to any MCP client such as Claude Desktop, Claude Code, Cursor, Windsurf,
OpenCode or the MCP Inspector. The runtime is built on the official
@immich/sdk, so requests are typed and generated
from the same source as the Immich web client.
Note: This project is honestly vibecoded — built with heavy AI assistance for personal use. It is not affiliated with the Immich team. Read the Safety section and use it at your own risk (it can modify and delete data).
Features
Complete coverage — 276 tools across 41 API groups (Assets, Albums, People, Tags, Search, Memories, Shared links, Users, Jobs, Libraries, Trash, Stacks, Faces, Activities, Duplicates, Sessions, API keys, Queues, Backups, admin config, …).
Flattened request bodies — DTO fields are exposed as first-class tool arguments, so an LLM does not have to nest everything under
body.File uploads & downloads — multipart uploads accept a local file path (or a data URL); binary responses are written to the download directory and their path is returned.
Two transports —
stdio(local clients) and streamablehttp(remote/hosted), or both.Filtering & safety — expose only selected groups/tools, or run in read-only mode.
Resources & prompts — server/user/library metadata as MCP resources plus ready-made prompts.
Auto-generated & version-locked — a code generator turns the OpenAPI spec into the tool manifest and cross-checks the derived SDK parameter names against
@immich/sdkat build time.
Related MCP server: Immich MCP Server
Requirements
Node.js 18+ (Node 20+ recommended for
Filesupport during uploads)An Immich API key (Account Settings → API Keys) or an access token.
Installation
git clone <this-repo> immich-mcp
cd immich-mcp
npm install
npm run buildConfiguration
All configuration is via environment variables:
Variable | Required | Default | Description |
| yes | — | Immich API base URL, e.g. |
| one of | — | Immich API key. |
| one of | — | Bearer access token (used if no API key is set). |
| no |
| Extra JSON headers sent with every request. |
| no |
|
|
| no |
| HTTP bind host ( |
| no |
| HTTP port. |
| no |
| HTTP endpoint path. |
| no | — | If set, HTTP requests must send |
| no |
| Where downloaded/binary files are written. |
| no |
| Truncate large tool results. |
| no | — | Comma-separated group allow-list (e.g. |
| no | — | Comma-separated group deny-list. |
| no | — | Comma-separated tool allow-list. |
| no | — | Comma-separated tool deny-list. |
| no |
| Set to |
| no |
|
|
See .env.example for a copy-paste template.
Usage
stdio (Claude Desktop / Cursor / Windsurf)
Add an entry to your MCP client configuration, for example claude_desktop_config.json:
{
"mcpServers": {
"immich": {
"command": "node",
"args": ["/absolute/path/to/immich-mcp/dist/index.js"],
"env": {
"IMMICH_BASE_URL": "http://localhost:2283/api",
"IMMICH_API_KEY": "your-api-key"
}
}
}
}OpenCode
OpenCode (V2) configures MCP servers under mcp.servers. Secrets are best referenced with
{env:NAME} substitution so they never live in the config file.
A ready-to-copy file is in examples/opencode.jsonc.
Local server (stdio) — add to opencode.jsonc in your project, or to the global
~/.config/opencode/opencode.jsonc:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"servers": {
"immich": {
"type": "local",
"command": ["node", "/absolute/path/to/immich-mcp/dist/index.js"],
"environment": {
"IMMICH_BASE_URL": "http://localhost:2283/api",
"IMMICH_API_KEY": "{env:IMMICH_API_KEY}"
}
}
}
}
}Remote server (streamable HTTP) — first run this server with IMMICH_MCP_TRANSPORT=http
and an auth token (see Streamable HTTP), then point OpenCode at it:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"servers": {
"immich": {
"type": "remote",
"url": "http://127.0.0.1:3000/mcp",
"oauth": false,
"headers": {
"Authorization": "Bearer {env:IMMICH_MCP_HTTP_AUTH_TOKEN}"
}
}
}
}
}Add it from the CLI instead of editing JSON:
# global (all projects) or omit --global for project-local
opencode mcp add immich --global -- node /absolute/path/to/immich-mcp/dist/index.js
opencode mcp add immich --url http://127.0.0.1:3000/mcp # remote
opencode mcp list # show connection stateThen open the MCP panel with /mcps to connect or inspect the server.
A few OpenCode-specific notes:
OpenCode names tools
<server>_<tool>. With the server namedimmich,immich_search_assetsis exposed asimmich_immich_search_assets; under the default Code Mode you call it astools.immich.immich_search_assets(...). Set"codemode": falseto expose the native tool names.Immich exposes 276 tools (~300 KiB of schemas), which consumes model context. Consider narrowing the surface, e.g. add to
environment:"IMMICH_MCP_TAGS": "Assets,Albums,People,Search,Memories"or"IMMICH_MCP_READONLY": "1".Use
"disabled": trueto keep the server configured without connecting it.Timeouts can be tuned under
mcp.timeout(e.g."execution"for long uploads/downloads).
Streamable HTTP
IMMICH_BASE_URL=http://localhost:2283/api \
IMMICH_API_KEY=your-api-key \
IMMICH_MCP_TRANSPORT=http \
IMMICH_MCP_HTTP_AUTH_TOKEN=secret \
node dist/index.js
# MCP endpoint: http://127.0.0.1:3000/mcp (health: /health)Point an HTTP-capable MCP client at http://127.0.0.1:3000/mcp.
Docker
docker compose up --builddocker-compose.yml runs the server in HTTP mode on port 3000 and reads IMMICH_BASE_URL
and IMMICH_API_KEY from the environment/.env.
Every docker build refreshes the Immich API definitions. The build downloads the current
OpenAPI specification and @immich/sdk typings, regenerates the MCP tool manifest, and only then
compiles — so a rebuilt image never uses stale tools. To also bump the Immich SDK (and therefore
the API version) at build time, pass IMMICH_SDK_VERSION:
# Update to the newest published Immich SDK/spec:
IMMICH_SDK_VERSION=latest docker compose build
# Or pin a specific version:
docker build --build-arg IMMICH_SDK_VERSION=3.3.0 -t immich-mcp .Docker caches layers, so the download only re-runs when an input changes. To force a fresh refresh
anyway (CI does this automatically via github.run_id), pass a changing IMMICH_REFRESH value:
IMMICH_REFRESH=$(date +%s) docker compose buildPublished images are multi-architecture (linux/amd64 and linux/arm64), so Apple Silicon
Macs pull a native arm64 image. Locally, docker build / docker compose build produce an image
for the host architecture automatically.
CLI helpers
node dist/index.js --help # usage
node dist/index.js --list-tools # every tool: name, method/path, summary
node dist/index.js --list-groups # tool counts per API groupTool naming
Tools are named immich_<snake_case operationId>, e.g.:
Tool | Operation |
|
|
|
|
|
|
|
|
|
|
|
|
| queue/job control |
Each tool carries MCP annotations (readOnlyHint, destructiveHint, idempotentHint) so clients
can request confirmation for destructive actions.
API groups
4 Activities 8 Memories 6 Sessions
13 Albums 12 People 9 Shared links
7 API keys 4 Plugins 7 Stacks
4 Asset files 5 Queues 4 Sync
26 Assets 10 Search 4 System config
17 Authentication 14 Server 4 System metadata
1 Authentication (admin) 5 Database Backups 9 Tags
16 Users 11 Users (admin) 2 Timeline
... ... 3 Trash
8 WorkflowsRun --list-groups for the exact, current list.
Resources
URI | Contents |
| Version & build info |
| Server version |
| Disk usage per storage location |
| Aggregate statistics |
| Authenticated user profile |
| All albums |
| All people |
| All tags |
| Current memories |
Prompts
search_media— guided asset search.organize_album— create/update an album from search criteria.library_report— summarise library health.
Safety
This server can modify and delete data. Recommendations:
Create a dedicated Immich API key and restrict its permissions.
Use
IMMICH_MCP_EXCLUDE_TAGS/IMMICH_MCP_EXCLUDE_TOOLSto hide destructive tools (e.g.Maintenance (admin),Database Backups (admin)).Set
IMMICH_MCP_READONLY=1for a strictly read-only server.When using HTTP, always set
IMMICH_MCP_HTTP_AUTH_TOKENand terminate TLS in front of it.
Updating
Update immich-mcp itself
git pull
npm install
npm run buildThen restart the MCP client so it picks up the new code (see Reconnect clients).
Move to a newer Immich release
Tools are generated from a version-pinned OpenAPI specification, so upgrading is three steps:
# 1. point the SDK at the new Immich version
npm install @immich/sdk@latest
# 2. re-download the matching spec + SDK typings and regenerate the manifest
npm run spec:fetch
npm run generate
# 3. rebuild and test
npm run build
npm testWhat each step does:
npm run spec:fetchdownloadsspec/immich-openapi-specs.jsonandspec/sdk-client.d.tsfor the installed@immich/sdkversion (falling back to the range inpackage.json). Pass an explicit version if needed:node scripts/fetch-spec.mjs 3.3.0.npm run generaterewritessrc/generated/manifest.tsand prints a cross-check against the real SDK declarations. Warnings mean the spec and the SDK disagree — do not ignore them; they usually indicate a version mismatch between@immich/sdkand the downloaded spec.npm testrebuilds first (viapretest) and runs the integration tests against a mock Immich.
Commit package.json, package-lock.json, spec/ and src/generated/manifest.ts together so
the generated tools stay reproducible. Generation is deterministic (it records a hash of the spec,
not a timestamp), so CI can verify the committed manifest is current with
git diff --exit-code -- src/generated/manifest.ts.
If a release renames an operation, the tool name follows automatically
(immich_<snake_case operationId>). Diff the tool list before and after:
node dist/index.js --list-tools > /tmp/tools-before.txt
# update...
node dist/index.js --list-tools > /tmp/tools-after.txt
diff /tmp/tools-before.txt /tmp/tools-after.txtDocker
The Docker build always refreshes the Immich API definitions (see Docker), so a rebuild is enough to pick up the latest spec for the pinned SDK version. To also update the SDK/API version:
git pull
IMMICH_SDK_VERSION=latest docker compose build
docker compose up -dReconnect MCP clients after an update
The server binary changes on disk, so already-running clients keep the old code until restarted:
stdio clients (Claude Desktop, Cursor, Windsurf): restart the client, or toggle the server off/on, so it respawns
dist/index.js.OpenCode: reconnect the server from
/mcps(or restart OpenCode).opencode mcp listshows the connection state.Streamable HTTP: restart the process/container. The server runs stateless, so no session migration is needed.
Development
npm run spec:fetch # download the OpenAPI spec + SDK typings for the pinned SDK version
npm run generate # regenerate src/generated/manifest.ts
npm run build # generate + compile
npm run dev # run from source with tsx
npm test # build + run the integration tests against a mock Immich
npm run typecheck # type-check without emittingHow it works
scripts/fetch-spec.mjsdownloadsimmich-openapi-specs.jsonand the@immich/sdkfetch-client.d.tsfor the installed SDK version (falling back to the range inpackage.json) intospec/.scripts/generate.mjswalks the spec and emitssrc/generated/manifest.ts. For every operation it records the parameters, the request body, and the exact parameter names the SDK expects (including its$-prefixed reserved words and camelCased header names). It cross-checks these against the real SDK declarations and fails loudly on drift.At runtime
src/json-schema.tsconverts the OpenAPI/JSON schemas into Zod,src/tools.tsbuilds the MCP input schemas, andsrc/invoke.tsmaps validated arguments back onto the@immich/sdkfunction and formats the result (JSON, text, or a downloaded file).
Because generation is pinned to a specific API version, tool names and DTO shapes stay in sync
with the SDK. To move to a newer Immich release, bump @immich/sdk in package.json, run
npm run spec:fetch, then npm run build.
Build & CI
The repository ships GitHub Actions workflows:
.github/workflows/ci.yml— on pushes and pull requests: type-check, generate + build (Node 20 and 22), verify the committed manifest is current, run tests, produce an npm tarball artifact, and build the Docker image (amd64 + arm64) without pushing..github/workflows/docker.yml— on pushes tomainandv*tags, builds and publishes a multi-architecture image (linux/amd64andlinux/arm64, so Apple Silicon Macs get a native arm64 image) to the GitHub Container Registry (ghcr.io/<owner>/<repo>). Every build refreshes the Immich API definitions; a manual run accepts an optionalimmich_sdk_versioninput to publish an image built against a specific Immich SDK/API version.
The same checks locally:
npm ci
npm run typecheck
npm run build
git diff --exit-code -- src/generated/manifest.ts
npm testContributing
Contributions are welcome — this is a community, open-source project. See CONTRIBUTING.md for details.
Fork the repository and create a feature branch.
Make the change, keeping the docs in sync (see AGENTS.md).
Run the checks:
npm install npm run typecheck npm run build git diff --exit-code -- src/generated/manifest.ts npm testOpen a pull request describing the change.
Please do not commit API keys or other secrets. If you find a security issue, report it privately rather than opening a public issue.
License
immich-mcp is open source, released under the MIT License.
It is an independent community project and is not affiliated with or endorsed by the Immich team. "Immich" is the property of its respective owners.
Available Tools
276 toolsimmich_accept_cluster_group_requestAccept a cluster group requestB
Accept a cluster group request
Join the cluster group the request was created for.
Immich operation: POST /cluster-groups/requests/{id}/accept · tag: Cluster groups
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=true, so the mutation profile is largely covered. The description adds the real-world effect (the caller joins the group), but omits who is permitted to accept, whether the request record is consumed afterward, and what happens if it is expired or already accepted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded: the effect sentence comes before the REST/route metadata. The repeated title as the first line is mildly redundant with the tool name/title, but nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with annotations covering safety and no output schema, the essentials are present, but the description leaves out the accept-side prerequisites (caller must be the invited party), post-accept side effects, and failure modes, which an agent would need to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single required id parameter (uuid format), so the schema carries full documentation. The description adds no semantics about the id beyond what the schema already states, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (accept) and resource (cluster group request), and the second line clarifies the effect: joining the cluster group the request targeted. This distinguishes it from immich_delete_cluster_group_request and immich_create_cluster_group_request without needing the schema, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the prerequisite that a request must already exist, but gives no explicit when-to-use guidance, no exclusions, and no pointer to the alternatives (delete the request instead, or list requests first with immich_get_cluster_group_requests).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_add_assets_to_albumAdd assets to an albumBIdempotent
Add assets to an album
Add multiple assets to a specific album by its ID.
Immich operation: PUT /albums/{id}/assets · tag: Albums
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| ids | Yes | ids (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), so the description is not the primary carrier here. It adds the underlying HTTP operation (PUT /albums/{id}/assets), which is mild extra context, but says nothing about auth requirements, partial-failure behavior, or what happens when an asset is already in the album despite the idempotent hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The title is repeated verbatim as the first line and then the same idea is restated as "Add multiple assets to a specific album by its ID," so roughly half the text is redundant. The endpoint/tag metadata is useful but the opening duplication wastes the front-loaded position.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no output schema and full annotation coverage, the description is adequate but thin. It omits the idempotency semantics the annotations imply and any note on whether the whole batch fails if one asset ID is invalid, which matters for a batch-add operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% but the schema descriptions are bare ("format: uuid" for both params). The description adds genuine disambiguation by identifying `id` as the album and `ids` as the assets being added, which the schema alone does not make clear. That is meaningful value above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (add), resource (assets), and target container (a specific album by ID), so the core operation is unambiguous. It does not, however, differentiate itself from the dangerously similar sibling immich_add_assets_to_albums (plural) or from immich_add_users_to_album, leaving the agent to guess which of the near-identical names applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no prerequisites, and no mention of alternatives. With siblings like immich_add_assets_to_albums, immich_remove_asset_from_album, and immich_add_memory_assets in the list, the absence of routing guidance is a real gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_add_assets_to_albumsAdd assets to albumsBIdempotent
Add assets to albums
Send a list of asset IDs and album IDs to add each asset to each album.
Immich operation: PUT /albums/assets · tag: Albums
| Name | Required | Description | Default |
|---|---|---|---|
| albumIds | Yes | albumIds (request body) | |
| assetIds | Yes | assetIds (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false, and readOnlyHint=false, so the safety profile is covered. The description adds one genuinely useful behavioral fact beyond annotations: the operation applies a Cartesian product (each asset into each album). It says nothing about permission requirements, handling of invalid/unknown IDs, or partial-failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded: the verb+resource leads, the operative sentence follows immediately, and only the trailing 'Immich operation / tag' line is operational metadata. The first line redundantly restates the tool name/title, which is minor waste but not harmful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a bulk mutation with no output schema, the description covers inputs and the cross-product effect but omits return values, error behavior for invalid IDs, and any account/permission context. Adequate for a straightforward put, but thin for a bulk write against an external service (openWorldHint=true).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3; the description earns an extra point by explaining how the two array parameters interact ('add each asset to each album'), which the schema's plain array-of-UUID definitions cannot convey. It still adds no format details (both are UUID arrays) since the schema handles that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Add assets to albums') and adds the key semantics that the operation is a cross-product ('add each asset to each album'). However, it never acknowledges the nearly identical sibling immich_add_assets_to_album, so the agent gets no help distinguishing the bulk multi-album variant from the single-album variant.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states what inputs to send but gives no when-to-use guidance, no when-not conditions, and no mention of alternatives such as immich_add_assets_to_album or immich_add_users_to_album. With a near-duplicate sibling name in the tool list, the absence of routing guidance is a real gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_add_memory_assetsAdd assets to a memoryBIdempotent
Add assets to a memory
Add a list of asset IDs to a specific memory.
Immich operation: PUT /memories/{id}/assets · tag: Memories
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| ids | Yes | ids (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, which conveys the safety/mutation profile. The description adds nothing beyond the raw PUT endpoint, so it does not enrich behavior (e.g. that re-adding is idempotent, or what happens on duplicate ids) beyond what structured fields provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, leading with the action. There is mild redundancy between the first line and title and the second line, but no filler and the endpoint reference is compact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter mutation with full schema coverage and annotations covering the safety profile, the definition gives enough to call it correctly. No output schema is needed. The only gap is the absence of when-to-use routing against the sibling remove/update memory tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the id and ids parameters are already documented with their uuid formats. The description only restates "list of asset IDs" and "specific memory," adding no syntax or constraint detail beyond the schema, which makes the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Add assets to a memory") and clarifies it takes a list of asset IDs into one memory. It is distinguishable from siblings like immich_remove_memory_assets and immich_update_memory, though it never names those alternatives explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus immich_remove_memory_assets, immich_update_memory, or other asset-attachment tools. The agent must infer applicability purely from the verb. No prerequisites or exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_add_users_to_albumShare album with usersBIdempotent
Share album with users
Share an album with multiple users. Each user can be given a specific role in the album.
Immich operation: PUT /albums/{id}/users · tag: Albums
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| albumUsers | Yes | albumUsers (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false, readOnlyHint=false and openWorldHint=true, so the safety profile is covered. The description adds only that multiple users are affected and that each carries a role, without noting auth requirements or behavior on duplicate/re-shared users, so it adds modest value over the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The body opens by repeating the title verbatim ('Share album with users'), which wastes the most prominent line, though the remaining sentences and the operation/tag footer are compact and front-loaded enough to be usable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no output schema and full annotation coverage, the description supplies the action, the scope (multiple users), the role concept, and the underlying endpoint, leaving little that an agent needs missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the required id and albumUsers (with the role enum) are already documented in the schema. The description restates that a role is assignable per user but contributes no format, syntax, or constraint detail beyond the schema, making the baseline 3 correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Share an album with multiple users') and adds the REST operation (PUT /albums/{id}/users). It clearly distinguishes itself from the add/remove-asset siblings, though it does not explicitly name the closest counterpart, immich_update_album_user, which changes roles rather than adding users.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the verb 'share' and the note that users can be given roles, but there is no explicit when-to-use guidance, no prerequisites, and no direction to sibling tools such as immich_update_album_user or immich_remove_user_from_album.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_bulk_tag_assetsTag assetsBIdempotent
Tag assets
Add multiple tags to multiple assets in a single request.
Immich operation: PUT /tags/assets · tag: Tags
| Name | Required | Description | Default |
|---|---|---|---|
| tagIds | Yes | tagIds (request body) | |
| assetIds | Yes | assetIds (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false, and readOnlyHint=false, so the mutation/safety profile is largely covered. The description adds the underlying operation (PUT /tags/assets) but does not disclose what happens to existing tags (merge vs replace) or any permission/rate-limit behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and very short: purpose sentence first, endpoint metadata last. The repeated title line plus endpoint reference is slightly redundant but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter bulk mutation with no output schema and annotations covering the safety profile, the description is adequate. The only meaningful gap is not clarifying add-vs-replace semantics, which the idempotent hint partially implies.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with both required parameters documented, so the baseline is 3. The description adds no syntax, cardinality, or format detail beyond what the schema already carries (UUID arrays).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Add multiple tags to multiple assets') and explicitly scopes it to bulk operations ('in a single request'), which separates it from the single-asset sibling immich_tag_assets. It stops short of naming that sibling outright, so differentiation is implied rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Beyond the phrase 'in a single request' there is no guidance about when to prefer this over immich_tag_assets or how it relates to immich_untag_assets. No preconditions, no exclusions, and no alternative routing are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_change_passwordChange passwordB
Change password
Change the password of the current user.
Immich operation: POST /auth/change-password · tag: Authentication
| Name | Required | Description | Default |
|---|---|---|---|
| password | Yes | password (request body) | |
| newPassword | Yes | newPassword (request body) | |
| invalidateSessions | No | invalidateSessions (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the agent knows this is a non-idempotent mutation. The description adds the current-user scope and the underlying endpoint mapping, but says nothing about side effects—notably what invalidateSessions does to active sessions. Adds modest context beyond structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded title and a single well-scoped sentence, plus an operation/tag line useful for routing. No wasted prose, though the endpoint metadata is somewhat redundant with the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a security-sensitive mutation with no output schema, the description omits key operational context: that the current password is required, what invalidateSessions does to other sessions, and whether the change is reversible. Annotations cover the safety profile but not these behavior details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3, but the descriptions are tautological ("password (request body)", "invalidateSessions (request body)") and the prose adds no meaning—especially for invalidateSessions, whose behavior is left entirely unexplained by both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Change the password") and narrows scope to the "current user," which distinguishes it from admin tools like immich_update_user_admin that act on other users. It's clear without needing the schema, though it doesn't explicitly name a sibling it replaces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus immich_change_pin_code, immich_update_my_user, or the session-management tools. No prerequisites stated, such as needing the existing password or the consequences of the operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_change_pin_codeChange pin codeCIdempotent
Change pin code
Change the pin code for the current user.
Immich operation: PUT /auth/pin-code · tag: Authentication
| Name | Required | Description | Default |
|---|---|---|---|
| pinCode | No | pinCode (request body) | |
| password | No | password (request body) | |
| newPinCode | Yes | newPinCode (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose readOnly=false, idempotent=true, destructive=false, so the safety profile is covered. The description adds essentially nothing beyond that: it does not say the operation likely requires the existing pin or account password for verification, nor anything about failure behavior, which matters for a credential-mutating endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is short and front-loaded, which is good, but the title is restated verbatim in the first line and the 'Immich operation: PUT /auth/pin-code · tag: Authentication' boilerplate is mapping metadata rather than guidance, so little of the text earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter credential mutation with no output schema and only weak annotations, the description should clarify the old-credential requirement and the relationship to the setup/reset siblings. As written it is thin, though the annotations and 100% schema coverage keep it from being fully inadequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds no parameter meaning at all, and the schema's own text ('pinCode (request body)', 'password (request body)') is purely structural, so an agent gets no help on when pinCode vs password must be supplied.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Change the pin code for the current user') and scopes it to the current user, so the action is unambiguous. However, it never distinguishes itself from the very similar siblings immich_setup_pin_code and immich_reset_pin_code, leaving the agent to infer which of the three to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when/when-not guidance and no mention of alternatives. In a sibling set containing setup_pin_code and reset_pin_code, failing to explain that this tool changes an already-existing pin (vs. creating or clearing one) is a real routing gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_check_bulk_uploadCheck bulk uploadB
Check bulk upload
Determine which assets have already been uploaded to the server based on their SHA1 checksums.
Immich operation: POST /assets/bulk-upload-check · tag: Assets
| Name | Required | Description | Default |
|---|---|---|---|
| assets | Yes | assets (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare openWorldHint, idempotentHint and destructiveHint, so the safety profile is largely covered. The description adds that matching is checksum-based and batch-oriented, but says nothing about auth requirements, maximum batch size, or whether the operation is side-effect free despite readOnlyHint=false on a check-style call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded: purpose sentence first, then the API operation/tag reference. No filler. The 'Immich operation' line is boilerplate but useful for mapping to the underlying endpoint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description should explain the response shape (which assets matched and how results map back via id). The id field description in the schema partially covers matching, but the overall return structure is left unstated, leaving a real gap for a check tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the assets array, id echo field, and Base64/hex SHA1 checksum are fully documented in the schema. The description only restates the checksum basis, adding no syntax or format detail beyond structured data; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+mechanism: determine which assets are already on the server using SHA1 checksums. This is clearly distinguishable from sibling upload/list tools. It stops short of naming an alternative or contrasting with the actual upload tool, but the purpose itself is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use case (pre-upload deduplication check) is strongly implied by 'which assets have already been uploaded,' but there is no explicit when-to-use statement, no mention of pairing with immich_upload_asset, and no prerequisites or exclusions. Usage is inferable but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_cluster_group_regenerate_peopleRegenerate people of users in cluster groupB
Regenerate people of users in cluster group
Forcefully re-run facial recognition for all faces of users in this group.
Immich operation: POST /cluster-groups/{id}/regenerate-people · tag: Cluster groups
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the safety profile is covered. The description adds that the re-run is 'forceful' and applies to 'all faces of users in this group', which gives scope and impact context, but it omits side effects, permissions, or whether existing people data is overwritten. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, but the first line repeats the title verbatim, which is redundant. The remaining two lines (facial-recognition scope and API operation) are efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering the safety profile and the schema fully documenting the single parameter, the description is adequate for a simple mutation. However, it lacks any indication of what the operation returns or whether it is asynchronous, which an agent might need given no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single id parameter is documented as uuid format. The description adds no parameter-level detail, so baseline 3 applies when schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (regenerate) and resource (people of users in cluster group), and clarifies the operation as re-running facial recognition for all faces of those users. It does not explicitly differentiate from sibling facial-recognition tools like immich_reassign_faces or immich_get_faces, so a 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not-to-use guidance. The description implies the operation but does not name alternatives or conditions that select this tool over siblings such as immich_get_cluster_group_users or immich_reassign_faces.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_copy_assetCopy assetBIdempotent
Copy asset
Copy asset information like albums, tags, etc. from one asset to another.
Immich operation: PUT /assets/copy · tag: Assets
| Name | Required | Description | Default |
|---|---|---|---|
| stack | No | stack (request body) | |
| albums | No | albums (request body) | |
| sidecar | No | sidecar (request body) | |
| favorite | No | favorite (request body) | |
| sourceId | Yes | sourceId (request body) | |
| targetId | Yes | targetId (request body) | |
| sharedLinks | No | sharedLinks (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, destructive=false, idempotent=true, and openWorld=true, covering the safety profile. The description adds which data categories get copied ('albums, tags, etc.'), but omits key semantics for a copy operation: whether target's existing data is overwritten or merged, and what the response looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, with the purpose in the first substantive sentence. The trailing 'Immich operation: PUT /assets/copy · tag: Assets' is metadata padding but compact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with annotations covering safety and idempotency and no output schema, the definition is minimally adequate. It leaves unclear what copy actually does to existing target data and whether the boolean flags are opt-in or opt-out, which matters for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is nominally 100%, so the baseline is 3. However the schema descriptions are pure boilerplate ('albums (request body)') and the description only loosely gestures at 'albums, tags, etc.' without clarifying the boolean flags (stack, sidecar, favorite, sharedLinks) or their defaults, so no value is added.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (copy), resource (asset information), and direction (from one asset to another), with examples of what is copied (albums, tags). It is clearly distinguishable from generic update/edit siblings, though it doesn't explicitly name an alternative tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus related tools such as immich_edit_asset, immich_update_asset, or immich_add_assets_to_album. No prerequisites, permissions, or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_create_activityCreate an activityB
Create an activity
Create a like or a comment for an album, or an asset in an album.
Immich operation: POST /activities · tag: Activities
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | type (request body) | |
| albumId | Yes | albumId (request body) | |
| assetId | No | assetId (request body) | |
| comment | No | comment (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false and openWorldHint=true, so the write/network profile is covered. The description adds only the target domain (album/asset in album) and no extra behavior such as auth requirements or repeat-call effects for a non-idempotent write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, with the meaningful payload description in the second line. Minor waste: the title 'Create an activity' is repeated verbatim as the opening line, and the operation/tag line is boilerplate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter write tool with annotations and no output schema, the description is minimally sufficient about what it creates, but omits permission/access context and any indication of the returned activity record, leaving some inference to the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema documents all four parameters, and the enum on type is machine-readable. The prose adds conceptual mapping (like/comment on album or asset) but no format or syntax detail beyond what the schema provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (create) and resource (activity) and clarifies the two concrete payloads: a like or a comment, targeting an album or an asset within an album. This distinguishes it from the read siblings immich_get_activities/immich_get_activity_statistics, though it does not explicitly name immich_delete_activity as its inverse.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the description — you use it to post a reaction or comment — but there is no explicit when-to-use, no prerequisites (e.g. album access), and no routing to alternatives such as immich_delete_activity for removal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_create_albumCreate an albumB
Create an album
Create a new album. The album can also be created with initial users and assets.
Immich operation: POST /albums · tag: Albums
| Name | Required | Description | Default |
|---|---|---|---|
| assetIds | No | assetIds (request body) | |
| albumName | Yes | albumName (request body) | |
| albumUsers | No | albumUsers (request body) | |
| description | No | description (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds only the REST endpoint (POST /albums), which is structured metadata rather than new behavioral context; it says nothing about auth needs, duplicate-name behavior, or side effects. Given the annotation coverage, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and short overall. The leading line repeats the title verbatim and the trailing 'Immich operation / tag' line is boilerplate, which is minor waste but doesn't obscure the main point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The four parameters are fully documented in the schema, so no param explanation is needed, and there is no output schema to describe. However, for a create mutation with no output schema the description omits what is returned (the created album identifier) and any failure/duplicate nuances, leaving a modest gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds interpretive context by noting the album can carry initial users and assets, loosely mapping to albumUsers and assetIds, but it gives no format, constraint, or role details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new album') and adds that the album can be created with initial users and assets, which clarifies the tool's scope. It does not explicitly distinguish itself from siblings such as immich_update_album_info or immich_add_assets_to_album, but the create-vs-modify distinction is fairly evident from the name and verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not-to-use guidance. The sentence 'The album can also be created with initial users and assets' hints at an option but does not tell the agent when to prefer this over immich_create_album-plus-add calls or other album siblings. Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_create_api_keyCreate an API keyC
Create an API key
Creates a new API key. It will be limited to the permissions specified.
Immich operation: POST /api-keys · tag: API keys
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | name (request body) | |
| permissions | Yes | permissions (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=false, destructive=false, and openWorld=true, so the agent knows this is a non-idempotent write. The description usefully adds that the resulting key is limited to the supplied permissions, but omits key behavioral facts such as whether the secret is returned only once, permission escalation limits, or what happens on failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The 'Create an API key' heading and 'Creates a new API key' sentence duplicate each other and the tool name, wasting the front-loaded position. The trailing 'Immich operation: POST /api-keys · tag: API keys' line is metadata rather than agent-facing guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining what the creation returns, yet it never says the API key secret is produced and must be captured. It covers the permission-scoping behavior but leaves the return value and auth requirements undocumented.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already names and constrains both parameters (including the full permission enum), making the baseline 3 appropriate. The description repeats the permissions constraint without adding format, defaults, or guidance on the 'name' parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The title 'Create an API key' and the body's first line 'Creates a new API key' are near-tautological given the tool name immich_create_api_key. It does add that the key is scoped to specified permissions, but it never distinguishes itself from siblings like immich_rotate_api_key, immich_update_api_key, or immich_get_api_key.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of prerequisites (e.g. that the caller must already be authenticated or hold apiKey.create), and no routing against the rotate/update/get siblings. The agent is left to infer everything about when this is the right tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_create_cluster_group_requestCreate a cluster group requestAIdempotent
Create a cluster group request
Ask another user to join the cluster group of the current user.
Immich operation: PUT /cluster-groups/{id}/requests · tag: Cluster groups
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| userId | Yes | userId (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds the useful behavioral fact that this is a request/notification sent to another user rather than a direct membership change, but says nothing about approval flow, permissions, or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short lines, purpose front-loaded, with the operation/tag metadata trailing as boilerplate. Nothing is padded, though the metadata line adds little for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A simple two-parameter mutation with full schema coverage and annotations covering the safety profile; the description supplies the missing 'what this actually does' semantics. Remaining gaps (permission requirements, response shape) are minor given no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The schema's own descriptions are thin ('format: uuid', 'userId (request body)'), and the prose only weakly implies that 'id' is the cluster group and 'userId' is the invited user, so no real clarification is added beyond structured data.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line names the verb+resource and the follow-up sentence 'Ask another user to join the cluster group of the current user' makes the actual semantics concrete, distinguishing it from accept/delete siblings conceptually. However, it never names those siblings explicitly, so differentiation relies on inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence implies the usage context (inviting another user), which is more than nothing, but there is no explicit when-to-use, no prerequisite (e.g., must the requester own the group?), and no pointer to immich_accept_cluster_group_request or immich_delete_cluster_group_request as the follow-up alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_create_faceCreate a faceB
Create a face
Create a new face that has not been discovered by facial recognition. The content of the bounding box is considered a face.
Immich operation: POST /faces · tag: Faces
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | x (request body) | |
| y | Yes | y (request body) | |
| width | Yes | width (request body) | |
| height | Yes | height (request body) | |
| assetId | Yes | assetId (request body) | |
| personId | Yes | personId (request body) | |
| imageWidth | Yes | imageWidth (request body) | |
| imageHeight | Yes | imageHeight (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=true, so the write/safety profile is covered. The description usefully clarifies that the bounding box content is treated as a face, but it says nothing about auth requirements, whether an existing personId must reference a real person, or whether duplicate faces are rejected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded: verb+resource first, qualifying detail second, endpoint metadata last. The leading 'Create a face' line duplicates the title and the second sentence opens with the same phrase, which is minor redundancy rather than bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with 8 required parameters and no output schema, the description covers intent and the bounding-box concept but omits key context an agent needs: required permissions, constraints on personId/assetId, and what the call returns. Annotations carry part of the load, so it is adequate but clearly incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the schema 'descriptions' are placeholders like 'x (request body)' that convey almost nothing. The description adds only a partial hint that x/y/width/height form a bounding box; it does not explain personId, assetId, or how imageWidth/imageHeight relate to the box coordinates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb + resource ('Create a face') and adds a meaningful qualifier: the face must not already have been discovered by facial recognition, which separates it from auto-detected faces. It does not name or contrast with any sibling tool (e.g., immich_create_person, immich_get_faces, immich_reassign_faces), so it falls short of the 5 bar.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the clause 'that has not been discovered by facial recognition' – an agent can infer this is for manually registering undetected faces, but there is no explicit when-to-use/when-not guidance, no mention of the alternative immich_create_person, and no prerequisites such as the asset or person needing to exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_create_jobCreate a manual jobB
Create a manual job
Run a specific job. Most jobs are queued automatically, but this endpoint allows for manual creation of a handful of jobs, including various cleanup tasks, as well as creating a new database backup.
Immich operation: POST /jobs · tag: Jobs
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | name (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readOnly, openWorld, non-idempotent behavior, so the safety profile is covered. The description adds the kind of jobs available (cleanup tasks, database backup) but says nothing about async execution, auth requirements, or side effects, so it only modestly extends the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the operation and followed by one useful clarifying sentence; the trailing 'Immich operation: POST /jobs · tag: Jobs' metadata is low-value but brief. Overall tight and well-ordered.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with no output schema, the description is minimally sufficient, covering what the tool does and roughly when. It omits whether the job runs asynchronously or returns a job handle, which an agent would benefit from knowing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'name' parameter is backed by a self-describing enum, so the baseline is 3. The description does not explain any of the job names, adds no meaning beyond the schema's enum values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource ('Create a manual job', 'Run a specific job') and clarifies the operation is for manually triggering a subset of jobs. It doesn't differentiate from close siblings like immich_run_asset_jobs or immich_run_queue_command_legacy, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It signals context ('Most jobs are queued automatically... allows for manual creation') which implies when to use it, but names no alternative tool and gives no explicit when-not conditions. Usage is implied rather than spelled out against siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_create_libraryCreate a libraryB
Create a library
Create a new external library.
Immich operation: POST /libraries · tag: Libraries
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | name (request body) | |
| ownerId | Yes | ownerId (request body) | |
| importPaths | No | importPaths (request body) | |
| exclusionPatterns | No | exclusionPatterns (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false and openWorldHint=true, so the safety/mutation profile is covered structurally. The description adds only the fact that the library is 'external' (implying filesystem import paths) and the underlying POST endpoint; it says nothing about permissions, what the created library contains, or 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short and front-loaded with the action, but the title is restated verbatim as the first line before the actual sentence, and the 'Immich operation: POST /libraries · tag: Libraries' trailer is generator metadata rather than agent-useful content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter write tool with no output schema, the annotations plus the schema cover most needs. However, the description never notes that ownerId is required, that the library is external/scan-backed, or how it relates to immich_scan_library, leaving gaps an agent would want filled.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (name, ownerId, importPaths, exclusionPatterns) are already documented in the schema. The description adds no format, default, or constraint detail beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Create a new external library'), and the 'external' qualifier distinguishes it from generic library concepts. It is clear enough to separate from the many other create_* siblings, though it never names update_library/delete_library to draw the boundary explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites (e.g., that a user/owner must exist), and no mention of the sibling tools that operate on the same resource (immich_update_library, immich_delete_library, immich_scan_library). The agent must infer usage purely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_create_memoryCreate a memoryC
Create a memory
Create a new memory by providing a name, description, and a list of asset IDs to include in the memory.
Immich operation: POST /memories · tag: Memories
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | data (request body) | |
| type | Yes | type (request body) | |
| hideAt | No | hideAt (request body) | |
| seenAt | No | seenAt (request body) | |
| showAt | No | showAt (request body) | |
| isSaved | No | isSaved (request body) | |
| assetIds | No | assetIds (request body) | |
| memoryAt | Yes | memoryAt (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=true, so the safety/behavioral profile is covered by structured data. The description adds nothing beyond the endpoint line: no auth requirements, no side effects, no note on what the memory becomes visible as or whether it can be undone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, with the create verb leading and the endpoint/tag line trailing. The opening sentence merely restates the title, a small redundancy, but there is no padding beyond that.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter mutation with a nested object (data.year), a const enum-ish type, and several optional timestamps, plus no output schema, the description is far too thin. It never explains the on_this_day memory concept, the meaning of memoryAt/showAt/hideAt/seenAt, or defaults, leaving the agent guessing on the core semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is nominally 100%, but the schema descriptions are boilerplate ('(request body)'), so the schema carries little real meaning. Worse, the description names 'name' and 'description' fields that do not exist in the schema and omits the actual required fields (data.year, memoryAt, type const 'on_this_day'), which is actively misleading rather than merely unhelpful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Create a new memory') and the POST /memories operation line anchors it precisely, so the agent knows this is the creation counterpart to update/delete/get memory. However, it does not distinguish itself from siblings like immich_add_memory_assets or immich_update_memory, and the fields it names (name, description) do not match the actual schema, muddying the picture.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no routing to alternatives. The agent must infer on its own that adding assets to an existing memory belongs to immich_add_memory_assets rather than this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_create_notificationCreate a notificationB
Create a notification
Create a new notification for a specific user.
Immich operation: POST /admin/notifications · tag: Notifications (admin)
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | data (request body) | |
| type | No | type (request body) | |
| level | No | level (request body) | |
| title | Yes | title (request body) | |
| readAt | No | readAt (request body) | |
| userId | Yes | userId (request body) | |
| description | No | description (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false and openWorldHint=true, so the mutation profile is covered. The description's only added behavioral context is the admin-tagged endpoint, which implies elevated authorization needs; it says nothing about what side effects a notification has or whether recipients can see it immediately.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short and front-loads the operation and scope. There is minor redundancy between the title line and the first description sentence, plus a metadata line, but nothing wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with a nested free-form "data" object, two enums, and no output schema, the description is minimal. It never explains the notification types/levels or what the data payload should carry, leaving the agent to guess at the substantive part of the call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, and the schema entries are largely placeholders ("title (request body)") so there is little to build on. The description only hints at the userId requirement via "for a specific user" and never explains the meaning of the data object, type, or level enums.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ("Create a new notification") and adds scope ("for a specific user"), plus the underlying endpoint POST /admin/notifications. It does not differentiate from adjacent siblings like immich_update_notification or immich_delete_notification, but the core purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus alternatives such as immich_update_notification, immich_delete_notification, or immich_get_notifications, and no prerequisites. Usage is only implied by the name and admin tag.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_create_partnerCreate a partnerC
Create a partner
Create a new partner to share assets with.
Immich operation: POST /partners · tag: Partners
| Name | Required | Description | Default |
|---|---|---|---|
| sharedWithId | Yes | sharedWithId (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds no behavioral context beyond that: it does not say the sharing is bidirectional/all-assets, whether duplicate partners error (non-idempotent), or what permissions are required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, but the first line merely repeats the title verbatim before the slightly redundant sentence, and the trailing "Immich operation: POST /partners · tag: Partners" is machine metadata. Little waste, but little earned value either.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter creation tool with annotations covering safety and no output schema, the essentials are present, and the POST endpoint reference is a small plus. It still omits the sharing semantics and the sharedWithId format, which an agent would need to call it authoritatively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is reported at 100%, so the single sharedWithId parameter is documented in the schema, though only as "sharedWithId (request body)". The description adds nothing about the parameter's format (user id vs email) or referent, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Create a partner") and adds domain meaning with "to share assets with," so an agent understands what a partner represents. It does not differentiate from the sibling immich_create_partner_deprecated or explain how it relates to immich_get_partners/immich_remove_partner.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of alternatives such as the deprecated create variant or the remove/update counterparts in the sibling list. The agent must infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_create_partner_deprecatedCreate a partnerB
Create a partner
Create a new partner to share assets with.
Immich operation: POST /partners/{id} · tag: Partners
DEPRECATED — prefer the replacement operation if one exists.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation/safety profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false, openWorldHint=true). The description adds the deprecation warning, which is real behavioral value, but omits auth requirements and what 'sharing' actually grants.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, with the deprecation warning placed at the end where it is visible. Minor redundancy in restating the title verbatim and including a boilerplate 'Immich operation' line.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter create tool with annotations covering safety, the description is roughly adequate. Its key gap is that a deprecated tool should name the replacement operation, and it does not.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, and schema description coverage is 100% ('format: uuid'), so the schema carries the load. The phrase 'share assets with' hints that the id refers to a user to partner with, but this is not stated explicitly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new partner') plus intent ('to share assets with'), which is clear. It does not distinguish itself from the near-identical sibling immich_create_partner beyond the name's '_deprecated' suffix, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'DEPRECATED — prefer the replacement operation if one exists' line nudges the agent away from this tool, which is useful context. However it never names the actual replacement (immich_create_partner) and 'if one exists' is vague, leaving the agent to infer the alternative from the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_create_personCreate a personC
Create a person
Create a new person that can have multiple faces assigned to them.
Immich operation: POST /people · tag: People
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | name (request body) | |
| color | No | color (request body) | |
| isHidden | No | isHidden (request body) | |
| birthDate | No | birthDate (request body) | |
| isFavorite | No | isFavorite (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false and openWorldHint=true, so the safety profile is covered structurally. The description adds only the domain detail that faces can be attached; it says nothing about duplicate-name handling, permissions required, or what the call returns, which is a real gap for a non-idempotent create.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb+resource, followed by one useful sentence and a terse API reference. Slight redundancy between the title line and the 'Create a new person' sentence, but overall tight with no wasted prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter, zero-required, non-idempotent mutation with no output schema, the description leaves open what is created and returned and how duplicates are treated. Annotations cover the safety side and the schema covers the inputs, so the definition is minimally viable but not fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five body fields, and the baseline for high coverage is 3. The description contributes no additional parameter meaning (formats, defaults, constraints like birthDate format or color syntax).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Create) and resource (person) and adds the domain fact that a person can have multiple faces assigned, which helps distinguish it from immich_create_face and immich_get_person. It does not explicitly name which sibling to prefer over it, but the create semantics are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, prerequisites, or alternatives are given. The clause about faces implies a modeling role but does not tell the agent when to create a person versus using immich_merge_people, immich_search_person, or immich_update_person. The agent must infer usage entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_create_profile_imageCreate user profile imageB
Create user profile image
Upload and set a new profile image for the current user.
Immich operation: POST /users/profile-image · tag: Users
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | file (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, and openWorldHint=true, so the mutation/safety profile is covered. The description adds that the image is set for the current user, but does not state whether a previous image is replaced or removed, which is the key behavioral question for this endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-line summary followed by a clarifying sentence and an operational pointer (POST /users/profile-image). Nothing is padded; the only minor redundancy is the title repeating the first line.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter mutation with no output schema, the definition is close to adequate, but it omits practical details an agent needs: the upload encoding of the required 'file' parameter and the effect on any existing profile image.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the schema's only description is the tautological 'file (request body)'. The description adds 'Upload' implying a file upload, yet gives no format guidance (binary/multipart, accepted image types, size limits) for what is a non-trivial upload parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (create/set) and resource (profile image) with clear scope ('for the current user'), which distinguishes it from the sibling get_profile_image and delete_profile_image. It does not explicitly name siblings, but the action is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for the current user' implies the usage context, and 'set a new profile image' implies replacing the existing one, but there is no explicit when-to-use vs alternatives guidance (e.g., contrast with upload_asset or update_my_user).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_create_sessionCreate a sessionB
Create a session
Create a session as a child to the current session. This endpoint is used for casting.
Immich operation: POST /sessions · tag: Sessions
| Name | Required | Description | Default |
|---|---|---|---|
| deviceOS | No | deviceOS (request body) | |
| duration | No | duration (request body) | |
| deviceType | No | deviceType (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, and openWorldHint=true, so the safety/mutation profile is covered. The description usefully adds that the created session is a child of the current session and is for casting. It still omits session lifetime, auth/permission requirements, and what the response contains, so it adds moderate value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening line redundantly repeats the title ('Create a session') before restating it in the next sentence, which is wasted space. The core useful content (child session, casting) is front-loaded, and the operation/tag footer is compact, but the duplication keeps it at adequate rather than tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter, optional-param creation tool with annotations covering the safety profile and no output schema, the description covers the essential purpose and casting use case. Gaps remain around session lifetime, required permissions, and return behavior, making it minimally adequate rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters (deviceOS, duration, deviceType) are considered documented, though their schema descriptions are trivial ('... (request body)'). The description adds no parameter-level meaning (e.g., duration units, valid deviceType values). Baseline 3 applies when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource ('Create a session') plus meaningful scope detail: 'as a child to the current session' and 'used for casting.' This distinguishes it from the many other session tools. It stops short of explicitly naming siblings like update_session or end_session, keeping it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The casting context ('This endpoint is used for casting') implies when the agent should reach for this tool versus other session operations. However, there is no explicit when-not guidance and no named alternative (e.g., get_sessions, update_session, end_session). Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_create_stackCreate a stackB
Create a stack
Create a new stack by providing a name and a list of asset IDs to include in the stack. If any of the provided asset IDs are primary assets of an existing stack, the existing stack will be merged into the newly created stack.
Immich operation: POST /stacks · tag: Stacks
| Name | Required | Description | Default |
|---|---|---|---|
| assetIds | Yes | assetIds (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=false, openWorldHint=true, idempotentHint=false), the description discloses a non-obvious side effect: if an asset is a primary asset of an existing stack, that existing stack is absorbed into the new one. This is valuable behavioral context an agent could not infer from the schema. There is a mild tension with destructiveHint=false, since an existing stack effectively disappears, but the description does surface the effect rather than hide it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The merge caveat is front-loaded in the second sentence and the text is short. However the leading "Create a stack" line merely repeats the title, and the trailing "Immich operation: POST /stacks · tag: Stacks" duplicates routing metadata that already lives in structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter mutation with annotations present and no output schema, the merge semantics are the most important thing to document and they are covered. The completeness is undercut by the fabricated "name" field and by no mention of permission/auth requirements or what the created stack response looks like.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage the baseline is 3, but the description actively introduces a mismatch: it says to provide "a name and a list of asset IDs," while the schema accepts only assetIds and sets additionalProperties=false. An agent following the prose would attempt an invalid parameter, so this is worse than schema-only documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ("Create a new stack") plus the inputs that define it, so an agent understands this groups asset IDs into a stack. It does not differentiate from nearby siblings such as immich_create_album or immich_create_tag, which also create containers from assets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by "Create a new stack by providing a name and a list of asset IDs" and the merge note hints at overlap handling, but there is no explicit when-to-use vs. when-not, and no pointer to alternatives like immich_update_stack or immich_remove_asset_from_stack.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_create_tagCreate a tagB
Create a tag
Create a new tag by providing a name and optional color.
Immich operation: POST /tags · tag: Tags
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | name (request body) | |
| color | No | color (request body) | |
| parentId | No | parentId (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false and openWorldHint=true, covering the safety profile. The description adds the underlying endpoint (POST /tags) and confirms color is optional, but says nothing about behavior on duplicate names, auth requirements, or tag hierarchy effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded: purpose first, then the input contract. The repeated 'Create a tag'/'Create a new tag' phrasing is slightly redundant but not harmful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a simple three-parameter create tool with no output schema. It nonetheless omits duplicate-name behavior and the parentId hierarchy concept, both of which an agent would need to call it correctly alongside immich_upsert_tags.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is nominally 100%, so the baseline is 3. The description echoes the name/color fields but omits parentId entirely, even though that parameter enables nested tag creation — a meaningful capability the schema's bare 'parentId (request body)' label does not explain.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a tag') and clarifies the required input (name) plus optional color. It does not, however, distinguish itself from the closely related sibling immich_upsert_tags, which also creates tags.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus immich_upsert_tags, immich_update_tag, or immich_tag_assets. The agent is left to infer that this is a single-tag creation call with no deduplication/upsert semantics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_create_user_adminCreate a userC
Create a user
Create a new user.
Immich operation: POST /admin/users · tag: Users (admin)
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | name (request body) | |
| Yes | email (request body) | ||
| notify | No | notify (request body) | |
| isAdmin | No | isAdmin (request body) | |
| pinCode | No | pinCode (request body) | |
| password | Yes | password (request body) | |
| avatarColor | No | avatarColor (request body) | |
| storageLabel | No | storageLabel (request body) | |
| quotaSizeInBytes | No | quotaSizeInBytes (request body) | |
| shouldChangePassword | No | shouldChangePassword (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=true, so the safety profile is covered. Beyond that the description adds only the REST verb/path and tag — nothing about admin authorization requirements, what the optional flags (notify, shouldChangePassword) actually trigger, or side effects like welcome emails.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short and front-loaded, but two of the three lines say the same thing ('Create a user' / 'Create a new user'), which is pure redundancy. Only the endpoint/tag line earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter admin mutation with no output schema, the description omits anything an agent needs beyond the bare verb: admin permission requirement, whether the created account is local vs OAuth, and the effect of optional fields like notify and quotaSizeInBytes. Annotations cover safety but not these operational facts.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema itself carries the 10 parameters (including required email/name/password and the avatarColor enum). The description adds no parameter meaning at all, which is the baseline 3 when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb+resource ('Create a user' / 'Create a new user') and adds the concrete endpoint POST /admin/users with tag Users (admin), which signals this is an administrative creation path rather than self-signup. It does not explicitly contrast with siblings such as immich_sign_up_admin, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no stated prerequisite that the caller must be an admin, and no reference to any alternative tool. The agent gets no help deciding between this and immich_sign_up_admin or immich_create_session.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_create_workflowCreate a workflowB
Create a workflow
Create a new workflow, the workflow can also be created with empty filters and actions.
Immich operation: POST /workflows · tag: Workflows
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | name (request body) | |
| steps | No | steps (request body) | |
| enabled | No | enabled (request body) | |
| logging | No | logging (request body) | |
| trigger | Yes | trigger (request body) | |
| description | No | description (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds that creation is possible with empty filters/actions, a modest behavioral detail, plus the underlying POST /workflows endpoint. It does not disclose auth needs, side effects on existing workflows, or what the response contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening line duplicates the title verbatim, and the 'Immich operation: POST /workflows · tag: Workflows' trailer is boilerplate. The substantive sentence is useful but the whole block is padded with redundant framing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter mutation tool with no output schema and no annotations covering behavior, the description is thin. It never mentions that 'trigger' is required, does not list the trigger enum values, and does not explain what a workflow or its steps do, leaving the agent to infer everything from the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters, and the description adds no syntax or format detail. Its mention of 'filters and actions' does not map to any actual schema property (steps/trigger/name/enabled/logging/description), so it neither clarifies nor compensates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (create a workflow), which is clearly distinct from the update/delete/get/search workflow siblings. However, it does not explicitly name or differentiate against those siblings, and the first line merely restates the title.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no alternatives named. The only usage-adjacent note is that the workflow may be created with empty filters and actions, which is a constraint rather than routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_activityDelete an activityBDestructiveIdempotent
Delete an activity
Removes a like or comment from a given album or asset in an album.
Immich operation: DELETE /activities/{id} · tag: Activities
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful domain context (the target is a like or comment, scoped to an album or asset) and the underlying HTTP operation, but says nothing about authorization requirements or whether the removal is permanent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and immediately followed by the clarifying sentence; the trailing 'Immich operation: DELETE /activities/{id} · tag: Activities' line is mostly boilerplate that duplicates the endpoint already implied by the name. Overall tight, with only minor redundancy against the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, no-output-schema mutation whose safety semantics are carried by annotations, the description supplies the essential missing piece — what an activity is. Only the authorization/ownership requirement and the effect on activity counts remain unstated, which are minor gaps at this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (id) and schema description coverage is 100%, so the schema already documents it. The description adds no syntax, format or sourcing guidance for the id beyond what the schema's 'format: uuid' provides — baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (delete an activity) and, crucially, defines what an 'activity' actually is — a like or comment on an album or asset — which is the non-obvious part an agent needs. It does not explicitly name the inverse sibling immich_create_activity, but the mapping is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance is given. The description never states prerequisites (e.g. must the caller own the activity?), nor routes to any alternative such as removing a like via another endpoint. Usage is only implied by the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_albumDelete an albumADestructiveIdempotent
Delete an album
Delete a specific album by its ID. Note the album is initially trashed and then immediately scheduled for deletion, but relies on a background job to complete the process.
Immich operation: DELETE /albums/{id} · tag: Albums
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds genuinely new context: the album is first trashed, then scheduled for deletion, and a background job must complete the process. That deferred/non-immediate completion is exactly the kind of trait an agent cannot infer from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded: purpose first, then the behavioral caveat, then the operation/tag reference. The title is repeated as the opening line, which is mildly redundant, but nothing else is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 no output schema, the description covers the operation and its asynchronous completion path. Missing only the authorization/ownership expectation, which would make it fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'id' parameter, so the schema already carries the meaning. 'By its ID' restates the schema rather than adding format, permission, or lookup guidance, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a specific album by its ID'), which is unambiguous against siblings like delete_library or delete_tag. It does not, however, explicitly contrast itself with any sibling tool, so it stops short of the top band.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says what deletion does but never states when to reach for this tool versus alternatives, nor any prerequisites (ownership, permissions). The deferred-deletion note is behavioral, not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_all_sessionsDelete all sessionsADestructiveIdempotent
Delete all sessions
Delete all sessions for the user. This will not delete the current session.
Immich operation: DELETE /sessions · tag: Sessions
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds genuinely new behavioral context by clarifying that the current session survives, which annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, with the key constraint stated immediately after the purpose. The opening line restates the title verbatim, which is mild redundancy but costs little.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema operation whose annotations already carry the destructive/idempotent profile, the description supplies the one behavioral detail an agent needs (current session preserved). Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate. This is the expected baseline for a no-argument operation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with clear scope: 'Delete all sessions for the user.' The word 'all' distinguishes it from the singular immich_delete_session sibling, though the description never names that alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides contextual guidance via 'This will not delete the current session,' which tells the agent a boundary of the operation. However, it does not state when to prefer this bulk delete over immich_delete_session or immich_end_session, leaving the routing decision implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_api_keyDelete an API keyADestructiveIdempotent
Delete an API key
Deletes an API key identified by its ID. The current user must own this API key.
Immich operation: DELETE /api-keys/{id} · tag: API keys
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds genuine context beyond that: the ownership authorization requirement, which the agent cannot infer from the annotations. It stops short of noting irreversibility or token invalidation side effects, so not 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and short, with the ownership constraint stated early and the API operation mapping appended. The title is repeated almost verbatim in the first sentence ('Delete an API key' / 'Deletes an API key'), a minor redundancy that keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter delete with destructive/idempotent annotations already covering the safety profile and no output schema, the description supplies what is needed: what it does, the ownership precondition, and the underlying endpoint. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter with 100% schema description coverage, so the schema already documents the UUID id. The description's 'identified by its ID' adds no format or syntax detail beyond the schema, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (API key) and identifies the selector (by ID). An agent can distinguish it from immich_create_api_key, immich_update_api_key, and immich_rotate_api_key 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a real prerequisite ('The current user must own this API key'), which is useful for deciding whether the call will succeed. However, it gives no explicit when-to-use guidance or alternative routing (e.g., use rotate_api_key to regenerate rather than delete), leaving usage implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_asset_fileDelete an asset fileBDestructiveIdempotent
Delete an asset file
Delete a file and remove it from the database.
Immich operation: DELETE /asset-files/{id} · tag: Asset files
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds one useful extra fact — the record is removed from the database, not just the file — but says nothing about permissions required, whether the underlying object storage file is also purged, or recoverability.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, with the core action stated first. The opening line duplicates the title and 'Delete a file' repeats the first sentence, a small amount of redundancy but nothing that obscures the message.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive delete with annotations covering the safety profile and no output schema, the description is minimally sufficient. It could still clarify the asset-file vs asset boundary and what happens to the backing binary, which are the questions an agent would have here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single required id parameter with 100% schema coverage, so the schema already documents the input. The description adds no semantics about what the id identifies (asset file id vs asset id), leaving the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (delete an asset file) and adds that the file is removed from the database. It is clear on its own, but does not differentiate itself from nearby siblings like immich_delete_assets, immich_delete_asset_metadata, or immich_get_asset_file — the 'asset file' vs 'asset' distinction is left implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no mention of alternatives in a sibling set containing several other delete/asset-file tools. The agent must infer the routing decision entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_asset_metadataDelete asset metadata by keyBDestructiveIdempotent
Delete asset metadata by key
Delete a specific metadata key-value pair associated with the specified asset.
Immich operation: DELETE /assets/{id}/metadata/{key} · tag: Assets
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Asset ID | |
| key | Yes | Metadata key |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false, and openWorldHint=true, so the safety profile is covered without the description's help. The description is consistent with those hints and adds the underlying DELETE endpoint, but says nothing about behavior when the key is absent (error vs. silent no-op) or any permission requirement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded: purpose first, endpoint last. The opening line duplicates the title verbatim and the second sentence largely restates it, so there is mild redundancy, but nothing is bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a trivial two-parameter, fully-annotated delete with no output schema, the description covers what the operation does and where it maps in the API. The only meaningful gap is what happens on a missing key, which is minor for a delete-by-key tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% ('Asset ID', 'Metadata key'), so both parameters are already documented in the schema. The description adds no format, casing, or key-namespace detail beyond what the schema provides, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (a single asset metadata key-value pair on a given asset), which an agent can distinguish from immich_get_asset_metadata_by_key and immich_update_asset_metadata. It never explicitly names the bulk sibling immich_delete_bulk_asset_metadata, so the single-vs-bulk distinction is left to inference from 'specific'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance is given, and no alternative is named even though immich_delete_bulk_asset_metadata and immich_update_asset_metadata are obvious adjacent choices. The agent must infer routing purely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_assetsDelete assetsCDestructiveIdempotent
Delete assets
Deletes multiple assets at the same time.
Immich operation: DELETE /assets · tag: Assets
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | ids (request body) | |
| force | No | force (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=true, so the safety profile is covered structurally. The description adds nothing beyond that: it never says whether deleted assets go to trash or are permanently removed, whether the `force` flag changes that, or what authorization is required — meaningful context for a destructive bulk operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, but the first line merely repeats the title verbatim before the sentence that adds information, which is mild redundancy rather than a functional flaw.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, multi-asset delete with no output schema, the description should at minimum clarify trash-vs-permanent semantics and the effect of `force`. Given the complexity of the operation and its irreversibility, the current text leaves the agent under-informed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both `ids` and `force` are documented in the schema, establishing the baseline of 3. The description contributes no additional meaning, notably nothing about what `force` actually does.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Delete assets', 'Deletes multiple assets at the same time') and the underlying operation (DELETE /assets), so the agent knows exactly what it does. It does not, however, distinguish itself from the many other delete_* siblings in the namespace.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus alternatives such as immich_delete_asset_file, immich_delete_duplicate(s), or immich_restore_assets. There is no mention of prerequisites, permissions, or the recovery path after deletion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_bulk_asset_metadataDelete asset metadataADestructiveIdempotent
Delete asset metadata
Delete metadata key-value pairs for multiple assets.
Immich operation: DELETE /assets/metadata · tag: Assets
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | items (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false, and openWorldHint=true, so the safety profile is covered. The description adds the underlying operation and clarifies that key-value pairs are removed, but does not add further behavioral context such as auth requirements or irreversibility details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the action and scope. The first line duplicates the title, which is slightly redundant, but the remaining two lines are useful and earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering safety semantics and the schema covering the single parameter completely, the description provides enough context for an agent to understand what the tool does and when it applies. No output schema exists, so return-value explanation is not required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'items' parameter is fully documented in the schema, including nested assetId and key descriptions. The description adds no parameter syntax or format details beyond what the schema already provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Delete'), resource ('asset metadata'), and scope ('for multiple assets'). This clearly distinguishes it from the singular sibling immich_delete_asset_metadata and from update operations on bulk metadata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for multiple assets' implies the bulk use case and distinguishes it from single-asset deletion, but it does not explicitly name alternatives or state when not to use it. Usage context is implied rather than instructed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_cluster_group_requestDecline a cluster group requestBDestructiveIdempotent
Decline a cluster group request
Delete a pending request to join a cluster group.
Immich operation: DELETE /cluster-groups/requests/{id} · tag: Cluster groups
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered. The description adds only the 'pending' state qualifier and the underlying endpoint, with no detail on permissions, effects on the requester, or reversibility – modest added value against a lower bar.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short, but the title sentence is repeated verbatim in the description body and the following line restates the same action, so a third of the text is redundant. The API-operation trailer is useful metadata but not front-loaded content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter delete whose annotations already disclose the destructive/idempotent profile and whose schema is fully documented, the description says enough to invoke correctly. Minor gaps remain (no mention of required permissions or the resulting state of the declined request).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single 'id' parameter at 100% schema coverage (documented as uuid format), so the schema carries all meaning. The description adds nothing about which id is expected beyond what the schema already provides, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Decline/Delete) and resource (a pending request to join a cluster group), which an agent can distinguish from the many unrelated delete_* siblings. It does not explicitly name its opposite sibling immich_accept_cluster_group_request, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use or when-not-to-use guidance and never mentions the obvious alternative, immich_accept_cluster_group_request. The only usage signal is the word 'pending', which implies the request must still be pending but is not stated as a condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_database_backupDelete database backupBDestructiveIdempotent
Delete database backup
Delete a backup by its filename
Immich operation: DELETE /admin/database-backups · tag: Database Backups (admin)
| Name | Required | Description | Default |
|---|---|---|---|
| backups | Yes | backups (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the agent knows this is an irreversible-style write. The description adds the concrete endpoint (DELETE /admin/database-backups) and that the target is identified by filename, but says nothing about whether the file is permanently removed from disk or whether the action can be undone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short lines, front-loaded with the action and followed by the identifying detail, with no filler prose. The only waste is mild repetition between the title line and the 'Delete a backup by its filename' line.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive admin tool whose annotations already cover the safety profile, the description is close to sufficient but leaves two gaps: it never says the parameter is a list of multiple filenames (the schema takes an array), and it does not state whether deletion is permanent or recoverable via the restore flow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is reported at 100%, but the schema's only text is the placeholder 'backups (request body)', so the schema itself conveys little. The description's 'by its filename' adds real meaning by telling the agent the array elements are backup filenames, which is the baseline expectation when the schema does the naming.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Delete database backup') and adds the key discriminating detail 'by its filename', which separates it from sibling list/download/upload backup tools. It stops short of naming those siblings explicitly, so an agent must infer the boundary from the verb alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance; the admin tag hints at required privilege but the description never states that an admin context is mandatory. Nothing routes the agent between this tool and immich_list_database_backups, immich_download_database_backup, or immich_upload_database_backup.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_duplicateDismiss a duplicate groupADestructiveIdempotent
Dismiss a duplicate group
Dismiss a duplicate group by its ID, unlinking all assets in the group without deleting them.
Immich operation: DELETE /duplicates/{id} · tag: Duplicates
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered. The description earns credit by resolving the tension the annotations create: it explains that this 'delete' does not destroy assets but only unlinks them. It omits auth/rate-limit context, so not 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, with the key behavioral nuance in the second sentence. The first line simply repeats the title, which is minor redundancy, and the trailing 'Immich operation' metadata is useful provenance rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation tool whose annotations already cover safety, the definition is nearly complete: it explains what the mutation actually does and which endpoint it maps to. The only meaningful omission is how it relates to the plural delete/resolve duplicate siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single id parameter, so the schema carries the documentation burden. The description only adds that the ID refers to the duplicate group, which is a marginal clarification over the schema's uuid type. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('dismiss a duplicate group by its ID') and clarifies the actual effect: assets are unlinked, not deleted. This is genuinely helpful given the 'delete' name. However, it never distinguishes itself from close siblings like immich_delete_duplicates (plural) or immich_resolve_duplicates, which an agent could easily confuse with it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use, when-not, or alternative guidance. With siblings immich_delete_duplicates and immich_resolve_duplicates operating in the same duplicate-handling space, the absence of routing guidance is a real gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_duplicatesDelete duplicatesBDestructiveIdempotent
Delete duplicates
Delete multiple duplicate assets specified by their IDs.
Immich operation: DELETE /duplicates · tag: Duplicates
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | ids (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered structurally. The description adds only the underlying endpoint (DELETE /duplicates) and tag, plus the fact that deletion is by ID list; it says nothing about irreversibility, permissions, or what happens to the removed assets.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb phrase and kept to one operative sentence plus endpoint metadata. The repeated title as the first line is slightly redundant but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 full annotations and no output schema, the description is minimally sufficient to invoke. It falls short only on sibling disambiguation, which matters here because immich_delete_duplicate exists and could easily be chosen instead.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single ids parameter, so the schema already documents the UUID array. The phrase 'specified by their IDs' mirrors that without adding format or constraint detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Delete) and resource (multiple duplicate assets specified by their IDs), and the 'multiple' wording hints at batch scope. However, it never distinguishes itself from the near-identical sibling immich_delete_duplicate (singular) or immich_resolve_duplicates, which is the main ambiguity an agent would face.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of the alternative immich_delete_duplicate or immich_resolve_duplicates. Given three sibling tools all dealing with duplicate removal, the absence of any routing guidance is a real gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_faceDelete a faceCDestructiveIdempotent
Delete a face
Delete a face identified by the id. Optionally can be force deleted.
Immich operation: DELETE /faces/{id} · tag: Faces
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| force | Yes | force (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false, and openWorldHint=true. The description adds the raw HTTP operation and mentions force deletion, but does not explain what force does, whether deletion is permanent, what permissions are required, or what side effects occur.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, but it redundantly repeats 'Delete a face' after the title and before the main sentence. Otherwise it is appropriately sized for a simple delete operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a simple delete endpoint with annotations covering its safety profile and a schema covering both parameters. However, the description omits what force actually does and misleadingly calls it optional when it is required, leaving a meaningful gap for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds that the id identifies the face and that force can be used, but it says force is optional while the schema marks it as required, which is a misleading nuance rather than a helpful clarification.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: delete a face identified by id. It clearly distinguishes from generic delete tools by naming the resource, though it does not explicitly differentiate itself from siblings like immich_delete_person or immich_delete_people.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as immich_delete_person. The phrase 'Optionally can be force deleted' hints at a mode but does not explain when or why to use force deletion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_integrity_reportDelete integrity report itemADestructiveIdempotent
Delete integrity report item
Delete a given report item and perform corresponding deletion (e.g. trash asset, delete file)
Immich operation: DELETE /admin/integrity/report/{id} · tag: Maintenance (admin)
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=true. The description adds genuine value beyond those flags by disclosing the cascading side effect ('perform corresponding deletion, e.g. trash asset, delete file'), which tells the agent that deleting a report item alters underlying asset/file state. It stops short of permission or reversibility detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Compact and front-loaded, leading with the action and following with the side-effect clarification and the raw operation. Slight redundancy between the title line and the 'Delete a given report item' sentence, but no wasted content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive admin delete with no output schema, the description covers the action, its cascading effect, and the endpoint/method. Nothing critical is missing for correct invocation, though it could note admin permission requirements.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with a single 'id' (uuid) parameter, so the schema fully documents the input. The description adds no format or sourcing guidance for the id beyond what the schema already provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete integrity report item') and clarifies that the deletion cascades to downstream actions (trash asset, delete file). It does not, however, differentiate itself from the many sibling delete tools beyond naming the integrity-report resource. Clear verb+resource with useful scope detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No statement of when to use this tool versus alternatives, no prerequisites, and no mention that it targets an admin/maintenance context (the '(admin)' label is buried in the operation string). The agent must infer usage from the resource name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_libraryDelete a libraryBDestructiveIdempotent
Delete a library
Delete an external library by its ID.
Immich operation: DELETE /libraries/{id} · tag: Libraries
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds the API endpoint and clarifies that it targets an external library by ID, but it does not disclose cascading effects, permission requirements, or what happens to associated assets.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is short and front-loads the action. The first line repeats the title, and the API-operation line is metadata rather than explanation, but there is no unnecessary filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter delete operation with annotations covering destructiveness and idempotency, the description is minimally sufficient. However, it omits usage context and any caution about the impact of deleting an external library, which would help an agent decide when this tool is appropriate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single required id parameter, and the schema specifies the UUID format. The description only repeats 'by its ID' and adds no further meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Delete an external library by its ID.' It also includes the exact API operation, so an agent can distinguish this from deletion tools for albums, assets, users, and other resources without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool does but gives no guidance on when to use it versus alternatives such as immich_update_library, immich_scan_library, or immich_get_library. There are no prerequisites, warnings, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_memoryDelete a memoryADestructiveIdempotent
Delete a memory
Delete a specific memory by its ID.
Immich operation: DELETE /memories/{id} · tag: Memories
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, idempotentHint=true, and openWorldHint=true, so the safety profile is covered. The description adds the concrete HTTP operation 'DELETE /memories/{id}', which is useful context, but does not add details like permission requirements or what happens to associated memory assets beyond the annotation-level destructive hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with the operation. However, the first line simply repeats the title 'Delete a memory', which is redundant, while the second and third lines add useful specificity and API context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter delete tool with rich annotations and no output schema, the description is largely complete. It identifies the exact operation and parameter role, though it omits permission or downstream-effect details that could matter for a destructive memory operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter, and the schema has 100% description coverage with 'format: uuid'. The description says 'by its ID' but adds no syntax or format detail beyond what the schema already provides, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a memory') and then narrows it to 'a specific memory by its ID.' This clearly distinguishes it from sibling tools like immich_update_memory, immich_remove_memory_assets, and immich_search_memories.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives. It does not mention prerequisites, when not to use it, or how it differs from related memory operations such as immich_remove_memory_assets or immich_update_memory.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_notificationDelete a notificationCDestructiveIdempotent
Delete a notification
Delete a specific notification.
Immich operation: DELETE /notifications/{id} · tag: Notifications
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is fully covered by structured data. The description adds only the REST mapping (DELETE /notifications/{id}) and repeats the title, contributing no behavioral context such as whether deletion is permanent or what permissions are required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is padded: the title 'Delete a notification' is repeated verbatim as the first line, followed by a near-identical second sentence, plus a metadata line. Only the REST endpoint reference is non-redundant, so most of the text does not earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter delete with full annotation coverage and no output schema, the definition is minimally sufficient. However, it omits the irreversibility/alternative-tool context that would make an agent confident it is choosing the right delete variant.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single id parameter is documented (format: uuid), so the schema carries the weight. The description adds nothing beyond the endpoint template echoing {id}, which fits the baseline 3 for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 notification), and 'a specific notification' implies single-item scope versus the bulk sibling. It does not explicitly name immich_delete_notifications, so the agent must infer single-vs-bulk from the wording alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no exclusion, and no mention of the obvious alternative immich_delete_notifications for bulk deletion. The agent gets a purpose statement but nothing that routes it between the singular and plural tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_notificationsDelete notificationsCDestructiveIdempotent
Delete notifications
Delete a list of notifications at once.
Immich operation: DELETE /notifications · tag: Notifications
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | ids (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, covering the safety profile. The description adds only the raw endpoint and tag metadata, saying nothing about permanence, whether IDs that don't exist cause errors, or any auth requirements — no value beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short and front-loaded, but the first line simply repeats the tool title verbatim, and the 'Immich operation: DELETE /notifications · tag: Notifications' line is generator metadata that carries little decision value. Roughly half the text is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter bulk delete with full schema coverage and annotations that declare the destructive/idempotent profile, the description is adequate — an agent can call it correctly. Only minor gaps remain, such as behavior on non-existent IDs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (a single required 'ids' array with uuid items), so the schema fully documents the parameter. The description adds no format, limit, or batch-size guidance beyond what the schema provides, which is the baseline 3 case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete notifications') and clarifies the bulk scope with 'Delete a list of notifications at once,' which implicitly separates it from the singular sibling immich_delete_notification. It stops short of explicitly naming that sibling, so differentiation requires a small inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'at once' hints at the bulk use case, but there is no explicit when-to-use guidance, no mention of the single-notification alternative, and no prerequisites or permission notes. An agent must infer the routing decision entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_peopleDelete peopleBDestructiveIdempotent
Delete people
Bulk delete a list of people at once.
Immich operation: DELETE /people · tag: People
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | ids (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds the bulk-multiplicity context but says nothing about consequences (e.g., what happens to associated faces/assets) or auth needs, so the added behavioral value is modest.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The body is short and front-loaded, but the opening line 'Delete people' duplicates the tool title verbatim and the closing 'Immich operation/tag' line is template boilerplate. Small redundancy keeps it from being tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 essentials exist, and annotations carry the safety profile. However, the description omits what deleting a person actually removes or affects, leaving room for an agent to underestimate impact; it is adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'ids' parameter, so the schema already documents the UUID-array body. The description's 'list of people' loosely reinforces that ids is plural but adds no format or constraint detail; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Delete people') and clarifies the bulk scope ('Bulk delete a list of people at once'), which distinguishes it from the single-target sibling immich_delete_person. It falls short of naming that sibling explicitly, so an agent must infer the distinction from 'bulk' and 'list'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Bulk delete a list of people at once' implies usage (multiple people to remove in one call), but there is no explicit when-to-use guidance, no named alternative, and no preconditions such as required permissions or confirmation. Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_personDelete personCDestructiveIdempotent
Delete person
Delete an individual person.
Immich operation: DELETE /people/{id} · tag: People
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered structurally. The description adds nothing beyond the raw endpoint: it does not say what collateral data is removed (faces, thumbnails, asset associations), whether the action is reversible, or what permissions are required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, but 'Delete person' is restated as 'Delete an individual person' with no new information, so one of the three lines is redundant padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive delete, the schema and annotations cover input and safety. The remaining gap is the blast radius of the deletion, which a destructiveHint alone does not convey, so the definition is adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single uuid id parameter, so the schema fully documents the input and the description adds no syntax or format detail. Baseline 3 applies when the schema does all the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb+resource ('Delete an individual person') and the word 'individual' gestures at single-item scope versus the plural sibling immich_delete_people. It stops short of naming that sibling, so the differentiation is implied rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance and no alternatives are mentioned. With immich_delete_people (bulk) and immich_delete_face sitting right beside it, the definition never tells the agent which one applies to a given request.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_profile_imageDelete user profile imageBDestructiveIdempotent
Delete user profile image
Delete the profile image of the current user.
Immich operation: DELETE /users/profile-image · tag: Users
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds the 'current user' target scope and the underlying DELETE /users/profile-image operation, which is useful context. It does not say what happens when no profile image exists or whether the default avatar is substituted, which for a destructive tool is a residual gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short lines, front-loaded with the action. The opening line merely restates the title before the substantive 'current user' detail, which is minor redundancy but not costly at this length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema mutation whose annotations already carry the destructive/idempotent profile, the description supplies everything needed to invoke it safely. Only the post-deletion state is left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate. Baseline 4 applies for a correctly parameterless definition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete the profile image') and scopes it to the current user, which distinguishes it from admin-level image operations and from immich_get_profile_image / immich_create_profile_image. It does not name those siblings, but the resource and scope are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance and no alternative tool is mentioned. The 'current user' phrasing implies self-service usage, but an agent must infer that rather than read it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_server_licenseDelete server product keyADestructiveIdempotent
Delete server product key
Delete the currently set server product key.
Immich operation: DELETE /server/license · tag: Server
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, so the agent knows the safety profile. The description adds only 'currently set', implying it acts on whatever key exists with no input; it does not say what happens if no key is configured or what authorization is required, which is modest added value over the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences plus an endpoint reference line; the action and its target are front-loaded with no filler or repetition beyond the title restatement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, destructive administrative action with rich annotations and no output schema, the description is adequate. Only error behavior (e.g., no license present) is unstated, a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description correctly implies no input is needed by scoping the action to the 'currently set' key, but there is no parameter detail to add.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete server product key') and clarifies scope with 'currently set', which distinguishes it from set_server_license and get_server_license in the sibling list. It does not name those siblings explicitly, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of the paired immich_get_server_license or immich_set_server_license tools, and no statement of prerequisites or consequences. Usage is only inferable from the name itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_sessionDelete a sessionADestructiveIdempotent
Delete a session
Delete a specific session by id.
Immich operation: DELETE /sessions/{id} · tag: Sessions
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false, and openWorldHint=true, so the safety profile is covered. The description adds the concrete DELETE /sessions/{id} operation and Sessions tag, but does not describe auth requirements, side effects, or whether the current session can be targeted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, with the operation line giving useful API context. The first line repeats the title 'Delete a session' exactly, which is slightly redundant, but overall it is efficiently structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter delete operation with full schema coverage and annotations covering destructiveness and idempotency, the description plus structured fields are largely complete. It does not explain potential effects on the caller's own session or authentication requirements, leaving minor context gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: the single id parameter is fully documented in the schema with its uuid format. The description only says 'by id', adding no syntax or format meaning beyond the structured schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Delete a session', 'Delete a specific session by id') and includes the underlying API operation. However, it does not explicitly distinguish this tool from close siblings such as immich_delete_all_sessions or immich_end_session, so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'by id' implies the tool is used when a specific session id is available, but there is no explicit guidance about when to choose this over immich_delete_all_sessions or immich_end_session. Usage is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_stackDelete a stackBDestructiveIdempotent
Delete a stack
Delete a specific stack by its ID.
Immich operation: DELETE /stacks/{id} · tag: Stacks
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds only the raw API endpoint (DELETE /stacks/{id}); it does not say whether the underlying assets are deleted or merely unstacked, which is the key behavioral question for a destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and brief, with the core action stated first. There is minor redundancy between the title, the repeated 'Delete a stack', and the boilerplate API-operation line, but nothing is bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive operation with annotations carrying the safety hints, the definition is minimally adequate. It omits the consequence for stack members and any prerequisite/permission notes, which an agent would benefit from before invoking.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single id parameter is documented as a uuid in the schema, so the schema does the heavy lifting. The description's 'by its ID' adds only marginal confirmation beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a stack') and adds the identifier scope ('by its ID'), which distinguishes it from a bulk delete. However, it never names or contrasts with the close sibling immich_delete_stacks, so the differentiation is only implied.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'a specific stack by its ID' implies single-stack usage versus bulk deletion, but there is no explicit when-to-use/when-not guidance or routing to alternatives such as immich_delete_stacks or immich_remove_asset_from_stack.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_stacksDelete stacksADestructiveIdempotent
Delete stacks
Delete multiple stacks by providing a list of stack IDs.
Immich operation: DELETE /stacks · tag: Stacks
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | ids (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered structurally. The description confirms the batch/list nature but says nothing about what actually gets destroyed (e.g., whether member assets are deleted or merely unstaked), which would be valuable extra context for a destructive op.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and short; the batch semantics appear immediately. The title is restated in the first line and the 'Immich operation' trailer is boilerplate, but the whole thing is small and wastes little space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter batch delete with destructive/idempotent annotations already present and no output schema, the definition is largely sufficient. The one meaningful gap is whether deleting a stack affects its contained assets, which an agent might reasonably need.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and there is only one parameter, but the schema's own text is thin ('ids (request body)'). The description adds real meaning by clarifying these ids are stack IDs and that the operation accepts a list, exceeding the baseline for a fully-covered schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (stacks) and adds the batch scope ('multiple stacks by providing a list of stack IDs'), which distinguishes it from the singular immich_delete_stack sibling even though that sibling isn't named. Clear and specific, but no explicit sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies batch deletion via 'list of stack IDs,' but gives no explicit when-to-use guidance, no prerequisites, and no routing to immich_delete_stack for single-stack deletion or immich_search_stacks for finding IDs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_sync_ackDelete acknowledgementsCDestructiveIdempotent
Delete acknowledgements
Delete specific synchronization acknowledgments.
Immich operation: DELETE /sync/ack · tag: Sync
| Name | Required | Description | Default |
|---|---|---|---|
| types | No | types (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false and openWorldHint=true, so safety is covered. The description adds only the raw endpoint and tag, without saying what is irreversibly removed or what happens if the optional 'types' filter is omitted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, with the resource first. Minor redundancy in restating 'Delete acknowledgements' from the title and 'Delete specific synchronization acknowledgments', but no wasted prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, zero-required-param tool with no output schema, the annotations cover the safety profile and the schema covers the filter. The main gap is whether omitting 'types' deletes all acknowledgments, which is left unanswered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'types' parameter is documented in the schema (enum of sync entity types, described as 'types (request body)'). The description adds no meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Delete specific synchronization acknowledgments'), which distinguishes it from sibling reads/writes like immich_get_sync_ack and immich_send_sync_ack. It is clear but does not explicitly name those siblings to sharpen the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus immich_send_sync_ack or immich_get_sync_ack, nor on prerequisites such as auth or why a client would delete acks. Usage is only implied by the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_tagDelete a tagBDestructiveIdempotent
Delete a tag
Delete a specific tag by its ID.
Immich operation: DELETE /tags/{id} · tag: Tags
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is fully covered. The description adds the underlying REST operation (DELETE /tags/{id}) but omits what the deletion actually does to assets already carrying the tag, which is the one behavior not derivable from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded: the title line, one clarifying sentence, and a structured operation line. Slight redundancy between the title echo and the second sentence, but nothing detracts.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter delete with full annotation coverage and no output schema, the description is close to sufficient. It is still missing the downstream effect on tagged assets and whether the operation is reversible, which an agent should know before invoking a destructive tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter is a UUID-typed id, so the schema carries the semantics. The description's phrase 'by its ID' merely restates it without adding format or sourcing detail (e.g. how to obtain the id via immich_get_all_tags).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a specific tag by its ID'), which is unambiguous and matches the tool name. It does not, however, distinguish itself from nearby siblings such as immich_untag_assets or immich_update_tag, leaving the agent to infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of alternatives. The description never clarifies that this deletes the tag entity itself (versus immich_untag_assets, which only detaches a tag from assets), which is the most likely routing confusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_user_adminDelete a userCDestructiveIdempotent
Delete a user
Delete a user.
Immich operation: DELETE /admin/users/{id} · tag: Users (admin)
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| force | No | force (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, openWorldHint=true, and readOnlyHint=false, fully covering the safety profile. The description adds nothing beyond them: it does not say what is destroyed (assets, albums, shared links), whether deletion cascades, whether it is reversible, or that admin privileges are required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short and the action is front-loaded, but the phrase 'Delete a user' is duplicated across title and body, and the raw endpoint line adds little. The size is fine; the redundancy is the flaw.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive admin mutation with no output schema, the definition should explain the blast radius and any auth requirement. Instead it only echoes the title, leaving an agent without the information needed to call it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters, giving a baseline of 3. The description adds no syntax or semantics for the ambiguous 'force' flag, so it neither helps nor compensates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description restates the title verbatim ('Delete a user') twice, which is a tautology rather than added meaning. The only new content is the raw endpoint 'DELETE /admin/users/{id}', which does not help an agent distinguish this from siblings like immich_delete_user_license, immich_delete_user_onboarding, or the undo counterpart immich_restore_user_admin.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of prerequisites (admin scope), and no reference to alternatives such as immich_restore_user_admin or soft-delete options. The agent is left to infer everything about when this tool applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_user_licenseDelete user product keyBDestructiveIdempotent
Delete user product key
Delete the registered product key for the current user.
Immich operation: DELETE /users/me/license · tag: Users
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the agent knows this permanently removes something. The description contributes only the concrete endpoint and the fact that it targets the current user's key rather than an admin-managed one — useful scoping, but no auth requirements or post-delete state described.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short, but the first line merely repeats the title verbatim before the actual content, and 'Delete the registered product key for the current user' restates the same idea a third time. The endpoint/tag line is the only value-add, so the definition carries mild redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter destructive endpoint with full annotation coverage and no output schema, the description supplies the target scope and the underlying API route, which is enough to invoke it correctly. A note on whether the delete is reversible or requires re-registration would have completed it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to clarify; baseline 4 applies. The description correctly implies no input is needed beyond the implicit authenticated user context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 (the current user's registered product key / license), and the endpoint line pins down exactly which license is affected — the caller's own, not the server's. It does not explicitly distinguish itself from close siblings like immich_delete_server_license or immich_set_user_license, but the 'current user' scoping makes the target unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus the related license tools (get_user_license, set_user_license, delete_server_license). The only guidance is implied by the verb in the name; no prerequisites, reversal path, or alternative conditions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_user_onboardingDelete user onboardingBDestructiveIdempotent
Delete user onboarding
Delete the onboarding status of the current user.
Immich operation: DELETE /users/me/onboarding · tag: Users
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered. The description adds only the endpoint and the 'current user' scope, which usefully bounds the blast radius but adds no detail on irreversibility or side effects beyond what annotations say.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, but the first line duplicates the tool title verbatim, which is a small waste. The remaining lines are efficient and each carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, destructive-but-idempotent operation whose annotations already convey the safety and mutability profile, the description supplies enough: what is deleted, for whom, and the underlying endpoint. No output schema exists and none is needed for a delete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. No misleading parameter claims are made.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — delete the onboarding status of the current user — which is unambiguous and distinguishable from the sibling read/write variants immich_get_user_onboarding and immich_set_user_onboarding. It does not explicitly name those alternatives, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance; it merely restates the operation and its HTTP endpoint. An agent gets no signal about preconditions, exclusivity with set_user_onboarding, or consequences of clearing onboarding.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_delete_workflowDelete a workflowBDestructiveIdempotent
Delete a workflow
Delete a workflow by its ID.
Immich operation: DELETE /workflows/{id} · tag: Workflows
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=true, covering the safety and re-execution profile. The description adds only the REST mapping (DELETE /workflows/{id}) and tag, which is useful provenance but does not address what deletion destroys (e.g. associated triggers, logs) or whether auth is required. Baseline 3 given annotations carry the safety burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded: the purpose is stated in the first line and repeated by the ID-based mechanism second. No filler. The repeated 'Delete a workflow' in the title and description is mildly redundant, keeping it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-param destructive delete, the annotations plus the REST endpoint reference cover the essentials an agent needs to call it. However, no output schema exists and the description says nothing about what happens after deletion or whether side effects (workflow triggers/logs) are affected, leaving a modest completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with a single required uuid 'id', so the schema already documents the parameter fully. The description adds no format or constraint detail beyond 'by its ID'. Baseline 3 applies as the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Delete) and resource (workflow) plus the mechanism (by its ID). Clear and unambiguous. Siblings like immich_delete_stack or immich_delete_person exist but the target resource is named explicitly, so an agent can route correctly, though the description does not call out how it differs from those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use, when-not-to-use, prerequisites, or alternatives are given. It never mentions siblings such as immich_delete_stacks or immich_update_workflow, nor does it flag that this permanently removes a resource. The agent gets no routing signal beyond the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_detect_prior_installDetect existing installBRead-onlyIdempotent
Detect existing install
Collect integrity checks and other heuristics about local data.
Immich operation: GET /admin/maintenance/detect-install · tag: Maintenance (admin)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is well covered without the description. The description adds only the 'admin' tag and the endpoint, which implies elevated permissions, but says nothing about what the detection actually inspects or how it reports a positive detection.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is short and front-loaded, with the substantive clause ('Collect integrity checks and other heuristics') placed early. It wastes one line restating the title, and the API metadata tail ('Immich operation: GET ... · tag: Maintenance') is scaffolding rather than agent-facing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no parameters, the description carries the burden of explaining what 'detecting a prior install' returns or how the integrity heuristics are surfaced, and it does not. It is adequate for invocation but leaves the agent uncertain about the result shape and the admin-auth requirement beyond the tag.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4; there are no argument semantics for the description to clarify. The description correctly does not invent parameters or filtering options.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource ('Detect existing install') and adds substance with 'Collect integrity checks and other heuristics about local data', including the underlying endpoint. However, the first sentence merely restates the title, and it doesn't differentiate itself from the many other read/maintenance siblings in the namespace.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance is given; the agent cannot tell from the text whether this should be invoked before a migration, after a restore, or as part of routine maintenance. The 'Maintenance (admin)' tag hints at context but names no alternatives or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_download_archiveDownload asset archiveA
Download asset archive
Download a ZIP archive containing the specified assets. The assets must have been previously requested via the "getDownloadInfo" endpoint.
Immich operation: POST /download/archive · tag: Download
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | ||
| slug | No | ||
| edited | No | edited (request body) | |
| assetIds | Yes | assetIds (request body) | |
| archiveName | No | archiveName (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=true), so the bar is lower. The description adds the useful dependency chain (prior getDownloadInfo call) and that the output is a ZIP archive. It does not mention auth requirements or the binary response format, but it adds real context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences plus an operation tag, with the core action front-loaded and the precondition immediately after. The title is redundantly repeated as the first line, but nothing else is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter POST with no output schema, the definition covers the essential call sequence (getDownloadInfo first, then this) and identifies the payload subject. Missing the return type (a binary ZIP) and the meaning of the undocumented body fields keeps it from being complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 60% over 5 parameters; the schema names key, slug, edited, assetIds and archiveName but documents none of them meaningfully. The description only maps 'the specified assets' to assetIds and says nothing about archiveName, key, slug, or edited, so it does little to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Download a ZIP archive containing the specified assets'), which is enough to separate it from immich_download_asset (single asset) and immich_download_asset_file. It stops short of naming those siblings explicitly, so differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a concrete precondition: assets 'must have been previously requested via the getDownloadInfo endpoint.' That is genuine when-to-use guidance for a tool that would otherwise fail confusingly. It does not name alternative download tools or say when not to use this one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_download_assetDownload original assetBRead-onlyIdempotent
Download original asset
Downloads the original file of the specified asset.
Immich operation: GET /assets/{id}/original · tag: Assets
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| key | No | ||
| slug | No | ||
| edited | No | Return edited asset if available |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds only the endpoint and tag, neither of which is behavioral context. It says nothing about what the 'edited' flag does, whether the response is a binary stream, or how large/partial downloads behave.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely short and front-loaded; the title, one clarifying sentence, and a compact endpoint/tag line. It wastes nothing, though the repeated title adds no information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A download tool with 4 parameters (two undocumented), no output schema, and no behavior around edited vs original, ranges, or auth is under-specified. The endpoint line is useful metadata but does not fill the gaps an agent needs to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%: 'id' has format: uuid and 'edited' has a description, but 'key' and 'slug' are undocumented in both schema and description. The description adds no meaning beyond the schema. Baseline 3 is appropriate for partial coverage with no compensating text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (download) and resource (original asset file), and the endpoint reference 'GET /assets/{id}/original' confirms the target. It is distinguishable from siblings like immich_download_asset_file and immich_download_archive by specifying the original file of a single asset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this vs alternatives such as immich_download_asset_file, immich_get_asset_file, or immich_view_asset. The agent must infer the difference from names alone, which is exactly the ambiguity a definition should resolve.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_download_asset_fileDownload an asset fileBRead-onlyIdempotent
Download an asset file
Serve the contents of a specific asset file.
Immich operation: GET /asset-files/{id}/download · tag: Asset files
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds that it "serves the contents" of the file, hinting at a binary/streamed response (useful since there is no output schema), but says nothing about content type, streaming, or large-file handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, with the action stated in the first line. There is mild redundancy between the title, the name, and the first sentence, but nothing wasteful enough to penalize heavily.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a download tool with no output schema and no return-value documentation, the description should say what comes back (binary payload, content type, how to handle it). Annotations cover the safety semantics, but the response-side gap leaves the agent under-informed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single id parameter (uuid format), so the schema carries parameter meaning fully. The description only says "a specific asset file", adding no format or constraint detail beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ("Download an asset file", "Serve the contents of a specific asset file") and even names the underlying operation GET /asset-files/{id}/download. However, it offers no differentiation from close siblings like immich_download_asset, immich_get_asset_file, and immich_view_asset, so an agent cannot tell which one to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use, when-not-to-use, or alternative guidance. The only routing signal is the Immich endpoint/tag metadata, which does not help an agent choose between this tool and immich_download_asset or immich_get_asset_file.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_download_database_backupDownload database backupCRead-onlyIdempotent
Download database backup
Downloads the database backup file
Immich operation: GET /admin/database-backups/{filename} · tag: Database Backups (admin)
| Name | Required | Description | Default |
|---|---|---|---|
| filename | Yes | pattern: ^[a-zA-Z0-9_\-.]+$ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds the admin scope and the REST endpoint, which is useful context, but says nothing about the returned payload (a binary file) or rate/transfer behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short and front-loaded, but the title line and 'Downloads the database backup file' duplicate the same information, so one of the two sentences does not earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read operation whose annotations cover the safety profile, the definition is minimally adequate. It still omits the fact that the response is a downloadable binary file rather than structured data, which matters given there is no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single filename parameter carries a pattern constraint, so the schema does the heavy lifting. The description adds no filename syntax or provenance detail (e.g., where to obtain valid filenames) beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource (download the database backup file) and adds the underlying operation GET /admin/database-backups/{filename}. However, 'Downloads the database backup file' is largely a restatement of the name/title and does not distinguish it from siblings such as immich_list_database_backups or the other download_* tools beyond the admin-tagged endpoint.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance is given. The '(admin)' tag hints at an authorization context but there is no statement of prerequisites, no mention of what to do first (e.g., list backups to obtain a filename), and no alternatives contrasted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_edit_assetApply edits to an existing assetBIdempotent
Apply edits to an existing asset
Apply a series of edit actions (crop, rotate, mirror) to the specified asset.
Immich operation: PUT /assets/{id}/edits · tag: Assets
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| edits | Yes | edits (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (mutation, idempotent, non-destructive), so the bar is lower. The description adds the HTTP semantics (PUT /assets/{id}/edits) and that edits are applied as a series, which hints at replace semantics, but it does not state whether existing edits are overwritten or appended, nor whether the original file is modified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Compact and front-loaded, but the opening line duplicates the title verbatim before the more useful sentence, which is a redundant sentence fragment. The remaining content (action list, endpoint metadata) is tight and earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool, the annotations plus full schema coverage cover most needs, and there is no output schema to explain. However, key behavioral questions an agent would care about — whether these edits replace prior edits, persist non-destructively, or require ownership/permission — are left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents id, edits, and the nested action/parameter shapes including the crop/rotate/mirror enum. The description merely restates the action types the schema already enumerates, adding no syntax or constraint detail. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Apply edits to an existing asset') and enumerates the action types (crop, rotate, mirror), so the agent understands this mutates an asset's edits. It stops short of naming or distinguishing the close siblings immich_get_asset_edits and immich_remove_asset_edits, so it is clear but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says what the tool does but never states when to reach for it versus alternatives like immich_get_asset_edits (read current edits), immich_remove_asset_edits (clear them), or immich_update_asset (other metadata). No prerequisite or exclusion is given, leaving selecting between these siblings to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_empty_queueEmpty a queueBDestructiveIdempotent
Empty a queue
Removes all jobs from the specified queue.
Immich operation: DELETE /queues/{name}/jobs · tag: Queues
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Queue name | |
| failed | No | failed (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false and openWorldHint=true, so the destructive nature is covered. The description adds only the effect (removes all jobs) and the underlying DELETE endpoint. It does not disclose whether this requires elevated permissions, whether it affects running jobs, or how the 'failed' parameter changes behavior, so it adds modest context above the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is front-loaded with the purpose and is very short. The added 'Immich operation' line is redundant with the tool name and could be omitted, but overall it is efficient and there is no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with no output schema, the description tells the agent what it does and how to invoke it via the required name. It omits the meaning of the 'failed' parameter and any permission context, leaving some gaps, but is adequate for a minimally complex tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema documents both parameters including the full enum for 'name'. The description does not explain the 'failed' boolean parameter, which is the one parameter that could change behavior. With schema coverage at 100%, the baseline is 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb (empty) and resource (queue), and the expanded sentence 'Removes all jobs from the specified queue' clarifies what emptying means. It is not differentiated from siblings like immich_run_queue_command_legacy, but no sibling competes for the same purpose, so this is clear without explicit sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the purpose and the required queue name parameter; an agent can infer when to call it. However, there is no explicit guidance on when to prefer this over other queue operations or prerequisites such as needing admin rights, so it is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_empty_trashEmpty trashB
Empty trash
Permanently delete all items in the trash.
Immich operation: POST /trash/empty · tag: Trash
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly claims a permanently destructive operation ('Permanently delete all items in the trash'), while the annotations declare destructiveHint=false and readOnlyHint=false. That is a direct conflict between the stated behavior and the structured safety hints, which is the most consequential field an agent uses to decide whether to call a tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the irreversible effect in one sentence. Minor waste: the title 'Empty trash' is repeated verbatim as the first line before the substantive sentence, but the operation/tag metadata line is compact and useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, no output schema, and no nested objects, the description needs only to convey what happens and to what scope, which it does. Nothing about invocation is left missing for such a simple tool, though it could have warned about irrecoverability relative to restore_trash.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate beyond what the empty schema already shows. Baseline 4 applies for a no-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with full scope: 'Permanently delete all items in the trash.' An agent can immediately distinguish this from the sibling immich_restore_trash and immich_restore_assets without opening any schema, and the appended 'POST /trash/empty' anchors the operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance and no named alternative. The permanent/irreversible nature of the operation is stated but not framed as a decision point against restore_trash, and no prerequisites (e.g., trash must be non-empty, required permissions) are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_end_sessionEnd HLS streaming sessionBDestructiveIdempotent
End HLS streaming session
Releases server resources for the streaming session.
Immich operation: DELETE /assets/{id}/video/stream/{sessionId} · tag: Assets
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| key | No | ||
| slug | No | ||
| sessionId | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, so the safety profile is covered. The description adds genuine behavioral context by stating it "releases server resources," but omits any auth requirements, error behavior, or what happens to an already-ended session.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short, front-loaded, and every line contributes something. The only waste is the first line, which restates the title verbatim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple resource-release operation whose annotations already carry the safety profile and which has no output schema, the description is largely adequate. It falls short on parameter documentation and any usage context, leaving gaps an agent would have to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50% (id and sessionId are documented as uuid, while key and slug have nothing). The endpoint template does show that id and sessionId are path parameters, adding some semantics, but the undocumented parameters are left unexplained in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ("End HLS streaming session") and reinforces it with the underlying DELETE endpoint, making the scope unambiguous. It is clearly distinct from auth-related session siblings (immich_delete_session, immich_lock_session) because it names HLS streaming, though it never explicitly contrasts itself with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this versus alternatives, nor any prerequisites (e.g. that a stream must first be started via immich_play_asset_video). The description only states purpose, leaving usage entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_finish_o_authFinish OAuthA
Finish OAuth
Complete the OAuth authorization process by exchanging the authorization code for a session token.
Immich operation: POST /oauth/callback · tag: Authentication
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | url (request body) | |
| state | No | state (request body) | |
| codeVerifier | No | codeVerifier (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false and openWorldHint=true, so the safety profile is covered. The description adds real value beyond those flags by disclosing the mechanics and outcome: an authorization code is exchanged for a session token, which explains why the call is stateful and non-idempotent. It still omits error behavior and any auth/rate-limit considerations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The substance is a single front-loaded sentence and the operation metadata (POST /oauth/callback, tag) is compact provenance. The opening line repeats the title 'Finish OAuth' verbatim, which is minor waste, but overall the entry is tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter auth endpoint with no output schema and no nested objects, the description is adequate on purpose but leaves gaps: it doesn't say how the resulting session token is returned or consumed, nor how it relates to start_o_auth/redirect_o_auth_to_mobile in the flow. Something more on the flow position and result would complete it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is nominally 100%, but the schema 'descriptions' are only bare names plus '(request body)' for url, state and codeVerifier, adding no semantics. The description's reference to exchanging an authorization code loosely maps to codeVerifier/state but does not genuinely clarify parameter roles, so the baseline 3 for high coverage applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Complete the OAuth authorization process') and adds the mechanism ('exchanging the authorization code for a session token'), so the agent understands this is the callback/final step. It does not explicitly differentiate from the closest siblings such as immich_start_o_auth or immich_logout_o_auth, but the exchange framing makes the role reasonably clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Complete the OAuth authorization process' implies this is invoked as the second step after starting OAuth, which is useful implied context. However, no alternative is named (e.g. start_o_auth vs. these callbacks), no prerequisites are stated, and there is no explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_about_infoGet server informationCRead-onlyIdempotent
Get server information
Retrieve a list of information about the server.
Immich operation: GET /server/about · tag: Server
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is fully covered. The description adds nothing beyond a restatement plus the raw endpoint path, disclosing no auth requirements, no payload shape, and no return characteristics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, but the opening line 'Get server information' merely duplicates the title and the second line paraphrases it again. The only novel content is the endpoint/tag suffix, so a sentence is spent without earning its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 full annotation coverage this is minimally adequate, but with no output schema the description could have said what 'about' information is returned (version, features, license, etc.). The agent gets no sense of the payload, which is the main thing it would want from an info endpoint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline is 4. No parameter semantics gap exists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a verb (retrieve) and resource (server information), but the phrasing 'a list of information about the server' is vague about what is actually returned. The siblings include immich_get_server_version, immich_get_server_statistics, immich_get_server_config, immich_get_server_features, and immich_get_server_license, yet the description gives no basis for choosing this one over those.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no exclusions, and no mention of alternatives despite a crowded server-info family of siblings. The agent is left to infer everything from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_activitiesList all activitiesARead-onlyIdempotent
List all activities
Returns a list of activities for the selected asset or album. The activities are returned in sorted order, with the oldest activities appearing first.
Immich operation: GET /activities · tag: Activities
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Reaction type | |
| level | No | Reaction level | |
| userId | No | Filter by user ID | |
| albumId | Yes | Album ID | |
| assetId | No | Asset ID (if activity is for an asset) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint. The description adds useful return-ordering context (oldest activities first), but omits pagination behavior, auth requirements, and return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded. The first line repeats the title, but the following sentences add scope, ordering, and operation context without wasteful wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity read-only list endpoint with rich annotations and full schema coverage, the description is sufficient. It could mention pagination or output shape, but with no output schema and clear annotations, the remaining gaps are minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters are fully documented in the schema itself. The description adds no syntax or format detail beyond what the schema provides, matching the baseline when schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('activities'), and scopes it to the selected asset or album, which distinguishes it from create/delete activity siblings. It does not name an alternative tool, but the purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: list activities for an asset or album. There is no explicit when-to-use or when-not guidance, no mention of alternatives like get_activity_statistics, and no prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_activity_statisticsRetrieve activity statisticsARead-onlyIdempotent
Retrieve activity statistics
Returns the number of likes and comments for a given album or asset in an album.
Immich operation: GET /activities/statistics · tag: Activities
| Name | Required | Description | Default |
|---|---|---|---|
| albumId | Yes | Album ID | |
| assetId | No | Asset ID (if activity is for an asset) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds that the operation returns counts of likes and comments, which is useful context beyond the annotations, but it says nothing further about the response shape or scoping behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short lines, front-loaded with the purpose and immediately followed by the return semantics; the operation/tag line is metadata but compact. No filler or repetition of the title beyond the opening line.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only statistics endpoint with 100% schema coverage and annotations covering the safety profile, the description is sufficient: it conveys purpose and return content. No output schema exists, so no return-structure explanation is required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (albumId, assetId) are already documented in the schema. The description's phrase 'for a given album or asset in an album' loosely mirrors those two parameters but adds no format or constraint detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource (retrieve activity statistics) and clarifies the return value: counts of likes and comments for an album or an asset in an album. This distinguishes it from the listing sibling immich_get_activities, but it does not name that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the description of what is returned (like/comment counts for an album or asset), but there is no explicit when-to-use guidance, no prerequisites, and no named alternative versus immich_get_activities or immich_get_album_statistics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_admin_configGet the admin configurationCRead-onlyIdempotent
Get the admin configuration
Retrieve admin configuration.
Immich operation: GET /admin/config · tag: Config (admin)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive, and openWorld, so safety is covered. The description adds only the raw HTTP operation string ('GET /admin/config'), which conveys nothing about required admin auth, what fields the config contains, or whether defaults are merged in. Minimal value beyond structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The title, the first line, and 'Retrieve admin configuration' all restate the same idea across three lines, which is redundant padding rather than useful structure. No real information is front-loaded because there is little to convey.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless read-only getter, the description is minimally viable, but it omits the one thing an agent needs given the crowded config-tool family: what distinguishes admin config from the other config endpoints. It is complete on mechanics but not on disambiguation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate. Baseline 4 applies; the empty schema is self-explanatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb ('Get') and resource ('admin configuration'), but the sibling set contains immich_get_config, immich_get_server_config, immich_get_public_config, and immich_get_user_config, and nothing in the description explains how admin config differs from these. The 'admin' qualifier and 'tag: Config (admin)' hint at scope but leave the agent to guess which config surface this returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance and no mention of alternatives. With four near-identical config-getter siblings, the description gives the agent no basis for choosing this tool over immich_get_config or immich_get_server_config.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_admin_config_defaultsGet the system configuration defaultsARead-onlyIdempotent
Get the system configuration defaults
Retrieve the default value of every system configuration property.
Immich operation: GET /admin/config/defaults · tag: Config (admin)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds meaningful behavioral context beyond that: it returns the default of EVERY system configuration property, which characterizes the breadth of the response — valuable since there is no output schema. It stops short of describing permissions/enumeration details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, with the operation/route metadata last. The first line duplicates the title verbatim before the more informative second sentence, a minor redundancy, but nothing bloats the definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, no output schema, and annotations covering the safety profile, the description supplies what remains needed: what is returned (defaults for every system config property) and the underlying endpoint. Only the distinction from sibling config-defaults endpoints is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. There is nothing for the description to clarify, and it correctly avoids inventing parameter discussion.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb+resource: retrieving default values for system configuration properties, and the second sentence scopes it to 'every system configuration property.' It is understandable without opening a schema, but it never distinguishes itself from close siblings like immich_get_admin_config, immich_get_config_defaults, or immich_get_public_config_defaults, which require inference from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this versus the many neighboring config tools. The description names no alternatives and no conditions (e.g. 'use when you need factory values before applying a config change'), so an agent must infer usage from the tool name and the admin tag.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_admin_onboardingRetrieve admin onboardingBRead-onlyIdempotent
Retrieve admin onboarding
Retrieve the current admin onboarding status.
Immich operation: GET /system-metadata/admin-onboarding · tag: System metadata
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is fully covered. The description only restates the title ('Retrieve admin onboarding') and adds no behavioral context such as auth requirements or what the status object contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short, but the title is redundantly repeated as the first line and again as 'Retrieve the current admin onboarding status.' The operation/tag line is genuinely useful metadata, but the opening duplication wastes space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read with full annotation coverage and no output schema, the description is minimally adequate. It never hints at what the onboarding status contains or why an admin would fetch it, leaving a small completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. There is nothing for the description to clarify beyond the empty schema, which is already fully specified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb (Retrieve) and resource (admin onboarding status) and even cites the underlying operation (GET /system-metadata/admin-onboarding). However, it does not differentiate from closely named siblings like immich_get_user_onboarding or immich_update_admin_onboarding.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no when-to-use guidance, no prerequisites, and does not name alternatives or conditions that would select this tool over immich_get_user_onboarding. Usage is only inferable from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_album_infoRetrieve an albumBRead-onlyIdempotent
Retrieve an album
Retrieve information about a specific album by its ID.
Immich operation: GET /albums/{id} · tag: Albums
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| key | No | ||
| slug | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true and destructiveHint=false, so the safety profile is fully covered elsewhere. The description adds only the underlying REST mapping (GET /albums/{id}) and tag, with no extra behavioral context like permission requirements or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The body is short and front-loaded, but the opening line "Retrieve an album" merely duplicates the title before the substantive sentence restates the same idea again, so a portion of the text does not earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool whose annotations cover safety and which has no output schema, the description is adequate to identify and call it. However, the unexplained key/slug parameters leave a real gap for a three-parameter tool with low schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%, so the schema does not carry the load. The description mentions only the ID ("by its ID") and says nothing about the key or slug parameters, leaving two of three parameters unexplained in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Retrieve information about a specific album by its ID"), which distinguishes it from the bulk sibling immich_get_all_albums. It does not explicitly name any sibling as an alternative, so it stops short of the top band.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent infers it should call this when it already has an album ID and needs that album's details. There is no explicit when-to-use/when-not guidance and no pointer to alternatives such as immich_get_all_albums or immich_get_album_statistics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_album_map_markersRetrieve album map markersBRead-onlyIdempotent
Retrieve album map markers
Retrieve map marker information for a specific album by its ID.
Immich operation: GET /albums/{id}/map-markers · tag: Albums
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| key | No | ||
| slug | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds the underlying REST operation (GET /albums/{id}/map-markers) and tag, but says nothing about return shape, pagination, or what a map marker contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is short but redundant: the first line repeats the title verbatim before the actual sentence, and the operation/tag line is machine metadata. The specific information is front-loaded, but the duplication costs a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, a 3-parameter schema at 33% coverage and two unexplained parameters ('key', 'slug'), the description does not supply enough to call the tool confidently. It should at minimum explain what the optional key/slug parameters do and what marker data is returned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%: 'id' is documented only as 'format: uuid', while 'key' and 'slug' have no description anywhere. The description adds meaning only for 'id' ('by its ID') and does not compensate for the two undocumented parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Retrieve') and resource ('map marker information') scoped to 'a specific album by its ID', which implicitly distinguishes it from the sibling immich_get_map_markers (global markers). It is clear, though it never explicitly names that sibling as the contrasting case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'for a specific album by its ID' — the agent can infer this is the album-scoped variant and that an album ID is required. However, no explicit when-to-use/when-not guidance and no alternative tool is named, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_album_statisticsRetrieve album statisticsBRead-onlyIdempotent
Retrieve album statistics
Returns statistics about the albums available to the authenticated user.
Immich operation: GET /albums/statistics · tag: Albums
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered by structured data. The description adds only the scoping detail that results are limited to the authenticated user's albums, and says nothing about what the statistics contain (counts, sizes, date ranges) or whether pagination applies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, but the opening sentence merely restates the title and is immediately followed by a sentence saying the same thing again, and the trailing 'Immich operation / tag' metadata is provenance rather than agent-facing guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 no output schema, the description should carry the burden of explaining what 'statistics' means, since there is no return-value documentation anywhere. As written, the agent knows it returns 'statistics about albums' but not which metrics, leaving a real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies. There is nothing for the description to disambiguate, and the schema is trivially complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Retrieve album statistics') with a scoping clause ('about the albums available to the authenticated user'), so the agent knows this is a per-user album aggregate, not a global one. It does not, however, differentiate itself from close siblings such as immich_get_album_info, immich_get_all_albums, or the other *statistics tools (asset, library, person), which an agent must disambiguate on its own.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no preconditions, and names no alternative. With many sibling statistics/info tools present, an agent gets no signal about why it should pick this one over immich_get_album_info or immich_get_library_statistics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_all_albumsList all albumsBRead-onlyIdempotent
List all albums
Retrieve a list of albums available to the authenticated user.
Immich operation: GET /albums · tag: Albums
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Album ID | |
| name | No | Album name (exact match) | |
| assetId | No | Filter albums containing this asset ID (ignores other parameters) | |
| isOwned | No | Filter by ownership: true = only owned, false = only shared-with-me, undefined = no filter | |
| isShared | No | Filter by shared status: true = only shared, false = not shared, undefined = no filter |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is fully covered. The description only adds the authenticated-user scoping note; it says nothing about result size, pagination, or ordering, which is a meaningful gap for a listing endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, with the operation/tag metadata trailing. It repeats the title verbatim in the first line, a small redundancy, but nothing is bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-optional-parameter listing tool with no output schema, the description is adequate but leaves the filter capability completely unmentioned, so an agent reading only the prose would not know it can narrow by name, ownership, or sharing. Nothing about return shape is required, which keeps this from being worse.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every parameter is documented in the schema (including the notable 'assetId ignores other parameters' caveat), so the baseline of 3 applies. The description contributes no additional parameter meaning at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all albums') and adds scope ('available to the authenticated user'), which distinguishes it from immich_get_album_info (single album) and immich_create_album/immich_delete_album. However, it never mentions that the endpoint is filterable, so 'all' slightly oversells the scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no named alternative (e.g., use immich_get_album_info when you already have an album ID). The agent must infer routing purely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_all_librariesRetrieve librariesBRead-onlyIdempotent
Retrieve libraries
Retrieve a list of external libraries.
Immich operation: GET /libraries · tag: Libraries
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, covering the safety profile. The description adds only that the libraries are 'external' and cites the underlying GET /libraries operation, but omits return format, pagination, or auth details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The text is short and front-loaded, with the core action in the first sentence. The opening line 'Retrieve libraries' redundantly repeats the title, which is a minor waste but not enough to undermine overall conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter, read-only list endpoint whose safety is fully covered by annotations, the description supplies the resource scope and the underlying API operation. No output schema exists, so return-value explanation is not required, leaving the definition sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so the baseline is 4. The description appropriately adds no parameter semantics, and the empty schema is fully self-explanatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: 'Retrieve a list of external libraries.' It does not explicitly differentiate this list-all tool from the sibling immich_get_library that retrieves a single library, so it falls short of the sibling-distinguishing bar for a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives like immich_get_library or immich_get_library_statistics. It only implies a simple list operation without exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_all_peopleGet all peopleCRead-onlyIdempotent
Get all people
Retrieve a list of all people.
Immich operation: GET /people · tag: People
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination | |
| size | No | Number of items per page | |
| withHidden | No | Include hidden people | |
| closestAssetId | No | Closest asset ID for similarity search | |
| closestPersonId | No | Closest person ID for similarity search |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is fully covered. The description adds only the raw endpoint and tag, with no note that hidden people are excluded by default or how pagination defaults (size=500) affect results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short, but the body 'Retrieve a list of all people' merely restates the title, and the endpoint/tag line is metadata filler rather than useful content. No real waste of length, but little earned content either.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 a fully documented schema and no output schema, the description is minimally adequate but never says what a 'person' record contains or how pagination should be driven. It leaves the agent to infer result shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and all five parameters are documented in the schema, so baseline 3 applies. The description contributes nothing about the pagination or similarity-search parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb and resource ('Get all people' / 'Retrieve a list of all people'), so the agent knows this is a bulk read of person entities. It does not distinguish itself from near-siblings like immich_get_person, immich_search_person, or immich_get_faces, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no exclusions, and no mention of alternatives such as immich_search_person for filtered lookups or immich_get_person for a single person. The agent must infer scope from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_all_tagsRetrieve tagsARead-onlyIdempotent
Retrieve tags
Retrieve a list of all tags.
Immich operation: GET /tags · tag: Tags
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the agent knows this is a safe, idempotent read operation. The description adds the operation endpoint and tag category, which is minor context. It doesn't add behavioral details beyond annotations since there are no parameters or side effects to describe.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief and front-loaded with the core action. It includes some redundant metadata (Immich operation and tag) that could be omitted, but it's not overly verbose. It earns its place by stating the resource clearly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool (no parameters, no output schema, strong annotations), the description is complete enough. It tells the agent it retrieves all tags. It could mention that it returns an array of tag objects, but with no output schema, that's a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so no parameter semantics are needed. The baseline for zero parameters is 4, and the description correctly doesn't mention any parameters, which is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb+resource: retrieve a list of all tags. This distinguishes it from write operations like immich_create_tag or immich_update_tag, but it doesn't explicitly differentiate from immich_get_tag_by_id or immich_get_faces. The purpose is still clear from the wording.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (when you need all tags) but doesn't provide explicit when-to-use or when-to-avoid guidance. There's no mention of alternatives like getting a specific tag or filtering. Adequate but lacking in routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_api_keyRetrieve an API keyARead-onlyIdempotent
Retrieve an API key
Retrieve an API key by its ID. The current user must own this API key.
Immich operation: GET /api-keys/{id} · tag: API keys
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the ownership authorization constraint, which is genuine value beyond annotations, but says nothing about return format or error behavior when ownership fails.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, with the ownership condition placed before the endpoint metadata. The opening line duplicates the tool title verbatim, which is minor redundancy, but nothing else is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter read with a complete schema and annotations covering safety, the description is adequate: it states the lookup key, the ownership requirement, and the underlying endpoint. Only the response shape and failure mode are unspecified, which is acceptable given the absence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single required 'id' (uuid), so the schema already documents the parameter fully. The description only restates that lookup is by ID and adds the ownership condition; it contributes no format or syntax detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retrieve an API key by its ID'), and the singular/ID-based phrasing implicitly separates it from the list sibling immich_get_api_keys. It does not explicitly name or contrast against sibling tools like get_my_api_key, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description supplies a real precondition — 'The current user must own this API key' — which tells the agent when the call will succeed. However it gives no explicit when-to-use vs alternatives (get_api_keys for listing, get_my_api_key for the caller's own key), leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_api_keysList all API keysARead-onlyIdempotent
List all API keys
Retrieve all API keys of the current user.
Immich operation: GET /api-keys · tag: API keys
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds only the auth scope (current user's keys); it says nothing about return shape or pagination, which is a modest but real gap for a list endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, with the operation and scope in the opening lines. The first line duplicates the title verbatim and the second sentence restates the same idea, a minor redundancy rather than bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema list tool the description covers the essentials, but without an output schema it could reasonably indicate what the returned API keys contain (ids, names, timestamps) or whether results are paginated. Adequate but with a clear remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description correctly signals a parameterless, unscoped list call, and there is no additional parameter semantics to convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a clear verb+resource ("List all API keys" / "Retrieve all API keys") and states the scope as "of the current user." It does not explicitly distinguish itself from the singular sibling immich_get_api_key or from immich_get_my_api_key, so the differentiation is left to inference rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the phrase "of the current user," which tells the agent this returns the caller's own keys rather than an arbitrary user's. However, no when/when-not conditions or alternatives (e.g., immich_get_my_api_key, immich_get_api_key) are named, so routing is not made explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_apk_linksGet APK linksBRead-onlyIdempotent
Get APK links
Retrieve links to the APKs for the current server version.
Immich operation: GET /server/apk-links · tag: Server
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is fully covered. The description adds only that the links target the current server version and names the underlying GET /server/apk-links operation; it says nothing about auth requirements or return shape. With annotations carrying the burden, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded: the purpose sentence comes before the operation metadata. The title is repeated verbatim as the first line, which is minor redundancy, but there is no wasted prose overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 whose annotations already carry the safety profile, the description is sufficient to call it correctly. It does not explain the return payload, and there is no output schema, but the resource ('links to the APKs') is self-descriptive enough that this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema cannot be improved by parameter prose; per the rubric this is a baseline 4. Nothing in the description is needed to clarify inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (retrieve/get) and resource (APK links for the current server version), which is more specific than a tautological restatement of the title. However, it does not distinguish itself from the many other immich_get_* siblings, so an agent gets no routing signal beyond the name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for the current server version' hints at context but there is no explicit when-to-use, no prerequisites, and no named alternatives among the large set of sibling get_* tools. An agent must infer the call context entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_asset_duplicatesRetrieve duplicatesBRead-onlyIdempotent
Retrieve duplicates
Retrieve a list of duplicate assets available to the authenticated user.
Immich operation: GET /duplicates · tag: Duplicates
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true and destructiveHint=false, so the safety profile is fully covered elsewhere. The description adds one genuine piece of behavioral context - results are scoped to the authenticated user - but says nothing about pagination, result size, or how duplicates are grouped. Modest value beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short lines with the core statement front-loaded and the operation/tag metadata clearly demoted to a suffix. The opening line simply restates the title verbatim, which is mild waste, but nothing else is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no input parameters and no output schema, the description is the only place an agent could learn the shape of the return - e.g. whether duplicates are grouped per original asset, whether the list is paginated, or how many items to expect. It covers the 'what' adequately but leaves this structural gap, so it is minimally viable rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and schema coverage is reported as 100%, so there is no parameter semantics for the description to carry. Baseline 4 applies; no omission or ambiguity is possible here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Retrieve a list of duplicate assets available to the authenticated user.' That is unambiguous and clearly separable from destructructive siblings such as immich_delete_duplicates or immich_resolve_duplicates. It stops short of explicitly naming those siblings or contrasting itself with them, so it lands at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no mention of the obvious adjacent tools (resolve_duplicates, delete_duplicates, delete_duplicate). The only usage hint is the scope phrase 'available to the authenticated user,' which is a scoping remark rather than routing advice. An agent could infer the purpose from the name, but nothing in the text tells it when this is the right call versus its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_asset_editsRetrieve edits for an existing assetBRead-onlyIdempotent
Retrieve edits for an existing asset
Retrieve a series of edit actions (crop, rotate, mirror) associated with the specified asset.
Immich operation: GET /assets/{id}/edits · tag: Assets
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is fully covered. The description adds that the result is a series of edit actions (crop, rotate, mirror), which is useful content context, but says nothing about ordering, pagination, or what an empty result means.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first line restates the title verbatim, which is redundant, before the second line delivers the real content. The trailing 'Immich operation: GET /assets/{id}/edits · tag: Assets' is metadata that does not help an agent decide or invoke, so the description is padded rather than tightly front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool whose annotations carry the full safety profile, the description is nearly complete: it identifies the resource and describes the returned edit actions. With no output schema, a fuller account of the return shape would help, but nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the single id parameter is fully documented in the schema. The description only refers to 'the specified asset' without adding format or constraint details beyond what the schema provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (retrieve) and resource (edits for an asset), and even enumerates the edit kinds (crop, rotate, mirror). It does not, however, differentiate from close siblings like immich_edit_asset or immich_remove_asset_edits, so an agent must infer the read-vs-write distinction from annotations rather than the text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never says when to use this tool versus immich_edit_asset (apply edits) or immich_remove_asset_edits (delete edits). Usage is only implied by the verb 'retrieve', with no conditions, prerequisites, or named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_asset_fileRetrieve an asset fileBRead-onlyIdempotent
Retrieve an asset file
Returns metadata about a specific asset file.
Immich operation: GET /asset-files/{id} · tag: Asset files
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds the useful clarification that this returns metadata rather than file bytes, but says nothing about auth requirements, output format or size, or whether the asset must be owned by the caller.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded: the purpose sentence comes first, followed by the useful endpoint/tag provenance line. No padding, though the title line is essentially repeated as the opening sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with full annotation coverage, no output schema, and no nesting, the definition is minimally sufficient. It could still be clearer about what 'asset file' means versus the asset itself and about which sibling to pick, which is the main gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single required uuid parameter. The description only refers to 'a specific asset file' and adds no format or constraint detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (retrieve) and resource (asset file), and adds that it returns metadata, which distinguishes it from the content-delivering download_asset_file sibling. However it does not distinguish itself from the many other asset-reading siblings such as immich_get_asset_info or immich_get_asset_metadata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no named alternatives despite the tool sitting next to immich_download_asset_file, immich_get_asset_info and immich_get_asset_metadata in the sibling list. The agent must infer the correct choice entirely on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_asset_infoRetrieve an assetBRead-onlyIdempotent
Retrieve an asset
Retrieve detailed information about a specific asset.
Immich operation: GET /assets/{id} · tag: Assets
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| key | No | ||
| slug | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds the REST mapping (GET /assets/{id}) and the Assets tag, which is modestly useful context, but says nothing about permissions, rate limits, or what the response contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, with the key sentence first. The leading 'Retrieve an asset' line duplicates the title and the second line, which is mild waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should hint at what is returned for a detail-fetch tool, and it does not. It is minimally adequate given the annotations cover safety, but an agent gets no information about the returned fields or the meaning of key/slug.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33% — 'id' carries just 'format: uuid', while 'key' and 'slug' are entirely undocumented. The description does not describe any parameter or explain the role of key/slug, so it fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Retrieve detailed information about a specific asset') and pins the underlying REST operation, so the purpose is unambiguous. It does not, however, distinguish itself from close siblings such as immich_get_asset_metadata, immich_get_asset_edits, or immich_view_asset, so an agent gets no signal on which getter to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus the many other asset-read siblings, no prerequisites, and no exclusions. Usage is only implied by the phrase 'a specific asset'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_asset_metadataGet asset metadataARead-onlyIdempotent
Get asset metadata
Retrieve all metadata key-value pairs associated with the specified asset.
Immich operation: GET /assets/{id}/metadata · tag: Assets
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is fully covered. The description only adds the underlying REST mapping (GET /assets/{id}/metadata), which is useful but adds no new behavioral constraints such as return size or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose in the first line and kept to three short lines. The trailing API/tag line is boilerplate but cheap and useful for tracing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only single-parameter lookup with rich annotations and no output schema, the definition covers what the agent needs to call it correctly; only the absence of alternatives guidance keeps it from being fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter exists and schema description coverage is 100% (uuid format documented inline), so the schema carries the semantics. The description adds nothing beyond referring to 'the specified asset'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (retrieve) and resource (metadata key-value pairs) scoped to a single asset, which implicitly separates it from immich_get_asset_metadata_by_key. It does not, however, explicitly name or contrast with that sibling or with update/delete_asset_metadata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the scope ('all metadata key-value pairs for the specified asset'); there is no explicit when-to-use, when-not, or pointer to immich_get_asset_metadata_by_key when only one key is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_asset_metadata_by_keyRetrieve asset metadata by keyCRead-onlyIdempotent
Retrieve asset metadata by key
Retrieve the value of a specific metadata key associated with the specified asset.
Immich operation: GET /assets/{id}/metadata/{key} · tag: Assets
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Asset ID | |
| key | Yes | Metadata key |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is fully covered. The description adds nothing beyond name/title/schema — no mention of behavior when the key is missing, authorization needs, or response shape — so it earns little credit even against the lowered bar.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short and front-loaded, but the first line duplicates the title verbatim and the second sentence largely restates the first, making a meaningful fraction of the text redundant. The endpoint/tag footer is useful metadata but the prose does not fully earn its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-param read with full schema coverage, the description is adequate. However, with no output schema, it should describe what is returned (a single value, an object, or nothing when the key is absent) and it does not, leaving a small but real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both 'id' (Asset ID) and 'key' (Metadata key) are already documented in the schema. The description's phrase 'specific metadata key associated with the specified asset' merely restates those semantics without adding format, constraints, or examples, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource (retrieve the value of a metadata key for a given asset) and the 'by_key' scope implicitly distinguishes it from the sibling immich_get_asset_metadata, which returns all keys. It is clear what the tool does, though the sibling contrast is never made explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use, when-not-to-use, or alternative is named anywhere in the description. It never tells the agent to prefer immich_get_asset_metadata when the key is unknown, nor states any prerequisite (e.g. the key must already exist). Usage is left entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_asset_ocrRetrieve asset OCR dataBRead-onlyIdempotent
Retrieve asset OCR data
Retrieve all OCR (Optical Character Recognition) data associated with the specified asset.
Immich operation: GET /assets/{id}/ocr · tag: Assets
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is fully covered by structured data. The description adds only that all OCR data for the asset is returned, without noting behavior for assets with no OCR results, response shape, or size limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences plus an endpoint tag; the purpose is front-loaded and nothing is padded. The repeated title line is slightly redundant but harmless.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter read with no output schema, the definition is minimally sufficient but leaves the return shape ('OCR data' could be text, boxes, confidence scores) and empty-result behavior unspecified. A brief note on what the OCR payload contains would close the gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single required parameter and schema description coverage is 100% ('format: uuid'), so the schema carries the semantics. The description adds no extra meaning about the id beyond what the schema states, which is the baseline case for high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Retrieve') and resource ('OCR data associated with the specified asset'), which separates it from generic siblings like immich_get_asset_metadata or immich_get_asset_info. It does not explicitly name a sibling to route against, but the resource is narrow enough that an agent can identify it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus alternatives such as immich_get_asset_metadata, immich_get_asset_info, or immich_search_asset_files. The only implicit guidance is the word 'OCR', leaving context and prerequisites to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_assets_by_cityRetrieve assets by cityARead-onlyIdempotent
Retrieve assets by city
Retrieve a list of assets with each asset belonging to a different city. This endpoint is used on the places pages to show a single thumbnail for each city the user has assets in.
Immich operation: GET /search/cities · tag: Search
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so safety is covered. The description adds genuinely useful behavior beyond that: the result is one asset per city (de-duplicated), not all matching assets. It does not describe pagination or ordering, but the core semantic is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the key action, and the clarifying second sentence earns its place by explaining the one-per-city behavior. The opening line duplicates the title, which is minor redundancy, but overall it is compact and well ordered.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter, read-only search endpoint with no output schema, the description supplies enough: what it returns (one asset per city), why (places page thumbnails), and the underlying operation (GET /search/cities). Ordering/pagination details are absent but minor for this scope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to clarify; per the rubric this is a baseline 4. No description text is needed or expected here, and none is misleadingly provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Retrieve) and resource (assets by city), and clarifies the distinctive semantics — 'a list of assets with each asset belonging to a different city.' An agent can tell it is not a bulk asset fetch. It does not explicitly differentiate itself from close siblings like immich_search_places or immich_get_map_markers, keeping it at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a usage context ('used on the places pages to show a single thumbnail for each city'), which implies intent, but never states when to prefer this over alternatives such as immich_search_places or immich_get_map_markers. Usage is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_assets_by_original_pathRetrieve assets by original pathCRead-onlyIdempotent
Retrieve assets by original path
Retrieve assets that are children of a specific folder.
Immich operation: GET /view/folder · tag: Views
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, covering the safety profile. The description adds that results are children of a specific folder, which is useful context about filtering behavior but does not disclose anything beyond the schema and annotations, such as pagination, sorting, or return format. With annotations covering safety, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short but somewhat redundant: the first sentence restates the title, and the second adds a clarification. The third line provides operational metadata (Immich operation, tag) which is useful but not front-loaded. Overall structure is adequate but not optimally concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has one required parameter with 0% schema coverage, no output schema, and only annotations covering safety, the description is incomplete. It does not explain what 'original path' means, how the path should be formatted, or what the return value contains. An agent would need to guess parameter semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 lack of parameter documentation. It mentions 'a specific folder' and a 'path' indirectly, but does not explain the format, semantics, or expected value of the 'path' parameter. This is a significant gap for a required string parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource (retrieve assets) and adds a second, slightly clarifying sentence about children of a folder. However, it does not distinguish itself from siblings like immich_search_assets or immich_get_unique_original_paths, which are likely used for similar asset-retrieval purposes. The purpose is clear but lacks sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit indication of when to use this tool versus alternatives. The description does not mention exclusions, prerequisites, or alternative tools such as immich_search_assets for broader queries. Usage context is left entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_asset_statisticsGet asset statisticsBRead-onlyIdempotent
Get asset statistics
Retrieve various statistics about the assets owned by the authenticated user.
Immich operation: GET /assets/statistics · tag: Assets
| Name | Required | Description | Default |
|---|---|---|---|
| isTrashed | No | Filter by trash status | |
| isFavorite | No | Filter by favorite status | |
| visibility | No | Asset visibility |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds the useful scoping fact that results are limited to the authenticated user's assets, but says nothing about return shape or whether results respect the filters jointly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short lines, front-loaded with the purpose. The first line restates the title verbatim and the trailing 'Immich operation' line is metadata rather than agent-facing guidance, but neither is costly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a statistics endpoint with no output schema, the description never says what statistics come back (counts by type? totals?) or how the three filters combine. With annotations covering safety, this is the main remaining gap and it is only partially acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — all three optional filters (isTrashed, isFavorite, visibility) are documented in the schema, including the enum values. The description adds no parameter meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get asset statistics') and adds scope ('assets owned by the authenticated user'), which helps distinguish it from server-wide siblings like immich_get_server_statistics. It does not, however, mention the closely-named immich_search_asset_statistics, so sibling differentiation is incomplete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no exclusions, and no named alternative. With siblings such as immich_search_asset_statistics, immich_get_album_statistics and immich_get_person_statistics in the catalog, an agent must infer selection purely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_auth_statusRetrieve auth statusBRead-onlyIdempotent
Retrieve auth status
Get information about the current session, including whether the user has a password, and if the session can access locked assets.
Immich operation: GET /auth/status · tag: Authentication
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds real value by disclosing the semantics of the response (password presence, locked-asset access), which is behavioral context the annotations cannot supply, but it omits anything about auth requirements or session prerequisites.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and short: the action, then the concrete payload, then a provenance tag. The only waste is the restated title as the first line, which duplicates the tool title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only session query with no output schema, the description covers what is asked and the key fields returned. The only gap is that the full response shape is not documented for a tool whose return values drive any caller decision.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the baseline a 4 applies. The schema is empty and there is nothing further for the description to clarify.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource (retrieve auth status) and enumerates the concrete facts returned: whether the user has a password and whether the session can access locked assets. That is clearly distinguishable from most siblings, though it never names the closest alternatives (validate_access_token, get_my_user, get_sessions).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance and no reference to any sibling tool. 'Current session' implies context but leaves the agent to infer whether this or immich_validate_access_token / immich_get_sessions is the right call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_cluster_group_requestsRetrieve cluster group requestsARead-onlyIdempotent
Retrieve cluster group requests
Retrieve the pending requests for the current user to join a cluster group.
Immich operation: GET /cluster-groups/requests · tag: Cluster groups
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is fully covered. The description adds the useful constraint that results are 'pending' and scoped to the current user, but says nothing about pagination or result shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first line restates the title verbatim and the second sentence largely repeats it with slightly more detail, so a meaningful portion of the text is redundant. The operation/tag lines are boilerplate rather than front-loaded value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, parameterless read tool this covers what an agent needs: it knows what is returned (pending join requests for the current user) and that it is safe. No output schema exists, so a brief note on the response structure would have been a bonus but is not critical here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and the schema is an empty object at 100% coverage, so there is nothing for the description to disambiguate. Baseline 4 applies for a parameterless read.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb+resource ('retrieve cluster group requests') plus a scope qualifier: pending requests for the current user. This implicitly separates it from the group-scoped sibling, but it never names that sibling explicitly, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not-to-use guidance is given. The phrase 'for the current user' hints at how it differs from immich_get_cluster_group_requests_for_group, but the agent must infer that routing decision rather than being told.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_cluster_group_requests_for_groupRetrieve the requests sent by a cluster groupBRead-onlyIdempotent
Retrieve the requests sent by a cluster group
Retrieve the pending requests for other users to join the cluster group.
Immich operation: GET /cluster-groups/{id}/requests · tag: Cluster groups
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds the meaningful qualifier that results are 'pending' join requests, which narrows expected output, but it does not disclose visibility/authorization constraints or whether results are paginated. With annotations doing the heavy lifting, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the purpose, then adds one clarifying sentence and the operation metadata. The title line and first sentence partially duplicate each other, which is minor waste but not disruptive.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-read tool with fully covered annotations and a simple schema, the description is adequate. It omits what the response contains beyond 'pending requests' and omits permissions/visibility, and there is no output schema to fall back on, so an agent must infer result shape. Minimum viable rather than rich.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single `id` parameter is documented there as a uuid, so the schema carries parameter semantics. The description adds no format or scope detail for the id beyond what the schema states, matching the baseline-3 rule for high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb+resource ('Retrieve the requests sent by a cluster group') and refines it to pending join requests, so the purpose is discernible. It does not, however, name or contrast against the closest sibling immich_get_cluster_group_requests, so sibling differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied by 'pending requests for other users to join the cluster group', giving a sense of the scenario. There is no explicit when-to-use versus immich_get_cluster_group_requests or immich_get_cluster_group_users, and no stated prerequisites or auth requirements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_cluster_group_usersRetrieve the users of a cluster groupCRead-onlyIdempotent
Retrieve the users of a cluster group
Retrieve the users that are a member of the cluster group.
Immich operation: GET /cluster-groups/{id}/users · tag: Cluster groups
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, covering the safety profile. The description adds no behavioral context beyond that – it does not mention pagination, the response shape, or authorization requirements for reading group members.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short but wastes its leading sentence by restating the title and then restating itself again ('Retrieve the users...' twice). The Immich operation/tag line is useful, but the duplication makes it less front-loaded than it could be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool whose annotations already cover safety and whose schema documents the sole argument, the description is complete enough to invoke correctly. No output schema exists, so no return-value explanation is required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single parameter at 100% schema description coverage, the schema carries the semantics (uuid-formatted id), so the baseline of 3 applies. The description refers to 'the cluster group' but adds no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (retrieve) and resource (users who are members of a cluster group), so an agent knows exactly what it fetches. However, it does not differentiate from close siblings such as immich_get_cluster_group_requests_for_group or immich_leave_cluster_group, and the opening line merely restates the title.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus the related cluster-group siblings (requests, regenerate_people, leave), nor any stated prerequisites. The description only says what it does, leaving all selection logic to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_configGet system configurationBRead-onlyIdempotent
Get system configuration
Retrieve the current system configuration.
Immich operation: GET /system-config · tag: System config
DEPRECATED — prefer the replacement operation if one exists.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavioral context: the underlying operation (GET /system-config) and deprecation status, which is not in the annotations. It is docked because the deprecation notice is vague — no replacement is identified and no migration deadline or behavior change is stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The body is short and front-loaded, but the first sentence duplicates the title verbatim and the second sentence restates the same idea ('Retrieve the current system configuration'), so two of the four lines are filler. The genuinely informative deprecation warning is buried last.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, no output schema and full annotation coverage, the description is nearly sufficient for invocation. It falls short of completeness because it neither disambiguates the config scope against several sibling config tools nor names the deprecated operation's replacement, which is the one piece of information an agent most needs here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. The description correctly implies no inputs are required and adds nothing misleading; there is simply nothing further to document.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get system configuration' / 'Retrieve the current system configuration') that an agent can act on immediately. However, it does not differentiate from the many closely named siblings (immich_get_admin_config, immich_get_server_config, immich_get_public_config, immich_get_user_config, immich_get_config_defaults), so an agent cannot tell which config surface this returns without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only guidance is 'DEPRECATED — prefer the replacement operation if one exists,' which is conditional and does not name the replacement tool, leaving the agent unable to act on it. There is no statement of when this tool should be used instead of the sibling config getters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_config_defaultsGet system configuration defaultsBRead-onlyIdempotent
Get system configuration defaults
Retrieve the default values for the system configuration.
Immich operation: GET /system-config/defaults · tag: System config
DEPRECATED — prefer the replacement operation if one exists.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds two pieces of genuine value: the exact endpoint (GET /system-config/defaults) and the deprecation warning, which annotations do not convey. It still omits auth requirements and return shape, so it is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the operation name and purpose in the first two lines, followed by a compact endpoint/tag breadcrumb and a deprecation note. Slight redundancy between the title line and the first sentence, but nothing is wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only call with no output schema, the definition covers the essentials. The gap is the unnamed replacement operation for a deprecated tool and the failure to differentiate from the three other *_config_defaults siblings, which is exactly the information an agent needs here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. The description correctly implies no inputs are needed by framing the call as a bare retrieval.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Get system configuration defaults') and even names the underlying endpoint, so the basic purpose is clear. However, the sibling set contains immich_get_config, immich_get_admin_config_defaults, immich_get_user_config_defaults, immich_get_public_config_defaults and immich_get_admin_config, and nothing here distinguishes 'system' config from admin/user/public config variants. An agent cannot confidently route among these 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage signal is 'DEPRECATED — prefer the replacement operation if one exists', which tells the agent the tool is discouraged but names no replacement and gives no condition for choosing among the config-defaults siblings. There is no when-to-use or 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.
immich_get_download_infoRetrieve download informationB
Retrieve download information
Retrieve information about how to request a download for the specified assets or album. The response includes groups of assets that can be downloaded together.
Immich operation: POST /download/info · tag: Download
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | ||
| slug | No | ||
| userId | No | userId (request body) | |
| albumId | No | albumId (request body) | |
| assetIds | No | assetIds (request body) | |
| archiveSize | No | archiveSize (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (destructiveHint=false, openWorldHint=true, idempotentHint=false). The description adds useful context about the return shape (asset groups downloadable together) but says nothing about auth requirements, rate limits, or why a 'retrieve' posts readOnlyHint=false — the read-only intent implied by 'Retrieve' is mildly at odds with the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening line duplicates the title verbatim before restating the same idea ('how to request a download'), which is redundant. The remaining sentences are efficient, but the front-load is wasted on the repeat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and six loosely documented parameters, the description only briefly sketches the return value ('groups of assets that can be downloaded together'). It is enough to understand the general purpose but not the payload structure or how to consume the groups.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, so the schema documents userId/albumId/assetIds/archiveSize as generic 'request body' entries. The description narrows the choice by saying the request targets 'assets or album,' mapping to assetIds/albumId, but the key and slug parameters remain undocumented anywhere.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (retrieve) and resource (download information) and clarifies the payload: 'groups of assets that can be downloaded together.' That distinguishes it from siblings like immich_download_archive/immich_download_asset, which actually fetch files, though the differentiation is implied rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'how to request a download for the specified assets or album' suggests this is the lookup step preceding an actual download. There is no explicit when-to-use, no prerequisites, and no naming of the alternative download tools an agent should pick after calling this.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_explore_dataRetrieve explore dataBRead-onlyIdempotent
Retrieve explore data
Retrieve data for the explore section, such as popular people and places.
Immich operation: GET /search/explore · tag: Search
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds only the raw endpoint (GET /search/explore) and tag, which is metadata rather than behavior — no auth, scoping, or refresh/caching behavior is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, but the first line duplicates the title verbatim and the trailing 'Immich operation / tag' line is boilerplate rather than decision-relevant content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, no output schema and full annotation coverage, the description is nearly sufficient; naming the kinds of data returned (people, places) is the key missing piece for a no-output-schema tool, though the return shape is still only sketched.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. There is nothing for the description to document beyond what the empty schema already conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (retrieve explore data) and adds concrete content hints ('popular people and places'), which is more than a restatement of the name. It does not, however, distinguish itself from nearby read siblings such as immich_get_search_suggestions or immich_search_places.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no named alternatives despite many search/explore-adjacent sibling tools. An agent must infer the trigger from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_facesRetrieve faces for assetBRead-onlyIdempotent
Retrieve faces for asset
Retrieve all faces belonging to an asset.
Immich operation: GET /faces · tag: Faces
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Face ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is fully covered elsewhere. The description adds only the underlying REST operation (GET /faces) and tag, with no information about return contents, pagination, or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening line merely restates the title and is immediately restated again in the second sentence, so roughly half the text is redundant. The useful content (endpoint, tag) is at the end rather than front-loaded, but the whole thing is short enough not to be a burden.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one parameter, no output schema, and full annotation coverage, the description is minimally adequate. It could have said what a returned face comprises (person reference, bounding box) or clarified the id/asset ambiguity, but nothing critical to invoking the tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single required parameter, so the baseline is 3. The description adds nothing beyond the schema and arguably muddies it by saying faces belong to an 'asset' while the parameter is documented as a 'Face ID'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retrieve faces for asset') and repeats it as 'Retrieve all faces belonging to an asset', so the operation is unambiguous. It does not distinguish itself from nearby siblings such as immich_get_person, immich_search_person, or immich_reassign_faces, and the schema's 'id' is labeled 'Face ID' while the prose talks about an asset, leaving a small ambiguity about what is being looked up.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use, when-not-to-use, or alternative guidance is given. The agent must infer from the name alone whether this is the right call versus immich_get_person or immich_search_person. The only routing hint is the raw endpoint and tag, which is not user-facing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_integrity_reportGet integrity report by typeBRead-onlyIdempotent
Get integrity report by type
Get all flagged items by integrity report type
Immich operation: GET /admin/integrity/report · tag: Maintenance (admin)
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Integrity report type | |
| limit | No | Number of items per page | |
| cursor | No | Cursor for pagination |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds only the admin/maintenance context and endpoint, saying nothing about pagination behavior, result volume, or auth requirements beyond the 'admin' tag.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, with the core purpose in the first line. It does restate the title verbatim in the first sentence, a minor redundancy, but nothing is bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only admin report tool with no output schema, the description is adequate but thin: it does not describe what a 'flagged item' contains or how pagination/cursors should be driven. Annotations carry the safety profile, so the gap is moderate rather than severe.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the enum values (untracked_file, missing_file, checksum_mismatch) and the limit/cursor semantics are already documented in the schema. The description adds no additional parameter meaning beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a clear verb+resource: 'Get all flagged items by integrity report type,' which tells an agent exactly what comes back. It does not, however, differentiate itself from close siblings like immich_get_integrity_report_csv, immich_get_integrity_report_file, and immich_get_integrity_report_summary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'by type' phrasing implies this is the typed listing variant, but there is no explicit when-to-use or when-not guidance and no mention of the csv/summary/file alternatives. The agent must infer selection from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_integrity_report_csvExport integrity report by type as CSVBRead-onlyIdempotent
Export integrity report by type as CSV
Get all integrity report entries for a given type as a CSV
Immich operation: GET /admin/integrity/report/{type}/csv · tag: Maintenance (admin)
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Integrity report type |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds the CSV output format and the 'Maintenance (admin)' tag, which signals an admin-scoped operation, but says nothing about pagination, size of export, or permissions beyond the tag.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief and front-loaded, and the endpoint/tag footer is useful navigation context. The first line is a verbatim restatement of the title, which is mild waste, but the remaining lines each carry information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only export with no output schema, the description does the essential job of declaring the CSV return format and the admin/maintenance scope. It stops short of explaining what the exported rows contain or how large the payload may be, but nothing critical to invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'type' parameter is a fully enumerated field with its own description, so the schema does all the work. The description only echoes 'by type' and adds no meaning about the enum values or their implications.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (export), resource (integrity report), scoping dimension (by type), and output format (CSV), which distinguishes it from siblings like immich_get_integrity_report, immich_get_integrity_report_summary, and immich_get_integrity_report_file. The only weakness is that it never explicitly contrasts itself with those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It says 'for a given type as a CSV', which implies when the tool applies, but there is no explicit when-to-use, no exclusion criteria, and no pointer to the JSON/summary/file siblings that would cover adjacent needs. An agent has to infer the choice from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_integrity_report_fileDownload flagged fileBRead-onlyIdempotent
Download flagged file
Download the untracked/broken file if one exists
Immich operation: GET /admin/integrity/report/{id}/file · tag: Maintenance (admin)
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description usefully adds that the file may not exist ('if one exists') and that this is an admin-tagged endpoint, but says nothing about the response form or what happens when no file is flagged.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, with the endpoint/tag metadata tucked at the end. Minor waste: the first line simply restates the title before the informative 'untracked/broken file' sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter admin download endpoint with annotations covering the safety profile and no output schema, the definition is adequate. It stops short of explaining the conditional-existence behavior or the admin prerequisite in prose, leaving those to be inferred.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'id' parameter, so the schema already documents it as a uuid. The description adds no syntax or format detail beyond that, which is the expected baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb (Download) and resource (the untracked/broken file from the integrity report), and the 'if one exists' qualifier pins down exactly which artifact is returned. It is clear enough to distinguish from sibling list/summary integrity endpoints, though it does not name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to reach for this versus immich_get_integrity_report, _summary, or _csv. The only hint is the conditional 'if one exists', which implies usage after a report has flagged a file, but the agent must infer that context entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_integrity_report_summaryGet integrity report summaryBRead-onlyIdempotent
Get integrity report summary
Get a count of the items flagged in each integrity report
Immich operation: GET /admin/integrity/summary · tag: Maintenance (admin)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the useful context that this is an admin-scoped operation, but says nothing about return format, pagination, or rate behavior, so it adds only modest value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, with the operative definition ('count of the items flagged in each integrity report') up front. The repeated title line and the raw endpoint/tag line are mildly redundant but still compact and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with full annotation coverage and no output schema, the description conveys enough: what it returns (counts per report) and that it is an admin maintenance call. Only the absence of routing guidance to sibling report endpoints keeps it from being fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema requires no parameter documentation. Baseline 4 applies; there is nothing further for the description to clarify about inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (integrity report summary) and clarifies the output is 'a count of the items flagged in each integrity report', which distinguishes it from the sibling immich_get_integrity_report (full report) and the csv/file variants. It does not explicitly name those siblings, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance. The 'Maintenance (admin)' tag hints at context, but the description never routes the agent between this summary and immich_get_integrity_report, immich_get_integrity_report_csv, or immich_get_integrity_report_file, leaving selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_libraryRetrieve a libraryBRead-onlyIdempotent
Retrieve a library
Retrieve an external library by its ID.
Immich operation: GET /libraries/{id} · tag: Libraries
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile needs no restating. The description's only added context is that the target is an "external library" and the underlying endpoint, which is modest value beyond the structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, but the first line duplicates the tool title verbatim before the more informative second line, which is a small amount of wasted space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read with full annotation coverage this is close to sufficient, but with no output schema the description says nothing about what the returned library object contains, and it never routes the agent away from the list/statistics siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single id parameter is documented as a UUID, so the schema carries the burden. "by its ID" merely restates the schema rather than adding format or lookup-origin details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Retrieve) and resource (a library), and adds the API mapping GET /libraries/{id}, so the operation is unambiguous. It does not, however, explicitly distinguish itself from siblings such as immich_get_all_libraries or immich_get_library_statistics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"by its ID" implies this is single-item lookup keyed on an identifier, which weakly signals when to prefer it over immich_get_all_libraries. There is no explicit when-to-use guidance, no prerequisites, and no named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_library_statisticsRetrieve library statisticsBRead-onlyIdempotent
Retrieve library statistics
Retrieve statistics for a specific external library, including number of videos, images, and storage usage.
Immich operation: GET /libraries/{id}/statistics · tag: Libraries
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered. The description adds that the operation is a GET on /libraries/{id}/statistics and enumerates the statistic categories, but says nothing about auth/permission requirements or response shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The structure is front-loaded and the operation line is useful, but the first line duplicates the title and the second line redundantly repeats 'Retrieve statistics', leaving some wasted text in a very short definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, single-parameter read tool with full annotation coverage and no output schema, the description is nearly complete: it names the resource scope and enumerates the returned statistic categories, which compensates for the absent output schema. Only auth requirements and format details are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'id' parameter, so the schema already documents it. The description adds no additional syntax or meaning beyond the schema, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Retrieve statistics for a specific external library') and enumerates what the statistics cover (videos, images, storage usage). It distinguishes itself from the generic immich_get_library, though it does not explicitly differentiate from the many other *_statistics siblings in the list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the scoping to 'a specific external library', so an agent can infer it needs a library id. However, there is no explicit when-to-use guidance, no mention of prerequisites, and no reference to alternatives such as immich_get_library or immich_get_all_libraries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_main_playlistGet HLS main playlistBRead-onlyIdempotent
Get HLS main playlist
Returns an HLS main playlist with all available variants for the asset.
Immich operation: GET /assets/{id}/video/stream/main.m3u8 · tag: Assets
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| key | No | ||
| slug | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds that the payload is an HLS main playlist listing all variants and exposes the underlying REST endpoint (GET /assets/{id}/video/stream/main.m3u8), which is useful context, but it says nothing about auth requirements or what the returned playlist text looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the purpose in the first sentence, followed by the return semantics and the endpoint mapping. Nothing is redundant, though the endpoint line is more provenance metadata than agent-facing guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with no output schema and annotation-covered safety, the description covers the essential what, but leaves the two auxiliary parameters unexplained and gives no hint about the playlist's content type or structure. Adequate but with clear gaps given the low schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%: id carries a uuid format hint, while key and slug are entirely undocumented in the schema. The description's 'for the asset' weakly implies id identifies the asset but adds no syntax, format, or meaning for key or slug, so it fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Get HLS main playlist', 'Returns an HLS main playlist with all available variants for the asset'), so an agent knows exactly what it fetches. It does not, however, distinguish itself from close siblings such as immich_get_media_playlist or immich_get_segment, which an agent could easily confuse with this one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance and no mention of the related playlist/segment tools. The only implicit cue is 'for the asset', which hints at the required id but does not tell the agent when this playlist is preferable to the media playlist or segment endpoints.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_maintenance_statusGet maintenance mode statusARead-onlyIdempotent
Get maintenance mode status
Fetch information about the currently running maintenance action.
Immich operation: GET /admin/maintenance/status · tag: Maintenance (admin)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds that it reports on a currently running maintenance action plus the underlying GET endpoint, but says nothing about admin authorization requirements, rate limits, or the shape of 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the operation name, then one clarifying sentence, then the endpoint/tag metadata. No filler, though the trailing 'Immich operation' line is largely redundant with the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool whose annotations fully cover the safety profile, the definition is nearly complete. The only gap is that, with no output schema, it doesn't hint at what status fields are returned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to explain; baseline 4 applies. Nothing in the schema or description is ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get maintenance mode status') and reinforces it with 'Fetch information about the currently running maintenance action.' An agent can distinguish this read operation from the write sibling immich_set_maintenance_mode, though the description never names that alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'admin' tag and 'currently running maintenance action' phrasing imply an admin-diagnostic context, but there is no explicit when-to-use, prerequisite, or pointer to immich_set_maintenance_mode. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_map_markersRetrieve map markersBRead-onlyIdempotent
Retrieve map markers
Retrieve a list of latitude and longitude coordinates for every asset with location data.
Immich operation: GET /map/markers · tag: Map
| Name | Required | Description | Default |
|---|---|---|---|
| isArchived | No | Filter by archived status | |
| isFavorite | No | Filter by favorite status | |
| withPartners | No | Include partner assets | |
| fileCreatedAfter | No | Filter assets created after this date | |
| withSharedAlbums | No | Include shared album assets | |
| fileCreatedBefore | No | Filter assets created before this date |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered by structured data. The description adds only the scope/magnitude hint ('every asset with location data') and says nothing about result size, pagination, or the shape of each returned marker — adequate but minimal given the lower bar.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The body is short, but the first line merely restates the tool title and the closing 'Immich operation: GET /map/markers · tag: Map' line is boilerplate that adds no decision-relevant content. The one genuinely informative sentence sits between two low-value lines.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, no-required-parameter listing tool with no output schema, the description covers what is fetched and its scope, and the schema covers all filters. It could be more complete by noting the result volume or that each marker pairs a coordinate with its asset, but 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All six filter parameters are documented in the schema at 100% coverage, so the schema already carries the semantic load. The description adds no explanation of how isArchived, isFavorite, withPartners, withSharedAlbums, or the date bounds affect the marker set, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retrieve map markers') and clarifies the payload: latitude/longitude coordinates for every asset with location data. The word 'every' implicitly distinguishes it from the album-scoped sibling immich_get_album_map_markers, but that sibling is never named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance, no mention of prerequisites, and no named alternative. The scope phrase 'every asset with location data' only implies that this is the global (non-album) variant, leaving the agent to infer the routing decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_media_playlistGet HLS media playlistBRead-onlyIdempotent
Get HLS media playlist
Returns an HLS media playlist for one variant of the streaming session.
Immich operation: GET /assets/{id}/video/stream/{sessionId}/{variantIndex}/playlist.m3u8 · tag: Assets
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| key | No | ||
| slug | No | ||
| sessionId | Yes | format: uuid | |
| variantIndex | Yes | ||
| x-immich-hls-pos | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and openWorld, so the safety profile is covered. The description adds that the return is an HLS media playlist for a single variant, which is useful context, but says nothing about response format (m3u8), auth requirements, or how variantIndex relates to the parent/master playlist. With annotations carrying the safety burden, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose in the first line, then a return-value sentence and the raw endpoint for reference. No filler, though the title is duplicated verbatim in the first line, which is slightly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of describing returns; it says the output is an HLS media playlist but not the m3u8 text format or how it links back to a master playlist. For a niche streaming endpoint with six parameters and one third schema coverage, the definition is adequate but leaves gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%, so the description must compensate. It partially does: the operation URL template maps id, sessionId and variantIndex to concrete path segments, clarifying their roles. However, key, slug and x-immich-hls-pos remain undocumented in both schema and description, and variantIndex's acceptable range/meaning is not explained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (HLS media playlist) and scopes it to 'one variant of the streaming session', which is more precise than a bare restatement of the title. It does not, however, distinguish itself from the adjacent sibling immich_get_main_playlist or immich_get_segment, so an agent still has to infer which playlist endpoint to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to call this versus the main playlist or segment endpoints, and no mention of prerequisites such as an existing streaming session. The 'streaming session' phrasing implies a playback context, but the agent is left to infer it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_memoryRetrieve a memoryARead-onlyIdempotent
Retrieve a memory
Retrieve a specific memory by its ID.
Immich operation: GET /memories/{id} · tag: Memories
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety and side-effect profile is fully covered by structured data. The description adds only the underlying REST mapping (GET /memories/{id}) and the Memories tag, which is orientation context rather than 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, with the operation and endpoint mapping stated directly. Minor waste in the opening line duplicating the title, but nothing else to trim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, idempotent read whose safety profile is fully declared by annotations, the description is nearly sufficient. The only gap is that no output schema exists, so the agent gets no hint about what a returned memory object contains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter's UUID format is documented in the schema itself. The description's 'by its ID' merely restates the parameter's role, adding no format, scoping, or authorization detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retrieve a specific memory') and the lookup key ('by its ID'), which implicitly separates it from the list-style siblings such as immich_search_memories or immich_memories_statistics. It never names those siblings explicitly, so the differentiation is inferable rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'by its ID' implies the precondition (you must already hold a memory ID, so this is not a discovery/browse tool), which contrasts only implicitly with immich_search_memories. There is no explicit when-to-use, when-not-to-use, or named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_my_api_keyRetrieve the current API keyBRead-onlyIdempotent
Retrieve the current API key
Retrieve the API key that is used to access this endpoint.
Immich operation: GET /api-keys/me · tag: API keys
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds a small amount of context ('used to access this endpoint'), but says nothing about whether the secret is returned in plaintext, masking, or what the response contains. With annotations carrying the behavioral burden, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first line simply repeats the title verbatim, and the second sentence rephrases the same idea with only a small addition of scope. The trailing 'Immich operation: GET /api-keys/me' line is useful provenance but the content is somewhat redundant overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 whose annotations cover the safety profile, the description is nearly complete. The only gap is that no output schema exists, so the description could have indicated what is returned (the key value itself), but this is a minor omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics for the description to clarify. Baseline of 4 applies for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Retrieve the current API key') and adds a scoping phrase ('the API key that is used to access this endpoint'), which implies the 'me'/self scope. However, it never explicitly distinguishes itself from the close siblings immich_get_api_key and immich_get_api_keys, so an agent must infer the difference from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of the sibling tools (get_api_key, get_api_keys, create_api_key, rotate_api_key) that an agent must choose between. The description only says what the call does, not when to prefer it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_my_calendar_heatmapRetrieve calendar heatmap activityBRead-onlyIdempotent
Retrieve calendar heatmap activity
Retrieve activity counts for a specified period, in a calendar heatmap format.
Immich operation: GET /users/me/calendar-heatmap · tag: Users
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date in UTC | |
| from | No | Start date in UTC | |
| type | No | Type of calendar heatmap |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds only that the response is activity counts in heatmap format; it omits whether the endpoint is scoped to the authenticated user, what happens if from/to are omitted, and any date-range limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The text is short and the operation/tag footer is useful for traceability, but the first line is a verbatim repeat of the title before the actual informative sentence, which is mild redundancy rather than wasted space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should describe the return shape, and 'activity counts ... in a calendar heatmap format' is only a sketch. Combined with zero usage guidance for an endpoint whose from/to are optional, an agent has enough to call it but not to interpret or bound the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with per-parameter descriptions ('Start date in UTC', 'End date in UTC', and an Upload/Taken enum), so the schema carries parameter meaning. The description adds nothing beyond 'specified period', which merely restates the from/to pair, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Retrieve') and resource ('calendar heatmap activity'), then clarifies the payload as activity counts over a period in calendar heatmap format. It does not, however, distinguish itself from the sibling immich_get_user_calendar_heatmap_admin, leaving the reader to infer that this variant is scoped to the caller.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use, when-not-to-use, or alternative guidance. The phrase 'for a specified period' weakly implies the from/to window is the selection mechanism, but nothing tells an agent how this differs from get_time_buckets, get_user_calendar_heatmap_admin, or statistics tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_my_preferencesGet my preferencesBRead-onlyIdempotent
Get my preferences
Retrieve the preferences for the current user.
Immich operation: GET /users/me/preferences · tag: Users
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so safety is covered. The description adds the underlying HTTP operation (GET /users/me/preferences) and tag, which is mild but real context; it says nothing about what the preferences object contains or whether defaults are merged in.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short lines with the purpose front-loaded and no filler beyond the boilerplate endpoint/tag line. The first line merely restates the title, which is minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of describing what is returned, and it does not — an agent cannot tell whether this returns UI settings, notification flags, or folder preferences. For a simple zero-param read this is a noticeable but not fatal gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there are no parameter semantics to document; the empty schema is complete on its own. Baseline 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb ('Get'/'Retrieve') and resource ('preferences for the current user'), and the 'current user' scoping implicitly distinguishes it from the admin-facing immich_get_user_preferences_admin sibling. It does not name or explicitly contrast with that sibling, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no prerequisites, and never mentions alternatives such as immich_update_my_preferences or the admin variants. The agent must infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_my_userGet current userBRead-onlyIdempotent
Get current user
Retrieve information about the user making the API request.
Immich operation: GET /users/me · tag: Users
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is fully covered structurally. The description adds only the self/authenticated-user scoping, with no mention of auth requirements or returned fields. Adequate but thin beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, with the operation and tag metadata clearly separated. 'Get current user' restates the title verbatim, a minor redundancy, but the rest earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only, idempotent tool with annotations covering the safety profile and no output schema, the description tells the agent everything needed to invoke it correctly. It could optionally note what user data is returned, but that gap is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so per the rubric the baseline is 4. There is nothing for the description to add or obscure on the parameter side.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get current user') and clarifies the scope as 'the user making the API request,' which distinguishes it from sibling immich_get_user / immich_get_user_admin that target arbitrary users. It stops short of explicitly naming those alternatives, so it is clear but not fully sibling-differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when it applies (self-profile retrieval) but gives no explicit guidance, prerequisites, or routing against the many sibling 'get_user' variants. An agent must infer from the name alone that this is the no-argument, self-scoped call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_notificationGet a notificationARead-onlyIdempotent
Get a notification
Retrieve a specific notification identified by id.
Immich operation: GET /notifications/{id} · tag: Notifications
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds the underlying HTTP operation mapping, but says nothing about authorization requirements or failure modes when the id does not exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short lines, front-loaded with the purpose and then the operation/tag metadata. No wasted prose, though the operation/tag line is largely machine-generated filler for an agent that already has the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter read tool with full annotation coverage and no output schema, the description supplies what an agent needs to call it correctly. Return shape is not described, but no output schema exists to defer to, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single id parameter is already documented as a uuid in the schema. The description's 'identified by id' adds no format or syntax detail beyond that, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Retrieve a specific notification identified by id,' which pairs with the GET /notifications/{id} operation. It clearly signals a single-item fetch, implicitly distinguishing it from the sibling immich_get_notifications, though it never names that alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the singular resource and the id requirement; there is no explicit statement of when to use this versus immich_get_notifications or immich_get_notification_template_admin. Adequate but leaves the agent to infer routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_notificationsRetrieve notificationsCRead-onlyIdempotent
Retrieve notifications
Retrieve a list of notifications.
Immich operation: GET /notifications · tag: Notifications
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Filter by notification ID | |
| type | No | Notification type | |
| level | No | Notification level | |
| unread | No | Filter by unread status |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is fully covered elsewhere. The description adds only the raw endpoint mapping (GET /notifications, tag: Notifications), which is provenance rather than behavioral context — nothing about default filtering, ordering, or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short and front-loaded, but the title is restated twice ('Retrieve notifications' followed immediately by 'Retrieve a list of notifications'), so one of the three lines is pure redundancy. The endpoint/tag line is metadata rather than guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A simple read-only list tool with complete schema coverage and full annotations is adequately served, but with no output schema the description could have said what a notification record contains or how the list is returned. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with four optional, fully documented parameters (id, type, level, unread), so the baseline is 3. The description adds no additional meaning about how those filters combine or behave.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Retrieve a list of notifications'), which is clearer than the bare title 'Retrieve notifications'. It does not explicitly differentiate itself from the sibling immich_get_notification (singular) or immich_get_notification_template_admin, though 'list' implies a collection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus immich_get_notification (single fetch) or immich_update_notifications. No preconditions, no mention of the optional filters that would select this tool in practice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_notification_template_adminRender email templateB
Render email template
Retrieve a preview of the provided email template.
Immich operation: POST /admin/notifications/templates/{name} · tag: Notifications (admin)
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| template | Yes | template (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=true. The description adds useful context by clarifying this is a POST admin endpoint whose result is a non-destructive 'preview', which explains why a 'get'-named tool is neither read-only nor destructive. It does not mention admin auth requirements, security scoping, or whether the render has 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and tight: purpose first, then a one-line clarification, then operational metadata. The title line duplicates the first sentence, which is minor waste, but otherwise every element earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description should characterize the return value (e.g., rendered email HTML/subject), and it does not. With 2 required params and one undocumented, plus no detail on the template body payload, the definition is minimally adequate for calling the endpoint but under-explains inputs and results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: 'template' is barely described ('template (request body)') and 'name' has no schema description. The operation line (POST /admin/notifications/templates/{name}) does add value by revealing that 'name' is a URL path segment and 'template' is the body, which the schema does not say. That is modest compensation but leaves the template body format and accepted values unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource combination ('Render email template', 'Retrieve a preview of the provided email template'), which is clear and actionable. The gap is that it doesn't distinguish itself from the closest sibling, immich_send_test_email_admin, so an agent can't tell the preview-render tool apart from the test-send tool by this text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, prerequisites, or alternatives are given. The text only says to retrieve a preview, leaving the agent to infer when this admin template endpoint is appropriate versus send_test_email or other notification tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_partnersRetrieve partnersARead-onlyIdempotent
Retrieve partners
Retrieve a list of partners with whom assets are shared.
Immich operation: GET /partners · tag: Partners
| Name | Required | Description | Default |
|---|---|---|---|
| direction | Yes | Partner direction |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds domain context that partners are asset-sharing relationships and notes the underlying GET /partners operation, but does not describe return shape or whether the list is scoped to the authenticated user.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and short, with the purpose in the first line. There is minor redundancy between the title, the leading 'Retrieve partners', and the following sentence, plus boilerplate Immich operation metadata, but overall it is tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with annotations covering safety and no output schema, the description is complete enough to invoke correctly. It does not describe what a partner record contains, which is a minor gap given no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single required enum parameter, so the baseline is 3. The description does not explain the distinction between the 'shared-by' and 'shared-with' enum values, which would be the one place it could add meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (retrieve) and resource (partners) and clarifies that these are users with whom assets are shared. The verb clearly distinguishes it from siblings like immich_create_partner, immich_remove_partner, and immich_update_partner, though it does not name them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this lists partners, but there is no explicit when/when-not guidance or mention of the mutation siblings (create/update/remove_partner) as alternatives. Adequate but leaves routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_personGet a personCRead-onlyIdempotent
Get a person
Retrieve a person by id.
Immich operation: GET /people/{id} · tag: People
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds nothing beyond that—no notes on error behavior for a missing/invalid id, auth requirements, or what the returned person object contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, with the operation and endpoint identifier clearly placed. There is mild redundancy in restating the title ('Get a person') and then 'Retrieve a person by id', but nothing is bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only lookup with annotations covering safety, the description is adequate but thin. With no output schema, an agent gets no notion of what a person record contains or whether 404-style failures are expected, which are the main remaining unknowns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single id parameter, so the baseline is 3. The description only echoes 'by id' and adds no format, source (e.g., where to obtain the person id), or validity detail beyond the schema's 'format: uuid'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retrieve a person by id'), so the operation is unambiguous. However, it does nothing to distinguish it from close siblings like immich_get_all_people, immich_search_person, or immich_get_person_statistics, which also act on people.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus alternatives: there is no mention of search_person (lookup without an id) or get_all_people (listing). The 'by id' phrasing is the only hint, and that is already implied by the required id parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_person_statisticsGet person statisticsBRead-onlyIdempotent
Get person statistics
Retrieve statistics about a specific person.
Immich operation: GET /people/{id}/statistics · tag: People
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds the underlying Immich operation and tag, which is mild context, but it does not disclose return format, authentication needs, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded. The first line redundantly restates the title, but the following sentence and operation metadata are efficient and add useful endpoint information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter read-only statistics endpoint, the description provides the resource and operation. It does not describe the return values, but the annotations and schema already carry the safety and parameter details, so it is largely complete for tool selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single id parameter, which is documented as UUID format. The description only implies that the ID refers to a person, so it adds no meaningful semantics beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: retrieve statistics about a specific person. It is more specific than the title alone, but it does not differentiate this tool from other statistics endpoints such as album_statistics, asset_statistics, or library_statistics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives. It does not mention related tools like immich_get_person, immich_get_person_thumbnail, or other statistics tools, so the agent must infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_person_thumbnailGet person thumbnailBRead-onlyIdempotent
Get person thumbnail
Retrieve the thumbnail file for a person.
Immich operation: GET /people/{id}/thumbnail · tag: People
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered. The description adds only that a 'thumbnail file' is retrieved, hinting at a binary/image return rather than JSON, but says nothing about auth requirements, response content type, or error behavior for a missing person.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, but 'Get person thumbnail' and 'Retrieve the thumbnail file for a person' are near-duplicates of the title, so a sentence is spent restating what the agent already sees. Still compact and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with annotations covering the safety profile and no output schema, most needs are met. However, for a file-fetching tool the description never clarifies that the response is binary image content or how it should be consumed, leaving a relevant gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (the sole 'id' parameter is documented as a uuid), so the schema carries the weight. The description adds no meaning about the id — that it must reference an existing person or where to obtain one — so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Retrieve the thumbnail file for a person', plus the underlying REST operation and tag. An agent can distinguish it from immich_get_person or immich_get_profile_image. It does not explicitly name siblings, so it stops short of 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no routing to alternatives such as immich_get_person or immich_get_profile_image. The agent must infer entirely from the name that this is for fetching only the person's thumbnail image.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_pluginRetrieve a pluginBRead-onlyIdempotent
Retrieve a plugin
Retrieve information about a specific plugin by its ID.
Immich operation: GET /plugins/{id} · tag: Plugins
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the agent knows this is a safe, repeatable read. The description adds only the underlying REST operation (GET /plugins/{id}) and the API tag, which is useful provenance but no behavioral trait beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, with the essential action in the first two lines. The opening line duplicates the tool title verbatim, and the trailing "Immich operation / tag" line is metadata rather than guidance, so it is efficient but slightly padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with full annotation coverage and no output schema, the description is sufficient to invoke it correctly. It would be complete with a brief note on what a plugin object contains or how it differs from the plugin-search siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single id parameter (format: uuid), so the schema carries parameter meaning. The description adds nothing beyond "by its ID"; baseline 3 applies since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Retrieve information about a specific plugin by its ID"), so an agent can tell it fetches one plugin rather than listing them. However, it never names or contrasts with the obvious siblings immich_search_plugins / immich_search_plugin_methods, so differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use, when-not-to-use, or alternative routing guidance. "By its ID" hints that a known plugin ID is required, but that is a restatement of the schema, not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_profile_imageRetrieve user profile imageBRead-onlyIdempotent
Retrieve user profile image
Retrieve the profile image file for a user.
Immich operation: GET /users/{id}/profile-image · tag: Users
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered structurally. The description adds only the useful signal that the response is a file ('profile image file') and the underlying GET endpoint; it says nothing about response format, size, caching, or fallback when no image exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The text is short but partly redundant: the title is repeated verbatim as the first line, and the second sentence restates the first. The endpoint/tag line is useful provenance, but overall the description wastes its opening on duplication rather than front-loading new information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with full annotation coverage and no output schema, the description is minimally adequate. It does not explain what the caller receives (binary image vs. URL) or error behavior when the user has no profile image, which are the remaining gaps an agent would care about.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is a single 'id' parameter documented as uuid format, so the schema carries the parameter burden. The description's phrase 'for a user' merely maps to that id without adding format, default, or constraint detail, which lands at the baseline for fully-covered schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Retrieve the profile image file for a user,' so an agent knows this fetches a user's avatar. It does not, however, distinguish itself from close siblings such as immich_create_profile_image, immich_delete_profile_image, or immich_get_person_thumbnail, leaving routing ambiguity in a very crowded namespace.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use, when-not-to-use, or alternative-selection guidance. The agent must infer from the verb alone that this is the read counterpart to the create/delete profile-image tools; nothing in the text addresses prerequisites (e.g., whether the caller can request another user's image) or permission context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_public_configGet the public configurationARead-onlyIdempotent
Get the public configuration
Retrieve the system configuration properties that are visible to everyone.
Immich operation: GET /public/config · tag: Config (public)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is fully covered by structured data. The description's only added behavioral value is that the returned properties are publicly visible, which is real but modest; it says nothing about authentication requirements or what the payload contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, leading with the core action. The first line merely restates the title and the trailing 'Immich operation' line is metadata boilerplate, so there is minor redundancy, but nothing is bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only getter with annotations fully covering its safety profile, the description is sufficient to know what it does and how to call it. The absence of an output schema means the returned config keys are undocumented, but that is a minor gap for such a simple endpoint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies; there is nothing for the description to disambiguate about inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Get the public configuration', 'Retrieve the system configuration properties') and adds the scope qualifier 'visible to everyone,' which hints at the public/unauthenticated nature distinguishing it from admin config siblings. However, it never names the closest alternates (immich_get_config, immich_get_admin_config, immich_get_public_config_defaults), so the differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Visible to everyone' implies this is the unauthenticated/public variant, which is a usable contextual cue, but there is no explicit when-to-use statement, no exclusion of the admin or defaults variants, and no prerequisites noted. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_public_config_defaultsGet the public configuration defaultsARead-onlyIdempotent
Get the public configuration defaults
Retrieve the default value of the configuration properties that are visible to everyone.
Immich operation: GET /public/config/defaults · tag: Config (public)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is fully covered by structured data. The description's only added behavioral signal is the 'visible to everyone' framing, which hints the endpoint needs no auth, but it says nothing about response content or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is short and front-loaded, with the scope clarification immediately after the title. The only waste is the first line restating the title verbatim before the useful elaboration, plus the trailing operation/tag metadata.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool this is nearly sufficient, but with no output schema the description does not say what the defaults actually contain or how they are structured, leaving the agent to guess at the return shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema has nothing to document and the baseline is 4. There are no parameter semantics the description could add or omit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Get the public configuration defaults') and the elaboration clarifies the scope: default values of properties 'visible to everyone'. This distinguishes it reasonably well from admin/user config-default siblings, though it never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied via the word 'public' and the endpoint path. There is no statement of when to choose this over immich_get_public_config, immich_get_config_defaults, or immich_get_admin_config_defaults, nor any note about authentication expectations for a public endpoint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_queueRetrieve a queueBRead-onlyIdempotent
Retrieve a queue
Retrieves a specific queue by its name.
Immich operation: GET /queues/{name} · tag: Queues
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Queue name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is fully covered by structured data. The description adds only the underlying Immich operation and tag, which is mildly useful context but not behavioral depth beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, but the opening line 'Retrieve a queue' is an exact restatement of the following sentence, which is mild redundancy. Still, no wasted explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 with no output schema, the description is adequate but leaves unfilled the one thing an agent needs: how it differs from the other queue-retrieval siblings. Return-value explanation is not required since no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'name' parameter carries a 19-value enum with a description, so the schema already documents the parameter fully. The description adds no format or semantic detail beyond that, which matches the baseline 3 for schema-covered params.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Retrieve a queue' / 'Retrieves a specific queue by its name.' An agent can tell it reads a single named queue, but nothing distinguishes it from siblings like immich_get_queues or immich_get_queue_jobs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus immich_get_queues (list all) or immich_get_queue_jobs (jobs within a queue), which are near-identical siblings. Usage is only implied by the name and the required 'name' parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_queue_jobsRetrieve queue jobsBRead-onlyIdempotent
Retrieve queue jobs
Retrieves a list of queue jobs from the specified queue.
Immich operation: GET /queues/{name}/jobs · tag: Queues
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Queue name | |
| status | No | Filter jobs by status |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds only the underlying REST route (GET /queues/{name}/jobs) and does not describe result volume, pagination, or what a job entry contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, with the functional sentence appearing immediately. The opening line duplicates the title verbatim, which is mild waste, but the rest is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the burden of describing what is returned falls on the description, and it never explains the shape of a queue job object or result size. For a simple read tool with full annotation and schema coverage this is adequate but leaves a real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters (name enum, status enum array) are documented in the schema, so the baseline is 3. The description adds only the phrase 'specified queue', contributing no syntax or filtering semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: retrieving a list of queue jobs from a named queue. It is clear what it returns, but it does not distinguish itself from close siblings like immich_get_queue, immich_get_queues, or immich_empty_queue, which an agent must disambiguate on its own.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no when-to-use guidance, no prerequisites, and no alternatives. It never mentions the optional status filter or when filtering would be appropriate, leaving the agent to infer that this lists jobs after discovering a queue via immich_get_queues.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_queuesList all queuesBRead-onlyIdempotent
List all queues
Retrieves a list of queues.
Immich operation: GET /queues · tag: Queues
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is fully covered. The description adds nothing beyond that (no auth requirements, no note on whether queues include counts/status), so it neither helps nor harms.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, but the first two lines are redundant restatements of the same idea ('List all queues' / 'Retrieves a list of queues'), and the third line is pure endpoint metadata. It earns its place by being brief, but wastes a sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless read-only list operation with full annotation coverage and no output schema, the description is sufficient to invoke correctly. It omits any hint of what a queue record contains, but that is a minor gap for a tool this simple.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics for the description to explain. Baseline of 4 applies since the empty schema is self-explanatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all queues'), which is clear on its own. However, it does not differentiate itself from close siblings such as immich_get_queue (singular), immich_get_queue_jobs, and immich_get_queues_legacy, which an agent could easily confuse with this one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus the sibling queue tools (get_queue, get_queue_jobs, get_queues_legacy) or when-not to use it. The agent is left to infer selection entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_queues_legacyRetrieve queue counts and statusARead-onlyIdempotent
Retrieve queue counts and status
Retrieve the counts of the current queue, as well as the current status.
Immich operation: GET /jobs · tag: Jobs
DEPRECATED — prefer the replacement operation if one exists.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, so the safety profile is fully covered. The description adds the return content (counts and current status) plus a deprecation warning, which is useful but not deep 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence duplicates the title verbatim and the second sentence restates it again, so the opening is redundant before reaching the deprecation note. The useful deprecation signal is placed last rather than front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and no output schema, the description carries the burden of explaining what comes back, and it does say it returns queue counts and current status. The main gap is not identifying the replacement tool for a deprecated endpoint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there are no parameter semantics for the description to explain; the empty schema is self-documenting. Baseline 4 applies for a no-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retrieve queue counts and status') and repeats it as 'counts of the current queue, as well as the current status.' It does not name the non-legacy sibling (immich_get_queues) as the replacement, so differentiation from that near-identical tool is left to the reader.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'DEPRECATED — prefer the replacement operation if one exists' line gives a usage steer, but it never names the alternative, so an agent cannot confidently route to immich_get_queues without inferring it. Implied guidance rather than explicit when/when-not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_reverse_geocoding_stateRetrieve reverse geocoding stateBRead-onlyIdempotent
Retrieve reverse geocoding state
Retrieve the current state of the reverse geocoding import.
Immich operation: GET /system-metadata/reverse-geocoding-state · tag: System metadata
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds a little context (it is about import state) but nothing about what the state contains, whether it requires admin auth, or how fresh the data is.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, but it repeats the title verbatim in the first line and then restates the same idea in the second sentence, so a small amount of the text is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and no output schema, the description is the only source of information about what comes back, yet it never describes the shape of the state (e.g. whether geocoding is enabled, in progress, or pending). Adequate but leaves a real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: it reads the current state of the reverse geocoding import. However, it does not distinguish itself from the sibling immich_reverse_geocode, which triggers geocoding; an agent could confuse reading state with running the operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance at all. There is no statement of when an agent should check geocoding state versus call immich_reverse_geocode to trigger it, nor any prerequisite or polling guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_search_suggestionsRetrieve search suggestionsARead-onlyIdempotent
Retrieve search suggestions
Retrieve search suggestions based on partial input. This endpoint is used for typeahead search features.
Immich operation: GET /search/suggestions · tag: Search
| Name | Required | Description | Default |
|---|---|---|---|
| make | No | Filter by camera make | |
| type | Yes | Suggestion type | |
| model | No | Filter by camera model | |
| state | No | Filter by state/province | |
| country | No | Filter by country | |
| lensModel | No | Filter by lens model | |
| includeNull | No | Include null values in suggestions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered by structured data. The description adds only the 'partial input / typeahead' framing and says nothing about return shape or how suggestions are computed, so it contributes modest value beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short, but the title 'Retrieve search suggestions' is repeated verbatim as the opening line and then restated as 'Retrieve search suggestions based on partial input', so roughly a third of the text is redundant. The 'Immich operation' line is boilerplate rather than agent-useful content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only suggestion endpoint with a fully documented schema and no output schema, the description supplies enough to call it correctly: the resource, the partial-input nature, and the typeahead scenario. Only return-value behavior and pagination are unaddressed, which is minor here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across all 7 parameters (including the required 'type' enum and the optional make/model/state/country/lensModel/includeNull filters), so the schema carries the full burden. The description adds no parameter-level meaning beyond that, which is the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Retrieve search suggestions') and adds the operative detail 'based on partial input', which tells the agent exactly what kind of input it consumes. It does not differentiate itself from the many sibling search tools (immich_search_places, immich_search_person, immich_get_explore_data), so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The sentence 'This endpoint is used for typeahead search features' gives clear usage context: partial-input autocomplete rather than full search. It names no alternative tool and states no exclusions, so it sits at clear-context-without-exclusions rather than the explicit when/when-not of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_segmentGet HLS segment or init fileBRead-onlyIdempotent
Get HLS segment or init file
Streams an HLS init segment (init.mp4) or media segment (seg_N.m4s).
Immich operation: GET /assets/{id}/video/stream/{sessionId}/{variantIndex}/{filename} · tag: Assets
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| key | No | ||
| slug | No | ||
| filename | Yes | pattern: ^(init\.mp4|seg_\d+\.m4s)$ | |
| sessionId | Yes | format: uuid | |
| variantIndex | Yes | ||
| x-immich-hls-msn | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds that it streams raw HLS artifacts and names the underlying endpoint, but says nothing about content type, range requests, or error behavior when a session expires.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short lines with the purpose front-loaded and no filler. The endpoint/tag metadata line is compact and mildly useful, though it consumes space that could have carried usage guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a segment-streaming tool with no output schema and 43% param coverage, the description is minimally viable but leaves key operational questions open: how the session/variant are established and what the caller receives back. Annotations cover safety, but not the streaming contract.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 43%, so the schema leaves gaps. The description partially compensates by spelling out the two valid filename forms (init.mp4, seg_N.m4s), but the semantics of sessionId, variantIndex, and the x-immich-hls-msn header remain undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get' / 'HLS segment or init file') and clarifies the two artifact types (init.mp4 vs seg_N.m4s). It is distinguishable from the generic asset CRUD siblings, though it never names the closely related immich_play_asset_video or download tools it sits beside.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when an agent should fetch an HLS segment instead of using immich_play_asset_video, immich_view_asset, or immich_download_asset. Prerequisites (how to obtain a valid sessionId or variantIndex) are also absent, so usage must be inferred entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_server_configGet configCRead-onlyIdempotent
Get config
Retrieve the current server configuration.
Immich operation: GET /server/config · tag: Server
DEPRECATED — prefer the replacement operation if one exists.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered by structured data. The description adds only that the tool is deprecated, which is behavioral context, but omits what config data is returned, authentication scope, or the identity of the replacement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, with the operational mapping (GET /server/config, tag Server) and deprecation notice clearly separated. Efficient overall, though the deprecation line is ambiguous without naming the replacement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-param retrieval tool this could be near-complete, but the deprecation warning is incomplete without naming the replacement tool, and no output structure is given despite has_output_schema=false. An agent cannot know what config shape to expect or where to migrate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the baseline is 4 and there is nothing to document. The empty input schema is fully consistent with the description's lack of parameter info.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb+resource: 'Retrieve the current server configuration.' However, it does not distinguish this tool from the many similar config siblings (get_config, get_admin_config, get_user_config, get_public_config, get_config_defaults), so the agent cannot tell which config scope this covers without opening additional schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives like get_public_config, get_admin_config, or the deprecation replacement. The 'DEPRECATED — prefer the replacement operation if one exists' line acknowledges alternatives but gives no concrete pointer, and the entire sibling cluster of config tools is otherwise unmentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_server_featuresGet featuresBRead-onlyIdempotent
Get features
Retrieve available features supported by this server.
Immich operation: GET /server/features · tag: Server
DEPRECATED — prefer the replacement operation if one exists.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true and destructiveHint=false, so the safety profile is covered. The description does add useful non-schema context in flagging the operation as DEPRECATED, though it stops short of stating what replaces it or how long it remains available.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the purpose, but it redundantly restates the name ('Get features') before the actual sentence 'Retrieve available features supported by this server.' The generated header 'Immich operation: GET /server/features · tag: Server' is filler from the agent's perspective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only server-info call with no output schema, the description is nearly sufficient. The one real gap is the deprecation notice failing to identify the recommended replacement, which would matter most given this tool's projected lifecycle.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a parameterless tool is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Retrieve') and resource ('available features supported by this server'), so the agent knows it returns a server capability list. It does not, however, distinguish itself from similarly server-scoped siblings like immich_get_server_config or immich_get_supported_media_types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this versus alternatives; the only hint is a deprecation note that says to 'prefer the replacement operation if one exists' without naming that replacement. The agent is left to guess what supersedes it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_server_licenseGet product keyBRead-onlyIdempotent
Get product key
Retrieve information about whether the server currently has a product key registered.
Immich operation: GET /server/license · tag: Server
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds the useful behavioral detail that the call reports whether a product key is registered, but says nothing about required permissions or the nature of the returned license data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, with the operative sentence immediately after the title line. The repeated title line and the trailing 'GET /server/license · tag: Server' metadata are mildly redundant but not harmful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries more burden, yet it only says the response concerns whether a product key exists, without indicating fields such as license validity or expiry. For a simple zero-param read this is adequate but leaves the return shape underspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. The description appropriately does not invent parameter discussion for a parameterless call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: retrieve whether the server currently has a product key registered, which is more precise than the bare title. It does not explicitly distinguish itself from close siblings like immich_set_server_license or immich_delete_server_license, though the get/set/delete verb pattern makes the distinction reasonably inferable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this versus alternatives, no prerequisites, and no mention that license endpoints typically require admin privileges. The agent must infer usage from the endpoint path and tag alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_server_statisticsGet statisticsBRead-onlyIdempotent
Get statistics
Retrieve statistics about the entire Immich instance such as asset counts.
Immich operation: GET /server/statistics · tag: Server
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds the instance-wide scope and hints at the content (asset counts), but says nothing about permission level (this endpoint is typically admin-gated) or cost/latency of a full-instance aggregation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The 'Get statistics' line restates the name and title verbatim, and the operation/route footer is boilerplate rather than agent-facing guidance. Only one sentence carries real information, so the structure is compact but only partially front-loaded with substance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining what comes back, yet it only offers 'such as asset counts' as an example. An agent cannot anticipate the returned fields (storage usage, per-type counts, etc.), and no auth prerequisite is noted for an instance-wide endpoint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. No parameter text is required or missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The second sentence states a specific verb and resource (retrieve statistics) and scopes them to the 'entire Immich instance such as asset counts', which is meaningful because the sibling list contains many narrower statistics tools (album, asset, person, library, activity statistics). It does not explicitly name those siblings, so differentiation is implied by scope rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use statement and no routing to alternatives, even though the sibling set offers five or more competing '*statistics' tools. The agent must infer from the phrase 'entire Immich instance' alone that this is the global, not per-entity, choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_server_versionGet server versionBRead-onlyIdempotent
Get server version
Retrieve the current server version in semantic versioning (semver) format.
Immich operation: GET /server/version · tag: Server
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is fully covered. The description adds only the semver output format, which is modest but genuine additional context beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, with the purpose in the first sentence. The only minor waste is the title/description overlap ('Get server version' repeated as 'Retrieve the current server version').
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter, read-only getter with no output schema and full annotation coverage, the description supplies what is needed, including the return format (semver). It stops short of noting that it is an unauthenticated/public-style endpoint, but nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema baseline of 4 applies; there is nothing for the description to compensate for.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retrieve the current server version') and adds the output format (semver), which is more than a restatement of the title. It does not, however, distinguish itself from closely named siblings such as immich_get_version_check or immich_get_version_history, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance and no mention of the alternatives (version_check, version_history, about_info) that an agent might confuse this with. The agent is left to infer the context entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_sessionsRetrieve sessionsBRead-onlyIdempotent
Retrieve sessions
Retrieve a list of sessions for the user.
Immich operation: GET /sessions · tag: Sessions
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is fully covered without the description. The description adds only the raw REST mapping (GET /sessions) and says nothing about pagination, ordering, or the shape of a session object.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first line repeats the title verbatim, and the second sentence restates the same idea, so roughly half the text is redundant. The 'Immich operation' line is boilerplate metadata rather than task-relevant prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with full annotations, the core is covered, but with no output schema the description could reasonably describe what a session record contains and whether results are paginated. Those gaps leave the agent unable to anticipate the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. There is nothing for the description to clarify beyond what the empty schema already communicates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retrieve a list of sessions') and adds the scope qualifier 'for the user', which implicitly separates it from immich_get_user_sessions_admin. It does not explicitly name or contrast with any sibling, so an agent must infer the admin-vs-self distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not guidance. The phrase 'for the user' weakly implies this returns the authenticated user's own sessions rather than another user's, which is enough to imply usage but not to route confidently against immich_get_user_sessions_admin.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_stackRetrieve a stackBRead-onlyIdempotent
Retrieve a stack
Retrieve a specific stack by its ID.
Immich operation: GET /stacks/{id} · tag: Stacks
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=true, destructive=false, idempotent=true and openWorld=true, so the safety profile is fully covered by structured data. The description only adds the underlying HTTP mapping (GET /stacks/{id}) and the tag, which is operational metadata rather than behavioral context such as error behavior on a missing ID.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, leading with the action. It is slightly redundant, though, repeating the title ('Retrieve a stack') before restating it as 'Retrieve a specific stack by its ID.'
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool whose annotations fully cover the safety profile and which has no output schema to explain, the description is largely complete. Its only real omission is any notion of failure behavior (e.g., an unknown stack ID).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (the single 'id' parameter is documented as a UUID), so the schema carries the parameter burden. The description merely restates that retrieval is keyed by ID, adding no new format or constraint detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Retrieve a specific stack by its ID') and pins the lookup key to the ID, which distinguishes it from list/search-style siblings like immich_search_stacks. However, it never explicitly contrasts itself with the other stack siblings (create/update/delete), so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance or mention of alternatives. The phrase 'by its ID' weakly implies the caller must already hold a stack ID, but the description never says to use immich_search_stacks to obtain one, nor does it state any preconditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_storageGet storageARead-onlyIdempotent
Get storage
Retrieve the current storage utilization information of the server.
Immich operation: GET /server/storage · tag: Server
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the server-scope and the underlying REST operation (GET /server/storage), but no additional behavioral context like auth requirements or response format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded: it starts with a one-line title and immediately expands on the purpose. The final line provides API metadata. The only minor redundancy is the first line repeating the tool title, but overall it is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity (no parameters, no output schema) and rich annotations, the description is nearly complete. It states what the tool returns ('storage utilization information'), though it could be slightly more specific about the shape of that information. No output schema means the description carries some burden, but it is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline score of 4 applies per the rubric. No parameter semantics are needed, and the description does not introduce confusion.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Retrieve the current storage utilization information of the server') and scopes it to the server, which distinguishes it from sibling tools like immich_get_album_statistics or immich_get_asset_statistics. It does not explicitly name a sibling it might be confused with, but the purpose is clear enough for an agent to select it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the purpose ('Retrieve storage utilization'), suggesting it is called to monitor server storage capacity. There is no explicit when-to-use, when-not-to-use, or alternative tool guidance, so it is only adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_storage_template_optionsGet storage template optionsBRead-onlyIdempotent
Get storage template options
Retrieve exemplary storage template options.
Immich operation: GET /system-config/storage-template-options · tag: System config
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is fully covered. The description adds the underlying REST operation (GET /system-config/storage-template-options) and its 'System config' tag, which is useful provenance but no extra behavioral detail such as auth requirements or response characteristics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, and the REST-operation line adds concrete provenance. It is slightly redundant, repeating 'Get storage template options' in the title and then rephrasing it as 'Retrieve exemplary storage template options', but the brevity keeps it efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter read tool whose annotations already carry the safety profile, the description is minimally adequate. With no output schema present, it could have explained what the returned template options look like or how they are used, but leaves that entirely to the caller's inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. There is nothing for the description to disambiguate at the parameter level, and the empty schema is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a verb ('Get'/'Retrieve') and resource ('storage template options'), so the basic operation is understandable. However, it is essentially a restatement of the tool name, and 'exemplary' is vague about what these options actually are. It does nothing to distinguish this from adjacent config-style siblings like immich_get_config or immich_get_admin_config.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of any alternative tool. An agent gets no signal about when this is the right call versus the many other get_* config tools in the sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_supported_media_typesGet supported media typesBRead-onlyIdempotent
Get supported media types
Retrieve all media types supported by the server.
Immich operation: GET /server/media-types · tag: Server
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds only the endpoint path and 'Server' tag, which is mildly useful, but nothing about return shape or whether the result is static per server version.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, but the first line restates the title verbatim before the substantive sentence, which is mild redundancy. The endpoint/tag line is compact metadata rather than prose bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only capability probe the description conveys enough to call it correctly, and no output schema exists so there is pressure to describe returns. It does say it retrieves 'all media types', implying a list, though it never clarifies what a 'media type' value looks like.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline of 4 applies. The description correctly implies a no-argument enumeration call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retrieve all media types supported by the server') plus the underlying operation (GET /server/media-types), so the agent knows exactly what it returns. It does not contrast itself with any sibling, but no sibling competes for this capability.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no preconditions, and no mention of alternatives such as immich_get_server_features or immich_get_about_info. Usage is only implied by the verb 'get' and the server-capability framing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_sync_ackRetrieve acknowledgementsBRead-onlyIdempotent
Retrieve acknowledgements
Retrieve the synchronization acknowledgments for the current session.
Immich operation: GET /sync/ack · tag: Sync
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is fully covered by structured data. The description's only additive behavior context is the 'current session' scoping, which is useful but thin; it says nothing about what an acknowledgement represents or how the response is shaped.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short and front-loaded, but the first line is a verbatim restatement of the title and the second sentence largely paraphrases it. The only genuinely new content is 'for the current session' and the endpoint/tag line, so roughly half the text is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and rich annotations, the structural burden is low, but there is no output schema and the description never explains what a sync acknowledgement contains or why an agent would want it. For an obscure internal sync endpoint, that domain context is the missing piece.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline is 4. The description correctly implies no input is required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (retrieve) and resource (synchronization acknowledgments), plus a scope qualifier ('for the current session'). It does not name or contrast itself with the obvious siblings immich_send_sync_ack and immich_delete_sync_ack, so differentiation is left to the reader.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when an agent should call this versus send_sync_ack, delete_sync_ack, or the broader sync stream. No prerequisites, no mention of when the result is relevant. The 'current session' phrase implies a context but does not instruct.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_sync_streamStream sync changesB
Stream sync changes
Retrieve a JSON lines streamed response of changes for synchronization. This endpoint is used by the mobile app to efficiently stay up to date with changes.
Immich operation: POST /sync/stream · tag: Sync
| Name | Required | Description | Default |
|---|---|---|---|
| reset | No | reset (request body) | |
| types | Yes | types (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=true, so the safety profile is covered structurally. The description adds the genuinely useful behavioral fact that the response is a streamed JSON-lines payload rather than a single object. However it omits important behavioral context for this endpoint, such as the sync-ack loop and what `reset` does to client state. There is also a mild tension: the description frames this as a "retrieve" operation while annotations mark it non-read-only, though for a POST-based streaming endpoint this is conventional rather than a true contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and short: the purpose sentence leads, support context follows, and the API mapping line (POST /sync/stream) is useful for tracing. The only waste is the title being restated verbatim as the first line.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description needn't explain return values, but for an unusual streaming sync endpoint it leaves out the operational context an agent would need — that a stream must be paired with an acknowledgment and what `reset` changes. Adequate but with clear gaps for this tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for both parameters, so the schema already carries the parameter documentation and the baseline is 3. The description adds no meaning beyond the schema — it never explains what `types` selects or what `reset` does to synchronization state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource ("Retrieve a JSON lines streamed response of changes for synchronization") and states the consumer (mobile app), so the agent can tell what the tool does and roughly who uses it. It does not, however, distinguish this from closely related siblings such as immich_get_sync_ack, immich_send_sync_ack, or immich_delete_sync_ack, which is the main thing keeping it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"This endpoint is used by the mobile app to efficiently stay up to date with changes" gives implied usage context, but there is no explicit when-to-use guidance, no prerequisites (e.g., that a sync acknowledgment follows), and no alternative named. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_tag_by_idRetrieve a tagBRead-onlyIdempotent
Retrieve a tag
Retrieve a specific tag by its ID.
Immich operation: GET /tags/{id} · tag: Tags
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is fully covered. The description adds only the underlying HTTP operation (GET /tags/{id}) and tag grouping, which is mildly useful for traceability but no behavioral context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first line restates the tool title verbatim before the actual description, which is pure redundancy. The remaining content is compact, and the endpoint/tag metadata line is useful context, but the front-loading is wasted on a duplicate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-only lookup with no output schema, the description covers what the agent needs to invoke it correctly. Missing only edge cases such as not-found behavior, which is minor for a simple getter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter (id, uuid) is documented in the schema. The description's 'by its ID' adds no format or syntax detail beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retrieve a specific tag by its ID') and the scope (single record by ID), which distinguishes it from immich_get_all_tags and immich_update_tag. It does not explicitly name those siblings, but the single-item scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus immich_get_all_tags, immich_search_* tag lookups, or the mutation siblings. The agent gets the 'what' but must infer the 'when' entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_time_bucketGet time bucketBRead-onlyIdempotent
Get time bucket
Retrieve a string of all asset ids in a given time bucket.
Immich operation: GET /timeline/bucket · tag: Timeline
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | ||
| bbox | No | Bounding box coordinates as west,south,east,north (WGS84) | |
| slug | No | ||
| order | No | Sort order for assets within time buckets (ASC for oldest first, DESC for newest first) | |
| tagId | No | Filter assets with a specific tag | |
| userId | No | Filter assets by specific user ID | |
| albumId | No | Filter assets belonging to a specific album | |
| orderBy | No | Date to group and order assets by (takenAt for date taken, createdAt for date added to Immich) | |
| personId | No | Filter assets containing a specific person (face recognition) | |
| isTrashed | No | Filter by trash status (true for trashed assets only, false for non-trashed only) | |
| isFavorite | No | Filter by favorite status (true for favorites only, false for non-favorites only) | |
| timeBucket | Yes | Time bucket identifier in YYYY-MM-DD format | |
| visibility | No | Filter by asset visibility status (ARCHIVE, TIMELINE, HIDDEN, LOCKED) | |
| withStacked | No | Include stacked assets in the response. When true, only primary assets from stacks are returned. | |
| withPartners | No | Include assets shared by partners | |
| withCoordinates | No | Include location data in the response |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds one useful behavioral fact beyond that: the return is a string of asset ids rather than asset objects. It does not disclose pagination, size limits, or what a bucket key looks like, so it is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences plus an operation line, front-loaded with the core behavior. The 'Get time bucket' heading merely restates the title, which is minor waste, but the body is tight and earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-parameter tool with no output schema, the description does clarify the return shape (asset id string), which is the main thing the schema cannot convey. But it never explains what a 'time bucket' is or how the required timeBucket identifier is obtained, leaving a meaningful gap for an agent trying to construct the call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 88%, so the schema already documents nearly every one of the 16 parameters (bbox, order, orderBy, filters, etc.). The description adds no parameter meaning beyond what the schema provides, which is the expected baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Retrieve a string of all asset ids in a given time bucket.' This is clear enough to know what comes back (asset ids, not full assets). However, it never distinguishes itself from the near-identical sibling immich_get_time_buckets (plural), which an agent would plausibly confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of alternatives (e.g. immich_search_assets, immich_get_time_buckets), and no stated prerequisites. The 'tag: Timeline' annotation hints at domain grouping but does not tell the agent when this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_time_bucketsGet time bucketsCRead-onlyIdempotent
Get time buckets
Retrieve a list of all minimal time buckets.
Immich operation: GET /timeline/buckets · tag: Timeline
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | ||
| bbox | No | Bounding box coordinates as west,south,east,north (WGS84) | |
| slug | No | ||
| order | No | Sort order for assets within time buckets (ASC for oldest first, DESC for newest first) | |
| tagId | No | Filter assets with a specific tag | |
| userId | No | Filter assets by specific user ID | |
| albumId | No | Filter assets belonging to a specific album | |
| orderBy | No | Date to group and order assets by (takenAt for date taken, createdAt for date added to Immich) | |
| personId | No | Filter assets containing a specific person (face recognition) | |
| isTrashed | No | Filter by trash status (true for trashed assets only, false for non-trashed only) | |
| isFavorite | No | Filter by favorite status (true for favorites only, false for non-favorites only) | |
| visibility | No | Filter by asset visibility status (ARCHIVE, TIMELINE, HIDDEN, LOCKED) | |
| withStacked | No | Include stacked assets in the response. When true, only primary assets from stacks are returned. | |
| withPartners | No | Include assets shared by partners | |
| withCoordinates | No | Include location data in the response |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true and destructiveHint=false, so the safety profile is fully covered elsewhere. The description adds only the word 'minimal' (hinting at a compact payload) and otherwise restates the operation; it says nothing about response shape, pagination, or what a bucket contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short, but the first line merely repeats the title and the second line restates it again ('Get time buckets' / 'Retrieve a list of all minimal time buckets'), so the content is somewhat redundant rather than front-loaded with information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read tool with 15 filtering parameters and no output schema, the description should explain what a 'time bucket' is and roughly what is returned. It leaves the core concept undefined and gives the agent nothing to reason about the response, so it is incomplete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 87%, so the 15 filter parameters (bbox, orderBy, visibility, isTrashed, etc.) are already well documented in the schema. The description adds no parameter meaning whatsoever, which is acceptable only because the schema does the heavy lifting — the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a verb ('Retrieve') and resource ('time buckets'), but 'time buckets' is never explained, and it fails to distinguish itself from the closely named sibling immich_get_time_bucket (singular). An agent seeing both tools cannot tell which one it needs from this text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of the singular sibling immich_get_time_bucket as an alternative. The only routing hint is the raw REST path and tag, which is not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_unique_original_pathsRetrieve unique pathsARead-onlyIdempotent
Retrieve unique paths
Retrieve a list of unique folder paths from asset original paths.
Immich operation: GET /view/folder/unique-paths · tag: Views
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is well covered. The description adds the Immich operation mapping (GET /view/folder/unique-paths) and tag, which could aid debugging but doesn't disclose return shape or pagination behavior. Baseline level for annotations-covered 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, but the first line repeats the title verbatim ('Retrieve unique paths') before the substance. Minor redundancy, otherwise efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should ideally hint at the return value (array of path strings). It states 'a list of unique folder paths' which gives the shape conceptually, but doesn't say format (e.g., array of strings) or whether paths are absolute. Adequate but minimal.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so per rubric baseline is 4. No parameter semantics are needed, and the schema is trivially complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Retrieve a list of unique folder paths from asset original paths.' This is clear and distinguishable from most siblings, though it doesn't explicitly contrast with the closely related 'immich_get_assets_by_original_path' or 'immich_search_asset_files'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is for listing distinct folder paths but gives no explicit when-to-use guidance or alternatives. For a read-only discovery endpoint with a related sibling (get_assets_by_original_path), a note on when to prefer this would help.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_userRetrieve a userCRead-onlyIdempotent
Retrieve a user
Retrieve a specific user by their ID.
Immich operation: GET /users/{id} · tag: Users
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered structurally. The description adds nothing behavioral beyond restating the HTTP route; it never says whether this requires admin privileges, whether it can fetch any user or only the caller, or what happens on a missing ID.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short, but the opening duplicates the title verbatim ('Retrieve a user') and the next line paraphrases it ('Retrieve a specific user by their ID') before restating the API route and tag. Two of the four lines carry no incremental information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotation gaps to fill, the definition is minimally viable for a simple get-by-id call, but it should say whose user record is retrievable and what the response contains (profile fields vs. admin-only fields) to be complete for a Users-domain tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single `id` parameter, so the schema already carries the parameter contract (uuid format, required). The description only restates that lookup is 'by their ID' and adds no format, scope, or constraint detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb+resource+lookup key: retrieving a specific user by ID, and the embedded GET /users/{id} leaves no ambiguity about the operation. However, it makes no attempt to distinguish itself from closely related siblings such as immich_get_my_user, immich_get_user_admin, or immich_search_users, which an agent must choose between.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus immich_get_my_user (self) or immich_get_user_admin (admin view of another user). Given the dense sibling set of user-retrieval tools, the absence of any routing condition is a real gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_user_adminRetrieve a userBRead-onlyIdempotent
Retrieve a user
Retrieve a specific user by their ID.
Immich operation: GET /admin/users/{id} · tag: Users (admin)
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is fully covered by structured data. The description adds only the underlying REST operation (GET /admin/users/{id}) and tag, which is mild extra context but discloses nothing about error behavior or permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The body is short, but the first line 'Retrieve a user' simply duplicates the title, and the second sentence repeats the same idea ('Retrieve a specific user by their ID'). The operation/tag footer is useful metadata, but roughly half the text is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with full annotation coverage and no output schema, the description is nearly sufficient: verb, resource, ID-based lookup, and the admin endpoint are all present. The one real gap is the absence of routing guidance among the many user-retrieval siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (the single 'id' parameter is documented as uuid format), so the schema already carries the parameter burden. The phrase 'by their ID' restates the schema rather than adding format, validation, or source-of-ID guidance, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Retrieve a specific user by their ID') and the admin tag plus the GET /admin/users/{id} operation line make the admin scope explicit. However, it never distinguishes itself from the close siblings immich_get_user, immich_get_my_user, or immich_search_users_admin, so an agent must infer which retrieval variant applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance. The 'admin' tag and endpoint path imply an administrative context, but the description does not tell the agent to prefer this over immich_get_user for self-lookup or immich_search_users_admin for lookup by other criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_user_calendar_heatmap_adminRetrieve calendar heatmap activityBRead-onlyIdempotent
Retrieve calendar heatmap activity
Retrieve activity counts for a specified period, in a calendar heatmap format.
Immich operation: GET /admin/users/{id}/calendar-heatmap · tag: Users (admin)
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| to | No | End date in UTC | |
| from | No | Start date in UTC | |
| type | No | Type of calendar heatmap |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds that this is an admin-scoped operation and exposes the backing route, implying elevated permissions, but says nothing about auth requirements, rate limits, or output shape. Adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, but the first line merely repeats the title before the substantive second sentence, so a small amount of space is wasted. Slightly redundant but overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only stats endpoint with four fully documented parameters and a complete annotation safety profile, this is close to sufficient; it even sketches the return concept ('activity counts in calendar heatmap format'). It could do more on admin authorization and the date-range semantics when from/to are omitted, but no output schema means little else is required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (id, to, from, type each documented, type has an enum). The description only alludes to 'a specified period', adding no syntax, default, or interpretation beyond what the schema already provides. Baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Retrieve') and resource ('calendar heatmap activity') plus the admin route GET /admin/users/{id}/calendar-heatmap. It is clear what the tool returns, but it never distinguishes itself from the sibling immich_get_my_calendar_heatmap, leaving the 'admin/user-id vs. self' distinction implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no prerequisites, and no alternatives. The existence of immich_get_my_calendar_heatmap as a sibling means an agent would benefit from knowing this endpoint is for arbitrary users vs. the caller, but nothing is stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_user_configGet the configuration with user visibilityBRead-onlyIdempotent
Get the configuration with user visibility
Retrieve the system configuration properties that are visible to logged in users.
Immich operation: GET /config · tag: Config (user)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully carried by structured data. The description's only added behavior is the visibility scope of the returned properties, with no mention of caching, auth requirements, or response shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, with the scope stated up front. Minor waste: the title line is repeated verbatim as the first sentence, and the raw 'Immich operation: GET /config' line is metadata rather than agent-facing guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and annotations covering the safety profile, the definition is nearly complete for invocation. But there is no output schema and the description gives no indication of what the returned configuration object contains, which leaves a real gap for an agent that must decide between this and its sibling config getters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate. Baseline 4 applies per the zero-parameter rule.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb and resource ('Retrieve the system configuration properties that are visible to logged in users'), and the 'user visibility' scope does distinguish it from the public and admin config siblings. However, it never names the close siblings it must be chosen over (get_config, get_server_config, get_public_config, get_admin_config), so an agent still has to infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance, and no alternatives are named despite at least four sibling config-retrieval tools existing. The only routing signal is the implied 'logged in users' context embedded in the purpose sentence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_user_config_defaultsGet the default configuration with user visibilityARead-onlyIdempotent
Get the default configuration with user visibility
Retrieve the default value of the configuration properties that are visible to logged in users.
Immich operation: GET /config/defaults · tag: Config (user)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safe-read profile is covered. The description adds only the audience scoping ('visible to logged in users'); it says nothing about auth requirements or that a live server call is made.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, with the operative sentence appearing immediately. The title line and the 'Immich operation'/'tag' trailer are mildly redundant metadata but do not bloat the description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A zero-parameter, read-only endpoint with annotations covering safety and no output schema to explain; the description conveys what is returned (default config values visible to logged-in users) well enough to call it. Naming the admin/public counterparts would make routing unambiguous.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies. There is no parameter syntax the description could usefully add.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: retrieving default configuration values, scoped to properties visible to logged-in users. This differentiates it from the admin/public config-defaults variants by audience, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'visible to logged in users' implies when this variant applies, but there is no explicit guidance distinguishing it from immich_get_config_defaults, immich_get_admin_config_defaults, or immich_get_public_config_defaults. Usage is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_user_licenseRetrieve user product keyBRead-onlyIdempotent
Retrieve user product key
Retrieve information about whether the current user has a registered product key.
Immich operation: GET /users/me/license · tag: Users
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered without the description. The description does add useful scoping context (self-scoped via GET /users/me/license, no mutation) but nothing on rate limits, auth requirements, or response behavior — appropriate given annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, but the title is repeated verbatim as the opening line and then paraphrased in the second sentence, which is redundant filler. The Immich operation/tag trailer is compact metadata that is acceptable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only lookup this covers what the agent needs; the description also hints at the payload semantics ('whether the user has a registered product key'). With no output schema, a brief note on the returned fields (e.g., key/activation status) would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate. Baseline 4 applies; the description correctly implies the user identity is taken from the session rather than passed in.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource and narrows scope to the current user's own product key ('whether the current user has a registered product key'), which separates it from server-license and admin user-license operations. It does not explicitly name a sibling (e.g., set_user_license / delete_user_license / get_server_license) to route the agent, so it stops just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of the related license tools (set_user_license, delete_user_license, get_server_license) that an agent could confuse this with. The only routing signal is implicit in the name/description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_user_onboardingRetrieve user onboardingBRead-onlyIdempotent
Retrieve user onboarding
Retrieve the onboarding status of the current user.
Immich operation: GET /users/me/onboarding · tag: Users
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, so the safety profile is fully covered by structured data. The description adds only the raw HTTP path and tag, which is restatement rather than behavioral context; it says nothing about auth requirements scope or what the status contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first line is a verbatim repetition of the title, and the remaining content is a near-synonymous sentence plus an operation footer. It is short, but a third of the text carries no information beyond the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description is the only source for the return value, and 'onboarding status' is not elaborated (e.g., what flags it contains). For a zero-param read tool the definition is adequate but leaves the response shape opaque.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description correctly implies there is nothing to pass (current user is implicit), and no additional parameter meaning is needed or missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retrieve the onboarding status') and scopes it to 'the current user', which implicitly separates it from immich_get_admin_onboarding and immich_set_user_onboarding. Sibling disambiguation is only implicit, not named, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no mention of the sibling immich_set_user_onboarding that would let an agent know this is the read half of a read/write pair. Usage is only inferable from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_user_preferences_adminRetrieve user preferencesARead-onlyIdempotent
Retrieve user preferences
Retrieve the preferences of a specific user.
Immich operation: GET /admin/users/{id}/preferences · tag: Users (admin)
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds only the admin-endpoint context, which implies elevated permissions, but says nothing about return shape, admin-only authorization failure modes, or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, but the title is repeated verbatim as the first line and then restated in the second sentence, which is mild redundancy. The operation line is compact and useful for disambiguation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with full annotation coverage, a complete schema, and no output schema to explain, the description supplies what an agent needs to select and call it correctly. It only lacks explicit sibling routing, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, and schema coverage is 100% with 'format: uuid' documented in the schema. The description's 'a specific user' confirms the id identifies a user target, which is a small but real addition over the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Retrieve the preferences of a specific user') and the Immich operation line pins the exact endpoint (GET /admin/users/{id}/preferences) and admin tag. This clearly separates it from the self-scoped sibling immich_get_my_preferences, though it never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the 'admin' tag and 'a specific user' phrasing suggest this is for administrators looking up another user's preferences, but there is no explicit when-to-use guidance or stated alternative (e.g., use immich_get_my_preferences for your own settings).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_user_sessions_adminRetrieve user sessionsBRead-onlyIdempotent
Retrieve user sessions
Retrieve all sessions for a specific user.
Immich operation: GET /admin/users/{id}/sessions · tag: Users (admin)
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds the concrete admin endpoint (GET /admin/users/{id}/sessions) and the admin tag, which confirms privilege requirements, but says nothing about what a session record contains or whether it is paginated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first line duplicates the tool title verbatim before the actual sentence adds anything, and the operation/tag line is metadata rather than guidance. Front-loaded enough to be usable but carries one redundant sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with full annotations this is close to sufficient, but with no output schema the description could say what a returned session includes. The endpoint line usefully confirms it is an admin-scoped read, which is the main thing an agent needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is documented as a uuid in the schema. The description only implies the id is a user id via 'for a specific user', adding marginal meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retrieve all sessions for a specific user') and the 'admin' name/tag plus 'for a specific user' scoping sets it apart from the personal immich_get_sessions. It stops just short of explicitly naming that sibling as the non-admin alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance. Nothing tells the agent that this is the admin path for inspecting another user's sessions versus immich_get_sessions (current user's sessions) or immich_search_users_admin (to find the id first). Usage is only weakly implied by the endpoint path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_user_statistics_adminRetrieve user statisticsBRead-onlyIdempotent
Retrieve user statistics
Retrieve asset statistics for a specific user.
Immich operation: GET /admin/users/{id}/statistics · tag: Users (admin)
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| isTrashed | No | Filter by trash status | |
| isFavorite | No | Filter by favorite status | |
| visibility | No | Asset visibility |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is fully covered. The description adds only the backing endpoint and tag, and says nothing about what the statistics contain, whether filters combine, or result cardinality. With annotations carrying the behavioral burden, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening line merely restates the title, and the 'Immich operation: …' line is boilerplate, so roughly half the text is redundant. It is short and front-loaded, but not every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description would ideally indicate what the returned asset statistics comprise (counts, size, breakdowns). It does not, though for a simple read-only filtered lookup with complete parameter documentation the remaining gap is modest.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% – every parameter (id, isTrashed, isFavorite, visibility) is documented in the schema itself. The description adds no filtering semantics or syntax beyond what the schema already supplies, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The second sentence gives a specific verb+resource: 'Retrieve asset statistics for a specific user,' which is clearer than the tautological first line. It does not, however, distinguish this admin user-statistics endpoint from sibling statistics tools such as immich_get_asset_statistics, immich_get_album_statistics, or immich_get_person_statistics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never states when to use this admin statistics endpoint versus the non-admin or per-asset/per-album statistics siblings, nor any prerequisites (admin scope, target user id). The 'Users (admin)' tag hint is boilerplate metadata, not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_version_checkGet version check statusARead-onlyIdempotent
Get version check status
Retrieve information about the last time the version check ran.
Immich operation: GET /server/version-check · tag: Server
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds the behavioral detail that this reports the last run of the version check, but says nothing about auth requirements or rate limits. Reasonable added value over annotations, not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded: purpose first, then a clarifying sentence, then the Immich endpoint mapping. The opening line merely restates the title, which is minor waste, but overall it earns its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 full annotation coverage and no output schema, the description conveys enough to call it correctly. The one gap is that no output schema exists, so it could have named the fields returned (e.g. checkedAt, status), but the sentence about the last run covers the essentials.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there are no parameter semantics to explain and the baseline is 4. Nothing in the description contradicts or under-specifies the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource and adds scope: 'Retrieve information about the last time the version check ran.' This tells the agent what data comes back. However, it never distinguishes itself from the near-identical sibling immich_get_version_check_state or immich_get_version_history, so an agent must open schemas to disambiguate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the tool's nature as a status read; there is no explicit when-to-use, when-not-to-use, or routing to immich_get_version_check_state, which appears to cover overlapping ground. Adequate but leaves the sibling-selection decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_version_check_stateRetrieve version check stateBRead-onlyIdempotent
Retrieve version check state
Retrieve the current state of the version check process.
Immich operation: GET /system-metadata/version-check-state · tag: System metadata
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered structurally. The description adds nothing beyond that — it never says what the state object contains, whether the check is triggered elsewhere, or whether auth is required, so it merely restates the annotations in prose.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short and front-loaded, but the first line duplicates the title and the second sentence largely restates the first; only the endpoint/tag line adds new information. Mild redundancy keeps it from being a clean example of economy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read with full annotation coverage and no output schema, the description is serviceable but thin: it never characterizes the returned state or ties the tool to any workflow, leaving ambiguity against the other version-related reads.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric this is the baseline 4. There is nothing for the description to clarify about inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource — retrieve the current state of the version check process — which is clear on its own. However, it does nothing to separate itself from close siblings like immich_get_version_check, immich_get_version_history, or immich_get_server_version, so an agent still has to infer which version-related read it wants.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of the adjacent version-check tools it could be confused with. The only usage signal is the endpoint path, which the agent must interpret unaided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_version_historyGet version historyBRead-onlyIdempotent
Get version history
Retrieve a list of past versions the server has been on.
Immich operation: GET /server/version-history · tag: Server
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description adds only that the payload is a historical list; it says nothing about ordering, pagination, or auth requirements, which is an acceptable but minimal contribution on top of the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, with the resource statement up front and the raw endpoint noted at the end. The only waste is the first line, which merely restates the tool title before the actual description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool whose annotations fully cover the safety profile, the description supplies enough to call it correctly. The absence of an output schema is acceptable since the description names what is returned (past server versions).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies. There is nothing for the description to disambiguate beyond the resource itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource: 'Retrieve a list of past versions the server has been on.' An agent knows exactly what this returns. However, it does not distinguish itself from close siblings like immich_get_server_version or immich_get_version_check, which an agent could easily confuse with this one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance is provided. Given several version-related siblings (immich_get_server_version, immich_get_version_check, immich_get_version_check_state), the description should state when history is wanted versus the current version, but it offers no such routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_workflowRetrieve a workflowBRead-onlyIdempotent
Retrieve a workflow
Retrieve information about a specific workflow by its ID.
Immich operation: GET /workflows/{id} · tag: Workflows
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, so the safety profile is fully covered. The description adds the underlying REST mapping (GET /workflows/{id}) and the API tag, which is mildly useful context but says nothing about auth requirements, 404/error behavior, or the shape of the returned workflow.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The text is short and front-loaded, with the operation/tag metadata last. It does repeat the title verbatim in the first line before restating the same idea in the second, which is a minor redundancy but not wasteful enough to hurt usability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only lookup with complete annotations and a fully documented schema, the description provides enough to invoke the call correctly; no output schema exists, so return values need not be explained. The one gap is that it doesn't distinguish the tool from the other workflow-retrieval siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single required 'id' parameter is documented with a uuid format, so the schema does the heavy lifting. The description only echoes this with 'by its ID' and adds no format, sourcing, or validation detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Retrieve a workflow ... by its ID'), which is clear enough for an agent to act on. However, it does not distinguish itself from close siblings such as immich_get_workflow_logs, immich_get_workflow_triggers, immich_get_workflow_for_share, or immich_search_workflows, so the differentiator has to be inferred from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never states when to use this tool versus the sibling retrieval tools (logs, triggers, shared-workflow variants, search). The only implicit signal is 'by its ID', which hints at a prerequisite but is not framed as guidance or an exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_workflow_logsRetrieve workflow logsBRead-onlyIdempotent
Retrieve workflow logs
Retrieve logs of a workflows runs by ID
Immich operation: GET /workflows/{id}/logs · tag: Workflows
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| limit | No | Maximum number of logs | |
| before | No | Filter by runs before a date/time | |
| result | No | Filter by run result |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, covering the safety profile. The description adds only the raw endpoint and tag, without disclosing pagination behavior, auth requirements, or what the logs contain beyond the annotated read-only nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief, but the first line simply repeats the title ('Retrieve workflow logs') before restating it as 'Retrieve logs of a workflows runs by ID', which is redundant rather than front-loaded information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only retrieval tool, the annotations carry the safety profile and the schema fully documents the filters. However, no output schema exists and the description says nothing about the shape or volume of returned logs or pagination, leaving a modest gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (id, limit, before, result) are already documented in the schema, including the enum for result. The description adds no syntax or filtering semantics beyond what the schema supplies, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Retrieve logs of a workflow's runs by ID'), and the endpoint line (GET /workflows/{id}/logs) confirms the operation. It implicitly distinguishes itself from sibling immich_get_workflow by specifying that it returns run logs, but never names or contrasts any sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus immich_get_workflow, immich_get_workflow_triggers, or immich_search_workflows. Usage is only inferable from the tool name and title, with no conditions or exclusions stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_get_workflow_triggersList all workflow triggersBRead-onlyIdempotent
List all workflow triggers
Retrieve a list of all available workflow triggers.
Immich operation: GET /workflows/triggers · tag: Workflows
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true and destructiveHint=false, so the safety profile is fully covered elsewhere. The description's only added behavioral note is the global 'all available' framing of the trigger catalog, implying results are not scoped to a single workflow; no auth or rate-limit context is given. With annotations carrying the burden, this is adequate but thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short overall, but the title line 'List all workflow triggers' and the body 'Retrieve a list of all available workflow triggers' say the same thing twice, and the Immich operation/tag line is metadata padding. Front-loaded, yes, but a sentence is wasted on pure restatement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter list tool this is close to sufficient, but there is no output schema and the description never says what a 'workflow trigger' is or what fields the returned entries carry. An agent must call the tool blind to know what the trigger objects represent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema has nothing to document and the baseline is 4. There is no parameter behavior the description could have clarified, and it correctly implies an unfiltered full listing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('workflow triggers') with a global scope ('all available'), and the Immich operation line pins the endpoint (GET /workflows/triggers). It is clear what the tool returns, but it never distinguishes itself from sibling workflow tools such as immich_get_workflow or immich_search_workflows.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance and no alternatives are named. An agent cannot tell from the text whether this should be called before creating/updating a workflow, or how it relates to immich_search_workflows or immich_get_workflow_logs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_leave_cluster_groupLeave a cluster groupB
Leave a cluster group
Move the current user into a new cluster group of their own.
Immich operation: POST /cluster-groups/{id}/leave · tag: Cluster groups
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give a generic mutation profile (readOnly=false, idempotent=false, destructive=false). The description adds a genuinely non-obvious side effect: the user is moved into a brand-new cluster group of their own, not merely removed. It stops short of saying what happens to the previous group's members or what permissions are required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Core effect is front-loaded in the first sentence, with the HTTP operation/tag line kept to a compact trailing note. Nothing redundant, though the API-tag line is marginal value for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter mutation with no output schema, the description covers the primary side effect but leaves open what happens to the vacated group and whether the caller needs to be a member. Annotations cover basic safety, so this is adequate-but-gapped.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One required 'id' parameter with 100% schema description coverage, so the schema already carries the semantics. The description adds nothing about the id (e.g. that it identifies the group being left), so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Leave a cluster group') and adds the concrete effect ('Move the current user into a new cluster group of their own'). It is distinguishable from the cluster-group siblings like create_cluster_group_request and accept_cluster_group_request, though it never names them directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance, and no mention of the related request/accept flow or any alternative path. The agent must infer that this is the self-service exit action from the effect sentence alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_link_o_auth_accountLink OAuth accountB
Link OAuth account
Link an OAuth account to the authenticated user.
Immich operation: POST /oauth/link · tag: Authentication
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | url (request body) | |
| state | No | state (request body) | |
| codeVerifier | No | codeVerifier (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it is non-readonly, open-world, non-idempotent, and non-destructive. The description adds the HTTP method and endpoint (POST /oauth/link) and Authentication tag, but does not cover return behavior, required auth state, or side effects. With annotations covering safety, a 3 fits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three lines: a title echo, one clear sentence, and an operation line. Front-loaded with the core action. The opening title repetition is slightly redundant but overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter authentication mutation with no output schema, the description gives the endpoint and tag but omits prerequisites (e.g., prior OAuth flow steps), success/failure behavior, and how it relates to sibling OAuth tools. Annotations and schema cover some ground, but the lack of procedural context is a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds no parameter meaning beyond the schema's generic 'request body' labels; it does not explain what url, state, or codeVerifier represent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb 'Link' and resource 'OAuth account' with target 'authenticated user'. It does not explicitly differentiate from sibling OAuth operations such as immich_start_o_auth or immich_finish_o_auth, so no sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, prerequisites, or alternatives are given. The description only restates the action; it does not explain when linking is appropriate relative to starting, finishing, or unlinking OAuth accounts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_list_database_backupsList database backupsBRead-onlyIdempotent
List database backups
Get the list of the successful and failed backups
Immich operation: GET /admin/database-backups · tag: Database Backups (admin)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds the useful detail that the result includes failed as well as successful backups, and the 'GET /admin/database-backups' line discloses that this is an admin-scoped endpoint requiring elevated auth — meaningful context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded: purpose first, then a scope detail, then the endpoint metadata. The title restated as the first line is mild redundancy, but nothing else is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description could say more about the returned backup entries (fields, ordering, pagination), yet it only mentions that both successful and failed backups appear. Given the tool's simplicity and its safety annotations, this is adequate but leaves a gap around return shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and schema coverage is trivially 100%, so there are no parameter semantics to convey. Baseline 4 applies for a no-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list database backups) and clarifies the scope as both successful and failed backups. It is clearly distinct from siblings like immich_download_database_backup or immich_delete_database_backup by name, but the description itself does not articulate that differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not-to-use guidance, and no alternatives named. The agent must infer that this is the admin listing tool and that download/upload/delete are separate operations purely from sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_lock_auth_sessionLock auth sessionB
Lock auth session
Remove elevated access to locked assets from the current session.
Immich operation: POST /auth/session/lock · tag: Authentication
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=true, and the description is consistent with them. The description usefully adds the actual effect (dropping elevated asset access), but says nothing about auth requirements, reversibility, or session-state side effects beyond that one sentence.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded: title, effect, then the raw endpoint/tag metadata. The 'Immich operation' line is boilerplate but is compact and useful as an API cross-reference, with no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema mutation, the description covers the endpoint and the effect adequately. It stops short of noting the unlock counterpart or when the elevated access would have been granted, which is the main contextual gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. There is no parameter surface the description needs to explain.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The second sentence specifies the effect concretely ('remove elevated access to locked assets from the current session'), which is more than a restatement of the title. However, it does not distinguish this from the closely related siblings immich_lock_session and immich_unlock_auth_session, so an agent cannot confidently route between them from the description alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance is given, and the natural inverse (immich_unlock_auth_session) and near-duplicate (immich_lock_session) are never mentioned. The agent gets no signal about which of the three lock/unlock session tools to select.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_lock_sessionLock a sessionB
Lock a session
Lock a specific session by id.
Immich operation: POST /sessions/{id}/lock · tag: Sessions
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=true, covering the safety profile. The description adds the exact API operation and tag, which is minor context beyond annotations. It does not explain what locking a session actually does (e.g., invalidating a session or logging out a user), but with annotations covering the core behavioral hints, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, with the core purpose stated immediately. The first line repeats the title verbatim, and the operation/tag line is somewhat developer-oriented, but overall it is efficient with no wasted prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single required parameter, full schema coverage, and annotations that convey the safety profile, the description is sufficient to invoke the tool correctly. However, it omits what 'locking' a session means behaviorally and does not disambiguate from the sibling immich_lock_auth_session. These gaps are minor but leave the agent with an incomplete mental model of the tool's effect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the single parameter 'id' already documented as format: uuid. The description says 'by id,' which identifies the parameter but adds no formatting, syntax, or constraint details beyond the schema. Baseline 3 is correct when the schema carries the parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Lock a specific session by id.' The added API path (POST /sessions/{id}/lock) confirms the exact operation. However, it does not explicitly distinguish this from the sibling immich_lock_auth_session, leaving potential ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by saying 'Lock a specific session by id,' but offers no explicit guidance on when to use this tool versus alternatives like immich_lock_auth_session or immich_unlock_auth_session. There are no prerequisites, exclusions, or contextual triggers provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_loginLoginB
Login
Login with username and password and receive a session token.
Immich operation: POST /auth/login · tag: Authentication
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | email (request body) | ||
| password | Yes | password (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the operation as non-readOnly, non-idempotent, non-destructive and open-world, so safety is covered. The description adds one genuinely useful behavioral fact beyond the annotations: the call returns a session token. It says nothing about failed-login behavior, lockout/rate limits, or token lifetime.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short, front-loaded, and the core sentence (credentials in, session token out) appears early. The leading 'Login' line duplicates the title and the trailing 'Immich operation / tag' line is metadata filler, but neither is costly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema present, the description partially compensates by naming the returned session token, but it omits how the token is used downstream and any error or prerequisite context. Adequate but with clear gaps for an authentication entry point in a 200+ tool server.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for both parameters, so the schema carries the semantics and baseline 3 applies. Notably the description says 'username and password' while the schema requires 'email', a small terminology mismatch that could confuse an agent about which identifier to send.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (login) and the outcome (receive a session token), which is more than a restatement of the name. It does not distinguish itself from nearby siblings such as immich_create_session, immich_shared_link_login, or immich_maintenance_login, so an agent cannot tell from the text which login path applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites (does the caller need a server URL, a first-time setup, an unauthenticated context?), and no mention of alternatives among the several login/session siblings. Usage is only implied by the credential-exchange nature of the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_logoutLogoutA
Logout
Logout the current user and invalidate the session token.
Immich operation: POST /auth/logout · tag: Authentication
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=true. The description adds concrete behavioral context beyond that by stating the session token is invalidated, which tells the agent the operational consequence.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded: the effect statement follows the title immediately, and the operation/tag metadata is compact. Minor redundancy from repeating 'Logout' as both title and first word of the sentence, but nothing wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema tool whose annotations already convey the safety profile, the description supplies everything needed to call it correctly: what it does and what happens to the session. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to document. Baseline of 4 applies, and no param semantics are missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('logout') and resource ('current user') plus the resulting effect ('invalidate the session token'). It is clearly distinguishable from generic mutations, though it does not explicitly differentiate itself from close siblings like immich_logout_o_auth or immich_end_session.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use case (logging out the current user) is implied and self-evident, but the description offers no explicit when-to-use guidance or alternatives such as logout_o_auth or end_session. Adequate for a simple, unambiguous tool, but no routing help.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_logout_o_authBackchannel OAuth logoutB
Backchannel OAuth logout
Logout the OAuth account and invalidate the session specified by the sid claim or all sessions if the sid claim is not present.
Immich operation: POST /oauth/backchannel-logout · tag: Authentication
| Name | Required | Description | Default |
|---|---|---|---|
| logout_token | Yes | logout_token (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=false, idempotentHint=false, and openWorldHint=true, so the safety bar is partly covered. The description adds genuinely useful behavior beyond that: the operation invalidates the session named by the sid claim, expanding to ALL sessions when sid is absent — a consequential side effect not visible in the annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and the key scoping rule is front-loaded in the first sentence. The repetition of the title 'Backchannel OAuth logout' as the opening line and the trailing 'Immich operation: POST ... · tag: Authentication' metadata are redundant but cheap.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a security-sensitive, unauthenticated-by-design logout endpoint with no output schema, the description covers the sid/no-sid semantics but says nothing about the logout token's provenance, signature validation requirements, or the response on an invalid token. Adequate but with a notable gap given the auth-critical nature of the endpoint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single logout_token parameter, so baseline is 3. The description adds some meaning — that the token carries an sid claim determining which session is killed — but gives no format, signature, or validation guidance for the token itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource (logout the OAuth account / invalidate the session) and explains the mechanism via the sid claim. It does not, however, distinguish itself from the very similarly named siblings immich_logout, immich_end_session, or immich_delete_session, so an agent cannot route between them from the text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit statement of when to use this versus immich_logout or immich_end_session, no mention that this is the OIDC IdP-initiated backchannel endpoint, and no prerequisites. The scope rule (all sessions when sid is absent) is behavioral, not usage routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_maintenance_loginLog into maintenance modeA
Log into maintenance mode
Login with maintenance token or cookie to receive current information and perform further actions.
Immich operation: POST /admin/maintenance/login · tag: Maintenance (admin)
| Name | Required | Description | Default |
|---|---|---|---|
| token | No | token (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose readOnly=false, idempotent=false, openWorld=true, and destructive=false, so the safety profile is covered. The description adds that authentication can be by maintenance token or cookie and that it unlocks further maintenance actions, but it does not detail session lifetime, admin requirement, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the action, then adds a one-sentence usage note and an endpoint identifier. The repeated title and operation metadata are compact enough not to detract.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter login tool with annotations and no output schema, the description is usable but incomplete: it omits what 'current information' is returned, whether admin privileges are required, and what the login produces for subsequent calls. The sibling set includes set_maintenance_mode, so more routing context would help.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single token parameter is described as 'token (request body)'. The description adds that this is a maintenance token and can alternatively be a cookie, but offers no format or source guidance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action ('Log into maintenance mode') and resource ('maintenance mode'), and the mention of 'maintenance token' distinguishes it from the generic immich_login sibling. An agent can identify it as the admin maintenance authentication endpoint without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It says the login is to 'receive current information and perform further actions', which implies when to use it, but it does not explicitly compare it to immich_login, immich_set_maintenance_mode, or immich_get_maintenance_status. No when-not-to-use or alternative routing is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_memories_statisticsRetrieve memories statisticsBRead-onlyIdempotent
Retrieve memories statistics
Retrieve statistics about memories, such as total count and other relevant metrics.
Immich operation: GET /memories/statistics · tag: Memories
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Memory ID | |
| for | No | Filter by date | |
| page | No | Page number | |
| size | No | Number of memories to return | |
| type | No | Memory type | |
| order | No | Sort order | |
| isSaved | No | Filter by saved status | |
| isTrashed | No | Include trashed memories | |
| isUpcoming | No | Filter by memories that have not been shown yet |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is fully covered without the description. The description adds the underlying operation and tag, but 'other relevant metrics' tells the agent nothing concrete about what is actually returned, which matters for a read-only aggregate tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, with the operation/tag line earning its place. It loses a point only because the first line simply restates the title verbatim before the slightly more informative second sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of describing the return. 'Total count and other relevant metrics' gestures at the shape but is too vague to tell an agent what fields to expect or how the filters (page, size, order) affect the stats response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 9 parameters, and the baseline for this dimension is 3. The description adds no parameter meaning whatsoever — notably it never explains why a statistics endpoint takes id, page, size, order, and isSaved filters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Retrieve memories statistics') and the sibling family is distinct enough (get_memory, search_memories) that an agent can tell this is the metrics endpoint. However, it never contrasts itself with those siblings, so the differentiation relies on the reader's inference rather than explicit framing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance at all. It never says to use this instead of get_memory or search_memories when you only need aggregate counts, nor does it list prerequisites (auth scope, whether the stats are user- or server-scoped). The REST path is the only hint about intent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_merge_peopleMerge peopleA
Merge people
Merge an ordered list of people together into a single person. The final name and birth date are always the first defined value, following the order. Also automatically merges people for other users in the cluster group, skipping people that would result in overriding a previously set name or birth date.
Immich operation: POST /people/merge · tag: People
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | ids (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, idempotentHint=false, openWorldHint=true), and the description adds genuinely non-obvious behavior: that the merge also affects other users in the cluster group and that name/birth-date overrides are skipped. It does not disclose what happens to the non-surviving people records, which is the biggest remaining behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Body is tight and front-loaded: purpose, then ordering rule, then side-effect rule. The leading 'Merge people' line merely restates the title and the trailing 'Immich operation: POST /people/merge · tag: People' is boilerplate, so a small amount of the text does not earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter mutation with no output schema, the description covers purpose, ordering semantics, and cross-user side effects. It is close to complete; only the fate of the merged-away people and any auth/permission requirement are unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% but the schema only labels the array as 'ids (request body)' with uuid items; the description adds the critical ordering contract (first defined name/birth date wins) that an agent cannot infer from the schema. That is real semantic value beyond the structured field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (merge) and resource (people), plus the scope of the operation (an ordered list collapsed into a single person). It does not explicitly distinguish itself from the close siblings immich_merge_person_legacy or immich_update_people, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the description of ordering semantics and the cluster-group auto-merge, but there is no explicit when-to-use guidance, no mention of when to prefer immich_merge_person_legacy or immich_update_people, and no stated preconditions (e.g. ownership or admin requirements).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_merge_person_legacyMerge peopleA
Merge people
Merge a list of people into the person specified in the path parameter.
Immich operation: POST /people/{id}/merge · tag: People
DEPRECATED — prefer the replacement operation if one exists.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| ids | Yes | ids (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, openWorld=true, idempotent=false, destructive=false, so the safety profile is partly covered. The description adds the underlying endpoint (POST /people/{id}/merge) and tag, but does not disclose what happens to the merged source people (deletion/face reassignment) or irreversibility, and arguably the destructive=false annotation understates the operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded: the key merge sentence appears first, followed by endpoint metadata and the deprecation note. The opening line 'Merge people' duplicates the title, which is minor wasted space, but the rest is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, schema-covered merge tool with annotations handling safety, most of what an agent needs is present. The gap is the vague 'if one exists' deprecation pointer that fails to name the concrete replacement, and the absence of any outcome description (what merging does to the source people).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema lacks: it disambiguates that `ids` is the list merged into the path `id`, resolving which parameter is the target versus sources — a semantic detail absent from the bare 'ids (request body)' schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Merge) and resource (people), and crucially clarifies the direction: a list of people is merged INTO the person in the path parameter. However, it does not differentiate itself from the sibling immich_merge_people, referring only abstractly to 'the replacement operation' without naming it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The DEPRECATED note tells the agent to prefer a replacement, which is real usage guidance, but it is vague — it never names immich_merge_people as the preferred sibling. No explicit when-to-use/when-not beyond that single backward-looking sentence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_ping_serverPingCRead-onlyIdempotent
Ping
Pong
Immich operation: GET /server/ping · tag: Server
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds essentially no behavioral context beyond that - it does not say whether auth is required, what the response contains, or how failure manifests.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely short and front-loaded, with no filler prose. The "Ping/Pong" duplication plus the metadata line is minimal, though the content is thin enough that conciseness is not really earning much.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a trivial zero-parameter ping with rich annotations and no output schema, the description is minimally adequate. It is missing the one thing that would help an agent: what the call confirms (server reachability/auth validity) and what the caller should expect back.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. There are no parameter semantics for the description to clarify or obscure.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description consists of "Ping" and "Pong", which restates the name/title rather than explaining the tool. The only added signal is the structured trailing metadata (GET /server/ping), which is generated boilerplate rather than a statement of purpose. An agent can infer a connectivity/health check, but the description itself does not say so.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no mention of alternatives or what a successful vs. failed ping means. The convention of a ping tool makes the intended use inferable, but nothing in the text provides it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_play_asset_videoPlay asset videoBRead-onlyIdempotent
Play asset video
Streams the video file for the specified asset. This endpoint also supports byte range requests.
Immich operation: GET /assets/{id}/video/playback · tag: Assets
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| key | No | ||
| slug | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, open-world behavior. The description adds that byte range requests are supported, which is useful behavioral context beyond annotations, but it does not describe authentication needs, rate limits, or 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, then streaming behavior, then operation metadata. No wasted words, though the operation metadata line is partly redundant with the tool name and annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read endpoint with annotations covering safety, the description covers purpose and byte-range support. However, it leaves the 'key' and 'slug' parameters unexplained, and there is no output schema to clarify return values, so an agent has gaps in how to fully invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33% (only the required 'id' has a format note; 'key' and 'slug' are undocumented). The description adds no meaning for any parameter beyond implying the asset is specified, so it fails to compensate for the low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Play'/'Streams') and resource ('video file for the specified asset'), making the action clear. It implicitly distinguishes streaming from downloading via 'Streams' and byte-range support, but does not explicitly name sibling tools like immich_download_asset or immich_view_asset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not-to-use guidance is given. The description implies usage by stating it streams video playback, but it does not contrast this tool with alternatives such as downloading or viewing an asset.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_reassign_facesReassign facesBIdempotent
Reassign faces
Bulk reassign a list of faces to a different person.
Immich operation: PUT /people/{id}/reassign · tag: People
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| data | Yes | data (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds that the operation is bulk and notes the underlying PUT /people/{id}/reassign endpoint, but says nothing about what happens to the previous person assignment or any permission requirements, leaving real behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The body is one efficient sentence, and the endpoint metadata is compact. It does waste the first line restating the title verbatim, which is minor redundancy rather than useful content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a bulk mutation with no output schema, the description covers the core action and the annotations carry the safety flags, but it omits the distinction from immich_reassign_faces_by_id and any statement about the effect on the source person record, leaving meaningful ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both the id and data array (with assetId/personId) are already documented in structured form. The phrase 'list of faces to a different person' loosely maps to data and id but adds no syntax, cardinality limits, or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (reassign) and resource (faces) with the scope modifier 'bulk' and identifies the target ('to a different person'). However, it does not distinguish this from the sibling immich_reassign_faces_by_id, which an agent could easily confuse with this tool, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no prerequisites, and never mentions alternatives or the difference from immich_reassign_faces_by_id. An agent must infer usage entirely from the name and endpoint path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_reassign_faces_by_idRe-assign a face to another personBIdempotent
Re-assign a face to another person
Re-assign the face provided in the body to the person identified by the id in the path parameter.
Immich operation: PUT /faces/{id} · tag: Faces
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| body | Yes | faceDto (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, giving the safety profile. The description adds the input mapping but says nothing about permissions, side effects on the previous person assignment, or failure modes when the face/person does not exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences plus an operation/tag footer; front-loaded and free of padding. The opening line duplicates the title, which is the only mild redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a simple two-parameter mutation with rich annotations, and the nested body is explained. It still omits the bulk alternative and any error/permission behavior, which matters for an open-world, non-read-only operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3), and the description goes one step further by disambiguating two identically named `id` fields: the body carries the face, the path carries the target person. That mapping is genuinely value-adding beyond the terse schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Re-assign a face to another person') and clarifies the argument mapping. It does not explicitly differentiate itself from the sibling immich_reassign_faces (plural/bulk), though the singular phrasing implies single-face scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use, prerequisites, or alternative routing is given. The obvious alternative, immich_reassign_faces, is never named, so an agent must infer single-vs-bulk from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_redirect_o_auth_to_mobileRedirect OAuth to mobileBRead-onlyIdempotent
Redirect OAuth to mobile
Requests to this URL are automatically forwarded to the mobile app, and is used in some cases for OAuth redirecting.
Immich operation: GET /oauth/mobile-redirect · tag: Authentication
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds one genuinely useful behavioral fact beyond the annotations – that the request is automatically forwarded to the mobile app – but says nothing about auth requirements, whether the caller receives a redirect rather than a JSON payload, or any rate/redirect constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded: the one behavioral sentence comes immediately after the title repetition. The trailing 'Immich operation: GET /oauth/mobile-redirect · tag: Authentication' line is boilerplate metadata that adds little, keeping it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only redirect endpoint with full annotation coverage, the description covers the essentials. However, it never tells the calling agent what to expect from an invocation (an HTTP redirect rather than a data response) or what authentication, if any, the endpoint requires, which leaves a real gap for a publicly reachable OAuth route.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the scoring baseline this dimension starts at 4. There are no parameter semantics for the description to elaborate on, and it correctly does not invent any.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource (OAuth redirect to the mobile app) and explains the mechanism: 'Requests to this URL are automatically forwarded to the mobile app.' That is clear enough for an agent to understand what the endpoint does, but it does not distinguish it from the other OAuth siblings (start_o_auth, finish_o_auth, link_o_auth_account), so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Is used in some cases for OAuth redirecting' gives no actionable condition, no when-to-use vs when-not-to-use, and no reference to any alternative OAuth tool. An agent has no way to decide whether this is the right call versus start_o_auth or finish_o_auth.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_remove_asset_editsRemove edits from an existing assetADestructiveIdempotent
Remove edits from an existing asset
Removes all edit actions (crop, rotate, mirror) associated with the specified asset.
Immich operation: DELETE /assets/{id}/edits · tag: Assets
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds value beyond that by specifying exactly what is destroyed — ALL edit actions (crop, rotate, mirror) — which tells the agent the scope of the removal. It omits reversibility and permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Efficient and front-loaded: the operative sentence defining what is removed comes immediately. The first line merely restates the title and the third is provenance metadata (operation/tag), which is mild redundancy but not harmful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter mutation whose annotations already carry the destructive/idempotent profile, the description covers purpose and removal scope adequately. No output schema exists, but a removal endpoint needs little return explanation, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with a single required 'id' (uuid), so the schema fully documents the parameter. The description adds no format or semantic detail beyond what the schema provides, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (remove) and resource (edits), and clarifies what 'edits' means (crop, rotate, mirror) scoped to a single asset. It is clear, though it does not explicitly name the sibling it contrasts with (immich_get_asset_edits / immich_edit_asset), so an agent relies on the name alone for that distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose implies when to use it (undo all edits on an asset), but there is no explicit when-to-use, when-not, or alternative guidance. It does not tell the agent how to remove a single edit vs all edits, nor reference related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_remove_asset_from_albumRemove assets from an albumCDestructiveIdempotent
Remove assets from an album
Remove multiple assets from a specific album by its ID.
Immich operation: DELETE /albums/{id}/assets · tag: Albums
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| ids | Yes | ids (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, so the safety profile is covered. The description adds nothing beyond that: it does not clarify the key behavioral question of whether removed assets are deleted from the library or merely unlinked from the album, nor does it discuss permissions or reversibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first line duplicates the title verbatim, and the second sentence largely restates it; only the trailing 'Immich operation: DELETE /albums/{id}/assets' line carries new information. Short but not fully front-loaded or waste-free.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with no output schema, the description covers the basic mechanics but omits whether assets survive in the library afterward, what happens with invalid IDs, and any auth requirements. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (album id, asset ids array) are documented in the schema. The description only restates that removal targets a specific album by ID and adds no format or constraint detail beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (remove) and resource (assets) with the scope qualifier 'from a specific album by its ID'. An agent can distinguish it from immich_add_assets_to_album or immich_remove_asset_from_stack by name, though the description never explicitly contrasts it with those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance, no prerequisites (e.g. album ownership/permission requirements), and no mention of the obvious alternatives such as immich_remove_user_from_album or immich_delete_assets. The agent must infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_remove_asset_from_stackRemove an asset from a stackBDestructiveIdempotent
Remove an asset from a stack
Remove a specific asset from a stack by providing the stack ID and asset ID.
Immich operation: DELETE /stacks/{id}/assets/{assetId} · tag: Stacks
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| assetId | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=true, so the safety profile is covered. The description adds the REST endpoint mapping, but crucially omits whether the asset itself is deleted or merely unlinked from the stack group, which is the key behavioral ambiguity for this operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The title is restated as the first line and then paraphrased again in the second sentence ('Remove a specific asset from a stack'), which is redundant. It is short and front-loaded, but the duplication means not every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only 2 fully-documented parameters and no output schema, little else is required. However, for a destructive stack operation the description should clarify the effect on the asset itself (unlink vs delete) and any auth/permission needs, which it does not.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both params are documented as uuid format. The description adds only a light mapping ('stack ID' and 'asset ID') that clarifies which parameter is which, which is marginal over the schema's format hints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource (remove an asset from a stack) and even maps it to the underlying REST operation DELETE /stacks/{id}/assets/{assetId}. This distinguishes it from siblings like immich_remove_asset_from_album and immich_delete_stack, though it never explicitly names those alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It says how to call it (provide stack ID and asset ID) but gives no guidance on when to use this versus immich_delete_stack, immich_update_stack, or immich_remove_asset_from_album. No prerequisites or exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_remove_memory_assetsRemove assets from a memoryBDestructiveIdempotent
Remove assets from a memory
Remove a list of asset IDs from a specific memory.
Immich operation: DELETE /memories/{id}/assets · tag: Memories
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| ids | Yes | ids (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered. The description adds that only the memory-asset association is removed (assets are detached, not deleted), which is genuinely useful, but it says nothing about reversibility, bulk limits, or what happens when an ID is not in the memory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, with the operational detail at the end. There is minor redundancy: the title is restated verbatim as the first line and then rephrased in the second sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, no-output-schema mutation the annotations carry much of the burden, and the description is sufficient to call the tool. It nevertheless omits whether the removal is permanent, whether the assets survive elsewhere, and any behavior on unknown IDs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the two parameters (id, ids) are documented there, so the baseline is 3. The description's phrasing ('a list of asset IDs', 'a specific memory') loosely maps to ids and id but adds no format or constraint detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Remove ... asset IDs from a specific memory') and the underlying operation (DELETE /memories/{id}/assets), so the action is unambiguous. It does not, however, distinguish itself from the clearly related sibling immich_add_memory_assets or immich_delete_assets, which is the main gap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus immich_add_memory_assets (the inverse) or immich_delete_assets (which would destroy the asset itself rather than just unlink it from a memory). The agent must infer the correct tool purely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_remove_partnerRemove a partnerBDestructiveIdempotent
Remove a partner
Stop sharing assets with a partner.
Immich operation: DELETE /partners/{id} · tag: Partners
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnly=false, so the safety profile is covered structurally. The description usefully clarifies what the destruction means in domain terms (sharing stops, the partner entity isn't necessarily deleted), but says nothing about permissions, reversibility, or whether assets previously shared remain visible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, with the effect on the second line and the REST mapping last. The title is restated verbatim at the top and the endpoint/tag line is boilerplate, but the whole thing is still tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A single-parameter mutation with no output schema is roughly covered by the annotations plus the effect sentence, but an agent gets no signal about permissions or what a caller should expect afterward. Adequate, not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is a single UUID parameter already documented by the schema, so the baseline of 3 applies. The description adds no syntax or constraint detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Remove) and resource (partner) and adds the effect: 'Stop sharing assets with a partner.' That distinguishes it from immich_update_partner and immich_get_partners without the agent opening a schema, though it never names those siblings directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance, and no alternatives are named. The agent must infer from the effect line that this revokes an existing partner relationship rather than creating or modifying one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_remove_user_from_albumRemove user from albumBDestructiveIdempotent
Remove user from album
Remove a user from an album. Use an ID of "me" to leave a shared album.
Immich operation: DELETE /albums/{id}/user/{userId} · tag: Albums
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Album ID | |
| userId | Yes | Album user ID, or "me" to reference the current user. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=true, so the safety profile is covered. The description adds essentially nothing behavioral beyond repeating the DELETE endpoint; it does not say what the removed user loses (e.g., whether their contributed assets remain in the album) or what permissions are required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, with the core action stated first and the raw operation last. The only waste is the leading line that restates the title verbatim before the actual sentence, a minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter mutation with rich annotations and a 100%-covered schema, the definition is adequate: purpose, endpoints, and the "me" special case are all present. It is still thin on the consequences of removal (what happens to the user's assets in the album) and on permission requirements, which an agent managing an album would want.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both id ("Album ID") and userId ("Album user ID, or 'me'...") are already fully documented. The description's only parameter note — the "me" alias — duplicates the schema, so this is the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb+resource ("Remove a user from an album") and includes the underlying operation (DELETE /albums/{id}/user/{userId}), which distinguishes it cleanly from siblings like immich_add_users_to_album and immich_update_album_user (role change). An agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It offers one concrete usage tip — using an ID of "me" to leave a shared album — which is genuinely helpful, but it never explains when to choose this tool over related ones such as immich_update_album_user (change a member's role) or immich_remove_partner. Usage is implied rather than routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_reset_pin_codeReset pin codeADestructiveIdempotent
Reset pin code
Reset the pin code for the current user by providing the account password
Immich operation: DELETE /auth/pin-code · tag: Authentication
| Name | Required | Description | Default |
|---|---|---|---|
| pinCode | No | pinCode (request body) | |
| password | No | password (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the write/destructive nature is covered. The description adds that the account password is required as an authorization step, which is useful, but does not explain what happens to existing pins or any auth-failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded with the action, then the mechanism. Minor redundancy in repeating 'Reset pin code' from the title, and the appended operation/tag line is boilerplate rather than agent-facing content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter auth mutation with full annotation coverage and no output schema, the description is adequate: it names the target scope, the required credential, and the underlying DELETE endpoint. Only the lack of any prerequisite or failure-mode detail keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the two parameters are documented in the schema. The description only adds context for the password parameter ('account password') and says nothing about the pinCode parameter's role, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Reset the pin code') and scopes it to the current user, with the mechanism (providing the account password). It does not explicitly distinguish itself from the nearby siblings immich_change_pin_code and immich_setup_pin_code, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by 'for the current user'. There is no guidance on when to prefer this over immich_change_pin_code or immich_setup_pin_code, which are the obvious alternatives in the sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_resolve_duplicatesResolve duplicate groupsB
Resolve duplicate groups
Resolve duplicate groups by synchronizing metadata across assets and deleting/trashing duplicates.
Immich operation: POST /duplicates/resolve · tag: Duplicates
| Name | Required | Description | Default |
|---|---|---|---|
| groups | Yes | groups (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write/idempotency profile, and the description adds genuinely new behavior: metadata is synchronized across assets and duplicates are trashed. However, it uses the word 'deleting' while destructiveHint=false, leaving the recoverability of trashed assets unresolved — a real ambiguity 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The body is compact, but the opening line simply restates the title verbatim before the substantive sentence, and the trailing endpoint/tag line is provenance filler. Roughly one of three lines earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter mutation tool with no output schema and annotations that only cover the safety/idempotency flags, the description leaves gaps: permission requirements, whether the operation is reversible, and what a partial failure across multiple groups does. Adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the nested keepAssetIds/trashAssetIds fields are documented in the schema, so baseline 3 applies. The description adds nothing about the groups payload, its structure, or constraints such as minItems.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource ('Resolve duplicate groups') and goes further to state the mechanism: synchronizing metadata across assets and deleting/trashing duplicates. This distinguishes it from read-oriented siblings like immich_get_asset_duplicates, though it never explicitly contrasts with immich_delete_duplicate / immich_delete_duplicates, which sound similar.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisite (e.g. that duplicate groups must first be identified via immich_get_asset_duplicates), and no named alternative. Usage is only implied by the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_restore_assetsRestore assetsA
Restore assets
Restore specific assets from the trash.
Immich operation: POST /trash/restore/assets · tag: Trash
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | ids (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=false and destructiveHint=false, so the safety profile is largely covered. The description adds the useful 'from the trash' context but says nothing about reversibility of the restore, permission requirements, or batching limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Brief and front-loaded, with the core action stated first and the raw endpoint/tag appended as metadata. The opening line repeats the title verbatim, which is a small amount of waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation tool with full schema coverage and no output schema, the description covers what an agent needs to call it. Missing only minor behavioral notes such as whether restoring non-trashed ids errors.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'ids' parameter, so the schema already documents the input. The description adds no meaning beyond what the schema provides, which is the expected baseline here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Restore specific assets from the trash') and the scope word 'specific' implicitly contrasts with the whole-trash sibling immich_restore_trash. It does not name that sibling explicitly, so the distinction must be inferred.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'From the trash' and 'specific assets' imply when the tool applies, but there is no explicit when-to-use guidance or named alternative for restoring an entire trash (immich_restore_trash) versus selected assets. Usage is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_restore_trashRestore trashB
Restore trash
Restore all items in the trash.
Immich operation: POST /trash/restore · tag: Trash
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the mutation/safety profile is covered by structured data. The description adds the useful scope fact that ALL trash items are affected, but says nothing about side effects (e.g. where restored items land) or whether the operation is reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, with the key scope word 'all' appearing immediately. Minor waste: the first line 'Restore trash' restates the title before the more informative sentence, and the API route/tag line is boilerplate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter action with no output schema and annotations covering the safety profile, the description gives enough to call it correctly. It could be stronger by contrasting with immich_restore_assets, but nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema imposes no semantic burden and the description has nothing to compensate for. Baseline 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: 'Restore all items in the trash' tells the agent this is a bulk restore of everything in trash, not a targeted restore. It does not, however, differentiate from the sibling immich_restore_assets, which is the nearest ambiguity an agent faces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance and no alternatives named. An agent must infer from 'all items' that this is the bulk variant versus immich_restore_assets, but the description never says so.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_restore_user_adminRestore a deleted userB
Restore a deleted user
Restore a previously deleted user.
Immich operation: POST /admin/users/{id}/restore · tag: Users (admin)
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true), so the description's main addition is the underlying REST endpoint POST /admin/users/{id}/restore. It does not disclose admin authorization requirements, error behavior for non-deleted users, or reversibility, so it adds only modest context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, but it wastes its first two lines saying the same thing ('Restore a deleted user' / 'Restore a previously deleted user'). The operation/endpoint line is the only additive content, making the redundancy noticeably unearned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter mutation with annotations covering the safety profile and no output schema, the description contains enough for an agent to invoke it correctly. The remaining gaps—admin auth requirement and behavior on non-deleted users—are minor given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single required parameter and 100% schema description coverage (the schema documents 'id' as a uuid), the schema already carries the parameter semantics. The description adds nothing about the id beyond restating the operation, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('restore') and resource ('a deleted user'), which is clear enough to distinguish it from delete_user_admin, create_user_admin, or update_user_admin by name. It does not, however, explicitly call out sibling differentiation or the admin scope that is only hinted at via the tag line.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Restore a previously deleted user' implies applicability (the user must already be soft-deleted) but gives no explicit when-to-use, prerequisites, or named alternatives. An agent gets no guidance on what condition must hold before invoking or how this differs from related restore tools like restore_assets or restore_trash.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_reverse_geocodeReverse geocode coordinatesARead-onlyIdempotent
Reverse geocode coordinates
Retrieve location information (e.g., city, country) for given latitude and longitude coordinates.
Immich operation: GET /map/reverse-geocode · tag: Map
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude (-90 to 90) | |
| lon | Yes | Longitude (-180 to 180) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered. The description adds the underlying endpoint (GET /map/reverse-geocode) and tag, which is mild structural context, but says nothing about caching, rate limits, or which geocoding provider answers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose sentence is front-loaded and clear, and the trailing endpoint/tag line is compact metadata. The opening line merely repeats the title, which is minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with no output schema, the description usefully sketches the return value (city, country) and the endpoint semantics. Nothing essential to invoking it is missing, though provider/auth context would round it out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% — both lat and lon are documented with valid ranges — so the schema carries the parameter burden. The description only restates that it takes latitude/longitude coordinates, adding no format or unit nuance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (retrieve) and resource (location information such as city/country) keyed to lat/lon inputs, so the agent can distinguish it from search_places (name-based lookup) or get_reverse_geocoding_state. It never names those siblings explicitly, so it falls 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage context is implied: you have coordinates and want a human-readable place. There is no explicit when-to-use vs. when-not, no mention of alternatives like search_places, and no prerequisites (auth, provider availability) stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_rotate_api_keyRotate an API keyA
Rotate an API key
Generates a new secret for an API key, immediately invalidating the previous one. The current user must own this API key.
Immich operation: POST /api-keys/{id}/rotate · tag: API keys
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations present the bar is lower, and the description still adds real context: rotation returns a new secret, the old secret is invalidated immediately (non-reversible for anyone still using it), and ownership is enforced. The idempotentHint=false annotation aligns with 'immediately invalidating the previous one', so no contradiction, though the description could be more explicit that callers holding the old secret will break.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short blocks: what it does, the safety-critical consequence, and the underlying Immich route. The invalidation warning is front-loaded and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with no output schema, the description covers effect and authorization well. The main missing piece is what the call returns – an agent rotating a key needs to know the new secret is handed back and only shown once, which the description leaves implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter documented in the schema as a UUID, giving 100% schema coverage, so the schema already carries the semantics. The description adds only the ownership constraint on that id, not format or lookup guidance; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (rotate) and resource (API key) and spells out the effect: a new secret is generated and the previous one is invalidated. That is unambiguous in isolation, but it does not explicitly contrast with nearby siblings such as immich_update_api_key (edit key metadata) or immich_create_api_key (brand-new key), so the agent must infer the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It supplies one concrete precondition – the caller must own the key – which is genuinely useful. However it never states when to prefer rotation over immich_update_api_key or immich_create_api_key, so usage is only implied by the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_run_asset_jobsRun an asset jobC
Run an asset job
Run a specific job on a set of assets.
Immich operation: POST /assets/jobs · tag: Assets
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | name (request body) | |
| assetIds | Yes | assetIds (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=true, so the safety profile is covered structurally. The description adds essentially nothing beyond restating the title and exposing the raw endpoint — it never says the job is queued asynchronously, whether it can be re-run or cancelled, or what the caller receives back.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The text is short and front-loaded, with the core action in the first sentence. The leading repetition of the title ('Run an asset job' followed by 'Run a specific job...') is mild redundancy but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should explain what triggering a job yields (job ID, async processing, polling via the queue tools), and it does not. Annotations cover the mutation profile, but the async lifecycle of a job tool remains undocumented, leaving a real gap for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with only two parameters, one of which carries an enum of job names, so the schema already documents them adequately. The description contributes no additional meaning about what each job name does (e.g., refresh-faces vs transcode-video) or the expected impact on the listed assetIds. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Run a specific job on a set of assets') and names the underlying operation (POST /assets/jobs), so the action is unambiguous. It does not, however, distinguish this from the many other job/queue tools in the sibling list (immich_create_job, immich_run_queue_command_legacy, immich_scan_library), so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus alternatives such as immich_create_job or immich_scan_library, and no mention of prerequisites or side effects. The agent must infer usage entirely from the name and the enum values.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_run_queue_command_legacyRun jobsBIdempotent
Run jobs
Queue all assets for a specific job type. Defaults to only queueing assets that have not yet been processed, but the force command can be used to re-process all assets.
Immich operation: PUT /jobs/{name} · tag: Jobs
DEPRECATED — prefer the replacement operation if one exists.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Queue name | |
| force | No | force (request body) | |
| command | Yes | command (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, openWorldHint=true. The description usefully adds that default execution only queues unprocessed assets while force re-processes everything, but it never explains what the non-'start' commands (pause, resume, empty, clear-failed) actually do — and 'empty' is a queue-destroying action unexplained relative to destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, followed by the default/force nuance and the operation tag; little waste. The trailing DEPRECATED sentence is terse and earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating job tool with no output schema, the description covers the queueing path and the deprecation but omits auth/permission requirements and the behavior of each command mode. Adequate but leaves meaningful gaps, especially around the destructive-sounding 'empty' command.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both enums are fully listed, so the schema carries the load. The description clarifies the meaning of the force body flag, which is genuine added value, but the command enum values remain semantically undefined beyond their labels.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource: queue assets for a specific job type, and the title/operation line tie it to PUT /jobs/{name}. It does not, however, name or distinguish itself from close siblings like immich_run_asset_jobs or immich_create_job, so the agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the default vs force behavior (only unprocessed assets unless force), which is real usage guidance, but it gives no explicit when-to-use/when-not versus alternatives. The DEPRECATED line points toward a replacement but is vague ('if one exists') and names no specific sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_scan_libraryScan a libraryA
Scan a library
Queue a scan for the external library to find and import new assets.
Immich operation: POST /libraries/{id}/scan · tag: Libraries
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description still adds real behavioral value beyond them: the operation is asynchronous ("Queue a scan") rather than immediate, and it has the side effect of importing new assets. It omits how to observe progress or completion, which keeps it from 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is short and front-loaded: the verb+resource line is followed immediately by the effect, then operation metadata. The only waste is the opening line repeating the tool title verbatim, which costs a small amount of duplication.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, no-output-schema trigger, the description covers the essential contract: what is scanned, that it is queued, and that it imports new assets. Annotations cover the mutation/idempotency profile. Missing only follow-up guidance on tracking the queued job, which is a minor gap for this complexity level.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 100% and a single required uuid parameter, the schema already carries the parameter contract, so the baseline is 3. The description adds no additional meaning about what the id refers to (an external library identifier) or what happens if the id is not an external library.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ("Scan a library") and then explains the effect: queue a scan for the external library to find and import new assets. An agent can tell this is a scan/import trigger rather than a metadata read. It does not, however, name or contrast itself with the nearby siblings (get_library, update_library, get_library_statistics), so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the purpose: the mention of "external library" scopes the tool to external libraries, and "find and import new assets" hints at the post-upload rescan scenario. There is no explicit when-to-use, no prerequisites (e.g., admin rights), and no named alternative such as the full library rescan or job-queue endpoints.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_search_asset_filesSearch asset filesCRead-onlyIdempotent
Search asset files
Returns all matching asset files.
Immich operation: GET /asset-files · tag: Asset files
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by type of file | |
| assetId | Yes | Asset ID to filter files by | |
| isEdited | No | The file was generated from an edit | |
| isProgressive | No | The file is a progressively encoded JPEG | |
| isTransparent | No | The file is transparent |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered by structured data. The description adds nothing behavioral beyond restating a read ("Returns all matching asset files") and echoing the underlying GET endpoint, providing no new context about pagination, ordering, or result shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very short, front-loaded with the verb+resource, and contains no filler or repetition of the input schema. It is arguably under-specified rather than bloated, which is a content problem rather than a structure problem.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With five parameters, a required assetId, and no output schema, the description should at least clarify what an "asset file" is (derived renditions such as thumbnail/preview/encoded video) and what a match looks like. It instead offers only a tautological restatement of the name and the raw endpoint, leaving the agent to infer scope entirely from the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each of the five parameters individually documented (including the type enum and the assetId filter), so the baseline of 3 applies. The description contributes no additional parameter meaning beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ("Search asset files") and states the result set is all matching files. However, it never distinguishes itself from close siblings such as immich_get_asset_file, immich_download_asset_file, or immich_delete_asset_file, so an agent cannot tell which of these asset-file operations is the right one from the text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no statement of prerequisites (e.g., that an assetId is required, or that this lists derivative files rather than originals), and no mention of alternatives. The only routing hint is the Immich operation tag, which is metadata rather than usage instruction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_search_assetsSearch assets by metadataC
Search assets by metadata
Search for assets based on various metadata criteria.
Immich operation: POST /search/metadata · tag: Search
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | id (request body) | |
| key | No | ||
| ocr | No | ocr (request body) | |
| city | No | city (request body) | |
| make | No | make (request body) | |
| page | No | page (request body) | |
| size | No | size (request body) | |
| slug | No | ||
| type | No | type (request body) | |
| model | No | model (request body) | |
| order | No | order (request body) | |
| state | No | state (request body) | |
| cursor | No | cursor (request body) | |
| filter | No | filter (request body) | |
| rating | No | rating (request body) | |
| tagIds | No | tagIds (request body) | |
| country | No | country (request body) | |
| orderBy | No | orderBy (request body) | |
| albumIds | No | albumIds (request body) | |
| checksum | No | checksum (request body) | |
| isMotion | No | isMotion (request body) | |
| withExif | No | withExif (request body) | |
| isEncoded | No | isEncoded (request body) | |
| isOffline | No | isOffline (request body) | |
| lensModel | No | lensModel (request body) | |
| libraryId | No | libraryId (request body) | |
| personIds | No | personIds (request body) | |
| isFavorite | No | isFavorite (request body) | |
| takenAfter | No | takenAfter (request body) | |
| visibility | No | visibility (request body) | |
| withPeople | No | withPeople (request body) | |
| description | No | description (request body) | |
| previewPath | No | previewPath (request body) | |
| takenBefore | No | takenBefore (request body) | |
| withDeleted | No | withDeleted (request body) | |
| withStacked | No | withStacked (request body) | |
| createdAfter | No | createdAfter (request body) | |
| isNotInAlbum | No | isNotInAlbum (request body) | |
| originalPath | No | originalPath (request body) | |
| trashedAfter | No | trashedAfter (request body) | |
| updatedAfter | No | updatedAfter (request body) | |
| createdBefore | No | createdBefore (request body) | |
| thumbnailPath | No | thumbnailPath (request body) | |
| trashedBefore | No | trashedBefore (request body) | |
| updatedBefore | No | updatedBefore (request body) | |
| encodedVideoPath | No | encodedVideoPath (request body) | |
| originalFileName | No | originalFileName (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false) do not cover this tool well, and the description adds nothing to compensate — it never explains why a read-like search is not read-only, whether results are paginated via the page/size/cursor params, or what the effective scope is. 'Immich operation: POST /search/metadata' is the only extra detail, essentially repeating structured metadata.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short and front-loaded with the action, but the second line ('Search for assets based on various metadata criteria') merely restates the title and name without adding information. Compact but nearly content-free.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 47-parameter tool with a deeply nested filter schema (eq/ne/in/gt/lt/gte/lte, or-branches, visibility, etc.) and no output schema, this description is far too thin. An agent gets no help understanding the filter DSL, pagination, or result shape for a genuinely complex operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 96%, so the schema already documents nearly every parameter, making 3 the baseline. The description adds nothing about the 47 parameters, including the large nested 'filter' object and its operator semantics, so it neither helps nor hurts.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Search assets by metadata') and reinforces it with 'based on various metadata criteria', so the intent is unambiguous. However, it never distinguishes itself from the many search siblings (immich_search_smart, immich_search_random, immich_search_stacks, immich_search_asset_files), so an agent can't tell which search to pick from the description alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no mention of alternatives. With over a dozen search-related siblings, the definition gives no signal about which conditions select this metadata search versus semantic or random search, leaving the agent to guess.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_search_asset_statisticsSearch asset statisticsC
Search asset statistics
Retrieve statistical data about assets based on search criteria, such as the total matching count.
Immich operation: POST /search/statistics · tag: Search
| Name | Required | Description | Default |
|---|---|---|---|
| ocr | No | ocr (request body) | |
| city | No | city (request body) | |
| make | No | make (request body) | |
| type | No | type (request body) | |
| model | No | model (request body) | |
| state | No | state (request body) | |
| filter | No | filter (request body) | |
| rating | No | rating (request body) | |
| tagIds | No | tagIds (request body) | |
| country | No | country (request body) | |
| albumIds | No | albumIds (request body) | |
| isMotion | No | isMotion (request body) | |
| isEncoded | No | isEncoded (request body) | |
| isOffline | No | isOffline (request body) | |
| lensModel | No | lensModel (request body) | |
| libraryId | No | libraryId (request body) | |
| personIds | No | personIds (request body) | |
| isFavorite | No | isFavorite (request body) | |
| takenAfter | No | takenAfter (request body) | |
| visibility | No | visibility (request body) | |
| description | No | description (request body) | |
| takenBefore | No | takenBefore (request body) | |
| createdAfter | No | createdAfter (request body) | |
| isNotInAlbum | No | isNotInAlbum (request body) | |
| trashedAfter | No | trashedAfter (request body) | |
| updatedAfter | No | updatedAfter (request body) | |
| createdBefore | No | createdBefore (request body) | |
| trashedBefore | No | trashedBefore (request body) | |
| updatedBefore | No | updatedBefore (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states this is a 'Retrieve' operation returning counts, i.e. a pure read, while the annotations declare readOnlyHint=false. That is a direct inconsistency an agent could act on (e.g. treating a harmless statistics query as a mutating call). Aside from the contradiction it adds no auth, rate-limit, or scope context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The body sentence is efficient, but the first line merely repeats the tool title verbatim and the trailing 'Immich operation: POST /search/statistics · tag: Search' is metadata padding. Roughly half the text earns its place, and the useful content is not front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 29-parameter filter tool with no output schema, the description should at least outline what statistics come back; it mentions only 'total matching count'. Combined with the missing sibling differentiation and the annotation mismatch, the definition is not sufficient for confident invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is nominally 100%, but the descriptions are placeholders like 'city (request body)', so the schema does not really explain the 29 fields. The description says nothing about parameters beyond 'search criteria', so it neither compensates nor misleads. Baseline 3 for high coverage applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Retrieve statistical data about assets') and clarifies the output is a count ('total matching count'). However, it never differentiates itself from near-identical siblings such as immich_get_asset_statistics, immich_get_album_statistics, or immich_search_assets, so an agent cannot tell which statistics tool to pick 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'based on search criteria' hints that this tool is the filterable variant, but there is no explicit when-to-use, when-not-to-use, or named alternative. With so many statistics and search siblings, the absence of routing guidance is a real gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_search_large_assetsSearch large assetsC
Search large assets
Search for assets that are considered large based on specified criteria.
Immich operation: POST /search/large-assets · tag: Search
DEPRECATED — prefer the replacement operation if one exists.
| Name | Required | Description | Default |
|---|---|---|---|
| ocr | No | Filter by OCR text content | |
| city | No | Filter by city name | |
| make | No | Filter by camera make | |
| size | No | Number of results to return | |
| type | No | Asset type | |
| model | No | Filter by camera model | |
| state | No | Filter by state/province name | |
| rating | No | Filter by rating [1-5], or null for unrated | |
| tagIds | No | Filter by tag IDs | |
| country | No | Filter by country name | |
| albumIds | No | Filter by album IDs | |
| isMotion | No | Filter by motion photo status | |
| withExif | No | Include EXIF data in response | |
| isEncoded | No | Filter by encoded status | |
| isOffline | No | Filter by offline status | |
| lensModel | No | Filter by lens model | |
| libraryId | No | Library ID to filter by | |
| personIds | No | Filter by person IDs | |
| isFavorite | No | Filter by favorite status | |
| takenAfter | No | Filter by taken date (after) | |
| visibility | No | Asset visibility | |
| minFileSize | No | Minimum file size in bytes | |
| takenBefore | No | Filter by taken date (before) | |
| withDeleted | No | Include deleted assets | |
| createdAfter | No | Filter by creation date (after) | |
| isNotInAlbum | No | Filter assets not in any album | |
| trashedAfter | No | Filter by trash date (after) | |
| updatedAfter | No | Filter by update date (after) | |
| createdBefore | No | Filter by creation date (before) | |
| trashedBefore | No | Filter by trash date (before) | |
| updatedBefore | No | Filter by update date (before) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are present (readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false), which covers the safety profile, but the description adds essentially nothing behavioral: no pagination/result-count semantics beyond the default size, no statement of what threshold defines "large," and no details on the deprecation (since when, what to migrate to).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The text is short and the operation line and deprecation banner are boilerplate, but the deprecation sentence ("prefer the replacement operation if one exists") consumes space without conveying actionable information, while the one genuinely load-bearing question — the size threshold — is omitted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 31-parameter, zero-required search endpoint with no output schema and a deprecation flag, the description is far too thin: it neither explains the "large" criterion, nor names a replacement endpoint, nor hints at result ordering or caps. An agent would have to guess both the semantics and the migration path.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across all 31 parameters, so the schema already documents every field and the baseline of 3 applies. The description contributes no additional meaning about any parameter — notably it never explains minFileSize, the parameter that actually implements the "large" concept.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a verb and resource ("Search for assets") but the qualifier is circular: assets "considered large based on specified criteria" never says what makes an asset large (a byte threshold, a preset, the minFileSize param). It also does not distinguish this from sibling immich_search_assets, so an agent cannot tell the two apart from the text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance relative to immich_search_assets or the other search_* siblings. The deprecation warning says only "prefer the replacement operation if one exists" — it never names the replacement, so it cannot actually route the agent anywhere.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_search_memoriesRetrieve memoriesBRead-onlyIdempotent
Retrieve memories
Retrieve a list of memories. Memories are sorted descending by creation date by default, although they can also be sorted in ascending order, or randomly.
Immich operation: GET /memories · tag: Memories
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Memory ID | |
| for | No | Filter by date | |
| page | No | Page number | |
| size | No | Number of memories to return | |
| type | No | Memory type | |
| order | No | Sort order | |
| isSaved | No | Filter by saved status | |
| isTrashed | No | Include trashed memories | |
| isUpcoming | No | Filter by memories that have not been shown yet |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds one genuinely useful behavioral fact beyond the annotations: the default descending-by-creation-date sort and the alternative asc/random orders. It says nothing about pagination limits, permissions, or what a memory object contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded with the core purpose first, then the sorting nuance. Slightly wasteful in that 'Retrieve memories' duplicates the title verbatim before the real sentence, but overall the text is tight and every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 9 optional parameters and no output schema, the description is adequate but thin: it never explains the interactive filters (isSaved, isTrashed, isUpcoming, 'for' date filtering) that an agent would need to choose arguments for a 'memories' query, and gives no sense of the returned shape or pagination envelope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all nine parameters are already documented in the schema (id, for, page, size, type, order, isSaved, isTrashed, isUpcoming). The description only adds the default value/semantics for 'order', which is minor value on top of a fully documented schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Retrieve a list of memories') and pins the underlying operation (GET /memories), which implicitly distinguishes it from the singular immich_get_memory. However, it never names or contrasts against any sibling explicitly, so the agent must infer the boundary between listing and fetching a single memory.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance is given. Nothing tells the agent when to prefer this over immich_get_memory, immich_search_random, immich_memories_statistics, or immich_create_memory; it only describes what is returned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_search_personSearch peopleCRead-onlyIdempotent
Search people
Search for people by name.
Immich operation: GET /search/person · tag: Search
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Person name to search for | |
| withHidden | No | Include hidden people |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds only the raw endpoint string (GET /search/person), with no information on matching behavior, result limits, pagination, or auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, with no padding sentences. It loses a point only because the opening line duplicates the title verbatim before the slightly more informative second line.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only search with full annotation coverage and no output schema, the description is minimally viable. It omits any note on result shape, match type, or how it relates to the other people-lookup tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both 'name' and 'withHidden' documented inline, so the baseline is 3. The description's 'by name' phrase maps to one parameter but adds no syntax, format, or matching semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description says 'Search people' / 'Search for people by name', which names a verb (search) and resource (people) plus a filter field. But the first line simply restates the title, and nothing distinguishes it from siblings like immich_get_all_people, immich_get_person, or immich_search_users.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of prerequisites, and no routing to alternatives. An agent cannot tell from this text whether to use this versus immich_get_all_people for listing or immich_get_person for lookup by ID.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_search_placesSearch placesCRead-onlyIdempotent
Search places
Search for places by name.
Immich operation: GET /search/places · tag: Search
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Place name to search for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds nothing beyond them — no note on result size, matching semantics (prefix/substring/fuzzy), or empty-result behavior — just a restatement of the HTTP route.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, but the first line duplicates the title verbatim and the endpoint/tag footer is metadata padding rather than useful guidance. No sentence is harmful, but little of the text earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should convey what a place search returns (place names, ids, coordinates?) and how it relates to reverse geocoding. Neither is present, leaving an agent unable to predict the response shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single self-documenting string parameter ('Place name to search for'), so the baseline of 3 applies. The description adds no matching or formatting detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a verb+resource (search places) and the parameter domain (name), which is enough to identify the operation. However, it does not distinguish this from other location-oriented siblings such as immich_reverse_geocode, immich_get_assets_by_city, or immich_search_assets, and simply restates the title in the first line.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No indication of when to use this tool versus the many other search or geo siblings. There is no mention of prerequisites, result scope, or alternatives, so the agent must infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_search_plugin_methodsRetrieve plugin methodsCRead-onlyIdempotent
Retrieve plugin methods
Retrieve a list of plugin methods
Immich operation: GET /plugins/methods · tag: Plugins
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Plugin method ID | |
| name | No | ||
| type | No | Workflow types | |
| title | No | ||
| enabled | No | Whether the plugin method is enabled | |
| trigger | No | Workflow trigger | |
| pluginName | No | Plugin name | |
| description | No | ||
| pluginVersion | No | Plugin version |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so safety is covered. The description adds only the underlying REST endpoint (GET /plugins/methods), which is marginally useful but repeats what annotations imply; it says nothing about filtering, result size, or auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The title is repeated verbatim as the first line and the description restates it again ('Retrieve a list of plugin methods'), so three lines convey one idea. The endpoint/tag line is useful but the duplication wastes space without adding information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with nine parameters, no output schema, and no required fields, the description should clarify what the filters do and what the result set looks like. Instead it is essentially a name restatement plus an endpoint, leaving the agent under-equipped to invoke it meaningfully.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Nine optional parameters with only 67% schema description coverage, and the description adds no parameter meaning at all. It neither explains the filter semantics (id, name, trigger, pluginName) nor how they combine, leaving a significant gap the schema alone does not close.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb+resource ('Retrieve a list of plugin methods') so the agent knows it returns plugin methods. However, it does not differentiate itself from close siblings like immich_search_plugins, immich_search_plugin_templates, or immich_get_plugin, which an agent must disambiguate among. The three lines largely restate the same idea.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No indication of when to use this tool versus the many sibling search/get plugin tools, and no prerequisites or context. Usage is left entirely to inference from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_search_pluginsList all pluginsBRead-onlyIdempotent
List all plugins
Retrieve a list of plugins available to the authenticated user.
Immich operation: GET /plugins · tag: Plugins
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Plugin ID | |
| name | No | ||
| title | No | ||
| enabled | No | Whether the plugin is enabled | |
| version | No | ||
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is fully covered by structured data. The description adds only the auth-scoping note ('available to the authenticated user') and says nothing about pagination or result size, which is the kind of context that would add real value here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, with the purpose in the first line. There is mild redundancy between the title, the first line, and the second sentence, but no wasted filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and only 33% schema description coverage on 6 parameters, the description should clarify the role of those parameters and the shape of the returned list. Annotations cover the safety profile, so the gap is moderate rather than severe, but the definition is not fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33% across 6 parameters (id, name, title, enabled, version, description), and the description mentions none of them. It never explains whether these are filter criteria narrowing the plugin list or something else, so the description fails to compensate for the low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List all plugins' / 'Retrieve a list of plugins available to the authenticated user'), which is clear enough to distinguish it from the singular sibling immich_get_plugin. However, it does not explicitly differentiate itself from immich_search_plugin_methods or immich_search_plugin_templates, which an agent could plausibly confuse with a plugin listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance, no conditions, and no named alternatives. The phrase 'available to the authenticated user' hints at scope but the agent is left to infer that this is the list-all counterpart to immich_get_plugin.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_search_plugin_templatesRetrieve workflow templatesBRead-onlyIdempotent
Retrieve workflow templates
Retrieve workflow templates provided by installed plugins
Immich operation: GET /plugins/templates · tag: Plugins
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered. The description adds that results depend on installed plugins (consistent with openWorldHint), but says nothing about return format or whether an empty result means no plugins are installed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, with the scoping detail ('provided by installed plugins') up front. The first line merely restates the title and the trailing 'Immich operation: GET /plugins/templates' is API metadata, so there is minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 the definition is largely adequate, and annotations cover the safety profile. With no output schema, however, the description never indicates what a template contains or what the response shape looks like, leaving that to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics burden; the baseline of 4 applies. The description correctly implies the call is unconditional with no filters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource — 'Retrieve workflow templates provided by installed plugins' — which is clearer than the bare title. It does not, however, differentiate itself from nearby siblings like immich_search_plugins or immich_search_plugin_methods, so an agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of the sibling tools that retrieve plugin data. The 'installed plugins' qualifier hints at scope but never tells the agent when this is the right call versus immich_search_plugins.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_search_randomSearch random assetsB
Search random assets
Retrieve a random selection of assets based on the provided criteria.
Immich operation: POST /search/random · tag: Search
| Name | Required | Description | Default |
|---|---|---|---|
| ocr | No | ocr (request body) | |
| city | No | city (request body) | |
| make | No | make (request body) | |
| size | No | size (request body) | |
| type | No | type (request body) | |
| model | No | model (request body) | |
| state | No | state (request body) | |
| filter | No | filter (request body) | |
| rating | No | rating (request body) | |
| tagIds | No | tagIds (request body) | |
| country | No | country (request body) | |
| albumIds | No | albumIds (request body) | |
| isMotion | No | isMotion (request body) | |
| withExif | No | withExif (request body) | |
| isEncoded | No | isEncoded (request body) | |
| isOffline | No | isOffline (request body) | |
| lensModel | No | lensModel (request body) | |
| libraryId | No | libraryId (request body) | |
| personIds | No | personIds (request body) | |
| isFavorite | No | isFavorite (request body) | |
| takenAfter | No | takenAfter (request body) | |
| visibility | No | visibility (request body) | |
| withPeople | No | withPeople (request body) | |
| takenBefore | No | takenBefore (request body) | |
| withDeleted | No | withDeleted (request body) | |
| withStacked | No | withStacked (request body) | |
| createdAfter | No | createdAfter (request body) | |
| isNotInAlbum | No | isNotInAlbum (request body) | |
| trashedAfter | No | trashedAfter (request body) | |
| updatedAfter | No | updatedAfter (request body) | |
| createdBefore | No | createdBefore (request body) | |
| trashedBefore | No | trashedBefore (request body) | |
| updatedBefore | No | updatedBefore (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations give readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false, which already signals this is a read-like, open-world, non-idempotent operation. The description adds 'random selection' and mentions the underlying Immich operation (POST /search/random), which is useful. However, it does not disclose pagination, whether results are returned in random order, or size/content limits 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded: purpose in the first sentence, supplementary detail in the second, and operational metadata in the third. No wasted words, though the 'Immich operation' line is boilerplate rather than descriptive.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 33-parameter search tool with no output schema, the description is minimal but not incorrect. It tells the agent what the tool does at a high level, but it omits result-shape expectations, randomness semantics, and how it relates to the many other search tools, leaving gaps an agent must resolve by exploring the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 33 parameters (many only as '(request body)', but coverage is complete per the metric). The description does not add syntax or meaning beyond 'based on the provided criteria'. Baseline 3 applies when schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Search random assets') and adds 'Retrieve a random selection of assets based on the provided criteria', which clarifies the operation. It is clear, but it does not differentiate itself from siblings like immich_search_assets or immich_search_smart, leaving the agent to infer the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus immich_search_assets, immich_search_smart, or other search variants. The description only restates the operation; no when/when-not or alternatives are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_search_smartSmart asset searchC
Smart asset search
Perform a smart search for assets by using machine learning vectors to determine relevance.
Immich operation: POST /search/smart · tag: Search
| Name | Required | Description | Default |
|---|---|---|---|
| ocr | No | ocr (request body) | |
| city | No | city (request body) | |
| make | No | make (request body) | |
| page | No | page (request body) | |
| size | No | size (request body) | |
| type | No | type (request body) | |
| model | No | model (request body) | |
| query | No | query (request body) | |
| state | No | state (request body) | |
| filter | No | filter (request body) | |
| rating | No | rating (request body) | |
| tagIds | No | tagIds (request body) | |
| country | No | country (request body) | |
| albumIds | No | albumIds (request body) | |
| isMotion | No | isMotion (request body) | |
| language | No | language (request body) | |
| withExif | No | withExif (request body) | |
| isEncoded | No | isEncoded (request body) | |
| isOffline | No | isOffline (request body) | |
| lensModel | No | lensModel (request body) | |
| libraryId | No | libraryId (request body) | |
| personIds | No | personIds (request body) | |
| isFavorite | No | isFavorite (request body) | |
| takenAfter | No | takenAfter (request body) | |
| visibility | No | visibility (request body) | |
| takenBefore | No | takenBefore (request body) | |
| withDeleted | No | withDeleted (request body) | |
| createdAfter | No | createdAfter (request body) | |
| isNotInAlbum | No | isNotInAlbum (request body) | |
| queryAssetId | No | queryAssetId (request body) | |
| trashedAfter | No | trashedAfter (request body) | |
| updatedAfter | No | updatedAfter (request body) | |
| createdBefore | No | createdBefore (request body) | |
| trashedBefore | No | trashedBefore (request body) | |
| updatedBefore | No | updatedBefore (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations give a profile (openWorldHint=true, idempotentHint=false, destructiveHint=false), but readOnlyHint=false on what is functionally a search is counterintuitive and the description does nothing to explain it. There is no mention of result limits, pagination behavior, auth requirements, or the cost/latency of ML inference.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, but the first line is a verbatim restatement of the title, which is wasted space, and the 'Immich operation: POST /search/smart' line is implementation detail of marginal value to an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 35-parameter tool with deeply nested filter objects and no output schema, the description is far too thin: it says nothing about the query field, filter semantics, defaults (size=100), or pagination. The complexity of the input demands substantially more guidance than is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Nominal coverage is 100%, but every schema description is boilerplate ('query (request body)', 'city (request body)') carrying zero semantics. With 35 parameters including the crucial query, filter, and pagination fields, the description explains none of them — an agent gets no help on what to supply.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) and resource (assets) and adds the distinguishing mechanism: ML vector relevance rather than keyword matching. It does not, however, name or contrast itself with the obvious sibling immich_search_assets, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'using machine learning vectors to determine relevance' implies when this is appropriate (semantic/natural-language queries) versus a plain search, but it never states that condition explicitly or points to immich_search_assets as the alternative. Usage is inferable, not directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_search_stacksRetrieve stacksCRead-onlyIdempotent
Retrieve stacks
Retrieve a list of stacks.
Immich operation: GET /stacks · tag: Stacks
| Name | Required | Description | Default |
|---|---|---|---|
| primaryAssetId | No | Filter by primary asset ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description adds only the HTTP method/path and tag, with no additional behavioral context such as auth needs, pagination, ordering, or rate limits. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the purpose, but the first two lines are redundant ('Retrieve stacks' and 'Retrieve a list of stacks'). The third line is operational metadata, so overall it is concise but not maximally efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with one optional filter, no output schema, and complete annotations, the description covers the essential purpose. It still omits return shape, pagination, and ordering details, leaving some gaps for an agent that needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the single optional parameter 'primaryAssetId' is fully documented in the schema. The description adds no further meaning, but the baseline is 3 when schema coverage does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retrieve a list of stacks') plus the underlying operation 'GET /stacks', so the basic purpose is clear. However, it does not distinguish this list/retrieval tool from siblings such as immich_get_stack (single stack) or other search/list tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives, nor any exclusions or prerequisites. The optional primaryAssetId filter is only documented in the schema, not in the description, so the agent gets no usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_search_usersGet all usersBRead-onlyIdempotent
Get all users
Retrieve a list of all users on the server.
Immich operation: GET /users · tag: Users
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the meaningful scope detail that it returns ALL users rather than a filtered subset, but says nothing about pagination, admin-only access, or result size for what is an openWorld read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first line merely repeats the title and the second sentence restates the first ('Get all users' / 'Retrieve a list of all users'), which is redundant. Only the trailing 'Immich operation: GET /users' line adds new information, so the definition carries waste for its short length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool whose annotations cover the safety profile, the core need is met. Still, with no output schema the description could indicate the shape of the returned user list or any admin restriction, and it omits both.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to clarify beyond the schema. Baseline 4 applies for a no-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Retrieve a list of all users on the server'), making the operation unambiguous. However, it does not differentiate this tool from close siblings such as immich_search_users_admin, immich_get_user, or immich_get_my_user, and the name's 'search' framing is at odds with the parameterless 'get all' behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus immich_search_users_admin (which presumably filters) or immich_get_my_user. No prerequisites, permission requirements, or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_search_users_adminSearch usersCRead-onlyIdempotent
Search users
Search for users.
Immich operation: GET /admin/users · tag: Users (admin)
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | User ID filter | |
| withDeleted | No | Include deleted users |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description's only additional signal is the endpoint 'GET /admin/users · tag: Users (admin)', which hints that admin authorization is required, but it says nothing about pagination, filtering behavior, or result size.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, but the second line ('Search for users.') is redundant with the first and earns no place. The endpoint line is the only informative content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read tool with no output schema, the description should at least clarify how it differs from immich_search_users and what the admin scope means. Instead it repeats the title and provides an endpoint string, leaving the agent unable to choose between the admin and non-admin search variants.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with only two optional filters (id, withDeleted) fully documented in the schema. The description adds no parameter meaning at all, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The body text is a pure restatement of the name and title: "Search users" followed by "Search for users." The only added content is the HTTP endpoint string, which is metadata rather than a statement of purpose, and there is no differentiation from the sibling immich_search_users (non-admin variant).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this admin search versus the plain immich_search_users sibling, nor any prerequisites such as required admin privileges. The agent is left to infer usage entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_search_workflowsList all workflowsBRead-onlyIdempotent
List all workflows
Retrieve a list of workflows available to the authenticated user.
Immich operation: GET /workflows · tag: Workflows
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Workflow ID | |
| name | No | Workflow name | |
| enabled | No | Workflow enabled | |
| logging | No | Workflow logs run results | |
| trigger | No | Workflow trigger type | |
| description | No | Workflow description |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds that results are scoped to the authenticated user, which is useful behavioral context, but it says nothing about return format, pagination, or whether the filter params narrow results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, leading with the action. The second sentence largely restates the first plus the endpoint metadata, adding little, but the overall text is efficient with no rambling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 an already-annotated safety profile this is minimally adequate. With no output schema, the description could describe the returned workflow shape or the effect of the filter parameters, and it does neither.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all six optional filter fields (id, name, enabled, logging, trigger, description) documented in the schema. The description adds nothing about how these filters behave, so the baseline 3 applies; there is a mild tension in that the tool is framed as 'list all' while exposing filters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb+resource ('List all workflows') and reiterates it as retrieving workflows for the authenticated user, so the core purpose is unambiguous. It distinguishes itself implicitly from immich_get_workflow (single retrieval), but never explicitly differentiates from the get/create/delete/update workflow siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this versus alternatives such as immich_get_workflow or immich_get_workflow_triggers. The only contextual hint is 'available to the authenticated user', which implies auth scoping but not usage conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_send_sync_ackAcknowledge changesB
Acknowledge changes
Send a list of synchronization acknowledgements to confirm that the latest changes have been received.
Immich operation: POST /sync/ack · tag: Sync
| Name | Required | Description | Default |
|---|---|---|---|
| acks | Yes | acks (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so an agent knows this is a non-destructive write that is not idempotent. The description adds the endpoint (POST /sync/ack) and Sync tag, but says nothing about what acknowledgement does server-side, permission requirements, or how the 1000-item cap behaves — modest added value over the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, with the operative sentence before the API metadata. Minor waste from repeating the title 'Acknowledge changes' and the raw endpoint/tag line, but nothing is confusing or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and a single simple parameter, this is nearly adequate. Still missing is any statement of when the acknowledgement must be sent, what happens if acks are omitted or malformed, and how it relates to the other sync endpoints, which the description could carry at low cost.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter exists and the schema is nominally 100% covered, but that coverage is the near-useless label 'acks (request body)'. The description does clarify that the array items are sync acknowledgements confirming receipt, which is more than the schema says, yet it never explains what the strings represent (sync IDs, entity IDs) or their expected format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: sending a list of synchronization acknowledgements to confirm receipt of the latest changes. Clear what it does, but it never names or contrasts the closely related siblings immich_get_sync_ack and immich_delete_sync_ack, so an agent must infer the routing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'to confirm that the latest changes have been received' implies this is the client-side acknowledgement step of the sync protocol, which is usable context. However, there is no explicit when-to-use, when-not-to-use, or pointer to alternative sync tools such as immich_get_sync_stream.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_send_test_email_adminSend test emailA
Send test email
Send a test email using the provided SMTP configuration.
Immich operation: POST /admin/notifications/test-email · tag: Notifications (admin)
| Name | Required | Description | Default |
|---|---|---|---|
| from | Yes | from (request body) | |
| enabled | Yes | enabled (request body) | |
| replyTo | Yes | replyTo (request body) | |
| transport | Yes | transport (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the key traits (readOnlyHint=false, openWorldHint=true, idempotentHint=false), so the agent knows this sends an outward-facing side effect. The description adds that it uses the supplied SMTP config but says nothing about admin authorization needs, delivery failures, or rate limits, so it only modestly extends the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and kept to a few short lines. The opening line duplicates the title and the endpoint/tag line is boilerplate, but there is no wasted exposition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple admin test-email tool with full schema coverage and annotations that carry the safety profile, the description is adequate. No output schema exists but the return value (a test result) is straightforward enough that its absence is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including the nested transport object, so the schema carries full parameter meaning. The description only references "SMTP configuration" generically, adding no syntax or field-level detail beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Send test email") and clarifies it uses the provided SMTP configuration, with the underlying endpoint noted. It is clear and unambiguous, though it largely restates the title and has no close sibling to distinguish from.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied — a config-testing tool that takes SMTP settings and fires a test message — but there is no explicit when-to-use guidance, prerequisites, or alternatives named. An agent can infer intent but gets no routing help.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_set_maintenance_modeSet maintenance modeC
Set maintenance mode
Put Immich into or take it out of maintenance mode
Immich operation: POST /admin/maintenance · tag: Maintenance (admin)
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | action (request body) | |
| restoreBackupFilename | No | restoreBackupFilename (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=false, so the safety profile is partly covered. But the description adds nothing beyond the name: it never says that starting maintenance blocks normal user access, that the restore actions are irreversible in effect, or that restoreBackupFilename is required for those actions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and short, with the effect stated in the first line. The endpoint/tag metadata line is somewhat boilerplate but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an admin mutation with four enum actions, one of which triggers a database restore requiring a filename, the description is too thin. With no output schema and no annotation detail on impact, the agent lacks the context needed to choose an action safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters and the enum values. The description adds no extra meaning about action semantics or when restoreBackupFilename matters, so this sits at the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb and resource: 'Put Immich into or take it out of maintenance mode,' with the underlying endpoint POST /admin/maintenance. An agent can distinguish it from read-side siblings like immich_get_maintenance_status, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Maintenance (admin)' tag hints at an admin-only context, but the description gives no when-to-use guidance, no prerequisites, and no mention of how it relates to immich_start_database_restore_flow, which overlaps heavily with the 'select_database_restore'/'restore_database' enum actions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_set_server_licenseSet server product keyBIdempotent
Set server product key
Validate and set the server product key if successful.
Immich operation: PUT /server/license · tag: Server
| Name | Required | Description | Default |
|---|---|---|---|
| licenseKey | Yes | licenseKey (request body) | |
| activationKey | Yes | activationKey (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered structurally. The description adds one useful behavioral detail - validation happens before the write and the write only occurs on success - but omits permission requirements and what happens on a failed validation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded: the action, then the validate-then-set behavior, then the API mapping. Slightly redundant in restating the title, but no wasted sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter mutation with annotations covering the safety profile and no output schema, the description is minimally adequate. It still leaves open the admin/permission prerequisite and any routing cue versus immich_set_user_license, both of which an agent could need.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is nominally 100%, but the parameter descriptions are placeholders ('licenseKey (request body)'), so the schema adds no real meaning. The description likewise never explains the distinction between activationKey and licenseKey, which is the one piece of semantics an agent would actually need.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Set server product key') and the underlying operation (PUT /server/license), which is clear. However it does not distinguish itself from close siblings such as immich_set_user_license or immich_delete_server_license, so an agent must infer the difference from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of prerequisites (admin rights, where the activation/license keys come from), and no reference to alternative tools. The only context given is the implied 'validate first, set only if successful' behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_setup_pin_codeSetup pin codeB
Setup pin code
Setup a new pin code for the current user.
Immich operation: POST /auth/pin-code · tag: Authentication
| Name | Required | Description | Default |
|---|---|---|---|
| pinCode | Yes | pinCode (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-idempotent, non-destructive operation in an open world, so the safety profile is covered. The description adds only the 'current user' scope and the underlying endpoint (POST /auth/pin-code); it does not say whether an existing PIN is overwritten, what permissions are needed, or whether the call fails if a PIN already exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The substantive sentence is front-loaded and short, though the leading 'Setup pin code' line merely repeats the title, which is mild waste in an otherwise efficient definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with no output schema, the description covers the essentials but omits the two things an agent would most want: the PIN format/constraints and how this differs from the change/reset siblings. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the schema's own parameter description is content-free ('pinCode (request body)') and the tool description adds nothing about format, length, or character constraints for the PIN.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Setup a new pin code for the current user'), which tells an agent exactly what the tool does and scopes it to the authenticated user. It does not, however, differentiate itself from the sibling tools immich_change_pin_code and immich_reset_pin_code, which a reader must infer from naming alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus change_pin_code or reset_pin_code, no prerequisites (e.g., whether an existing PIN must not be set), and no mention of required authentication. The 'current user' scope is the only contextual hint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_set_user_licenseSet user product keyBIdempotent
Set user product key
Register a product key for the current user.
Immich operation: PUT /users/me/license · tag: Users
| Name | Required | Description | Default |
|---|---|---|---|
| licenseKey | Yes | licenseKey (request body) | |
| activationKey | Yes | activationKey (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose readOnlyHint=false, idempotentHint=true, and openWorldHint=true, giving the agent the safety profile. The description adds the endpoint/tag context but doesn't explain what happens on invalid keys, license validation behavior, or overwrite semantics. Given annotation coverage, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the operative verb and resource, but the first line repeats the title verbatim, then a near-duplicate restatement, then endpoint metadata. Some redundancy that doesn't earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, so the description needn't explain returns. But for a mutation tool with two opaque required parameters, it leaves gaps around effects, validation, and success/failure behavior that a fuller description would fill.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% but the schema descriptions are placeholder-style ('licenseKey (request body)'), so the schema itself adds little real meaning. The description doesn't elaborate on the format or distinction between licenseKey and activationKey. Baseline 3 given high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Register a product key for the current user') and the underlying endpoint (PUT /users/me/license). It's distinguishable from siblings like set_server_license or delete_user_license, though the description doesn't explicitly differentiate itself from them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance or exclusions. It doesn't clarify when a user should use this vs immich_set_server_license, or that this targets only the current authenticated user rather than arbitrary users. Usage is only implied by the endpoint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_set_user_onboardingUpdate user onboardingBIdempotent
Update user onboarding
Update the onboarding status of the current user.
Immich operation: PUT /users/me/onboarding · tag: Users
| Name | Required | Description | Default |
|---|---|---|---|
| isOnboarded | Yes | isOnboarded (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the safety and repeat-call profile is covered structurally. The description adds the concrete endpoint (PUT /users/me/onboarding) and confirms the current-user scope, but says nothing about who may call it beyond authentication, what state changes when the flag flips, or any 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short lines with the action front-loaded and no filler. The opening line duplicates the title verbatim, which is mildly redundant, but nothing else wastes space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with annotations and no output schema, the description plus the REST endpoint reference are roughly sufficient to invoke it. It is incomplete on the return behavior and the permissions needed to change another account's state, which are the details an agent could still get wrong.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter and schema description coverage is 100%, so the schema already carries the parameter burden and a baseline of 3 applies. The description adds no meaning beyond the parameter name — it never explains that isOnboarded=true marks onboarding complete or what false implies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource (update onboarding status) and scopes it to the 'current user', which implicitly separates it from the sibling admin-oriented immich_update_admin_onboarding. It stops short of explicitly naming that sibling, so it's clear but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: it targets the current user's onboarding, so the agent can infer it applies to 'me' rather than another user. There is no explicit when-to-use guidance, no mention of the read (immich_get_user_onboarding) or clear (immich_delete_user_onboarding) counterparts, and no stated prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_sign_up_adminRegister adminB
Register admin
Create the first admin user in the system.
Immich operation: POST /auth/admin-sign-up · tag: Authentication
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | name (request body) | |
| Yes | email (request body) | ||
| password | Yes | password (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (not read-only, not idempotent, not destructive). The description adds the meaningful context that this bootstraps the initial admin, but omits key behavior: whether authentication is required for this endpoint, and what happens if an admin already exists. With annotations carrying safety, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, with the operative sentence 'Create the first admin user' appearing immediately. The first line merely repeats the title field, which is minor redundancy, and the trailing operation/tag line is boilerplate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a bootstrap endpoint the agent still needs to know whether it requires auth and whether it errors when an admin already exists; neither is stated. Annotations cover the safety profile and no output schema exists, so the remaining gap is moderate rather than severe.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is nominally 100%, but the schema descriptions are placeholders like 'name (request body)' that add no real meaning. The description adds nothing about parameter constraints (e.g. password requirements). Baseline 3 applies since the schema nominally documents all three params.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource and adds the discriminating scope 'the first admin user in the system', which separates it from the sibling immich_create_user_admin. It does not explicitly name that sibling, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'first admin user' implies a one-time bootstrap/setup context, but the description never states when to use this versus immich_create_user_admin, nor any precondition (e.g. no admin exists yet). Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_start_database_restore_flowStart database backup restore flowA
Start database backup restore flow
Put Immich into maintenance mode to restore a backup (Immich must not be configured)
Immich operation: POST /admin/database-backups/start-restore · tag: Database Backups (admin)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-idempotent, open-world operation, so the safety profile is partially covered. The description meaningfully adds that the call flips Immich into maintenance mode (a server-wide state change) and requires an unconfigured instance, which is context not present in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short lines, front-loaded with the action and its side effect, with the endpoint/tag metadata last. The first line restates the title verbatim, a minor redundancy, but overall there is little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter admin action with annotations covering its safety profile and no output schema, the description covers the essential facts: what it does, the maintenance-mode side effect, and the unconfigured-instance prerequisite. It could optionally state the follow-on step (uploading the backup) but nothing critical is missing to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a parameterless tool is 4. Schema coverage is 100% and the description correctly implies nothing about inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description pairs a specific verb ('Start') with a specific resource ('database backup restore flow') and adds the operational effect: Immich is put into maintenance mode to restore a backup. It is clear what the tool does, though it does not explicitly contrast itself with neighboring tools such as immich_upload_database_backup or immich_set_maintenance_mode.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It supplies one real precondition ('Immich must not be configured'), which is genuinely useful usage context. However, it gives no alternatives or sequencing guidance despite a dense sibling set (immich_list_database_backups, immich_upload_database_backup, immich_set_maintenance_mode) that an agent must choose among to complete a restore.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_start_o_authStart OAuthC
Start OAuth
Initiate the OAuth authorization process.
Immich operation: POST /oauth/authorize · tag: Authentication
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | state (request body) | |
| redirectUri | Yes | redirectUri (request body) | |
| codeChallenge | No | codeChallenge (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=false, and destructiveHint=false, covering the safety profile. The description adds only a REST operation tag; it does not explain that this yields an authorization redirect, what the state/codeChallenge parameters are for (PKCE), or how the flow continues.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, with the operation and tag appended compactly. The repeated title 'Start OAuth' as the first line is mild redundancy, but overall there is little wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an OAuth entry-point tool embedded in a large family of auth siblings (finish_o_auth, link_o_auth_account, logout_o_auth), the description omits the flow context an agent needs to sequence calls correctly. With no output schema and only boilerplate parameter docs, the description should carry more, but it does not.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The schema descriptions are boilerplate ('state (request body)'), and the description adds no meaning about what state, redirectUri, or codeChallenge represent — but with the schema nominally documenting the parameters, a 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Initiate the OAuth authorization process,' plus an operation endpoint (POST /oauth/authorize). This clearly identifies the tool's function. However, it does not distinguish itself from the tightly related sibling immich_finish_o_auth, which an agent would need help separating from this 'start' step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of prerequisites, and no reference to the natural follow-up tool immich_finish_o_auth. An agent must infer the flow ordering entirely on its own from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_tag_assetsTag assetsBIdempotent
Tag assets
Add a tag to all the specified assets.
Immich operation: PUT /tags/{id}/assets · tag: Tags
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| ids | Yes | ids (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false, and readOnlyHint=false, so the mutation/safety profile is covered. The description adds only that the tag is applied to 'all the specified assets', which is minimal context beyond the structured fields, and it says nothing about failure modes or partial application.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded with the action, and the endpoint reference is compact. The leading 'Tag assets' line merely restates the title, which is a small amount of redundant text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter mutation with annotations covering the safety profile and no output schema, the description is barely sufficient. It omits any differentiation from untag/bulk-tag siblings and any note on partial success, leaving modest completeness gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The schema fields themselves are terse ('format: uuid', 'ids (request body)'); the description implicitly clarifies that 'id' is the tag and 'ids' are the target assets, but it never names or maps the parameters explicitly, so value-add is marginal.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Add a tag to all the specified assets') and identifies the underlying operation (PUT /tags/{id}/assets), so an agent immediately knows it applies one tag to many assets. It does not distinguish itself from the sibling immich_untag_assets (the inverse) or immich_bulk_tag_assets (plural/bulk variant), which is the main gap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus alternatives. With immich_untag_assets and immich_bulk_tag_assets as siblings, the description should say when this one-tag-to-many-assets endpoint is preferred, but it offers nothing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_unlink_all_o_auth_accounts_adminUnlink all OAuth accountsB
Unlink all OAuth accounts
Unlinks all OAuth accounts associated with user accounts in the system.
Immich operation: POST /admin/auth/unlink-all · tag: Authentication (admin)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false). The description adds useful targeting detail ('associated with user accounts in the system'), clarifying what gets affected, but does not disclose reversibility, user impact, or confirmation requirements beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, with the operation line providing endpoint and tag context. There is minor redundancy between the title line and the sentence 'Unlinks all OAuth accounts associated with user accounts in the system', but overall it is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter bulk admin mutation, the description covers the operation, scope, endpoint, and tag. It omits operational context such as reversibility, consequences for affected users, or whether any users are skipped, which would help an agent understand the impact.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and schema description coverage is 100%, so the baseline of 4 applies. The description adds no parameter information, but none is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Unlink'), resource ('OAuth accounts'), and scope ('all ... in the system'), which distinguishes it implicitly from the singular sibling immich_unlink_o_auth_account. However, it does not explicitly name the sibling or contrast the two operations, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no when-to-use guidance, no conditions for selecting this tool over alternatives like immich_unlink_o_auth_account, and no prerequisites beyond the 'admin' tag. The context is implied only by the operation endpoint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_unlink_o_auth_accountUnlink OAuth accountA
Unlink OAuth account
Unlink the OAuth account from the authenticated user.
Immich operation: POST /oauth/unlink · tag: Authentication
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=true, so the safety profile is carried structurally. The description adds the endpoint (POST /oauth/unlink) and the fact that the target is the current user rather than an arbitrary account, but says nothing about the effect on the user's ability to log in afterward or whether re-linking is required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, with the action stated first. The only waste is the redundant restatement of the title as the opening line before the slightly expanded sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter authentication operation with no output schema and full annotation coverage, the description supplies what an agent needs: the action, the scope (authenticated user), and the underlying operation. Minor gaps remain around post-unlink consequences.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and the schema is empty with 100% coverage, so there is nothing for the description to disambiguate. Baseline 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (unlink) and resource (OAuth account) and scopes it to the authenticated user, which cleanly separates it from immich_link_o_auth_account and immich_unlink_all_o_auth_accounts_admin. It does not explicitly name those siblings, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'from the authenticated user' implies the usage context (self-service removal of one's own OAuth link) and implicitly distinguishes it from the admin-wide unlink, but no when-to-use/when-not guidance or named alternative is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_unlock_auth_sessionUnlock auth sessionA
Unlock auth session
Temporarily grant the session elevated access to locked assets by providing the correct PIN code.
Immich operation: POST /auth/session/unlock · tag: Authentication
| Name | Required | Description | Default |
|---|---|---|---|
| pinCode | No | pinCode (request body) | |
| password | No | password (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the bar is lower. The description adds the meaningful behavioral fact that the elevation is temporary and PIN-gated, but does not say how long the elevation persists, whether a logged-in session is required, or what happens on a wrong PIN.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded: the action, then the effect, then the raw operation metadata. The 'Immich operation: POST ...' trailer is machine-derived but useful for disambiguation; nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and only two optional params, the description is nearly sufficient, but it leaves open whether pinCode or password is the correct credential and what the temporary unlock actually enables downstream. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both pinCode and password are documented in the schema, giving a baseline of 3. The description mentions only the PIN code and gives no format, length, or guidance on which of the two credentials to send, so it adds little beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (unlock) on a specific resource (auth session) plus the concrete effect: temporarily granting elevated access to locked assets via a PIN. An agent can distinguish it from lock_auth_session, lock_session, and end_session without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the prerequisite (a correct PIN code must be supplied) and the situation (assets are locked and need elevated access), but it never names alternatives such as lock_auth_session/lock_session or states when-not to use this tool. Usage is inferable rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_untag_assetsUntag assetsBDestructiveIdempotent
Untag assets
Remove a tag from all the specified assets.
Immich operation: DELETE /tags/{id}/assets · tag: Tags
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| ids | Yes | ids (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false, and openWorldHint=true, so the safety profile is well covered. The description adds that removal applies to 'all the specified assets' (bulk scope) and maps to the DELETE /tags/{id}/assets endpoint, but it discloses no permission requirements, error behavior, or what happens if a tag is missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the action and scope in a single sentence, followed by the API endpoint mapping. The only minor inefficiency is the first line 'Untag assets' duplicating the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter mutation with full schema descriptions and annotations covering safety and idempotency, the description provides enough to invoke the tool correctly. It omits edge-case behavior and permission notes, but those are minor given the structured data available.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: both 'id' (tag UUID) and 'ids' (array of asset UUIDs, request body) are documented in the schema. The description adds no meaning beyond that, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Remove') and resource ('tag') with the scope 'all the specified assets', and identifies the underlying operation (DELETE /tags/{id}/assets). It is clear what the tool does, but it does not differentiate itself from sibling tools like immich_tag_assets or immich_bulk_tag_assets, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit guidance on when to use this tool versus alternatives. It does not mention the reverse operation (immich_tag_assets) or the bulk tag variant, so the agent must infer usage from the action alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_update_admin_configUpdate the system configurationCIdempotent
Update the system configuration
Update the system configuration with a new system configuration.
Immich operation: PUT /admin/config · tag: Config (admin)
| Name | Required | Description | Default |
|---|---|---|---|
| job | Yes | job (request body) | |
| map | Yes | map (request body) | |
| user | Yes | user (request body) | |
| image | Yes | image (request body) | |
| oauth | Yes | oauth (request body) | |
| theme | Yes | theme (request body) | |
| trash | Yes | trash (request body) | |
| backup | Yes | backup (request body) | |
| ffmpeg | Yes | ffmpeg (request body) | |
| server | Yes | server (request body) | |
| library | Yes | library (request body) | |
| logging | Yes | logging (request body) | |
| metadata | Yes | metadata (request body) | |
| templates | Yes | templates (request body) | |
| nightlyTasks | Yes | nightlyTasks (request body) | |
| notifications | Yes | notifications (request body) | |
| passwordLogin | Yes | passwordLogin (request body) | |
| integrityChecks | Yes | integrityChecks (request body) | |
| machineLearning | Yes | machineLearning (request body) | |
| newVersionCheck | Yes | newVersionCheck (request body) | |
| storageTemplate | Yes | storageTemplate (request body) | |
| reverseGeocoding | Yes | reverseGeocoding (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so the safety profile is partly covered. The phrase 'with a new system configuration' hints at full replacement, which is useful, but the description never states the key behavioral risk: because all 22 top-level fields are required, any omitted setting is reset to a supplied default, and existing config should be fetched first.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The body is short and front-loaded, with the endpoint/tag metadata appended efficiently. It wastes one line restating the title verbatim before restating it again, but overall it is tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 22-parameter, fully-required, whole-object replacement of an admin config with nested objects and no output schema, the description is far too thin. It omits replacement semantics, the read-then-write workflow, admin auth requirements, and any indication of which config sections carry meaningful risk.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the schema's own descriptions are mostly tautological ('Enabled', 'Concurrency', 'Quality'). The description adds nothing about the 22 nested config groups (backup, ffmpeg, oauth, machineLearning, etc.) or their interaction.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a clear verb and resource ('Update the system configuration'), and the endpoint note (PUT /admin/config) pins down the operation. However, it never distinguishes this tool from its near-identical siblings immich_update_config (user config) and immich_get_admin_config; the only differentiator is the 'admin' token in the tool name, not the description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives, no prerequisites, and no warning that this is a whole-config replacement rather than a partial patch. The agent is left to infer that it should call immich_get_admin_config first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_update_admin_onboardingUpdate admin onboardingC
Update admin onboarding
Update the admin onboarding status.
Immich operation: POST /system-metadata/admin-onboarding · tag: System metadata
| Name | Required | Description | Default |
|---|---|---|---|
| isOnboarded | Yes | isOnboarded (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, and openWorldHint=true, so the agent knows this is a non-idempotent, non-destructive write. The description adds nothing beyond this: no auth/permission requirements, no effect of toggling the flag, no statement of what changes or is preserved. The endpoint line only corroborates the POST verb already implied by the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, but its first two lines are redundant (the title repeated and then paraphrased), so not every sentence earns its place. The endpoint footer is the only distinct content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter boolean write with full annotation coverage and no output schema, the description is minimally adequate. It omits, however, what admin onboarding means, who may invoke it, and what the flag toggle affects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with a single boolean isOnboarded parameter, so the baseline is 3. The description's mention of 'onboarding status' loosely maps to the flag but adds no semantics (e.g., what true/false mean operationally).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description says 'Update the admin onboarding status,' a clear verb+resource, and the name distinguishes it from the read sibling (immich_get_admin_onboarding) and the user-level variant (immich_set_user_onboarding). However, the opening line is a verbatim restatement of the title, so the description itself adds almost no differentiation beyond the name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of alternatives such as immich_get_admin_onboarding, immich_set_user_onboarding, or immich_delete_user_onboarding. The agent must infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_update_album_infoUpdate an albumA
Update an album
Update the information of a specific album by its ID. This endpoint can be used to update the album name, description, sort order, etc. However, it is not used to add or remove assets or users from the album.
Immich operation: PATCH /albums/{id} · tag: Albums
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| order | No | order (request body) | |
| albumName | No | albumName (request body) | |
| description | No | description (request body) | |
| isActivityEnabled | No | isActivityEnabled (request body) | |
| albumThumbnailAssetId | No | albumThumbnailAssetId (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, destructive=false, idempotent=false, and openWorld=true, so the safety profile is largely covered. The description adds useful scope context (metadata-only, no membership changes) but says nothing about permissions, reversibility of field changes, or idempotency behavior despite idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the operative sentence and the scope exclusion, with no filler. The opening line merely restates the title and the trailing Immich operation/tag line is metadata, so it is efficient but not maximally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a metadata-mutation tool with six fully documented parameters and no output schema, the description covers what can be changed and what cannot, which is the key disambiguation an agent needs. Missing only secondary details such as authorization requirements and response behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description's mention of name/description/sort order maps loosely onto albumName, description, and order, but it adds no format or constraint detail beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (update) and resource (album information) scoped by ID, and enumerates the mutable fields (name, description, sort order). The explicit exclusion of asset/user membership meaningfully separates it from siblings like add_assets_to_album and add_users_to_album, though it does not name those siblings directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when-to-use context (updating album metadata) plus an explicit when-not clause (not for adding/removing assets or users), which routes the agent away from the wrong tools. No named alternatives or auth prerequisites, so it falls 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.
immich_update_album_userUpdate user roleAIdempotent
Update user role
Change the role for a specific user in a specific album.
Immich operation: PUT /albums/{id}/user/{userId} · tag: Albums
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Album ID | |
| role | Yes | role (request body) | |
| userId | Yes | Album user ID, or "me" to reference the current user. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds only the endpoint shape, which is consistent with idempotent PUT semantics, but says nothing about required album-owner permissions, whether demoting an owner has side effects, or reversibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action, plus a compact operation/tag line. Efficient and readable, though the title/description repetition of 'Update user role' and 'Change the role' is mildly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter, fully-documented, non-destructive idempotent update with annotations and no output schema, the description supplies enough to call it correctly. It misses only permission/ownership caveats and sibling routing, which are not strictly required here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (id, userId, role) are already documented in the schema including the enum. The description adds no format or syntactic detail beyond 'specific user in a specific album', so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (update), resource (album user), and field (role), plus the exact endpoint PUT /albums/{id}/user/{userId}. An agent can distinguish it from immich_update_user_admin (global user) and immich_add_users_to_album, though the description never names those siblings explicitly to make the distinction airtight.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description scopes usage to 'a specific user in a specific album', which implies when to reach for it, but there is no explicit when-to-use/when-not guidance or named alternative (e.g. add vs. update vs. remove album user). Basic context is there, exclusions are not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_update_api_keyUpdate an API keyAIdempotent
Update an API key
Updates the name and permissions of an API key by its ID. The current user must own this API key.
Immich operation: PUT /api-keys/{id} · tag: API keys
DEPRECATED — prefer the replacement operation if one exists.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| name | No | name (request body) | |
| permissions | No | permissions (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=true, destructive=false, and openWorld=true, so the safety profile is covered. The description adds the ownership/authorization constraint and a deprecation warning, which are useful, but leaves the deprecation ambiguous rather than actionable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, with the core behavior stated first. The restating of the title in the opening line and the metadata trailer are slightly redundant but the body earns its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter mutation with full schema coverage and annotations covering safety and idempotency, and no output schema to explain, the description covers what an agent needs. Only the unresolved deprecation pointer leaves a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so id, name, and permissions are already documented, including the large permission enum. The description only names 'name and permissions' without adding format, replacement semantics, or validation detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (update), resource (API key), the editable fields (name and permissions), and the lookup key (by ID). It is distinguishable from siblings like create_api_key and delete_api_key, though it does not explicitly contrast with rotate_api_key, which also mutates a key.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a real prerequisite — the current user must own the key — and flags deprecation. However, the deprecation note is vague ('prefer the replacement operation if one exists') and names no alternative, and there is no guidance distinguishing this from rotate_api_key when a key's secret rather than its metadata needs to change.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_update_assetUpdate an assetBIdempotent
Update an asset
Update information of a specific asset.
Immich operation: PUT /assets/{id} · tag: Assets
DEPRECATED — prefer the replacement operation if one exists.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| rating | No | rating (request body) | |
| latitude | No | latitude (request body) | |
| longitude | No | longitude (request body) | |
| isFavorite | No | isFavorite (request body) | |
| visibility | No | visibility (request body) | |
| description | No | description (request body) | |
| dateTimeOriginal | No | dateTimeOriginal (request body) | |
| livePhotoVideoId | No | livePhotoVideoId (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the mutation/idempotency profile is covered structurally. The description's only added behavioral signal is the deprecation notice, which is useful but vague (no replacement named, no sunset info). It says nothing about partial-update semantics for the 8 optional fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short overall, but the title is repeated verbatim as the first line and then paraphrased in the second line, so roughly a third of the text is redundant. The deprecation warning is buried at the end rather than front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter mutation tool with no output schema, the definition covers the bare essentials but omits auth/permission requirements, partial-update behavior, and the identity of the recommended replacement. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline of 3 applies. The description adds no parameter detail at all — nothing about whether omitted fields are left unchanged, how null rating/livePhotoVideoId are treated, or what visibility values mean.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update information of a specific asset'), so the operation is unambiguous. However, it does not distinguish itself from close siblings like immich_edit_asset, immich_update_asset_metadata, or the bulk immich_update_assets, leaving the agent to guess which update tool applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage cue is 'DEPRECATED — prefer the replacement operation if one exists', which does not name the replacement tool or state the condition under which this tool should still be called. No when-to-use guidance relative to the many sibling update tools is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_update_asset_metadataUpdate asset metadataBIdempotent
Update asset metadata
Update or add metadata key-value pairs for the specified asset.
Immich operation: PUT /assets/{id}/metadata · tag: Assets
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| items | Yes | items (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-destructive, idempotent, open-world behavior. The description adds the upsert semantics ('Update or add'), which is useful beyond the annotations, but it says nothing about permissions, error handling, or what happens to existing keys not included in the request.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the action. The first line duplicates the title, and the operation/tag metadata line is marginally useful, but there is no significant bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering safety and idempotency, a fully documented schema, and no output schema, the description provides enough to call the tool correctly. Remaining gaps (error cases, response shape) are minor for a simple metadata upsert.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description's mention of 'key-value pairs' aligns with the schema's items array but adds no syntax, format, or constraint details beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Update or add') and resource ('metadata key-value pairs') plus scope ('for the specified asset'), which implicitly distinguishes it from the bulk sibling immich_update_bulk_asset_metadata. However, it does not name that sibling explicitly, so sibling differentiation is only implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance, no alternatives named, and no prerequisites mentioned. The phrase 'Update or add' clarifies the operation's effect but does not help an agent decide between this tool and the bulk metadata update sibling or other asset-update tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_update_assetsUpdate assetsBIdempotent
Update assets
Updates multiple assets at the same time.
Immich operation: PUT /assets · tag: Assets
DEPRECATED — prefer the replacement operation if one exists.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | ids (request body) | |
| rating | No | rating (request body) | |
| latitude | No | latitude (request body) | |
| timeZone | No | timeZone (request body) | |
| longitude | No | longitude (request body) | |
| isFavorite | No | isFavorite (request body) | |
| visibility | No | visibility (request body) | |
| description | No | description (request body) | |
| duplicateId | No | duplicateId (request body) | |
| dateTimeOriginal | No | dateTimeOriginal (request body) | |
| dateTimeRelative | No | dateTimeRelative (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=true, and openWorldHint=true, so the safety profile is covered. The description adds the bulk-operation trait ('multiple assets at the same time'), which is useful, but says nothing about partial-update semantics or what happens to unmentioned fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded lines with no wasted prose; the purpose comes first and the deprecation caveat last. The repetition of the title as the first line is slightly redundant but harmless.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter bulk mutation with no output schema, the description is minimally adequate: annotations carry the safety profile and the schema carries the parameters. But the vague deprecation note ('if one exists') and absent guidance on which replacement to prefer leave a real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 11 parameters (including enum and range constraints) are documented in the schema itself. The description adds no parameter meaning beyond that, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (update) and resource (assets) and clarifies scope with 'multiple assets at the same time', which implicitly distinguishes it from the singular immich_update_asset sibling. However, it never names that sibling, so differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage guidance is 'DEPRECATED — prefer the replacement operation if one exists', which tells the agent to avoid the tool but not which alternative to use. No when-to-use context or prerequisites are given, leaving the agent to guess among ~200 siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_update_bulk_asset_metadataUpsert asset metadataBIdempotent
Upsert asset metadata
Upsert metadata key-value pairs for multiple assets.
Immich operation: PUT /assets/metadata · tag: Assets
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | items (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false, and readOnlyHint=false, so the safety profile is covered. The description reinforces the idempotent upsert semantics and discloses the concrete backend operation (PUT /assets/metadata), but adds little about what happens to existing keys or the multi-asset failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short and front-loaded, with the core action stated first. There is minor redundancy, as the title 'Upsert asset metadata' is echoed verbatim in the first line, plus a low-value endpoint/tag trailer.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so return values need no explanation, and annotations cover the mutation safety profile. For a bulk write tool the description is adequate but thin, omitting batch-size limits, partial-failure behavior, and prerequisites.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is a single 'items' parameter whose nested assetId/key/value fields are already documented. The description adds no extra meaning about the items structure, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (upsert) and resource (asset metadata) and adds scope (multiple assets), which implicitly separates it from the single-asset sibling immich_update_asset_metadata. It does not name that sibling explicitly, so the differentiation relies on the reader inferring from 'multiple assets'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use, when-not-to-use, or named-alternative guidance. An agent must infer from 'multiple assets' that this is the batch variant, and the related tools (immich_update_asset_metadata, immich_delete_bulk_asset_metadata) are never referenced.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_update_configUpdate system configurationCIdempotent
Update system configuration
Update the system configuration with a new system configuration.
Immich operation: PUT /system-config · tag: System config
DEPRECATED — prefer the replacement operation if one exists.
| Name | Required | Description | Default |
|---|---|---|---|
| job | Yes | job (request body) | |
| map | Yes | map (request body) | |
| user | Yes | user (request body) | |
| image | Yes | image (request body) | |
| oauth | Yes | oauth (request body) | |
| theme | Yes | theme (request body) | |
| trash | Yes | trash (request body) | |
| backup | Yes | backup (request body) | |
| ffmpeg | Yes | ffmpeg (request body) | |
| server | Yes | server (request body) | |
| library | Yes | library (request body) | |
| logging | Yes | logging (request body) | |
| metadata | Yes | metadata (request body) | |
| templates | Yes | templates (request body) | |
| nightlyTasks | Yes | nightlyTasks (request body) | |
| notifications | Yes | notifications (request body) | |
| passwordLogin | Yes | passwordLogin (request body) | |
| integrityChecks | Yes | integrityChecks (request body) | |
| machineLearning | Yes | machineLearning (request body) | |
| newVersionCheck | Yes | newVersionCheck (request body) | |
| storageTemplate | Yes | storageTemplate (request body) | |
| reverseGeocoding | Yes | reverseGeocoding (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=true, covering the safety profile. The description adds modest value by implying a wholesale replacement ('with a new system configuration'), consistent with a PUT that requires all 22 top-level sections, plus the deprecation warning. It does not mention auth privileges or side effects such as restarting jobs, so it stays at a baseline 3.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the action, but the first two lines are redundant ('Update system configuration' twice) and the deprecation warning, arguably the most actionable content, is buried at the end. It is compact but not optimally structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a high-complexity mutation with 22 required nested parameters, no output schema, and a full-replace PUT semantic that the description never makes explicit (the agent could wrongly assume a partial patch). Combined with no named replacement for the deprecation notice, the description is too sparse for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the nested fields (ffmpeg, oauth, machineLearning, etc.) are already documented in the schema and the description need not repeat them. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource (update the system configuration) and names the underlying operation PUT /system-config, so the agent knows what is being changed. However, the substance is largely a restatement of the tool name/title, and it offers no differentiation from siblings such as immich_update_admin_config, immich_update_server_config, or immich_get_config. It is clear but thin.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage signal is 'DEPRECATED — prefer the replacement operation if one exists,' which is vague because it never names the replacement tool. There is no guidance on when this bulk config update should be used versus immich_update_admin_config or the narrower config getters. The agent is left to guess at the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_update_libraryUpdate a libraryAIdempotent
Update a library
Update an existing external library.
Immich operation: PUT /libraries/{id} · tag: Libraries
DEPRECATED — prefer the replacement operation if one exists.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| name | No | name (request body) | |
| importPaths | No | importPaths (request body) | |
| exclusionPatterns | No | exclusionPatterns (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnly=false, destructive=false, idempotent=true, openWorld=true), so the bar is lower. The description adds genuinely new context: this targets an external library specifically, and the operation is deprecated, which the annotations do not convey. It still omits auth/permission requirements and what the PUT mutates.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short and front-loaded, but the first line 'Update a library' simply restates the title verbatim and earns nothing, and the operation/tag metadata is boilerplate. Two of the four lines carry no decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool whose annotations already cover the safety profile and whose schema is fully documented, this is nearly sufficient. The remaining gap is the vague deprecation pointer that names no successor, leaving the agent unable to act on it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents id, name, importPaths, and exclusionPatterns. The description adds no syntax, format, or constraint detail beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update an existing external library') and the underlying operation (PUT /libraries/{id}), so an agent can distinguish it from get_library, create_library, delete_library, and scan_library. It stops short of explicitly routing the agent among those siblings, keeping it out of 5 territory.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'DEPRECATED — prefer the replacement operation if one exists' line hints at a usage preference, but it never names the replacement tool, so the guidance is not actionable. No other when-to-use or prerequisite context is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_update_memoryUpdate a memoryBIdempotent
Update a memory
Update an existing memory by its ID.
Immich operation: PUT /memories/{id} · tag: Memories
DEPRECATED — prefer the replacement operation if one exists.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| seenAt | No | seenAt (request body) | |
| isSaved | No | isSaved (request body) | |
| memoryAt | No | memoryAt (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the write/idempotency/safety profile is covered. The description adds the deprecation warning and the raw HTTP method, which is genuinely useful context, but it discloses nothing about update semantics (partial vs full replacement) or what happens to unspecified fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short: one sentence of substance plus an operation/tag line and a deprecation line. The opening 'Update a memory' merely repeats the title and could be dropped, but otherwise there is no wasted prose and the key facts are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description should explain enough to call it safely. It leaves the most important agent question unanswered — if this is deprecated, what replaces it? — and gives no update semantics (partial vs full, effects on unspecified fields).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema nominally documents all four parameters, though the field descriptions are bare restatements like 'isSaved (request body)'. The description adds no parameter meaning at all — no format hints for memoryAt/seenAt, no note that id must be a valid memory UUID. Baseline 3 per the high-coverage rule.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (update) plus resource (memory) and scopes it to a single record by ID, and it names the underlying PUT /memories/{id} operation. It is distinguishable from immich_get_memory/immich_delete_memory by the verb, but it does nothing to differentiate itself from other update_* siblings or explain what this tool does that they don't.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance — no indication of which fields can be changed, whether the update is partial or full, or permissions required. The only directive is a vague 'DEPRECATED — prefer the replacement operation if one exists,' which names no replacement, so an agent is told to avoid the tool without being told what to use instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_update_my_preferencesUpdate my preferencesBIdempotent
Update my preferences
Update the preferences of the current user.
Immich operation: PUT /users/me/preferences · tag: Users
DEPRECATED — prefer the replacement operation if one exists.
| Name | Required | Description | Default |
|---|---|---|---|
| cast | No | cast (request body) | |
| tags | No | tags (request body) | |
| albums | No | albums (request body) | |
| avatar | No | avatar (request body) | |
| people | No | people (request body) | |
| folders | No | folders (request body) | |
| ratings | No | ratings (request body) | |
| download | No | download (request body) | |
| memories | No | memories (request body) | |
| purchase | No | purchase (request body) | |
| sharedLinks | No | sharedLinks (request body) | |
| recentlyAdded | No | recentlyAdded (request body) | |
| emailNotifications | No | emailNotifications (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=true, destructive=false, so the mutation/safety profile is covered. The description's one added behavioral fact is that the operation is deprecated, which is genuinely useful for routing. It does not disclose partial-update semantics (whether omitted sections are preserved or reset) for a 13-parameter nested body.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is appropriately short and front-loaded, but the opening line merely restates the title verbatim, and the deprecation notice is unactionable. The operation/endpoint metadata is useful; the rest is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 13 optional nested parameters, no required fields, no output schema, and rich schema descriptions, the structured data carries most of the load. Still missing is the one thing the description could uniquely supply: what partial update means for unsent sections, and the identity of the replacement operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and every nested section (cast, tags, albums, avatar, people, etc.) is documented in the schema itself, so the baseline of 3 applies. The description adds no syntax, defaults, or merge behavior beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Update the preferences of the current user', which also implicitly separates it from immich_update_user_preferences_admin (admin target) and immich_get_my_preferences (read). It does not name those siblings explicitly, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no conditions, and no named alternative. The 'DEPRECATED — prefer the replacement operation if one exists' line hints at an alternative but never identifies it, leaving the agent unable to act on it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_update_my_userUpdate current userBIdempotent
Update current user
Update the current user making the API request.
Immich operation: PUT /users/me · tag: Users
DEPRECATED — prefer the replacement operation if one exists.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | name (request body) | |
| No | email (request body) | ||
| password | No | password (request body) | |
| avatarColor | No | avatarColor (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true, openWorldHint=true). The description adds two pieces of real context beyond them: the tool is deprecated, and it maps to PUT /users/me. It does not say whether omitted fields are cleared or left untouched, nor that it only affects the caller's own account.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, and the deprecation warning is placed where it will be seen. The first two lines restate the title and the same operation, which is mild waste but not harmful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the definition covers what it does and that it is deprecated, but leaves the replacement operation unnamed and the partial-update semantics unstated. An agent has enough to call it, but not enough to prefer something else.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the four fields and the avatarColor enum are already documented. The description adds nothing about parameter behavior, notably that all fields are optional and that this is effectively a partial update.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update the current user making the API request'), and the self-scope distinguishes it from the admin-side immich_update_user_admin sibling. It is clear, but does not explicitly name the sibling it differs from.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no named alternative. The DEPRECATED note says 'prefer the replacement operation if one exists' but never identifies that replacement, so an agent cannot act on it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_update_notificationUpdate a notificationAIdempotent
Update a notification
Update a specific notification to set its read status.
Immich operation: PUT /notifications/{id} · tag: Notifications
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| readAt | No | readAt (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=false, idempotentHint=true, and openWorldHint=true, so the safety profile is covered. The description adds useful context that the mutation is specifically setting read status, but says nothing about permissions, whether readAt=null clears the read state, or 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and brief: the effect is stated in one sentence. Minor waste in repeating the title 'Update a notification' verbatim before the substantive sentence, and in the trailing operation/tag metadata line.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity, two-parameter tool with full schema coverage, annotations, and no nested objects, the description covers purpose and effect adequately. No output schema exists, so explaining return values is unnecessary, leaving little genuinely missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both id and readAt are documented structurally. The phrase 'set its read status' loosely corresponds to readAt but adds no format or semantic detail (e.g., null clears read state) beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (update) and resource (a specific notification) and clarifies the effect is to set read status. This implicitly distinguishes it from the plural bulk sibling immich_update_notifications and from get/delete notification tools, though it never names them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the singular 'a specific notification' (per-id), which contrasts with the bulk immich_update_notifications, but there is no explicit when-to-use guidance, no exclusion of alternatives, and no mention of prerequisites or auth.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_update_notificationsUpdate notificationsAIdempotent
Update notifications
Update a list of notifications. Allows to bulk-set the read status of notifications.
Immich operation: PUT /notifications · tag: Notifications
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | ids (request body) | |
| readAt | No | readAt (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the mutation/safety profile is covered. The description usefully adds that this operates in bulk over a list, but does not explain what readAt=null does (mark unread?) or what happens to ids not found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and short, with the core action in the first real sentence. There is mild redundancy between the title echo 'Update notifications' and 'Update a list of notifications', and the trailing 'Immich operation' line is boilerplate, but overall it is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter update tool with annotations already carrying the safety and idempotency profile and no output schema, the description is sufficient to invoke correctly. The main residual gap is the precise semantics of a null readAt, which is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, though the schema's own descriptions are trivial ('ids (request body)', 'readAt (request body)'). The phrase 'bulk-set the read status' adds some meaning about readAt's role, but does not clarify that readAt null likely clears/unsets the read state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Update a list of notifications') and adds the scope qualifier 'bulk-set the read status', which distinguishes it from the singular sibling immich_update_notification. It is clear what the tool does, though it never names the singular alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'bulk-set the read status of notifications', suggesting it is the multi-item path, but there is no explicit when-to-use vs when-not, no mention of immich_update_notification, and no prerequisites. The agent must infer the bulk-vs-single split.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_update_partnerUpdate a partnerAIdempotent
Update a partner
Specify whether a partner's assets should appear in the user's timeline.
Immich operation: PUT /partners/{id} · tag: Partners
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| inTimeline | Yes | inTimeline (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds the concrete effect of the mutation (partner assets appearing or not appearing in the timeline), which is useful, but says nothing about required permissions or what happens to the partner relationship itself.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short lines, with the effect of the tool front-loaded ahead of the boilerplate REST/tag footer. The operation line is useful for routing; nothing is redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, no-output-schema toggle, the description supplies purpose, the single meaningful argument's semantics, and the endpoint. It could be slightly more complete by clarifying that this tool only flips timeline visibility and does not edit other partner attributes, but an agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the schema's own text for inTimeline is only '(request body)', so the description's explanation of what the boolean controls is genuine added meaning beyond the structured fields. The id parameter is left to the schema's uuid format note, which is adequate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource and states the exact setting being changed (whether a partner's assets appear in the user's timeline), which is far more informative than the bare title. It does not, however, distinguish itself from siblings such as immich_create_partner, immich_remove_partner, or immich_get_partners.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the second sentence tells the agent what the tool controls, so it is understandable when toggling timeline visibility is relevant. There is no explicit when-to-use guidance, no mention of prerequisites (an existing partner relationship), and no routing to alternatives like create_partner or remove_partner.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_update_peopleUpdate peopleBIdempotent
Update people
Bulk update multiple people at once.
Immich operation: PUT /people · tag: People
| Name | Required | Description | Default |
|---|---|---|---|
| people | Yes | people (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is largely carried by structured data. The description adds the bulk-update scope and endpoint, but does not disclose what happens to omitted fields, whether null clears a value (the schema allows null for color/birthDate), or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short tokens ('Update people', 'Bulk update multiple people at once') plus a compact endpoint line; the scope is front-loaded and nothing is padded. The title duplicates the first line, a minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a bulk mutation tool with full annotations and 100% schema coverage and no output schema, the description covers the essential 'what' but omits partial-update/null-clearing semantics and any permission notes. Adequate but with a clear behavioral gap for a write operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'people' array parameter is fully documented at the field level, so the schema does the heavy lifting. The description restates only that the update is bulk, adding no syntax or semantic detail beyond what the schema provides; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Update people') and immediately scopes it ('Bulk update multiple people at once'), which distinguishes it from the singular immich_update_person sibling without naming it. The endpoint reference (PUT /people) reinforces what entity is being acted on.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'Bulk' implies the usage condition (multiple people at once, versus a single-person update), but it never explicitly says when to choose this over immich_update_person or how to structure a bulk call. Usage is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_update_personUpdate personCIdempotent
Update person
Update an individual person.
Immich operation: PUT /people/{id} · tag: People
DEPRECATED — prefer the replacement operation if one exists.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| name | No | name (request body) | |
| color | No | color (request body) | |
| isHidden | No | isHidden (request body) | |
| birthDate | No | birthDate (request body) | |
| isFavorite | No | isFavorite (request body) | |
| featureFaceAssetId | No | featureFaceAssetId (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover write semantics (readOnlyHint=false, idempotentHint=true, non-destructive, openWorld). The description repeats nothing about what fields are mutated, what auth is needed, or side effects on faces/featureFaceAssetId. It just restates the operation. With annotations carrying most of the load, the description adds nearly nothing about behavior beyond the generic 'Update person'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short but padded with meta boilerplate: 'Update person', 'Update an individual person', 'Immich operation: PUT /people/{id} · tag: People', and a rather unhelpful deprecation note. Some redundancy between the first two lines; the endpoint line is occasionally useful but not semantic.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 output schema, the description should explain what changes are possible and what side effects (e.g., featureFaceAssetId) exist. Instead it provides only a generic statement and a vague deprecation. The agent gets everything from the schema and annotations, leaving the description functionally redundant.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%; the schema documents id, name, color, isHidden, birthDate, isFavorite, featureFaceAssetId. The description adds no parameter meaning at all. Baseline 3 applies because the schema already documents everything, so the description neither helps nor hurts.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Update an individual person'), which is clearer than the title alone. However, it does not distinguish itself from siblings like immich_update_people (bulk), immich_update_person, or immich_merge_person_legacy. The 'Immich operation: PUT /people/{id}' line adds endpoint specificity but no conceptual differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no when-to-use or when-not-to-use guidance. It says only 'prefer the replacement operation if one exists' — vague and unhelpful. With many update_* siblings, the agent has to guess why it would pick this over immich_update_people or immich_merge_people.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_update_queueUpdate a queueBIdempotent
Update a queue
Change the paused status of a specific queue.
Immich operation: PUT /queues/{name} · tag: Queues
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Queue name | |
| isPaused | No | isPaused (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds real value by narrowing behavior to a pause/resume toggle (not a general settings mutation) and disclosing the underlying PUT endpoint, but says nothing about auth requirements, side effects on running jobs, or reversibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is short and front-loads the substantive sentence before the endpoint metadata. The leading line duplicates the title, which is mild waste, but nothing else is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter toggle with full annotation coverage and no output schema, the description supplies enough: what changes, on what resource, via which endpoint. Only the absence of guidance on queue lifecycle interactions (e.g., how pausing relates to empty_queue) keeps it below 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both 'name' and 'isPaused' are already documented, and the enum of 19 queue names is self-explanatory in the schema. The description's phrase 'paused status' only lightly reinforces the isPaused parameter, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and scope: 'Change the paused status of a specific queue,' which is more precise than the title 'Update a queue' and clearly separates it from read siblings like get_queue or destructive ones like empty_queue. It stops short of naming a sibling explicitly, so it lands at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance and no mention of alternatives such as empty_queue or run_queue_command_legacy, all of which operate on the same queue names. The agent must infer usage purely from the phrase 'change the paused status.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_update_sessionUpdate a sessionBIdempotent
Update a session
Update a specific session identified by id.
Immich operation: PUT /sessions/{id} · tag: Sessions
DEPRECATED — prefer the replacement operation if one exists.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| isPendingSyncReset | No | isPendingSyncReset (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=true, destructive=false, and openWorld=true, so the safety and idempotency profile is covered elsewhere. The description adds the genuinely useful deprecation status and the raw HTTP verb, but says nothing about what updating a session actually changes or what isPendingSyncReset does. Useful but thin against the annotation baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Compact and front-loaded, with the deprecation warning placed last for emphasis. The first two lines are slightly redundant (title restated as 'Update a specific session identified by id'), but there is no wasted padding overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two parameters, no output schema, and full annotations, the description covers purpose and deprecation adequately. However, for a mutation tool it never explains the effect of the update or the meaning of isPendingSyncReset, and the deprecation points to an unnamed replacement. Minimum-viable rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are documented structurally; the mandatory 'id' is echoed as 'identified by id'. The description adds no semantics for 'isPendingSyncReset' beyond the schema's body-parameter note. Baseline 3 is appropriate when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The definition gives a clear verb+resource ('Update a session') and pins it down further as updating a specific session by id, plus the underlying operation PUT /sessions/{id}. It is unambiguous, but it does not distinguish this tool from adjacent session tools such as delete_session, end_session, or lock_session. Distinct enough to act on, but no sibling routing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use statement, and the only guidance is 'DEPRECATED — prefer the replacement operation if one exists', which never names the replacement. That leaves the agent unable to act on the deprecation. It signals caution but gives no actionable alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_update_stackUpdate a stackBIdempotent
Update a stack
Update an existing stack by its ID.
Immich operation: PUT /stacks/{id} · tag: Stacks
DEPRECATED — prefer the replacement operation if one exists.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| primaryAssetId | No | primaryAssetId (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false (the write nature), idempotentHint=true, openWorldHint=true, and destructiveHint=false. The description adds only the deprecation notice and the endpoint mapping, but does not disclose permissions, side effects, or what happens to stack members on update. With annotations carrying the safety profile, this is adequate but thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded with the verb and resource. The deprecated line is appropriately placed at the end, though 'Immich operation: PUT /stacks/{id} · tag: Stacks' is essentially metadata padding that could be omitted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-param mutation tool with no output schema, the description covers the endpoint and deprecation but omits key context: what a stack is, whether updating requires ownership/permissions, and which replacement tool to prefer. Annotations cover safety, but the deprecation is left dangling without a concrete alternative.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both 'id' (uuid) and 'primaryAssetId' are documented in the schema. The description adds no parameter-level detail, which is acceptable given full schema coverage, but offers no extra meaning like what primaryAssetId does.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Update') and resource ('a stack'), plus the underlying API operation PUT /stacks/{id}. It's clear what the tool does, though it doesn't differentiate from siblings like immich_update_assets or immich_update_memory beyond the resource name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says 'DEPRECATED — prefer the replacement operation if one exists' but gives no concrete guidance on when to use this vs. alternatives (e.g., which update tool replaces it, or when updating is appropriate). This is a vague, passive caveat rather than actionable routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_update_tagUpdate a tagBIdempotent
Update a tag
Update an existing tag identified by its ID.
Immich operation: PUT /tags/{id} · tag: Tags
DEPRECATED — prefer the replacement operation if one exists.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| name | No | name (request body) | |
| color | No | color (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the HTTP verb (PUT) and the deprecation status, which are useful context, but says nothing about what happens to unspecified fields (partial vs full replacement) or auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, with the core action stated first. The 'Immich operation: PUT /tags/{id} · tag: Tags' line is largely metadata, and the title is repeated verbatim in the opening line, so there is minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple three-parameter update with no output schema, the essentials are present. The main gap is that the deprecation warning never names the recommended replacement, leaving an agent with no routing target, which is exactly the information a deprecated tool should supply.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents id, name, and color. The description only reiterates that the tag is identified by ID, adding no format, constraint, or optionality detail beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Update an existing tag identified by its ID'), which cleanly separates it from immich_create_tag, immich_delete_tag, and immich_get_tag_by_id. It does not, however, distinguish itself from the sibling immich_upsert_tags, which could plausibly also mutate an existing tag.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The DEPRECATED note gives a when-not-to-use signal, but it is vague: it says 'prefer the replacement operation if one exists' without naming the replacement or the condition that selects it. No guidance on when to choose this over immich_upsert_tags.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_update_user_adminUpdate a userBIdempotent
Update a user
Update an existing user.
Immich operation: PUT /admin/users/{id} · tag: Users (admin)
DEPRECATED — prefer the replacement operation if one exists.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| name | No | name (request body) | |
| No | email (request body) | ||
| isAdmin | No | isAdmin (request body) | |
| pinCode | No | pinCode (request body) | |
| password | No | password (request body) | |
| avatarColor | No | avatarColor (request body) | |
| storageLabel | No | storageLabel (request body) | |
| quotaSizeInBytes | No | quotaSizeInBytes (request body) | |
| shouldChangePassword | No | shouldChangePassword (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds the PUT/admin-endpoint context and a deprecation flag, which is genuinely useful, but says nothing about what is mutated (password rotation, admin privilege changes) or whether unlisted fields are left untouched.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and the deprecation warning is at the end, but it wastes its opening on a duplicated restatement ('Update a user' followed by 'Update an existing user'), and the most decision-relevant fact (deprecated) is not front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a ten-parameter admin mutation with no output schema, the safety profile is supplied by annotations and the parameter set by the schema, so the basics are covered. Still missing is any statement of required privileges, idempotency semantics from the description itself, or a named successor tool, leaving the deprecation advisory effectively inert.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the ten parameters (name, email, isAdmin, password, quotaSizeInBytes, etc.) are already documented at the schema level, which sets the baseline at 3. The description adds no parameter-level meaning, such as whether this is a partial or full replacement update, beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource ('Update an existing user') and anchors it to an admin endpoint via 'Immich operation: PUT /admin/users/{id} · tag: Users (admin)', which distinguishes it from the non-admin siblings immich_update_my_user and immich_update_user_preferences_admin. However, the first two lines ('Update a user' / 'Update an existing user') are largely a restatement of the title rather than new information.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only guidance is 'DEPRECATED — prefer the replacement operation if one exists,' which does not name the replacement sibling, so an agent cannot actually act on it. There is no statement of when to use this vs immich_update_my_user, immich_update_user_preferences_admin, or immich_update_user_onboarding.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_update_user_preferences_adminUpdate user preferencesBIdempotent
Update user preferences
Update the preferences of a specific user.
Immich operation: PUT /admin/users/{id}/preferences · tag: Users (admin)
DEPRECATED — prefer the replacement operation if one exists.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| cast | No | cast (request body) | |
| tags | No | tags (request body) | |
| albums | No | albums (request body) | |
| avatar | No | avatar (request body) | |
| people | No | people (request body) | |
| folders | No | folders (request body) | |
| ratings | No | ratings (request body) | |
| download | No | download (request body) | |
| memories | No | memories (request body) | |
| purchase | No | purchase (request body) | |
| sharedLinks | No | sharedLinks (request body) | |
| recentlyAdded | No | recentlyAdded (request body) | |
| emailNotifications | No | emailNotifications (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety/behavioral profile is covered structurally. The description adds the useful facts that this is an admin-scoped endpoint and is deprecated, but says nothing about partial-vs-full update semantics or auth requirements, so it adds only modest context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short and front-loaded, but the title 'Update user preferences' is immediately restated by 'Update the preferences of a specific user', which is redundant filler. The deprecation note is the only non-redundant content, and it is terse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter admin mutation on nested objects with no output schema, the annotations and rich schema cover most of what an agent needs. However, the description never clarifies whether omitted preference fields are preserved or reset (a key concern for a partial-body PUT) and leaves the 'replacement operation' unnamed, so it is only minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across all 14 nested preference parameters, so the schema fully documents field meaning. The description adds no parameter-level detail beyond the endpoint signature, which is the correct baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Update the preferences of a specific user') and the HTTP operation (PUT /admin/users/{id}/preferences) with an admin tag, which implicitly distinguishes it from the sibling immich_update_my_preferences. It does not explicitly name that sibling, so sibling differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The deprecation warning ('prefer the replacement operation if one exists') gives a usage signal, but it never names the replacement operation, leaving the agent to guess. There is no guidance on when to choose this admin variant over immich_update_my_preferences, so usage is only weakly implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_update_workflowUpdate a workflowBIdempotent
Update a workflow
Update the information of a specific workflow by its ID. This endpoint can be used to update the workflow name, description, trigger type, filters and actions order, etc.
Immich operation: PUT /workflows/{id} · tag: Workflows
DEPRECATED — prefer the replacement operation if one exists.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| name | No | name (request body) | |
| steps | No | steps (request body) | |
| enabled | No | enabled (request body) | |
| logging | No | logging (request body) | |
| trigger | No | trigger (request body) | |
| description | No | description (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=true, destructive=false, openWorld=true, so the mutation/idempotency profile is covered. The description adds the HTTP verb and the set of updatable fields, but never clarifies whether this is a partial or full replacement (i.e., whether omitted fields are preserved or reset) — a critical ambiguity for an update endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose in the first sentence and is reasonably compact. Minor waste in the repeated title line and the generic deprecation sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation with no output schema, the description names the mutable surface but omits partial-vs-full update semantics, permission requirements, and what the response returns. Annotations cover the safety profile, so the remaining gap is moderate rather than severe.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description loosely maps to fields ('name, description, trigger type, filters and actions order') but adds no format or semantic detail beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update the information of a specific workflow by its ID') and enumerates the mutable fields (name, description, trigger type, filters, actions order). It is clearly distinguishable from create/delete/get workflow siblings by the verb, though it does not call them out explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus immich_create_workflow or immich_get_workflow, nor prerequisites (ownership/admin rights). The only usage steer is 'DEPRECATED — prefer the replacement operation if one exists,' which names no alternative and is effectively boilerplate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_upload_assetUpload assetC
Upload asset
Uploads a new asset to the server.
Immich operation: POST /assets · tag: Assets
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | ||
| slug | No | ||
| duration | No | duration (request body) | |
| filename | No | filename (request body) | |
| metadata | No | metadata (request body) | |
| assetData | Yes | assetData (request body) | |
| isFavorite | No | isFavorite (request body) | |
| visibility | No | visibility (request body) | |
| sidecarData | No | sidecarData (request body) | |
| fileCreatedAt | Yes | fileCreatedAt (request body) | |
| fileModifiedAt | Yes | fileModifiedAt (request body) | |
| livePhotoVideoId | No | livePhotoVideoId (request body) | |
| x-immich-checksum | No | sha1 checksum that can be used for duplicate detection before the file is uploaded |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true). The description adds essentially nothing beyond restating the mutation, and notably omits that the operation is non-idempotent and that duplicate uploads can be avoided via checksum — context the agent would find valuable for a 13-parameter write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The text is short, but the first line redundantly repeats the title 'Upload asset' before the one informative sentence and the operation tag. There is no waste of length, yet the leading duplicate line is not front-loading new information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter write tool with three required fields and no output schema, the description never explains what assetData contains (e.g., base64 payload), how fileCreatedAt/fileModifiedAt must be formatted, or that non-idempotency means retries can create duplicates. It is too thin for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 85%, so the schema itself documents most parameters (including the checksum and visibility enum). The description contributes no additional parameter meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Uploads a new asset to the server') and cites the underlying operation POST /assets. It does not distinguish itself from other upload/create siblings such as immich_upload_database_backup or immich_check_bulk_upload, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives, no prerequisites, and no mention of related operations like the bulk-upload check or the checksum-based duplicate detection path. The agent must infer everything from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_upload_database_backupUpload database backupA
Upload database backup
Uploads .sql/.sql.gz file to restore backup from
Immich operation: POST /admin/database-backups/upload · tag: Database Backups (admin)
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | file (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-idempotent, open-world, non-destructive admin operation. The description adds the accepted file formats and the admin endpoint, which is real context, but it does not disclose what happens to existing data, whether the upload alone completes a restore, or auth requirements beyond the '(admin)' tag.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded: the action, the accepted formats, and the endpoint metadata appear in order with no wasted prose. The 'Immich operation:' line is metadata rather than description, but it is compact and useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an admin mutation with no output schema, the description covers what is uploaded but omits whether a subsequent restore flow must be triggered, whether the server enters maintenance mode, and what success looks like. Adequate but with clear gaps for a potentially impactful admin operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single parameter and 100% schema coverage, the baseline is 3, but the description adds genuine meaning beyond the bare 'file (request body)' schema entry by specifying the accepted .sql/.sql.gz formats, which the agent cannot infer from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (upload database backup) and adds the concrete accepted formats (.sql/.sql.gz) plus the underlying endpoint. It is clear what the tool does, but it does not explicitly distinguish itself from database-backup siblings such as immich_start_database_restore_flow or immich_list_database_backups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'to restore backup from' implies the context (restoring a database from a backup file), which is useful, but there is no explicit when-to-use guidance, no prerequisites (e.g. maintenance mode), and no pointer to the sibling restore-flow tool that likely follows. Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_upsert_tagsUpsert tagsCIdempotent
Upsert tags
Create or update multiple tags in a single request.
Immich operation: PUT /tags · tag: Tags
| Name | Required | Description | Default |
|---|---|---|---|
| tags | Yes | tags (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the safety and idempotency profile is covered. The description adds essentially nothing beyond restating 'create or update' — no permission requirements, no behavior on name collisions, no note on what existing tags are affected — so it does not earn credit beyond the structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short lines, front-loaded with the purpose, followed by the API operation reference. Nothing is padded, though the leading 'Upsert tags' line merely repeats the title before the real content arrives.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with annotations covering the safety profile and no output schema, the description is minimally adequate. It still omits collision behavior and which sibling tag tool to prefer, which an agent would want for correct routing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is only one parameter, so the schema already documents the `tags` array. The description adds no format, naming, or identifier detail for the tags, so it neither helps nor hurts beyond the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb pair (create/update) plus the resource (tags) and adds the bulk scope ('multiple tags in a single request'), which implicitly separates it from the single-item immich_create_tag and immich_update_tag. However, it never names those siblings explicitly, so the agent must infer the routing itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance. The phrase 'multiple tags in a single request' hints at a batch use case, but the description never contrasts this with immich_create_tag, immich_update_tag, or immich_bulk_tag_assets, so the agent must guess which tag-mutation tool to pick.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_validateValidate library settingsC
Validate library settings
Validate the settings of an external library.
Immich operation: POST /libraries/{id}/validate · tag: Libraries
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| importPaths | No | importPaths (request body) | |
| exclusionPatterns | No | exclusionPatterns (request body) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=true, but the description adds nothing about what validation actually does, whether it has side effects, or what it returns. For a POST endpoint that is explicitly non-readonly and non-idempotent, the description fails to clarify the mutation or side-effect behavior the annotations hint at.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The text is short and front-loaded, but the first line duplicates the title verbatim and the second line is a near-identical rephrasing, so the content is somewhat redundant rather than tightly informative. No waste in length, but little added value per sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description should explain what a validation result looks like (e.g., whether it reports issues or returns a boolean), but it does not. Combined with no usage guidance and a non-readonly POST annotation, the definition leaves key questions unanswered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents id (uuid), importPaths, and exclusionPatterns. The description adds no syntax, format, or meaning beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a verb (validate) and resource (external library settings), which is specific enough to know roughly what it does. However, it essentially restates the title and name without distinguishing itself from related siblings like immich_scan_library, immich_update_library, or immich_get_library.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus immich_scan_library, immich_update_library, or immich_get_library_statistics. No preconditions, no when-not-to-use, no alternatives are mentioned; the agent must infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_validate_access_tokenValidate access tokenB
Validate access token
Validate the current authorization method is still valid.
Immich operation: POST /auth/validateToken · tag: Authentication
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=false, and destructiveHint=false, so the safety profile is covered. The description adds that the current authorization method is the subject, but it does not describe authentication requirements, validation outcomes, or any 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, and the operation/tag line is useful for API mapping. The first line repeats the title and the second restates the action, so there is minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an authentication-validation tool with no output schema, the description does not explain what a valid or invalid response looks like, nor does it state any auth prerequisites. Annotations cover safety, but return semantics remain unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and the input schema is empty with 100% coverage. There is no parameter information for the description to add, so the baseline 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (validate) and resource (access token), and clarifies that it checks the current authorization method is still valid. It does not distinguish itself from authentication siblings such as immich_validate or immich_get_auth_status, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no explicit when-to-use guidance, no alternatives, and no exclusions. The phrase about validating the current authorization method implies a use case but does not tell an agent when to choose this over login, logout, or get_auth_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
immich_view_assetView asset thumbnailBRead-onlyIdempotent
View asset thumbnail
Retrieve the thumbnail image for the specified asset. Viewing the fullsize thumbnail might redirect to downloadAsset, which requires a different permission.
Immich operation: GET /assets/{id}/thumbnail · tag: Assets
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | format: uuid | |
| key | No | ||
| size | No | Asset media size | |
| slug | No | ||
| edited | No | Return edited asset if available |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world. The description adds non-obvious behavior the annotations cannot convey: a size-dependent redirect to downloadAsset and the differing permission requirement that follows. It stops short of describing the returned payload or authentication needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and scope in one sentence, followed by a useful caveat; the trailing 'Immich operation / tag' line is boilerplate but compact. No wasted prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema the description should say more about what comes back (binary image vs URL) and which permission is required. It partially covers this via the downloadAsset redirect note, but an agent still lacks the return-shape and permission details needed to call it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 60% and the description adds no parameter meaning at all — id, key, slug, size and edited are never discussed. 'The specified asset' gestures at id but gives no guidance on the size enum or what edited/key/slug do, so the description does not compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Retrieve the thumbnail image for the specified asset') and even hints at the boundary with the sibling downloadAsset. It is clear what the tool does, though it never explicitly contrasts with immich_get_asset_file, which is the other likely candidate for an agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the redirect caveat ('Viewing the fullsize thumbnail might redirect to downloadAsset, which requires a different permission'), which tells the agent one condition where behavior changes. However there is no explicit when-to-use / when-not-to-use guidance versus immich_download_asset or immich_get_asset_file.
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.
276 tool updates
v0.1.0- First observed
immich_accept_cluster_group_request - First observed
immich_add_assets_to_album - First observed
immich_add_assets_to_albums - First observed
immich_add_memory_assets - First observed
immich_add_shared_link_assets - First observed
immich_add_users_to_album - First observed
immich_bulk_tag_assets - First observed
immich_change_password - First observed
immich_change_pin_code - First observed
immich_check_bulk_upload - First observed
immich_cluster_group_regenerate_people - First observed
immich_copy_asset - First observed
immich_create_activity - First observed
immich_create_album - First observed
immich_create_api_key - First observed
immich_create_cluster_group_request - First observed
immich_create_face - First observed
immich_create_job - First observed
immich_create_library - First observed
immich_create_memory - First observed
immich_create_notification - First observed
immich_create_partner - First observed
immich_create_partner_deprecated - First observed
immich_create_person - First observed
immich_create_profile_image - First observed
immich_create_session - First observed
immich_create_shared_link - First observed
immich_create_stack - First observed
immich_create_tag - First observed
immich_create_user_admin - First observed
immich_create_workflow - First observed
immich_delete_activity - First observed
immich_delete_album - First observed
immich_delete_all_sessions - First observed
immich_delete_api_key - First observed
immich_delete_asset_file - First observed
immich_delete_asset_metadata - First observed
immich_delete_assets - First observed
immich_delete_bulk_asset_metadata - First observed
immich_delete_cluster_group_request - First observed
immich_delete_database_backup - First observed
immich_delete_duplicate - First observed
immich_delete_duplicates - First observed
immich_delete_face - First observed
immich_delete_integrity_report - First observed
immich_delete_library - First observed
immich_delete_memory - First observed
immich_delete_notification - First observed
immich_delete_notifications - First observed
immich_delete_people - First observed
immich_delete_person - First observed
immich_delete_profile_image - First observed
immich_delete_server_license - First observed
immich_delete_session - First observed
immich_delete_stack - First observed
immich_delete_stacks - First observed
immich_delete_sync_ack - First observed
immich_delete_tag - First observed
immich_delete_user_admin - First observed
immich_delete_user_license - First observed
immich_delete_user_onboarding - First observed
immich_delete_workflow - First observed
immich_detect_prior_install - First observed
immich_download_archive - First observed
immich_download_asset - First observed
immich_download_asset_file - First observed
immich_download_database_backup - First observed
immich_edit_asset - First observed
immich_empty_queue - First observed
immich_empty_trash - First observed
immich_end_session - First observed
immich_finish_o_auth - First observed
immich_get_about_info - First observed
immich_get_activities - First observed
immich_get_activity_statistics - First observed
immich_get_admin_config - First observed
immich_get_admin_config_defaults - First observed
immich_get_admin_onboarding - First observed
immich_get_album_info - First observed
immich_get_album_map_markers - First observed
immich_get_album_statistics - First observed
immich_get_all_albums - First observed
immich_get_all_libraries - First observed
immich_get_all_people - First observed
immich_get_all_shared_links - First observed
immich_get_all_tags - First observed
immich_get_api_key - First observed
immich_get_api_keys - First observed
immich_get_apk_links - First observed
immich_get_asset_duplicates - First observed
immich_get_asset_edits - First observed
immich_get_asset_file - First observed
immich_get_asset_info - First observed
immich_get_asset_metadata - First observed
immich_get_asset_metadata_by_key - First observed
immich_get_asset_ocr - First observed
immich_get_asset_statistics - First observed
immich_get_assets_by_city - First observed
immich_get_assets_by_original_path - First observed
immich_get_auth_status - First observed
immich_get_cluster_group_requests - First observed
immich_get_cluster_group_requests_for_group - First observed
immich_get_cluster_group_users - First observed
immich_get_config - First observed
immich_get_config_defaults - First observed
immich_get_download_info - First observed
immich_get_explore_data - First observed
immich_get_faces - First observed
immich_get_integrity_report - First observed
immich_get_integrity_report_csv - First observed
immich_get_integrity_report_file - First observed
immich_get_integrity_report_summary - First observed
immich_get_library - First observed
immich_get_library_statistics - First observed
immich_get_main_playlist - First observed
immich_get_maintenance_status - First observed
immich_get_map_markers - First observed
immich_get_media_playlist - First observed
immich_get_memory - First observed
immich_get_my_api_key - First observed
immich_get_my_calendar_heatmap - First observed
immich_get_my_preferences - First observed
immich_get_my_shared_link - First observed
immich_get_my_user - First observed
immich_get_notification - First observed
immich_get_notification_template_admin - First observed
immich_get_notifications - First observed
immich_get_partners - First observed
immich_get_person - First observed
immich_get_person_statistics - First observed
immich_get_person_thumbnail - First observed
immich_get_plugin - First observed
immich_get_profile_image - First observed
immich_get_public_config - First observed
immich_get_public_config_defaults - First observed
immich_get_queue - First observed
immich_get_queue_jobs - First observed
immich_get_queues - First observed
immich_get_queues_legacy - First observed
immich_get_reverse_geocoding_state - First observed
immich_get_search_suggestions - First observed
immich_get_segment - First observed
immich_get_server_config - First observed
immich_get_server_features - First observed
immich_get_server_license - First observed
immich_get_server_statistics - First observed
immich_get_server_version - First observed
immich_get_sessions - First observed
immich_get_shared_link_by_id - First observed
immich_get_stack - First observed
immich_get_storage - First observed
immich_get_storage_template_options - First observed
immich_get_supported_media_types - First observed
immich_get_sync_ack - First observed
immich_get_sync_stream - First observed
immich_get_tag_by_id - First observed
immich_get_time_bucket - First observed
immich_get_time_buckets - First observed
immich_get_unique_original_paths - First observed
immich_get_user - First observed
immich_get_user_admin - First observed
immich_get_user_calendar_heatmap_admin - First observed
immich_get_user_config - First observed
immich_get_user_config_defaults - First observed
immich_get_user_license - First observed
immich_get_user_onboarding - First observed
immich_get_user_preferences_admin - First observed
immich_get_user_sessions_admin - First observed
immich_get_user_statistics_admin - First observed
immich_get_version_check - First observed
immich_get_version_check_state - First observed
immich_get_version_history - First observed
immich_get_workflow - First observed
immich_get_workflow_for_share - First observed
immich_get_workflow_logs - First observed
immich_get_workflow_triggers - First observed
immich_leave_cluster_group - First observed
immich_link_o_auth_account - First observed
immich_list_database_backups - First observed
immich_lock_auth_session - First observed
immich_lock_session - First observed
immich_login - First observed
immich_logout - First observed
immich_logout_o_auth - First observed
immich_maintenance_login - First observed
immich_memories_statistics - First observed
immich_merge_people - First observed
immich_merge_person_legacy - First observed
immich_ping_server - First observed
immich_play_asset_video - First observed
immich_reassign_faces - First observed
immich_reassign_faces_by_id - First observed
immich_redirect_o_auth_to_mobile - First observed
immich_remove_asset_edits - First observed
immich_remove_asset_from_album - First observed
immich_remove_asset_from_stack - First observed
immich_remove_memory_assets - First observed
immich_remove_partner - First observed
immich_remove_shared_link - First observed
immich_remove_shared_link_assets - First observed
immich_remove_user_from_album - First observed
immich_reset_pin_code - First observed
immich_resolve_duplicates - First observed
immich_restore_assets - First observed
immich_restore_trash - First observed
immich_restore_user_admin - First observed
immich_reverse_geocode - First observed
immich_rotate_api_key - First observed
immich_run_asset_jobs - First observed
immich_run_queue_command_legacy - First observed
immich_scan_library - First observed
immich_search_asset_files - First observed
immich_search_asset_statistics - First observed
immich_search_assets - First observed
immich_search_large_assets - First observed
immich_search_memories - First observed
immich_search_person - First observed
immich_search_places - First observed
immich_search_plugin_methods - First observed
immich_search_plugin_templates - First observed
immich_search_plugins - First observed
immich_search_random - First observed
immich_search_smart - First observed
immich_search_stacks - First observed
immich_search_users - First observed
immich_search_users_admin - First observed
immich_search_workflows - First observed
immich_send_sync_ack - First observed
immich_send_test_email_admin - First observed
immich_set_maintenance_mode - First observed
immich_set_server_license - First observed
immich_set_user_license - First observed
immich_set_user_onboarding - First observed
immich_setup_pin_code - First observed
immich_shared_link_login - First observed
immich_sign_up_admin - First observed
immich_start_database_restore_flow - First observed
immich_start_o_auth - First observed
immich_tag_assets - First observed
immich_unlink_all_o_auth_accounts_admin - First observed
immich_unlink_o_auth_account - First observed
immich_unlock_auth_session - First observed
immich_untag_assets - First observed
immich_update_admin_config - First observed
immich_update_admin_onboarding - First observed
immich_update_album_info - First observed
immich_update_album_user - First observed
immich_update_api_key - First observed
immich_update_asset - First observed
immich_update_asset_metadata - First observed
immich_update_assets - First observed
immich_update_bulk_asset_metadata - First observed
immich_update_config - First observed
immich_update_library - First observed
immich_update_memory - First observed
immich_update_my_preferences - First observed
immich_update_my_user - First observed
immich_update_notification - First observed
immich_update_notifications - First observed
immich_update_partner - First observed
immich_update_people - First observed
immich_update_person - First observed
immich_update_queue - First observed
immich_update_session - First observed
immich_update_shared_link - First observed
immich_update_stack - First observed
immich_update_tag - First observed
immich_update_user_admin - First observed
immich_update_user_preferences_admin - First observed
immich_update_workflow - First observed
immich_upload_asset - First observed
immich_upload_database_backup - First observed
immich_upsert_tags - First observed
immich_validate - First observed
immich_validate_access_token - First observed
immich_view_asset
TDQS
Scored across 276 tools
With 276 tools there is heavy overlap: many near-identical config getters (get_config, get_admin_config, get_user_config, get_public_config, get_server_config plus their *_defaults variants), duplicate partner creators (create_partner vs create_partner_deprecated), and deprecated tools sitting alongside their replacements (update_tag/upsert_tags, update_asset/update_assets, get_user/get_user_admin). An agent will frequently struggle to pick the right tool. Some resource+action pairs are distinct, but the sheer volume of deprecated/duplicate variants muddies boundaries.
Names use a predictable immich_<verb>_<noun> snake_case pattern (immich_create_album, immich_get_asset_info, immich_delete_stack), which is highly consistent and readable. A few exceptions drop the noun (immich_login, immich_logout, immich_validate, immich_ping_server), but these are minor deviations within an otherwise uniform convention.
276 tools is an extreme count that far exceeds a manageable surface, reflecting a 1:1 mechanical mapping of the entire Immich REST API rather than a curated, agent-friendly set. This makes discovery, selection, and context management impractical.
The surface mirrors the full Immich API exhaustively — assets, albums, people, faces, tags, libraries, memories, queues, jobs, admin, auth, sync, workflows, and more — leaving essentially no CRUD or lifecycle gaps. Coverage is as complete as a tool set can be.
Maintenance
Related MCP Connectors
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
- RasterOAuthapp.raster
Browse, search, upload, tag, transfer, and delete images in your Raster libraries over MCP.
Read-only MCP server over the JENRIKS daily photoblog: one photo per day since 2006. No auth.
An MCP server that provides read access to your cloud storage providers, bank accounts and more.
Related MCP Servers
- FlicenseAqualityBmaintenanceAn MCP server for Immich self-hosted photo management that provides AI-accessible tools for browsing, searching, organizing, and managing photo libraries with duplicate detection and safe deletion workflows.431-
- AlicenseNot gradedqualityCmaintenanceEnables MCP-compatible clients to interact with an Immich photo management instance, providing access to users, assets, API keys, and partners through standardized resources and tools.1MIT
- FlicenseNot gradedqualityDmaintenanceAn OpenAPI 3.0-based MCP server that provides structured access to Immich 2.0 server functionality through tools, resources, and contextual capabilities.3-
- AlicenseNot gradedqualityAmaintenanceLocal automation bridge that is both an MCP server and client: 234 tools across 44 namespaces for shell, filesystem, git, desktop control, browser (CDP), Android (ADB), OCR/ASR and memory, plus the ability to connect external MCP servers. Sandboxed execution with token auth, fail-closed policy and audit log.8MIT