Skip to content
Image Asset Server

Image Asset Server CLI

The image-asset-server command searches every source from a terminal, downloads images with their credits, picks a whole set of images from a list of slots, runs the MCP server over stdio for desktop agents, and starts the HTTP server. It is the same code that runs https://image.shep.bot, and needs no API keys.

npx image-asset-server search "4k vertical mountain lake"

Commands

image-asset-server search <query> [--category art.painting] [--style photo] [--orientation portrait]
                     [--min-resolution 1080] [--transparent] [--format svg,png] [--commercial] [--free]
                     [--providers nasa,met,wikimediacommons] [--limit N]
image-asset-server download <id> [--width 1920] [--format jpg] [--dir ./images]
image-asset-server set <slots.txt | "slot 1; slot 2; ..."> [--width 1600] [--orientation landscape]
                     [--style photo] [--download] [--dir ./images/sets/<name>] [--name landing]
image-asset-server mcp     # MCP server over stdio, with download_image writing to ./images
image-asset-server serve   # HTTP API + website + MCP at /mcp on port 8787

Queries understand size, orientation, format and transparency, so "4k vertical mountain lake" filters like --min-resolution 2160 --orientation portrait, and "rocket icon svg" keeps only vector icons. --commercial keeps only images whose licence allows commercial use (verdict yes or yes-with-credit).

search prints the filters it read from your query, then ranked results (score, licence verdict and image id; then the title with its category, pixel size, orientation and year; then its page on the source), followed by one status line per source. A * after the verdict marks editorial images (people, insignia or brands without releases):

$ npx image-asset-server search "crab nebula" --limit 2
0.92  yes-with-credit* nasa:PIA03606
      Crab Nebula Mosaic (space · 3864×3864 · 4K+ 2160+ · square · 2005)
      https://images.nasa.gov/details/PIA03606
…

  * editorial: people, insignia or brands without releases; not for ads.

Sources:
  nasa               ok       2
  met                ok       0
  unsplash           link     0  https://unsplash.com/s/photos/crab-nebula

Download

npx image-asset-server download "nasa:PIA03606" --width 1920

Saves the smallest file at least --width pixels wide (a 1920 px copy rather than a huge original) into ./images/<category>/, and adds the image to ATTRIBUTION.md and credits.json in that folder. It prints the licence and the credit line.

Image set

cat > slots.txt <<'TXT'
Hero: misty forest at sunrise (1920px)
3 icons: upload, share, settings
Background: paper texture
Botanical illustration of a fern
TXT
npx image-asset-server set slots.txt --width 1600 --name landing --download

Picks one image per slot (commercial-safe unless you pass --non-commercial), prints the plan with a note for each slot that will be cropped, upscaled or is editorial, and writes images.json, credits.html, download.sh, ATTRIBUTION.md and credits.json into ./images/sets/<name>/. With --download the picks are saved into its images/ folder and the exports use those local files; without it they point at the sources (run sh download.sh later).

Run it with Docker (no install)

docker run --rm ghcr.io/arielshad/image-asset-server node dist/cli.js search "van gogh" --commercial

As a local MCP server that writes downloads into your project:

docker run -i --rm --user "$(id -u):$(id -g)" -v "$PWD/images:/app/images" \
  ghcr.io/arielshad/image-asset-server node dist/cli.js mcp

Run it from source

git clone https://github.com/arielshad/image-asset-server
cd image-asset-server && npm ci && npm run build:server
node dist/cli.js search "vintage map of paris" --commercial

Environment

Variable Purpose
IMAGE_SERVER_PROVIDERS Comma list to search only some sources (e.g. nasa,met,artic).
IMAGE_DOWNLOAD_DIR Where download, set and mcp downloads go (default ./images).
IMAGE_SERVER_USER_AGENT User-Agent sent to sources. Wikimedia requires contact details in it.
NODE_USE_ENV_PROXY Set to 1 so Node honours HTTPS_PROXY.

See Self-hosting for every server setting.

AI agent? This page is also available as markdown.