Loopcut

Loopcut for agents · Docs

Loopcut for coding agents

The loopcut connector lets Claude Code, Codex, Cursor or a shell render a saved .blend on an RTX 4090, search free asset libraries, and make 3D models, sound effects and voice lines, paid with Loopcut credits. Results come back as files. Any Blender install packs the scene; the Loopcut app isn't needed.

Agents: the same page as Markdown is at /docs/render.md.

Overview

loopcut is an MCP server and a CLI in one package. An agent that can drive Blender gets Loopcut's cloud tools: it quotes a job, starts it once you agree to the price, waits, and downloads the result as a file it imports with Blender's Python.

You need:

  • A Loopcut account. Sign up at loopcut.org; new accounts get 100 free credits.
  • uv, which provides Python 3.10 or newer.
  • Blender on the same machine to render, used only to pack the scene. The cloud renders with Blender 5.2, so save the file in 5.2 or earlier.

The source is on GitHub under the GPL.

Install

Claude Code. The plugin adds the tools and a skill that teaches the agent when to use each one. In Claude Code:

claude code
/plugin install loopcut --marketplace loopcut-ai/loopcut

On Claude Code before 2.1.275, run these two instead:

claude code
/plugin marketplace add loopcut-ai/loopcut
/plugin install loopcut@loopcut

Or add only the MCP server:

shell
claude mcp add loopcut -- uvx loopcut mcp

Codex. The same repository is a Codex plugin marketplace. The plugin adds the tools and the same skill:

shell
codex plugin marketplace add loopcut-ai/loopcut
codex plugin add loopcut@loopcut

Or add only the MCP server:

shell
codex mcp add loopcut -- uvx loopcut mcp

Cursor, VS Code, Claude Desktop and other MCP clients. Add this server to the client's MCP config (~/.cursor/mcp.json for Cursor; Settings, Developer, Edit Config in Claude Desktop):

json
{
  "mcpServers": {
    "loopcut": {
      "command": "uvx",
      "args": [
        "loopcut",
        "mcp"
      ]
    }
  }
}

Apps started from the Dock or Start menu may not see your shell's PATH. If the server doesn't start, use the full path from which uvx as command.

Sign in

The first call opens a browser to sign in. Approve it, and the call carries on with the key stored in ~/.config/loopcut-connector/, where only you can read it. If no browser opens (over SSH, say), the call returns the link and a code for the agent to show you; once you approve, it calls the same tool again. loopcut_login signs in or switches accounts on purpose. The folder is the connector's own; set LOOPCUT_CONNECTOR_HOME to move it. In a shell, run:

shell
uvx loopcut login

For CI and servers, create an API key on your account page and set LOOPCUT_API_KEY. Keys spend the account's credits; revoke one there at any time.

How a job runs

  1. The agent calls a tool, such as render_quote or sound_effect. Paid tools return a quote: quote_id, credits and usd. Quotes are free and last 10 minutes. File inputs are local paths, uploaded only if the cloud doesn't already have them.
  2. The agent tells you the price and starts only after you agree, or when the quote is within a budget you already gave it.
  3. job_start with the quote_id starts the job. Calling it again returns the same job. An expired quote is renewed, and the job goes ahead only if the price is unchanged.
  4. job_start waits, and job_status waits again until the job ends. When it succeeds, they download the results, hash-checked, into loopcut_renders/<job_id>/ next to the .blend for a render, or loopcut_outputs/<job_id>/ in the working folder for everything else (or out_dir).
  5. The agent imports the files with Blender's Python and checks them before telling you it's done.

asset_search is free, so it skips the quote and returns its matches in the same call. Every tool returns within 50 seconds. Long work carries on between calls, so clients with short tool timeouts work too.

The tool list comes from Loopcut's catalog when the server starts, so a cloud tool that opens on Loopcut appears without updating the connector. Image generation and editing will appear that way.

Tools

ToolWhat it does
loopcut_loginSigns in or switches account. Any tool signs in by itself the first time.
loopcut_accountPlan, credit balance, Private mode, and which tools the account can use.
render_quotePacks the saved .blend with your Blender, uploads only what's new and prices the render. Free.
asset_searchSearches Poly Haven, ambientCG and Physically Based for models, materials, HDRIs and textures. Free, and it runs at once.
image_to_3dPrices a textured 3D model from a prompt, an image or both.
remeshPrices a cloud remesh: clean quads or triangles, with the textures baked onto the new mesh.
sound_effectPrices a sound effect from a description.
voice_linePrices a spoken line in one of eight voices, with your direction.
job_startStarts a quoted job. Calling it twice returns the same job, never a second charge.
job_statusWaits for the job, then downloads the results, hash-checked and resumable.
job_cancelStops the job and refunds the credits it didn't use.

Render

Save the scene first: the cloud renders the file on disk, not unsaved edits in an open Blender. render_quote packs the scene with a headless Blender, uploads the files the cloud doesn't already have and returns the quote with the frame count and any warnings. While it returns "status": "preparing", call it again with the same arguments.

A quote call looks like this:

json
{
  "blend": "/Users/you/work/chair.blend",
  "engine": "eevee",
  "frame_start": 1,
  "frame_end": 120,
  "turntable": {}
}

render_quote takes blend (the path to the saved file) and these settings, all optional. Frames default to frame 1 only.

SettingTypeMeaning
frame_startintegerFirst frame to render, inclusive. Defaults to 1.
frame_endintegerLast frame to render, inclusive; must be at least frame_start. Defaults to frame_start for a single frame, or 120 frames for a turntable.
frame_stepintegerSpacing between rendered frames. Defaults to 1.
engine"cycles" | "eevee"Render engine. Use the scene's own: "eevee" when scene.render.engine is BLENDER_EEVEE. Defaults to "cycles".
samplesintegerSamples per pixel: Cycles samples, or EEVEE render samples. Defaults to 128 for Cycles and 64 for EEVEE.
resolution_pctintegerPercentage of the scene output resolution. Defaults to 100.
camerastringName of the scene camera object. If omitted, use the active camera in the bundle.
denoisebooleanDenoise rendered frames (Cycles; EEVEE ignores it). Defaults to true.
turntableobjectRender a 360° turntable instead of the scene camera: a generated camera orbits the target objects (or the whole scene) once across frame_start..frame_end, so the frames loop seamlessly. If frame_end is omitted, renders 120 frames. A named camera only lends its lens.

It also takes blender, the Blender executable to pack with. Without it, the tool checks LOOPCUT_BLENDER, BLENDER, PATH and the usual install folders.

Every render comes back with qa_report.json, which flags black, white, flat or transparent frames, fireflies, duplicate frames, exposure jumps between frames. Before a long animation, render one frame at resolution_pct: 25 and look at it.

Assets

asset_search searches CC0 models, materials, HDRIs and textures from Poly Haven, ambientCG and Physically Based. It's free and returns matches in one call, each with its licence, size, preview and where to download it: direct links, Poly Haven's file list (files_api) or a Blender asset library. Show the show_credit lines next to the results. A found asset is usually better than a generated one, so search first.

InputTypeMeaning
kind"model" | "material" | "hdri" | "texture" | "any" or arrayAsset category to search: one kind, a list of kinds, or any for every kind. Defaults to model.
limitintegerMaximum number of search results. Defaults to 10.
querystringSearch terms describing the desired asset; at most 1000 characters.
license"cc0" | "any"License filter. Defaults to cc0; any currently returns the same CC0 sources.
sourcesarrayLibraries to search. Defaults to all.
max_polycountintegerMaximum source-stated polygon count, for models only; ignored for other kinds. Assets with no stated polycount are excluded when set. Defaults to no cap.
min_resolutionintegerMinimum longest side in pixels of the largest texture, HDRI or model texture set offered by the source. Assets with no stated resolution are excluded when set. Defaults to no minimum.

Import what you download with bpy.ops.import_scene.gltf (glTF), bpy.data.libraries.load (.blend) or bpy.data.images.load (textures and HDRIs).

3D models

image_to_3d makes a textured 3D model (GLB) from a prompt, a reference image, or both. Use it for new props and concept meshes, not exact CAD. Jobs take 1 to 5 minutes. Price: $0.80 a model.

InputTypeMeaning
promptstringDescribe the object to generate. Optional when an image file is supplied; otherwise required, at most 4000 characters.
quality"draft" | "final"Generation detail. Defaults to final (80 credits); draft costs 25 credits.
texturedbooleanInclude PBR materials and textures. Defaults to true; false returns geometry only.
topology"triangles" | "quads"Preferred face topology. Defaults to triangles; quads are a target rather than a guarantee of clean edge flow.
imagepathOptional: a local PNG, JPEG, WebP file, at most 20 MB.

remesh rebuilds an existing mesh with clean quads or triangles at the face count you pick, and bakes its textures onto the new mesh. Export the object to a .glb first (bpy.ops.export_scene.gltf with export_format='GLB') and pass its path as model. Quads come back as FBX, triangles as GLB. Price: From $0.05 a mesh; the quote is the most it can cost.

InputTypeMeaning
topology"quads" | "triangles"Preferred output face topology. Defaults to quads.
target_facesintegerOutput face count, 500–200000; the current route supports up to 20000 quads or 40000 triangles. Omit it to let the service choose from the source. By purpose: game prop or background asset 2000–5000, editing or sculpting base 5000–10000, hero asset or character 10000–20000.
modelpathRequired: a local GLB file, at most 150 MB.

Import the result with bpy.ops.import_scene.gltf(filepath=...) for GLB or bpy.ops.import_scene.fbx(filepath=...) for FBX.

Audio

sound_effect makes a sound effect from a description: impacts, ambience and foley, not speech or music. Price: $0.04 a take. It is off while Private mode is on; see Account settings below.

InputTypeMeaning
loopbooleanMake the start and end join for repeated playback. Defaults to false.
promptstringDescribe the sound source, action, environment and acoustic character; at most 4000 characters.
duration_secondsnumberLength of the effect in seconds. Defaults to 2; accepted range is 0.5–30.

voice_line speaks a line of text with one of eight voices and your direction, for characters or narration. Price: $0.10 per minute.

InputTypeMeaning
textstringWords to speak; at most 2000 characters.
voice"Zephyr" | "Puck" | "Charon" | "Kore" | "Fenrir" | "Leda" | "Aoede" | "Sulafat"Voice character: Zephyr (bright), Puck (upbeat), Charon (informative), Kore (firm), Fenrir (excitable), Leda (youthful), Aoede (breezy), Sulafat (warm). Defaults to Kore.
languagestringBCP-47 language tag, for example en-US or fr-FR. Defaults to en-US; supported languages depend on the route.
directionstringPerformance direction such as tone, pace and emotion; at most 1000 characters. If omitted, use a neutral delivery.

Both return WAV files. Add one to the Video Sequencer as a sound strip, for example scene.sequence_editor_create().strips.new_sound(name, filepath, channel=1, frame_start=1).

CLI

The CLI has the same verbs, and prints JSON results to stdout and progress to stderr.

shell
uvx loopcut tools
uvx loopcut quote render --blend shot.blend --input '{"frame_end": 120, "samples": 256}'
uvx loopcut start <quote_id>
uvx loopcut status <job_id> --wait
uvx loopcut fetch <job_id> --out renders/

# Quote, start if it's at most 300 credits, wait and download
uvx loopcut render shot.blend --frames 1-120 --max-credits 300
uvx loopcut run asset_search --input '{"query": "oak floor", "kind": "material"}'
uvx loopcut run image_to_3d --input '{"prompt": "a brass desk lamp", "quality": "draft"}' --file image=lamp.png --max-credits 30

run and render start only with --yes, under --max-credits N, or after you answer the prompt. Render frames are N, START-END or START-END:STEP; the other render flags are --engine, --samples, --resolution-pct, --camera, --no-denoise, --turntable [OBJECT ...], --blender and --out.

In a GitHub Actions job, install Blender on the runner (it packs the scene), then:

yaml
- run: uvx loopcut render scenes/hero.blend --frames 1-240 --max-credits 500 --out renders/
  env:
    LOOPCUT_API_KEY: ${{ secrets.LOOPCUT_API_KEY }}

Account settings

Two account settings apply to the connector as they do in the app. loopcut_account shows both, and which tools they block.

  • Private mode, on by default for paid plans, refuses tools whose provider may train on what it receives. Today that is sound effects.
  • No-generation hides and refuses the generative tools: image to 3D, sound effects, voice lines and images. Render, remesh and asset search still work.

Change them in the Loopcut app, or from a shell:

shell
uvx loopcut settings --private-mode off
uvx loopcut settings --no-generation on

Prices and limits

  • Rendering costs 5 credits ($0.05) per GPU-minute on an RTX 4090, with a 5-credit minimum per job. 1 credit is $0.01.
  • Image to 3D model: $0.80 a model.
  • Cloud remesh: From $0.05 a mesh.
  • Voice line: $0.10 per minute.
  • Sound effect: $0.04 a take.
  • Asset search: Free.
  • The quote is the most a job can cost, and it holds that many credits while the job runs. A render is charged for the GPU time it actually used, never more than the quote.
  • Quotes, packing, uploads and the render QA report are free. Failed jobs are refunded.
  • New accounts get 100 free credits. Paid plans add credits every month, and credit packs work on any plan. See pricing.
  • Render: at most 2,000 frames per job, 4096 × 4096 pixels per frame, 20 GiB and 4,096 files per scene, and 200 MiB per file.

What runs in the cloud

  • Python in a .blend never runs: drivers with expressions, startup scripts and add-ons are off. Bake anything that depends on them before you quote.
  • Each render runs as its own user, and the renderer has no internet access.
  • Uploaded files are kept for 7 days and results for 30 days after their last use, then deleted. Uploads are addressed by hash, so a second render of the same scene uploads only what changed.
  • Other tools send each job only to the provider that runs it. Private mode keeps jobs away from providers that may train on them.

Errors

Errors carry a code and say what to do next.

CodeMeaning
sign_in_requiredCall loopcut_login, or set LOOPCUT_API_KEY.
insufficient_creditsThe balance is below the quote. Add credits or upgrade on the pricing page, or ask for less.
age_confirmation_requiredConfirm once, at the confirm_url in the error, that you're 18 or older.
daily_limit_reached, rate_limitedThe account's daily limit or the burst guard stopped the job. The error has a confirm_token; pass it back only if you approve going past the limit.
private_modePrivate mode blocks this tool. Turn it off in the app or with loopcut settings --private-mode off, or do without it.
generation_disabledGeneration is off for the account. Turn it back on in the app or with loopcut settings --no-generation off.
tool_disabledThe tool is switched off on Loopcut for now. Nothing was charged.
invalid_inputAn input or file was refused; field names it. File inputs are checked for type and size before upload.
quote_expiredQuotes last 10 minutes. job_start renews an expired quote by itself and asks again only if the price changed.
pack_failedBlender couldn't pack the scene. Either it isn't installed (set LOOPCUT_BLENDER), or the file didn't open; the message ends with Blender's log.

Troubleshooting

  • Pink textures: a texture wasn't on disk when the scene was packed. The quote's warnings lists missing files. Fix the paths, or pack the images into the .blend in Blender, save and quote again.
  • The file won't open in the cloud: it was saved by a Blender newer than 5.2.
  • Several minutes before the first frame: the first render in a while starts a GPU worker. Later jobs start faster.
  • No sound effect tool: Private mode is on for the account.
  • The MCP server doesn't start in a desktop app: give the full path to uvx.

Questions and bugs: GitHub issues or hello@loopcut.org.