blockbench-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| resources | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| bb_bridge_statusA | Check whether this server is talking to Blockbench, the port it listens on, the connection file path and where the tool schemas came from. Call this first when any bb_* tool reports "not connected". |
| bb_setupA | Install or refresh the Blockbench plugin file and print the MCP client configuration for opencode, Claude, Cursor, Windsurf, VS Code, Gemini and Cline. Pass clients:["write"] to actually write the config files. |
| bb_reconnectA | Drop the current Blockbench connection so the plugin dials back in. Use after reloading the plugin in Blockbench. |
| bb_statusA | Report the connection to the MCP server, the Blockbench version, the open project summary and whether file-system permission has been granted. Call this first in a session. |
| bb_execute_jsA | Run arbitrary async JavaScript inside Blockbench with full access to every global (Project, Cube, Group, Mesh, Texture, Canvas, Codecs, Formats, Modes, Undo, Outliner, Preview, Menu, Action, BarItems, Plugins, StateMemory, ...) and the Node modules a plugin may use. Use this for anything the structured tools do not cover. The code may use await and must return a value; console output is captured and returned. An |
| bb_stepA | Execute a list of tool calls in order inside a single round trip. Each step is {tool, arguments}. Later steps may reference earlier results with "$N.path" (N = step index, or -1/"last" for the previous step), e.g. "$0.element.uuid". Failures are reported per step and do not stop the batch unless stop_on_error is true. |
| bb_project_infoA | Dump the current project: format, mode, sizes, and optionally the element tree, textures and animations. Call this to re-orient after a large edit. |
| bb_set_projectC | Change the open project: name, texture resolution, the box_uv default and the view mode. Use it to rename a project or change the texture canvas the model is authored against. |
| bb_new_projectA | Create a new empty Blockbench project. format is a Blockbench format id (free, java_block, bedrock, bedrock_block, modded_entity, skin, image, ...). Always call this (or bb_open_model) before building, unless a project is already open. |
| bb_open_modelA | Load a model from disk, replacing the current project (or importing into it). Codec inferred from the extension (.bbmodel, .json, .obj, .gltf, .fbx, .stl, .dae, .jem, .jpm), or set with format (ids from bb_status). |
| bb_save_projectB | Compile the project to .bbmodel and write it to disk. Without a path, the current project path is reused; pass one to save a copy. |
| bb_export_modelB | Compile the project into another format and write it to disk. Formats: bbmodel/project, java_block, bedrock, bedrock_old, modded_entity, optifine_entity (jem), optifine_part (jpm), collada (dae), fbx, gltf/glb, obj, stl, skin_model. |
| bb_undoC | Undo the last edit (one or more steps). |
| bb_redoC | Redo the last undone edit. |
| bb_set_modeA | Switch Blockbench mode: edit, paint, animate, display or pose. Paint/animate are needed for texture and animation tools on some formats. |
| bb_set_viewB | Change the viewport view mode (textured, solid, wireframe, normal, uv) and/or move the camera to a preset angle (front, back, left, right, top, bottom, isometric_right, isometric_left, true_isometric_right, true_isometric_left, north, east, south, west, up, down). Useful before bb_screenshot. |
| bb_list_actionsC | List runnable Blockbench actions (BarItems) by id and name, optionally filtered. |
| bb_run_actionB | Trigger any Blockbench action by its BarItems id (see bb_list_actions). This reaches every built-in command the UI exposes. |
| bb_notifyB | Show a toast / quick message inside Blockbench. Use it to tell the human what the agent is doing or to ask them to look at the screen. |
| bb_screenshotA | Render the current preview to a PNG on disk and return the path. This is how an agent looks at its own work. Set crop=true (default) to auto-crop to the model, or crop=false for the full viewport. The transparent viewport is composited over a solid background (override with "background", or disable with background:false). Returns a data URL too when include_data_url is true. |
| bb_reviewA | Render the model from several camera angles into one contact-sheet PNG and return its path. Use this to LOOK at your own work and catch proportion and texture problems before declaring a model finished. The agent can then read the image file. |
| bb_read_fileA | Read a file from disk. encoding "auto" (default) returns text for text files and base64 for binary; force it with "text" or "base64". Reading uses Blockbench's own file layer and needs no plugin permission. |
| bb_write_fileA | Write text or base64-decoded bytes to a file, creating parent directories is the caller's job. Uses Blockbench's file layer (no permission prompt). |
| bb_list_dirA | List the entries of a directory. Needs the plugin file-system permission (the user is asked once; bb_request_fs can trigger the prompt explicitly). Supports recursion and a glob filter. |
| bb_globA | Recursively find files under a directory matching a glob such as "**/.json" or ".png". Needs file-system permission. |
| bb_file_infoB | Stat a path: exists, type, size, modified time. Needs file-system permission. |
| bb_mkdirB | Create a directory (recursively by default). Needs file-system permission. |
| bb_delete_pathA | Delete a file, or a directory when recursive is true. Needs file-system permission. |
| bb_request_fsA | Ask the user for the plugin file-system permission (needed only by bb_list_dir, bb_glob, bb_file_info, bb_mkdir, bb_delete_path; reads and writes work without it). An optional scope limits the permission to one directory. |
| bb_list_elementsA | List outliner elements with their ids, transforms and (optionally) geometry. Filter by type or parent. |
| bb_add_cubeB | Create a cube element. Provide from+to, or from+size (Blockbench cubes use from/to where to is the exclusive upper bound). origin defaults to from. Optionally assign a texture to all faces, set per-face uv, and enable auto UV. |
| bb_add_groupB | Create an empty group (bone) to hold elements or drive animation. Position it with origin. |
| bb_add_meshB | Create a free-form mesh. vertices is a list of [x,y,z] (or a {key:[x,y,z]} map). faces is a list where each face is either [i0,i1,i2] indices into vertices, or {vertices:[i..], uv:[[u,v]..], texture}. UVs are stored per vertex. |
| bb_edit_meshA | Modify an existing mesh in place. With vertices+faces it redefines the geometry; with merge:true the new vertices/faces are appended. delete_faces / delete_vertices remove by key. Keys are shown by bb_list_elements {include_geometry:true}. |
| bb_add_elementC | Create a locator, null_object, bounding_box, texture_mesh, armature or armature_bone. Pass its properties directly. |
| bb_set_elementB | Change properties of one or more elements: name, origin, rotation, from/to/size (cubes), position (locators), inflate, visibility, export, locked, box_uv, autouv, shade, mirror_uv, uv_offset, color, and per-face overrides via faces:{north:{uv,texture,enabled,tint,rotation}}. Renaming more than one element at once is refused. |
| bb_transform_elementsA | Move, rotate or scale elements. Use vector [x,y,z], or axis+amount. Move translates from/to/origin (cubes) or origin/position (others). Rotate adds degrees around the element origin. Scale multiplies size about the element origin (cubes, meshes, texture_mesh). |
| bb_duplicate_elementsC | Copy elements (groups copy their children too). Optionally repeat and offset each copy. |
| bb_array_elementsB | Create repeated copies of elements along a grid — the correct way to build rows of windows, treads, spokes and so on instead of placing copies by hand. names may contain {i} and starts at 1. |
| bb_mirror_elementsA | Reflect elements across an axis-aligned plane (default x=0). copy=true duplicates first, which is the usual way to build a symmetrical half. Meshes keep correct winding. |
| bb_reparent_elementsC | Move elements under a new parent group (or "root"). |
| bb_delete_elementsC | Delete elements (groups delete their children). |
| bb_select_elementsC | Change the outliner selection. mode: replace (default), add, remove, toggle, none. |
| bb_group_elementsB | Create a new group around the given elements, positioned at their centre, and move the elements into it. |
| bb_set_face_textureA | Assign a texture (by name/uuid) to cube or mesh faces, or clear it with null. For cubes, pass faces to limit which sides are changed. |
| bb_set_face_uvB | Set UVs on one face. For cubes give uv=[x1,y1,x2,y2] in texture pixels. For meshes give uvs aligned to the face vertices, or a {vertex_key:[u,v]} map. |
| bb_auto_uvC | Set automatic UV mode on cubes: mode "faces" (autouv 1, per-face), "relative" (autouv 2), "box" (box_uv), or "off". |
| bb_validateA | Run a static audit of the project and return a score plus findings: empty project, zero-size or degenerate cubes, meshes with too few vertices, untextured faces, UVs outside the texture, duplicate cubes, and out-of-bounds UVs. Fix and re-run before declaring a model finished. |
| bb_list_texturesB | List the project textures with size, UV resolution, layers and saved state. |
| bb_create_textureC | Create a blank texture, optionally filled with a colour. Size defaults to the project texture resolution. |
| bb_generate_textureB | Paint a new texture from a preset and/or an ordered list of ops. Deterministic for a given seed. Presets: wood, planks, stone, cobble, metal, dirt, grass, leaves, bricks, fabric, skin, gem, noise, gradient. Ops: fill, noise, cells, gradient, radial, rect, circle, ellipse, line, checker, stripes, border, vignette, scatter, pixel, pixels, text, adjust, replace, blend. Example: {preset:"wood"} or {ops:[{op:"fill",color:"#2b3a55"},{op:"noise",color:"#101820",color2:"#8fb8de",scale:2,octaves:4},{op:"vignette",strength:0.5}]}. |
| bb_draw_textureB | Apply a list of ops onto an existing texture (adds to what is already there). Same ops as bb_generate_texture. |
| bb_paint_pixelsB | Set individual pixels on a texture — the precise way to hand-draw pixel art. pixels is a list of [x, y, color] with color "#rrggbb" or [r,g,b] or [r,g,b,a]. |
| bb_get_texture_pixelB | Read a rectangle of pixels from a texture. Use this to verify what was drawn: it returns rows of [r,g,b,a]. |
| bb_import_textureC | Load an image from disk or a data URL as a project texture. |
| bb_export_textureB | Write texture PNGs to disk. Give a single target + path, or several targets + a directory. |
| bb_set_texture_propertiesC | Change texture metadata: name, folder, render_mode, pbr_channel, particle, fps, layers_enabled, saved. |
| bb_resize_textureB | Resize the texture image (nearest neighbour). uv_width/uv_height follow the new size unless keep_uv is true. |
| bb_delete_textureC | Remove textures from the project. |
| bb_list_animationsA | List the project animations with loop mode, length and per-bone keyframe counts. |
| bb_create_animationC | Create a new animation. loop is "once", "loop" or "hold"; length is in seconds. |
| bb_set_animationC | Change name, loop mode or length of an animation. |
| bb_delete_animationC | Remove an animation from the project. |
| bb_add_keyframeB | Add a keyframe for a bone on rotation/position/scale. x/y/z are Molang expressions (default "0"), or plain numbers. The bone is referenced by group name or uuid. |
| bb_delete_keyframeB | Delete a keyframe by uuid, or the one nearest to a given time on a bone/channel. |
| bb_play_animationC | Control the animation timeline: set the time, play, pause or stop. |
| bb_list_pluginsA | List every Blockbench plugin that is present, with id, version, source, install state and whether it can be reloaded. |
| bb_install_pluginA | Install a Blockbench plugin from source code, a local file, or a URL. The code is written to the plugins folder, recorded so it loads on startup, and loaded immediately. Executes third-party code inside Blockbench. |
| bb_uninstall_pluginC | Uninstall a Blockbench plugin by id and optionally delete its file. |
| bb_reload_pluginA | Reload a dev/URL plugin without restarting Blockbench. Store plugins are not reloadable in place. |
| bb_list_settingsA | List user settings by id with their current values. Handy before bb_set_setting. filter matches the id. |
| bb_set_settingC | Set a Blockbench user setting by id (e.g. viewport_zoom_speed, default_cube_size, shading). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| Bridge and Blockbench status | |
| Current project | |
| Current project (bbmodel) | |
| Tool catalog |
TDQS
Scored across 72 tools
Most tools have distinct resource+action targets, and the descriptions are detailed enough to guide selection. A few overlaps remain, notably bb_set_element vs bb_transform_elements for transforms, bb_set_face_uv/bb_auto_uv/bb_set_element for UVs, and bb_generate_texture/bb_draw_texture/bb_paint_pixels for texture editing, but they are not severe enough to make the set unusable.
All tools use the same bb_ prefix and snake_case convention, with predictable verb_noun patterns such as bb_list_elements, bb_add_cube, bb_delete_texture, and bb_set_setting. The few non-verb-noun names (bb_undo, bb_status, bb_validate) are still consistent in style and easily understood.
72 tools is an extreme over-provisioning for an MCP server, well beyond the 50+ threshold for severe mismatch. While Blockbench is a large domain, this many tools creates unnecessary cognitive load and makes discoverability poor for an agent.
The surface is very broad, covering project lifecycle, elements, meshes, UVs, textures, animations, plugins, settings, file-system operations, screenshots, validation, and arbitrary JS escape hatches. Minor gaps exist, such as updating or reading individual keyframes and texture layer management, but bb_execute_js can fill most of these.