Headless Blender asset QA over MCP: background script runs and FBX reimport verification.
Part of the ellmos-ai family and the open-bricks open-source initiative.
Language / Sprache: 🇬🇧 English | 🇩🇪 Deutsch
1. Key Capabilities • 2. Target Personas & Discoverability • 3. Comparative Matrix • 4. Architecture & Topology • 5. Verification Lifecycle • 6. Tool Suite • 7. FBX Verification Deep Dive • 8. Visual Verification Deep Dive • 9. General Primitives • 10. CI/CD Integration • 11. Governance Invariants • 12. Security Policy • 13. Installation • 14. Configuration • 15. Level 1 SBOM • 16. Ecosystem • 17. LLM Context • 18. License & Statutory Notice
An asset-QA tool for game and 3D asset pipelines: verify that an exported FBX actually reimports cleanly in headless Blender — mesh count, material count, and required naming prefixes checked automatically, with a deterministic JSON result instead of a manual eyeball pass. blender_verify_fbx_reimport is the core structural tool and blender_verify_visual its visual counterpart — the first counts meshes and checks name prefixes, the second renders four views and measures geometry that counting cannot see. blender_locate and blender_run_script are the general-purpose primitives both are built on.
No add-on. No TCP port. No background daemon. This server does not install anything into Blender, does not open a socket for a running Blender instance to connect to, and does not keep Blender resident. Each call spawns blender --background --python <script.py>, waits for a bounded, timeout-guarded exit, and returns the result — headless and stateless by design. It does not download assets and does not collect telemetry.
How this differs from other Blender MCP servers. Most Blender MCP projects (e.g. ahujasid/blender-mcp, the official Blender Labs MCP server) drive a live, running Blender GUI over a TCP/add-on bridge for interactive scene editing — a different use case with a different trust model (an open socket, an installed add-on, a persistent process). This server instead targets CI-style, one-shot asset verification: run it in a pipeline step, get a pass/fail JSON, move on. If you need live GUI control, use a reviewed Blender MCP add-on separately (see Safety below).
[!NOTE] AI / LLM Integration & Machine-Readable Context: AI assistants (Claude, Codex, Gemini) can read llms.txt for machine-readable context, search phrases, and tool documentation. Regression test suites guard privacy hygiene and runtime memory safety.
[!TIP] CI & Asset Pipeline Automation: Use
blender_verify_fbx_reimportas an automated gate before committing 3D assets to source control. It flags missing prefixes (e.g.,SM_,M_), unexpected mesh counts, or broken material assignments without human intervention.
SM_/M_ prefixes, or unassigned materials that slip past manual review.blender fbx reimport verification mcp, blender headless asset qa gate, automated fbx naming convention check, detect unapplied rotation fbx blender.headless blender asset qa mcp server, github actions blender fbx qa gate, blender background script ci cd verification, blender mcp no add-on no tcp port.blender --background execution with strict 15-minute runaway timeouts, bounded 8 KB memory tails, zero add-ons, and deterministic JSON exit codes.mcp server fbx mesh material verification, ai agent blender 3d asset inspection, blender four-view rendering mcp, llm tool headless blender.taskkill /T /F process tree termination, and fail-closed temporary file cleanup.offline blender mcp zero egress, air gapped 3d asset verification, unprivileged blender asset qa, zero copyleft mcp tool.RunAsInvoker non-elevation certification, 100% offline zero-egress guarantee, zero runtime telemetry, and Level 1 SBOM with 0% copyleft licenses.| Invariant / Dimension | [1] ellmos-blender-use-mcp | [2] Interactive Blender MCP (TCP Add-on) | [3] Ad-Hoc Python Scripts | [4] Heavy DCC Suites (Maya / 3ds Max QA) | [5] Cloud SaaS 3D Checkers (Sketchfab) |
|---|---|---|---|---|---|
| INV-LOCAL-01: Network & Air-Gap | 100% Offline / Zero-Egress (0 network calls) | Open TCP localhost listener required | Local, but unbounded network access | Local, but heavy license server polling | Remote SaaS upload required (Egress risk) |
| INV-HEADLESS-02: Add-on Burden | Zero Add-ons (works out of the box) | Requires Blender add-on installation | No add-on required | Proprietary plugin installations | Web browser or heavy client upload |
| INV-SEC-03: Privilege Model | Unprivileged RunAsInvoker (User mode) | User mode, but open socket attack surface | Unrestricted script execution | Administrator/Service installation | SaaS cloud security boundary |
| INV-BOUND-04: Memory Bounding | Hard Tail Buffer (8 KB - 50 KB max) | Unbounded GUI session memory | Unbounded console output memory | Unbounded workstation memory footprint | Cloud processing quotas |
| INV-INTEG-05: Structured JSON QA | Deterministic Machine-Readable JSON | Text prompt / chat responses | Unstructured stdout prints | XML / propriety log reports | Web dashboard visualization |
| INV-VISUAL-06: 4-View Geometry | Standardized 4-View Render Pipeline | Manual GUI eyeball rotation | Requires custom camera scripts | Manual viewport navigation | Single WebGL model viewer |
| INV-CLEAN-07: Ephemeral Cleanup | Fail-Closed Automated Temp Purge | Persistent scene state in memory | Leftover .py/.blend scratch files | Heavy project temp directories | Remote cloud storage retention |
| INV-CROSS-08: Cross-Platform | Windows, Linux, macOS Parity | Dependent on GUI desktop support | OS-dependent path handling | OS-constrained (primarily Windows) | Platform-independent browser |
| INV-SYNC-09: Lock & Sync Defense | Multi-Host Lock & Sync Hardened | Vulnerable to file locking collisions | No lock awareness | Heavy proprietary file locks | No multi-device git discipline |
| INV-SLA-10: Security SLA | 48h Intake / 5d Triage Commitment | Community best-effort (no SLA) | No formal support | Enterprise support contract required | Generic SaaS ticket queue |
graph TD
subgraph Client ["AI Assistant & Client Environment"]
AI["AI Agent (Claude / Codex / Gemini)"]
Config["MCP Configuration (npx / node)"]
end
subgraph Server ["ellmos Blender Use MCP Server"]
MCP["MCP Protocol Server (src/index.js)"]
subgraph Tools ["Tool Handlers"]
T1["blender_verify_fbx_reimport"]
T2["blender_run_script"]
T3["blender_locate"]
T4["blender_verify_visual"]
end
Safety["Timeout & Tail Buffer Guard (8k chars)"]
end
subgraph Subprocess ["Headless Subprocess (Isolated)"]
Exe["Blender Executable (blender --background)"]
Python["Temp Python Verification Script"]
FBX["Target FBX Asset File"]
JSONOut["Deterministic JSON Result"]
end
AI -->|JSON-RPC Request| MCP
MCP --> Tools
T1 -->|Generates script & spawns| Exe
T2 -->|Executes arbitrary python| Exe
T3 -->|Locates binary| Exe
T4 -->|Generates visual verification script & spawns| Exe
Exe --> Python
Python --> FBX
FBX -->|Mesh / Material / Naming QA| JSONOut
JSONOut --> Safety
Safety -->|Bounded Response| AI
style Client fill:#1e1e2e,stroke:#89b4fa,stroke-width:1px
style Server fill:#181825,stroke:#cba6f7,stroke-width:1px
style Subprocess fill:#11111b,stroke:#a6e3a1,stroke-width:1px
sequenceDiagram
autonumber
actor Client as AI Assistant / CI Pipeline
participant Server as ellmos Blender Use MCP
participant Resolver as Blender Resolver
participant Process as Headless Subprocess
participant Python as Blender Python Engine
participant FS as Local Filesystem (FBX)
Client->>Server: Call blender_verify_fbx_reimport(fbxPath, requiredPrefixes)
Server->>Resolver: Resolve Blender Executable (blender_locate / BLENDER_EXE / Registry / PATH)
Resolver-->>Server: Return Validated Executable Path
Server->>FS: Write Temp Python Verification Script
Server->>Process: Spawn blender --background --python script (timeout-guarded)
Process->>Python: Execute Verification Script
Python->>FS: bpy.ops.import_scene.fbx(filepath=fbxPath)
FS-->>Python: Parse Mesh Objects & Material Slots
Python->>Python: Validate Naming Prefixes, Object Counts & Hierarchy
Python->>FS: Write Output JSON Verification Result
Process-->>Server: Process Exit (Exit Code 0 / Bounded Tail Buffer)
Server->>FS: Read Result & Clean Up Temp Verification Script
Server-->>Client: Deterministic JSON Result (meshCount, materialCount, missingPrefixes, ok)
| Tool | Purpose | Primary Output | Memory Guard |
|---|---|---|---|
blender_verify_fbx_reimport | Generate a temporary Blender verification script, import an FBX, and write a JSON result with mesh/material counts and missing required prefixes. | JSON Report | Bounded 8 KB Tail |
blender_verify_visual | Render four views of an FBX and check geometry a structural reimport cannot see: unapplied rotation, floating parts, pivot outside the model, transform residuals, stray empties. | 4 PNGs + JSON | Bounded 8 KB Tail |
blender_run_script | Run blender --background --python <script.py> with optional arguments and bounded stdout tail. | Script Tail Text | 8 KB - 50 KB Max |
blender_locate | Resolve the Blender executable from an explicit path, BLENDER_EXE, standard Windows install locations, or PATH. | Resolved Path | Zero Subprocess |
blender_verify_fbx_reimport Deep Dive & SchemaImports an FBX file into headless Blender and verifies mesh count, empty count, material count, material slot assignments, and required naming prefixes.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
fbxPath | string | Yes | — | Target FBX asset file path to verify. |
resultPath | string | No | <fbxDir>/verify_reimport_result.json | Path where structured JSON verification results will be written. |
requiredPrefixes | string[] | No | [] | List of naming prefixes required on meshes or empties (e.g. ["SM_", "M_"]). |
blenderPath | string | No | auto-detect | Custom path to the Blender executable (blender.exe / blender). |
timeoutMs | number | No | 120000 | Process execution timeout in milliseconds (max: 600000). |
{
"fbxPath": "assets/models/SM_Watchtower_01.fbx",
"requiredPrefixes": ["SM_", "M_"]
}
{
"ok": true,
"blender": "C:\\Program Files\\Blender Foundation\\Blender 4.2\\blender.exe",
"fbxPath": "C:\\projects\\game\\assets\\models\\SM_Watchtower_01.fbx",
"resultPath": "C:\\projects\\game\\assets\\models\\verify_reimport_result.json",
"exitCode": 0,
"timedOut": false,
"durationMs": 1820,
"outputTruncated": false,
"verification": {
"ok": true,
"fbx": "C:\\projects\\game\\assets\\models\\SM_Watchtower_01.fbx",
"mesh_count": 3,
"empty_count": 0,
"material_count": 2,
"materials": [
"M_Stone_Brick",
"M_Wood_Trim"
],
"missing_prefixes": [],
"script_free": true
}
}
Renders four views of an FBX and checks geometry that a structural reimport cannot see.
blender_verify_fbx_reimport counts meshes and checks name prefixes — it cannot tell you that a mesh is lying on its side, that a part floats away from the assembly, or that the pivot sits outside the model. This tool does, and it produces the renders to look at.
{ "fbxPath": "kit.fbx", "outDir": "verify_visual", "expectHeight": "2.5,3.5" }
+---------------------------------------+---------------------------------------+
| TOP VIEW | PERSPECTIVE VIEW |
| (XY Plane) | (Isometric) |
| | |
| Detects: X/Y planar alignment, | Detects: Overall silhouette, |
| bounding box symmetry, footprint | complex assembly integration |
+---------------------------------------+---------------------------------------+
| FRONT VIEW | SIDE VIEW |
| (XZ Plane) | (YZ Plane) |
| | |
| Detects: Model height, Z-grounding, | Detects: Depth errors, floating vs |
| upright orientation (lying down) | resting parts, pivot offset |
+---------------------------------------+---------------------------------------+
Detected failure classes: unapplied rotation, floating parts in multi-part assets, pivot/origin outside the bounding box, transform residuals in the export, stray empties.
{
"ok": true,
"blender": "C:\\Program Files\\Blender Foundation\\Blender 4.2\\blender.exe",
"fbxPath": "C:\\projects\\game\\kit.fbx",
"outDir": "C:\\projects\\game\\verify_visual",
"exitCode": 0,
"timedOut": false,
"durationMs": 3450,
"outputTruncated": false,
"verification": {
"ok": true,
"fails": [],
"warns": [],
"metrics": {
"dimensions": [2.45, 1.82, 4.10],
"center": [0.0, 0.0, 2.05],
"pivotAtOrigin": true,
"unappliedRotation": false
}
},
"renders": {
"view_front": "verify_visual/view_front.png",
"view_side": "verify_visual/view_side.png",
"view_top": "verify_visual/view_top.png",
"view_perspective": "verify_visual/view_perspective.png"
}
}
Why four views and not one: a single front shot hides depth errors — floating-vs-resting, behind-vs-in-front. A real case: chain links looked correctly attached from the front and were not attached at all when seen from the side.
Like every tool here it is a one-shot headless run: no add-on, no daemon, no socket.
blender_locate & blender_run_script)blender_locate: Resolves the active Blender executable on Windows, Linux, or macOS across explicit call parameters, environment variable BLENDER_EXE, standard installation paths (newest version first), and system PATH.blender_run_script: Runs an arbitrary local Python script via blender --background --python <script.py> with optional arguments, timeout guardrail, and hard tail-buffer truncation (8 KB default, up to 50 KB max).Integrate headless asset QA directly into your GitHub Actions pull request checks to prevent broken FBX models, missing material slots, unapplied rotations, and displaced pivots from reaching the main branch:
name: 3D Asset QA Gate
on:
pull_request:
paths:
- "assets/**/*.fbx"
jobs:
verify-assets:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Install Blender & Node.js
run: |
sudo snap install blender --classic
sudo apt-get install -y nodejs npm
- name: Run Headless Asset Verification
run: |
npx -y ellmos-blender-use-mcp --version
# Run structural FBX QA and 4-view visual verification
blender --background --factory-startup --python node_modules/ellmos-blender-use-mcp/scripts/verify_asset_visual.py -- \
--fbx assets/models/SM_HeroAsset.fbx \
--out build/asset-qa/ \
--json
The server enforces 10 architectural and runtime invariants to guarantee privacy, safety, process isolation, and auditability:
| ID | Invariant | Guarantee & Implementation Details |
|---|---|---|
INV-LOCAL-01 | 100% Local-First & Zero Network Egress | Zero outbound network requests, external telemetry, or remote API calls. Runs fully air-gapped on the host machine. |
INV-HEADLESS-02 | Stateless & Add-on-Free Headless Execution | No Blender add-on installation, no open TCP sockets or daemon listeners, and zero mutation of the host Blender user directory. |
INV-SEC-03 | Non-Elevation & Unprivileged RunAsInvoker | Operates strictly with unprivileged user-mode permissions (RunAsInvoker). Never requires or requests administrative elevation. |
INV-BOUND-04 | Strict Timeout & Tail-Buffer Bounding | Every execution is timeout-guarded. Standard output and error streams are captured into bounded tail buffers (default 8 KB, max 50 KB), preventing runaway memory. |
INV-INTEG-05 | Deterministic JSON & Evidence Integrity | Produces verifiable, machine-readable JSON reports containing exact mesh counts, material slots, naming prefixes, and geometry metrics. |
INV-VISUAL-06 | Four-View Multi-Angle Visual Verification | Generates orthogonal front, side, top, and perspective renders to detect geometry defects (floating parts, unapplied rotation) that depth-blind checks miss. |
INV-CLEAN-07 | Fail-Closed Ephemeral Staging & Script Cleanup | Ephemeral Python verification scripts and temporary staging files are unconditionally purged from the filesystem upon completion or failure. |
INV-CROSS-08 | Cross-Platform Operating System Parity | Uniform execution and automated discovery across Windows, Linux, and macOS without hardcoded host dependencies. |
INV-SYNC-09 | Cloud-Sync & Multi-Host Lock Discipline | Resilient against cloud synchronization conflicts (*-conflict-*, *-CONFLIT-*) and compliant with canonical multi-agent locks. |
INV-SLA-10 | 48h Security Response & 5-Day Triage SLA | Formal vulnerability acknowledgment within 48 hours and triage commitment within 5 business days via official coordination channels. |
taskkill /pid <PID> /T /F on timeout.{
"mcpServers": {
"blender-use": {
"command": "npx",
"args": ["-y", "ellmos-blender-use-mcp"]
}
}
}
git clone https://github.com/ellmos-ai/ellmos-blender-use-mcp.git
cd ellmos-blender-use-mcp
npm install
npm run build
node src/index.js
For a local checkout, point command/args at the cloned src/index.js instead:
{
"mcpServers": {
"blender-use": {
"command": "node",
"args": ["<path-to-repo>/src/index.js"]
}
}
}
BLENDER_EXE — optional path to the Blender executable. Without it, tools try the explicit blenderPath argument, then BLENDER_EXE, then standard Blender install locations on Windows (%ProgramFiles%\Blender Foundation\Blender <version>\blender.exe and equivalent 32-bit and per-user roots, newest version first), then PATH. On Linux and macOS the lookup goes straight from BLENDER_EXE to PATH.blenderPath argument per call, which takes priority over BLENDER_EXE.blender_run_script defaults to 8,000 characters (configurable up to 50,000); FBX verification keeps 8,000. The response marks outputTruncated: true when earlier output was discarded, so verbose Blender scripts cannot grow the MCP process memory without bound.All runtime production dependencies are distributed under permissive open-source licenses (MIT and BSD-2-Clause) with 0% copyleft:
@modelcontextprotocol/sdk (MIT)update-notifier (BSD-2-Clause)zod (MIT)For the complete dependency inventory, Invariant Cross-Reference Matrix, and prior-art isolation analysis, see THIRD_PARTY_LICENSES.md.
This MCP server is part of the ellmos-ai ecosystem — AI infrastructure, MCP servers, and intelligent tools.
| Server | Tools | Focus | npm |
|---|---|---|---|
| FileCommander | 46 | Filesystem, process management, interactive sessions, cloud-lock-safe operations | ellmos-filecommander-mcp |
| CodeCommander | 22 | Code analysis, JSON repair, imports, diffs, regex | ellmos-codecommander-mcp |
| Clatcher | 12 | File repair, format conversion, batch operations | ellmos-clatcher-mcp |
| n8n Manager | 18 | n8n workflow management via AI assistants | n8n-manager-mcp |
| ControlCenter | 20 | MCP stack discovery, profile management, control plane | ellmos-controlcenter-mcp |
| Homebase | 45 | Local-first LLM memory, knowledge, state, routing, swarm orchestration | ellmos-homebase-mcp (alpha) |
| ServerCommander | 8 | Server operations: health checks, log analysis, deploy dry-runs, mail diagnostics | ellmos-servercommander-mcp (alpha) |
| Blender Use | 4 | Headless Blender asset QA: structural FBX reimport checks and four-view visual verification | ellmos-blender-use-mcp (alpha) |
| Open Compute | 10 | Model-agnostic computer use: capture, safety-gated actions, Windows UIA | open-compute-mcp (alpha) |
| Project | Description |
|---|---|
| workflowhooker | Transparent command interceptor & safety sandbox for agentic workflows |
| system-explorer | System inspection, MCP orchestration, and fleet introspection runtime |
| memoryhooker | High-performance episodic memory interceptor for AI agents |
| policy-registry | Policy distribution and compliance engine for multi-agent frameworks |
| ellmos-delegation-authority | Trust boundary verification & cryptographic token delegation authority |
| sqlite-transit-sync | Transactional SQLite transit replication with snapshot isolation |
| BACH | Local-first text-based OS for LLM agents — 113+ handlers, 550+ tools, SQLite memory |
| open-compute | Model-agnostic computer-use core powering Open Compute MCP |
| clutch | Provider-neutral LLM orchestration with auto-routing and budget tracking |
| rinnsal | Lightweight agent memory, connectors, and automation infrastructure |
| ellmos-stack | Self-hosted AI research stack (Ollama + n8n + Rinnsal + KnowledgeDigest) |
| MarbleRun | Autonomous agent chain framework for Claude Code |
| gardener | Minimalist database-driven LLM OS prototype (4 functions, 1 table) |
| ellmos-tests | Testing framework for LLM operating systems (7 dimensions) |
Our partner organization open-bricks bundles AI-native desktop applications and developer utilities — a modern, open-source software suite built for the age of AI:
| Project | Ecosystem | Description |
|---|---|---|
| ProFiler | file-bricks | Advanced file management, deep inspection, and batch pipeline workbench |
| DokuZen | doc-bricks | Unified document converter, markdown formatter, and documentation hub |
| PDFtoPDFocr | doc-bricks | High-fidelity OCR processor and searchable PDF pipeline |
| FormularErstellen | doc-bricks | Declarative form generator and PDF schema compiler |
| MediaBrain | file-bricks | AI-assisted media categorization, tagging, and asset management |
| TextBrain | doc-bricks | Text analysis, summarization, and local language intelligence suite |
| knowledgedigest | open-bricks | Knowledge extraction, semantic clustering, and synthesis engine |
| DevCenter | dev-bricks | Developer environment orchestration and multi-agent management cockpit |
| CodeBox | dev-bricks | Secure execution sandbox and isolated code-runner runtime |
| BattleStage | entertain-and-more | Modular tactical game arena with automated asset pipeline validation |
llms.txt)For AI assistants and LLM tooling, llms.txt provides machine-readable architecture documentation, tool descriptions, search phrases, and runtime invariants.
Distributed under the MIT License. See LICENSE and NOTICE for full copyright and attribution details.
This open-source package is provided free of charge without consideration (Gefälligkeit). Under statutory German law (§ 521 BGB), liability for defects in quality and title is strictly limited to intentional misconduct (Vorsatz) and gross negligence (grobe Fahrlässigkeit).
Security vulnerabilities are triaged within 48 hours under our binding Security SLA. Refer to SECURITY.md for coordinated disclosure guidelines.
Source-derived launch command. Check the maintainer’s required arguments and credentials before running:
npx -y ellmos-blender-use-mcpMerge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.
{
"mcpServers": {
"io-github-ellmos-ai-ellmos-blender-use-mcp": {
"command": "npx",
"args": [
"-y",
"ellmos-blender-use-mcp"
]
}
}
}Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.
Claude Desktop setup referenceellmos-blender-use-mcpnpmellmos Blender Use works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.
~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.~/.cursor/mcp.jsonRestart Cursor for changes to take effect..vscode/mcp.jsonReload VS Code window for changes to take effect.~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect..mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.