Upload it once, deploy a version to an environment, and load it from a URL that never changes. Pick the way that suits you — every path ends at the same asset.
One command finds the assets in your code, uploads them, and rewrites the references.
Connect Claude Code, Cursor or VS Code, and ask for an upload, deploy or rollback in plain words.
Create, upload, deploy and roll back from any language. No SDK.
Create an environment, upload a file and deploy it — no code at all.
Images, video and documents bundled into an HTML, React or React Native project are the duplicates Umber removes. umber assets migrate takes them out of the bundle and points your code at one hosted copy.
# install (Node.js 20+) $ npm install -g @umbercloud/cli # sign in through your browser — no key to paste $ umber login ✓ Logged in as you@yourcompany.com env dev # see what would move, then move it $ umber assets scan $ umber assets migrate --dry-run $ umber assets migrate
scan and --dry-run change nothing. A real run backs up each file before editing it to .umber-backup/, and records what it migrated, so running it again only picks up what's new.
| Command | What it does |
|---|---|
| umber login | Opens your browser to sign in and creates a scoped platform API key for the CLI. Owners and Admins can log in this way.--api-key --domain --env (for CI) |
| umber whoami · umber logout | Show the active workspace, environment and platform; remove saved credentials. |
| umber env list | List your workspace's environments, so you know where you're deploying. |
| umber assets scan | Report assets, references and anything that needs a manual look. Uploads nothing, edits nothing. |
| umber assets migrate | Upload, deploy and rewrite references in one go.--dry-run --env --pin-versions --no-deploy --report out.md |
| umber assets upload <files…> | Upload and deploy specific files without touching your code. |
| umber assets list | List the assets in your workspace. |
| umber billing | This month's pay-as-you-go usage and estimate: storage, delivery, environments, API calls.--month 2026-10 |
No browser in a pipeline: use a platform API key with the CLI's scopes, and name the member the uploads belong to.
export UMBER_API_KEY=umber_sk_… export UMBER_DOMAIN_ID=… export UMBER_ENV=prod export UMBER_EMAIL=ci@yourcompany.com umber assets migrate --yes
Local paths become the asset's URL on your workspace's delivery domain. Upgrade the asset later and this line never changes.
// before <img src="./images/hero.png" /> // after <img src="https://adn.umbercloud.io/api/va /{workspace}/hero/dev/generic" />
Umber's MCP server connects Claude Code, Cursor, VS Code or your own agent to your workspace. The agent finds assets, uploads new versions, deploys them and rolls back, with your platform API key and nothing more.
# local: runs through the CLI, signs in with your browser $ npx @umbercloud/cli login $ claude mcp add umber -- npx -y @umbercloud/cli mcp # hosted: nothing to install, a platform API key $ claude mcp add --transport http umber \ https://mcp.umbercloud.io \ --header "Authorization: Bearer umber_sk_…" \ --header "X-Umber-Domain: {domainId}"
// Cursor, Claude Desktop and most other clients { "mcpServers": { "umber": { "command": "npx", "args": ["-y", "@umbercloud/cli", "mcp"] } } }
| Tools | What the agent can do |
|---|---|
| whoami · list_environments | See which workspace it's in, who it acts as, and the environments it can use. |
| search_assets · get_asset · get_asset_url | Find assets, see their versions and where each is deployed, and get delivery URLs. |
| upload_file | Create an asset or add a version to one. Uploading never deploys. |
| deploy_version · rollback_asset | Make a version what an environment's URL serves, or put the previous one back. |
| list_collections · get_collection | Browse collections and their items. |
| create_collection · add_collection_item | Create a collection and fill it. Adding to a collection that's already live asks you first. |
| get_usage | This month's usage and cost estimate. |
Same tools, same kind of key.
umber mcp): runs on your machine with Node.js 20+, signs in through your browser, and uploads any local file.https://mcp.umbercloud.io): nothing to install. Send a platform API key and your domain ID as headers. Suits agents in the cloud or CI, and clients that only take a URL.--read-only (local) or X-Umber-Read-Only: true (hosted) to allow reads only.Every call goes to https://api.umbercloud.io/api/v2/{domainId} with a platform API key as a bearer token. Create keys on the Organization page of the dashboard and give each one only the scopes it needs.
The logical asset that will hold every version. assetType 0001 is an image. Set secured to false to serve it from a public URL.
# once per shell export API=https://api.umbercloud.io/api/v2/$DOMAIN curl -X POST $API/va \ -H "Authorization: Bearer $UMBER_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "assetId": "hero-banner", "assetName": "Hero banner", "assetType": "0001", "secured": false, "createdBy": "you@yourcompany.com" }'
Each upload becomes the next version of the same asset. The response gives its versionId. Large files can use the two-step streamed upload instead.
curl -X POST "$API/va/hero-banner/versions?targetPlatformId=generic" \ -H "Authorization: Bearer $UMBER_API_KEY" \ -F "assetFile=@hero.png" \ -F "versionName=Hero banner v1" \ -F "createdBy=you@yourcompany.com" # 201 Created → { "version": 1, "versionId": "GEN1", … }
Deploy the version LIVE in the environment, then make it the DEFAULT — the version the environment's URL serves.
# 1) add it to prod curl -X POST "$API/va/hero-banner/versions/GEN1/deploy?targetPlatformId=generic" \ -H "Authorization: Bearer $UMBER_API_KEY" -H "Content-Type: application/json" \ -d '{ "envId": "prod", "intent": "LIVE", "createdBy": "you@yourcompany.com" }' # 2) make it what prod serves curl -X POST "$API/va/hero-banner/versions/GEN1/deploy?targetPlatformId=generic" … \ -d '{ "envId": "prod", "intent": "DEFAULT", "updatedBy": "you@yourcompany.com" }'
A plain GET — from a browser, a mobile app or a game engine. When you promote version 2 later, this URL serves it with no change to your code.
<img src="https://adn.umbercloud.io/api/va/$DOMAIN /hero-banner/prod/generic"> # pin a specific version instead of the environment's default …/hero-banner/prod/generic?version=1
Promoted the wrong version? Put the previous default back, and every app follows — no release.
curl -X POST "$API/va/hero-banner/versions/rollback?targetPlatformId=generic" \ -H "Authorization: Bearer $UMBER_API_KEY" -H "Content-Type: application/json" \ -d '{ "envId": "prod", "updatedBy": "you@yourcompany.com" }'
umber_sk_…) as Authorization: Bearer; the old environment download keys in an apikey header are not accepted. See API keys and authentication.From zero to a live asset in an environment, using the dashboard.
Login, migration, uploads, environments and usage from your terminal.
Local and hosted setup, scopes, and what each tool does.
Base URL, authentication, errors and every endpoint.
Live, offline and default — how a version reaches an environment.
Group several files, such as a product's images, video and specs, and fetch them as one unit.
Promote, revert and compare versions across environments.
Why one copy per asset beats a copy per app and environment.