Skip to content
MCPBytes

3D Models

Describe it.Watch it move.

Make a rigged character move from a sentence: walk, wave, dance or fight, with its feet kept on the ground.

20 credits per job · 300 free credits to start

Interactive 3D model of a rigged cartoon knight dancing hip hop in place
“A person does a hip hop dance.” for 6 seconds in place, on the knight from Rig a 3D model: every check passed. Drag to turn it; the page plays a web copy (Draco geometry, WebP textures) of the job's model.glb.

Any humanoid.

It finds the hips, spine, arms and legs of your skeleton by its shape, whatever the bones are called and however the model stands.

Feet on the ground.

A foot that touches the ground stays where it landed, and the body is lifted when it would sink through the floor.

Checked, not trusted.

Every clip is measured for sliding feet, the floor and sudden turns, and comes with a picture of six moments.

Pricing

Pay by the job.

20 credits per job. A job that fails costs nothing.

Pricing details

Start free

Available now

300free credits when you sign up

  • Every MCPBytes tool, one credit balance
  • Sign in with GitHub or email, no card required
  • Each tool states its price before you run it
  • Failed API jobs cost nothing

Price per job

Animate a 3D model

Per job
20 credits

Limits

Jobs
20 per rolling 24 hours; 3 until your first credit purchase
Model
Up to 50 MB and 1,000,000 triangles
At a time
1 job
Uploads
Up to 50 MB
Results
24 hours by default

API

Your agent or your code.

Connect your agent and it can use this tool right away, or call it from your own code. One key works for both.

Start a job

Send a file body, or JSON containing an upload ID or public URL. Options such as description go in the JSON options object, or the query string for a file body.

Requestanimate.sh
# idempotency_key is required: repeating it returns the same job
curl https://api.mcpbytes.com/v1/tools/animate_3d_model/jobs \
  -H "Authorization: Bearer $MCPBYTES_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "job_file": {"job_id": "j_...", "name": "model.glb"},
    "options": {
      "description": "A person walks forward confidently.",
      "duration": 5,
      "seed": 42
    },
    "idempotency_key": "animate-example-001"
  }'
Response202 Accepted · trimmed
{
  "tool": "animate_3d_model",
  "status": "queued",
  "input_kind": "file",
  "workflow": {
    "stage": "Animating",
    "deadline": "2026-09-27T23:21:27.662Z",
    "cancel_pending": false,
    "refund_pending": false
  },
  "capabilities": {
    "can_cancel": true
  },
  "options": {
    "description": "A person walks forward confidently.",
    "duration": 5,
    "in_place": false,
    "seed": 42
  },
  "result": null
}

Get the result

Poll until the status is final. Download files only after success.

Requestread.sh
# JOB_ID is the id from the create response; poll until status is final
curl "https://api.mcpbytes.com/v1/jobs/$JOB_ID" \
  -H "Authorization: Bearer $MCPBYTES_API_KEY"

# Once status is succeeded, download each file from result.files[].url
curl -fsSLo model.glb "$MODEL_URL"
Response200 OK · trimmed
{
  "tool": "animate_3d_model",
  "status": "succeeded",
  "result": {
    "notes": [],
    "duration": 5,
    "frames": 150,
    "status": "passed",
    "issues": [],
    "files": [
      {
        "name": "model.glb",
        "bytes": 15060048,
        "content_type": "model/gltf-binary",
        "url": "https://api.mcpbytes.com/blob/dl/…"
      },
      {
        "name": "motion.json",
        "bytes": 3168,
        "content_type": "application/json",
        "url": "https://api.mcpbytes.com/blob/dl/…"
      },
      {
        "name": "motion_report.json",
        "bytes": 580,
        "content_type": "application/json",
        "url": "https://api.mcpbytes.com/blob/dl/…"
      },
      {
        "name": "motion_preview.png",
        "bytes": 252926,
        "content_type": "image/png",
        "url": "https://api.mcpbytes.com/blob/dl/…"
      },
      {
        "name": "generation.json",
        "bytes": 2323,
        "content_type": "application/json",
        "url": "https://api.mcpbytes.com/blob/dl/…"
      }
    ]
  },
  "compute_ms": 27551,
  "credits_charged": 20
}

MCP

Connect once. Your agent calls animate_3d_model and gets the download URLs back. This endpoint has only this tool's family, which keeps your agent's tool list short; one endpoint has every tool.

Claude Code

The first form signs in through the browser when you run /mcp. In .mcp.json (project root), ${MCPBYTES_API_KEY} is read from the environment when Claude Code connects. Claude Code docs

claude mcp add --transport http mcpbytes \
  https://api.mcpbytes.com/mcp/3d
Codex (CLI, IDE extension, ChatGPT desktop)

Codex reads the key from the environment variable each time it connects. The same table can go in ~/.codex/config.toml by hand; codex mcp add has no --header flag. Codex docs

codex mcp add mcpbytes --url https://api.mcpbytes.com/mcp/3d \
  --bearer-token-env-var MCPBYTES_API_KEY
Cursor

~/.cursor/mcp.json (all projects) or .cursor/mcp.json (one project). Remote servers take no "type". Without the header, the client signs you in with GitHub or an email link (OAuth). Cursor docs

~/.cursor/mcp.json
{
  "mcpServers": {
    "mcpbytes": {
      "url": "https://api.mcpbytes.com/mcp/3d",
      "headers": {
        "Authorization": "Bearer ${env:MCPBYTES_API_KEY}"
      }
    }
  }
}
11 more clients in the docs →
MCP tools
animate_3d_model
Animates a rigged humanoid GLB (two legs, two arms and a head, e.g. model.glb of a rig_3d_model job) from a description of a motion such as "A person walks forward confidently". Adds one animation clip, up to 10 seconds at 30 frames per second, to the model's own file: its mesh, textures and skeleton are unchanged. Planted feet stay where they land and on the floor. Accepts one self-contained, uncompressed GLB with one skeleton, up to 1,000,000 triangles. Returns model.glb (animated), motion.json (bone roles, facing, travel, foot contacts), motion_report.json (foot sliding, floating, floor penetration and rotation pops; status passed, needs_review or failed_checks) and motion_preview.png. Works best on everyday movement, gestures, dancing and combat, described as "A person…". A succeeded job means the motion was written, not that it looks right: read motion_report.json and look at motion_preview.png. This is an asynchronous job; use get_job to follow progress. A failed job is refunded. Costs 20 credits per job. Requires idempotency_key; retain it when retrying the same request.
create_upload
Returns a one-hour URL to PUT a local file to; then call the tool with the upload_id.
get_job
Status and results of a job; waits up to wait_seconds for it to finish.
cancel_job
Cancel a queued job or a workflow whose can_cancel is true; repeated calls never delete results.
list_jobs
Your most recent jobs, newest first.
read_job_file
Reads a text output (.txt .json .md .csv) of a succeeded job in chunks.
Full reference: inputs, options, outputs, limits and errors

Your first jobs are on us.

Start with 300 free credits. Sign in with GitHub or email and try a tool in your browser. No card required.