Blockbench MCP

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

Connect your client

Local (from source)

Add in one click

Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.

Or add it by command or config

FirstTerminal
git clone https://github.com/RenasDemirbas/BlockBenchMCP.git
cd BlockBenchMCP
npm install
npm run build
Claude CodeTerminal
claude mcp add blockbench -- node '<ABSOLUTE_PATH_TO_CLONE>/dist/mcp-server.js'
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "blockbench": {
      "command": "node",
      "args": [
        "<ABSOLUTE_PATH_TO_CLONE>/dist/mcp-server.js"
      ]
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "blockbench": {
      "command": "node",
      "args": [
        "<ABSOLUTE_PATH_TO_CLONE>/dist/mcp-server.js"
      ]
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "blockbench": {
      "type": "stdio",
      "command": "node",
      "args": [
        "<ABSOLUTE_PATH_TO_CLONE>/dist/mcp-server.js"
      ]
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.blockbench]
command = "node"
args = ["<ABSOLUTE_PATH_TO_CLONE>/dist/mcp-server.js"]
Gemini CLITerminal
gemini mcp add --scope user blockbench node -- '<ABSOLUTE_PATH_TO_CLONE>/dist/mcp-server.js'

Settings 4

BB_BRIDGE_PORT Optional: Port of the local WebSocket bridge. Must match MCP Bridge Port in Blockbench's settings. Default 8188.
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. Default 90000.

What it does

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.

What it needs

RuntimeNode.js 18+
Runs onmacOS, Windows, Linux
Also
  • Blockbench desktop app (5.2 recommended, 5.1.4 works without the 5.2 tools)
  • The companion plugin blockbench_mcp.js loaded in Blockbench
  • BlockSmooth plugin for smooth_mesh modifiers
  • Hytale Models plugin for Hytale formats

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.

Limits

  • Limit Tools fail with "Blockbench is not connected" until Blockbench is running with the plugin enabled, unless headless mode is on
  • Platform Hiding the window in headless mode and blockbench_window work on Windows only. On macOS and Linux Blockbench opens visibly
  • Limit Texture layer groups, IK poles, bounding boxes, variable_placeholders and some display slots need Blockbench 5.2
  • Limit smooth_mesh needs the BlockSmooth plugin for every action except shading
  • Limit Hytale formats and .blockymodel export need the official Hytale Models plugin in Blockbench
  • Limit Save and export paths must be absolute
  • Limit A call Blockbench does not answer fails after 30 s by default. Tools from other plugins time out after 120 s
  • Not covered There is no npm package. It runs from a release download or a source build
  • Limit Versions 1.6.0 and older let any open website reach the bridge and run code. Use 1.6.1 or later

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.

Who it suits

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.

Tools 60 of 75

11 only read, 44 change things, 5 can delete or overwrite. A ? marks an optional parameter.

get_status
Report whether Blockbench is connected, its version, plugin version, 5.2 features and common folders
blockbench_window changes
Show, hide or check the Blockbench window (Windows only)action: enum
list_formats
List Blockbench's model formats and what each supports
create_project changes
Start a project in a chosen format, including Minecraft skins and Hytale formatsformat?: stringname?: stringmodel_identifier?: stringtexture_width?: numbertexture_height?: numberskin_model?: stringskin_variant?: stringskin_edition?: enumskin_resolution?: numberskin_pose?: boolean
project_file deletes
Open, save, export, import, read JSON, switch or close project tabsaction: enum
add_groups changes
Create groups that work as bonesgroups: array
add_cubes changes
Add cubes, with optional mirrored copiescubes: arraytexture?: string
add_meshes changes
Add custom meshes from vertices and facesmeshes: array
add_mesh_primitive changes
Add a cylinder, sphere, torus or other primitive meshshape: enumname?: stringparent?: stringposition?: arrayrotation?: arraydiameter?: numberheight?: numbersides?: numberminor_diameter?: numberdetail?: numbertexture?: string
add_loft changes
Build a limb or tube mesh from a chain of cross-section ringsname?: stringrings: arrayprofile?: anysides?: numbercaps?: enumside?: arrayparent?: stringposition?: arrayrotation?: arraytexture?: string
edit_mesh changes
Run extrude, inset, loop cut, bevel and similar steps on a meshmesh: stringsteps: array
transform_mesh changes
Taper, bend, twist or otherwise deform meshes with falloffmesh?: stringmeshes?: arrayselect?: anyfalloff?: objectops: array
add_planes changes
Add flat planes or strips for thin parts such as fur or leavesplanes?: arraystrips?: arraytexture?: string
add_bounding_boxes changes
Add bounding boxes (needs Blockbench 5.2)boxes: array
add_ik_controllers changes
Add inverse-kinematics controllers to bonescontrollers: array
bake_ik_animation changes
Turn IK-driven motion into plain rotation keyframesanimation?: stringdetach_controllers?: boolean
mirror_elements changes
Mirror elements in place or as copies across an axisids: arrayaxis?: enumcenter?: numberduplicate?: booleanrename?: boolean
validate_model
Check for intersecting parts, detached parts and other model faultsanimation?: stringtimes?: arraytolerance?: numberinclude_same_bone?: booleanmax_pairs?: numberchecks?: booleanintersections?: booleandetached?: boolean
query_geometry
Measure element and bone positions, at rest or at animation timeselements?: arrayanimation?: stringtime?: numbertimes?: arrayinclude_elements?: booleaninclude_bones?: boolean
list_outline
List the model's element treeinclude_elements?: booleanmax_depth?: number
update_elements changes
Change position, size, faces or other properties of elementselements: array
delete_elements deletes
Remove elements from the modelids: array
create_texture changes
Create a texture, blank, filled or from image dataname: stringwidth?: numberheight?: numberfill_color?: stringdata?: stringpbr_channel?: enumrender_mode?: enumparticle?: booleanforce_translucent?: booleanapply_to_all?: boolean
generate_texture_template changes
Lay out a texture template so each face gets its own UV spacename?: stringpixel_density?: numberelements?: arrayrearrange_uv?: booleanpower_of_two?: booleanpadding?: booleancolor?: string
delete_texture deletes
Remove a texture from the projectid: string
get_texture
Return a texture image, or an enlarged crop of one faceid?: stringmax_size?: numberelement?: stringface?: anyfaces?: anypadding?: numberlayer?: string
texture_layers changes
Add, reorder, merge or group texture layerstexture?: stringops?: array
import_texture changes
Load a texture from an image filepath: stringforce_translucent?: boolean
apply_texture changes
Assign a texture to elementstexture: stringelements?: arraymode?: enum
paint_texture changes
Paint fills, shapes, gradients and noise onto a texturetexture?: stringlayer?: stringops: array
paint_faces changes
Paint chosen faces of cubes or meshestargets: arraytexture?: stringlayer?: string
unwrap_mesh changes
Unwrap mesh UVs into islands, with seams and per-part densityelements?: arraypixel_density?: numberdensity_scale?: objectseams?: arrayseam_angle?: numberisland_angle?: numbercombine?: booleankeep_paint?: booleanpadding?: booleanpower_of_two?: booleancolor?: stringname?: string
uv changes
Inspect UVs, or set cube, mesh or automatic UVsaction: enum
bake_texture changes
Bake light, ambient occlusion and edge shading into a texture layerelements?: arraytexture?: stringlayer?: stringsource?: stringpasses?: arraymax_shadow?: numbermax_highlight?: numberdither?: enumramp?: objectonly_painted?: boolean
blend_seams changes
Soften colour seams across face edges and UV cutselements?: arraytexture?: stringwidth?: numberstrength?: numbermax_angle?: numberbetween?: enumlayer?: stringonly_painted?: boolean
palette changes
Make colour ramps, pull colours from a texture or limit a texture to a paletteaction: enumcolors?: arraycolor?: stringshadows?: numberhighlights?: numberramp?: objecttexture?: stringlayer?: stringpalette?: anymax_colors?: numberdither?: enumdither_strength?: numberbinary_alpha?: boolean
compare_reference
Score the model's silhouette against the loaded reference imagebands?: numberthreshold?: number
project_reference changes
Project a reference image onto the visible texture pixelselements?: arraylayer?: stringopacity?: numbermin_facing?: number
record_build changes
Record edits as frames and write a GIF of the buildaction: enumview?: stringyaw?: numberpitch?: numbersize?: numberheight_units?: numberbackground?: stringlabel?: stringpath?: stringfps?: numberhold_last?: number
create_animation changes
Create an animationname: stringloop?: enumlength?: numbersnapping?: numberoverride?: booleananim_time_update?: stringblend_weight?: stringstart_delay?: stringloop_delay?: string
set_keyframes changes
Add keyframes to bones, as numbers or Molang expressionsanimation?: stringsnap?: booleanbones: array
edit_keyframes deletes
Retime, rescale, delete or change interpolation of keyframesanimation?: 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?: number
mirror_keyframes changes
Copy keyframes to the matching left or right boneanimation?: stringmappings?: arrayphase_offset?: numberchannels?: arraymirror_values?: booleanreplace?: booleanwrap?: boolean
add_effect_keyframes changes
Add sound, particle or timeline keyframesanimation?: stringeffects: array
apply_animation_preset changes
Apply a ready motion such as float, swing or walk to a boneanimation?: stringbone: stringpreset: string
variable_placeholders changes
Set Molang variable placeholders (needs Blockbench 5.2)text?: stringadd?: arrayvalues?: object
preview_animation
Capture the model at one moment of an animationanimation?: stringtime: numberangle?: stringcamera?: anyresolution?: number
render_animation
Capture several frames of an animation as imagesanimation?: stringframes?: numbertimes?: arrayangle?: stringcamera?: anyresolution?: number
add_armature changes
Build an armature of bones for skinned meshes and weight themname?: stringarmature?: stringbones?: arraymeshes?: arrayauto_weights?: booleanweight_method?: enumblend?: numbermax_bones?: number
vertex_weights changes
Compute, set, smooth, normalize, clear or inspect vertex weightsaction: enum
smooth_mesh changes
Add subdivision and smooth-by-angle modifiers, creases and sharp edges (needs BlockSmooth, except shading)action: enum
generate_pbr_map changes
Make height, normal or MER maps from a colour texturetexture?: stringmaps?: arraylist_presets?: boolean
display_transforms changes
Read or set how an item model sits in each display slotaction: enum
capture_screenshot
Take a viewport screenshot from a chosen angle or view modeangle?: stringcamera?: anyresolution?: numbershading?: booleanbackground?: stringinclude_reference_models?: booleanview_mode?: enum
capture_multi_view
Capture several camera views in one callviews?: arrayresolution?: numberbackground?: stringinclude_reference_models?: boolean
preview_models changes
Show and place Blockbench's reference models, such as the player, beside the modelmodels?: array
reference_images changes
Add, move or remove reference images in the viewportadd?: arrayupdate?: arrayremove?: array
pixel_art changes
Render the model as pixel-art sprites or a sprite sheet with Aseprite JSONaction: enum
run_action changes
Run any built-in Blockbench action by its idid: stringconfirm_dialog?: booleandialog_values?: object
eval_code deletes
Run JavaScript inside Blockbench with access to its APIcode: stringundo?: booleanresult_file?: stringmax_length?: numberallow_native_modules?: boolean

Similar servers