MCP for Blender
Build and edit 3D scenes in a running Blender by running Python, viewing results and importing assets.
Drives the Blockbench 3D editor to model, UV-map, texture, rig and animate low-poly and cube models
By RenasDemirbas (individual) TypeScript Local · stdio DesignMedia
26 popularity score ★ 40
Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
git clone https://github.com/RenasDemirbas/BlockBenchMCP.git
cd BlockBenchMCP
npm install
npm run buildclaude mcp add blockbench -- node '<ABSOLUTE_PATH_TO_CLONE>/dist/mcp-server.js'{
"mcpServers": {
"blockbench": {
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/mcp-server.js"
]
}
}
}{
"mcpServers": {
"blockbench": {
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/mcp-server.js"
]
}
}
}{
"servers": {
"blockbench": {
"type": "stdio",
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/mcp-server.js"
]
}
}
}[mcp_servers.blockbench]
command = "node"
args = ["<ABSOLUTE_PATH_TO_CLONE>/dist/mcp-server.js"]gemini mcp add --scope user blockbench node -- '<ABSOLUTE_PATH_TO_CLONE>/dist/mcp-server.js'BB_BRIDGE_PORT |
Optional: Port of the local WebSocket bridge. Must match MCP Bridge Port in Blockbench's settings. |
|---|---|
| Set together: headless | |
BB_HEADLESS |
Optional: Set to 1 (or true, yes, on) to let the server launch Blockbench itself when a tool needs it. |
BB_EXECUTABLE |
Optional: Path to Blockbench for headless launch. Defaults to the standard install on Windows and macOS and to blockbench on PATH elsewhere. |
BB_LAUNCH_TIMEOUT_MS |
Optional: How long a headless launch waits for the plugin to connect, in milliseconds. |
Blockbench MCP comes in two parts. A Node.js server is started by the client over stdio and opens a WebSocket on 127.0.0.1 (port 8188 unless BB_BRIDGE_PORT says otherwise). A plugin loaded into the Blockbench desktop editor dials into that socket, so each tool call runs inside the open Blockbench window and lands in its undo history.
The server registers 75 tools. With them an assistant can start a project in any Blockbench format, lay out bones, cubes, planes and meshes, and reshape meshes by extruding, beveling, tapering or bending them. It can also unwrap UVs, paint and bake shading into textures, and keyframe animations with Molang, presets and IK. For skinned meshes there are armatures and vertex weights, and generate_pbr_map turns a colour texture into height, normal or MER maps. Screenshots, multi-view captures, silhouette comparison against a reference picture and checks for clipping or floating parts let it look at its own work. pixel_art renders sprites and Aseprite sheets. When no dedicated tool fits, run_action fires any Blockbench menu action and eval_code runs JavaScript in the editor.
Recent releases added smooth_mesh, which drives the separate BlockSmooth plugin for subdivision and crease modifiers (only its shading action works without that plugin), and Hytale support: create_project accepts hytale_character and hytale_prop, and project_file exports .blockymodel and .blockyanim files, but only with the official Hytale Models plugin installed in Blockbench. Since 1.9.0 a headless mode (BB_HEADLESS=1) lets the server launch Blockbench itself when a tool needs it.
One detail the README skips: in bridge.ts a tool call that Blockbench does not answer fails after 30 seconds by default. Slower tools set their own limits in the code, for example 60 seconds for eval_code and screenshots and up to 10 minutes for pixel-art sprite sheets.
| Runtime | Node.js 18+ |
|---|---|
| Runs on | macOS, Windows, Linux |
| Also |
|
Download blockbench_mcp.js and mcp-server.js from the latest GitHub release, or build both from source with npm. Load the plugin in Blockbench through File → Plugins → Load Plugin from File. Blockbench must be open with the plugin connected unless BB_HEADLESS=1 is set, in which case the server starts it. Documented for Claude Desktop and Claude Code.
Does nothing without Blockbench open and the plugin connected; tools report "Blockbench is not connected" otherwise. Some features (texture layer groups, IK with poles, bounding boxes, some display slots) need Blockbench 5.2. Save and export need absolute paths. Long operations may time out if Blockbench's background timers are throttled; the window should then be brought to the front. Calls to tools added by other plugins time out after 120 seconds. There is no npm package: it is installed from a release download or a source build. Versions 1.6.0 and older let any website reach the bridge and run code; update to 1.6.1 or later.
Suits people who already use Blockbench for Minecraft or Hytale entities, low-poly game characters or pixel-art sprites and want an assistant to do the modeling, texturing, rigging and animation steps inside the editor, checking each step with screenshots. Everything runs on your own machine with no account or key. It is a poor fit without the Blockbench desktop app, for 3D work in other editors, or for unattended use on macOS or Linux, where headless mode still shows the window. It is a community project, not made by the Blockbench team.
11 only read, 44 change things, 5 can delete or overwrite. A ? marks an optional parameter.
get_statusblockbench_window changesaction: enumlist_formatscreate_project changesformat?: stringname?: stringmodel_identifier?: stringtexture_width?: numbertexture_height?: numberskin_model?: stringskin_variant?: stringskin_edition?: enumskin_resolution?: numberskin_pose?: booleanproject_file deletesaction: enumadd_groups changesgroups: arrayadd_cubes changescubes: arraytexture?: stringadd_meshes changesmeshes: arrayadd_mesh_primitive changesshape: enumname?: stringparent?: stringposition?: arrayrotation?: arraydiameter?: numberheight?: numbersides?: numberminor_diameter?: numberdetail?: numbertexture?: stringadd_loft changesname?: stringrings: arrayprofile?: anysides?: numbercaps?: enumside?: arrayparent?: stringposition?: arrayrotation?: arraytexture?: stringedit_mesh changesmesh: stringsteps: arraytransform_mesh changesmesh?: stringmeshes?: arrayselect?: anyfalloff?: objectops: arrayadd_planes changesplanes?: arraystrips?: arraytexture?: stringadd_bounding_boxes changesboxes: arrayadd_ik_controllers changescontrollers: arraybake_ik_animation changesanimation?: stringdetach_controllers?: booleanmirror_elements changesids: arrayaxis?: enumcenter?: numberduplicate?: booleanrename?: booleanvalidate_modelanimation?: stringtimes?: arraytolerance?: numberinclude_same_bone?: booleanmax_pairs?: numberchecks?: booleanintersections?: booleandetached?: booleanquery_geometryelements?: arrayanimation?: stringtime?: numbertimes?: arrayinclude_elements?: booleaninclude_bones?: booleanlist_outlineinclude_elements?: booleanmax_depth?: numberupdate_elements changeselements: arraydelete_elements deletesids: arraycreate_texture changesname: stringwidth?: numberheight?: numberfill_color?: stringdata?: stringpbr_channel?: enumrender_mode?: enumparticle?: booleanforce_translucent?: booleanapply_to_all?: booleangenerate_texture_template changesname?: stringpixel_density?: numberelements?: arrayrearrange_uv?: booleanpower_of_two?: booleanpadding?: booleancolor?: stringdelete_texture deletesid: stringget_textureid?: stringmax_size?: numberelement?: stringface?: anyfaces?: anypadding?: numberlayer?: stringtexture_layers changestexture?: stringops?: arrayimport_texture changespath: stringforce_translucent?: booleanapply_texture changestexture: stringelements?: arraymode?: enumpaint_texture changestexture?: stringlayer?: stringops: arraypaint_faces changestargets: arraytexture?: stringlayer?: stringunwrap_mesh changeselements?: arraypixel_density?: numberdensity_scale?: objectseams?: arrayseam_angle?: numberisland_angle?: numbercombine?: booleankeep_paint?: booleanpadding?: booleanpower_of_two?: booleancolor?: stringname?: stringuv changesaction: enumbake_texture changeselements?: arraytexture?: stringlayer?: stringsource?: stringpasses?: arraymax_shadow?: numbermax_highlight?: numberdither?: enumramp?: objectonly_painted?: booleanblend_seams changeselements?: arraytexture?: stringwidth?: numberstrength?: numbermax_angle?: numberbetween?: enumlayer?: stringonly_painted?: booleanpalette changesaction: enumcolors?: arraycolor?: stringshadows?: numberhighlights?: numberramp?: objecttexture?: stringlayer?: stringpalette?: anymax_colors?: numberdither?: enumdither_strength?: numberbinary_alpha?: booleancompare_referencebands?: numberthreshold?: numberproject_reference changeselements?: arraylayer?: stringopacity?: numbermin_facing?: numberrecord_build changesaction: enumview?: stringyaw?: numberpitch?: numbersize?: numberheight_units?: numberbackground?: stringlabel?: stringpath?: stringfps?: numberhold_last?: numbercreate_animation changesname: stringloop?: enumlength?: numbersnapping?: numberoverride?: booleananim_time_update?: stringblend_weight?: stringstart_delay?: stringloop_delay?: stringset_keyframes changesanimation?: stringsnap?: booleanbones: arrayedit_keyframes deletesanimation?: stringbone?: stringchannel?: enumtime_range?: arrayrelative_to_playhead?: enumplayhead?: numberdelete?: booleanset_time?: numbertime_offset?: numbertime_scale?: numbersnap?: booleanresize_to_content?: booleanset_interpolation?: enumset_values?: anyvalue_multiplier?: numbermirror_keyframes changesanimation?: stringmappings?: arrayphase_offset?: numberchannels?: arraymirror_values?: booleanreplace?: booleanwrap?: booleanadd_effect_keyframes changesanimation?: stringeffects: arrayapply_animation_preset changesanimation?: stringbone: stringpreset: stringvariable_placeholders changestext?: stringadd?: arrayvalues?: objectpreview_animationanimation?: stringtime: numberangle?: stringcamera?: anyresolution?: numberrender_animationanimation?: stringframes?: numbertimes?: arrayangle?: stringcamera?: anyresolution?: numberadd_armature changesname?: stringarmature?: stringbones?: arraymeshes?: arrayauto_weights?: booleanweight_method?: enumblend?: numbermax_bones?: numbervertex_weights changesaction: enumsmooth_mesh changesaction: enumgenerate_pbr_map changestexture?: stringmaps?: arraylist_presets?: booleandisplay_transforms changesaction: enumcapture_screenshotangle?: stringcamera?: anyresolution?: numbershading?: booleanbackground?: stringinclude_reference_models?: booleanview_mode?: enumcapture_multi_viewviews?: arrayresolution?: numberbackground?: stringinclude_reference_models?: booleanpreview_models changesmodels?: arrayreference_images changesadd?: arrayupdate?: arrayremove?: arraypixel_art changesaction: enumrun_action changesid: stringconfirm_dialog?: booleandialog_values?: objecteval_code deletescode: stringundo?: booleanresult_file?: stringmax_length?: numberallow_native_modules?: boolean