The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Cloudinary Asset Management listing page.
Install the MCP server as a Desktop Extension using the pre-built mcp-server.mcpb file:
Simply drag and drop the mcp-server.mcpb file onto Claude Desktop to install the extension.
The MCP bundle package includes the MCP server and all necessary configuration. Once installed, the server will be available without additional setup.
[!NOTE] MCP bundles provide a streamlined way to package and distribute MCP servers. Learn more about Desktop Extensions.
Or manually:
Refer to Official Windsurf documentation for latest information
Manage MCPs. (To Manage MCPs you should be signed in with a Windsurf Account)View raw config to open up the mcp configuration file.Or manually:
Refer to Official VS Code documentation for latest information
MCP: Open User Configuration. This should open mcp.json fileFor a full list of server arguments, run:
The MCP server supports the following environment variables:
| Variable | Description | Required |
|---|---|---|
CLOUDINARY_CLOUD_NAME | Your Cloudinary cloud name | Yes |
CLOUDINARY_API_KEY | Your Cloudinary API key | Yes |
CLOUDINARY_API_SECRET | Your Cloudinary API secret | Yes |
CLOUDINARY_URL | Complete Cloudinary URL (alternative to individual vars) | No |
CLOUDINARY_COLLECT_HEADERS | Collect API response headers (see below) | No |
CLOUDINARY_MCP_APPS | Override MCP Apps default (see MCP Apps) | No |
You can use a single CLOUDINARY_URL instead of individual variables:
You can configure the server to include Cloudinary API response headers (such as x-request-id and rate limit info) in tool output. This is useful for debugging and monitoring.
Set CLOUDINARY_COLLECT_HEADERS to control which headers are collected:
Each entry in the comma-separated list is matched against response header names:
| Format | Example | Behaviour |
|---|---|---|
| exact name | x-request-id | matches only x-request-id |
prefix:<value> | prefix:x-featureratelimit- | matches any header starting with x-featureratelimit- |
regex:<pattern> | regex:ratelimit | matches any header whose name contains ratelimit |
You can also set this via the CLOUDINARY_URL query parameter:
When enabled, collected headers appear in an _headers field in the tool response. When not set, no headers are collected and responses are unchanged.
The server can expose interactive MCP UI Apps (spec-aligned with io.modelcontextprotocol/ui) that hosts can render alongside tool results — for example, an asset gallery for list results, a single-asset detail view, and an upload UI.
Apps are enabled by default. Use the --mcp-apps flag (available on both start and serve) or the CLOUDINARY_MCP_APPS environment variable to override this behaviour:
| Value | Effect |
|---|---|
| unset | Default — all apps enabled |
bare --mcp-apps (no value), all, or true | Enable every app (same as default) |
none or false | Disable every app (kill-switch) |
comma-separated subset, e.g. asset-gallery,asset-details | Enable only the listed apps |
Available app names: asset-gallery, asset-details, asset-upload.
Precedence: CLI flag > environment variable > built-in default.
The MCP server uses your Cloudinary API key and secret for authentication:
The MCP server exposes Cloudinary's Asset Management API as tools. Use your AI application to discover and invoke the available tools for uploading, managing, searching, and transforming your media assets.
This MCP server includes two powerful custom tools:
get-tx-referenceRetrieves the complete Cloudinary transformation reference documentation.
When to use:
Example:
transform-assetApplies transformations to existing assets using Cloudinary's explicit API.
Parameters:
publicId - The asset's public IDtransformations - Transformation string (e.g., c_fill,w_300,h_200)resourceType - Type: image, video, or raw (default: image)invalidate - Invalidate CDN cache (default: false)Example:
MCP servers with many tools can bloat LLM context windows, leading to increased token usage and tool confusion. Dynamic mode solves this by exposing only a small set of meta-tools that let agents progressively discover and invoke tools on demand.
To enable dynamic mode, pass the --mode dynamic flag when starting your server:
In dynamic mode, the server registers only the following meta-tools instead of every individual tool:
list_tools: Lists all available tools with their names and descriptions.describe_tool_input: Returns the input schema for one or more tools by name.execute_tool: Executes a tool by name with its arguments.list_scopes: Lists the scopes available on the server.This approach significantly reduces the number of tokens sent to the LLM on each request, which is especially useful for servers with a large number of tools.
You can combine dynamic mode with scope and tool filters:
While we value contributions to this MCP Server, most of the code is generated programmatically from the Cloudinary API spec. Any manual changes to generated files will be overwritten on the next generation — please direct your changes to the manual extension points below.
What you can contribute:
src/mcp-server/server.extensions.tssrc/mcp-server/apps/ (gallery, details, upload, and new apps)src/hooks/ (auth, custom headers, response headers, user agent)Generated files (do not edit):
src/mcp-server/server.tssrc/mcp-server/tools/*.tssrc/funcs/*.tssrc/models/*.tsWhen touching generated files is unavoidable, prefer updating the upstream spec or Speakeasy configuration in .speakeasy/ so the change survives regeneration.
We look forward to hearing your feedback. Feel free to open a PR or issue with a proof of concept and we'll do our best to include it in a future release.