Cloudinary Account Provisioning API: Accounts with provisioning API access can create and manage their product environments, users and user groups using the RESTful Provisioning API.
Provisioning API access is available upon request for accounts on an Enterprise plan.
The API uses Basic Authentication over HTTPS. Your Account API Key and Account API Secret (previously referred to as Provisioning API keys) are used for the authentication. These credentials (as well as your ACCOUNT_ID) are located in the Cloudinary Console under Settings > Account API Keys.
The Provisioning API has dedicated SDKs for the following languages:
Useful links:
- Provisioning API reference (Classic) (includes SDKs for additional languages)
Accounts with Permissions API access can assign roles, made up of system policies, to control what principals (users, groups, and API keys) can do across the Cloudinary account and product environments. For more information about Cloudinary roles and permissions, see the Role-based permissions guide.
Permissions API access is available upon request for accounts on an Enterprise plan.
The API uses Basic Authentication over HTTPS. Your Account API Key and Account API Secret (previously referred to as Provisioning API keys) are used for the authentication. These credentials (as well as your ACCOUNT_ID) are located in the Cloudinary Console under Settings > Account API Keys.
Important:
Cloudinary's Roles and Permissions Management is now available as a Beta. This is an early stage release, and while it's functional and ready for real-world testing, it's subject to change as we continue refining the experience based on what we learn, including your feedback. During the Beta period, core functionality is considered stable, though some APIs, scopes, or response formats may evolve.
How you can help:
- Use Roles and Permissions Management in real projects, prototypes, or tests.
- Share feedback, issues, or ideas with our support team.
Thank you for exploring this early release and helping us shape these tools to best meet your needs.
The MCP server requires Node.js 20.19.0 or later.
Claude Desktop
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.
Cursor
Or manually:
- Open Cursor Settings
- Select Tools and Integrations
- Select New MCP Server
- If the configuration file is empty paste the following JSON into the MCP Server Configuration:
{
"command": "npx",
"args": [
"@cloudinary/account-provisioning-mcp",
"start",
"--provisioning-api-key",
"",
"--provisioning-api-secret",
"",
"--account-id",
""
]
}Claude Code CLI
claude mcp add CldProvisioning -- npx -y @cloudinary/account-provisioning-mcp start --provisioning-api-key --provisioning-api-secret --account-id Gemini
gemini mcp add CldProvisioning -- npx -y @cloudinary/account-provisioning-mcp start --provisioning-api-key --provisioning-api-secret --account-id Windsurf
Refer to Official Windsurf documentation for latest information
- Open Windsurf Settings
- Select Cascade on left side menu
- Click on
Manage MCPs. (To Manage MCPs you should be signed in with a Windsurf Account) - Click on
View raw configto open up the mcp configuration file. - If the configuration file is empty paste the full json
{
"command": "npx",
"args": [
"@cloudinary/account-provisioning-mcp",
"start",
"--provisioning-api-key",
"",
"--provisioning-api-secret",
"",
"--account-id",
""
]
}VS Code
Or manually:
Refer to Official VS Code documentation for latest information
- Open Command Palette
- Search and open
MCP: Open User Configuration. This should open mcp.json file - If the configuration file is empty paste the full json
{
"command": "npx",
"args": [
"@cloudinary/account-provisioning-mcp",
"start",
"--provisioning-api-key",
"",
"--provisioning-api-secret",
"",
"--account-id",
""
]
}Stdio installation via npm
To start the MCP server, run:npx @cloudinary/account-provisioning-mcp start --provisioning-api-key --provisioning-api-secret --account-id For a full list of server arguments, run:
npx @cloudinary/account-provisioning-mcp --help
The MCP server supports the following environment variables:
| Variable | Description | Required |
|---|---|---|
CLOUDINARY_ACCOUNT_ID |
Your Cloudinary Account ID | Yes |
CLOUDINARY_PROVISIONING_API_KEY |
Your Cloudinary Provisioning API key | Yes |
CLOUDINARY_PROVISIONING_API_SECRET |
Your Cloudinary Provisioning API secret | Yes |
CLOUDINARY_ACCOUNT_URL |
Complete Account URL (alternative to individual vars) | No |
You can use a single CLOUDINARY_ACCOUNT_URL instead of individual variables:
CLOUDINARY_ACCOUNT_URL=account://PROVISIONING_API_KEY:PROVISIONING_API_SECRET@ACCOUNT_IDThese credentials are located in the Cloudinary Console under Settings > Account API Keys.
The MCP server uses your Cloudinary Account API key and secret for authentication:
{
"env": {
"CLOUDINARY_ACCOUNT_ID": "abc123def456",
"CLOUDINARY_PROVISIONING_API_KEY": "123456789012345",
"CLOUDINARY_PROVISIONING_API_SECRET": "abcdefghijklmnopqrstuvwxyz12"
}
}Or use the combined URL format:
{
"env": {
"CLOUDINARY_ACCOUNT_URL": "account://123456789012345:abcdefghijklmnopqrstuvwxyz12@abc123def456"
}
}The MCP server exposes Cloudinary's Account Provisioning and Permissions APIs as 47 tools. Use your AI application to discover and invoke the available tools.
- Product Environments — List, create, get, update, and delete product environments
- Users — List, create, get, update, and delete users; get user groups and sub-accounts
- User Groups — List, create, get, update, and delete groups; add/remove users
- Access Keys — List, generate, update, and delete access keys (by key or by name)
- Billing — Get billing usage information
- Roles — List, create, get, update, and delete roles; manage role-principal assignments
- Policies — List system/custom/effective policies; create, get, update, and delete custom policies; validate Cedar policies
- Principals — List principal roles; assign/remove roles; inspect principals and their permissions
- Schema & Catalog — Get Cedar schema; get system roles and policies catalog
1. List environments: "Show me all product environments in my account"
2. Get details: "Get details for the 'production' product environment"
3. Create new: "Create a new product environment called 'staging'"1. List users: "Show all users in my Cloudinary account"
2. Create user: "Add a new admin user with email user@example.com"
3. Assign role: "Give the new user the Admin role on the production environment"1. Inspect access: "Who has access to the production product environment?"
2. List roles: "Show me all available global roles"
3. Check user roles: "What roles does user@example.com have?"1. List keys: "Show all access keys for the production environment"
2. Generate: "Generate a new access key called 'ci-deploy'"
3. Disable old: "Disable the old 'ci-deploy-v1' access key"
4. Delete: "Delete the disabled 'ci-deploy-v1' key"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:
{
"mcpServers": {
"CldProvisioning": {
"command": "npx",
"args": ["@cloudinary/account-provisioning-mcp", "start", "--mode", "dynamic", "--scope", "admin"],
// ... other server arguments
}
}
}- Node.js v20 or higher
- npm, pnpm, bun, or yarn
# Clone the repository
git clone https://github.com/cloudinary/account-provisioning-mcp.git
cd account-provisioning-mcp
# Install dependencies
npm install
# Build the project
npm run build
# Run locally
node ./bin/mcp-server.js start --provisioning-api-key <KEY> --provisioning-api-secret <SECRET> --account-id <ID>Or debug with the MCP Inspector:
npx @modelcontextprotocol/inspector node ./bin/mcp-server.js start --provisioning-api-key <KEY> --provisioning-api-secret <SECRET> --account-id <ID>account-provisioning-mcp/
├── src/
│ ├── hooks/ # SDK hooks (manual)
│ │ ├── accountConfig.ts # CLOUDINARY_ACCOUNT_URL parsing
│ │ ├── cloudinaryAccountHook.ts # Auth injection (Basic auth)
│ │ ├── userAgentHook.ts # Build User-Agent string
│ │ └── registration.ts # Hook registration
│ ├── mcp-server/ # MCP server implementation
│ │ ├── server.ts # Main server (auto-generated)
│ │ └── tools/ # Generated tool wrappers
│ ├── funcs/ # API function implementations
│ └── models/ # Type definitions
├── .github/
│ └── workflows/ # CI/CD workflows
└── .speakeasy/ # Speakeasy configurationThis server generates a server.json that conforms to the official MCP Registry schema. You can publish automatically via your Speakeasy workflow or manually using the mcp-publisher CLI.
Add mcpRegistry to the publish block in your workflow.yaml:
targets:
my-mcp:
target: mcp-typescript
source: my-source
publish:
npm:
token: $NPM_TOKEN
mcpRegistry:
auth: github-oidcFollow the official publishing guide:
- Publish to npm:
npm publish --access public - Install the publisher CLI:
curl -sL "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher && sudo mv mcp-publisher /usr/local/bin/
- Authenticate:
mcp-publisher login github - Publish:
mcp-publisher publish
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:
- SDK hooks in
src/hooks/(auth, user agent) - Documentation improvements (this README, JSDoc on manual files)
- Bug reports and feature requests
Generated files (do not edit):
src/mcp-server/server.tssrc/mcp-server/tools/*.tssrc/funcs/*.tssrc/models/*.ts
When 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.
{ "mcpServers": { "CldProvisioning": { "command": "npx", "args": ["@cloudinary/account-provisioning-mcp", "start", "--mode", "dynamic"], // ... other server arguments } } }