Quick Start

Argus is an AI-native media library. The fastest way in is the CLI and MCP — you can get an agent working against a real library without writing a single HTTP request. API-first? Skip to the API Quickstart.

Everything below needs an API key. Grab one first — it takes about a minute: Get an API key. Then export ARGUS_API_KEY=ak_yourkey so the CLI and MCP pick it up.

1. Point the CLI at a library

Install the CLI, then choose your starting point:

shell
npm install -g argus-media-cli
argus-media-cli login

Joining an existing library? Pull its design context into your working folder. init writes an .argus/ folder with the project's palette, type, and brand notes so your agent has real context to work from — zero credits, read-only.

shell
argus-media-cli init brand-2019

Onboarding a brand folder? Push it in one shot. sync walks the folder, skips junk and duplicates, uploads the rest, and drops the same agent context on the way out.

shell
argus-media-cli sync ./legacy-brand-folder --dry-run   # preview the plan
argus-media-cli sync ./legacy-brand-folder --project brand-2019

2. Wire up your agent

Give your agent live access to the library over MCP, and install the Argus skills so it knows the workflows.

shell
# hosted MCP — full tool set, always current
npx add-mcp https://argus.build/mcp

# install the agent skills into ~/.claude/skills
npx argus-media-cli skills install

See MCP Setup for editor config and the tool list. Restart your agent session, then trigger a skill explicitly for determinism: "use the argus-brand-onboarding skill to onboard this brand folder into Argus."

3. Explore the library

Ask your agent to scope the library, then search it. Under the hood these map to get_library_overview and search_assets — or run them from the terminal:

shell
argus-media-cli list --project brand-2019
argus-media-cli search "warm golden-hour hero shot"

That's the whole loop: point at a library, wire up the agent, search. No HTTP required. The API Reference below covers the raw REST surface for when you need it.

Get an API Key

Every request — CLI, MCP, or raw REST — authenticates with a Bearer API key.

Create a key

  1. Go to argus.build/ui
  2. Sign in with a magic link (email-based, no password)
  3. Open Settings
  4. Click Create API Key

Then hand it to whichever surface you're using:

shell
# CLI and MCP read it from the environment
export ARGUS_API_KEY=ak_yourkey

# raw REST passes it as a Bearer token
curl https://argus.build/assets -H "Authorization: Bearer ak_yourkey"

Session auth (cookie-based) is used by the web UI. API keys are for agents and scripts. You can also mint keys programmatically with the create_api_key MCP tool or argus-media-cli keys create.

Command Line

The argus-media-cli package gives you terminal access to onboard folders, pull design context, search, and manage assets. It's the front door for both humans and agents.

shell
npm install -g argus-media-cli
argus-media-cli login

login saves your key; you can also set ARGUS_API_KEY (and ARGUS_BASE_URL to self-host) in the environment. Add --json to any command for machine-readable output.

init — pull a project

Direction: Argus → your folder. Bind the current folder to an existing project and pull its design context so an agent has real brand material to work from. init writes an .argus/ folder — a DESIGN-CONTEXT.md (palette, typography, brand notes) plus an AGENTS.md primer — and is idempotent and zero-credit.

shell
argus-media-cli init brand-2019

Called with no project — or an unknown one — init lists the available projects and exits non-zero (handy in scripts with --json). Pass --no-agent-setup to write .argus/ context but skip the skills/MCP prompt.

sync — push a folder

Direction: your folder → Argus. Onboard an entire folder in one shot — perfect for migrating a legacy brand folder. sync walks the folder recursively, skips junk and duplicates, uploads the rest sequentially, prints a manifest, and drops the same .argus/ agent context on the way out.

shell
argus-media-cli sync ./legacy-brand-folder --dry-run
argus-media-cli sync ./legacy-brand-folder --project brand-2019 --tags legacy

Uploads JPEG/PNG/GIF/WebP/SVG up to 20 MB. Skips junk files (.DS_Store, Thumbs.db, hidden dotfiles), unsupported types, oversize files, and duplicates (by content hash, and by filename + size already in the target project). The project defaults to the kebab-cased folder name. Flags: --dry-run previews the plan, --json emits a structured manifest, --yes proceeds past a credit-shortfall warning unattended, --no-agent-setup skips the context drop.

Brand-fit search

Rank search and list results by how closely each asset's colors match a target brand palette. Pass --palette-fit a style-guide id or a project name; every result gains a fitScore (0–1) and off-palette assets sort last. Add --min-fit to drop anything below a threshold.

shell
argus-media-cli search "hero background" --palette-fit brand-2019 --min-fit 0.6

The same ranking is available on the REST endpoint (GET /assets?paletteFit=…) and the search_assets MCP tool (palette_fit).

Curator Mode — control what agents retrieve

Every asset carries an agentRetrievable flag. Retrievable assets (the default) are visible to agent-facing MCP retrieval; hidden assets stay on the human/UI path but are invisible to search_assets, get_asset, and get_library_overview. Curate work-in-progress, off-brand, or internal assets out of your agents' reach without deleting them. Toggling is an editor+ action; a viewer key can never retrieve a hidden asset by any means.

shell
argus-media-cli curator status
argus-media-cli curator hide "./drafts/*" --note "work in progress"
argus-media-cli curator approve logo-final.svg
argus-media-cli sync ./new-drop --project brand-2019 --curator-default hidden

Globs resolve client-side against local filenames, then look up ids via the catalog (filename + --project) — renamed or deduped files may not resolve, so pass explicit ids there. REST: PATCH /assets/:id/curator, POST /assets/curator/bulk, GET /assets/curator/summary, GET /assets/:id/curator/history, and ?agentRetrievable=true|false on GET /assets (editor+ only for false). Admins set the workspace default for new uploads with PUT /workspaces/:id/curator-default; changing it never touches existing assets.

Install the agent skills

Argus ships two Claude agent skillsargus (the API/MCP operating manual) and argus-brand-onboarding (the end-to-end legacy-folder → brand-system arc). They're bundled with the CLI; install them into your Claude skills directory in one shot:

shell
npx argus-media-cli skills install

Files land at ~/.claude/skills/<name>/SKILL.md (override with --dir). It's idempotent — re-running overwrites with newer content. Restart your Claude/agent session so it picks the skills up, then trigger one explicitly for determinism: "use the argus-brand-onboarding skill to onboard this brand folder into Argus." Brand onboarding's cohesion, style-guide, and creative-direction stages run through the MCP server.

MCP Setup

Give your agent direct access to Argus over the Model Context Protocol. There are two ways to connect.

Hosted server (recommended)

Connect to the hosted MCP endpoint at https://argus.build/mcp. It exposes the full tool registry, stays current automatically, and needs nothing installed. Authentication is your Bearer API key.

shell
npx add-mcp https://argus.build/mcp

Or configure it by hand — for example in claude_desktop_config.json:

json
{
  "mcpServers": {
    "argus": {
      "url": "https://argus.build/mcp",
      "headers": { "Authorization": "Bearer ak_yourkey" }
    }
  }
}

Local stdio server

Prefer a locally-run server — or need to upload files straight off your disk? npx argus-media-mcp runs over stdio and adds argus_upload (upload a local file by path, which the hosted server can't reach). Set your key with ARGUS_API_KEY.

json
{
  "mcpServers": {
    "argus": {
      "command": "npx",
      "args": ["argus-media-mcp"],
      "env": { "ARGUS_API_KEY": "ak_yourkey" }
    }
  }
}

Set ARGUS_BASE_URL to override the default https://argus.build if self-hosting. The stdio package ships the core toolset plus argus_upload; the hosted endpoint carries the newest tools (library overview, palette adaptation, cross-project links, design-context export). When in doubt, use the hosted server.

MCP Tools

The hosted server exposes the full registry below. Required parameters are highlighted; everything else is optional.

Search & library

search_assets
Search and page the library by description, mood, tags, or use-cases. Returns a paginated envelope { total, limit, offset, hasMore, assets }. detail is summary (default, compact) or full; palette_fit re-ranks by brand-palette fit.
query? · project? · status? · tags? · approved_only? · palette_fit? · min_fit? · detail? · limit? · offset?
get_asset
Get full asset details including AI analysis, tags, colors, EXIF, and (for SVGs) a vector block. linkedProjects lists any cross-project links.
asset_id
get_library_overview
One-call read model of the whole library — totals, counts by project / media type / status / approval, top tags, and recent uploads. Call this first to scope a library before searching.
top_tags? · recent?

Upload & lifecycle

upload_from_url
Upload an image from a URL. Fetched, stored, and auto-analyzed.
url · filename? · project? · tags? · uploaded_by? · allow_duplicate?
argus_upload · stdio package only
Upload a local file by path. Stored and auto-analyzed. Only available on the local npx argus-media-mcp server.
file_path · project? · tags? · uploaded_by?
analyze_asset
Trigger AI analysis on an existing asset. Generates description, mood, colors, use-cases, tags. Costs 1 credit.
asset_id
delete_asset
Soft-delete an asset. Hidden from listings and recoverable within 30 days, then permanently purged.
asset_id
recover_asset
Recover a soft-deleted asset back to the active library. Only works within the 30-day recovery window.
asset_id

Brand & design

generate_style_guide
Synthesize a unified style guide from multiple analyzed assets. Optionally extend an existing guide.
asset_ids · name? · guide_id?
generate_color_palette
Generate an extended color palette from an analyzed asset's dominant colors.
asset_id
generate_creative_direction
Generate typography, color, and layout direction from one or more analyzed assets.
asset_id? · asset_ids? · purpose? · audience? · tone? · style?
suggest_typography
Generate typography pairings based on an analyzed asset.
asset_id · purpose?
compare_assets_cohesion
Evaluate visual cohesion across two or more analyzed assets — surfaces outliers for a brand system.
asset_ids · purpose? · brand_name?
export_design_context
Export a persisted style guide as impeccable-compatible ## Design Context markdown (palette, typography, brand voice, anti-references). Free. See Design Context export.
guide_id · anti_reference_tags?
adapt_svg_to_palette
Recolor an SVG so every painted color snaps to the nearest color in a target brand palette. Deterministic, zero credits; saves a derived asset. See Recolor an SVG.
asset_id · palette_fit · save?

Cross-project links

link_asset_to_project
Link an asset into an additional project without copying it. Non-destructive; the origin project is unchanged. See Cross-project links.
asset_id · project
unlink_asset_from_project
Remove a cross-project link. The asset and its origin project are never affected.
asset_id · project

Moderation & account

moderate_asset
Run the brand-policy / moderation check on an asset. Returns pass / flag / block; a block prevents approval.
asset_id
set_asset_approval
Move an asset through the approval state machine (pending / approved / rejected). Requires editor role.
asset_id · status · note?
get_usage
Check workspace credits, asset count, and tier limits.
no parameters
create_api_key
Create a new API key for the workspace. The full key is returned only once — store it securely.
name
get_curator_status
Curator Mode summary: total assets, how many are agent-retrievable, how many are hidden from agent retrieval, and how many hidden assets have no rationale note. Requires admin role. See Curator Mode.
no parameters

Library Overview

Scope a whole library in one call instead of paging through search results. GET /library/overview returns totals (asset count + storage bytes), counts by project, media type, status, and approval state, the top tags with counts, and a compact list of recent uploads. It's the fastest way for an agent to decide where to look before it searches. Also available as the get_library_overview MCP tool.

MethodPathDescription
GET /library/overview Library read model in one call. Query: top_tags (default 20), recent (default 10).
shell
curl "https://argus.build/library/overview?top_tags=15&recent=5" \
  -H "Authorization: Bearer ak_yourkey"

Design Context Export

Turn a persisted style guide into portable, agent-ready brand context. GET /style-guides/:id/design-context renders an impeccable-compatible ## Design Context markdown block — palette (as OKLCH), typography, brand voice, layout-implied spacing and radius under a ### Design Tokens sub-block, plus anti-references drawn from cohesion outliers. Drop it into an .impeccable.md, hand it to /impeccable, or paste it into an agent prompt. Free, no credits.

MethodPathDescription
GET /style-guides/:id/design-context Render a style guide as ## Design Context + ### Design Tokens markdown. MCP: export_design_context.

The .argus/DESIGN-CONTEXT.md that argus-media-cli init writes is built from the same export, so a freshly-initialized folder already carries the project's design context.

Recolor an SVG to a Palette

Snap an SVG's colors to a target brand palette. POST /assets/:id/adapt-palette rewrites every painted color to the nearest color in the palette — a deterministic string transform over the SVG source, zero AI credits. currentColor, none/transparent, and url(#…) paint-server refs are preserved; colors it can't resolve are left in place and reported. By default it saves the result as a new derived asset carrying derivedFrom provenance — the source is never modified. Pass save: false to preview without persisting.

MethodPathDescription
POST /assets/:id/adapt-palette Body: { paletteFit: <style-guide id | project name>, save? }. Returns the recolored source, the color mappings applied, and (when saved) the derived asset. MCP: adapt_svg_to_palette.
shell
curl -X POST https://argus.build/assets/ASSET_ID/adapt-palette \
  -H "Authorization: Bearer ak_yourkey" \
  -H "Content-Type: application/json" \
  -d '{"paletteFit": "brand-2019", "save": true}'

API Quickstart

Prefer raw HTTP? The full REST surface is below. This is the classic upload → poll → search loop with curl. Everything the CLI and MCP do is built on these endpoints.

1. Upload

shell
curl -X POST https://argus.build/assets/upload \
  -H "Authorization: Bearer ak_yourkey" \
  -F "file=@product-photo.jpg" \
  -F "project=spring-campaign" \
  -F "tags=product,lifestyle"

2. Check status

shell
curl https://argus.build/assets/ASSET_ID \
  -H "Authorization: Bearer ak_yourkey"
# status: "pending" → "ready" once analysis completes

3. Search

shell
curl "https://argus.build/assets?q=lifestyle+product" \
  -H "Authorization: Bearer ak_yourkey"

Assets

Upload, search, analyze, and delete media assets. Requires Bearer API key.

MethodPathDescription
POST /assets/upload Upload image. Multipart form, field: file. Max 20 MB. Auto-analyzed. Video (video/*) also accepted for accounts with video uploads enabled, capped at 10 MB.
POST /assets/upload-from-url Upload from URL. Body: { url, filename?, project?, tags?, uploadedBy? }
POST /assets/:id/analyze Trigger AI analysis on existing asset. Costs 1 credit.
GET /assets List/search. Query: q, project, status (status=deleted lists soft-deleted), tags, limit, offset, paletteFit + minFit (brand-fit ranking). Returns a list envelope.
GET /assets/:id Get single asset with full analysis. Returns { asset } (SVGs include a vector block; linkedProjects lists cross-project links).
POST /assets/:id/adapt-palette Recolor an SVG to a target brand palette. Body: { paletteFit, save? }. Deterministic, zero credits.
GET /assets/:id/links List the projects this asset is linked into.
POST /assets/:id/links Link the asset into an additional project. Body: { project }
DELETE /assets/:id/links/:project Remove a cross-project link. Origin project untouched.
PATCH /assets/:id Update metadata. Body: { tags?, project?, uploadedBy? } — tags replace (not merge).
DELETE /assets/:id Soft-delete asset. Recoverable for 30 days, then permanently purged. Returns { id, status, deletedAt, recoversAt }
POST /assets/:id/recover Recover a soft-deleted asset within the 30-day window. Returns the restored asset.

Soft delete & recovery: DELETE /assets/:id is a soft delete. The asset is hidden from default listings but can be recovered within 30 days via POST /assets/:id/recover. To list deleted assets, pass status=deleted on GET /assets. After 30 days, a scheduled purge permanently removes the asset and file.

Search & Response Envelopes

List and search responses are wrapped in a pagination envelope — check hasMore and page with offset rather than assuming the first page is the whole library.

json
// GET /assets  → list envelope
{ "assets": [ /* ... */ ], "total": 214, "limit": 50, "offset": 0, "hasMore": true }

// GET /assets/:id  → single-asset envelope
{ "asset": { /* ... */ } }

Detail levels

The search_assets MCP tool accepts a detail parameter so browsing stays cheap at scale:

  • summary (default) Compact per-asset fields — id, filename, project, tags, and a one-line description. Ideal for scanning a large library.
  • full The complete asset object, including the full analysis block.

Search semantics

The q parameter performs keyword matching across AI-generated fields — not vector search. Your query is split into terms, each matched (case-insensitive substring) against filename, description, rich description, mood, tags, and use-cases; results rank by how many terms match. It feels semantic because the fields being searched are AI-generated. Use descriptive, natural-language terms for best results.

Auth

Email-based magic link authentication. No password required. All routes are public.

MethodPathDescription
POST /auth/magic Request magic link. Body: { email }
GET /auth/magic/verify Verify magic link token. Query: token
POST /auth/magic/verify Verify magic code. Body: { email, code }
POST /auth/logout Clear session cookie.
GET /auth/me Current user info and workspace list.

Workspaces

Manage workspaces and team members. Requires session cookie (web UI auth).

MethodPathDescription
POST /workspaces Create workspace.
GET /workspaces List your workspaces.
PUT /workspaces/:id/switch Switch active workspace.
GET /workspaces/:id/members List workspace members.
POST /workspaces/:id/invites Create invite link. Admin only.
DELETE /workspaces/:id/members/:userId Remove member. Admin only.

API Keys

Create and revoke API keys for programmatic access. Requires session cookie.

MethodPathDescription
GET /keys List active API keys for current workspace.
POST /keys Create new API key.
DELETE /keys/:id Revoke API key.

Billing

Subscription upgrades and credit pack purchases via Stripe. Checkout routes are public; usage requires auth.

MethodPathDescription
POST /checkout/session Create Stripe checkout for tier upgrade. Body: { tier }
POST /checkout/credits Buy credit pack. Body: { pack: "100"|"500"|"2500" }
GET /usage Credits remaining, asset count, and tier info. Requires Bearer token.

Response Shape

Every asset returned from the API includes this structure once analysis is complete.

json
{
  "id": "uuid",
  "filename": "photo.jpg",
  "mimeType": "image/jpeg",
  "url": "https://...",
  "status": "ready",
  "tags": ["outdoor", "nature"],
  "analysis": {
    "description": "A field of wildflowers at golden hour",
    "richDescription": "Detailed paragraph...",
    "mood": "serene",
    "dominantColors": [{ "hex": "#f5c842", "name": "golden yellow" }],
    "useCases": ["hero image", "seasonal campaign"],
    "tags": ["wildflowers", "golden hour", "landscape"]
  }
}

Field Notes

  • tags Merged array of user-supplied tags and AI-generated tags (deduplicated).
  • analysis.tags AI-generated tags only.

Error Responses

All error responses return a JSON object with an error string:

json
{ "error": "Description of what went wrong" }
StatusMeaning
400Bad request — missing or invalid parameters
401Unauthorized — missing or invalid API key
404Not found — asset or resource does not exist
429Tier limit reached — upgrade plan or wait for monthly reset
500Internal server error

Rate Limits

Argus uses tier-based limits (asset count and credits per month) rather than per-IP rate limiting.

  • When limits are hit The API returns 429 with { "error": "...", "upgrade": true }. Check GET /usage for current consumption.
  • No per-IP throttling There is no request-per-second or per-IP rate limit. You can call the API as fast as needed within your tier.
  • Monthly reset Credit usage resets at the start of each billing cycle. One-time credit packs do not expire.

agents.txt

Machine-readable capability declaration at /agents.txt. Plain text, no auth required. Contains the full API reference, MCP tools, pricing, and limitations in a format optimized for LLM consumption.

Supported Formats

  • AI-analyzed formats JPEG, PNG, GIF, WebP, SVG — these are processed by AI vision and receive full analysis (description, mood, colors, tags, use-cases)
  • Other file types Any file can be uploaded and stored, but non-image files (PDFs, documents, etc.) are not analyzed. They are stored in R2 and immediately set to status: "ready" with no analysis data.
  • Video uploads Supported (video/*, e.g. MP4/MOV/WebM) for accounts with the video-uploads flag enabled (default off). Not analyzed.
  • Max upload size 20 MB per file (images); 10 MB per file for video
  • Storage Cloudflare R2
  • Analysis output Description, rich description, mood, dominant colors (hex + name), use-cases, tags, EXIF when available

Processing Time & Polling

AI analysis runs asynchronously after upload. The asset is returned immediately with status: "pending".

  • Typical analysis time 5–15 seconds for most images
  • How to check Poll GET /assets/:id until status changes to "ready" or "error". Recommended interval: every 2–3 seconds.
  • Webhooks Not available. Polling is the only option.

Pricing

TierAssetsCredits/moPrice
Free5050$0
StarterUnlimited500$19/mo
ProUnlimited5,000$79/mo
EnterpriseUnlimitedUnlimitedCustom

1 credit = 1 AI image analysis. Credit packs: 100 for $2, 500 for $8, 2,500 for $30.

When NOT to Use Argus

  • Video files Supported only for accounts with the video-uploads flag enabled, capped at 10 MB. No analysis, no storage optimization.
  • Real-time processing Analysis is async. Not suitable for synchronous pipelines.
  • Non-image documents PDFs, docs, spreadsheets are stored but never analyzed.
  • Self-hosted storage Argus uses Cloudflare R2. No bring-your-own-bucket option.
  • Bulk migration No batch upload API. Use the CLI's argus-media-cli sync <folder> command to onboard a whole folder (it walks, filters junk/dupes, and uploads sequentially), or loop over /assets/upload yourself.