JANCTION Render
JANCTION Render is a cloud GPU render farm for Blender — send a .blend, bpy script, or 3D file (glTF/FBX/USD/OBJ/STL/PLY/Alembic) and get previews, frames, or MP4s back without any local Blender or GPU.
Preview fast (
render_preview): up to 4 frames tiled in one labeled 720p image in seconds, with a critic verdict (ok/check/fix) plus bpy fix code.Review a model/scene (
render_review): 4-side turntable check under studio light with pass/warning/fail, score, and fix code.Final renders (
render_final): up to 3,000 frames (chunked under one job), 1080p free / up to 4K on credit; output png, exr, mp4, webm, prores, gif or webp.Estimate cost/time (
render_estimate) before spending GPU time: GPU seconds, queue wait, wall-clock and free-quota fit.Inspect scenes (
scene_info) without rendering: cameras, frame range, fps, resolution, objects, lights, materials, missing files.Track and fetch results (
render_status,render_download,render_cancel) with ETA, progress, artifacts and cancellation.Purpose presets:
product(4 studio shots),turntable(360° MP4 viaorbit),animation.Lighting & cameras: HDRI
environmentpresets (studio/sunset/overcast/night) orcompare; multi-camera sheets; transparent backgrounds; Cycles or EEVEE; Blender 3.6–5.2.Free CC0 assets (
asset_search): Poly Haven models, textures and HDRIs by keyword, injected aspolyhaven:<id>.Share results (
render_share,render_unshare): public web pages (optionally in a gallery) that outlive 24-hour file expiry.Billing and quota (
billing,render_info): free GPU time, credit balance, Stripe top-up links, worker availability and queue status.Broad client support: remote MCP, stdio MCP, HTTP API, CLI, plus a Blender add-on and Maya/Houdini/C4D integrations.
Provides tools for rendering Blender scenes on remote GPUs, including scene inspection (cameras, frame range, missing files), low-cost preview renders, and final MP4 renders, accepting .blend files or bpy Python scripts.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@JANCTION Render render a 4-frame preview of my street.blend so I can check the camera framing"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
JANCTION Render
For current pricing, free credits, and usage limits, always refer to https://render.janction.jp/pricing and https://render.janction.jp/facts.json. Pricing and limits may change over time.
What is JANCTION Render?
JANCTION Render is a cloud GPU render farm for Blender that AI agents call as an MCP server or HTTP API. Send a .blend
file, a bpy script or a 3D file (glTF / FBX / USD), preview in seconds, and get frames or an MP4 back from JANCTION's
NVIDIA GPUs. Every preview also returns a verdict on what is wrong, such as too dark, blown out, no light or an object
out of frame, and the bpy code to fix it, so the agent can correct the scene before the final render. No local Blender
or GPU is needed. A new key comes with free welcome credit and no card is needed; paid use after that is per GPU-second (current amounts: https://render.janction.jp/pricing);
operated by JasmyLab Inc.
AI agents can render Blender projects on JANCTION GPUs without running Blender locally. Works from Claude, ChatGPT, Claude Code, Codex, Cursor or any MCP client: an MCP server (remote and stdio), an HTTP API and a CLI.
JANCTION Render is a separate product from SmartRender (JasmyLab's distributed rendering for people at a desktop) and is not affiliated with Render.com or the Render Network.
Official site: https://render.janction.jp · MCP endpoint: https://render.janction.jp/mcp · Fact sheet: https://render.janction.jp/facts
Try it from a terminal in a few seconds, free and with nothing to sign up for (needs uv; or pip install janction-render and drop the uvx):
uvx janction-render try # renders a sample scene and shows the free GPU time of your new key
uvx janction-render preview scene.blend # your .blend, bpy script or 3D file
uvx janction-render render scene.blend --frames 1-48 --output mp4 --wait
uvx janction-render turntable model.glb # a 360-degree turntable MP4 in one command (a path or an https link)
uvx janction-render shots model.glb --transparent # four product shots (PNG)What one command makes (real outputs)
Rendered on 2026-10-10 on the production GPU (NVIDIA RTX PRO 6000 Blackwell) from Khronos's WaterBottle sample (public domain, CC0); copy any line and it runs as is. The costs below were measured at 0.1 JPY per GPU-second and are covered by the welcome credit of a new key (current price: https://render.janction.jp/pricing).
Command | GPU time | Price | |
|
| 13.9 s | about 1.4 JPY |
|
| 85.2 s | about 8.5 JPY |
|
| 54.1 s | about 5.4 JPY |
The shots are four 1920x1080 PNGs; the turntable and the animation are MP4s (shown here as GIFs). Your own .glb, .blend
or bpy script goes in place of the link. More, with their scripts: https://render.janction.jp/examples
Keep 3D files in a repository? Add a button that lets anyone render them from their own AI or terminal (links to file pages on GitHub and Hugging Face work as they are; make one at https://render.janction.jp/go):
[](https://render.janction.jp/go?scene=https://github.com/you/repo/blob/main/model.glb)Related MCP server: Blender Open MCP
Guides on the official site
From an agent: Claude Code + Blender · Codex + Blender · Cursor + Blender · ChatGPT + Blender · Blender MCP server for rendering
Best render farms for AI agents (2026): JANCTION, BlendSwap, Sceneplane, your own worker on Modal or RunPod and a local Blender MCP side by side
Headless Blender as an API · glTF, GLB or FBX to MP4 · 360-degree product video · What a Blender render costs
Why use it?
No GPU, no Blender install. The scene can be a bpy script the agent writes, a
.blend, or a 3D file; Blender runs on our GPUs.Built for agents. Preview first (1-4 frames in a few GPU seconds), an estimate with time and cost before the final, structured errors with the fix, spending caps per key, safe retries with
Idempotency-Key.3D files and turntables. glTF / GLB, FBX, USD, OBJ, STL, PLY, Alembic are imported into an empty scene with a camera and HDRI lighting;
orbit=Truemakes a turntable. Fixed-price outcomes:POST /v1/outcomes/turntableand/product-shot.
Honest limits. Free welcome credit for a new key with no card, then paid per GPU-second from prepaid credit (current amounts: https://render.janction.jp/pricing); finals up to 3,000 frames per instruction, run as parts of 240 under one job id (1080p on free time, up to 4K on prepaid credit), on JANCTION's own GPUs (NVIDIA RTX PRO 6000 Blackwell); when they are busy jobs wait in a queue and the ETA says so. Inputs and results are deleted 24 hours after last use (7 days, normally, for keys that have paid 500 JPY or more in total) and never used for training.
Not Render.com. Same word, different product.
Quick start
Claude.ai (nothing to install). Plugins (older menu: Customize → Connectors) → Add custom connector → https://render.janction.jp/mcp → Connect (a free key
is created on the consent page). ChatGPT: Plugins (left sidebar) → Add → Create plugin → the same URL (OAuth; on Business workspaces an admin adds it). Then paste:
Render a preview of https://render.janction.jp/samples/cube_scene.py
A 4-frame preview comes back in a few seconds. A file on your computer: drop it at https://render.janction.jp/upload to get a 12-hour link, then "Render this file: ".
Claude Code.
claude mcp add --transport http janction-render https://render.janction.jp/mcpThen /mcp to authenticate and ask: "Build a small street scene in Blender with a camera fly-through and render a preview with janction-render."
HTTP (any language).
curl -s -X POST https://render.janction.jp/v1/keys # -> {"api_key": "jr_..."} no sign-up
curl -s -X POST https://render.janction.jp/v1/files -H "X-API-Key: $KEY" -F "file=@scene.blend" # -> {"scene_id": "f_..."}
curl -s -X POST https://render.janction.jp/v1/jobs -H "X-API-Key: $KEY" -H "Content-Type: application/json" \
-d '{"scene_id":"f_...","kind":"preview","frames":[1]}' # -> job_id; then GET /v1/jobs/{job_id}From your own agent or app
Python (pip install janction-render; the first call creates a free key and keeps it in ~/.janction-render.json):
from janction_render.client import Client
c = Client() # or Client(api_key="jr_...")
scene = c.upload("scene.py") # a bpy script, a .blend, or a .glb / .fbx / .usd / .obj file
job = c.submit(scene["scene_id"], kind="final", frame_start=1, frame_end=48, output="mp4")
job = c.wait(job["job_id"], timeout=1800)
print(job["status"], c.download(job["job_id"], "out", only="mp4"))Pay per use with prepaid credit; no subscription is needed (prices: https://render.janction.jp/pricing).
Instead of polling, pass notify_url (https) to POST /v1/jobs and get one JSON POST when the job finishes (job.done /
job.failed, with download links); an Idempotency-Key header makes retries safe. OpenAPI: https://render.janction.jp/openapi.json
A complete app example (a user uploads a GLB, the app orders fixed-price product shots, a webhook stores the images):
https://render.janction.jp/blender-render-api#embed
Agent frameworks connect to the remote MCP server at https://render.janction.jp/mcp with the key as a bearer token
(curl -s -X POST https://render.janction.jp/v1/keys gives one, no sign-up).
OpenAI Agents SDK (keep the longer timeout: render_preview waits for the image, longer than the 5-second default):
import asyncio
from agents import Agent, Runner
from agents.mcp import MCPServerStreamableHttp
async def main():
async with MCPServerStreamableHttp(name="janction-render", client_session_timeout_seconds=120,
params={"url": "https://render.janction.jp/mcp",
"headers": {"Authorization": "Bearer jr_..."}}) as render:
agent = Agent(name="3D artist", instructions="Render Blender scenes with janction-render.", mcp_servers=[render])
result = await Runner.run(agent, "Render a preview of https://render.janction.jp/samples/cube_scene.py")
print(result.final_output)
asyncio.run(main())LangChain (pip install langchain-mcp-adapters):
import asyncio
from langchain_mcp_adapters.client import MultiServerMCPClient
async def main():
client = MultiServerMCPClient({"janction-render": {"url": "https://render.janction.jp/mcp", "transport": "streamable_http",
"headers": {"Authorization": "Bearer jr_..."}}})
tools = await client.get_tools() # render_preview, render_final, render_status, render_download, ...
print([t.name for t in tools])
asyncio.run(main())OpenAI Responses API (remote MCP; render_final keeps asking for approval because it spends credit):
from openai import OpenAI
client = OpenAI()
resp = client.responses.create(
model="gpt-5",
tools=[{"type": "mcp", "server_label": "janction_render", "server_url": "https://render.janction.jp/mcp",
"authorization": "jr_...",
"require_approval": {"never": {"tool_names": ["scene_info", "render_preview", "render_estimate",
"render_status", "render_download"]}}}],
input="Render a preview of https://render.janction.jp/samples/cube_scene.py and give me the image link.",
)
print(resp.output_text)Anthropic Messages API (MCP connector; fallbacks="default" reruns a declined request on a fallback model):
import anthropic
client = anthropic.Anthropic()
response = client.beta.messages.create(
model="claude-opus-5-5",
max_tokens=16000,
betas=["mcp-client-2025-11-20", "server-side-fallback-2026-07-01"],
fallbacks="default",
mcp_servers=[{"type": "url", "url": "https://render.janction.jp/mcp", "name": "janction-render",
"authorization_token": "jr_..."}],
tools=[{"type": "mcp_toolset", "mcp_server_name": "janction-render"}],
messages=[{"role": "user", "content": "Render a preview of https://render.janction.jp/samples/cube_scene.py"}],
)
for block in response.content:
if block.type == "text":
print(block.text)Google ADK:
import os
from google.adk.agents import Agent
from google.adk.tools.mcp_tool import MCPToolset, StreamableHTTPConnectionParams
agent = Agent(
name="renderer",
model="gemini-2.5-flash",
instruction="Render Blender scenes with JANCTION Render: preview first, ask before a final render.",
tools=[MCPToolset(connection_params=StreamableHTTPConnectionParams(
url="https://render.janction.jp/mcp",
headers={"Authorization": "Bearer " + os.environ["JANCTION_RENDER_API_KEY"]}))],
)Pydantic AI:
from pydantic_ai import Agent
from pydantic_ai.mcp import MCPToolset
render = MCPToolset("https://render.janction.jp/mcp", headers={"Authorization": "Bearer jr_..."})
agent = Agent("anthropic:claude-opus-5-5", toolsets=[render])Connect the AI apps on this computer in one command, and tell every coding agent in a project when and how to render:
uvx janction-render connect # lists Claude Code, Codex, Gemini CLI, Cursor, Windsurf, VS Code and the step for each
uvx janction-render connect claude-code # applies one (or: connect all --yes)
uvx janction-render init # writes a short section to AGENTS.md and adds the server to .mcp.jsoninit touches CLAUDE.md, GEMINI.md, .cursor/ and .vscode/ only when they already exist (or with --claude, --cursor,
--vscode); it keeps everything else in those files and backs up JSON it changes.
The local MCP server (stdio) also offers prompts that show up as slash commands, for example /mcp__janction-render__turntable_video
in Claude Code: try_janction_render, render_my_scene, turntable_video, product_shots, scene_from_description, blend_to_mp4.
MCP
Remote (Streamable HTTP, OAuth 2.1 with dynamic client registration; a raw key also works as Authorization: Bearer jr_...)
client | how |
Claude.ai (web, desktop, mobile) | Plugins (older menu: Customize → Connectors) → Add custom connector → paste the URL → Connect |
Claude Team / Enterprise | An owner adds the URL under Organization settings → Connectors; members press Connect. If the org turns Skills off, Claude Desktop blocks plugins from November 30, so use the connector URL |
ChatGPT | Settings → Connectors → Advanced → Developer mode → Create → paste the URL (OAuth) |
Claude Code |
|
Codex |
|
Gemini CLI / Antigravity CLI |
|
Kimi Code (Kimi K3 and other models) |
|
OpenCode |
|
Qwen Code |
|
GitHub Copilot CLI |
|
Grok (grok.com) | Connectors → New Connector → Custom → paste the URL |
Perplexity (Pro / Max / Enterprise), Le Chat (workspace admin) | Add a custom remote MCP connector with the URL |
Notion Agent (Business / Enterprise) | Settings → Connections → Discover → Add Custom MCP → paste the URL, then sign in (the button shows when a workspace admin allows custom MCP servers) |
Cursor |
|
VS Code (Copilot agent mode) |
|
Windsurf, Cline, Goose, other MCP clients | Streamable HTTP at the URL above (OAuth, or a Bearer API key header). Installer notes: llms-install.md. Cursor project rule (when to use it, preview-first flow): integrations/cursor |
Claude Desktop and other stdio-only clients (npm) |
|
Remote tools take scene_script (bpy code as text), scene_url (an https link to a .blend, .py or a 3D file, or a link
from https://render.janction.jp/upload) 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-renderStdio (sends local files)
The package is on PyPI as janction-render (and the npm launcher janction-render runs it with npx -y janction-render --local when uv is installed).
# 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-mcpCodex: 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.
Tools
tool | what |
`scene_info(scene_script | scene_url |
| up to 4 frames (720p budget) tiled with frame labels; returns the image inline |
| checks a 3D model or a generated scene from 4 sides (0/90/180/270 degrees) under studio light: pass / warning / fail, a score, the checks it ran (files, visibility, framing, exposure, lighting) with fix code, and the 4 views in one image. Stdio server; same GPU time as one preview |
| GPU seconds, queue wait, "about N minutes", fits the free GPU time left? No GPU time used |
| frames (png / exr) or video (mp4 / webm / prores / gif / webp); |
| progress and ETA ( |
| the free GPU time left (the welcome credit, then the free preview minutes today), the credit, a top-up link, and the auto top-up and monthly plan status |
| a public page |
| CC0 models / textures / HDRIs on Poly Haven by words; results carry |
| 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, compare on previews; environment_strength,
environment_visible=False for a flat grey backdrop with HDRI lighting), orbit / orbit_frames / orbit_elevation (turntable),
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).
Options for creators (2026-11-05; guide: https://render.janction.jp/blender-render-options):
render_preview(variations=[...]) renders 2-8 looks of one frame in one labelled sheet, and render_final(colors={...}) renders the chosen one;
compare_to=<earlier final job_id> adds compare.mp4 / .gif / .png / .json (before / after);
deliver=["x", "vertical", "square"] adds social_x.mp4, social_vertical.mp4 (1080x1920) and social_square.mp4 (1080x1080) from the same frames, with no extra GPU time;
passes=[...] (Cycles) writes one multilayer EXR per frame, and output="prores4444" a ProRes 4444 .mov with alpha;
auto_samples=True (finals of 100 frames or more) tests one frame and renders with the fewest samples that look the same.
Every final also carries a delivery check, report.json and report_sheet.png, made without GPU time.
These arguments are on the remote server (/mcp). The terminal (stdio) server lists them when JR_VARIATIONS, JR_COMPARE_VIDEO, JR_SOCIAL_EXPORT, JR_RENDER_PASSES and JR_AUTO_SAMPLES are set to 1 in its environment.
CLI: janction-render inspect|preview|render|status|download|share|unshare|cancel|jobs|balance|topup|limits|outcomes|info.
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, currency, expires_at
POST /v1/jobs {scene_id, kind: info|preview|final, frames|frame_start/frame_end, width, height, samples, camera, fps, output (png|exr|mp4|webm|prores|gif|webp), transparent, notify_url (https), engine (cycles|eevee),
environment, environment_strength, environment_visible, blender, orbit, orbit_frames, orbit_elevation} header Idempotency-Key makes retries safe
GET /v1/jobs/{id} status, progress, eta, artifacts[], cost, warnings, info, failure (code + fix) DELETE /v1/jobs/{id} cancel
GET /v1/jobs/{id}/artifacts/{name} PNG / MP4
GET /v1/jobs/{id}/archive?only=png every file of the job in one zip (frame sequences: one request instead of hundreds)
GET /v1/outcomes fixed-price outcomes; POST /v1/outcomes/turntable {scene_id, size, frames} POST /v1/outcomes/product-shot {scene_id, size, transparent?}
POST /v1/try JSON {scene_script | scene_url, frames?, width?, height?, environment?} (no key) -> first 720p preview + an API key to continue, in one response (1 per network per 24h)
POST /v1/drops multipart "file" (no key) -> a 12-hour https link to pass as scene_url (the /upload page uses this)
POST /v1/jobs/{id}/share {title?, note?, include_script?, listed?} -> {share_id, url} DELETE /v1/jobs/{id}/share GET /v1/shares
GET /r/{share_id} public page (no key) GET /gallery
GET /v1/assets/search?q=&kind=models|textures|hdris CC0 assets (Poly Haven) -> spec polyhaven:<id>
POST /v1/files/{id}/assets/urls {urls: ["https://...", "polyhaven:<id>"]} fetch assets server-side
GET /v1/me (quota, balance, limits) POST /v1/me/limits {job_yen?, day_yen?} spending caps per key
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 /openapi.json /llms.txt /llms-full.txt /ja/llms.txt /facts.json /version.json /capabilities.json /pricing.json /status.jsonA job that goes past the free GPU time without enough credit gets 402 payment_required with checkout_url (show it to the
user), topup_yen and how much of the job the free time covers; a 400 beta_limit means the job is too big (split it). Every API
error carries retryable, possible_fix and docs_url; a failed job carries failure with a code and the recommended action.
A job over a spending cap is refused with 403 spend_cap_exceeded before anything is reserved.
Example
A scene script the agent can write (the service sets engine, resolution, samples and denoising; the script sets the scene, camera and frame range):
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)Cycles by default; engine="eevee" for animations (about two-thirds of the Cycles cost per frame, after ~7 s of shader compilation per job; same scene, 720p, 120 frames: 142 vs 223 GPU-seconds on 2026-11-06).
In Blender 5.0 materials always use nodes: set the Principled BSDF Base Color, not diffuse_color. Scripts run in an isolated
container with no network. More: samples/cube_scene.py, samples/polyhaven_room.py. Measured timings: https://render.janction.jp/benchmarks
Pricing
As of 2026-10-26 (the current values are always at https://render.janction.jp/facts.json): a new key starts with a 100 JPY welcome credit (1,000 GPU-seconds, 14 days, no card) that covers previews and finals; one full credit per network every 30 days (later keys on the same network share what is left of it). Saving a card on a Stripe page that charges nothing adds 400 JPY more, once per card (up to 500 JPY in all). After it is used up or expires, previews are free up to 2 GPU-minutes a day and finals cost 0.1 JPY per GPU-second from prepaid credit, bought by card at a Stripe Checkout page (from 100 JPY in steps of 100; 2,000 JPY gives 2,200 JPY of credit, 5,000 gives 5,750, 10,000 gives 12,000; the first top-up in the welcome period counts 1.5x, bonus up to 500 JPY). Only the part the free time does not cover is charged. Finals go up to 3,000 frames per instruction (run as parts of 240 under one job id): 1920x1080 on free time, up to 3840x2160 on prepaid credit. Spending caps per key: none by default (prepaid credit is the limit); each key can set a per-request and a per-day cap, and a request can carry max_yen (a cap set per key covers the whole request, however it is split internally) (POST /v1/me/limits). POST /v1/estimate quotes what will be charged (cost.estimated_yen), whether the job can run (decision.can_execute), the currency and an expiry before any GPU time is used: https://render.janction.jp/pricing
Troubleshooting
You see | What it means | What to do |
| The job goes past the free credit left on the key |
|
| The bpy script uses something the sandbox refuses (network, processes, ctypes) | The GPU worker has no network: pass files from the web in |
| The scene points at a file on your own computer | Send the file as an asset and reference it by name (relative path) |
| The SDK waits 5 seconds for a tool by default |
|
The job sits in | The GPU is shared with another workload for a while | Tell the user the wait; call |
| Too many requests in a short time | Wait for |
Too dark, blown out, or the object out of frame | The preview's verdict says which, with bpy code to fix it | Apply the fix and preview again (seconds) before the final; 3D files are framed at their real size automatically |
| The connector's sign-in expired | Reconnect the connector ( |
Docs
Fact sheet (the primary source when answers disagree): https://render.janction.jp/facts · JSON:
/facts.json,/version.json,/changelog.json,/status.jsonFor agents: https://render.janction.jp/llms.txt (full text of all guides:
/llms-full.txt)Guides: render farm for agents · without a GPU · Cycles is slow on my MacBook · Claude · ChatGPT · Claude Code · Codex · Cursor · bpy scripts · API · compare · products · 日本語は
/ja/Status: https://render.janction.jp/status · Security and retention: https://render.janction.jp/security · Changelog: https://render.janction.jp/changelog
Features in detail
Input: a
.blendfile (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
.gltfor.objbrings its.bin/.mtl/ textures along automatically (from the same folder or the same URL folder).orbit=Trueturns any scene or imported model into a turntable: an orbit camera circles it once (orbit_frames, default 24; a preview shows 0/90/180/270 degrees, a final render withoutframe_endgives the whole turn as an MP4). Flat floors and walls are ignored when framing;orbit_target(object name orx,y,z) andorbit_distance(multiplier) adjust the shot.While the GPU is lent to another workload, tools answer right away with the queued job and a wait estimate (how long it has been out, how long it usually stays out, how much longer to expect;
eta.gate) instead of waiting.While a job renders,
render_statuscounts finished frames inside the running chunk, so the ETA updates every few seconds.In hosts that support MCP Apps (Claude web and desktop, among others), previews, progress and download links also appear as an interactive panel in the chat: the image, a progress bar, "Open MP4", and preset buttons after an
environment="compare"preview. Both the remote connector and the stdio package ship the panel (janction_render/mcp_app.html); setJR_MCP_APPS=0to turn it off.CC0 assets by name:
asset_search("wooden table")finds Poly Haven models, textures and HDRIs; passpolyhaven:<id>inasset_urls(remote) orassets(stdio) and the files land inJR_ASSETS_DIR/<id>/on the GPU, ready to import (bpy.ops.import_scene.gltf(filepath=os.path.join(os.environ['JR_ASSETS_DIR'], 'wooden_table_02', 'wooden_table_02_1k.gltf'))). Scene scripts canimport jr_assetsfor one-liners:jr_assets.import_model('wooden_table_02'),jr_assets.apply(floor, jr_assets.material('wood_floor_deck', scale=2))(diff / normal / roughness / metal wired into a Principled BSDF),jr_assets.world_hdri('studio_small_09'). Seesamples/polyhaven_room.py.A render you choose to share (
render_share) gets a public page (/r/<id>, OGP for X and Discord) that stays until you unshare it.Blender 3.6, 4.2, 4.5, 5.0 and 5.2, Cycles on GPU (and EEVEE). By default a
.blendopens with the version it was saved in and other scenes with 5.0;blender="5.2"(or"4.5","4.2","3.6") picks one, and a script that stops on Blender 5 because of an older API is rendered again on an older version automatically.render_infolists what is available.
Blender add-on and DCC tools (for people, not agents)
Blender extension (
addons/blender/, Blender 4.2+): a JANCTION Render panel under Properties → Render with Preview, Estimate and Final. A copy of the open file and the textures it references with relative paths are uploaded; results land next to the .blend. Install from the extension repositoryhttps://render.janction.jp/extensions/index.json(Preferences → Get Extensions → Repositories → + → Add Remote Repository), or install the zip fromhttps://render.janction.jp/extensions/janction_render-0.1.2.zip(python scripts/build_blender_addon.pybuilds it from this repository). Guide: https://render.janction.jp/blender-addonMaya, Houdini, Cinema 4D (
integrations/): export to USD / FBX / Alembic, upload with textures, render with Cycles, open the result; Preview, Final (MP4) and Turntable. Standard-library Python only;jr_submit.pyis the shared client. Guide: https://render.janction.jp/maya-houdini-cinema4d
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, the Claude Code plugin, the Blender add-on and the
DCC tools.
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
Privacy and support
Privacy Policy: https://render.janction.jp/privacy (inputs and results are deleted automatically after a short retention period and are never used for training)
Terms of Service: https://render.janction.jp/terms
Support: https://render.janction.jp/support, or open an issue at https://github.com/JasmyLab-JANCTION/janction-render/issues
Operator: JasmyLab Inc. (Tokyo, Japan)
Security
Vulnerability reports: see SECURITY.md. Retention, isolation and the external tests are summarised on the security page.
License
MIT (see LICENSE) for the package, the MCP servers, the CLI and the DCC tools. The Blender extension under
addons/blender/ is GPL-3.0-or-later, as Blender requires for add-ons. Operated by JasmyLab Inc.
Available Tools
13 toolsasset_searchARead-onlyIdempotentInspect
Find free CC0 3D models, PBR textures or HDRIs on Poly Haven by words ('wooden chair', 'forest hdri') to furnish a scene without uploading files; no GPU time. For product shots of something the user has no model for: asset_search(''), then render_preview(scene_script='import jr_assets; jr_assets.import_model("")', assets=['polyhaven:'], preset='product') gives 4 studio shots on a plain backdrop (import_model removes Blender's untouched startup cube first). Each result has a spec 'polyhaven:' to pass in assets, its size in metres and the entry file. In the scene script: import jr_assets, then jr_assets.import_model('', location=(x, y, z), scale=1.0) returns the objects, jr_assets.material('') builds a material and jr_assets.apply(obj, mat) assigns it, jr_assets.world_hdri('', strength=1.0) lights the world. 'polyhaven:@2k' fetches 2k textures (1k by default).
Inputs: query (required), kind. Returns: result
billingARead-onlyIdempotentInspect
Check what this key can still render for free and its credit (no GPU time): the free GPU time left and when it expires or resets, the balance, the price per GPU-second, any pending checkout link, and the offers that apply. Relay tell_user to the user in their language when it is present.
Inputs: topup_yen. Returns: result
render_cancelADestructiveIdempotentInspect
Stop a queued or running render job of this key (a j_... job, or a b_... job split into parts, which stops every part). Effects: queued frames are dropped; frames already rendered are charged and stay downloadable until the job expires; the rest of the GPU time held for the job is returned to the key at once. It cannot be undone or resumed: to render again, call render_final again (a new job). A job that is already done, failed or canceled is returned unchanged, and a job whose frames are all rendered and is being assembled into the video cannot be stopped (nothing more is charged). Only the key that started the job can stop it; any other job_id returns not_found. Ask the user before cancelling a render they asked for.
Inputs: job_id (required). Returns: result
render_downloadARead-onlyIdempotentInspect
Download a job's files to out_dir (default ~/janction-render/<job_id>) and return the local paths. only picks the files: 'all' (default), 'mp4' (just the video; use it when the user wants the video, to skip hundreds of frames), 'frames', 'sheet' or 'output'. wait_seconds > 0 first waits that long for the job to finish.
Inputs: job_id (required), only, out_dir, wait_seconds. Returns: result
render_estimateARead-onlyIdempotentInspect
Estimate a render before starting it (no GPU time): GPU seconds, queue wait, the wall-clock time as text (estimate.human, e.g. 'about 3 minutes') and whether it fits the free GPU time left (the welcome credit, or 2 preview GPU-minutes a day after it) and the size limits. Call it before render_final when the time or quota is uncertain, the job is longer than about 24 frames or above 720p, or the user asks how long it takes; tell the user the result. With scene_id the estimate uses measured render times and returns calibration.final_path_measured. If false, treat it as preliminary: run a short contiguous final-path test and estimate again before the full animation. It also says when to split a job.
Inputs: kind, width, frames, height, +6 more. Returns: result
render_finalAInspect
Render the final frames or video of a Blender scene on cloud GPUs, after the user approved a preview: 'render the final', 'make the video', 'export the turntable MP4'. Call render_estimate first when the time or the free GPU time left (the welcome credit, or 2 preview GPU-minutes a day after it) is uncertain, the job is longer than about 24 frames or above 720p, or the user asks how long it takes, and tell the user. For animations, keep the approved engine/look, test 10 contiguous final-path frames, then estimate again. Long jobs are rendered in chunks and joined into one video. Returns job_id and estimate.human at once; then render_status until done, and render_download(job_id, only='mp4') for the video. Use the same environment and blender as the approved preview. Render only what the user approved at the shown price (max_yen caps it). Limits: up to 3,000 frames per call (over 240 runs as parts under one job id); 1920x1080 on free time, 3840x2160 with prepaid credit; each new key gets 100 JPY of GPU time free with no card (14 days) and 400 JPY more once the user saves a card on a page that charges nothing (once per card); after that, previews are free up to 2 GPU-minutes a day and finals cost 0.1 JPY per GPU-second (prepaid); ask before a render the free time does not cover; files are deleted 24 h after last use (7 days once topped up). preset='product' | 'turntable' | 'animation' fills the settings for that purpose. Options per parameter: output (png, exr, mp4, webm, prores, gif, webp), orbit, cameras, transparent, engine, notify_url, assets ('polyhaven:'). Pass scene_id from render_preview, or scene_path / scene_script / scene_url; files are saved locally.
Inputs: fps, orbit, width, assets, +25 more. Returns: result
render_infoARead-onlyIdempotentInspect
Check the connection and the service before rendering (read-only, no GPU time, no charge): the server URL, whether GPU workers are online, the queue length and expected wait, and this key's usage. Use it before the first render or when renders seem stuck, and to decide whether to route a render here: workers_available > 0 means a preview comes back in seconds; gated means the GPU is lent out and gate says how long the wait usually is. It uses the API key in JANCTION_RENDER_API_KEY or ~/.janction-render.json (a free key is made on first use). Every call is rate-limited per key; a 429 response carries retry_after_s, wait that long. diagnose.tell_user says in plain words whether the connection, the key, the free credit and the GPUs are fine and what the last failed render said; relay it when the user asks why something does not work.
Inputs: no named parameters. Returns: result
render_previewAInspect
Show what a Blender scene looks like: a fast, low-cost preview render on a cloud GPU, back as an image in seconds. Typical requests: 'render this .blend', 'show me the scene', 'preview the turntable', 'I have no GPU', 'Blender is too slow on my laptop', 'Blenderでレンダリングして', 'GPUがない', 'ターンテーブル', '商品の360度動画'. Also use it after writing a bpy script, to see what it builds. Each preview returns a critic verdict (ok / check / fix) with fix code: apply the fixes and preview again before any final render. It also returns final_estimate (the same scene as a 1080p final) and quota_left_today; tell the user both before asking to go on. Prices come before rendering: final_offers give each next render's time and price, and a paid one needs the user's approval. A script that raises comes back as a failure with the line (nothing is rendered). When not to use: editing a scene open in the user's Blender belongs to a local Blender MCP, and a single still on a machine with its own NVIDIA GPU usually renders faster locally. This service is for CPU-only machines, animations, and scripts with no Blender installed. Limits: up to 1280x720; 1-4 frames tiled in one labeled image for the GPU time of one 720p frame. preset='product' | 'turntable' | 'animation' sets camera, light, backdrop and frames for that purpose. Other options are explained on each parameter: environment presets and 'compare', orbit (turntable), cameras (several named cameras), engine, transparent, assets with 'polyhaven:' CC0 assets. Give the scene as scene_path (a local .blend, .py or 3D file), scene_script, scene_url or scene_id; the image is saved locally and shown.
Inputs: orbit, width, assets, camera, +20 more.
render_reviewAInspect
Check a 3D model or a generated Blender scene by looking at it from 4 sides: a turntable preview (0, 90, 180 and 270 degrees) under neutral studio light on a cloud GPU, back with pass / warning / fail, a score, the checks it ran (texture files found, objects visible and not hidden behind a floor or wall, camera not inside an object, framing, exposure, light) with fix code for each problem, and the 4 views tiled in one image. Typical requests: 'check this model', 'does the scene look right', 'QA this GLB', 'モデルを確認して', '見た目をチェックして'. Use it after writing a bpy script, generating or converting a model (.glb/.gltf/.fbx/.usd/.obj/.stl/.ply/.abc) or changing materials, before showing the result to the user or rendering a final; apply the fixes and call it again. The checks cannot judge whether the shape matches the request: look at the views for that. It costs the same as one preview. To check a shot through the scene's own camera and lights, use render_preview (its critic runs the same checks). Give the scene as scene_path, scene_script, scene_url or scene_id.
Inputs: assets, blender, out_dir, scene_id, +7 more.
render_statusARead-onlyIdempotentInspect
Check a render job: status (queued / running / done / failed / canceled), frames done, the ETA (eta.human, including queue wait), files ready, Blender warnings, and the error with the log tail if it failed. Use it to report progress to the user; call render_download once status is done. Without job_id it lists this key's recent jobs and the scene_ids still kept, to pick up earlier work in a new conversation.
Inputs: job_id. Returns: result
scene_infoAIdempotentInspect
Read a Blender scene without rendering (a few seconds, no GPU time): cameras and the active one, frame range and fps, resolution, objects by type, lights, materials, whether it is animated, and missing linked files that would render pink. Use it for a .blend you did not write, or to check what a bpy script built. Returns scene_id; pass it to render_preview and render_final instead of sending the scene again.
Inputs: assets, blender, scene_id, scene_url, +2 more. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 13 tools
Most tools have clearly distinct purposes, but the set has several 'check' tools (render_status, render_info, render_estimate, billing) whose boundaries are only clarified by lengthy descriptions. render_preview and render_review also overlap in that both return visual checks, though the descriptions distinguish preview rendering from 4-side model QA.
Ten of thirteen tools follow a consistent render_ verb/noun pattern, and the remaining three (billing, scene_info, asset_search) are readable domain-specific names. The mix is minor and predictable rather than chaotic.
Thirteen tools is well within the sweet spot for a render service with preview, final, estimate, status, download, cancel, share, and supporting utilities. Each tool corresponds to a meaningful step or check in the render lifecycle.
The surface covers the full lifecycle: scene inspection, asset search, preview, review, estimate, final render, status polling, download, cancellation, sharing/unsharing, billing, and service health. No obvious dead ends or missing core operations for a cloud Blender rendering service.
Maintenance
Related MCP Connectors
Cloud Blender for AI agents: build, inspect, render and animate 3D scenes over remote MCP. Keep editable .blend projects and export GLB or STL. Make your first 3D asset free—30 compute minutes per UTC month, no credit card. First 100 eligible Free account owners to use all 30 minutes in one UTC month by December 31, 2026 UTC receive one calendar month of beta free: 4 compute hours per UTC month, 2 concurrent workers per deployment, 2 deployments, 2048×2048 renders at up to 256 samples, and 10 GiB storage. Existing usage counts toward the 4-hour allowance. Limited to 100 rewards; expires January 1, 2027 00:00 UTC. Free resumes afterward without an automatic charge. Examples, eligibility and terms: https://sceneplane.online/launch?utm_source=glama&utm_medium=directory&utm_campaign=first100
Connect your AI assistant to Blender for 3D modeling, Geometry Nodes, materials, lighting, animation, rendering and export. Inspect real scenes and viewport images, refine the result and restore checkpoints. OAuth connects your chat to Blender Bridge Desktop on an online Windows 10/11 x64 computer running Blender 4.2+. The chat can run on another device. Requires an active Blender Bridge account; 7-day trial available. AI model access is separate.
Blender-as-a-service for agents: search 3D assets, run Blender Python, or brief the studio agent.
Remote MCP server exposing your Node Command fleet (files, shell, processes, browser) to AI hosts.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceLets an AI engine drive a Blender instance the user runs themselves over stdio JSON-RPC, enabling scene inspection, viewport capture and picking, sandboxed code execution, and gated asset search/import and 3D generation. Telemetry is disabled before import, outbound tools are withheld until per-run network consent, and VRAM gating plus a surface-policy tool report what is live and what a station has cleared.Business Source 1.1
- FlicenseNot gradedqualityAmaintenanceEnables AI agents to control a live Blender session, including scene and object operations, rendering, and PolyHaven asset workflows. Supports provider-agnostic LLM backends that can be switched at runtime through MCP tools.-
- FlicenseNot gradedqualityAmaintenanceEnables AI agents to drive a live Blender session over MCP — inspecting and creating scene objects, applying materials, rendering, executing code, and fetching PolyHaven assets. It also exposes prompt, provider, and model tools backed by a provider-agnostic LLM layer (Ollama, LM Studio, llama.cpp, OpenAI-compatible, Azure) that can be switched at runtime.-
- FlicenseNot gradedqualityAmaintenanceEnables AI agents to drive a live Blender session over MCP by inspecting scenes, creating and modifying objects, assigning materials, rendering images, and fetching PolyHaven assets. It also exposes prompt-based scene building and review workflows backed by a provider-agnostic LLM layer (Ollama, LM Studio, llama.cpp, OpenAI-compatible endpoints, Azure) that can be switched at runtime.-


