Blockbench MCP Plugin
API Reference — v1.10.1
Installation
Tools
Cubes
place_cube
Place Cube
Creates cubes in one reversible edit. Texture and group are optional, allowing untextured blockouts. Explicit face targets never use the current UV selection; partial/custom faces require per-face UV support. Elements accept inflate, plus uv_offset and mirror_uv for box UV cubes; unknown element fields are rejected. Cubes the format's size limiter rejects (for example Java Block elements outside -16…32) are refused and nothing is created, unless Blockbench's Deactivate Size Limit setting is on.
| Name | Type | Required | Description |
|---|---|---|---|
| elements | object[] | required | Array of cubes to place, with optional Java shading fields. |
| texture | string | optional | Texture UUID, ID or name. When omitted, uses the default texture if one exists; otherwise creates untextured cubes. |
| group | string | optional | Parent group UUID or unique name, or root (default). Missing or ambiguous names are rejected. |
| faces | "north" | "south" | "east" | "west" | "up" | "down"[] | unknown | boolean | object[] | optional | true applies texture to all faces with Auto UV; false skips texture assignment. Named faces use Auto UV; false/custom rectangles disable Auto UV outside Hytale. Hytale always retains Auto UV 1 and custom rectangles must match the geometry's face dimensions. Partial/custom faces require per-face UV support. Single-texture formats may still display the project texture. |
modify_cube
Modify Cube
Modifies the cube with the given ID. Auto UV setting: saved as an integer, where 0 means disabled, 1 means enabled, and 2 means relative auto UV (cube position affects UV). A new from/to/inflate that the format's size limiter rejects (for example Java Block elements outside -16…32) is refused before anything changes, unless Blockbench's Deactivate Size Limit setting is on.
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | optional | ID or name of the cube to modify. Defaults to selected, which could be more than one. |
| name | string | optional | New name of the cube. |
| origin | number[] | optional | Pivot point of the cube. |
| from | number[] | optional | Starting point of the cube. |
| to | number[] | optional | Ending point of the cube. |
| rotation | number[] | optional | Rotation of the cube. |
| autouv | "0" | "1" | "2" | optional | Auto UV setting. 0 = disabled, 1 = enabled, 2 = relative auto UV. |
| uv_offset | number[] | optional | UV offset for the texture. |
| mirror_uv | boolean | optional | Whether to mirror the UVs. |
| shade | boolean | optional | Whether to apply shading to the cube. Java 26.3+ projects ignore this flag; shade=false is mapped to shade_direction_override 'up' there, matching Blockbench's own import. |
| shade_direction_override | "" | "north" | "south" | "west" | "east" | "up" | "down" | optional | Java Edition 26.3+ shade direction override: the face direction whose lighting shade is applied to every face. '' removes the override. Replaces the boolean shade flag in formats with java_cube_shade_direction_override (new Java Block projects default to 26.3). |
| light_emission | integer | optional | Block light emitted by the cube (0-15). Exported by Java Block formats. |
| inflate | number | optional | Inflation amount for the cube. |
| color | number | optional | Single digit to represent a color from a palette. |
| visibility | boolean | optional | Whether the cube is visible or not. |
knife_cut_cube
Knife Cut Cube
Headless Blockbench Knife tool for cubes: splits each target cube with planes perpendicular to one axis at the given positions, keeping each piece's share of the face UVs. The original cube keeps the lowest piece; new pieces get unique names. One undo entry covers every cut and the selection is left unchanged.
| Name | Type | Required | Description |
|---|---|---|---|
| cubes | string[] | optional | Cube UUIDs or unique names to cut. Defaults to the selected cubes. |
| axis | "x" | "y" | "z" | required | Axis the cut plane is perpendicular to. |
| positions | number[] | required | Cut-plane coordinates along the axis, in the cube's from/to space (model space for unrotated cubes). Positions closer than the cube's inflate to its from/to edges, or outside it, are skipped for that cube and reported sorted and deduplicated. |
slice_cubes_to_block_grid
Slice Cubes To Block Grid
Cuts cubes wherever they cross a Bedrock block boundary (16-unit grid, x/z centered) and, by default, regroups the pieces into one group per block cell pivoted at that block's origin. Use it to divide an oversized custom block model into per-block sections that each fit Bedrock's 30×30×30 limit. Rotated cubes are left uncut on the affected axes and reported.
| Name | Type | Required | Description |
|---|---|---|---|
| cubes | string[] | optional | Cube UUIDs or unique names to slice. Defaults to every cube in the project. |
| axes | "x" | "y" | "z"[] | optional | Axes to slice along. Cubes rotated (or inside groups rotated) about the other two axes are skipped on that axis, as Blockbench's own slicer does. |
| cell_size | number | optional | Block size in model units; 16 for Bedrock. Horizontal boundaries sit at ±half a cell, vertical ones at multiples. |
| regroup | boolean | optional | Move every resulting cube into a group named after its block cell (bottom, top, right_top_front, top2, …) pivoted at that block's origin, so each group is one exportable block section. Pieces leave their previous bone; the report lists each source cube's former group. |
| parent | string | optional | Parent group UUID or name for the cell groups; must not be rotated. Defaults to the project root. |
| group_prefix | string | optional | Prefix for cell group names, e.g. `goal_` yields `goal_top`. Existing groups are reused only when their name and block-origin pivot match; otherwise a numbered name is chosen. |
inspect_block_bounds
Inspect Block Bounds
Reports cube, group, and whole-model extents against Blockbench's Bedrock block limit (a 30×30×30 box whose center may sit up to 7 units from the block center), the block cell each cube occupies, and the grid cut positions slice_cubes_to_block_grid would use. Read-only. Extents ignore rotation; rotated cubes are flagged.
| Name | Type | Required | Description |
|---|---|---|---|
| cubes | string[] | optional | Cube UUIDs or unique names to inspect. Defaults to every cube in the project. |
| cell_size | number | optional | Block size in model units; 16 for Bedrock. |
| max_size | number | optional | Maximum geometry size per axis for one block (Bedrock: 30). |
| max_center_offset | number | optional | How far the limit box may shift from the block center per axis (Bedrock: 7, giving x/z within ±22 and y within -14…30). |
Camera & Screenshots
capture_screenshot
Capture Screenshot
Returns the rendered image of a view. Defaults to the user's active viewport ("active"); pass the ID of an offscreen view from create_offscreen_view to render without disturbing the user, or a viewport ID from list_views.
| Name | Type | Required | Description |
|---|---|---|---|
| project | string | optional | Project name or UUID. |
| view | string | optional | View to target: "active" for the viewport the user last interacted with, the ID of an offscreen view from create_offscreen_view, or a viewport ID from list_views. |
| max_size | integer | optional | Longest side of the returned image in pixels; larger images are scaled down proportionally. Omit for full size. |
| format | "png" | "jpeg" | "webp" | optional | Encoding of the returned image: "png" (default, lossless), or the smaller "jpeg" (no transparency: transparent pixels become white) or "webp". |
capture_app_screenshot
Capture App Screenshot
Returns the image data of the Blockbench app.
| Name | Type | Required | Description |
|---|---|---|---|
| max_size | integer | optional | Longest side of the returned image in pixels; larger images are scaled down proportionally. Omit for full size. |
| format | "png" | "jpeg" | "webp" | optional | Encoding of the returned image: "png" (default, lossless), or the smaller "jpeg" (no transparency: transparent pixels become white) or "webp". |
set_camera_angle
Set Camera Angle
Moves a view's camera and returns the resulting frame plus the applied camera state. Defaults to the user's active viewport, which changes what they see and clears any side-view lock they had; target an offscreen view from create_offscreen_view to inspect the model from any angle without moving their camera.
| Name | Type | Required | Description |
|---|---|---|---|
| view | string | optional | View to target: "active" for the viewport the user last interacted with, the ID of an offscreen view from create_offscreen_view, or a viewport ID from list_views. |
| position | number[] | required | Camera position. |
| target | number[] | optional | Camera target position. |
| rotation | number[] | optional | Camera rotation. |
| projection | "unset" | "orthographic" | "perspective" | required | Camera projection type. |
| zoom | number | optional | Orthographic zoom factor (Blockbench default 0.5). Ignored for perspective views and while a side view is locked. |
| fov | number | optional | Perspective field of view in degrees. Uses the Blockbench setting when omitted. |
| locked_angle | "top" | "bottom" | "north" | "south" | "east" | "west" | optional | Lock an orthographic side view (top, bottom, north, south, east, west). Omit to leave the view free. |
| max_size | integer | optional | Longest side of the returned image in pixels; larger images are scaled down proportionally. Omit for full size. |
| format | "png" | "jpeg" | "webp" | optional | Encoding of the returned image: "png" (default, lossless), or the smaller "jpeg" (no transparency: transparent pixels become white) or "webp". |
create_offscreen_view
Create Offscreen View
Creates a private offscreen viewport that renders the current project without moving the user's camera. Use it with set_camera_angle and capture_screenshot (view: <id>) for multi-angle inspection. The camera starts where the user's is unless copy_view is "none". Up to 4 views may exist at once; delete them with delete_offscreen_view when done. Views still open when your MCP session ends are deleted.
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | optional | ID for the new view. Generated as view_N when omitted. |
| width | integer | optional | Width in pixels (16–2048). |
| height | integer | optional | Height in pixels (16–2048). |
| antialias | boolean | optional | Multisample antialiasing. Disable for crisp pixel-art inspection. |
| copy_view | string | string | optional | View whose camera seeds the new one. Defaults to "active" (the user's viewport); pass "none" for Blockbench's default angle. |
list_views
List Views
Lists render targets: the user's connected viewports (the active one flagged) and the plugin's offscreen views, each with size and camera position, target, projection, FOV, zoom, and side-view lock.
No parameters
resize_offscreen_view
Resize Offscreen View
Changes the pixel size of an offscreen view. The user's viewports follow their layout and cannot be resized here.
| Name | Type | Required | Description |
|---|---|---|---|
| view | string | required | ID of the offscreen view to resize. |
| width | integer | required | Width in pixels (16–2048). |
| height | integer | required | Height in pixels (16–2048). |
delete_offscreen_view
Delete Offscreen View
Disposes an offscreen view and releases its WebGL context. The user's viewports are not affected.
| Name | Type | Required | Description |
|---|---|---|---|
| view | string | required | ID of the offscreen view to dispose. |
Capabilities
get_capabilities
Get Capabilities
Discover Blockbench/plugin versions, desktop or web environment, active project summary, and registered model formats. Returns detailed boolean format features (null means unknown; includes molang and java_cube_shade_direction_override) plus the format's remember_files and animation_grouping settings, compact supported-feature lists for all formats, and optional tool registration states. Works with no open project. Format features do not guarantee that every enabled MCP tool can run in the current mode or selection.
| Name | Type | Required | Description |
|---|---|---|---|
| format_id | string | optional | Optional registered format ID to inspect, such as 'free'. Defaults to the active project's format. Does not switch or create a project. |
| include_tools | boolean | optional | Include all registered MCP tool names, stability status, and current enabled state. Use list_modes and set_mode to navigate before calling mode-dependent tools. |
Animation
create_animation
Create Animation
Creates and selects an undoable animation with linear keyframes for existing bones, using Blockbench editor coordinates. Returns its UUID and actual name.
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | required | Animation name; `animation.` is added unless the name already starts with it, as in Bedrock and GeckoLib animation files. |
| loop | boolean | optional | Whether the animation should loop |
| animation_length | number | optional | Length of the animation in seconds |
| bones | Record<string, object[]> | required | Keyframes keyed by existing bone/group name. Values use Blockbench editor coordinates; rotations are degrees. |
| particle_effects | Record<string, string> | optional | Particle effects with timestamps (seconds) as keys, spawned at the entity origin. Use manage_particle_keyframes for locators, scripts and more options. |
manage_keyframes
Manage Keyframes
Creates, deletes, or edits keyframes in the animation timeline for specific bones and channels.
| Name | Type | Required | Description |
|---|---|---|---|
| animation_id | string | optional | Animation UUID or name. If not provided, uses current animation. |
| action | "create" | "delete" | "edit" | "select" | required | Action to perform on keyframes. |
| bone_name | string | required | Name of the bone/group to manage keyframes for. |
| channel | "rotation" | "position" | "scale" | required | Animation channel to modify. |
| keyframes | object[] | required | Keyframe data for the action. |
animation_graph_editor
Animation Graph Editor
Edits a bone channel's interpolation or numeric Bezier easing in one reversible edit. Uses native per-axis handle arrays and chronological segment durations. Custom points are normalized time/value fractions. Partial-axis edits require existing Bezier keys; key-wide mode changes require all axes. Rejects curve edits ignored by quaternion rotation, and step or Bezier curves in GeckoLib models (use geckolib_set_keyframe_easing). Inspect neighboring segments after range edits.
| Name | Type | Required | Description |
|---|---|---|---|
| animation_id | string | optional | Animation UUID or name. If not provided, uses current animation. |
| bone_name | string | required | Name of the bone/group to modify curves for. |
| channel | "rotation" | "position" | "scale" | required | Animation channel to modify. |
| axis | "x" | "y" | "z" | string | optional | Axes to edit. Linear, stepped and smooth require all because interpolation is key-wide. Partial-axis easing/custom edits require selected keys already using Bezier interpolation, preserving other axes' handles. |
| action | "smooth" | "linear" | "ease_in" | "ease_out" | "ease_in_out" | "stepped" | "custom" | required | Curve modification. linear, stepped and smooth set the key-wide interpolation (linear, step, catmullrom). ease_in, ease_out and ease_in_out apply the CSS cubic-bezier curves of the same name to every segment between the selected keys; custom applies custom_curve. Easing/custom require at least two distinct chronological numeric single-data-point keys. Smooth and Bezier rotation edits are unavailable when native quaternion interpolation would ignore them. GeckoLib models reject stepped (the GeckoLib plugin switches step keys back to linear) and the Bezier actions (GeckoLib has no Bezier interpolation); use geckolib_set_keyframe_easing there. In GeckoLib models smooth also clears the easings of the keys it changes, since GeckoLib ignores easings on catmullrom keys. |
| keyframe_range | object | optional | Finite ordered time range selecting existing keys; omitted means the full channel. Key-wide interpolation can affect neighboring segments at range boundaries, so edit the full channel when boundary continuity matters. |
| custom_curve | object | optional | Normalized cubic Bezier control points, required for custom action. Conversion uses each segment's duration and edited-axis endpoint values; unrelated axis handles are preserved. |
bone_rigging
Bone Rigging
Creates and manipulates the bone structure (rig) of a model for animation. Each action is one undoable edit (create with ik_enabled records the IK controller as a second one); undoing delete brings back child bones, elements and their keyframes. mirror duplicates the bone with its descendants and flips the copy like Blockbench's Flip action. The set_ik action is deprecated; use set_ik_controller for Blockbench's null-object IK (source, target, pole).
| Name | Type | Required | Description |
|---|---|---|---|
| action | "create" | "parent" | "unparent" | "delete" | "rename" | "set_pivot" | "set_ik" | "mirror" | required | Action to perform on the bone structure. |
| bone_data | object | required | Bone configuration data. |
animation_timeline
Animation Timeline
Controls the animation timeline: playback, time scrubbing, length, FPS, loop mode, and keyframe selection by time range or relative to the playhead (select_before_playhead/select_after_playhead return the selected keyframe UUIDs).
| Name | Type | Required | Description |
|---|---|---|---|
| animation_id | string | optional | Animation UUID or name. If not provided, uses current animation. |
| action | "play" | "pause" | "stop" | "set_time" | "set_length" | "set_fps" | "loop" | "select_range" | "select_before_playhead" | "select_after_playhead" | required | Timeline action to perform. select_before_playhead/select_after_playhead replace the keyframe selection with bone keyframes at or before/after the playhead (1e-5 s tolerance, like Blockbench 5.2's native actions) and return their UUIDs. |
| time | number | optional | Time in seconds. Required for set_time; for select_before_playhead/select_after_playhead it is the reference time and defaults to the current playhead. |
| length | number | optional | Animation length in seconds, including all keyframes (for set_length action). |
| fps | integer | optional | Integer frames per second, 10–120 (for set_fps action; Blockbench minimum is 10). |
| loop_mode | "once" | "loop" | "hold" | optional | Loop mode for the animation. |
| range | object | optional | Time range for selection. |
| scope | "animation" | "timeline" | optional | Keyframes considered by select_before_playhead/select_after_playhead. animation: every bone animator of the target animation, including ones hidden from the timeline. timeline: only animators shown in the timeline with visible channels, matching the native action; requires the target animation to be selected. |
batch_keyframe_operations
Batch Keyframe Operations
Edits keyframes in the active animation atomically; all includes hidden animators. Numeric value edits use native transform values. Reverse follows the native Reverse Keyframes action, including the GeckoLib plugin's easing adjustment. Bake samples continuous numeric curves within selected channel spans, caps output at 10000 samples, and restores the playhead. Expressions, step/pre-post curves and effect channels require native baking. Smooth and bake clear GeckoLib easings they replace and report it.
| Name | Type | Required | Description |
|---|---|---|---|
| selection | "all" | "selected" | "range" | "pattern" | optional | Which active-animation keyframes to operate on. all includes hidden or collapsed animators. |
| range | object | optional | Time range for keyframe selection. |
| pattern | object | optional | Pattern-based selection. |
| operation | "offset" | "scale" | "reverse" | "mirror" | "smooth" | "bake" | required | Operation to perform on keyframes. reverse works like Blockbench's Reverse Keyframes action: times flip within the selection, pre/post values and Bezier handles swap, and GeckoLib easings flip direction and move to the key their segment now arrives at, as the GeckoLib plugin does. smooth and bake clear the GeckoLib easings they replace and report it. |
| parameters | object | optional | Operation-specific parameters. |
animation_copy_paste
Animation Copy/Paste
Copies native keyframe data points and curve metadata into a plugin-local clipboard. Paste preserves exact timestamps, replaces same-channel/time collisions and is undoable, including newly created animators. Mirror paste uses native position/rotation/curve mirroring; scale is unchanged.
| Name | Type | Required | Description |
|---|---|---|---|
| action | "copy" | "paste" | "mirror_paste" | required | Copy or paste action. |
| source | object | optional | Source data for copy operation. |
| target | object | optional | Target data for paste operation. |
variable_placeholders
Variable Placeholders
Reads or edits the project's animation Variable Placeholders text (one `variable = expression` per line), used to preview Molang animations. add writes a value, slider('name', step, min, max), toggle('name') or impulse('name', duration) line like the native Create Variable Placeholder dialog; set replaces all text; remove deletes a variable's lines. Changes sync through the native panel, refresh the animation preview and return the parsed lines and live controls. Placeholder edits are not recorded in Undo. Requires a format with Molang enabled.
| Name | Type | Required | Description |
|---|---|---|---|
| action | "get" | "set" | "add" | "remove" | required | get: read text, parsed lines and live controls. set: replace the whole text. add: write one structured line. remove: delete every line assigning variable. |
| text | string | optional | Complete placeholder text for set; one `variable = expression` per line. Empty clears all placeholders. |
| entry | object | object | object | object | optional | Structured line for add. |
| replace_existing | boolean | optional | For add: replace an existing line for the same variable (aliases such as v. match) instead of appending a duplicate. |
| variable | string | optional | Variable to delete for remove. |
list_molang_variables
List Molang Variables
Lists Blockbench's built-in Molang variables and query functions available in animation previews (like the native View Built-in Variables dialog), with current values for constants and live queries, plus the project's placeholder assignments. Read-only.
| Name | Type | Required | Description |
|---|---|---|---|
| filter | string | optional | Case-insensitive substring filter on variable names, e.g. 'camera'. |
Armature
list_armatures
List Armatures
Lists all armatures in the current project with their basic info.
No parameters
get_armature
Get Armature
Gets detailed information about a specific armature including its bones.
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | UUID or name of the armature. |
| include_bones | boolean | optional | Whether to include bone hierarchy in response. |
add_armature
Add Armature
Creates a new armature in the project. An armature is a skeletal rig used for mesh deformation.
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | optional | Name for the new armature. |
| visibility | boolean | optional | |
| locked | boolean | optional | |
| add_initial_bone | boolean | optional | Whether to add an initial bone to the armature. |
remove_armature
Remove Armature
Removes an armature and all its bones from the project.
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | UUID or name of the armature to remove. |
update_armature
Update Armature
Updates properties of an existing armature.
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | UUID or name of the armature. |
| name | string | optional | New name for the armature. |
| visibility | boolean | optional | |
| locked | boolean | optional | |
| export | boolean | optional | Whether to export this armature. |
list_armature_bones
List Armature Bones
Lists all armature bones, optionally filtered by a specific armature.
| Name | Type | Required | Description |
|---|---|---|---|
| armature_id | string | optional | Filter bones by armature UUID or name. If not provided, lists all bones. |
get_armature_bone
Get Armature Bone
Gets detailed information about a specific armature bone.
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | UUID or name of the bone. |
| include_weights | boolean | optional | Whether to include the bone's raw vertex_weights map in the response. Keys are `<first 6 chars of mesh UUID>:<vertex key>` (legacy projects may still hold bare `<vertex key>` entries until reweighted); use get_vertex_weights for per-mesh vertex-key maps. |
add_armature_bone
Add Armature Bone
Creates a new bone and adds it to an armature or parent bone.
| Name | Type | Required | Description |
|---|---|---|---|
| parent_id | string | required | UUID or name of parent armature or bone. |
| name | string | optional | Name for the new bone. |
| origin | number[] | optional | Position of the bone. Defaults to [0, parent.length, 0] for child bones. |
| rotation | number[] | optional | 3D vector [x, y, z]. |
| length | number | optional | Length of the bone. |
| width | number | optional | Width of the bone. |
| connected | boolean | optional | Whether bone is connected to parent. |
| color | integer | optional | Marker color index (0-7). |
remove_armature_bone
Remove Armature Bone
Removes an armature bone from the project.
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | UUID or name of the bone to remove. |
| remove_children | boolean | optional | Whether to also remove child bones. |
update_armature_bone
Update Armature Bone
Updates properties of an existing armature bone.
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | UUID or name of the bone. |
| name | string | optional | |
| origin | number[] | optional | New position of the bone. |
| rotation | number[] | optional | New rotation [x, y, z] in degrees. |
| length | number | optional | |
| width | number | optional | |
| connected | boolean | optional | |
| color | integer | optional | |
| visibility | boolean | optional | |
| locked | boolean | optional |
update_armature_bones_batch
Update Armature Bones (Batch)
Updates multiple armature bones at once with the same properties.
| Name | Type | Required | Description |
|---|---|---|---|
| ids | string[] | required | Array of bone UUIDs or names to update. |
| visibility | boolean | optional | |
| locked | boolean | optional | |
| color | integer | optional |
select_armature_bones
Select Armature Bones
Selects armature bones by ID. Can select single bone, multiple bones, or bone hierarchy.
| Name | Type | Required | Description |
|---|---|---|---|
| ids | string[] | optional | Array of bone UUIDs or names to select. |
| armature_id | string | optional | Select all bones in this armature. |
| include_descendants | boolean | optional | Include all descendant bones in selection. |
| clear_selection | boolean | optional | Clear existing selection before selecting. |
get_vertex_weights
Get Vertex Weights
Gets vertex weights for a mesh from all bones affecting it.
| Name | Type | Required | Description |
|---|---|---|---|
| mesh_id | string | optional | ID or name of the mesh. If not provided, uses selected mesh. |
| bone_id | string | optional | Filter weights by specific bone. |
set_vertex_weight
Set Vertex Weight
Sets the weight of a specific vertex on a bone.
| Name | Type | Required | Description |
|---|---|---|---|
| bone_id | string | required | UUID or name of the bone. |
| mesh_id | string | optional | ID or name of the mesh. If not provided, uses selected mesh. |
| vertex_key | string | required | Key of the vertex in the mesh. |
| weight | number | required | Weight value (0-1). Set to 0 to remove weight. |
set_vertex_weights_batch
Set Vertex Weights (Batch)
Sets multiple vertex weights at once on a bone.
| Name | Type | Required | Description |
|---|---|---|---|
| bone_id | string | required | UUID or name of the bone. |
| mesh_id | string | optional | ID or name of the mesh. If not provided, uses selected mesh. |
| weights | Record<string, number> | required | Map of vertex_key -> weight value. |
clear_vertex_weights
Clear Vertex Weights
Clears all vertex weights from a bone for a specific mesh, including legacy bare vertex-key entries that still apply to that mesh.
| Name | Type | Required | Description |
|---|---|---|---|
| bone_id | string | required | UUID or name of the bone. |
| mesh_id | string | optional | ID or name of the mesh. If not provided, uses selected mesh. |
set_ik_controller
Set IK Controller
Creates or updates an inverse-kinematics controller. Blockbench drives IK from a null object: ik_target is the end effector (group/bone, armature bone, or locator) that reaches for the null object, ik_source is the chain root (defaults to the null object's parent), ik_pole (Blockbench 5.2+) sets the bend direction, and lock_ik_target_rotation keeps the effector's rotation. Works with bone rigs and armatures (5.2 allows null objects under armatures and armature bones). Validates every reference and that the target lies below the chain root; returns the solved chain. Replaces the deprecated bone_rigging set_ik flags, which Blockbench never read.
| Name | Type | Required | Description |
|---|---|---|---|
| null_object | string | optional | UUID or name of an existing null object to update. Omit to create a new IK controller null object. |
| name | string | optional | Name for the null object. Defaults to '<ik_target name>_ik' when creating. |
| position | number[] | optional | Null object position [x, y, z] as Blockbench stores it (model space for root and group parents). Defaults to the end effector's world pivot when creating. |
| parent | string | optional | Parent group, armature, or armature bone (UUID or name), or 'root'. Defaults to root when creating. When ik_source is empty the parent is the implicit chain root, so keep IK controllers outside the chain they drive. |
| ik_target | string | optional | End effector that reaches for the null object: a group/bone, armature bone, or locator (UUID or name). Required when creating; must be a descendant of the chain root. Empty string clears. |
| ik_source | string | optional | Chain root: a group/bone or armature bone (UUID or name). The chain spans from here down to ik_target. Empty string clears, making the null object's parent the chain root. |
| ik_pole | string | optional | Pole target controlling the bend direction (Blockbench 5.2+): a group, locator, or other null object (UUID or name). Empty string clears. |
| lock_ik_target_rotation | boolean | optional | Keep the end effector's world rotation while the chain solves. |
Display Settings
get_display_transform
Get Display Transform
Reads Java Edition display settings (Project.display_settings). Returns translation, rotation, scale, mirror and pivots for a single slot, or a summary of every populated slot when no slot is given. Never modifies state.
| Name | Type | Required | Description |
|---|---|---|---|
| slot | "thirdperson_righthand" | "thirdperson_lefthand" | "firstperson_righthand" | "firstperson_lefthand" | "ground" | "gui" | "head" | "embedded" | "fixed" | "on_shelf" | optional | Display slot to read. If omitted, returns every populated slot in the project. |
set_display_transform
Set Display Transform
Writes a Java Edition display slot's transform (translation, rotation, scale, mirror, pivots). Creates the slot if it does not exist yet (seeded from Blockbench's Bedrock item display defaults on bedrock_block projects, identity otherwise) and wraps the change in an undo step. This edits data that ships in the exported model JSON — it changes the deliverable, not just the preview. Values are kept as given, like Blockbench does; outside bedrock_block projects the result warns about those Minecraft Java clamps or ignores (translation beyond ±80, scale beyond ±4, pivots, the embedded slot). Requires a format that supports display mode (e.g. Java Block/Item).
| Name | Type | Required | Description |
|---|---|---|---|
| slot | "thirdperson_righthand" | "thirdperson_lefthand" | "firstperson_righthand" | "firstperson_lefthand" | "ground" | "gui" | "head" | "embedded" | "fixed" | "on_shelf" | required | Display slot to modify. embedded is a Bedrock block slot that Minecraft Java ignores. |
| translation | number[] | optional | Translation offset as [x, y, z] (Minecraft display units, 1/16 block). Minecraft Java clamps each component to ±80. |
| rotation | number[] | optional | Rotation in degrees as [x, y, z]. |
| scale | number[] | optional | Scale factor as [x, y, z]; a negative component mirrors that axis. Minecraft Java clamps each exported component to ±4. |
| rotation_pivot | number[] | optional | Rotation pivot point as [x, y, z]. Only Bedrock reads pivots; Minecraft Java ignores them. |
| scale_pivot | number[] | optional | Scale pivot point as [x, y, z]. Only Bedrock reads pivots; Minecraft Java ignores them. |
| mirror | boolean[] | optional | Per-axis mirror flags as [x, y, z]. |
| reset | boolean | optional | Reset the slot to its default transform before applying any of the other values: identity, or Blockbench's Bedrock defaults on bedrock_block projects. |
enter_display_mode
Enter Display Mode
Switches Blockbench into Display mode, activates the given slot and optionally loads a reference model (player, zombie, armor stand, …), then returns a screenshot. Pair with set_camera_angle / capture_screenshot for multi-angle fit checks of cosmetics and handheld items. Requires a format that supports display mode.
| Name | Type | Required | Description |
|---|---|---|---|
| slot | "thirdperson_righthand" | "thirdperson_lefthand" | "firstperson_righthand" | "firstperson_lefthand" | "ground" | "gui" | "head" | "embedded" | "fixed" | "on_shelf" | required | Display slot to switch to and activate. |
| reference | string | optional | Optional reference model to load for a fit check (e.g. 'player', 'zombie', 'armor_stand', 'baby_zombie', 'block'). Validated against the live reference model list; an unknown value returns the available names. |
Elements
remove_element
Remove Element
Removes the element with the given ID.
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | ID or name of the element to remove. |
add_group
Add Group
Adds a new group with the given name and options.
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | required | |
| origin | number[] | optional | Pivot point of the group as [x, y, z]. |
| rotation | number[] | optional | Rotation of the group in degrees as [x, y, z]. |
| parent | string | optional | Parent group UUID or name, or root for the project root. |
| visibility | boolean | optional | |
| autouv | "0" | "1" | "2" | optional | Auto UV setting. 0 = disabled, 1 = enabled, 2 = relative auto UV. |
| selected | boolean | optional | |
| shade | boolean | optional | Outliner shading toggle, matching Blockbench's default (true). Ignored by Java 26.3+ projects, which use per-cube shade_direction_override instead. |
list_outline
List Outline
Returns the project outline as a hierarchical tree. Each node reports { name, uuid, type, children? }, including groups, armatures, armature bones, cubes, meshes and markers. Parent nodes retain their descendants. Use include_cubes=false and include_meshes=false to omit geometry leaves, or max_depth to bound very deep trees.
| Name | Type | Required | Description |
|---|---|---|---|
| include_cubes | boolean | optional | If true, include cubes as leaves. If false, omit cubes while retaining other node types. |
| include_meshes | boolean | optional | If true, include meshes as leaves. If false, omit meshes. |
| max_depth | integer | optional | Maximum tree depth to traverse. Use a small value to summarize large projects. |
duplicate_element
Duplicate Element
Duplicates any outliner element or group (with its children) by ID or name using Blockbench's native duplicate, so every property, face UV, texture and mesh vertex key is preserved. Mesh copies inherit their armature bone vertex weights, and copied IK null objects point at the copied bones when their chain was duplicated with them. Optionally offsets the copy and assigns a new name. Selection is left unchanged.
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | ID or name of the element to duplicate. |
| offset | number[] | optional | Model-space offset [x, y, z] applied to the copy and every descendant. |
| newName | string | optional | Name for the top-level copy. Defaults to Blockbench's duplicate naming (trailing number incremented, unique where required). |
rename_element
Rename Element
Renames a cube, mesh or group by ID or name.
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | ID or name of the element to rename. |
| new_name | string | required | New name to assign. |
find_elements_by_criteria
Find Elements by Criteria
Searches the current project for elements matching the given criteria. Supports name pattern matching (regex or substring), type filtering, scoping to a parent group, cube size ranges, and selection scope. Returns element metadata, never modifies state.
| Name | Type | Required | Description |
|---|---|---|---|
| name_pattern | string | optional | Regex pattern to match element names (e.g., '^arm_.*'). Case-sensitive. Patterns over 512 characters, with nested quantifiers such as (a+)+, or that do not compile are rejected with an error. |
| name_contains | string | optional | Substring to match in element names. Case-insensitive. |
| type | "cube" | "mesh" | "group" | "any" | optional | Restrict to a single element type. |
| parent_group | string | optional | UUID or name of a parent group. Only descendants of this group are returned. |
| min_size | number[] | optional | Minimum [x,y,z] size for cubes. Cubes smaller on any axis are excluded. |
| max_size | number[] | optional | Maximum [x,y,z] size for cubes. Cubes larger on any axis are excluded. |
| selected_only | boolean | optional | Only consider currently selected elements. |
| limit | integer | optional | Maximum number of results to return. |
select_all_of_type
Select All of Type
Selects all elements of the given type (cube, mesh, or group) in the current project. Optionally restrict to descendants of a parent group, or add to (rather than replace) the current selection. As in Blockbench, locked nodes are skipped and selecting a group also selects its contents.
| Name | Type | Required | Description |
|---|---|---|---|
| type | "cube" | "mesh" | "group" | required | Element type to select. |
| add_to_selection | boolean | optional | If true, add to current selection. If false, replace selection. |
| parent_group | string | optional | UUID or name of a parent group. If provided, only descendants of this group are selected. |
filter_by_material
Filter Elements by Material
Returns all elements that reference the given texture. For cubes, includes the list of face keys (e.g., 'north', 'up') that use the texture. For meshes, returns the mesh if any face uses the texture.
| Name | Type | Required | Description |
|---|---|---|---|
| texture | string | required | Texture ID, UUID or name to search for. |
| include_face_keys | boolean | optional | Include the list of cube face keys (e.g., 'north') that reference the texture. |
get_selection
Get Selection
Returns the current selection state: selected cube/mesh/group UUIDs and names, plus the active texture. Use this to verify what `apply_texture` or a paint tool with `fill_mode="selected_elements"` will target.
No parameters
Export
list_export_formats
List Export Formats
Lists registered export codecs, file extensions, compile/export support, and availability under the native export action's condition. Use before `export_model` to pick a codec.
| Name | Type | Required | Description |
|---|---|---|---|
| only_current_format | boolean | optional | If true, only return codecs compatible with the current project's format. |
export_model
Export Model
Compiles the current project through a codec whose native export action is available. Returns JSON metadata and a live .bbmodel resource link; result_format='embedded' returns complete exports as text/blob resources with URI and MIME type. Optionally writes to a local path (requires Blockbench filesystem permission). Partial codec options merge over the configured defaults; for glTF armatures, options.merge_armature=true merges each armature's meshes into one SkinnedMesh. Use `list_export_formats` to discover codecs.
| Name | Type | Required | Description |
|---|---|---|---|
| codec_id | string | optional | Codec ID to use for export (e.g., 'obj', 'gltf', 'project', 'bedrock'). If omitted, uses the current project format's codec. Use `list_export_formats` to see available IDs. |
| options | Record<string, unknown> | optional | Codec-specific export options, merged over the codec's configured export options (keys match the native export dialog). glTF ('gltf'): encoding ('ascii' | 'binary'), scale, embed_textures, armature (export groups as skinned bones), animations, and merge_armature (Blockbench 5.2+; default false exports one SkinnedMesh per armature child mesh, true merges each armature's meshes into a single SkinnedMesh). |
| path | string | optional | Absolute filesystem path to write the compiled model to. Requires user permission (Blockbench v5.0+ prompts for 'fs' access). If omitted, content is returned in the response only. Fails if the file exists unless overwrite is true. |
| overwrite | boolean | optional | Replace an existing file at path. Defaults to false so an export never silently replaces another file. |
| max_content_length | integer | optional | Maximum characters of text or base64 to return. Use 0 to omit file content. In embedded mode, only complete files within this limit are embedded; larger files return a truncated preview in metadata.content. |
| result_format | "text" | "embedded" | optional | text preserves the JSON metadata.content payload. embedded moves a complete file into an MCP resource block with URI and MIME type, sets metadata.content to null, and reports its resource_uri. Both modes include a link to the live .bbmodel project resource. |
History
undo
Undo
Undoes the most recent edit in the current project. Use `steps` to undo multiple edits in a single call. Returns the action(s) that were undone.
| Name | Type | Required | Description |
|---|---|---|---|
| steps | integer | optional | Number of steps to undo. |
redo
Redo
Redoes the most recently undone edit. Use `steps` to redo multiple edits in a single call. Returns the action(s) that were redone.
| Name | Type | Required | Description |
|---|---|---|---|
| steps | integer | optional | Number of steps to redo. |
get_undo_stack
Get Undo Stack
Returns the current undo/redo history: the list of edit entries, the current index, and which entries are undone vs. applied. Use this to inspect available undo/redo operations and find named checkpoints.
| Name | Type | Required | Description |
|---|---|---|---|
| limit | integer | optional | Maximum number of entries to return (most recent first). |
save_checkpoint
Save Checkpoint
Inserts a named marker into the undo history. The marker can later be located with `get_undo_stack` so the agent knows how many times to call `undo` to return to this state. Does not modify the project.
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | required | Descriptive name for the checkpoint. Shown in undo history so agents can navigate back to this point. |
Import/Export
from_geo_json
Import GeoJSON
Imports one Bedrock geometry (.geo.json) into the current project, which keeps its format (one with bones: Bedrock, GeckoLib, generic, ...), as one undoable edit, and returns a screenshot. Adds the bones with their cubes, locators and texture meshes; the texture size, box UV mode and item display transforms it sets are undone with it, while the project's visible bounds can only grow. If the active project changes while loading, the import is rejected without modifying the new project. URLs on this computer or a private network are refused; pass a file path instead.
| Name | Type | Required | Description |
|---|---|---|---|
| geojson | string | required | Bedrock geometry (format 1.12 or later) as inline JSON, an absolute path or file:// URL of a file on this computer (read with Blockbench's file permission), or a public http(s) URL (at most 10 MB). |
| geometry | string | optional | Identifier of the geometry to import, such as geometry.robot, when the file holds several. Omit it when the file holds one. |
Material Instances
get_face_material_instances
Get Face Material Instances
Gets the material instance names for cube faces. Material instances are used in Bedrock Block format to map faces to materials defined in the minecraft:material_instances component.
| Name | Type | Required | Description |
|---|---|---|---|
| cube_id | string | optional | ID or name of the cube. If not provided, uses the first selected cube. |
| faces | "north" | "south" | "east" | "west" | "up" | "down"[] | optional | Specific faces to get/clear material instances for. If not provided, returns/clears all faces. |
set_face_material_instance
Set Face Material Instance
Sets the material instance name for one or more cube faces. Material instances are strings that map to materials defined in the minecraft:material_instances component for Bedrock Block format.
| Name | Type | Required | Description |
|---|---|---|---|
| cube_id | string | optional | ID or name of the cube. If not provided, applies to all selected cubes. |
| material_name | string | required | The material instance name to assign. Use empty string to clear the material instance. |
| faces | "north" | "south" | "east" | "west" | "up" | "down"[] | optional | Faces to set the material instance on. Defaults to all faces. |
list_material_instances
List Material Instances
Lists all unique material instance names used in the project. Returns the material instance names along with which cubes and faces use them.
No parameters
bulk_set_material_instances
Bulk Set Material Instances
Sets material instance names on multiple cubes at once. Useful for assigning different material instances to different faces across the project.
| Name | Type | Required | Description |
|---|---|---|---|
| assignments | object[] | required | Array of material instance assignments. |
clear_material_instances
Clear Material Instances
Clears (removes) material instance names from cube faces. Useful for resetting material assignments.
| Name | Type | Required | Description |
|---|---|---|---|
| cube_id | string | optional | ID or name of the cube. If not provided, clears from all selected cubes. |
| faces | "north" | "south" | "east" | "west" | "up" | "down"[] | optional | Specific faces to clear. If not provided, clears all faces. |
| all_cubes | boolean | optional | If true, clears material instances from all cubes in the project. |
Mesh Editing
place_mesh
Place Mesh
Creates meshes from local vertices and optional indexed triangle/quad faces, with position, rotation, and scale. Texture and group are optional. Returns meshes with UUIDs and vertex_keys/face_keys arrays in input order for subsequent editing.
| Name | Type | Required | Description |
|---|---|---|---|
| elements | object[] | required | Array of meshes to place. |
| texture | string | optional | Texture ID or name to apply to the mesh. |
| group | string | optional | Group/bone to which the mesh belongs. |
extrude_mesh
Extrude Mesh
Extrudes the target mesh's selected face region along averaged normals, honoring distance. Returns new vertex keys and cap/wall face keys. Edge/vertex modes are unsupported.
| Name | Type | Required | Description |
|---|---|---|---|
| mesh_id | string | optional | ID or name of the mesh. If not provided, uses selected mesh. |
| distance | number | optional | Signed distance along averaged selected face normals, in local model units. Defaults to Blockbench's current grid snap interval (getSpatialInterval), or 1 when unavailable. |
| mode | "faces" | "edges" | "vertices" | optional | Use faces. Edge and vertex extrusion are currently unsupported by this headless tool. |
subdivide_mesh
Subdivide Mesh
Subdivides the target mesh's selected triangles/quads into a regular grid with interpolated UVs. Returns new geometry keys. Unselected neighboring faces remain unchanged and may need matching cuts.
| Name | Type | Required | Description |
|---|---|---|---|
| mesh_id | string | optional | ID or name of the mesh. If not provided, uses selected mesh. |
| cuts | integer | optional | Number of cuts per edge; each selected face becomes (cuts + 1) squared faces. |
create_sphere
Create Sphere
Creates a sphere mesh at the specified position with the given parameters. The sphere is created as a mesh with vertices and faces using spherical coordinates.
| Name | Type | Required | Description |
|---|---|---|---|
| elements | object[] | required | Array of spheres to create. |
| texture | string | optional | Texture ID or name to apply to the sphere. |
| group | string | optional | Group/bone to which the sphere belongs. |
select_mesh_elements
Select Mesh Elements
Selects vertices, edges, or faces of a mesh for manipulation. Keys the mesh does not have are rejected, except when removing them from the selection.
| Name | Type | Required | Description |
|---|---|---|---|
| mesh_id | string | required | ID or name of the mesh to select elements from. |
| mode | "vertex" | "edge" | "face" | required | Selection mode. |
| elements | string[] | optional | Keys to select: vertex keys in vertex mode, face keys in face mode, 'vkey1-vkey2' edges in edge mode (from get_mesh_info or the creation tools). If not provided, selects all. |
| action | "select" | "add" | "remove" | "toggle" | optional | Selection action: select (replace), add, remove, or toggle. |
move_mesh_vertices
Move Mesh Vertices
Moves the given vertex keys, or the mesh's selected vertices, by the specified offset in one undo entry. Unknown keys are rejected before anything moves.
| Name | Type | Required | Description |
|---|---|---|---|
| mesh_id | string | optional | ID or name of the mesh. If not provided, uses selected mesh. |
| offset | number[] | required | Offset to move vertices by [x, y, z]. |
| vertices | string[] | optional | Specific vertex keys to move. If not provided, moves all selected vertices. |
delete_mesh_elements
Delete Mesh Elements
Deletes selected components only from the target mesh. Vertex/edge deletion removes incident faces; keep_vertices retains vertices orphaned by face/edge removal.
| Name | Type | Required | Description |
|---|---|---|---|
| mesh_id | string | optional | ID or name of the mesh. If not provided, uses selected mesh. |
| mode | "vertices" | "edges" | "faces" | optional | What to delete: vertices, edges, or faces. |
| keep_vertices | boolean | optional | When deleting faces/edges, whether to keep the vertices. |
merge_mesh_vertices
Merge Mesh Vertices
Merges vertices that are within a specified distance of each other, in one undo entry. Each face keeps a surviving vertex once; faces the merge collapses (fewer than three vertices left) are removed.
| Name | Type | Required | Description |
|---|---|---|---|
| mesh_id | string | required | ID or name of the mesh. |
| threshold | number | optional | Maximum distance between vertices to merge. |
| selected_only | boolean | optional | Whether to only merge selected vertices. |
create_mesh_face
Create Mesh Face
Creates a triangle or quad face from 3 or 4 distinct existing vertex keys, with an optional texture, in one undo entry.
| Name | Type | Required | Description |
|---|---|---|---|
| mesh_id | string | optional | ID or name of the mesh. If not provided, uses selected mesh. |
| vertices | string[] | required | Vertex keys to create face from. Must be 3 or 4 vertices. |
| texture | string | optional | Texture ID or name to apply to the new face. |
create_cylinder
Create Cylinder
Creates one or more cylinder meshes with optional end caps.
| Name | Type | Required | Description |
|---|---|---|---|
| elements | object[] | required | |
| texture | string | optional | Texture ID or name. If not provided, uses selected texture. |
| group | string | optional | Group/bone ID or name. |
knife_tool
Knife Tool
Currently unsupported for meshes: Blockbench's interactive Knife context requires pointer topology that this point-list API cannot safely provide. Use subdivide_mesh or place_mesh for meshes; use knife_cut_cube or slice_cubes_to_block_grid to cut cubes headlessly.
| Name | Type | Required | Description |
|---|---|---|---|
| mesh_id | string | required | ID or name of the mesh to cut. |
| points | object[] | required | Points defining the cut path. |
create_polyhedron
Create Polyhedron
Creates icosphere, octahedron, or dodecahedron meshes (Blockbench 5.2 primitives) with a detail level of 0-6, as triangles with coincident vertices merged and planar per-face UVs. Returns vertex_keys/face_keys per mesh.
| Name | Type | Required | Description |
|---|---|---|---|
| elements | object[] | required | Polyhedra to create. |
| texture | string | optional | Texture ID or name to apply to every face. |
| group | string | optional | Group/bone to which the meshes belong. |
loop_cut_mesh
Loop Cut Mesh
Runs Blockbench's native Loop Cut on a mesh: splits the quad ring crossing the start edge with one or more parallel cuts, with offset, direction and 5.2 spacing modes (proportional, even_start, even_end). One undo entry. The new loop vertices become the selection and are returned.
| Name | Type | Required | Description |
|---|---|---|---|
| mesh_id | string | optional | ID or name of the mesh. If not provided, uses selected mesh. |
| edge | string[] | optional | Two vertex keys of the edge to start the loop from; the cut runs across the face ring perpendicular to it. Defaults to the mesh's current vertex/face selection (at least two selected vertices). |
| cuts | integer | optional | Number of parallel loop cuts. |
| offset | number | optional | Distance of the (first) cut from the start of the edge, in the given unit. Defaults to the edge midpoint (or even spacing for multiple cuts). |
| unit | "size" | "percent" | optional | Unit of offset: model units ('size') or percent of the start edge length. |
| direction | integer | optional | Rotates which edge of the start face the loop starts from, as the native Direction slider. |
| spacing | "proportional" | "even_start" | "even_end" | optional | Blockbench 5.2 spacing: proportional keeps the same ratio on every edge of the loop; even_start/even_end keep the same absolute distance from the loop's start/end side. |
flip_in_place
Flip In Place
Mirrors elements in place along an axis using Blockbench's native Flip In Place (flip_in_place_x/y/z): cubes flip around their own center, meshes around their origin, groups also invert rotations in bone-rig formats. For meshes in vertex/edge/face selection mode only the selected components flip. Edit mode only.
| Name | Type | Required | Description |
|---|---|---|---|
| ids | string[] | optional | Element or group UUIDs/names to flip. Replaces the selection with these. Defaults to the current selection. |
| axis | "x" | "y" | "z" | required | Axis to mirror across each element's own center (cubes) or pivot (meshes, groups, other elements). |
get_mesh_info
Get Mesh Info
Inspects a mesh by UUID/name or the first selected mesh without changing geometry, selection, or undo history. Returns transforms, parent, total counts, mesh-local bounds, selection counts, and optional paginated vertices/faces with actual runtime keys. Faces use perimeter vertex order and normalized mesh-local normals (zero for degenerate faces), stored texture references, and optional UVs. Texture status distinguishes resolved, missing, unassigned (false), disabled (null), and unset; default format materials are not resolved. Pages sort keys lexicographically and expose next_offset; geometry must remain unchanged between calls. Set include_vertices/include_faces false for a compact summary.
| Name | Type | Required | Description |
|---|---|---|---|
| mesh_id | string | optional | Mesh UUID or name. Omit to inspect the first selected mesh. |
| include_vertices | boolean | optional | Include a page of vertex keys, local positions, and selection flags. |
| include_faces | boolean | optional | Include a page of face keys, perimeter vertices, local normals, texture references, and selection flags. |
| include_uv | boolean | optional | Include per-vertex UV coordinates for returned faces, in Blockbench texture units. |
| vertex_offset | integer | optional | Zero-based offset into lexicographically sorted vertex keys. |
| face_offset | integer | optional | Zero-based offset into lexicographically sorted face keys. |
| limit | integer | optional | Maximum items in each included page. Continue using that page's next_offset; avoid editing geometry between pages. |
Paint Tools
paint_fill_tool
Paint Fill Tool
Uses the fill/bucket tool to fill areas with color. In 'face' and 'element' fill modes only the face or element whose UV area contains the given texture pixel is filled, and a pixel no face covers is an error. Seeds outside the texture are rejected, and so are color and color_connected seeds outside the active layer, where the fill reads its seed color. Opacity is 0-255 regardless of Blockbench's opacity range setting.
| Name | Type | Required | Description |
|---|---|---|---|
| texture_id | string | optional | Texture ID or name. If not provided, uses selected texture. |
| x | number | required | Texture pixel X where the fill starts; must lie inside the texture except for 'selection' and 'selected_elements' fills, which ignore it. |
| y | number | required | Texture pixel Y where the fill starts; must lie inside the texture except for 'selection' and 'selected_elements' fills, which ignore it. |
| color | string | optional | Fill color as hex string. |
| opacity | number | optional | Fill opacity (0-255). |
| tolerance | number | optional | Only zero (exact color matching) is supported by the native fill API. Nonzero tolerance is rejected. |
| fill_mode | "color" | "color_connected" | "face" | "element" | "selected_elements" | "selection" | optional | Fill mode. 'face' and 'element' fill only the face/element whose UV area contains (x, y) in texture space (Blockbench 5.2 looks it up with UVEditor.findFaceAtUV); 'color'/'color_connected' match exact colors; 'selected_elements' fills every selected element; 'selection' fills the texture selection (image editor). |
| blend_mode | "default" | "set_opacity" | "color" | "behind" | "multiply" | "add" | "screen" | "overlay" | "difference" | optional | Fill blend mode. |
draw_shape_tool
Draw Shape Tool
Draws geometric shapes on textures.
| Name | Type | Required | Description |
|---|---|---|---|
| texture_id | string | optional | Texture ID or name. If not provided, uses selected texture. |
| shape | "rectangle" | "rectangle_h" | "ellipse" | "ellipse_h" | required | Shape to draw. '_h' suffix means hollow. |
| start | object | required | |
| end | object | required | |
| color | string | optional | Shape color as hex string. |
| line_width | number | optional | Line width for hollow shapes. |
| opacity | number | optional | Shape opacity (0-255). |
| blend_mode | "default" | "set_opacity" | "color" | "behind" | "multiply" | "add" | "screen" | "overlay" | "difference" | optional | Shape blend mode. |
gradient_tool
Gradient Tool
Applies gradients to textures.
| Name | Type | Required | Description |
|---|---|---|---|
| texture_id | string | optional | Texture ID or name. If not provided, uses selected texture. |
| start | object | required | |
| end | object | required | |
| start_color | string | required | Start color as hex string. |
| end_color | string | required | End color as hex string. |
| opacity | number | optional | Gradient opacity (0-255). |
| blend_mode | "default" | "set_opacity" | "color" | "behind" | "multiply" | "add" | "screen" | "overlay" | "difference" | optional | Gradient blend mode. |
color_picker_tool
Color Picker Tool
Picks a texture pixel's color and makes it the primary or secondary color, like Blockbench's color picker. It does not edit the texture, but it changes the active colors, selects the texture, and depending on Blockbench's settings can set the brush opacity or switch the active paint tool.
| Name | Type | Required | Description |
|---|---|---|---|
| texture_id | string | optional | Texture ID or name. If not provided, uses selected texture. |
| x | number | required | X coordinate to pick color from. |
| y | number | required | Y coordinate to pick color from. |
| set_as_secondary | boolean | optional | Set as secondary color instead of primary. |
| pick_opacity | boolean | optional | Also pick and apply the pixel's opacity. |
copy_brush_tool
Copy Brush Tool
Uses the copy/clone brush to copy texture areas.
| Name | Type | Required | Description |
|---|---|---|---|
| texture_id | string | optional | Texture ID or name. If not provided, uses selected texture. |
| source | object | required | |
| target | object | required | |
| brush_size | number | optional | Copy brush size. |
| opacity | number | optional | Copy opacity (0-255). |
| mode | "copy" | "sample" | "pattern" | optional | Copy brush mode. |
| aspect_ratio | number | optional | Brush aspect ratio (-16 to 16). Negative narrows the width, positive narrows the height, 0 keeps the brush square/round. |
eraser_tool
Eraser Tool
Erases parts of textures with customizable settings.
| Name | Type | Required | Description |
|---|---|---|---|
| texture_id | string | optional | Texture ID or name. If not provided, uses selected texture. |
| coordinates | object[] | required | Array of coordinates to erase at. |
| brush_size | number | optional | Eraser brush size. |
| opacity | number | optional | Eraser opacity (0-255). |
| softness | number | optional | Eraser softness percentage. |
| shape | "square" | "circle" | optional | Eraser shape. |
| connect_strokes | boolean | optional | Whether to connect erase strokes with lines. Disconnected points are separate native strokes and separate undo entries. |
paint_settings
Paint Settings
Configures paint mode settings and preferences, including Blockbench 5.2 screen-space brush projection, brush lock mode and brush aspect ratio. The result also reports the active opacity range (0-255 or 0-100); tool opacity parameters stay 0-255 and are converted automatically.
| Name | Type | Required | Description |
|---|---|---|---|
| mirror_painting | object | optional | Mirror painting settings. |
| lock_alpha | boolean | optional | Lock alpha channel while painting. |
| pixel_perfect | boolean | optional | Enable pixel perfect drawing. |
| paint_side_restrict | boolean | optional | Restrict painting to current face side. |
| color_erase_mode | boolean | optional | Enable color erase mode. |
| brush_opacity_modifier | "none" | "pressure" | "tilt" | optional | Brush opacity modifier for stylus. |
| brush_size_modifier | "none" | "pressure" | "tilt" | optional | Brush size modifier for stylus. |
| paint_with_stylus_only | boolean | optional | Only allow painting with stylus input. |
| pick_color_opacity | boolean | optional | Pick opacity when using color picker. |
| pick_combined_color | boolean | optional | Pick combined layer colors. |
| screen_space_brush_projection | boolean | optional | Project brushes in screen space when painting in the 3D viewport (Blockbench 5.2+, brush tools only). |
| brush_lock_mode | "none" | "element" | "selected_faces" | "face" | optional | Restrict viewport strokes: 'none', the 'element' the stroke started on, 'selected_faces', or the single 'face' it started on (Blockbench 5.2+). |
| brush_aspect_ratio | number | optional | Brush aspect ratio (-16 to 16) applied to every tool that supports it (brush and copy brush; Blockbench 5.2+). |
paint_with_brush
Paint with Brush
Paints with Blockbench's own brush tool, so blend mode, pixel-perfect drawing, lock alpha and mirror painting apply as when painting by hand. Given brush settings (opacity 0-255, softness 0-100%, hex or named color, shape, blend mode, aspect ratio) are set on the brush first; omitted ones keep the current brush. Paints on the selected pixel layer; if a layer group is selected, a pixel layer inside it is used.
| Name | Type | Required | Description |
|---|---|---|---|
| texture_id | string | optional | Texture ID or name. If not provided, uses selected texture. |
| coordinates | object[] | required | Array of coordinates to paint at. |
| brush_settings | object | optional | Brush settings written to Blockbench's brush before painting. Opacity is 0-255; softness is a 0-100 percentage. Omitted settings keep the current brush. |
| connect_strokes | boolean | optional | Whether to draw lines between consecutive coordinates, like dragging the brush, as one undo entry. false stamps each coordinate on its own: still one undo entry on Blockbench 5.2 and later, one per coordinate on older versions. |
create_brush_preset
Create Brush Preset
Creates a custom brush preset with specified settings. Omitted settings are stored as unset so loading the preset keeps the current value.
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | required | Name of the brush preset. |
| size | number | optional | Brush size. |
| opacity | number | optional | Opacity (0-255), independent of Blockbench's opacity range setting. |
| softness | number | optional | Brush softness percentage. |
| shape | "square" | "circle" | optional | Brush shape. Omit to keep the current shape when loading. |
| color | string | optional | Brush color as hex string. |
| blend_mode | "default" | "set_opacity" | "color" | "behind" | "multiply" | "add" | "screen" | "overlay" | "difference" | optional | Brush blend mode. Omit to keep the current blend mode when loading. |
| pixel_perfect | boolean | optional | Enable pixel perfect drawing. |
| screen_space | boolean | optional | Enable screen-space brush projection when the preset is loaded (Blockbench 5.2+). Omit to keep the current setting. |
load_brush_preset
Load Brush Preset
Loads and applies a custom or built-in brush preset (e.g. 'screen_space') by name.
| Name | Type | Required | Description |
|---|---|---|---|
| preset_name | string | required | Name of the brush preset to load: a custom preset name, or a built-in one such as 'pixel_brush', 'pixel_perfect', 'smooth_brush' or 'screen_space' (also accepts the full 'menu.brush_presets.*' key or its translated label). |
texture_selection
Texture Selection
Creates, modifies, or manipulates texture selections for painting.
| Name | Type | Required | Description |
|---|---|---|---|
| action | "select_rectangle" | "select_ellipse" | "select_all" | "clear_selection" | "invert_selection" | "expand_selection" | "contract_selection" | "feather_selection" | required | Selection action to perform. |
| texture_id | string | optional | Texture ID or name. If not provided, uses selected texture. |
| coordinates | object | optional | Selection area coordinates. |
| radius | number | optional | Radius in pixels for expand/contract operations (at most 64). |
| mode | "create" | "add" | "subtract" | "intersect" | optional | Selection mode. |
texture_layer_management
Texture Layer Management
Lists, creates, manages, and reorders texture layers and layer groups (Blockbench 5.2 hierarchy). Target a layer or group by UUID or name with layer_id; list_layers reports type, parent and depth.
| Name | Type | Required | Description |
|---|---|---|---|
| action | "list_layers" | "select_layer" | "create_layer" | "delete_layer" | "duplicate_layer" | "merge_down" | "set_opacity" | "set_blend_mode" | "move_layer" | "rename_layer" | "flatten_layers" | "toggle_visibility" | "create_group" | "ungroup" | "move_to_group" | "set_group_folded" | required | Layer action. list_layers reports the hierarchy (read-only); select_layer makes a layer the paint target; create_group, ungroup, move_to_group and set_group_folded manage layer groups (Blockbench 5.2+); toggle_visibility works on layers and groups; flatten_layers composites visible layers into the texture and disables layers. |
| texture_id | string | optional | Texture ID or name. If not provided, uses selected texture. |
| layer_id | string | optional | UUID or exact name of the layer or group to act on. Defaults to the texture's selected layer. |
| layer_name | string | optional | Name for create_layer/create_group/duplicate_layer, or the new name for rename_layer. |
| layer_ids | string[] | optional | create_group: UUIDs or names of layers/groups to move into the new group. They must share the same parent. |
| group_id | string | optional | UUID or name of the destination group for move_to_group and create_layer. Use an empty string for the root. |
| opacity | number | optional | Layer opacity percentage (0-100) for set_opacity. |
| blend_mode | "default" | "normal" | "set_opacity" | "color" | "multiply" | "add" | "darken" | "lighten" | "screen" | "overlay" | "difference" | "alpha_mask" | optional | Layer blend mode for set_blend_mode ('normal' is an alias of 'default'). |
| target_index | integer | optional | move_layer/move_to_group: position among siblings in the same parent, 0 = bottom-most; clamped to the valid range. |
| folded | boolean | optional | set_group_folded / create_group: whether the group is collapsed in the layers panel. |
| visible | boolean | optional | toggle_visibility: explicit visibility to set. Omit to toggle. |
Particles
list_particle_presets
List Particle Presets
Lists particle effect presets (smoke, fire, sparks, magic, glow, snow, drip, ...), built-in sprites and textures, materials and facing modes. Every preset uses a texture that ships with Minecraft and Blockbench, so it previews and runs with no image file. Read this before create_particle_effect.
| Name | Type | Required | Description |
|---|---|---|---|
| include_designs | boolean | optional | Include each preset's design knobs, useful as a template for custom effects. |
create_particle_effect
Create Particle Effect
Creates a Bedrock particle effect (the Snowstorm format Blockbench, Minecraft Bedrock and GeckoLib use) from a preset plus design knobs, or from raw JSON. Writes <pack_root>/particles/<name>.json (and an optional custom texture to textures/particle/), validates it, and loads it into Blockbench's particle preview. Then place it with manage_particle_keyframes, usually at a locator from add_locator. Refuses invalid effects and existing files unless overwrite is true. Blockbench desktop only.
| Name | Type | Required | Description |
|---|---|---|---|
| identifier | string | required | Particle identifier, lowercase namespace:name (for example mymod:chimney_smoke). Do not use the minecraft namespace for new effects. |
| preset | "smoke" | "campfire_smoke" | "fire" | "flame" | "embers" | "sparks" | "magic" | "sparkle" | "glow" | "dust" | "snow" | "drip" | "bubbles" | "hearts" | "poof" | "soul" | "portal" | "steam" | "electric" | optional | Starting point; list_particle_presets describes each. design knobs override it. |
| design | object | optional | Knobs layered over the preset (or over a plain default effect). Units are blocks (16 model units) and seconds. |
| raw | Record<string, unknown> | optional | A complete Bedrock particle file (for example a Snowstorm export) instead of preset/design. Its identifier is replaced by `identifier`. |
| texture_image | object | optional | Custom texture for the effect. It is saved to <pack_root>/textures/particle/<name>.png and the effect's texture and texture_size are set from it (keep design.sprite unset). |
| pack_root | string | optional | Absolute resource-pack-style folder that receives particles/<name>.json and textures/particle/*.png. Defaults to the pack of a Bedrock entity opened from a resource pack, else the saved project's folder. |
| overwrite | boolean | optional | Replace an existing effect file (and texture) with the same name. |
update_particle_effect
Update Particle Effect
Changes an existing particle effect file with design knobs (only the components each knob owns are rewritten) or replaces it with raw JSON, validates it, saves it and refreshes the preview. Also loads an effect file from disk that Blockbench has not seen yet. Blockbench desktop only.
| Name | Type | Required | Description |
|---|---|---|---|
| effect | string | required | Particle identifier (mymod:smoke), effect name (smoke), or absolute path to the effect's .json file. A path that is not loaded yet is loaded. |
| design | object | optional | Knobs to change. Only the components a knob owns are rewritten; hand-written parts of the file stay. |
| raw | Record<string, unknown> | optional | Replace the whole file with this Bedrock particle JSON. The effect keeps its current identifier, so keyframes and the client entity still match. |
| texture_image | object | optional | Custom texture for the effect. It is saved to <pack_root>/textures/particle/<name>.png and the effect's texture and texture_size are set from it (keep design.sprite unset). |
| overwrite | boolean | optional | Replace a texture PNG that already exists with different content (another effect may use it). |
list_particle_effects
List Particle Effects
Lists particle effects loaded in Blockbench with their file, summary, texture status and validation warnings, every particle keyframe that uses them, keyframes that have no preview file or point at missing locators, and the client-entity particle_effects map a Bedrock pack needs.
| Name | Type | Required | Description |
|---|---|---|---|
| include_json | boolean | optional | Include each effect's full JSON. |
manage_particle_keyframes
Manage Particle Keyframes
Adds, removes or lists particle keyframes on an animation's Effects track. A keyframe spawns an effect at a time, optionally at a locator; Blockbench previews it in Animate mode (set_mode animate, then animation_timeline set_time and capture a screenshot). Keyframes export with Bedrock and GeckoLib animations. One undo step.
| Name | Type | Required | Description |
|---|---|---|---|
| animation_id | string | optional | Animation UUID or name. If not provided, uses current animation. |
| action | "add" | "remove" | "list" | required | add particle keyframes, remove them by time, or list them. |
| keyframes | object[] | optional | Keyframes for add. A keyframe at an existing particle time joins that keyframe as another effect. |
| times | number[] | optional | Times (seconds) to remove for remove; omit to remove every particle keyframe. |
| effect_filter | string | optional | For remove: only effects with this name, identifier or file. |
add_locator
Add Locator
Adds a locator: a named point on a bone where particle effects (and sounds) spawn and which they follow as the bone animates. Exported as a Bedrock bone locator. Requires a format with locators (Bedrock Entity, GeckoLib, Generic Model). One undo step.
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | required | Unique locator name; particle keyframes refer to it. |
| parent | string | optional | Bone/group name or UUID the locator follows. Omit for the model root. |
| position | number[] | required | Absolute position in model units (16 per block), like a cube corner. |
| rotation | number[] | optional | Degrees; orients effects whose shapes or directions use local space (formats with rotatable locators). |
| ignore_inherited_scale | boolean | optional | Keep effect size when the parent bone scales. |
export_particle_pack
Export Particle Pack
Delivers particle effects to a Bedrock resource pack: writes particles/<name>.json and copies custom textures to textures/particle/, then returns the particle_effects map to paste into the client entity so animation keyframe names resolve. Defaults to every effect the project's keyframes use. Skips identical files; refuses to overwrite different ones unless overwrite is true. Blockbench desktop only.
| Name | Type | Required | Description |
|---|---|---|---|
| destination | string | required | Absolute path to the resource pack root (the folder containing manifest.json). |
| effects | string[] | optional | Effects to deliver. Defaults to every effect used by particle keyframes in the project. |
| overwrite | boolean | optional | Replace files that exist with different content. Identical files are always skipped. |
Performance
get_average_fps
Get Average FPS
Measures the average frames per second of Blockbench's render loop by counting rendered frames for duration_ms, then returns the average with the frame count, the fps_limit setting, Blockbench's own last-second counter, window focus at the start of the window plus whether it changed, whether the page was hidden, and whether rendering was paused. The call waits for the whole window; keep other tools idle meanwhile for a representative reading. A minimised or fully occluded Blockbench renders no frames and freezes its timers, so the call returns an empty window at once with document_hidden and rendering_paused set rather than waiting; bring the window to the foreground to measure a real frame rate.
| Name | Type | Required | Description |
|---|---|---|---|
| duration_ms | integer | optional | Sampling window in milliseconds (250–10000). The call waits this long while counting rendered frames. |
Project
create_project
Create Project
Creates a project with the given name and format, and returns a resource link to its live .bbmodel file.
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | required | |
| format | string | optional | Project format ID from Blockbench's Formats registry (e.g. bedrock_block, java_block, free). Unknown IDs are rejected with the list of valid IDs. |
get_project_info
Get Project Info
Returns read-only project orientation: format id and display name, project name/UUID, texture resolution (texture_width/height), element counts, and a summary of top-level groups. Includes structured JSON and a resource link to the live .bbmodel project file. Prefer this over `risky_eval` for first-look inspection.
No parameters
Textures
create_texture
Create Texture
Creates a new texture with the given name and size.
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | required | |
| width | number | optional | |
| height | number | optional | |
| uv_width | number | optional | Logical UV width for formats with per_texture_uv_size. Supply uv_height too. Independent of bitmap width; omit both to preserve native defaults. |
| uv_height | number | optional | Logical UV height for formats with per_texture_uv_size. Supply uv_width too. Independent of bitmap height. |
| data | string | optional | Image data URL, or an absolute path or file:// URL of an image file (desktop only, read with Blockbench's file permission). |
| group | string | optional | |
| fill_color | number[] | string | optional | RGBA color to fill the texture, as tuple or HEX string. |
| layer_name | string | optional | Deprecated and ignored: textures are created without layers. Use texture_layer_management create_layer to add a named layer. |
| pbr_channel | "color" | "normal" | "height" | "mer" | optional | PBR channel to use for the texture. Color, normal, height, or Metalness/Emissive/Roughness (MER) map. |
| render_mode | "default" | "emissive" | "additive" | "layered" | optional | Render mode for the texture. Default, emissive, additive, or layered. |
| render_sides | "auto" | "front" | "double" | optional | Render sides for the texture. Auto, front, or double. |
apply_texture
Apply Texture
Applies the given texture to the element with the specified ID.
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | ID or name of the element to apply the texture to. |
| texture | string | required | ID or name of the texture to apply. |
| applyTo | "all" | "blank" | "none" | optional | Faces that receive the texture: all (every face), blank (default; faces without a texture) or none (no face: the call only checks the element and texture and changes nothing). |
add_texture_group
Add Texture Group
Adds a reversible texture group. All texture references must exist. Material groups require one texture per channel, either normal or height, and a color map alongside a MER map; use is_material=false for ordinary grouping.
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | required | |
| textures | string[] | optional | Array of texture IDs or names to add to the group. |
| is_material | boolean | optional | Whether the texture group is a PBR material or not. |
list_textures
List Textures
Returns a list of all textures in the Blockbench editor.
No parameters
get_texture
Get Texture
Returns the image data of the given texture or default texture.
| Name | Type | Required | Description |
|---|---|---|---|
| texture | string | optional | Texture ID or name. If not provided, uses selected texture. |
create_pbr_material
Create PBR Material
Creates a new PBR material (texture group with is_material=true) and optionally assigns textures to PBR channels. Requires a PBR-capable format, distinct textures per channel, either normal or height, and a color texture alongside a MER texture. Uniform values require the corresponding map to be absent. Creation and texture moves are one undoable edit.
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | required | Name of the material. |
| color_texture | string | optional | Texture ID/name for the color (albedo) channel. |
| normal_texture | string | optional | Texture ID/name for the normal map channel. |
| height_texture | string | optional | Texture ID/name for the height/displacement map channel. |
| mer_texture | string | optional | Texture ID/name for the MER (Metalness/Emissive/Roughness) channel. |
| color_value | unknown[] | optional | Uniform RGBA color [R,G,B,A] when no color texture is provided. |
| mer_value | unknown[] | optional | Uniform MER values [Metalness, Emissive, Roughness] (0-255) when no MER texture is provided. |
| subsurface_value | number | optional | Subsurface scattering value (0-255) for Bedrock 1.21.30+ materials. |
configure_material
Configure Material
Configures a PBR material in one undoable edit. Replaced maps are detached without deleting their textures. Use 'none' to clear a channel before using uniform values or switching between normal and height; a MER map requires a color map.
| Name | Type | Required | Description |
|---|---|---|---|
| material | string | required | Material name or UUID to configure. |
| color_texture | string | optional | Texture ID/name for the color channel, or 'none' to use uniform color. |
| normal_texture | string | optional | Texture ID/name for the normal map, or 'none' to remove. |
| height_texture | string | optional | Texture ID/name for the height map, or 'none' to remove. |
| mer_texture | string | optional | Texture ID/name for MER channel, or 'none' to use uniform values. |
| color_value | unknown[] | optional | Uniform RGBA color [R,G,B,A] when no color texture. |
| mer_value | unknown[] | optional | Uniform MER values [Metalness, Emissive, Roughness] (0-255). |
| subsurface_value | number | optional | Subsurface scattering value (0-255). |
list_materials
List Materials
Lists all PBR materials (texture groups with is_material=true) and their assigned textures per channel.
No parameters
get_material_info
Get Material Info
Gets detailed information about a PBR material including the compiled texture_set.json preview for Bedrock export.
| Name | Type | Required | Description |
|---|---|---|---|
| material | string | required | Material name or UUID. |
import_texture_set
Import Texture Set
Imports a Minecraft Bedrock texture_set.json on desktop. Validates supported JSON and decodes referenced images before one undoable edit. Returns JSON with material name/UUID and path. Reuses already loaded image paths without deleting textures. Normal and height, or MER and MERS, cannot coexist; MER images require a color image.
| Name | Type | Required | Description |
|---|---|---|---|
| path | string | required | Path to the .texture_set.json file to import. |
assign_texture_channel
Assign Texture Channel
Assigns a texture to one PBR channel in a single undoable edit. Detaches the previous map without deleting it or changing its channel. Normal and height cannot coexist; a MER map requires a color map, including in the source material after moving textures.
| Name | Type | Required | Description |
|---|---|---|---|
| material | string | required | Material name or UUID. |
| texture | string | required | Texture name or UUID to assign. |
| channel | "color" | "normal" | "height" | "mer" | required | PBR channel to assign the texture to. |
save_material_config
Save Material Config
Saves the material's texture_set.json file to disk (Bedrock format). Requires the color texture to have a valid file path.
| Name | Type | Required | Description |
|---|---|---|---|
| material | string | required | Material name or UUID to save. |
activate_texture
Activate Texture
Activates the given texture in the Blockbench texture panel so that subsequent paint operations (draw_shape_tool, paint_with_brush, gradient_tool, etc.) target it. Most paint tools already call this internally when a texture_id is provided, but you can invoke it explicitly to pin the active texture across multiple calls.
| Name | Type | Required | Description |
|---|---|---|---|
| texture | string | required | Texture ID, UUID, or name to activate in the texture panel. |
delete_texture
Delete Texture
Removes a texture from the project in one undoable edit, like deleting it from the Textures panel. Faces keep their UV mapping but lose the texture assignment, and a PBR material loses that channel, until the edit is undone. Use list_textures to find IDs.
| Name | Type | Required | Description |
|---|---|---|---|
| texture | string | required | Texture ID, UUID, or name to remove. |
UI Interaction
trigger_action
Trigger Action
Triggers an available Blockbench Action and respects its condition. The native action owns Undo; only a newly opened dialog may be auto-confirmed.
| Name | Type | Required | Description |
|---|---|---|---|
| action | string | required | Action ID from Blockbench's BarItems registry. |
| confirmDialog | boolean | optional | Whether to confirm a newly opened dialog from this action. Existing unrelated dialogs are never confirmed. |
| confirmEvent | string | optional | JSON object of MouseEvent options, with optional event type (default click). |
risky_eval
Eval
Evaluates JavaScript and returns its JSON result. Does not create an Undo entry. Mutating code must manage its own correctly scoped Undo transaction; read-only evaluation leaves history unchanged.
| Name | Type | Required | Description |
|---|---|---|---|
| code | string | required | JavaScript code to evaluate. Do not pass `console` commands or comments. |
emulate_clicks
Emulate Clicks
Emulates clicks on the given interface elements.
| Name | Type | Required | Description |
|---|---|---|---|
| position | object | required | |
| drag | object | optional | Drag options. If set, will perform a drag from position to 'to'. |
fill_dialog
Fill Dialog
Fills the dialog with the given values.
| Name | Type | Required | Description |
|---|---|---|---|
| values | string | required | Stringified form of values to fill the dialog with. |
| confirm | boolean | optional | Whether to confirm or cancel the dialog after filling it. True to confirm, false to cancel. |
list_modes
List Modes
Lists Blockbench editor tabs/modes with IDs, names, native availability, and the current mode. Includes plugin-added modes. Use before set_mode to discover whether Edit, Paint, Animate, or Display is available for the current project. Camera angles are controlled separately by set_camera_angle.
No parameters
set_mode
Set Mode
Switches Blockbench's editor tab through its native mode trigger, respecting the mode's condition. Use mode_id='animate' to enter Animate before animation work, 'paint' before native painting tools, or 'edit' to return. Returns the resulting mode and available modes; refresh tools/list for changed tool availability. Selecting the current mode does nothing. Does not change the project's format. When the user enabled the AI Scratchpad setting, mode_id='ai_scratchpad' relaxes the format's cube size, rotation and integer-size guardrails until another mode is selected.
| Name | Type | Required | Description |
|---|---|---|---|
| mode_id | string | required | Mode ID returned by list_modes, such as 'edit', 'paint', 'animate', or 'display'. The Animate tab uses 'animate'. The current project must satisfy the mode's native condition. |
UV Mapping
set_mesh_uv
Set Mesh UV
Sets UV coordinates for mesh faces or vertices.
| Name | Type | Required | Description |
|---|---|---|---|
| mesh_id | string | required | ID or name of the mesh. |
| face_key | string | required | Face key to set UV for. |
| uv_mapping | Record<string, number[]> | required | UV coordinates for each vertex of the face, in logical UV units (not necessarily bitmap pixels). |
auto_uv_mesh
Auto UV Mesh
Maps only the specified/selected faces of the target mesh. project uses the active camera, unwrap projects each face to its own plane, and cylinder/sphere map around the local origin using each face's logical texture UV size (project UV size for untextured faces). Coordinates are logical UV units, not necessarily bitmap pixels. This does not pack UV islands.
| Name | Type | Required | Description |
|---|---|---|---|
| mesh_id | string | optional | ID or name of the mesh. If not provided, uses selected mesh. |
| mode | "project" | "unwrap" | "cylinder" | "sphere" | optional | project uses the active preview; unwrap is per-face planar projection; cylinder and sphere use the local origin and each face's logical texture UV dimensions. |
| faces | string[] | optional | Specific face keys to UV map. If not provided, maps all selected faces. |
rotate_mesh_uv
Rotate Mesh UV
Rotates only the target mesh's specified/selected faces around their combined UV bounding-box center, without clamping or changing selection.
| Name | Type | Required | Description |
|---|---|---|---|
| mesh_id | string | optional | ID or name of the mesh. If not provided, uses selected mesh. |
| angle | "-90" | "90" | "180" | optional | Rotation angle in degrees. |
| faces | string[] | optional | Specific face keys to rotate UV for. If not provided, rotates all selected faces. |
get_cube_uv
Get Cube UV
Inspect a cube's UV mode, offset, mirroring, six face rectangles/rotations, stored and effective texture references, logical UV sizes and bitmap sizes. Read-only; no selection or preview changes.
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | Cube UUID or unique name. UUID takes precedence over names. |
set_cube_uv
Set Cube UV
Edit box UV offsets/mirroring or per-face rectangles, rotation and texture references in one reversible edit. Preserves untargeted faces and selection. Validates UV mode, texture references and rotation support. Hytale rectangles must retain geometry-linked extents and Auto UV; texture assignments use the project/attachment collection, and quads cannot use box UV. Does not pack islands or repaint textures.
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | Cube UUID or unique name. Does not use or change selection. |
| box_uv | boolean | optional | Explicitly convert UV mode using the native cube operation. Requires optional_box_uv to change mode. Conversion can reset rotations and enable disabled faces. |
| uv_offset | number[] | optional | Box UV net offset [u, v]; requires box UV mode. |
| mirror_uv | boolean | optional | Mirror the box UV net; requires box UV mode. For per-face mirroring, reverse rectangle endpoints. |
| faces | object | optional | Patch only these faces in per-face UV mode. Other faces are preserved. Explicit rectangles disable automatic UV remapping except in Hytale, where dimension-linked UVs retain native Auto UV. Hytale textures resolve through the project/attachment collection, so only null is accepted as an explicit face texture. |
GeckoLib Integration
geckolib_get_format_info
Get GeckoLib Format Info
Returns the active GeckoLib project's model type, mod ID, object ID, bone and animation counts, cached export paths, and the installed plugin version. Requires the GeckoLib plugin and a GeckoLib Animated Model project.
No parameters
geckolib_set_project_settings
Set GeckoLib Project Settings
Sets the GeckoLib mod ID, model type and object ID on the active project. Values are validated against the plugin's namespace rules before anything is written. Does not generate the armor template rig.
| Name | Type | Required | Description |
|---|---|---|---|
| modid | string | optional | Mod namespace exports are written for, e.g. my_mod. |
| model_type | "Entity" | "Block" | "Item" | "Armor" | "Object" | optional | GeckoLib model type. Armor only records the type; it does not generate the plugin's armor template rig, which requires creating a new Armor project in Blockbench. |
| model_identifier | string | optional | Registered object ID the geometry exports as (geometry.<identifier>); may include a folder path. |
geckolib_list_easings
List GeckoLib Easings
Lists every easing name GeckoLib accepts on keyframes, which of them read easingArgs, and each argument's default and meaning. Needs no project, so it can be called while planning an animation.
No parameters
geckolib_get_keyframe_easing
Get GeckoLib Keyframe Easing
Reads the GeckoLib easing, easing arguments and interpolation of keyframes on one bone channel, or of the current timeline selection. An easing governs the segment arriving at its keyframe, so the first keyframe of a channel is reported as inert.
| Name | Type | Required | Description |
|---|---|---|---|
| animation_id | string | optional | Animation UUID or name. If not provided, uses current animation. |
| bone_name | string | optional | Bone whose keyframes to target. Omit to act on the current timeline keyframe selection. |
| channel | "rotation" | "position" | "scale" | optional | Transform channel to target. Required with bone_name, and meaningless without it. |
| times | number[] | optional | Keyframe times in seconds. Requires bone_name; omit to target every keyframe of that channel. |
geckolib_set_keyframe_easing
Set GeckoLib Keyframe Easing
Writes a GeckoLib easing (and its arguments) onto keyframes on one bone channel, or onto the current timeline selection, as one undoable edit. GeckoLib easings apply only to linear keyframes and shape the segment arriving at the keyframe they are set on, so the first keyframe of each channel is skipped and reported. Nothing in Blockbench's native keyframe API can author these.
| Name | Type | Required | Description |
|---|---|---|---|
| animation_id | string | optional | Animation UUID or name. If not provided, uses current animation. |
| bone_name | string | optional | Bone whose keyframes to target. Omit to act on the current timeline keyframe selection. |
| channel | "rotation" | "position" | "scale" | optional | Transform channel to target. Required with bone_name, and meaningless without it. |
| times | number[] | optional | Keyframe times in seconds. Requires bone_name; omit to target every keyframe of that channel. |
| easing | "linear" | "step" | "easeInQuad" | "easeOutQuad" | "easeInOutQuad" | "easeInCubic" | "easeOutCubic" | "easeInOutCubic" | "easeInQuart" | "easeOutQuart" | "easeInOutQuart" | "easeInQuint" | "easeOutQuint" | "easeInOutQuint" | "easeInSine" | "easeOutSine" | "easeInOutSine" | "easeInExpo" | "easeOutExpo" | "easeInOutExpo" | "easeInCirc" | "easeOutCirc" | "easeInOutCirc" | "easeInBack" | "easeOutBack" | "easeInOutBack" | "easeInElastic" | "easeOutElastic" | "easeInOutElastic" | "easeInBounce" | "easeOutBounce" | "easeInOutBounce" | "none" | required | GeckoLib easing name, or "none" to remove the easing and fall back to linear. |
| easing_args | number[] | optional | Arguments for the Back, Elastic, Bounce and step easings. Omit to use GeckoLib's default (1 overshoot, 0.5 bounciness, 5 steps). Ignored by every other easing. |
| convert_interpolation | boolean | optional | Set targeted keyframes to linear interpolation as part of the same edit. GeckoLib wipes easings from catmullrom, step and bezier keyframes on the next render frame, so without this the call is rejected instead of writing an easing that would not survive. |
geckolib_reverse_keyframe_easing
Reverse GeckoLib Keyframe Easing
Reverses and shifts easings the way the GeckoLib plugin's handler for Blockbench's Reverse Keyframes action does: each easeIn becomes easeOut and back, every easing moves to the next later keyframe, and the first keyframe of each channel loses its easing. Use it only after keyframe times were reversed by something that left the easings in place, such as times rewritten with manage_keyframes. Do not use it after the native Reverse Keyframes action or batch_keyframe_operations reverse: with the GeckoLib plugin loaded, both already adjust the easings, so this tool would shift them a second time. It is not its own inverse; use undo to revert it.
| Name | Type | Required | Description |
|---|---|---|---|
| animation_id | string | optional | Animation UUID or name. If not provided, uses current animation. |
| bone_name | string | optional | Bone whose keyframes to target. Omit to act on the current timeline keyframe selection. |
| channel | "rotation" | "position" | "scale" | optional | Transform channel to target. Required with bone_name, and meaningless without it. |
| times | number[] | optional | Keyframe times in seconds. Requires bone_name; omit to target every keyframe of that channel. |
geckolib_validate_model
Validate GeckoLib Model
Checks the GeckoLib project against rules derived from the plugin and the GeckoLib runtime: bone-name charset and duplicates, mod ID and object ID validity, armor template bones, texture size against the UV base, and (optionally) compiled animation loop values, easing names, easing arguments and lengths. Each finding carries a stable check ID. Passing does not prove in-game correctness.
| Name | Type | Required | Description |
|---|---|---|---|
| include_animations | boolean | optional | Also compile the project's animations and validate their loop values, easings and lengths. |
geckolib_export_model
Export GeckoLib Model
Compiles the GeckoLib geometry the plugin's model export produces, returning it as JSON and optionally writing it to a path. The text is formatted like Blockbench's own export (its JSON indentation, minify and final-newline settings). Set mode='dialog' to trigger the plugin's own export action and its save dialog instead.
| Name | Type | Required | Description |
|---|---|---|---|
| mode | "compile" | "dialog" | optional | compile returns the file content without touching the UI. dialog triggers the GeckoLib plugin's own export action, which opens a native save dialog for the user to complete and updates the project's cached export path. |
| path | string | optional | Absolute filesystem path to write the compiled content to. Requires Blockbench filesystem permission. Only used in compile mode. Fails if the file exists unless overwrite is true. |
| overwrite | boolean | optional | Replace an existing file at path. Defaults to false so a re-export never silently replaces a reference file. |
| max_content_length | integer | optional | Maximum characters of content to return. Use 0 to omit the content and only report its size. |
geckolib_export_animations
Export GeckoLib Animations
Compiles the project's animations into GeckoLib animation-file JSON, including the easing and easingArgs the plugin writes, and optionally writes it to a path. The text is formatted like Blockbench's own export (its JSON indentation, minify and final-newline settings). Reports which host API compiled it, since only the plugin-patched route stamps geckolib_format_version. Set mode='dialog' to trigger the plugin's own animation export action instead.
| Name | Type | Required | Description |
|---|---|---|---|
| mode | "compile" | "dialog" | optional | compile returns the file content without touching the UI. dialog triggers the GeckoLib plugin's own export action, which opens a native save dialog for the user to complete and updates the project's cached export path. |
| path | string | optional | Absolute filesystem path to write the compiled content to. Requires Blockbench filesystem permission. Only used in compile mode. Fails if the file exists unless overwrite is true. |
| overwrite | boolean | optional | Replace an existing file at path. Defaults to false so a re-export never silently replaces a reference file. |
| max_content_length | integer | optional | Maximum characters of content to return. Use 0 to omit the content and only report its size. |
| animation_ids | string[] | optional | Animation UUIDs or names to include. Omit to export every animation in the project. |
geckolib_export_display
Export GeckoLib Display Settings
Builds the Java item/block display-settings JSON for GeckoLib Item and Block models: parent model, texture size, GUI light, per-perspective display transforms and the namespaced particle texture. The text is two-space JSON, as the plugin's own display export writes it. The parent defaults to the plugin's builtin/entity, which Minecraft Java 1.21.4 and later no longer have; the result then warns, and parent picks another. Reports when the active model type would not normally ship one. Set mode='dialog' to trigger the plugin's own display export action instead.
| Name | Type | Required | Description |
|---|---|---|---|
| mode | "compile" | "dialog" | optional | compile returns the file content without touching the UI. dialog triggers the GeckoLib plugin's own export action, which opens a native save dialog for the user to complete and updates the project's cached export path. |
| path | string | optional | Absolute filesystem path to write the compiled content to. Requires Blockbench filesystem permission. Only used in compile mode. Fails if the file exists unless overwrite is true. |
| overwrite | boolean | optional | Replace an existing file at path. Defaults to false so a re-export never silently replaces a reference file. |
| max_content_length | integer | optional | Maximum characters of content to return. Use 0 to omit the content and only report its size. |
| parent | string | optional | Parent model to write, compile mode only. Omit to keep the project's parent, which the GeckoLib plugin sets to builtin/entity for Item models and uses as its default, so files match the plugin's own export. Minecraft Java 1.21.4 and later have no builtin/entity model (the result then carries a warning): when targeting them, pass another parent such as minecraft:item/handheld, or an empty string to write none. |
Hytale Integration
hytale_get_format_info
Get Hytale Format Info
Returns information about the current Hytale format. Requires the Hytale plugin and a Hytale format project to be active.
No parameters
hytale_validate_model
Validate Hytale Model
Checks exported main-model node count using the installed Hytale codec and verifies bitmap dimensions are multiples of 32. Does not validate attachment exports, shading, all UVs, animation integration or target-engine rendering.
No parameters
hytale_set_cube_properties
Set Hytale Cube Properties
Sets Hytale-specific properties on a cube: shading_mode (flat, standard, fullbright, reflective) and double_sided.
| Name | Type | Required | Description |
|---|---|---|---|
| cube_id | string | optional | ID or name of the cube. If not provided, uses selected cube. |
| shading_mode | "flat" | "standard" | "fullbright" | "reflective" | optional | Shading mode: flat (no lighting), standard (normal), fullbright (emissive), reflective |
| double_sided | boolean | optional | Whether to render both sides of faces |
hytale_get_cube_properties
Get Hytale Cube Properties
Gets Hytale-specific properties from a cube (shading_mode, double_sided).
| Name | Type | Required | Description |
|---|---|---|---|
| cube_id | string | optional | ID or name of the cube. If not provided, uses selected cube. |
hytale_create_quad
Create Hytale Quad
Creates a Hytale quad with exactly one enabled face matching the signed normal direction, per-face UV and Auto UV 1. Positive width/height and parent references are validated before one reversible edit.
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | required | Name for the quad |
| position | number[] | optional | Finite position [x, y, z] of the quad's starting corner. |
| normal | "+X" | "-X" | "+Y" | "-Y" | "+Z" | "-Z" | optional | Normal direction: +X, -X, +Y, -Y, +Z, -Z |
| size | number[] | optional | Positive finite [width, height]. Width/height axes are Z/Y for X normals, X/Z for Y normals, and X/Y for Z normals. |
| group | string | optional | Parent group UUID or unique name, or root (default). Missing or ambiguous names are rejected. |
| double_sided | boolean | optional | Whether to render both sides |
hytale_list_attachments
List Hytale Attachments
Lists all attachment collections in the current Hytale project.
No parameters
hytale_set_attachment_piece
Set Attachment Piece
Marks or unmarks a group as an attachment piece. Attachment pieces attach to like-named bones in the main model.
| Name | Type | Required | Description |
|---|---|---|---|
| group_name | string | required | Name of the group to mark as attachment piece |
| is_piece | boolean | required | Whether the group is an attachment piece |
hytale_list_attachment_pieces
List Attachment Pieces
Lists all groups marked as attachment pieces.
No parameters
hytale_create_visibility_keyframe
Create Visibility Keyframe
Creates a visibility keyframe for a bone. Hytale supports toggling node visibility at keyframes.
| Name | Type | Required | Description |
|---|---|---|---|
| bone_name | string | required | Name of the bone/group. |
| time | number | required | Finite time in seconds between 0 and 10000 for the visibility keyframe. |
| visible | boolean | required | Whether the bone is visible at this keyframe |
| animation_id | string | optional | Animation UUID or name. If not provided, uses current animation. |
hytale_set_animation_loop
Set Animation Loop Mode
Sets the loop mode for a Hytale animation. Hytale supports "loop" (continuous) or "hold" (freeze on last frame).
| Name | Type | Required | Description |
|---|---|---|---|
| animation_id | string | optional | Animation UUID or name. If not provided, uses current animation. |
| loop_mode | "loop" | "hold" | "once" | required | Loop mode: loop (continuous), hold (freeze on last frame), once (play once) |
hytale_set_cube_stretch
Set Cube Stretch
Sets the stretch values for a cube. Hytale uses stretch instead of float sizes for better UV handling.
| Name | Type | Required | Description |
|---|---|---|---|
| cube_id | string | optional | ID or name of the cube. If not provided, uses selected cube. |
| stretch | number[] | required | Stretch values [x, y, z]. |
hytale_get_cube_stretch
Get Cube Stretch
Gets the stretch values for a cube.
| Name | Type | Required | Description |
|---|---|---|---|
| cube_id | string | optional | ID or name of the cube. If not provided, uses selected cube. |
Prompts
blockbench_native_apis
Essential information about Blockbench v5.0 native API security model and requireNativeModule() usage. Use this when working with Node.js modules, file system access, or native APIs in Blockbench plugins.
No arguments
blockbench_code_eval_safety
Critical safety guide for agents using code evaluation/execution tools with Blockbench v5.0+. Contains breaking changes, quick reference, common mistakes, and safe code patterns for native module usage.
No arguments
model_creation_strategy
Model Creation Strategy
A strategy for creating a new 3D model in Blockbench.
| Name | Type | Required | Description |
|---|---|---|---|
| format | "java_block" | "bedrock" | optional | Target model format. |
| approach | "ui" | "programmatic" | "import" | optional | Creation approach to use. |
hytale_model_creation
Hytale Model Creation Guide
Comprehensive guide for creating Hytale character and prop models. Covers format selection, node limits, shading modes, stretch, quads, and best practices.
| Name | Type | Required | Description |
|---|---|---|---|
| format_type | "character" | "prop" | "both" | optional | Which format type to focus on. |
hytale_animation_workflow
Hytale Animation Workflow
Guide for creating animations for Hytale models. Covers 60 FPS timing, quaternion rotations, visibility keyframes, loop modes, and common animation patterns.
| Name | Type | Required | Description |
|---|---|---|---|
| animation_type | "walk" | "idle" | "attack" | "general" | optional | Type of animation to focus on. |
hytale_attachments
Hytale Attachments System
Guide for creating and managing attachments in Hytale models. Covers attachment collections, piece bones, modular equipment, and best practices.
No arguments
Resources
project-files
Blockbench Project Files
blockbench://project/{id}.bbmodel
Returns the active project's live .bbmodel file with unsaved edits and embedded textures. UUID-based URIs remain stable across renames. Select a project before reading its file; reading never switches tabs or saves to disk.
projects
Blockbench Projects
projects://{id}
Returns information about available projects. List URIs use the slugified project name (e.g. `projects://my-character`) when unique, or `projects://<slug>~<uuid-prefix>` on collision. Reads accept UUID, exact name, or slug.
nodes
Blockbench Nodes
nodes://{id}
Returns the current 3D nodes in the editor. List URIs use slugified names (e.g. `nodes://head`) when unique, with `~<uuid-prefix>` on collision. Reads accept UUID, exact name, or slug, and return the node as Blockbench saves it in a .bbmodel (its `getSaveCopy()`), plus uuid, name, type, parent (`root` or a UUID) and child UUIDs: a cube's `from`, `to` and `origin` in Blockbench units, `rotation` in degrees, faces and UVs; a mesh's vertices and faces; a group's origin and rotation. Fields Blockbench leaves out at their default are missing, such as a cube's zero rotation.
textures
Blockbench Textures
textures://{id}
Returns information about textures. List URIs use slugified names (e.g. `textures://skin`) when unique, with `~<uuid-prefix>` on collision. Reads accept UUID, exact name, slug, or short numeric texture id.
reference_models
Reference Models
reference-models://{id}
Returns reference models in the current project. Requires the Reference Models plugin. List URIs use slugified names (e.g. `reference-models://turntable`) with `~<uuid-prefix>` on collision. Reads accept UUID, exact name, or slug.
validator-status
Validator Status
validator://status
Returns the current validation status including error/warning counts and a summary of all problems.
validator-checks
Validator Checks
validator://checks/{id}
Returns information about registered validator checks. Use without an ID to list all checks, or provide a check ID to get details about a specific check.
validator-warnings
Validator Warnings
validator://warnings
Returns all current validation warnings with element references where available.
validator-errors
Validator Errors
validator://errors
Returns all current validation errors with element references where available.
hytale-format
Hytale Format Information
hytale://format
Returns comprehensive information about the current Hytale format, including format type, block size, node limits, and feature support.
hytale-attachments
Hytale Attachments
hytale://attachments/{id}
Returns information about attachment collections. List URIs use slugified collection names (e.g. `hytale://attachments/helmet`) with `~<uuid-prefix>` on collision. Reads accept UUID, exact name, or slug.
hytale-pieces
Hytale Attachment Pieces
hytale://pieces/{id}
Returns groups marked as attachment pieces — they connect to like-named bones in the main model. List URIs use slugified bone names (e.g. `hytale://pieces/hand-right`) with `~<uuid-prefix>` on collision.
hytale-cubes
Hytale Cubes
hytale://cubes/{id}
Returns cubes with Hytale-specific properties (shading_mode, double_sided, stretch). List URIs use slugified cube names (e.g. `hytale://cubes/torso`) with `~<uuid-prefix>` on collision.