Skip to main content
Glama

Cloudinary Shell (cldsh)

MCP server, interactive shell and scriptable CLI for Cloudinary

npm version License: MIT MCP Protocol

cldsh demo: tab completion, a colored ls -l listing, a transformed delivery URL, and a recursive delete that previews the plan and asks before anything is removed

cldsh lets you work with a Cloudinary account like a file system:

  • AI agents (Claude Desktop, Claude Code, Cursor) get Cloudinary tools through the Model Context Protocol (MCP), with previews and confirmation before anything is deleted or replaced.

  • Developers get an interactive shell with folders, tab completion, history and inline image previews.

  • Scripts and CI get single commands with JSON output and meaningful exit codes.

It works with both Cloudinary folder modes: dynamic folders (every account created since June 2024) and the older fixed folders. The mode is detected automatically.

Working on a project that uses Cloudinary? Give INTEGRATION.md to your AI agent or team: integration patterns (Next.js, React, Node.js, Python), transformation recipes and cldsh workflows.


How cldsh compares

Cloudinary also publishes an official CLI (cloudinary-cli, Python) and official MCP packages (@cloudinary/*). cldsh is a separate, independent project built for a different workflow: one Node binary that is a shell, a scriptable CLI and an MCP server together, authenticated with your existing API key — no Python runtime, no OAuth browser flow, no hosted service required.

cldsh

cloudinary-cli (official)

@cloudinary/* MCP (official)

community MCP servers

Runtime

Node, npx

Python, pipx/Docker

Node, npx per package

Node, npx

Auth

API key / .env

OAuth login

OAuth (hosted) or API key

API key

Interactive shell (cd, ls, tab completion)

✅

❌ one-shot flags

❌ not a CLI

❌ not a CLI

MCP server

✅ same binary

❌

✅ (5 separate packages)

✅

Confirm before delete/move/overwrite

✅ two-step token, --dry-run

❌

—

❌

Fixed/dynamic folder mode

✅ auto-detected

not documented

not documented

not documented

Pick cldsh for one local tool, API-key auth and a safety net on AI-driven changes. Pick the official packages for Cloudinary-maintained, domain-split MCP servers with OAuth and enterprise support.


Related MCP server: @nogoo9/mcp-server-cloud-fs

Quick start

Requires Node.js 20 or newer and a Cloudinary account (cloud name, API key and API secret, or a CLOUDINARY_URL).

# AI agents: add the MCP server to Claude Code
claude mcp add cloudinary npx -y cloudinary-shell --mcp

# Developers: open the interactive shell
npx cloudinary-shell

# Scripts: run one command
npx cloudinary-shell ls products --json

Install globally to get the shorter cldsh command: npm install -g cloudinary-shell.


MCP server (for AI agents)

cldsh --mcp runs an MCP server over stdio (JSON-RPC 2.0). It supports protocol versions 2025-06-18, 2025-03-26 and 2024-11-05.

Client setup

Claude Desktop (claude_desktop_config.json):

{
  "mcpServers": {
    "cloudinary": {
      "command": "npx",
      "args": ["-y", "cloudinary-shell", "--mcp"]
    }
  }
}

Claude Code: claude mcp add cloudinary npx -y cloudinary-shell --mcp

Cursor: Settings → MCP → Add new MCP server, type command, command npx -y cloudinary-shell --mcp.

Check the setup with cldsh mcp: it runs the handshake, lists the tools and makes a live call on your account.

Tools

Tool

What it does

Main arguments

cloudinary_list

List folders and assets (wildcards allowed)

path, resource_type, delivery_type, max

cloudinary_tree

Folder tree

folder, depth, resource_type, max_files

cloudinary_info

Full metadata of one asset

public_id, resource_type, delivery_type

cloudinary_get_url

Delivery URL, optionally transformed or signed

public_id, transformation, signed, resource_type

cloudinary_upload

Upload a local file or directory

local_path, name, folder, recursive, overwrite, resource_type, dry_run

cloudinary_download

Download assets to the local disk

public_id, destination, overwrite, dry_run

cloudinary_move

Move or rename an asset or folder

source, target, overwrite, change_public_id, dry_run

cloudinary_delete

Delete assets, or folders with recursive

target, recursive, resource_type, dry_run

cloudinary_mkdir

Create a folder

folder

cloudinary_rename_folder

Rename or move a folder (dynamic folder mode)

from, to

cloudinary_account

Cloud name, folder mode, credential source, remaining API budget

—

Every tool carries MCP annotations (read-only, destructive, idempotent), so clients can decide when to ask you.

Safety

  • Two-step changes. cloudinary_delete, cloudinary_move, cloudinary_rename_folder, and uploads that would replace existing assets first return a preview with a confirm_token. Nothing changes until the agent calls again with the same arguments and that token. Tokens are single-use, expire after 5 minutes and stop working if the account changes. dry_run: true only previews.

  • Local files. Uploads and downloads can only reach the folder the server was started in, the folders your MCP client shares as roots, and folders added with --allow-path. The cldsh credentials folder, ~/.ssh and hidden files (unless named explicitly) are always refused. Downloads never overwrite a local file unless overwrite: true.

  • Server options:

    • --read-only: only the read-only tools (list, tree, info, get_url, account).

    • --allow-path <dir>: allow another local folder (repeatable).

    • --no-confirm: run changes in one call, as in cldsh 1.x. Use only for trusted automation.

"args": ["-y", "cloudinary-shell", "--mcp", "--read-only"]

Command line (for scripts and CI)

Run any command directly: cldsh <command> [arguments] [options].

  • Results go to stdout; progress, warnings and errors go to stderr.

  • --json prints machine-readable JSON on stdout (errors are printed as JSON on stderr).

  • Exit codes: 0 success, 1 error, 2 wrong usage, 3 partly failed (for example 2 of 50 uploads failed), 4 needs confirmation (add --yes) or was cancelled.

  • --profile <name> uses a saved profile for one command.

# Upload a build folder with subfolders
cldsh upload ./dist/assets -r --to site/assets

# CDN URLs of every asset in a folder
cldsh ls portfolio --json | jq -r '.files[].secure_url'

# Assets larger than 100 KB
cldsh ls portfolio --json | jq -r '.files[] | select(.bytes > 100000) | .public_id'

# Preview a delete, then run it without the question
cldsh rm 'old-*' --dry-run
cldsh rm -r archive/2023 --yes

Quote wildcards. Your shell expands an unquoted cld* into local file names before cldsh sees it. Write cldsh rm 'cld*'. If every name given to rm exists in the local directory, cldsh refuses and reminds you.


Interactive shell

Run cldsh with no arguments.

Connected to Cloudinary account: my-cloud (global credentials profile (default))
[my-cloud]$~ cd products
[my-cloud]$~/products ls -l

      SIZE(KB)  DIMENSIONS(px)  NAME      FORMAT  TYPE
      ────────  ──────────────  ────────  ──────  ─────
           245  1200x630        hero      png     image
            15  512x512         logo      svg     image
          1830  1920x1080       promo     mp4     video
  • The prompt shows the account (and profile) and the current folder.

  • Tab completes commands, options, folder paths (cd apps/<Tab>) and asset names.

  • History is kept across sessions in ~/.cldsh_history (private file; lines with credentials are never saved).

  • Paths are relative to the current folder; / or ~ is the root, .. goes up, cd - goes back.

  • help lists all commands; help <command> lists all options of one command.


Commands

Command

What it does

login [profile] [URL] [--stdin]

Connect an account and save it as a profile (checked with Cloudinary first)

config [ls | use <profile> | rm <profile>]

Show the active account and which sources it overrides; list, switch or remove profiles

ls [path|pattern] [-l]

List folders and assets

cd, pwd

Change and show the current Cloudinary folder (shell only)

lcd, lpwd

Change and show the local directory

mkdir <folder>...

Create folders (parents included)

upload <path> [name] [--to folder] [-r]

Upload a file or a directory

download <name|pattern>... [destination] [-f]

Download assets

mv <source> <target> [-o] [--public-id]

Move or rename an asset or folder

info <name>

Asset metadata (-v for the full API response)

url <name|pattern>... [--t=...] [--signed]

Delivery URLs

view <name> (alias preview)

Show an image or video thumbnail in the terminal

open <name>

Open an asset in the browser

rm [-r] <name|folder|pattern>... [-y]

Delete assets, or folders with -r

tree [folder] [-d N]

Folder tree

quota

Remaining Admin API requests this hour and the folder mode

mcp

Check the MCP server

Options shared by many commands:

Option

Meaning

--rt=image|video|raw|all

Resource type. Listings show all types by default.

--type=upload|private|authenticated

Delivery type

--dry-run

Show what would happen without changing anything

-y, --yes

Don't ask for confirmation

--json

JSON output

Assets can be named by their name in the current folder, by path (products/hero), by public ID, or as asset_id:<id>. If a name matches several assets (for example an image and a video called intro), cldsh lists them; add --rt or use the public ID.

Uploading

[my-cloud]$~/products upload ~/Pictures/hero.png
Uploaded (created): https://res.cloudinary.com/my-cloud/image/upload/v1730000000/products/hero.png

[my-cloud]$~ upload ./media -r --to campaigns/fall
[1/3] created https://res.cloudinary.com/my-cloud/image/upload/.../campaigns/fall/banner.png
[2/3] created https://res.cloudinary.com/my-cloud/video/upload/.../campaigns/fall/teaser.mp4
[3/3] created https://res.cloudinary.com/my-cloud/raw/upload/.../campaigns/fall/notes.txt
  • The resource type comes from the file extension: images (including PDF and SVG) → image, video and audio → video, everything else → raw. --rt overrides it.

  • Images and videos get a public ID without extension; raw files keep it (notes.txt).

  • -r includes subdirectories as subfolders. Dotfiles are skipped.

  • Existing assets are overwritten and reported as overwritten; --no-overwrite keeps them (skipped).

  • When two files would get the same public ID (photo.jpg, photo.png), both get their extension as suffix (photo_jpg, photo_png).

  • Files over 20 MB are uploaded in chunks with progress; temporary failures are retried.

  • --dry-run shows the planned public IDs and works without credentials.

Deleting

[my-cloud]$~/products rm hero
deleted  products/hero
Deleted 1 · not found 0 · failed 0

[my-cloud]$~ rm -r campaigns/fall
Delete 3 assets (1 image, 1 video, 1 raw, 2.1 MB) and 1 folder in cloud my-cloud:
  ...
Proceed? [y/N]
  • rm -r deletes everything in the folder and its subfolders (all resource and delivery types), then the folder.

  • Recursive deletes, wildcard deletes and deletes of more than 20 assets show the plan and ask first. Emptying the whole account asks you to type the cloud name. -y skips the question; scripts need --yes.

  • Every asset is reported as deleted, not found or failed, and the exit code is 3 if anything was not found or failed.

  • --skip-backup deletes folders that still hold backups of deleted assets.

Moving and renaming

[my-cloud]$~/products mv hero archive/
Moved: /products/hero -> /archive/hero (URL unchanged)
  • Dynamic folder mode: moving and renaming keep the delivery URL (the folder and display name change). --public-id also renames the public ID, which changes the URL. Folders can be moved and renamed: mv products catalog/products.

  • Fixed folder mode: the folder is part of the public ID, so moving or renaming changes the URL. Cloudinary can't move folders in this mode.

  • An existing target stops the move; -o goes ahead. In dynamic mode, -o only replaces an asset with the same public ID; an asset that merely has the same name is kept.

  • --dry-run shows whether the URL will change.

URLs, previews and downloads

url hero                          # delivery URL
url hero --t="f_auto,q_auto,w_800" # with a transformation
url 'banner-*'                    # several assets
url private-doc --signed          # signed URL for authenticated assets
view hero --t="e_grayscale"       # inline preview (iTerm2, WezTerm, Ghostty, VS Code, Warp)
download 'shots/*' ./shots/       # several files into a folder
  • Unsigned URLs without --t are exactly the asset's secure_url.

  • view prints the preview URL when the terminal can't show images.

  • download skips local files that already exist unless -f; private and authenticated assets download through signed URLs.


Accounts and credentials

# Interactive (the secret is not shown while you type)
cldsh login

# From a script, without putting the secret in your shell history
printf %s "$CLOUDINARY_URL" | cldsh login prod --stdin

cldsh config ls          # saved profiles
cldsh config use prod    # switch (also inside the shell)
cldsh config             # active account, where it comes from, what it overrides

Profiles are stored in ~/.config/cldsh/credentials.json (%APPDATA%\cldsh on Windows) with owner-only permissions. Writes are atomic, and a damaged file is never overwritten (login --reset moves it aside).

When several sources are present, the strongest wins:

  1. --profile <name>, config use / login in the current shell, or CLOUDINARY_PROFILE

  2. CLOUDINARY_URL (or CLOUDINARY_CLOUD_NAME, CLOUDINARY_API_KEY, CLOUDINARY_API_SECRET) in the environment

  3. A .env file in the current directory

  4. The saved default profile

cldsh warns at startup, and config shows, when a source is overridden. CLOUDINARY_URL options such as ?upload_prefix=https://api-eu.cloudinary.com (EU/AP data centers) and private CDN settings are supported.


Folder modes and API limits

  • cldsh detects the folder mode of your account. Override it with --folder-mode=fixed|dynamic or CLDSH_FOLDER_MODE.

  • Listing folders and assets uses Cloudinary's Admin API, which is rate-limited per hour (500 requests on the Free plan). cldsh caches listings for a few seconds, warns when less than 10% of the hourly budget is left, and quota shows the remaining requests. Uploads and delivery URLs don't count.

  • In fixed folder mode, listing a folder also pages through its subfolders' assets, so very large folders cost more requests.


Troubleshooting

Problem

What to do

Not connected to a Cloudinary account

Run cldsh login, or set CLOUDINARY_URL. cldsh config shows what is active.

The wrong account is used

cldsh config lists the source in use and the ones it overrides.

Refusing to run "rm" on ... names that all exist in the local directory

Your shell expanded a wildcard; quote it: cldsh rm 'cld*'.

needs an interactive terminal / exit code 4

The command wants a confirmation; add --yes in scripts.

matches 2 assets

Add --rt=image (or video/raw) or use the public ID.

Rate limit reached

cldsh quota shows when the hourly budget resets.


License

MIT. See CHANGELOG.md for changes between versions.

Available Tools

11 tools
cloudinary_accountAccount and server statusA
Read-onlyIdempotent

The connected Cloudinary account (cloud name, folder mode, where the credentials come from, remaining Admin API requests) and this server's safety settings.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already establish readOnly, idempotent, openWorld, and non-destructive behavior, so the bar is lower; the description still adds meaningful context by disclosing that the result includes credential provenance and remaining Admin API quota, hinting at a live account-level call. It stops short of saying whether the call itself consumes quota or requires specific credentials.

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

Conciseness4/5

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

One sentence, front-loaded with the resource, and no filler. The parenthetical list of returned fields is dense but every item is informative; the only nit is the clipped, verb-less phrasing.

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

Completeness4/5

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

With zero parameters, full annotation coverage, and a dedicated output schema, the description needn't explain return structure and wisely doesn't. The remaining gap is the absence of any routing guidance against the closely named cloudinary_info sibling and no note on quota cost or auth requirements.

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

Parameters4/5

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

Zero parameters, so there is nothing for the description to disambiguate; baseline is 4. The description correctly adds no parameter chatter and instead spends its words on returned content.

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

Purpose4/5

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

The description enumerates exactly what the tool returns: cloud name, folder mode, credential source, remaining Admin API requests, and safety settings. That makes the resource specific enough to distinguish it from most siblings, but it never states a verb or explicitly contrasts with cloudinary_info, the one sibling an agent could 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.

Usage Guidelines3/5

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

Use is implied rather than stated: an agent can infer this is the place to check account identity, credential origin, or quota headroom, but the description never says when to call it, when not to, or why to prefer it over cloudinary_info. No alternatives or prerequisites are named.

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

cloudinary_deleteDelete assets or foldersA
DestructiveIdempotent

Delete an asset, the matches of a wildcard, or (with recursive) a folder and everything in it. The first call returns needs_confirmation with the full plan and a confirm_token; nothing is deleted until the call is repeated with that token.

NameRequiredDescriptionDefault
targetYesAsset name, path from the root, public ID, folder, or wildcard pattern
dry_runNoOnly show what would happen; changes nothing and never returns a confirm_token
recursiveNoDelete folders with everything in them
confirm_tokenNoToken from a previous call with the same arguments that returned needs_confirmation; runs exactly that plan
delivery_typeNoDelivery type filter (default: "upload"; recursive deletes cover all types)
resource_typeNoResource type filter (default: "all")

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations declare destructiveHint=true and idempotentHint=true, but nothing in structured data communicates the two-phase safety protocol. The description explains that the first call only returns needs_confirmation with a plan and confirm_token, and that nothing is deleted until the call is repeated with that token — the single most important behavioral fact for an agent invoking this.

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

Conciseness5/5

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

Two sentences, no filler. The destructive scope comes first and the confirmation safeguard second, which is the correct reading order for a delete tool.

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

Completeness5/5

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

Six parameters with full schema coverage, an output schema for return shape, and annotations for the safety profile. The description fills the one remaining gap — the confirmation workflow — so an agent knows exactly what happens on first and second call.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: recursive is framed as 'a folder and everything in it', and confirm_token is tied to the confirmation round-trip ('runs exactly that plan'). dry_run and the filter params are left to the schema, which documents them adequately.

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

Purpose5/5

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

States a specific verb (delete) and enumerates the three target kinds it covers: a single asset, wildcard matches, or a folder tree with recursive. No sibling tool does deletion, so the resource+verb pairing is unambiguous against cloudinary_move, cloudinary_rename_folder, and the read tools.

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

Usage Guidelines4/5

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

The recursive case is called out inline as the condition for folder-tree deletion, which gives real usage context. It does not name a sibling or state when NOT to use it (e.g., prefer cloudinary_move to relocate), but for a destructive delete the use case is self-evident.

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

cloudinary_downloadDownload assetsA
DestructiveIdempotent

Download assets (name, public ID or wildcard) into a local directory or file inside the allowed local directories. Existing files are skipped unless overwrite is true.

NameRequiredDescriptionDefault
dry_runNoOnly show what would be downloaded where
overwriteNoReplace existing local files (default: false)
public_idYesAsset name, path from the root, public ID, asset_id:<id>, or wildcard pattern
destinationNoLocal directory or file path (default: the server's working directory)
delivery_typeNoDelivery type (default: "upload")
resource_typeNoResource type (default: "all")

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

Adds real behavior beyond the annotations: existing files are skipped by default, overwrite must be explicitly true, and writes are confined to allowed local directories. Annotations already flag destructiveHint/openWorld/idempotent, so the description's job is context, and it delivers the key mutation semantics, though it does not say what a wildcard match produces or whether failures are reported per asset.

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

Conciseness5/5

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

Two sentences, zero waste; the skip/overwrite caveat is attached directly to the action sentence and the identifier scope is front-loaded.

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

Completeness4/5

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

With a full schema, an output schema, and rich annotations, an agent has what it needs to call this safely. The remaining gap is wildcard semantics (single vs multiple resulting files) which the description leaves unstated.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all six parameters including enums and defaults; baseline 3 applies. The description only restates public_id forms and adds the 'allowed local directories' restriction on destination.

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

Purpose4/5

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

States a specific verb (Download) and resource (assets), and enumerates accepted identifier forms (name, public ID, wildcard) plus the destination constraint of allowed local directories. It is clearly distinguishable from cloudinary_upload and cloudinary_get_url by the local-file outcome, though no sibling is named.

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

Usage Guidelines3/5

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

Implied usage only: it scopes placement to allowed local directories and notes skip-vs-overwrite behavior, which hints at bulk/local-mirror scenarios. It never says when to prefer this over cloudinary_get_url (URL only) or how it relates to cloudinary_list/tree for discovering public IDs.

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

cloudinary_get_urlGet delivery URLA
Read-onlyIdempotent

Build CDN delivery URLs for assets, optionally with a transformation (e.g. "f_auto,q_auto", "w_800,c_limit").

NameRequiredDescriptionDefault
signedNoSign the URL (for authenticated/private assets or strict transformations)
public_idYesAsset name, path from the root, public ID, asset_id:<id>, or wildcard pattern
delivery_typeNoDelivery type (default: "upload")
resource_typeNoResource type (default: "all")
transformationNoCloudinary transformation string (e.g. "f_auto,q_auto", "c_fill,w_300,h_300,g_face")

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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 nuance that the transformation is optional and shows representative transformation strings, though it does not discuss signing/auth implications that the schema hints at.

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

Conciseness5/5

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

A single sentence, front-loaded with the core purpose and with zero filler. Every clause earns its place.

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

Completeness4/5

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

An output schema exists so return values need not be explained, and all five parameters are documented in the schema. The description is complete enough for a simple read-only URL builder, with only minor gaps like signing behavior.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description's transformation examples overlap with what the schema already provides and it adds no detail beyond the structured parameters.

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

Purpose5/5

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

States a specific verb (Build) and resource (CDN delivery URLs for assets) and notes the optional transformation with concrete examples. This clearly distinguishes it from mutating siblings like cloudinary_upload, cloudinary_delete, or cloudinary_move.

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

Usage Guidelines3/5

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

Usage is implied by the nature of the tool (you build URLs to deliver existing assets), but there is no explicit when-to-use/when-not guidance or reference to alternatives. An agent must infer that this is the delivery-URL entry point versus the management siblings.

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

cloudinary_infoAsset detailsA
Read-onlyIdempotent

Full metadata of one asset: dimensions, bytes, format, tags, version, created date, URLs.

NameRequiredDescriptionDefault
public_idYesAsset name, path from the root, public ID or asset_id:<id>
delivery_typeNoDelivery type (default: "upload")
resource_typeNoResource type (default: "all")

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so safety behavior is covered structurally. The description adds only a field inventory, which is already conveyed by the output schema, and says nothing about auth, rate limits, or missing-asset behavior.

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

Conciseness4/5

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

A single front-loaded sentence with no filler; every item listed contributes to the scope. It is a sentence fragment lacking a verb, but the size is appropriate for the tool's simplicity.

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

Completeness4/5

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

With a full output schema, complete parameter documentation, and annotations covering safety, the description only needs to establish purpose and scope, which it does. Minor missing context: no mention of error behavior when the public_id is not found.

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

Parameters3/5

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

Schema description coverage is 100% and both enum parameters are documented in the schema, so the schema does the heavy lifting. The description mentions no parameter formats (e.g. asset_id:<id> prefix) beyond what the schema already states, matching the baseline of 3.

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

Purpose4/5

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

The description names the specific verb+resource implied by 'Full metadata of one asset' and enumerates the fields returned, which separates it from list/tree/url siblings. It stops short of explicitly naming a competing sibling, so it is not a 5.

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

Usage Guidelines3/5

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

'one asset' implicitly signals single-asset lookup versus cloudinary_list or cloudinary_tree, but there is no explicit guidance on when to prefer this tool over cloudinary_get_url or cloudinary_download. Usage must be inferred from the noun phrase.

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

cloudinary_listList folderA
Read-onlyIdempotent

List the subfolders and assets of a Cloudinary folder (paths start at the root), or the matches of a wildcard such as "cld*" or "shots/*.png".

NameRequiredDescriptionDefault
maxNoMaximum number of assets to return (default: 200)
pathNoFolder path or wildcard pattern, from the root (e.g. "portfolio", "cld*", "shots/*.png"; default: root)
delivery_typeNoDelivery type (default: "upload")
resource_typeNoResource type filter (default: "all")

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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 usefully adds that paths are root-relative and that wildcards return matches, but it says nothing about behavior on a missing folder, result ordering, or how max interacts with subfolder listings.

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

Conciseness5/5

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

One front-loaded sentence with the primary scope first and the wildcard variant second; there is no filler and nothing redundant.

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

Completeness4/5

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

With an output schema, full parameter documentation, and rich annotations, the description only needs to convey scope and the two calling modes, which it does. The remaining gap is minor: no note on cross-referencing with cloudinary_tree or on wildcard/folder error behavior.

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

Parameters3/5

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

Schema coverage is 100% and every parameter, including defaults and enum values, is documented inline, so the baseline is 3. The description only restates the path/wildcard semantics the schema already explains, adding no new meaning for max, delivery_type, or resource_type.

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

Purpose4/5

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

The description names a specific verb and resource ("List the subfolders and assets of a Cloudinary folder") and adds the dual mode of wildcard matching, so the agent knows exactly what comes back. It does not explicitly contrast itself with the sibling cloudinary_tree, so 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.

Usage Guidelines3/5

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

The examples ("portfolio", "cld*", "shots/*.png") imply the shape of a call, but nothing tells the agent when to pick this over cloudinary_tree or how a folder path differs from a recursive listing. 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.

cloudinary_mkdirCreate folderA
Idempotent

Create a folder (missing parent folders are created too).

NameRequiredDescriptionDefault
folderYesFolder path from the root

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, openWorldHint=true, and destructiveHint=false. The description adds one genuinely useful side-effect disclosure: missing parent folders are created too. Beyond that it adds no context on permissions, path format, or behavior when the folder already exists (partly covered by idempotentHint).

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

Conciseness5/5

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

One short sentence with the key side-effect front-loaded in parentheses. No wasted text.

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

Completeness4/5

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

With an output schema present and rich annotations, the description supplies what's needed to call the tool correctly. Minor gaps remain (path format, no-op behavior on existing folders) but they are largely covered by the idempotentHint annotation.

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

Parameters3/5

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

Schema coverage is 100% and the single parameter documents itself as "Folder path from the root". The description adds no syntax, separator, or format 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.

Purpose4/5

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

States a specific verb and resource ("Create a folder") with a parenthetical scope note. It is unambiguous and no sibling (rename_folder, move, upload) overlaps with plain folder creation, though it doesn't explicitly say so.

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

Usage Guidelines3/5

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

Usage is implied by the verb – you call it when you need a folder to exist – but there is no explicit when/when-not guidance or reference to alternatives such as cloudinary_rename_folder or cloudinary_move for other path operations.

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

cloudinary_moveMove or renameA
Destructive

Move or rename an asset, or move a folder (dynamic folder mode). In dynamic folder mode an asset move keeps its URL unless change_public_id is set. The first call returns needs_confirmation with the plan and a confirm_token.

NameRequiredDescriptionDefault
sourceYesAsset (name, path from the root, public ID, asset_id:<id>) or folder to move
targetYesNew path from the root, or an existing folder (end with "/" to force "into folder")
dry_runNoOnly show what would happen; changes nothing and never returns a confirm_token
overwriteNoReplace an existing asset at the target (default: false)
confirm_tokenNoToken from a previous call with the same arguments that returned needs_confirmation; runs exactly that plan
delivery_typeNoDelivery type (default: "upload")
resource_typeNoResource type (default: "all")
change_public_idNoDynamic folder mode: also rename the public ID (changes the delivery URL)

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare destructiveHint, idempotentHint=false, and openWorldHint, so the safety profile is covered. The description still adds real value by disclosing the confirmation gate and the URL-preservation behavior in dynamic folder mode, which are not visible from annotations alone.

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

Conciseness5/5

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

Three sentences, no waste, with the core action front-loaded and the confirmation mechanics trailing as supporting detail. Every sentence carries distinct information.

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

Completeness4/5

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

With an output schema present, rich annotations, and full schema coverage, the description only needs to explain the non-obvious workflow, which it does via the confirm_token gate. Minor gap: it does not mention permission requirements or what happens to the existing asset when overwrite replaces it.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter including dry_run, overwrite, and confirm_token is already documented in the schema. The description's 'keeps its URL unless change_public_id is set' largely restates the schema's own wording, so it adds little beyond the structured fields – baseline 3.

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

Purpose4/5

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

States a specific verb and resource ('Move or rename an asset, or move a folder') and names the dynamic folder mode qualifier. It does not explicitly distinguish itself from the sibling cloudinary_rename_folder, which overlaps on folder operations, so an agent may still hesitate between the two.

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

Usage Guidelines3/5

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

Gives useful context about the two-step confirmation flow ('first call returns needs_confirmation... confirm_token'), which tells the agent how the call sequence works. However, it never says when to prefer this over cloudinary_rename_folder or when to use dry_run instead of a real call, and offers no exclusions.

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

cloudinary_rename_folderRename folderA
Destructive

Rename or move a folder with everything in it (dynamic folder mode only; asset URLs do not change). The first call returns needs_confirmation with the plan and a confirm_token.

NameRequiredDescriptionDefault
toYesNew folder path from the root
fromYesExisting folder path from the root
dry_runNoOnly show what would happen; changes nothing and never returns a confirm_token
confirm_tokenNoToken from a previous call with the same arguments that returned needs_confirmation; runs exactly that plan

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint, idempotentHint=false and openWorldHint, so the safety profile is covered. The description adds genuinely new behavior: asset URLs are unchanged after the rename, and the first call is non-executing and returns needs_confirmation plus a confirm_token. It doesn't describe failure modes outside dynamic folder mode.

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

Conciseness5/5

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

Two sentences, no filler, and the most decision-relevant facts (recursive scope, mode restriction, confirmation requirement) are all front-loaded and unmissable.

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

Completeness4/5

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

With rich annotations and an output schema present, the description doesn't need to explain return values. It covers scope, mode restriction, and the confirmation handshake, leaving only error behavior (e.g., what happens outside dynamic folder mode) unaddressed.

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

Parameters4/5

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

Schema coverage is 100%, so all four parameters are already documented, giving a baseline of 3. The description adds the relationship between calls that explains why confirm_token exists ('runs exactly that plan') and how dry_run interacts with it, which is meaning beyond the field-level text.

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

Purpose5/5

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

States specific verbs ('rename or move'), the exact resource ('a folder'), and the recursive scope ('with everything in it'), which is what separates it from cloudinary_move (asset-level moves). An agent can pick between them without reading either schema.

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

Usage Guidelines4/5

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

Names a hard precondition ('dynamic folder mode only') and explains the two-step confirmation flow that governs real usage. It does not explicitly exclude or route to cloudinary_move/cloudinary_mkdir, so it stops short of full when-not guidance.

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

cloudinary_treeFolder treeB
Read-onlyIdempotent

Folder hierarchy with the assets of each folder, starting at a folder (default: root).

NameRequiredDescriptionDefault
depthNoMaximum depth (default: unlimited; 0 = only the folder itself)
folderNoFolder to start from, from the root (default: root)
max_filesNoMaximum assets listed per folder (default: 100)
resource_typeNoResource type filter (default: "all")

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already establish readOnly, idempotent, non-destructive, open-world behavior, so the description does not need to restate safety. It usefully discloses that the result is a hierarchy including each folder's assets and that the traversal starts at root by default, but says nothing about the cost of deep/unbounded recursion or how large results are returned.

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

Conciseness5/5

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

A single front-loaded sentence with no filler; the starting-point default is placed where the reader needs it. Nothing could be removed without losing information.

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

Completeness3/5

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

An output schema exists and all four parameters are fully described, so the mechanical contract is covered. However, for a recursive tree operation the description omits practical context an agent would want — result size, traversal depth risk, and how it differs from cloudinary_list.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter (depth, folder, max_files, resource_type) is already documented in the schema. The description only echoes the folder default, adding no extra semantics such as how depth interacts with max_files, so the baseline 3 applies.

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

Purpose4/5

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

Names a specific resource (folder hierarchy with the assets of each folder) and the starting point default, which is more than a tautology. It does not distinguish itself from the closely related sibling cloudinary_list, so an agent must infer the difference between a tree walk and a flat listing.

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

Usage Guidelines2/5

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

No when-to-use or when-not-to-use guidance is given. With siblings like cloudinary_list and cloudinary_info in the same server, the agent gets no signal for choosing between a recursive tree and a flat listing.

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

cloudinary_uploadUpload filesA
Destructive

Upload a local file or directory (inside the allowed local directories) into a Cloudinary folder. The resource type follows the file extension unless resource_type is set. If the upload would replace existing assets, the first call returns needs_confirmation with a confirm_token instead of uploading.

NameRequiredDescriptionDefault
nameNoName (public ID) for a single file; default: the file name without extension
folderNoTarget Cloudinary folder, from the root (default: root)
dry_runNoOnly show what would happen; changes nothing and never returns a confirm_token
overwriteNoReplace assets that already exist with the same public ID (default: true; false skips them)
recursiveNoInclude subdirectories of local_path, mirrored as subfolders
local_pathYesLocal file or directory, relative to the server's working directory or absolute
confirm_tokenNoToken from a previous call with the same arguments that returned needs_confirmation; runs exactly that plan
resource_typeNoForce a resource type (default: "auto", by file extension)

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

The destructiveHint annotation is refined meaningfully: the description discloses that replacements are intercepted by a needs_confirmation/confirm_token handshake rather than silently overwriting, and that the resource type is inferred from the extension unless overridden. It stops short of covering directory-upload edge cases, auth requirements, or batch failure semantics.

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

Conciseness5/5

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

Three sentences, front-loaded with the core action and scope, followed by the two non-obvious rules (type inference, confirmation gate). Every sentence carries distinct information with no restatement of the title or schema.

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

Completeness4/5

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

With annotations and an output schema already present, the description supplies the one behavioural detail an agent could not infer: the confirmation-token workflow. Remaining gaps are minor — the set of 'allowed local directories' is referenced but not characterised, and multi-asset directory upload outcomes are left to the schema.

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

Parameters3/5

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

Schema description coverage is 100%, so all eight parameters (including confirm_token, dry_run, overwrite, and the resource_type enum) are already documented in the schema. The description restates the resource_type default behaviour but adds little interpretation 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.

Purpose5/5

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

The description uses a specific verb ('Upload') with a precise resource boundary: a local file or directory inside allowed directories into a Cloudinary folder. It also states the resource-type inference rule, which distinguishes it from siblings like cloudinary_move, cloudinary_download, and cloudinary_delete that operate on already-stored assets.

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

Usage Guidelines4/5

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

Clear context for when this tool applies (pushing local content into Cloudinary) and it explains the two-phase confirmation flow that gates destructive replacement. It does not explicitly compare against siblings such as cloudinary_move (server-side reorganisation) or cloudinary_download, so an agent must infer the boundary itself.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 11 tool updatesv0.1.0
    • First observedcloudinary_account
    • First observedcloudinary_delete
    • First observedcloudinary_download
    • First observedcloudinary_get_url
    • First observedcloudinary_info
    • First observedcloudinary_list
    • First observedcloudinary_mkdir
    • First observedcloudinary_move
    • First observedcloudinary_rename_folder
    • First observedcloudinary_tree
    • First observedcloudinary_upload

TDQS

A3.9/5.0

Scored across 11 tools

Disambiguation4/5

Most tools target a clearly distinct operation (get_url, info, upload, download, delete, mkdir, account). Two pairs blur: cloudinary_move explicitly also moves folders, which overlaps cloudinary_rename_folder, and cloudinary_tree overlaps cloudinary_list since the tree includes per-folder asset listings; the descriptions mitigate but do not fully eliminate the misselection risk.

Naming Consistency4/5

Every tool uses the same cloudinary_ prefix with snake_case, which is highly predictable. Minor deviation: most names are verb-based (get_url, list, upload) while a few are bare nouns (info, tree, account), so the pattern isn't perfectly uniform.

Tool Count5/5

11 tools sits squarely in the well-scoped range and each maps to a real asset-management need (listing, metadata, transfer, folder ops, account state). Nothing appears redundant enough to drop.

Completeness4/5

The core lifecycle is covered: browse (list/tree/info), transfer (upload/download), organize (mkdir/move/rename_folder), remove (delete), URL generation, and account introspection, with a consistent confirmation flow for destructive ops. Gaps exist around asset metadata updates (tags are reported by info but there is no tool to set them) and explicit asset rename/public_id changes outside move.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that provides an interface for interacting with the Cloudinary API to manage media assets and cloud configurations. It enables secure resource management through API keys and OAuth2 authentication within MCP-compliant environments.
    1,866 npm
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    A cloud replacement for mcp-server-filesystem that provides 30 tools for S3, Azure Blob, and Google Cloud Storage, deployable locally via STDIO or remotely over HTTP/WebSocket with OAuth 2.1 authentication.
    102 npm
    3
    -
  • A
    license
    C
    quality
    C
    maintenance
    It exposes the full official Immich API (276 tools across 41 groups) to MCP clients, letting them search and manage assets, albums, people, tags, memories, shared links, users, jobs and admin settings. It supports file uploads and downloads, stdio or streamable HTTP transports, and filtering/read-only safety modes.
    276
    71 npm
    MIT
  • A
    license
    C
    quality
    B
    maintenance
    Selectel S3 MCP server and Go CLI: browse, preview and restore files in a bucket. Read-only by default; write, delete and admin tools only behind switches, destructive calls confirmed by a person.
    13
    MIT