Local MCP server bridging Claude, Cursor, VS Code, and other MCP clients to a running Blender + Bonsai (BlenderBIM) session.
Bonsai MCP demonstrates solid tool design with clear naming conventions (verb_noun pattern), comprehensive parameter schemas, and structured output. All 14 tools have descriptions and input schemas. However, several tools lack output schema documentation, parameter descriptions are sometimes generic, and error handling guidance is minimal. The server handles a complex domain (Blender/IFC) well but misses opportunities for LLM-optimized descriptions and recovery guidance.
Execute Python with full Blender access.
Execute IFC code without bpy access.
Return IFC schema, project name, counts of sites/buildings/storeys, counts of common IFC entities, and material and classification summaries. Returns a clear error if no IFC project is loaded.
Return IFC property sets (psets) and quantity sets (qtos) for one or more objects. Accepts any mix of `global_ids` and `names` lists (Blender object names). Large batches are paged (limit/offset, with targets_total/truncated/next_offset in the response). The response preserves input order in a `results` list.
Return a quantity takeoff aggregated by IFC class.
Return a summary of the current Blender scene (scene name, object count, selection, collections, IFC availability). When `query` is supplied, the response also includes an `objects` list filtered by the query, paged via limit/offset. Supported queries: 'all', 'selected', 'walls', 'doors', 'windows', 'spaces', 'slabs', 'columns', 'beams', 'roofs', 'stairs', 'by_class', 'by_name', 'by_global_id'. For structured element listings prefer the dedicated list_elements tool.
Output schemas not documented. Tools return structured data but LLMs cannot see field definitions, forcing them to infer response structure and risking misinterpretation of nested objects.
Code execution tools (execute_ifc_code, execute_blender_code) lack error recovery guidance. Descriptions do not explain what happens on syntax errors, runtime failures, or how to debug failed code.
Refresh/reload tools (refresh_view, refresh_geometry, reload_project) have minimal descriptions (under 50 chars). LLMs cannot determine when to call them vs alternatives or what side effects occur.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | <=2025-11-25 | v2 |
Return name, type, location, dimensions, and (if available) IFC class and GlobalId for each currently selected object. Results are capped by `limit` with total/truncated reported.
Return the project's spatial hierarchy as a tree: IfcProject -> IfcSite -> IfcBuilding -> IfcBuildingStorey -> IfcSpace, with names, GlobalIds, storey elevations, and (optionally) counts of contained elements by IFC class. Answers 'what is in this building, storey by storey' without any code execution.
Capture the Blender 3D viewport and return the image inline. Optionally aim the viewport first: `view` sets the direction (top/bottom/front/back/left/right = orthographic axis views, 'iso' = perspective isometric, 'camera' = scene camera), or use `azimuth`/`elevation` degrees for arbitrary directions. `fit` frames the content ('all' or 'selected') with direction-aware tightening. `storey` isolates one building storey for the shot (floor plans: storey + view='top' + fit='all'). `shading` overrides viewport shading; 'class_colors' colors objects by IFC class and returns a legend. Overlays are hidden by default. The render is downscaled so the longest edge fits `max_size` (default 800 px, also capped by the native viewport resolution) and encoded as JPEG by default; an oversized PNG request is automatically downgraded to JPEG rather than failing after the render. Scene render settings, shading, overlays, and visibility are restored afterwards; the viewport orientation persists.
List IFC-backed elements in the scene with structured filters: `ifc_class` (inheritance-aware, so 'IfcWall' matches IfcWallStandardCase), `name_contains`, `storey` (Name or GlobalId of an IfcBuildingStorey), and `selector` (an IfcOpenShell selector query, e.g. 'IfcWall, Pset_WallCommon.FireRating=F30', for property/material/attribute filters without code execution). Paged via limit/offset with total/truncated reported. Prefer this over get_scene_info queries for element listings.
Refresh the Blender geometry.
Refresh the Blender viewport.
Reload the IFC project.
Save the IFC project to a file.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) present. LLMs cannot distinguish safe read-only queries from destructive operations without explicit hints.
Parameter descriptions for code execution tools are trivial ('Python code to execute'). No guidance on available APIs, imports, or constraints.