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:
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.
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.
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.
# 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:
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
- Go to argus.build/ui
- Sign in with a magic link (email-based, no password)
- Open Settings
- Click Create API Key
Then hand it to whichever surface you're using:
# 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.
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.
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.
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.
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.
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 skills — argus (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:
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.
npx add-mcp https://argus.build/mcp Or configure it by hand — for example in claude_desktop_config.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.
{
"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
{ total, limit, offset, hasMore, assets }. detail is summary (default, compact) or full; palette_fit re-ranks by brand-palette fit.vector block. linkedProjects lists any cross-project links.Upload & lifecycle
npx argus-media-mcp server.Brand & design
## Design Context markdown (palette, typography, brand voice, anti-references). Free. See Design Context export.Cross-project links
Moderation & account
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.
| Method | Path | Description |
|---|---|---|
| GET | /library/overview | Library read model in one call. Query: top_tags (default 20), recent (default 10). |
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.
| Method | Path | Description |
|---|---|---|
| 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.
| Method | Path | Description |
|---|---|---|
| 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}'
Cross-Project Links
Reuse one asset across many projects without duplicating it. Links are non-destructive many-to-many membership: an asset keeps its origin project and simply becomes visible in the additional projects you link it into. GET /assets/:id returns the origin as project and any additional projects in linkedProjects.
Method Path Description 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 }. MCP: link_asset_to_project. DELETE /assets/:id/links/:project Remove a cross-project link. Origin project and asset are untouched. MCP: unlink_asset_from_project.
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.
Method Path Description 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.
Method Path Description 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).
Method Path Description 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.
Method Path Description 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.
Method Path Description 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" } Status Meaning 400 Bad request — missing or invalid parameters 401 Unauthorized — missing or invalid API key 404 Not found — asset or resource does not exist 429 Tier limit reached — upgrade plan or wait for monthly reset 500 Internal 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
Tier Assets Credits/mo Price Free 50 50 $0 Starter Unlimited 500 $19/mo Pro Unlimited 5,000 $79/mo Enterprise Unlimited Unlimited Custom
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.