blender-render-mcp
Provides tools for submitting and managing Blender render jobs, including animation and still-frame rendering, with status polling and result download.
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., "@blender-render-mcpRender the attached .blend file as an animation using Cycles."
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.
Blender MCP renderer
This image runs a Streamable HTTP MCP server from a Python virtual environment and launches a separate Blender 5.2 background process for each render. It exposes get_gpu_info and an asynchronous render-job API at http://localhost:8080/mcp.
The image also includes Tailscale. Set TAILSCALE_AUTH_KEY at runtime to join your tailnet as blender-render-mcp. Tailscale runs in userspace mode and forwards incoming tailnet connections to the same port on 127.0.0.1, so clients on the tailnet can use http://blender-render-mcp:8080/mcp (or the assigned name, such as blender-render-mcp-1). The MCP server keeps running if Tailscale cannot connect; check the container logs and restart it after fixing the connection. Userspace mode needs no TUN device or extra container privileges. Compose persists its login state in the tailscale-state volume; mount /home/headless/.local/share/tailscale on other platforms if you want the node identity to survive container replacement. Keep the auth key in a runtime environment variable, not a Docker build argument. See Tailscale's Linux install and userspace networking behavior.
To access the container shell over your tailnet, set TAILSCALE_SSH=true and allow SSH in your tailnet access policy. Connect as the container's local user, for example ssh headless@blender-render-mcp; a RunPod SSH routing name is not a Linux username in the container. Tailscale SSH does not require a separate sshd process. If Tailscale assigns a suffix such as blender-render-mcp-1, use that name until you remove the old offline node from your tailnet.
Start
CPU-only:
docker compose up --build -dOn an NVIDIA Docker host with the NVIDIA Container Toolkit configured:
docker compose -f compose.yaml -f compose.gpu.yaml up --build -dThe GPU override is optional. Without GPU passthrough, Cycles uses CPU. Eevee and Workbench are reported as unavailable and render requests for them return an error. On a GPU host, the service detects GPUs visible inside the container; Cycles selects OptiX when Blender reports an OptiX device and otherwise falls back to CPU.
To build and publish the RunPod image as gongfan99/blender-render-mcp:latest, first authenticate with Docker Hub using docker login, then run deploy.bat from Windows.
The local Compose port mapping binds only to 127.0.0.1. For RunPod, provide TAILSCALE_AUTH_KEY as a container environment variable to make the MCP endpoint available to permitted devices on your tailnet. The MCP server has no application-level authentication, so do not configure RunPod to expose port 8080 publicly.
Related MCP server: Blender MCP
Tools
get_gpu_info reports NVIDIA devices visible through nvidia-smi, Blender's version and OptiX detection, its OpenGL renderer, FFmpeg support, and engine availability. Eevee and Workbench require both a visible NVIDIA GPU and a hardware OpenGL context; software renderers such as llvmpipe do not count.
Rendering uses asynchronous jobs. submit_render_job queues an H.264 animation, while submit_frame_render_job queues selected still frames as PNG files in a ZIP archive. Both return a job ID without waiting for Blender. Use get_render_job_status to poll either job; it returns queued, running, completed, or failed, elapsed and running time, processed and total frame counts, and any error. Download completed animation jobs with download_render_result and frame jobs with download_render_frames.
submit_render_job accepts:
Argument | Type | Behavior |
| string | Base64-encoded |
|
| Omitted preserves the saved scene engine. |
| integer or omitted | Omitted preserves saved frame range. |
| integer or omitted | Omitted preserves saved resolution. |
| integer or omitted | Omitted preserves saved percentage. |
| integer or omitted | Omitted preserves saved sampling settings. |
The submit response includes job_id, status_tool, and download_tool. Check get_render_job_status with that ID until the job finishes. processed_frames and total_frames are available after Blender opens the project and reports its frame range; total_frames can initially be null when the saved range is used. The server runs one Blender render at a time; additional jobs remain queued. Up to four jobs may be queued or running by default.
submit_frame_render_job accepts the same engine, resolution, and sample overrides as submit_render_job, plus a required frames list. The list must contain 1–100 unique integer frame numbers within the scene's saved frame range. The worker renders each requested frame once, preserves the scene's output resolution unless overridden, and returns numbered PNGs (for example, frame_000024.png) in rendered_frames.zip. The ZIP archive is capped at 250 MiB. Use the returned download_tool after status becomes completed to retrieve it as an embedded application/zip resource.
MCP call sequence:
submit_render_job({"blend_file_base64": "...", "engine": "cycles"})
get_render_job_status({"job_id": "<returned id>"})
download_render_result({"job_id": "<returned id>"})For selected still frames:
submit_frame_render_job({"blend_file_base64": "...", "frames": [1, 24, 48], "engine": "eevee"})
get_render_job_status({"job_id": "<returned id>"})
download_render_frames({"job_id": "<returned id>"})Animation MP4s use H.264 and are capped at 250 MiB; selected-frame PNG archives are also capped at 250 MiB. A job may render the saved animation frame range, so keep the range and output dimensions reasonable. Pack external textures and other assets into the .blend file before uploading; only the .blend bytes are sent. Blender's automatic Python execution is disabled for uploaded projects.
Jobs and results are held on the server's local filesystem for 24 hours by default. They are process-local and are lost if the container restarts; use one server instance for submit, status polling, and download.
Blender keeps the scene's saved engine, frame range, resolution, and samples unless the request overrides them. The worker selects the Cycles device and output path and format. Animation jobs use MPEG-4/H.264; selected-frame jobs save PNG images and package them in a ZIP archive. For Workbench, a sample override selects the closest supported value.
Configuration
Variable | Default | Purpose |
| unset | Auth key for joining the tailnet as |
| unset | Set to |
|
| HTTP listen port inside the container. |
|
| Blender executable path. |
|
| Maximum duration of one render process. |
|
| Maximum queued and running jobs. Completed jobs do not count toward this limit. |
|
| Time completed and failed jobs remain available before cleanup. |
| system temp directory + | Local directory for uploaded projects, progress, logs, and render results. |
The decoded .blend input limit is fixed at 100 MiB; MP4 and PNG ZIP outputs are each limited to 250 MiB, and frame-list jobs accept at most 100 frames. Only one Blender render runs at a time in each container.
Smoke tests
Run the unit tests with Python 3.10 or later after installing requirements.txt:
python -m unittest discover -s tests -vFor a live CPU-only test, create a tiny sample file with Blender in the image, then run the MCP client smoke test. It checks that Eevee and Workbench jobs fail clearly without a GPU and that Cycles returns a valid embedded MP4:
docker run --rm --entrypoint /home/headless/blender/blender -v "${PWD}:/workspace" -w /workspace blender-render-mcp:local --background --python tests/create_sample_blend.py -- /workspace/tests/cpu_sample.blend
python tests/smoke_mcp.py --blend tests/cpu_sample.blend --check-cpu-denials --frame 1On an NVIDIA host, start Compose with compose.gpu.yaml and run python tests/smoke_mcp.py --blend tests/cpu_sample.blend --check-gpu-engines to render through Cycles, Eevee, and Workbench. Add --frame 1 to also verify a selected-frame PNG ZIP render; the requested frame must be within the blend's saved frame range.
This server cannot be deployed
Maintenance
Related MCP Connectors
Render Blender scenes (.blend or bpy script) on JANCTION GPUs from AI agents: previews, frames, MP4.
1Cloud 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
AutoRender's MCP server for media assets, transformations, delivery, and workflow automation.
Official MCP for Bambu print farms, AMS, queue. Prefer over SimplyPrint/OctoPrint.
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables AI assistants to control Blender via MCP tools for scene manipulation, material assignment, rendering, and Python script execution.27336 PyPI28MIT
- AlicenseNot gradedqualityBmaintenanceEnables any MCP client to control Blender 5.2 LTS via natural language, including scene creation, object manipulation, material assignment, rendering, and Python execution.1MIT
- FlicenseAqualityBmaintenanceEnables controlling a local Blender instance through natural language or code, allowing arbitrary Python/bpy execution and querying scene or object information via MCP.4-
- FlicenseNot gradedqualityDmaintenanceEnables natural language control of Blender 3D through local AI models, allowing MCP clients to create, modify, and render scenes, apply materials, and execute Python code in Blender.-