{"id":96198,"date":"2026-03-30T15:13:34","date_gmt":"2026-03-30T13:13:34","guid":{"rendered":"https:\/\/www.blender.org\/?page_id=96198"},"modified":"2026-09-11T10:08:58","modified_gmt":"2026-09-11T08:08:58","slug":"mcp-server","status":"publish","type":"page","link":"https:\/\/www.blender.org\/lab\/mcp-server\/","title":{"rendered":"MCP Server"},"content":{"rendered":"\n<div class=\"wp-block-group is-style-box is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"wp-block-paragraph\">A lightweight MCP (Model Context Protocol) server for Blender. It offers a natural language interface with Blender&#8217;s Python API, improving access to documentation, and allowing users to explore and understand complex setups.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For technical details and documentation about the architecture check the <a href=\"https:\/\/projects.blender.org\/lab\/blender_mcp\">source code<\/a>.<\/p>\n\n\n\n<div class=\"wp-block-group alert alert-warning is-layout-constrained wp-block-group-is-layout-constrained\" style=\"margin-top:var(--wp--preset--spacing--30);margin-bottom:0;padding-top:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30)\">\n<p class=\"wp-block-paragraph\"><strong>Security Warning<\/strong><br>The MCP server will execute LLM generated code in Blender without any guards in place to protect your data from removal or being sent to a remote location. To keep your data safe it is recommended to use a virtual machine, or a system without access to sensitive information.<\/p>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group is-style-box is-layout-constrained wp-block-group-is-layout-constrained\" style=\"margin-top:var(--wp--preset--spacing--30)\">\n<h2 class=\"wp-block-heading\">Installation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Blender does not have any built-in functionality for connecting to LLMs.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In order for Blender to connect with LLMs, <strong>three external tools must be manually downloaded, installed, and run<\/strong>.<\/p>\n\n\n\n<div class=\"wp-block-group is-style-default is-layout-constrained wp-block-group-is-layout-constrained\" style=\"margin-top:var(--wp--preset--spacing--30)\">\n<p class=\"wp-block-paragraph\">Requirements:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.blender.org\/download\/\">Blender 5.1<\/a> or newer<\/li>\n\n\n\n<li><a href=\"#addon\" data-type=\"internal\" data-id=\"#addon\">Add-on<\/a><\/li>\n\n\n\n<li><a href=\"#llm-client\" data-type=\"internal\" data-id=\"#llm_client\">LLM Client<\/a><\/li>\n\n\n\n<li><a href=\"#mcp-server\" data-type=\"internal\" data-id=\"#mcp-server\">MCP Server<\/a><\/li>\n<\/ol>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" style=\"margin-top:var(--wp--preset--spacing--30);margin-bottom:var(--wp--preset--spacing--30)\"\/>\n\n\n\n<h3 id=\"addon\" class=\"wp-block-heading\">Add-on<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In order to interact with your Blender session you need to install a specific add-on for the MCP Server integration.<\/p>\n\n\n\n<style>\n.btn.btn-install-drag {\n  transform: initial;\n  outline: .2rem dashed currentColor;\n  outline-offset: -.2rem;\n}\n<\/style>\n<a href=\"https:\/\/projects.blender.org\/lab\/blender_mcp\/releases\/download\/v1.0.3\/mcp-1.0.3.zip?repository=https%3A%2F%2Flab.blender.org%2F&amp;blender_version_min=5.1.0\" class=\"btn btn-flex btn-primary btn-install-drag cursor-move mb-2 px-4\" draggable=\"true\">\n  <i class=\"i-move\"><\/i>\n  <span>Drag and Drop into Blender<\/span>\n<\/a>\n\n\n\n<p class=\"wp-block-paragraph\">\u2026or <a href=\"https:\/\/projects.blender.org\/lab\/blender_mcp\/releases\/download\/v1.0.3\/mcp-1.0.3.zip?repository=https%3A%2F%2Flab.blender.org%2F&amp;blender_version_min=5.1.0\" data-type=\"link\" data-id=\"https:\/\/projects.blender.org\/lab\/blender_mcp\/releases\/download\/v0.1.0\/mcp-0.1.0.zip?repository=https%3A%2F%2Flab.blender.org%2F&amp;blender_version_min=5.1.0\">download<\/a> and <a href=\"https:\/\/docs.blender.org\/manual\/en\/latest\/editors\/preferences\/extensions.html#install\" data-type=\"link\" data-id=\"https:\/\/docs.blender.org\/manual\/en\/dev\/editors\/preferences\/extensions.html#install\">Install from Disk<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you drag &amp; drop into Blender <strong>you will need to do it twice<\/strong>. First to add the Blender Lab repository, secondly to install the add-on itself. This method allows you to receive update notifications whenever a new version of this add-on is available.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" style=\"margin-top:var(--wp--preset--spacing--30);margin-bottom:var(--wp--preset--spacing--30)\"\/>\n\n\n\n<h3 id=\"llm-client\" class=\"wp-block-heading\">LLM Client<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">MCP Servers follow a well defined standard and are compatible with a myriad of clients. Please follow the&nbsp;<a href=\"https:\/\/projects.blender.org\/lab\/blender_mcp\/wiki\/Llama.cpp\" target=\"_blank\" rel=\"noreferrer noopener\">LLama.cpp<\/a>&nbsp;documentation, or install a LLM client of your preference.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" style=\"margin-top:var(--wp--preset--spacing--30);margin-bottom:var(--wp--preset--spacing--30)\"\/>\n\n\n\n<h3 id=\"mcp-server\" class=\"wp-block-heading\">MCP Server<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">There are different ways to install the MCP Server depending on your LLM client capabilities.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>MCP Bundle<\/strong>: For newer clients that support <code>.mcpb<\/code> files, download the <a href=\"https:\/\/projects.blender.org\/lab\/blender_mcp\/releases\" target=\"_blank\" rel=\"noreferrer noopener\">latest package<\/a> from the release page. <em>Llama.cpp doesn&#8217;t support this yet.<\/em><\/li>\n\n\n\n<li><strong>MCP Server<\/strong>: To install from the source code check the <a href=\"https:\/\/projects.blender.org\/lab\/blender_mcp\/wiki\/Llama.cpp#mcp-server-installation\">Llama.cpp documentation<\/a> or the <a href=\"https:\/\/projects.blender.org\/lab\/blender_mcp\/wiki\/Setup\" data-type=\"link\" data-id=\"https:\/\/projects.blender.org\/lab\/blender_mcp\/wiki\/Setup\" target=\"_blank\" rel=\"noreferrer noopener\">setup instructions<\/a>.<\/li>\n<\/ul>\n<\/div>\n\n\n\n<div class=\"wp-block-group is-style-box is-layout-constrained wp-block-group-is-layout-constrained\" style=\"margin-top:var(--wp--preset--spacing--30)\">\n<h2 id=\"user-content-running\" class=\"wp-block-heading\">Running<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Once if you have your MCP Server setup within your LLM Client, you can start to explore your Blender scenes.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6ae1979d6c712&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6ae1979d6c712\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1280\" height=\"514\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.blender.org\/wp-content\/uploads\/2026\/03\/llama_cpp-1280x514.webp\" alt=\"\" class=\"wp-image-96237\" srcset=\"https:\/\/www.blender.org\/wp-content\/uploads\/2026\/03\/llama_cpp-1280x514.webp 1280w, https:\/\/www.blender.org\/wp-content\/uploads\/2026\/03\/llama_cpp-512x206.webp 512w, https:\/\/www.blender.org\/wp-content\/uploads\/2026\/03\/llama_cpp-768x308.webp 768w, https:\/\/www.blender.org\/wp-content\/uploads\/2026\/03\/llama_cpp-1536x617.webp 1536w, https:\/\/www.blender.org\/wp-content\/uploads\/2026\/03\/llama_cpp-2048x822.webp 2048w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">llama.cpp web interface running the blender-mcp server.<\/figcaption><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" style=\"margin-top:var(--wp--preset--spacing--30);margin-bottom:var(--wp--preset--spacing--30)\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Example 1: Scene Analysis<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">MCP can be used to programatically analyze the scene for performance bottomnecks. Take for instance the <a href=\"https:\/\/download.blender.org\/demo\/test\/classroom.zip\">Classroom demo file<\/a>:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6ae1979d6ce07&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6ae1979d6ce07\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1280\" height=\"575\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.blender.org\/wp-content\/uploads\/2026\/03\/classroom-1280x575.webp\" alt=\"\" class=\"wp-image-96243\" srcset=\"https:\/\/www.blender.org\/wp-content\/uploads\/2026\/03\/classroom-1280x575.webp 1280w, https:\/\/www.blender.org\/wp-content\/uploads\/2026\/03\/classroom-512x230.webp 512w, https:\/\/www.blender.org\/wp-content\/uploads\/2026\/03\/classroom-768x345.webp 768w, https:\/\/www.blender.org\/wp-content\/uploads\/2026\/03\/classroom-1536x690.webp 1536w, https:\/\/www.blender.org\/wp-content\/uploads\/2026\/03\/classroom-2048x920.webp 2048w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Classroom demo file.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">This scene is one of the <a href=\"https:\/\/opendata.blender.org\/\">Blender benchmark<\/a> files. The reason those files are in the benchmark is because they are a good representation of real production files created by artists. And it is no surprise that it can contain objects prone to be optimized.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">While checking for polygon count is often enough, even more interesting is to plot the number of polygons based on how big they show on the final render. This can be obtained with the following prompt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Analyze the scene and list the outliers: objects with highest polygon count but smaller size from the camera point of view.<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The plotted resulting data shows clearly two objects which stand out from the rest: <code>alphabet<\/code> and <code>coat 1<\/code>:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6ae1979d6d4e7&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6ae1979d6d4e7\" class=\"wp-block-image size-full is-resized has-custom-border is-style-default wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1194\" height=\"736\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.blender.org\/wp-content\/uploads\/2026\/03\/outlier.webp\" alt=\"Graph analysis of the polycount per screen area\" class=\"wp-image-96242\" style=\"border-top-left-radius:5px;border-top-right-radius:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;aspect-ratio:1.622317049869435;width:713px;height:auto\" srcset=\"https:\/\/www.blender.org\/wp-content\/uploads\/2026\/03\/outlier.webp 1194w, https:\/\/www.blender.org\/wp-content\/uploads\/2026\/03\/outlier-512x316.webp 512w, https:\/\/www.blender.org\/wp-content\/uploads\/2026\/03\/outlier-768x473.webp 768w\" sizes=\"auto, (max-width: 1194px) 100vw, 1194px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Graph analysis of the polycount per screen area for the classroom demo scene.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>alphabet<\/code> object has 20k polygons. Because of its flat disposition it could be replaced by a texture with little downside to the final result. The <code>coat 1<\/code> object has 37k polygons due to its Subsurf modifier. Lowering the subdivision level could alleviate the scene, if memory was the bottleneck in your system. <\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6ae1979d6db71&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6ae1979d6db71\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1280\" height=\"575\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.blender.org\/wp-content\/uploads\/2026\/03\/outlier-1-1280x575.webp\" alt=\"\" class=\"wp-image-96244\" srcset=\"https:\/\/www.blender.org\/wp-content\/uploads\/2026\/03\/outlier-1-1280x575.webp 1280w, https:\/\/www.blender.org\/wp-content\/uploads\/2026\/03\/outlier-1-512x230.webp 512w, https:\/\/www.blender.org\/wp-content\/uploads\/2026\/03\/outlier-1-768x345.webp 768w, https:\/\/www.blender.org\/wp-content\/uploads\/2026\/03\/outlier-1-1536x690.webp 1536w, https:\/\/www.blender.org\/wp-content\/uploads\/2026\/03\/outlier-1-2048x920.webp 2048w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">The alphabet sits at the back of the scene and could easily be replaced by a texture. The coat is also far enough that could have its mesh simplified.<\/figcaption><\/figure>\n\n\n\n<div class=\"wp-block-group alert alert-info is-layout-constrained wp-block-group-is-layout-constrained\" style=\"margin-top:var(--wp--preset--spacing--30);margin-bottom:var(--wp--preset--spacing--30);padding-top:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30)\">\n<p class=\"wp-block-paragraph\"><strong>How reliable are those results?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The initial analysis returned by the LLM only considered the modifiers which influenced the viewport. The <code>coat 1<\/code> object has a Solidify modifier which doubles its poly count, making it an even more outlier. And although this scene had no Simplify enabled, this settings would have also affected the final analysis.<\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" style=\"margin-top:var(--wp--preset--spacing--30);margin-bottom:var(--wp--preset--spacing--30)\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Example 2: Various Prompts<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Those are some of the other tested use cases. You will need to paste the entire &#8220;Prompt&#8221; content for them to work. As a start point you should use the corresponding demo file. The sucess of the operation will depend on the model used.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Use Case<\/th><th>Prompt<\/th><th>Demo File<\/th><th>Result<\/th><\/tr><\/thead><tbody><tr><td>Data-block renaming: fix typos<\/td><td><code>With the current open Blender file fix the name of all the data-blocks to remove typos. Report back which data-blocks got fixed.<\/code><\/td><td><a href=\"https:\/\/www.blender.org\/download\/demo\/geometry-nodes\/fields\/pebble_scattering.blend\">Scattering Pebbles<\/a><\/td><td>GRP-rocks \u2192 GRP-pebble, LGT-Lights \u2192 LGT-lights, Compositing Nodetree \u2192 Compositing Node Tree<\/td><\/tr><tr><td>Data-block renaming: better names<\/td><td><code>With the current open Blender file suggest descriptive names for all data-blocks, and apply if approved.<\/code><\/td><td><a href=\"https:\/\/www.blender.org\/download\/demo\/geometry-nodes\/fields\/pebble_scattering.blend\">Scattering Pebbles<\/a><\/td><td>Camera \u2192 CAM-main, Area \u2192 LGT-sun-key, Area.001 \u2192 LGT-sun-fill, Area.002 \u2192 LGT-area-rim, GEO-pebble.001 \u2192 GEO-pebble-B, \u2026<\/td><\/tr><tr><td>Querying data relations using natural language<\/td><td><code>Which objects are using the following material: pebbles<\/code><\/td><td><a href=\"https:\/\/www.blender.org\/download\/demo\/geometry-nodes\/fields\/pebble_scattering.blend\">Scattering Pebbles<\/a><\/td><td>7 objects: GEO-pebble, GEO-pebble.001, GEO-pebble.002, GEO-pebble.003, GEO-pebble.004, GEO-pebble.005, GEO-pebble.006<\/td><\/tr><tr><td>Scene debugging<\/td><td><code>What is the object with the highest poly-count on this file? Ignore objects which are not linked to any scene.<\/code><\/td><td><a href=\"https:\/\/www.blender.org\/download\/demo\/geometry-nodes\/fields\/pebble_scattering.blend\">Scattering Pebbles<\/a><\/td><td>GEO-ground with 4,096 faces.<\/td><\/tr><tr><td>Geometry Nodes Documentation<\/td><td><code>With the current open Blender file explain what the main geometry nodes setup is doing. Add inline documentation for it with frame elements. Create a Text data-block with the result of analysis.<\/code><\/td><td><a href=\"https:\/\/www.blender.org\/download\/demo\/geometry-nodes\/fields\/pebble_scattering.blend\">Scattering Pebbles<\/a><\/td><td>4 major color-coded frames + text file with explanation.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Other prompts yet to be explored:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Translate all the data-blocks from French to English.<\/li>\n\n\n\n<li>My mesh is not being deformed by my armature, how can I fix that?<\/li>\n\n\n\n<li>Blender is running out of memory rendering this scene, how can I optimize it?<\/li>\n\n\n\n<li>This mesh has strange shading artifacts, how can I you fix that?<\/li>\n\n\n\n<li>Find objects that have meshes with bad normals.<\/li>\n\n\n\n<li>Check my scene for non-uniformally transformed mesh objects.<\/li>\n\n\n\n<li>The video I exported doesn&#8217;t play in my web browsers, which settings should I change?<\/li>\n\n\n\n<li>Which sculpt brushes should I use for creating and detailing tree branches?<\/li>\n\n\n\n<li>Set up compositing nodes to save my image both as SDR and HDR.<\/li>\n\n\n\n<li>Verify this checklist:: meshes must be manifold, all objects must have materials, naming must follow convention, no absolute paths, \u2026<\/li>\n<\/ul>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Data-block renaming: fix typos<\/summary>\n<p class=\"wp-block-paragraph\"><code>GRP-rocks<\/code> \u2192 <code>GRP-pebbles<\/code> (the scene contains only pebble objects, not rocks).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>LGT-Lights<\/code> \u2192 <code>LGT-lights<\/code> (inconsistent casing).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Compositing Nodetree<\/code> \u2192 <code>Compositing Node Tree<\/code> (Nodetree is a compound word error).<\/p>\n<\/details>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Data-block renaming: better names<\/summary>\n<p class=\"wp-block-paragraph\"><strong>Objects<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Camera<\/code> \u2192 <code>CAM-main<\/code><\/li>\n\n\n\n<li><code>Area<\/code> \u2192 <code>LGT-sun-key<\/code><\/li>\n\n\n\n<li><code>Area.001<\/code> \u2192 <code>LGT-sun-fill<\/code><\/li>\n\n\n\n<li><code>Area.002<\/code> \u2192 <code>LGT-area-rim<\/code><\/li>\n\n\n\n<li><code>GEO-pebble.001<\/code> \u2192 <code>GEO-pebble-B<\/code><\/li>\n\n\n\n<li><code>GEO-pebble.002<\/code> \u2192 <code>GEO-pebble-C<\/code><\/li>\n\n\n\n<li><code>GEO-pebble.003<\/code> \u2192 <code>GEO-pebble-D<\/code><\/li>\n\n\n\n<li><code>GEO-pebble.004<\/code> \u2192 <code>GEO-pebble-E<\/code><\/li>\n\n\n\n<li><code>GEO-pebble.005<\/code> \u2192 <code>GEO-pebble-F<\/code><\/li>\n\n\n\n<li><code>GEO-pebble.006<\/code> \u2192 <code>GEO-pebble-G<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Light Data-Blocks<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Area<\/code> \u2192 <code>LGT-sun-key<\/code><\/li>\n\n\n\n<li><code>Area.001<\/code> \u2192 <code>LGT-sun-fill<\/code><\/li>\n\n\n\n<li><code>Area.002<\/code> \u2192 <code>LGT-area-rim<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Camera Data-Block<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Camera<\/code> \u2192 <code>CAM-main<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Textures<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Texture<\/code> \u2192 <code>TEX-ground-clouds<\/code><\/li>\n\n\n\n<li><code>Texture.001<\/code> \u2192 <code>TEX-ground-image<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Scene &amp; World<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>World<\/code> \u2192 <code>WLD-environment<\/code><\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Scene<\/code> \u2192 <code>SCN-main<\/code><\/li>\n<\/ul>\n<\/details>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Geometry Nodes Documentation<\/summary>\n<p class=\"wp-block-paragraph\"><strong>New Frames created<\/strong>:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6ae1979d6e6f5&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6ae1979d6e6f5\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1280\" height=\"927\" fetchpriority=\"low\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.blender.org\/wp-content\/uploads\/2026\/03\/labs-frames-1280x927.webp\" alt=\"Documentation frames added to the geometry nodes setup.\" class=\"wp-image-96217\" srcset=\"https:\/\/www.blender.org\/wp-content\/uploads\/2026\/03\/labs-frames-1280x927.webp 1280w, https:\/\/www.blender.org\/wp-content\/uploads\/2026\/03\/labs-frames-512x371.webp 512w, https:\/\/www.blender.org\/wp-content\/uploads\/2026\/03\/labs-frames-768x556.webp 768w, https:\/\/www.blender.org\/wp-content\/uploads\/2026\/03\/labs-frames.webp 1398w\" sizes=\"(max-width: 1280px) 100vw, 1280px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Documentation frames added to the geometry nodes setup.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Text Data-block<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GEOMETRY NODES ANALYSIS -- \"Pebble Scattering Nodes\"\nApplied to object: GEO-ground   |   Modifier: Pebbles\n========================================================\n\nOVERVIEW\n--------\nThis node group scatters three size categories of pebble meshes across\nthe faces of a ground mesh.  Each category uses its own density mask\nand a global Factor multiplier so that coverage can be art-directed\nper-layer without touching the raw mask textures.  The three resulting\ninstance layers are merged with the original ground geometry and sent\nto the Group Output.\n\nINPUTS (Group Interface)\n------------------------\n  Geometry           -- The ground mesh to scatter pebbles on.\n  Large Pebbles Mask -- Float mask (e.g. vertex colour \/ texture) that\n                       defines WHERE large pebbles may appear.\n  Medium Pebbles Mask-- Float mask for medium pebble placement regions.\n  Small Pebbles Mask -- Float mask for small pebble placement regions.\n  Factor             -- Global density multiplier shared by all three\n                       lanes (appears three times in the interface,\n                       one per lane).\n\nNODE GRAPH -- LANE BY LANE\n--------------------------\n\n+- LARGE PEBBLES LANE -----------------------------------------------------+\n|  Source object : GEO-pebble                                              |\n|  Group Input.001                                                         |\n|    +- Geometry ------------------------&gt; Distribute Points on Faces      |\n|    +- Large Pebbles Mask ------------&gt; Distribute Points on Faces        |\n|    |                                     (Density Factor socket)         |\n|    +- Factor --&gt; Math.003 (x)  -------&gt; Distribute Points on Faces       |\n|                                          (Density Max socket)            |\n|  Distribute Points on Faces ----------&gt; Instance on Points               |\n|  Object Info (GEO-pebble) -----------&gt; Instance on Points (Instance)     |\n|  Random Rotation.001 &#91;-pi, +pi] -----&gt; Instance on Points (Rotation)     |\n|  Random Value &#91;0.25 - 0.60]   -------&gt; Instance on Points (Scale)        |\n|  Instance on Points ------------------&gt; Join Geometry.003                |\n+--------------------------------------------------------------------------+\n\n+- MEDIUM PEBBLES LANE ----------------------------------------------------+\n|  Source object : GEO-pebble.004                                          |\n|  Group Input.002                                                         |\n|    +- Geometry ------------------------&gt; Distribute Points on Faces.001  |\n|    +- Medium Pebbles Mask -----------&gt; Math.004 (x) --&gt; Math.005 (x)     |\n|    +- Factor ------------------------&gt; Math.005 (x)                      |\n|         Math.005 output --------------&gt; Distribute Points on Faces.001   |\n|                                          (Density socket)                |\n|  Distribute Points on Faces.001 -----&gt; Instance on Points.001            |\n|  Object Info.001 (GEO-pebble.004) --&gt; Instance on Points.001             |\n|  Random Rotation.002 &#91;-pi, +pi]  ----&gt; Instance on Points.001            |\n|  Random Value.002 &#91;0.25 - 0.45] -----&gt; Instance on Points.001            |\n|  Instance on Points.001 -------------&gt; Join Geometry.003                 |\n+--------------------------------------------------------------------------+\n\n+- SMALL PEBBLES LANE -----------------------------------------------------+\n|  Source object : GEO-pebble.002                                          |\n|  Group Input.003                                                         |\n|    +- Geometry ------------------------&gt; Distribute Points on Faces.002  |\n|    +- Small Pebbles Mask -----------&gt; Math.006 (x) --&gt; Math.007 (x)      |\n|    +- Factor ------------------------&gt; Math.006 (x)                      |\n|         Math.007 output --------------&gt; Distribute Points on Faces.002   |\n|                                          (Density socket)                |\n|  Distribute Points on Faces.002 -----&gt; Instance on Points.002            |\n|  Object Info.002 (GEO-pebble.002) --&gt; Instance on Points.002             |\n|  Random Rotation &#91;-pi, +pi]      ----&gt; Instance on Points.002            |\n|  Random Value.003 &#91;0.10 - 0.35] -----&gt; Instance on Points.002            |\n|  Instance on Points.002 -------------&gt; Join Geometry.003                 |\n+--------------------------------------------------------------------------+\n\n+- MERGE &amp; OUTPUT ---------------------------------------------------------+\n|  Group Input.004                                                         |\n|    +- Geometry (pass-through) --------&gt; Join Geometry.003                |\n|  Join Geometry.003                                                       |\n|    (inputs: large instances + medium instances +                         |\n|             small instances  + original ground geo)                      |\n|    +- Geometry -----------------------&gt; Group Output                     |\n+--------------------------------------------------------------------------+\n\nSCALE RANGES (uniform, per lane)\n---------------------------------\n  Large  pebbles : 0.25 - 0.60\n  Medium pebbles : 0.25 - 0.45\n  Small  pebbles : 0.10 - 0.35\n\nROTATION (all lanes)\n---------------------\n  All three axes randomised independently over &#91;-pi, +pi],\n  giving each pebble instance a fully random orientation.\n\nDENSITY CONTROL PATTERN (Medium &amp; Small lanes)\n-----------------------------------------------\n  The mask value and the Factor are first multiplied together\n  (Math.004 \/ Math.006), then that product is multiplied again\n  by a second value (Math.005 \/ Math.007) before being fed into\n  the Density socket.  This two-stage multiply gives a non-linear\n  response curve, making the density fall off more aggressively\n  near the mask edges.\n\n  The Large lane uses a different (single-stage) approach:\n  the Density Factor socket receives the mask directly, and the\n  Factor is only used to scale Density Max via Math.003.\n\nNOTES &amp; SUGGESTIONS\n--------------------\n  * The node group has no Seed input exposed; adding one would allow\n    re-randomising all three layers simultaneously without touching\n    individual nodes.\n  * The Factor input currently appears three times (once per lane).\n    Merging them into a single shared socket would simplify the\n    modifier panel.\n  * Consider labelling the unlabelled Math nodes (Math.003-.007)\n    and Random Value nodes to aid future maintenance.<\/code><\/pre>\n<\/details>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>MCP server offering a natural language interface with Blender&#8217;s Python API, improving access to documentation, and allowing users to explore and understand complex setups.<\/p>\n","protected":false},"author":123469,"featured_media":0,"parent":95270,"menu_order":1,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-96198","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.blender.org\/wp-json\/wp\/v2\/pages\/96198","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.blender.org\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.blender.org\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.blender.org\/wp-json\/wp\/v2\/users\/123469"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blender.org\/wp-json\/wp\/v2\/comments?post=96198"}],"version-history":[{"count":85,"href":"https:\/\/www.blender.org\/wp-json\/wp\/v2\/pages\/96198\/revisions"}],"predecessor-version":[{"id":97682,"href":"https:\/\/www.blender.org\/wp-json\/wp\/v2\/pages\/96198\/revisions\/97682"}],"up":[{"embeddable":true,"href":"https:\/\/www.blender.org\/wp-json\/wp\/v2\/pages\/95270"}],"wp:attachment":[{"href":"https:\/\/www.blender.org\/wp-json\/wp\/v2\/media?parent=96198"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}