Skip to main content
Glama

upres-cli

npm version PyPI version License: MIT GitHub stars

Official CLI + SDK for upres.ai — AI image and video upscaling. One API, 6 specialist models (Flare, Prism, Lumen, Mirage, Motion, Motion X), up to 8K output.

$ upres upscale photo.jpg --model flare --scale 4
Submitting job... model=flare
Job created: 550e8400-e29b-41d4-a716-446655440000 (status: pending)
Waiting for result.......
Downloading to photo_upscaled.jpg... done.

Result: photo_upscaled.jpg

Why we built this

  • Topaz is $200/yr, desktop-only, no API, no automation

  • Upscayl is great for one-offs but can't handle bulk exports or CI pipelines

  • Every other SaaS upscaler either watermarks your output, caps resolution at 2K, or charges per image with no monthly plan

upres.ai gives you a clean REST API, 6 specialist models, batch processing, and predictable pricing starting at $9/mo on the Creator launch deal.


Related MCP server: Ideogram MCP Server

Quickstart

Node.js

npx upres-cli upscale photo.jpg

Or install globally:

npm install -g upres-cli
upres upscale photo.jpg --model lumen --scale 8 --output photo_8k.jpg

Python

pip install upres-ai
upres upscale photo.jpg --model flare --scale 4

Authentication

  1. Sign up at upres.ai (free — 3 upscales/month)

  2. Go to upres.ai/account/api-keys

  3. Generate a key — it's shown once

export UPRES_API_KEY=upres_yourkey

Or save permanently:

mkdir -p ~/.config/upres
echo '{"apiKey":"upres_yourkey"}' > ~/.config/upres/config.json

Key resolution order: --api-key flag → UPRES_API_KEY env var → ~/.config/upres/config.json


Commands

# Upscale a single image (local file or URL)
upres upscale photo.jpg --model flare --scale 4
upres upscale photo.jpg --model lumen --scale 8 --output out.jpg
upres upscale https://example.com/photo.jpg --model prism

# Upscale video (AI-generated video from Sora, Kling, Runway etc.)
upres upscale clip.mp4 --model motion --scale 4

# Batch upscale a folder
upres batch ./photos/ --model flare --output ./upscaled/ --concurrency 5

# List available models
upres models

# List recent jobs
upres jobs --limit 20 --status completed

# Account / quota info
upres account

Node.js SDK

import { UpresClient } from "upres-cli";

const client = new UpresClient(); // reads UPRES_API_KEY from env

// Upscale a local file
const job = await client.createJobFromFile("photo.jpg", {
  model: "flare",
  scale: 4,
});

// Wait for completion
const completed = await client.waitForJob(job.id);

// Download result
await client.downloadResult(completed, "photo_4k.jpg");
console.log("Done:", completed.result_url);

Files over 50 MB are automatically uploaded via TUS resumable protocol.


Python SDK

from upres import UpresClient

with UpresClient() as client:                        # reads UPRES_API_KEY from env
    job = client.create_job_from_file(
        "photo.jpg",
        model="flare",
        scale=4,
    )
    completed = client.wait_for_job(job["id"])
    client.download_result(completed, "photo_4k.jpg")
    print("Done:", completed["result_url"])

The Python SDK uses httpx — async-ready, no heavy dependencies.


Examples

Example

What it does

batch-upscale-folder.js

Upscale all images in a folder with configurable concurrency

restore-photo-folder.py

Restore old/scanned photos using Recraft Crisp Upscale

ecommerce-pipeline.js

Product image pipeline: raw shots → 4K → publish-ready

lightroom-export-hook.md

Auto-upscale Lightroom exports via post-processing hook

figma-plugin-stub.md

Figma plugin integration guide


Models

6 specialist models across image and video. Each one tells you up front whether it invents detail or leaves your file alone.

Model

Kind

Best for

flare

Image

Everyday photos, fastest default

prism

Image

Text, logos, product shots — keeps edges true

lumen

Image

Maximum detail recovery for print, up to 8x

mirage

Image

Invents new detail — art and hero images

motion

Video

Fast 4K finish for Sora/Kling/Runway clips

motion-x

Video

Cinema-grade, for film and commercials

Full model catalogue: upres.ai/models · Live spec: api.upres.ai/v1/openapi.json


Pricing

Plan

Price

Includes

API

Watermark

Free

$0

3 upscales/mo

Yes

Creator

$9/mo (launch deal, was $19)

50 stills + 20 min 4K video/mo

No

Studio

$39/mo

250 stills + 90 min 4K video/mo

Yes

No

Studio tier unlocks the full API, batch processing, and no output watermark.

Compare plans → · vs. Topaz → · vs. Upscayl →


MCP (Claude, Cursor, Hermes)

claude mcp add upres -- npx -y github:auroracapital/upres-cli mcp

Or in claude_desktop_config.json / Cursor:

{
  "mcpServers": {
    "upres": {
      "command": "npx",
      "args": ["-y", "github:auroracapital/upres-cli", "mcp"],
      "env": { "UPRES_API_KEY": "upres_yourkey" }
    }
  }
}

Tools: upres_list_models, upres_get_credits, upres_upscale_image, upres_upscale_video, upres_get_job.


Free tier for open-source projects

If you're building something open-source on top of the API, email support@upres.ai with your repo link. We offer 500 ops/month for qualifying OSS projects.


Error handling

The SDK handles these errors automatically:

Status

Behavior

401

Prints API key error + link to key management, exits

402

Prints quota exceeded + link to pricing, exits

429

Prints rate limit message (60 req/min), exits

5xx

Throws UpresError with message

In Python: raises AuthError, QuotaExceededError, or UpresError.


Contributing

See CONTRIBUTING.md. Tests run with:

# Node
npm test

# Python
pip install -e ".[dev]"
pytest tests/test_client.py -v

License

MIT — see LICENSE

Available Tools

5 tools
upres_get_creditsA

Show recent job count for the authenticated UpRes API key as a quota proxy.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral disclosure burden. It conveys the authenticated context and the quota-proxy framing, but it does not define what 'recent' means, what the response looks like, or how the count relates to credits.

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 compact, front-loaded sentence with no filler. Every word adds meaning, and the core purpose is immediately clear.

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?

For a no-parameter status/quota tool, the core purpose is adequately conveyed. However, with no output schema or annotations, the agent is left without the return format or the exact time window behind 'recent', leaving minor ambiguity.

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?

The tool has zero parameters, so the description has no parameter details to add; the schema already covers everything. The authentication context mentioned is useful but not a parameter semantic.

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 states a specific verb ('Show'), a precise resource ('recent job count for the authenticated UpRes API key'), and its conceptual role ('quota proxy'). This clearly distinguishes it from sibling tools like upres_upscale_image or upres_get_job.

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 description implies the use case: checking quota/credit consumption via recent job count. However, it does not explicitly state when to prefer this tool over alternatives, nor does it mention exclusions or prerequisites beyond authentication.

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

upres_get_jobA

Get status and result_url of an UpRes job by id.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYesJob UUID returned by an upscale tool

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the whole behavioral burden. It states that the tool retrieves status and result_url, which implies a read-only operation, but it does not mention error behavior, whether the job must be finished, or if it can be polled repeatedly. The core behavior is clear, but deeper transparency is missing.

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?

The description is one short sentence with no filler. The verb and resource are front-loaded, and every word earns its place. It is an exemplary concise definition for a simple tool.

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?

For a one-parameter getter with no output schema, the description names the two return fields (status, result_url) and the input, which is mostly sufficient. It could enrich the context by mentioning that status may be pending or completed, but that is inferable and minor given the tool's simplicity.

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 job_id is fully described in the schema as a UUID from an upscale tool. The description merely repeats 'by id' and adds no extra meaning 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.

Purpose5/5

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

The description uses a specific verb ('Get'), a concrete resource ('status and result_url of an UpRes job'), and an identifier ('by id'). It is clearly distinct from sibling tools that manage models, credits, or submit upscale jobs, so an agent can separate it without opening the schema.

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 description does not explicitly state when to call this tool as opposed to the upscaling tools; it only implies use after a job is created. The schema parameter description says the job_id comes from an upscale tool, but that is in the schema, not the description. There is no when-to-use or exclusions, only an implied context.

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

upres_list_modelsA

List UpRes upscale models (flare, prism, lumen, mirage, motion, motion-x) with use cases.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

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

With no annotations provided, the description carries the burden of behavioral disclosure. It correctly implies a read-only listing operation, but it does not mention whether results are cached, require authentication, or are limited in any way. The behavior is simple enough that this is a minor gap.

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 succinct sentence, immediately naming the resource and the model list. No redundant words or filler, and every part adds value.

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?

For a zero-parameter listing tool with no output schema, the description adequately states what it returns (models and their use cases). It could mention ordering or formatting, but nothing essential is missing for an agent to use it correctly.

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?

The tool has zero parameters and schema coverage is 100%, so there is nothing for the description to add about parameters. Baseline 4 applies per the rubric.

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 states a precise verb ('List') and resource ('UpRes upscale models'), and enumerates the exact model names. This clearly distinguishes it from the sibling tools like upres_upscale_image and upres_get_credits.

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 phrase 'with use cases' implies the tool is for deciding which model to use, but it does not explicitly say when to call it or how it relates to the upscale/credit/job tools. No explicit alternatives or exclusions are given.

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

upres_upscale_imageB

Submit an image upscale job from a public URL. Models: flare, prism, lumen, mirage.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelNoImage model. Default flare.
scaleNoScale multiplier. Default 4.
image_urlYesPublic HTTPS URL of the image

TDQS

B3.4/5.0
Behavior2/5

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

With no annotations provided, the description must carry behavioral disclosure. It communicates that the call submits a job (implying asynchronous work), but it does not mention what the response contains, that the caller must poll with upres_get_job, or any constraints beyond a public URL. For a job-submission tool with zero annotation coverage, this is a meaningful gap.

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?

The description is two short sentences with no filler. The core action and requirement are front-loaded, and the model list is presented compactly.

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

Completeness2/5

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

Despite simple parameters, this is an asynchronous job submission with no output schema and no annotations. The description does not explain the return value, how to track the job, or the relationship to upres_get_job, leaving an agent without enough context to know what happens after invoking 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%: every parameter, including enum values and defaults, is documented in the schema. The description's model list is a duplication of the enum and adds no semantic depth, so the baseline 3 is appropriate.

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 opens with a specific verb and resource: 'Submit an image upscale job.' It also names the available models, and the word 'image' distinguishes this from the sibling upres_upscale_video. This is enough for an agent to know what operation is being offered.

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 description gives useful context by requiring a public URL and listing models, but it does not explicitly say when to choose this over siblings such as upres_upscale_video, upres_get_job, or upres_get_credits. Usage guidance is implied rather than stated.

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

upres_upscale_videoA

Submit a video upscale job from a public URL. Models: motion, motion-x.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelNoVideo model. Default motion.
scaleNoScale multiplier. Default 4.
video_urlYesPublic HTTPS URL of the video

TDQS

A3.6/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. 'Submit a job' implies asynchronous behavior, but the description does not disclose that it likely returns a job ID, that it consumes credits, or that results must be polled with get_job. This is a meaningful transparency gap for a job-submitting tool.

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?

The description is two short sentences with no filler. It front-loads the action and resource, then lists model options. Every word earns its place.

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

Completeness2/5

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

With no output schema and no annotations, the description should explain what happens after submission. It omits the async nature, the likely job ID return value, the need to poll with get_job, and potential credit usage. These are essential for an agent to correctly handle the tool's result.

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?

The schema already documents all three parameters with descriptions, enums, and defaults, so description-level parameter information is not strictly needed. The description adds 'Models: motion, motion-x,' but this only repeats schema content. Baseline 3 is appropriate given 100% schema coverage.

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 states a specific verb ('Submit') and resource ('video upscale job'), and clarifies the required input ('public URL'). This clearly distinguishes it from the sibling image tool upres_upscale_image and other upres 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 description gives clear context: this is for video upscaling jobs from a public URL, with available models listed. It does not explicitly name alternatives or exclusions, but the video-vs-image distinction is obvious from the tool name and description, so the usage context is clear.

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. 5 tool updatesv0.2.0
    • First observedupres_get_credits
    • First observedupres_get_job
    • First observedupres_list_models
    • First observedupres_upscale_image
    • First observedupres_upscale_video

TDQS

A4/5.0

Scored across 5 tools

Disambiguation5/5

Each tool maps to a unique action or resource: model discovery, quota check, image upscaling, video upscaling, and job retrieval. The two upscale tools are clearly separated by media type and supported models, so there is no real ambiguity.

Naming Consistency5/5

All tool names share the upres_ prefix and follow a consistent verb_noun pattern: list_models, get_credits, upscale_image, upscale_video, get_job. This makes the tool set predictable and easy to navigate.

Tool Count5/5

Five tools is a well-scoped set for an upscaling API: model discovery, quota monitoring, two job submission variants, and job status/result retrieval. Each tool earns its place without redundancy.

Completeness5/5

The core workflow is fully covered: list available models, submit image or video jobs from public URLs, poll job status, and retrieve results. There are no obvious dead ends or missing operations required for the primary use case.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers