Talk to Blender: A Conversational Modeling Pipeline from Qoder to Three.js Web Showcase
Summary
In the Qoder conversation, use mcp-for-blender to drive Blender, complete modeling, material changes, render validation, and GLB export with natural language, then use three.js + GSAP to make a scrollable/rotatable web page. The process itself is not complicated; the prerequisite is to get the three configurations of the Blender plugin, uvx, and Qoder MCP working together. Afterwards, each step's script is executed only after confirmation.
Flow Diagram
The loop corresponds to "change script — re-execute — re-validate", and confirmations and errors are not auto-skipped; only after render validation passes does it move to export and the web stage.
Preliminary Configuration Steps
1. Install Blender
Install the official stable version of Blender 5.2.1, confirm the version matches before installing the plugin.
2. Install uv / uvx
brew install uv
uvx --version
If you don't have Homebrew, use the official script: curl -LsSf https://astral.sh/uv/install.sh | sh. Note the output path of which uvx — the MCP configuration later needs the absolute path (on this machine it was /opt/homebrew/bin/uvx).
3. Install the Blender Plugin
Get the plugin file blender_mcp.py from mcp-for-blender.com or GitHub (ahujasid/blender-mcp). Then in Blender:
- Open
Edit > Preferences > Add-ons - Click the dropdown in the upper-right corner and select "Install from Disk"
- Select
blender_mcp.py, check to enable "MCP for Blender" - Both the plugin and the server have telemetry toggles; leave them off (the server is set in mcp.json)
4. Start the Blender-side Service
Press N in the 3D viewport to open the sidebar, switch to the "MCP for Blender" tab, confirm the port is 9876, and click "Connect to MCP server". When the panel shows Connected on localhost:9876, the Blender side is ready.
5. Configure Qoder MCP
Edit ~/.qoder-cn/mcp.json (the path is different on Windows):
{
"mcpServers": {
"blender": {
"command": "/opt/homebrew/bin/uvx",
"args": ["mcp-for-blender==2.2.7"],
"env": {
"BLENDER_MCP_SAFE_MODE": "1",
"DISABLE_TELEMETRY": "true"
}
}
}
}
commandmust be the absolute path touvx; a GUI-launched Qoder usually cannot read the shell's PATH- Keep
BLENDER_MCP_SAFE_MODE=1enabled; script execution gets extra restrictions - The version must match the plugin protocol; when upgrading, look at both sides together
6. Reload and Verify the Chain
In Qoder settings, refresh MCP or restart the app, open a new conversation, and confirm that Blender-related tools are visible. For the first verification, ask the assistant to read scene information or take a viewport screenshot; once successful, start modeling. If the tools don't appear, check port 9876 and the mcp.json path first, then reload MCP.
7. Set Up the Project Directory and Rules
~/BlenderProjects/
├── AGENTS.md # execution approval, safety, backup, naming rules
├── scripts/ # reusable bpy scripts
├── saves/ # .blend copies at each stage
├── renders/ # validation render images
├── exports/ # exported GLB
└── web/ # web page and local preview
In AGENTS.md, at minimum write: explain the impact before execution, wait for "confirm execution" for full scripts, return errors verbatim, delete by exact name, back up before destructive operations, and use the QODER_ prefix.
8. Prepare the Web Side
- GLB hosting: set the object storage bucket to public read and allow the web domain for CORS
- Page dependencies: three.js 0.169.0 and GSAP 3.12.5 via jsDelivr, pinned versions
- Local preview:
cd ~/BlenderProjects/web && python3 -m http.server 8123
| Check item | Expected result |
|---|---|
uvx --version |
outputs the version normally |
lsof -i :9876 |
Blender is listening |
| Qoder tool list | Blender tools appear |
| Read scene | returns object list, not errors |
http://localhost:8123 |
page opens normally |
Operation Flow
1. Generate the Model in Conversation
- State the dimensions, colors, reference images, and "appearance-only model" clearly upfront to reduce back-and-forth
- Proceed in stages: body → parts → materials → lights/camera → render, confirming each segment separately
- Make changes in natural language, e.g. "remove the ground" or "make it silver"; the assistant modifies the script
- Check the viewport or render at the end of each stage; continue only when confirmed
2. Script Approval and Execution
- Before execution, explain the goal, affected objects, and risks
- The assistant outputs the full script; the user replies "confirm execution" before it runs once via MCP
- Errors are returned verbatim; no auto-retry, no arbitrary code changes; fix and re-execute
- Delete objects by exact name; save a backup before destructive operations
3. Verification and Export
- Use multiple camera angles to check the shape, proportions, and key structure
- Delete temporary objects used only for rendering, such as ground planes or props
- Select only the model objects when exporting GLB; use Y-up; do not export lights or cameras
- Watch the poly count and file size to control web page loading cost
4. Web Rendering
- three.js loads the GLB; use an environment map to provide IBL, otherwise metallic materials turn black
- Use ACES tone mapping and moderate exposure to avoid highlight blowout
- Add an orbit controller to the preview page; for the showcase page, use GSAP scroll-driven rotation and text animations
- Finally check the actual browser output (see the link); don't just read the code
5. Deployment and References
- Upload GLB to object storage; ensure public read and CORS; or embed base64, but the page becomes significantly larger
- Serve rendering libraries from a CDN; local paths break on external sites
- Preview locally with an HTTP server; after going live, check the reachability of models, scripts, and fonts
Notes and Pitfalls
| Scenario | What to watch for |
|---|---|
| safe mode blocks scripts | os, datetime, nonlocal, etc. get rejected; scripts should use only bpy and string paths |
| Chinese UI node names not found | Look up nodes by bl_idname, not display name |
| Metallic materials black or overexposed on web | You must supply ambient light (IBL) and use tone mapping to compress highlights |
| Model looks worse on the web | glTF only keeps PBR materials; ambient light and lights must be rebuilt on the web side |
| Screens, emissive anomalies | Procedural materials degrade on export; fix material parameters after loading |
| Double-clicking HTML doesn't open | ES modules require an HTTP server; cannot use file:// |
| External site loading fails | Check bucket permissions, CORS, CDN availability |
| Blender tools not visible in Qoder | Check mcp.json absolute path and port 9876; reload MCP and start a new conversation |
| Scene accidentally deleted or overwritten | Back up before execution, delete by exact object name, don't touch non-task objects |