Skip to main content

JANCTION Render

JasmyLab-JANCTION/janction-render MCP server

A cloud GPU render farm for Blender, built for AI agents. Render Blender scenes on JANCTION GPUs from Claude, ChatGPT, Claude Code, Codex, Cursor or any MCP client: an MCP server (remote and stdio) plus a CLI. Use it to render Blender without a GPU, or when rendering locally is slow.

  • Input: a .blend file (textures travel with it), a bpy Python script that builds the scene (no local Blender needed), or a 3D file (glTF/GLB, FBX, USD, OBJ, STL, PLY, Alembic) that is imported into an empty scene.
  • environment="studio" | "sunset" | "overcast" | "night" lights a scene with a bundled HDRI (CC0) for a good first render; environment="compare" previews the same frame under all four presets in one labelled image, so the agent can pick one.
  • A .gltf or .obj brings its .bin / .mtl / textures along automatically (from the same folder or the same URL folder).
  • scene_info reads the scene without rendering (cameras, frame range, missing files).
  • render_preview returns 1-4 low-cost frames tiled in one image within seconds, so the agent can look, fix, and repeat.
  • render_estimate says how long a render will take ("about 3 minutes") and whether it fits today's free quota.
  • render_final renders the frames on GPUs and joins them into an MP4; render_status reports the remaining time.
  • Free beta: no charges. Each key gets 10 GPU-minutes per day; a final render is up to 240 frames at 1080p. Paid plans (per GPU second, prepaid credit) will be announced on the service page before they start.
  • Inputs and results are deleted 24 hours after last use and are never used for training.

Status

Free beta. Service page: https://render.janction.jp (/v1/health, /llms.txt, /faq). Blender 5.0, Cycles on GPU (blender="5.2" selects Blender 5.2 when the worker has it; render_info lists what is available). Guides: render farm for agents · without a GPU · Claude · ChatGPT · Claude Code · Codex · bpy scripts · API · comparison · 日本語は /ja/

Connect (remote MCP, nothing to install)

MCP server URL: https://render.janction.jp/mcp (Streamable HTTP). Auth is OAuth 2.1 with dynamic client registration: pressing "Connect" opens a page that creates a free API key (or takes one you already have). A raw API key also works as Authorization: Bearer jr_....

client how
Claude.ai (web, desktop, mobile) Settings → Connectors → Add custom connector → paste the URL → Connect
ChatGPT Settings → Connectors → Advanced → Developer mode → Create → paste the URL (OAuth)
Claude Code claude mcp add --transport http janction-render https://render.janction.jp/mcp, then /mcp to authenticate
Cursor, Windsurf, other MCP clients Streamable HTTP at the URL above (OAuth, or a Bearer API key header)

Remote tools take scene_script (bpy code as text), scene_url (an https link to a .blend, .py or a 3D file) or scene_id, plus asset_urls for textures or glTF .bin files; results come back as an inline image plus download links that need no key and work for about 24 hours (render_download(only="mp4") for just the video).

Claude Code plugin (the remote connector plus a skill with the workflow):

/plugin marketplace add JasmyLab-JANCTION/janction-render
/plugin install janction-render@janction-render

Install (stdio MCP, sends local files)

The package is on PyPI as janction-render.

# Claude Code (uvx runs it without a global install)
claude mcp add janction-render -e JANCTION_RENDER_SERVER=https://render.janction.jp -- uvx --from janction-render janction-render-mcp

# or with pip / pipx
pip install janction-render
claude mcp add janction-render -e JANCTION_RENDER_SERVER=https://render.janction.jp -- janction-render-mcp

Codex: add to ~/.codex/config.toml

[mcp_servers.janction-render]
command = "uvx"
args = ["--from", "janction-render", "janction-render-mcp"]
env = { JANCTION_RENDER_SERVER = "https://render.janction.jp" }

A temporary API key is issued automatically on first use and cached in ~/.janction-render.json; set JANCTION_RENDER_API_KEY to pin one (quota and, later, credit belong to the key). The same key can be used from the remote connector: paste it on the connect page.

Then, in Claude Code:

Build a small street scene in Blender with a camera fly-through and render a preview with janction-render.

Tools

tool what
`scene_info(scene_script scene_url
render_preview(..., frames="1-24", environment?, blender?) up to 4 frames (720p budget) tiled with frame labels; returns the image inline
render_estimate(scene_id, frame_start, frame_end, width, height, samples) GPU seconds, queue wait, "about N minutes", fits today's free quota? No GPU time used
render_final(scene_id, frame_start, frame_end, width, height, samples, fps, output, environment?, blender?) PNG or MP4; returns job_id + estimate
render_status(job_id) progress and ETA (eta.human); render_download(job_id, only="mp4" / "frames" / "all") files or links; render_cancel(job_id)
billing() free-beta quota (used today, daily limit, reset time); later balance and top-up link
render_info() workers online or gated (GPU lent to another workload), queue, expected wait, supported inputs, environment presets, Blender versions

Options on render_preview / render_final: environment (studio, sunset, overcast, night; environment_strength, environment_visible=False for a flat grey backdrop with HDRI lighting), blender ("5.2"), and assets (stdio: local files sent with the scene, found in the script through os.environ["JR_ASSETS_DIR"]; a .blend's external files are collected automatically with pip install janction-render[blend]) or asset_urls (remote).

CLI: janction-render inspect|preview|render|status|download|cancel|jobs|balance|topup|info.

Writing a scene script

import bpy, math
for ob in list(bpy.data.objects):
    bpy.data.objects.remove(ob, do_unlink=True)
scene = bpy.context.scene
scene.frame_start, scene.frame_end = 1, 24
bpy.ops.mesh.primitive_monkey_add(location=(0, 0, 1))
cam = bpy.data.objects.new("Camera", bpy.data.cameras.new("Camera"))
scene.collection.objects.link(cam); scene.camera = cam
cam.location = (6, -6, 4); cam.rotation_euler = (math.radians(60), 0, math.radians(45))
sun = bpy.data.objects.new("Sun", bpy.data.lights.new("Sun", "SUN"))
scene.collection.objects.link(sun)

The service sets engine (Cycles), resolution, samples and denoising; your script sets the scene, camera and frame range. Scripts run in an isolated container with no network. See samples/cube_scene.py.

HTTP API

POST /v1/keys                                   -> {api_key}         (header X-API-Key afterwards)
POST /v1/files  multipart "file" (.blend|.py|.glb|.fbx|.usd|.obj|...)   -> {scene_id}
POST /v1/files/{id}/assets  multipart "files"   textures, glTF .bin ...   GET /v1/files/lookup?sha256=  reuse an upload
POST /v1/estimate {kind, frames|frame_start/frame_end, width, height, samples, scene_id?} -> seconds, wall_seconds, human, quota
POST /v1/jobs   {scene_id, kind: info|preview|final, frames|frame_start/frame_end, width, height, samples, camera, fps, output,
                 environment, environment_strength, environment_visible, blender}
GET  /v1/jobs/{id}      status, progress, eta, artifacts[], cost, warnings, info    DELETE /v1/jobs/{id}  cancel
GET  /v1/jobs/{id}/artifacts/{name}             PNG / MP4
POST /mcp                                       remote MCP (Streamable HTTP; Bearer api key or OAuth)
GET  /.well-known/oauth-protected-resource/mcp  OAuth discovery
POST /v1/billing/checkout {amount_yen} -> {checkout_url}   POST /v1/billing/sync   GET /v1/ledger   GET /v1/me
GET  /llms.txt  /llms-full.txt  /ja/llms.txt  /faq  /terms  /privacy  /legal  /security  /support

During the free beta a 429 quota_exceeded response carries resets_at; a 400 beta_limit means the job is too big (split it). Once paid plans start, a 402 payment_required response carries checkout_url.

Self-hosting

The server (FastAPI + SQLite, with the remote MCP endpoint) and the worker (Blender in disposable Docker containers, --network none --cap-drop ALL) live in the internal repository and are not part of this package yet. This repository holds the client side: stdio MCP server, CLI, HTTP client, samples and the Claude Code plugin.

MCP registry

This server is listed in the official MCP registry as io.github.JasmyLab-JANCTION/janction-render (remote: https://render.janction.jp/mcp).

mcp-name: io.github.JasmyLab-JANCTION/janction-render

License

MIT (see LICENSE). Operated by JasmyLab Inc.

Metadata

Release files for janction-render 0.3.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for janction-render 0.3.1
File Size Uploaded
janction_render-0.3.1.tar.gz 27.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for janction-render 0.3.1
File Interpreter ABI Platform
janction_render-0.3.1-py3-none-any.whl Python 3 none any Details

Total release size: 53.7 kB

Release files / janction_render-0.3.1.tar.gz

Download URL janction_render-0.3.1.tar.gz
Size 27.3 kB
Tags Source
SHA-256 checksum
How to use checksums
ed02bfbd2115acdd2108625edcc34e8ce71970a3fc1a6eb2cdb7dbb2646a7ee7
BLAKE2b-256 checksum
How to use checksums
7e18967c47f38726fdc975b3ca41ad8ad52abaf4f4e20f9924a258a3c5dc7a41
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.

Transparency log

Release files / janction_render-0.3.1-py3-none-any.whl

Download URL janction_render-0.3.1-py3-none-any.whl
Size 26.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ec6dfe76e373208b91100c3b7082dd192db0556c65bcc5b0df04167e6c3ddfe9
BLAKE2b-256 checksum
How to use checksums
0c2d4036795599b37a1d4979f37a49314c9924a2ac20edb6bb335db1133c5ecf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.

Transparency log

Release history Release notifications | RSS feed

0.4.9

2 release files

0.4.8

2 release files

0.4.7

2 release files

0.4.6

2 release files

0.4.5

2 release files

0.4.4

2 release files

0.4.3

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.4

2 release files

0.3.3

2 release files

0.3.2

2 release files

This release

0.3.1 This release

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page