cldsh
Provides MCP tools for managing a Cloudinary account like a file system, including listing assets and folders, getting asset metadata and delivery URLs, uploading and downloading files, moving or renaming assets and folders, creating folders, and deleting assets or recursive folders with previews and confirmation before destructive changes.
Cloudinary Shell (cldsh)
MCP server, interactive shell and scriptable CLI for Cloudinary

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.mdto your AI agent or team: integration patterns (Next.js, React, Node.js, Python), transformation recipes andcldshworkflows.
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.
|
|
| community MCP servers | |
Runtime | Node, | Python, | Node, | Node, |
Auth | API key / | OAuth login | OAuth (hosted) or API key | API key |
Interactive shell ( | ✅ | ❌ one-shot flags | ❌ not a CLI | ❌ not a CLI |
MCP server | ✅ same binary | ❌ | ✅ (5 separate packages) | ✅ |
Confirm before delete/move/overwrite | ✅ two-step token, | ❌ | — | ❌ |
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 --jsonInstall 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 |
| List folders and assets (wildcards allowed) |
|
| Folder tree |
|
| Full metadata of one asset |
|
| Delivery URL, optionally transformed or signed |
|
| Upload a local file or directory |
|
| Download assets to the local disk |
|
| Move or rename an asset or folder |
|
| Delete assets, or folders with |
|
| Create a folder |
|
| Rename or move a folder (dynamic folder mode) |
|
| 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 aconfirm_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: trueonly 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,~/.sshand hidden files (unless named explicitly) are always refused. Downloads never overwrite a local file unlessoverwrite: 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.
--jsonprints machine-readable JSON on stdout (errors are printed as JSON on stderr).Exit codes:
0success,1error,2wrong usage,3partly failed (for example 2 of 50 uploads failed),4needs 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 --yesQuote wildcards. Your shell expands an unquoted
cld*into local file names beforecldshsees it. Writecldsh rm 'cld*'. If every name given tormexists in the local directory,cldshrefuses 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 videoThe 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.helplists all commands;help <command>lists all options of one command.
Commands
Command | What it does |
| Connect an account and save it as a profile (checked with Cloudinary first) |
| Show the active account and which sources it overrides; list, switch or remove profiles |
| List folders and assets |
| Change and show the current Cloudinary folder (shell only) |
| Change and show the local directory |
| Create folders (parents included) |
| Upload a file or a directory |
| Download assets |
| Move or rename an asset or folder |
| Asset metadata ( |
| Delivery URLs |
| Show an image or video thumbnail in the terminal |
| Open an asset in the browser |
| Delete assets, or folders with |
| Folder tree |
| Remaining Admin API requests this hour and the folder mode |
| Check the MCP server |
Options shared by many commands:
Option | Meaning |
| Resource type. Listings show all types by default. |
| Delivery type |
| Show what would happen without changing anything |
| Don't ask for confirmation |
| 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.txtThe resource type comes from the file extension: images (including PDF and SVG) → image, video and audio → video, everything else → raw.
--rtoverrides it.Images and videos get a public ID without extension; raw files keep it (
notes.txt).-rincludes subdirectories as subfolders. Dotfiles are skipped.Existing assets are overwritten and reported as
overwritten;--no-overwritekeeps 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-runshows 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 -rdeletes 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.
-yskips the question; scripts need--yes.Every asset is reported as
deleted,not foundorfailed, and the exit code is3if anything was not found or failed.--skip-backupdeletes 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-idalso 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;
-ogoes ahead. In dynamic mode,-oonly replaces an asset with the same public ID; an asset that merely has the same name is kept.--dry-runshows 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 folderUnsigned URLs without
--tare exactly the asset'ssecure_url.viewprints the preview URL when the terminal can't show images.downloadskips 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 overridesProfiles 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:
--profile <name>,config use/loginin the current shell, orCLOUDINARY_PROFILECLOUDINARY_URL(orCLOUDINARY_CLOUD_NAME,CLOUDINARY_API_KEY,CLOUDINARY_API_SECRET) in the environmentA
.envfile in the current directoryThe 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
cldshdetects the folder mode of your account. Override it with--folder-mode=fixed|dynamicorCLDSH_FOLDER_MODE.Listing folders and assets uses Cloudinary's Admin API, which is rate-limited per hour (500 requests on the Free plan).
cldshcaches listings for a few seconds, warns when less than 10% of the hourly budget is left, andquotashows 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 |
| Run |
The wrong account is used |
|
| Your shell expanded a wildcard; quote it: |
| The command wants a confirmation; add |
| Add |
Rate limit reached |
|
License
MIT. See CHANGELOG.md for changes between versions.
Available Tools
11 toolscloudinary_accountAccount and server statusARead-onlyIdempotent
The connected Cloudinary account (cloud name, folder mode, where the credentials come from, remaining Admin API requests) and this server's safety settings.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 foldersADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | Asset name, path from the root, public ID, folder, or wildcard pattern | |
| dry_run | No | Only show what would happen; changes nothing and never returns a confirm_token | |
| recursive | No | Delete folders with everything in them | |
| confirm_token | No | Token from a previous call with the same arguments that returned needs_confirmation; runs exactly that plan | |
| delivery_type | No | Delivery type filter (default: "upload"; recursive deletes cover all types) | |
| resource_type | No | Resource type filter (default: "all") |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 assetsADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Only show what would be downloaded where | |
| overwrite | No | Replace existing local files (default: false) | |
| public_id | Yes | Asset name, path from the root, public ID, asset_id:<id>, or wildcard pattern | |
| destination | No | Local directory or file path (default: the server's working directory) | |
| delivery_type | No | Delivery type (default: "upload") | |
| resource_type | No | Resource type (default: "all") |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 URLARead-onlyIdempotent
Build CDN delivery URLs for assets, optionally with a transformation (e.g. "f_auto,q_auto", "w_800,c_limit").
| Name | Required | Description | Default |
|---|---|---|---|
| signed | No | Sign the URL (for authenticated/private assets or strict transformations) | |
| public_id | Yes | Asset name, path from the root, public ID, asset_id:<id>, or wildcard pattern | |
| delivery_type | No | Delivery type (default: "upload") | |
| resource_type | No | Resource type (default: "all") | |
| transformation | No | Cloudinary transformation string (e.g. "f_auto,q_auto", "c_fill,w_300,h_300,g_face") |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 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.
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.
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.
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.
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.
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 detailsARead-onlyIdempotent
Full metadata of one asset: dimensions, bytes, format, tags, version, created date, URLs.
| Name | Required | Description | Default |
|---|---|---|---|
| public_id | Yes | Asset name, path from the root, public ID or asset_id:<id> | |
| delivery_type | No | Delivery type (default: "upload") | |
| resource_type | No | Resource type (default: "all") |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 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.
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.
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.
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.
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.
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 folderARead-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".
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | Maximum number of assets to return (default: 200) | |
| path | No | Folder path or wildcard pattern, from the root (e.g. "portfolio", "cld*", "shots/*.png"; default: root) | |
| delivery_type | No | Delivery type (default: "upload") | |
| resource_type | No | Resource type filter (default: "all") |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 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.
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.
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.
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.
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.
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 folderAIdempotent
Create a folder (missing parent folders are created too).
| Name | Required | Description | Default |
|---|---|---|---|
| folder | Yes | Folder path from the root |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 renameADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | Asset (name, path from the root, public ID, asset_id:<id>) or folder to move | |
| target | Yes | New path from the root, or an existing folder (end with "/" to force "into folder") | |
| dry_run | No | Only show what would happen; changes nothing and never returns a confirm_token | |
| overwrite | No | Replace an existing asset at the target (default: false) | |
| confirm_token | No | Token from a previous call with the same arguments that returned needs_confirmation; runs exactly that plan | |
| delivery_type | No | Delivery type (default: "upload") | |
| resource_type | No | Resource type (default: "all") | |
| change_public_id | No | Dynamic folder mode: also rename the public ID (changes the delivery URL) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 folderADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | New folder path from the root | |
| from | Yes | Existing folder path from the root | |
| dry_run | No | Only show what would happen; changes nothing and never returns a confirm_token | |
| confirm_token | No | Token from a previous call with the same arguments that returned needs_confirmation; runs exactly that plan |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 treeBRead-onlyIdempotent
Folder hierarchy with the assets of each folder, starting at a folder (default: root).
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | Maximum depth (default: unlimited; 0 = only the folder itself) | |
| folder | No | Folder to start from, from the root (default: root) | |
| max_files | No | Maximum assets listed per folder (default: 100) | |
| resource_type | No | Resource type filter (default: "all") |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 filesADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Name (public ID) for a single file; default: the file name without extension | |
| folder | No | Target Cloudinary folder, from the root (default: root) | |
| dry_run | No | Only show what would happen; changes nothing and never returns a confirm_token | |
| overwrite | No | Replace assets that already exist with the same public ID (default: true; false skips them) | |
| recursive | No | Include subdirectories of local_path, mirrored as subfolders | |
| local_path | Yes | Local file or directory, relative to the server's working directory or absolute | |
| confirm_token | No | Token from a previous call with the same arguments that returned needs_confirmation; runs exactly that plan | |
| resource_type | No | Force a resource type (default: "auto", by file extension) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
11 tool updates
v0.1.0- First observed
cloudinary_account - First observed
cloudinary_delete - First observed
cloudinary_download - First observed
cloudinary_get_url - First observed
cloudinary_info - First observed
cloudinary_list - First observed
cloudinary_mkdir - First observed
cloudinary_move - First observed
cloudinary_rename_folder - First observed
cloudinary_tree - First observed
cloudinary_upload
TDQS
Scored across 11 tools
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.
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.
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.
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
Related MCP Connectors
Browse, search, upload, tag, transfer, and delete images in your Raster libraries over MCP.
Official ImageKit media library server: search, upload, organize, tag, share and manage assets.
Cloud file relay: chunked uploads, folders, share links, inline text reads, ZIP packing.
Manage CloudPepper servers, Odoo instances, backups, and deployments over MCP.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn 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 npmMIT
- FlicenseNot gradedqualityDmaintenanceA 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 npm3-
- AlicenseCqualityCmaintenanceIt 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.27671 npmMIT
- AlicenseCqualityBmaintenanceSelectel 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.13MIT