Skip to main content
ArtEmotion/MCP Setup
Quick connectMCP Endpoint

Every modern MCP client now speaks Streamable HTTP + OAuth — paste the URL, approve in your browser, done. No API key, no install, no Node.js. Desktop clients still ship a local npx mode as a fallback for offline use.

URLhttps://mcp.artemotion.ai/api/mcp
Claude.ai
remote
Custom Integrations → paste URL → OAuth
Claude Desktop
remote
Custom Connectors → paste URL → OAuth · stdio fallback
Cursor
remote
.cursor/mcp.json → URL only → OAuth · stdio fallback
Windsurf
remote
mcp_config.json → URL only → OAuth · stdio fallback
VS Code
remote
Copilot Agent → mcp.json {"type":"http"} · stdio fallback
Zed
remote
context_servers → URL entry · stdio fallback
Continue.dev
remote
config.json transport: streamable-http · stdio fallback
CLI / other
stdio
npx artemotion-mcp · or HTTP if your SDK supports it

Connect from your client

Pick your MCP-aware editor or AI client. Each tab has the exact JSON snippet to paste and one-line instructions.

Connect directly using our hosted MCP endpoint — no npm install, no Node.js, no API key to copy. The server implements MCP 2025-03-26 Streamable HTTP with OAuth 2.0 authorization: paste the URL, your client opens a browser tab, you log in once, done.

MCP Endpoint

https://mcp.artemotion.ai/api/mcp

Auth: OAuth 2.0 — your client handles it automatically. No header needed.

Claude.ai

Settings → IntegrationsAdd custom integration.

  • Paste https://mcp.artemotion.ai/api/mcp as the Integration URL — nothing else.
  • Claude.ai detects the OAuth server automatically and opens a browser tab.
  • Log in with your ArtEmotion account and click Approve.
  • Claude will now call ArtEmotion tools automatically whenever you ask it to generate images, videos, audio, or 3D assets.

Cursor (remote)

Add to .cursor/mcp.json — just the URL, no headers:

.cursor/mcp.json
// .cursor/mcp.json  — no API key needed, OAuth handles auth
{
  "mcpServers": {
    "artemotion": {
      "url": "https://mcp.artemotion.ai/api/mcp"
    }
  }
}

Cursor opens a browser tab on first use. After you authorize, the token is stored automatically.

Prefer a static API key instead?
.cursor/mcp.json (API key)
// .cursor/mcp.json  — static API key (alternative)
{
  "mcpServers": {
    "artemotion": {
      "url": "https://mcp.artemotion.ai/api/mcp",
      "headers": { "Authorization": "Bearer ae_live_…" }
    }
  }
}

Windsurf

mcp_config.json
// ~/.codeium/windsurf/mcp_config.json  — no API key needed
{
  "mcpServers": {
    "artemotion": {
      "serverUrl": "https://mcp.artemotion.ai/api/mcp"
    }
  }
}

Windsurf opens the OAuth consent screen on first connect. Approve once and you're set.

Prefer a static API key instead?
mcp_config.json (API key)
// ~/.codeium/windsurf/mcp_config.json  — static API key (alternative)
{
  "mcpServers": {
    "artemotion": {
      "serverUrl": "https://mcp.artemotion.ai/api/mcp",
      "headers": { "Authorization": "Bearer ae_live_…" }
    }
  }
}

Any HTTP-capable MCP client

Point the client at https://mcp.artemotion.ai/api/mcp. If it supports OAuth 2.0 discovery, it will handle auth automatically via /.well-known/oauth-authorization-server. Clients that don't support OAuth can still connect with a static Authorization: Bearer ae_live_… header using an API key from Settings → API Keys.

NEW What's new in 0.6

Upload & LoRA
upload_image + generate_with_lora close the image-input loop. Now you can attach a reference photo or LoRA-style any generation from within the chat.
Studio tools
6 one-call image tools — erase objects, remove backgrounds, upscale, restore photos, create headshots, inpaint regions.
Community & Ratings
list_community_gallery / share_to_gallery / rate_model — the model can now browse, publish, and curate the community gallery.
Pipelines, end-to-end
save_pipeline + run_pipeline close the loop. Scaffold a plan, save it, run it server-side — the runner walks every node, deducts credits per-step, and returns all output URLs.
Library write surface
create_folder / delete_folder / move_generation / delete_generation. The LLM can now curate, not just browse.
Active job ops
list_jobs surfaces every queued / processing job in the last 30 min. cancel_job stops a runaway generation.
Usage analytics
get_usage totals credits + jobs over 1h / 24h / 7d / 30d, broken out by output kind and top-spending models.
Save-to-library mode
Pass save_to_library: true on combine_videos and start_edit — the mp4 gets hosted and returned as a URL instead of raw bytes.
Cost cap + webhooks
start_generation now accepts max_credits (reject if estimate exceeds it) and webhook_url (skip polling, FAL pings you on completion).
Multimodal enhance
enhance_prompt takes an optional image_url — the LLM looks at the image before rewriting the prompt, so “make this image's prompt more cinematic” just works.

0.3 Earlier — discover & recommend

Full catalog access
Browse every model in MODEL_CAPS — not just try-on / vision. Filter by kind, search by name ("nano banana", "flux"), sort by price.
Price-aware sorting
Every model now carries a base_credits estimate. Ask for the cheapest, priciest, best, popular or newest with one parameter.
LLM model recommender
recommend_model hands Claude/Gemini a candidate shortlist and gets back the best pick + a 1-sentence reason + 4 alternatives.
AI scene scaffolder
scaffold_pipeline turns "30-second YouTube intro about coffee" into a structured plan — N scene prompts, music description, voice script.
Any-model generation
start_generation runs any model in the catalog — t2i, i2i, t2v, i2v, v2v, TTS, music, 3D. Same job/poll/result flow as the existing tools.
Stitch into one mp4
combine_videos concatenates clips with optional music + voice mixed in, producing a single faststart mp4.

Prerequisites

  • Node.js 20 or newer — required by the MCP server. Already installed on most dev machines.
  • An ArtEmotion API key — generate one at Settings → API keys. Keys look like ae_live_….
  • Credits on your account — each generation deducts from your balance, same as the REST API. list_*, recommend_model, and scaffold_pipeline don't cost credits.

Available tools

The model sees these 48 tools. Tools are grouped by intent — Discover, Generate, Pipeline, Mix, Account & Library, Utility, LoRA & advanced, Job recovery, Studio tools, and Community & ratings.

Discover

list_models
GET /api/v1/models?catalog=full
Browse every model. Filters: kind, search. Sorts: cheapest / priciest / best / popular / newest. Each entry includes base_credits.
recommend_model
POST /api/v1/recommend
Describe the task, optionally pass prefer: best | cheapest | popular | newest. An LLM picks one model with a reason + 4 alternatives.
list_tryon_models
GET /api/v1/models (legacy)
Curated try-on catalog with garment-type coverage. Kept for back-compat with older clients.
list_vision_models
GET /api/v1/vision
Curated vision catalog: VQA, captioning, OCR, object detection, NSFW classification.

Generate

start_generation
POST /api/v1/generate
Run any model in the catalog. Accepts native fal fields (prompt, image_url, video_url, aspect_ratio, duration, num_images, …) + an extra escape hatch.
start_tryon
POST /api/v1/tryon
Specialised try-on entry point — person + garment URLs in, job id out.
start_vision
POST /api/v1/vision
Image → text. VQA, captioning, OCR, detection, moderation.
get_job
GET /api/v1/jobs/:id
One-shot status check (queued / processing / completed / failed).
wait_for_job
polls get_job
Blocks until a terminal state, returns the result inline so the model sees the asset URL directly.

Pipeline + Mix

scaffold_pipeline
POST /api/v1/scaffold
Plain-English brief in, structured plan out — N scene prompts, optional music prompt, optional narration script. No credits charged; pay when you submit each scene to start_generation.
save_pipeline
POST /api/v1/pipelines
Persist a {nodes, edges} document. Pass id for idempotent overwrite. Pairs with scaffold_pipeline: scaffold → save → run.
run_pipeline
POST /api/v1/pipelines/run
Server-side execution. Walks every node in topo order, submits each gen, deducts credits, returns all output URLs. Blocks until done by default; pass wait: false for fire-and-forget.
combine_videos
POST /api/v1/merge
Concat 1–20 clips. Optional music_url (mixed at 30 % volume) + voice_url. Output: single H.264 + AAC mp4 with faststart. Pass save_to_library to host + return a URL.

Account & library

get_credits
GET /api/v1/credits
Current balance + active plan summary. Cheap, safe to call before any big spend.
estimate_cost
POST /api/v1/estimate
Preview a job's credit cost without submitting it. Returns the estimate, balance, and a sufficiency flag.
get_usage
GET /api/v1/usage
Credits + jobs in the last 1h / 24h / 7d / 30d, broken out by kind and top-spending models.
list_generations
GET /api/v1/generations
Recent jobs, most-recent first. Optional kind filter. Each entry includes the asset URL.
list_library
GET /api/v1/library
Library entries + the user's folder list. Filter to one folder with folder_id.
create_folder
POST /api/v1/folders
New library folder. Pair with move_generation to organise existing assets.
delete_folder
DELETE /api/v1/folders
Drop a folder. Generations inside become un-foldered, not deleted.
move_generation
POST /api/v1/library/move
Move a generation into a folder, or out by passing folder_id: null.
delete_generation
POST /api/v1/library/delete
Remove the library row. The hosted asset URL stays valid on FAL / Cloudinary.
list_pipelines
GET /api/v1/pipelines
Saved pipelines (summary), or one pipeline's full doc when id is passed.
list_jobs
GET /api/v1/jobs
All queued / processing jobs started in the last 30 min. Great for resuming after a session interruption.
cancel_job
DELETE /api/v1/jobs
Cancel an in-flight job by id. Refunds happen only when FAL itself reports failure.
whoami
GET /api/v1/credits + GET /api/v1/usage
Credit balance + 30-day spend breakdown by kind. Safe to call before any big job.
get_rate_limits
static
Returns the per-key rate limit policy (20 req/min for most endpoints, 30/min for uploads) without any API call.
describe_then_generate
composes start_vision + start_generation
Analyse an input image, then generate a new image based on the description. Chain vision → generation in one call.

Utility

enhance_prompt
POST /api/v1/enhance
Expand a short prompt into a richer one. 7 style presets (cinematic / photoreal / anime / …). Pass image_url for vision-grounded enhancement.
generate_and_wait
composes start_generation + wait_for_job
Submit and block until the asset URL is available. One-call shorthand for users who just want the result.
batch_generate
parallel start_generation
Fire 2–8 jobs in parallel — same model with N variants of a prompt, or N distinct prompts.
compare_models
multiple list_models
Side-by-side spec sheet for 2–6 models. Shows kind, base cost, aspects, resolutions, durations, required inputs.

LoRA & advanced

upload_image
POST /api/v1/upload
Upload a base64-encoded image or file (PNG/JPEG/WebP/GIF/AVIF, video, audio). Returns a hosted URL to pass as image_url, reference_image_url, etc. Accepts data URI or raw base64. 30 uploads/min limit.
search_loras
GET /api/loras
Search the LoRA catalog by keyword. Returns name, path (URL to pass as loras:[{path}]), base model, download/like counts.
generate_with_lora
composes search_loras + start_generation
Search for a LoRA by keyword, then generate with it in one call. Use lora_scale to control influence (0.5–1.2).
get_model_card
GET /api/v1/models
Get a full spec sheet for one model: kind, price, supported aspect ratios, resolutions, durations, required inputs, example prompt.

Job recovery

reuse_generation
GET /api/v1/generations/:id + POST /api/v1/generate
Fetch a past generation and resubmit it, optionally overriding any field (prompt, aspect_ratio, etc.). Useful for iterating on a finished job.
retry_failed_job
GET /api/v1/generations/:id + POST /api/v1/generate
Re-run a job that has no result (failed/timed-out). Refuses to retry already-successful jobs.
cancel_all_running_jobs
GET /api/v1/jobs + POST /api/v1/jobs
List every queued/running job and cancel all of them in one call. Returns count of cancelled jobs.

Studio tools

object_eraser
POST /api/v1/generate (bria/eraser model)
Remove an object from an image by describing it. Returns the cleaned image URL.
remove_background
POST /api/v1/generate (bria/rmbg)
Strip the background from any image. Returns a transparent PNG.
quality_boost
POST /api/v1/generate (clarity upscaler)
2× or 4× AI upscale with detail enhancement.
photo_restore
POST /api/v1/generate (gfpgan/BSRGAN)
Restore old or degraded photos.
professional_headshot
POST /api/v1/generate (headshot model)
Convert casual portraits to professional-looking headshots.
start_edit
POST /api/v1/edit
Inpaint / text-guided region edit. Requires an image URL + mask URL + prompt. Pro plan required.

Community & ratings

list_community_gallery
GET /api/v1/community/gallery
Browse the public community gallery. Filterable by kind (image/video/audio/3d). Returns media URLs + captions + author nicknames.
share_to_gallery
POST /api/v1/community/gallery
Publish one of your own generations to the community gallery with an optional caption.
rate_model
POST /api/v1/rating
Rate a model 1–5 stars. Helps surface the best models in list_models results.

Example responses

list_models
// list_models { kind: "image", sort: "cheapest", search: "nano-banana" }
{
  "count": 3,
  "total_catalog": 365,
  "sort": "cheapest",
  "models": [
    { "id": "fal-ai/nano-banana",     "name": "Nano Banana",     "kind": "image", "base_credits": 8  },
    { "id": "fal-ai/nano-banana-pro", "name": "Nano Banana Pro", "kind": "image", "base_credits": 38 },
    { "id": "fal-ai/nano-banana-2-pro","name": "Nano Banana 2 Pro","kind": "image","base_credits": 64 }
  ]
}
recommend_model
// recommend_model { description: "Photoreal sunset cityscape", prefer: "best" }
{
  "recommendation": {
    "id": "fal-ai/nano-banana-pro",
    "name": "Nano Banana Pro",
    "kind": "image",
    "base_credits": 38,
    "has_image_input": true
  },
  "reason": "Top-tier image model with 4K output and web-search grounding — strongest fit for a photorealistic cinematic scene.",
  "alternatives": [
    { "id": "fal-ai/flux-2-pro", "name": "FLUX 2 Pro", "base_credits": 28 },
    { "id": "fal-ai/imagen-4",   "name": "Imagen 4",   "base_credits": 22 }
  ]
}
start_generation
// start_generation { model_id: "fal-ai/nano-banana-pro", prompt: "...", aspect_ratio: "16:9" }
{
  "job_id":      "019e2d09-260…",
  "model_id":    "fal-ai/nano-banana-pro",
  "kind":        "image",
  "status":      "queued",
  "credits_used": 38,
  "credits_left": 47462,
  "poll_url":    "https://app.artemotion.ai/api/v1/jobs/019e2d09-260…?model_id=fal-ai%2Fnano-banana-pro"
}
scaffold_pipeline
// scaffold_pipeline { prompt: "10s coffee channel intro", include_music: true, include_voice: true }
{
  "scaffold": {
    "name": "Coffee Brew Intro",
    "totalDurationSec": 10,
    "scenes": [
      { "id": "scene-1", "title": "Beans pouring", "kind": "video",
        "model": "fal-ai/kling-video/v3/standard/text-to-video",
        "settings": { "duration": "5", "aspect_ratio": "16:9" },
        "prompt": "Close-up of dark roasted coffee beans pouring..." }
    ],
    "musicTrack": { "prompt": "warm lo-fi jazz", "model": "cassetteai/music-generator", "durationSec": 10 },
    "voiceTrack": { "script": "Welcome to my channel...", "model": "fal-ai/orpheus-tts", "voice": "warm" }
  }
}

Try saying…

Drop these into Claude Desktop / Cursor / Zed once you've wired up the server. The model picks the right tools on its own.

list_models
"What's the cheapest video model on ArtEmotion?"
list_models { kind: "video", sort: "cheapest" }
recommend_model
"Pick the best image model to create a photorealistic dog at sunset."
recommend_model { description: "...", prefer: "best" }
list_models → start_generation
"Use nano-banana-pro to create a futuristic Tokyo skyline."
start_generation { model_id: "fal-ai/nano-banana-pro", prompt: "..." }wait_for_job
scaffold_pipeline
"Plan me a 30-second YouTube intro about coffee — with music + a calm narrator."
scaffold_pipeline { prompt: "...", total_duration_sec: 30, include_music: true, include_voice: true }
combine_videos
"Stitch these three clips together and mix in this music track."
combine_videos { video_urls: [...], music_url: "..." }
start_tryon → wait_for_job
"Try this red jacket on the person in image A."
start_tryon { person_image_url, garment_image_url }wait_for_job

Environment variables

VariableRequiredDefaultNotes
ARTEMOTION_API_KEYyesBearer key from your API Keys page.
ARTEMOTION_BASE_URLnohttps://app.artemotion.aiPoint at staging to test before prod.
ARTEMOTION_POLL_INTERVAL_MSno2000wait_for_job poll cadence. Min 500 ms.
ARTEMOTION_POLL_TIMEOUT_MSno300000 (5 min)wait_for_job default ceiling. Per-call override available.

UPDATE Upgrading from an older version

The MCP server is published as artemotion-mcp on npm and runs via npx on every client launch. Whether you have to do anything when a new version ships depends on how your config is written.

🟢
Unpinned config
"args": ["-y", "artemotion-mcp"]

npx caches the install and re-checks for newer versions on its own schedule (~daily). Fully quit and relaunch your client — most of the time that's enough to pick up the latest. No config edit needed.
🟡
Pinned to an old version
"args": ["-y", "artemotion-mcp@0.3.0"]

Edit the version in your config to the new release (e.g. @0.5.0 or @latest), then quit + relaunch the client.
🔴
Force-refresh (cache stuck)
If a relaunch still shows the old tool list, the npx cache is stale. Wipe it once and relaunch:

Recommended: pin to the latest tag

For deterministic upgrades, pin to @latest (always resolves to the newest published version) or to a specific release (so a future minor bump doesn't change your tool surface without warning).

claude_desktop_config.json (excerpt)
{
  "mcpServers": {
    "artemotion": {
      "command": "npx",
      "args": ["-y", "artemotion-mcp@latest"],
      "env": { "ARTEMOTION_API_KEY": "ae_live_…" }
    }
  }
}

Force-refresh the npx cache

If you've relaunched the client and the new tools still don't show up, your local npx cache is holding the old bundle. One-line fix, then quit + relaunch:

bash
rm -rf "$(npm config get cache)/_npx"

On Windows: rd /s /q "%LOCALAPPDATA%\\npm-cache\\_npx".

How to tell which version is running

Ask the model "What MCP tools does ArtEmotion expose?" — the count and tool names give it away. As of v2.8.0 you should see 48 tools including upload_image, generate_with_lora, object_eraser, remove_background, list_community_gallery, share_to_gallery, save_pipeline, run_pipeline, list_jobs, cancel_job, get_usage, get_credits, estimate_cost, create_folder, etc. If you see ≤ 11, you're on 0.2 or earlier.

Troubleshooting

  • "Server failed to start" / no tools appear. Check the client's MCP logs for the actual error. The most common cause is a missing or mistyped ARTEMOTION_API_KEY — the server crashes early with a clear message.
  • 401 / "Invalid or revoked API key." The key was rotated or revoked. Generate a new one at Settings → API keys.
  • 402 / "Insufficient credits." Top up your balance from the pricing page, or upgrade your plan from pricing.
  • 402 / "COST_CAP_EXCEEDED". You passed max_credits to start_generation and the estimate was higher. Raise the cap or pick a cheaper model with list_models { sort: "cheapest" }.
  • 403 / "Editor requires Pro plan ($54/mo)". start_edit + uploaded clips in the editor are gated. Upgrade or stick to combine_videos (no plan gate).
  • 429 / "Rate limited." You're hitting the per-key rate limit on /api/v1/*. The server surfaces the same limit — back off and retry.
  • 404 on a tool that should exist. Your client is talking to a server that hasn't been redeployed with the new endpoints. See the Upgrading section.
  • npx hangs the first time. First-run downloads ~10 MB. After the initial install it's cached and starts instantly.
  • Tools didn't refresh after an upgrade. See Upgrading from an older version — usually a quit-and-relaunch is enough, sometimes you need to wipe the npx cache.