From bdbdfead041745f3b835214b3422e8d133f6f022 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Mon, 10 Aug 2026 12:12:11 -0700 Subject: [PATCH] fix(security): remove blender MCP catalog entry and skill after upstream compromise MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The upstream ahujasid/blender-mcp and ahujasid/ableton-mcp GitHub repos were hijacked on 2026-08-08: the maintainer (@sidahuj) publicly reported his account was compromised and ownership stripped, and both repos now redirect to an attacker-controlled org (MCPBlender, created the same day, pushing new commits since). Although our catalog pinned blender-mcp==1.6.4 from PyPI (pre-compromise, sha256 verified unchanged), the server is only half the bridge: the manifest's post-install instructions and the optional skill directed users to download addon.py — arbitrary Python executed inside Blender — from the now-compromised GitHub repo (the raw URL currently 404s, and the addon ships in no PyPI artifact). There is no trustworthy source for the addon half, so the entry cannot be installed safely end-to-end. Removing the catalog entry and skill entirely until the maintainer confirms account recovery; re-adding is a follow-up PR once upstream is verified clean. - optional-mcps/blender/: removed - optional-skills/creative/blender-mcp/: removed - docs: catalog rows, sidebar entry, skill pages (en + zh-Hans) removed - cross-references in unreal-mcp and kanban-video-orchestrator cleaned --- optional-mcps/blender/manifest.yaml | 88 ------ optional-skills/creative/blender-mcp/SKILL.md | 142 ---------- .../blender-mcp/references/bpy-api.md | 264 ------------------ .../blender-mcp/references/pitfalls.md | 133 --------- .../blender-mcp/references/recipes.md | 223 --------------- .../kanban-video-orchestrator/SKILL.md | 4 +- .../references/examples.md | 2 +- .../references/role-archetypes.md | 2 +- .../references/tool-matrix.md | 5 +- optional-skills/creative/unreal-mcp/SKILL.md | 4 +- .../unreal-mcp/references/tool-surface.md | 2 +- .../docs/reference/optional-skills-catalog.md | 1 - .../optional/creative/creative-blender-mcp.md | 160 ----------- .../creative-kanban-video-orchestrator.md | 4 +- .../optional/creative/creative-unreal-mcp.md | 3 +- .../reference/optional-skills-catalog.md | 1 - .../optional/creative/creative-blender-mcp.md | 135 --------- .../creative-kanban-video-orchestrator.md | 6 +- website/sidebars.ts | 1 - 19 files changed, 14 insertions(+), 1166 deletions(-) delete mode 100644 optional-mcps/blender/manifest.yaml delete mode 100644 optional-skills/creative/blender-mcp/SKILL.md delete mode 100644 optional-skills/creative/blender-mcp/references/bpy-api.md delete mode 100644 optional-skills/creative/blender-mcp/references/pitfalls.md delete mode 100644 optional-skills/creative/blender-mcp/references/recipes.md delete mode 100644 website/docs/user-guide/skills/optional/creative/creative-blender-mcp.md delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/skills/optional/creative/creative-blender-mcp.md diff --git a/optional-mcps/blender/manifest.yaml b/optional-mcps/blender/manifest.yaml deleted file mode 100644 index ad170d0e336bb..0000000000000 --- a/optional-mcps/blender/manifest.yaml +++ /dev/null @@ -1,88 +0,0 @@ -# Nous-approved MCP catalog entry. -# Presence in this directory = approval. Merged via PR review. -manifest_version: 1 - -name: blender -description: Drive a live Blender session — modeling, scenes, and renders. -source: https://github.com/ahujasid/blender-mcp - -# ahujasid/blender-mcp (MIT, PyPI: blender-mcp) is the de-facto standard -# Blender MCP. It is a bridge with two halves: -# 1. This stdio server (uvx blender-mcp), which Hermes launches. -# 2. An addon (addon.py) running inside Blender that opens a local command -# socket on 127.0.0.1:9876. The stdio server relays to it. -# There is nothing to git-clone on the Hermes side — uvx resolves the package — -# so no install block. The in-Blender addon setup is covered in post_install. -# -# Why not Blender's official MCP (blender.org/lab): it requires Blender 5.1+ -# and targets scene analysis/documentation rather than asset creation. This -# server works across Blender 3.x/4.x and exposes full modeling control. -transport: - type: stdio - command: "uvx" - # Pinned per catalog dependency policy: exact version, and the release must - # be at least 2 weeks old at pin time (supply-chain cooldown — same rule as - # pyproject.toml dependencies). 1.6.4 released 2026-06-11. The catalog never - # auto-updates; bumping the pin is a PR to this manifest. - args: - - "blender-mcp==1.6.4" - version: "1.6.4" - env: - # Upstream ships anonymous telemetry, on by default. Hermes policy is - # no outbound telemetry without explicit opt-in, so the catalog entry - # disables it. Remove this line only if you deliberately want it on. - DISABLE_TELEMETRY: "true" - -# The Blender addon binds 127.0.0.1 only and has no auth of its own; the -# stdio server needs no credentials. Optional integrations (Sketchfab, -# Hyper3D Rodin, Hunyuan3D) take API keys entered in the addon's N-panel -# inside Blender, not via Hermes env. -auth: - type: none - -# Tool selection at install time: -# The server advertises 22 tools. 18 of them front optional third-party asset -# services (PolyHaven, Sketchfab, Hyper3D Rodin, Hunyuan3D) that are dead -# weight unless the matching integration is enabled in the addon panel — and -# upstream has no server-side trim mechanism, so without a filter every one -# of them costs schema tokens on every API call. Default to the core surface: -# scene/object inspection, viewport screenshots, and code execution, which is -# the complete modeling/render capability. Users who enable an asset service -# in the addon can opt into its tools with `hermes mcp configure blender`. -tools: - default_enabled: - - get_scene_info - - get_object_info - - get_viewport_screenshot - - execute_blender_code - -post_install: | - This entry launches the bridge server, but the bridge talks to an addon - INSIDE a running Blender (3.0+). One-time setup: - - 1. Download addon.py from https://github.com/ahujasid/blender-mcp - (raw file: https://raw.githubusercontent.com/ahujasid/blender-mcp/main/addon.py) - 2. Blender > Edit > Preferences > Add-ons > Install... > select addon.py, - then enable "Interface: Blender MCP". - 3. In the 3D viewport press N, open the "BlenderMCP" tab, click - "Connect to Claude" (starts the local socket on 127.0.0.1:9876). - - Blender must be RUNNING with the addon connected before the tools work — - start Blender first, then your Hermes session. The addon refuses to start - under `blender -b` (background mode): its command queue runs on UI timers. - On a machine without a display, run Blender under a virtual one: - xvfb-run blender (or Xvfb :99 & DISPLAY=:99 blender) - GPU rendering (Cycles/OptiX) works fine under Xvfb. - - SECURITY: execute_blender_code runs arbitrary Python inside Blender with no - sandbox — same trust level as the terminal tool. Upstream telemetry is - disabled via DISABLE_TELEMETRY in this entry's env block. - - The 18 asset-service tools (PolyHaven/Sketchfab/Hyper3D/Hunyuan3D) are off - by default. To use one: enable the service in the addon's BlenderMCP panel - (API key there if required), then `hermes mcp configure blender` and tick - its tools. PolyHaven is free and keyless; the others need accounts. - - If Hermes and Blender run on different machines, note that file paths in - execute_blender_code (texture loads, exports) resolve on the BLENDER host's - filesystem, not where Hermes runs. diff --git a/optional-skills/creative/blender-mcp/SKILL.md b/optional-skills/creative/blender-mcp/SKILL.md deleted file mode 100644 index 7221bc89b5f4a..0000000000000 --- a/optional-skills/creative/blender-mcp/SKILL.md +++ /dev/null @@ -1,142 +0,0 @@ ---- -name: blender-mcp -description: Drive Blender via the catalog blender MCP, with bpy recipes. -version: 2.1.0 -requires: Blender 3.0+ desktop instance (headless via xvfb-run) -author: alireza78a + kshitijk4poor + Hermes Agent -license: MIT -tags: [blender, 3d, animation, modeling, bpy, mcp] -platforms: [linux, macos, windows] ---- - -# Blender MCP Skill - -Companion skill for the `blender` entry in the Hermes MCP catalog. The MCP -server provides the connection to Blender; this skill teaches the bpy idioms -and pitfalls for driving it well. It does not cover Blender UI workflows — -everything here goes through the MCP tools against a live Blender session. - -## When to Use - -Use when the user wants to create or modify anything in a running Blender -instance: meshes, materials, animations, lighting, renders. Requires the -blender MCP server installed and a Blender desktop session with the addon -connected. - -## Prerequisites - -1. Install the MCP server from the Nous catalog (one-time): - - hermes mcp install blender - - This configures the pinned `blender-mcp` stdio server with the curated - tool set: `get_scene_info`, `get_object_info`, `get_viewport_screenshot`, - `execute_blender_code`. - -2. Install the addon inside Blender (one-time — the catalog entry's - post-install notes cover this too): - - Download https://raw.githubusercontent.com/ahujasid/blender-mcp/main/addon.py - - Blender > Edit > Preferences > Add-ons > Install... > select addon.py, - enable "Interface: Blender MCP". - -3. Every session: start Blender FIRST, press N in the viewport, open the - "BlenderMCP" tab, click "Connect to Claude" (starts the local bridge - socket). Then start your Hermes session so the MCP tools are loaded. - - The addon refuses to start under `blender -b` (background mode). On a - machine without a display, run Blender under a virtual one: - `xvfb-run blender`. GPU rendering works fine under Xvfb. - -## Quick Reference - -| MCP tool | Use for | -|---------------------------|--------------------------------------------| -| `get_scene_info` | List objects before touching the scene | -| `get_object_info` | Inspect one object (transform, materials) | -| `get_viewport_screenshot` | Visual check of what you built | -| `execute_blender_code` | Everything else — arbitrary bpy Python | - -Deeper material lives in the reference files (load on demand): - -| Reference | Contents | -|-----------|----------| -| `references/bpy-api.md` | Essential bpy operations: modeling, materials, modifiers, rendering | -| `references/recipes.md` | Complete working scenes: low-poly terrain, glass sphere, HDRI lighting, turntable animation | -| `references/pitfalls.md` | Hard-won lessons: empty code results in 5.x, ops-vs-data API, engine names by version | - -Optional asset-service tools (PolyHaven, Sketchfab, Hyper3D, Hunyuan3D) are -disabled by default. If the user has enabled a service in the addon panel, -opt into its tools with `hermes mcp configure blender`. - -## Procedure - -1. Call `get_scene_info` first — never assume the scene is empty. -2. Build with `execute_blender_code`, in small focused calls (one logical - step per call: add objects, then materials, then animation). Large - monolithic scripts hit the bridge timeout. -3. Verify visually with `get_viewport_screenshot` between major steps. -4. Render to an absolute path and tell the user where the file is. - -### Common bpy Patterns - -Clear scene: - - bpy.ops.object.select_all(action='SELECT') - bpy.ops.object.delete() - -Add mesh objects: - - bpy.ops.mesh.primitive_uv_sphere_add(radius=1, location=(0, 0, 0)) - bpy.ops.mesh.primitive_cube_add(size=2, location=(3, 0, 0)) - bpy.ops.mesh.primitive_cylinder_add(radius=0.5, depth=2, location=(-3, 0, 0)) - -Create and assign material: - - mat = bpy.data.materials.new(name="MyMat") - mat.use_nodes = True - bsdf = mat.node_tree.nodes.get("Principled BSDF") - bsdf.inputs["Base Color"].default_value = (R, G, B, 1.0) - bsdf.inputs["Roughness"].default_value = 0.3 - bsdf.inputs["Metallic"].default_value = 0.0 - obj.data.materials.append(mat) - -Keyframe animation: - - obj.location = (0, 0, 0) - obj.keyframe_insert(data_path="location", frame=1) - obj.location = (0, 0, 3) - obj.keyframe_insert(data_path="location", frame=60) - -Render to file: - - bpy.context.scene.render.filepath = "/tmp/render.png" - bpy.context.scene.render.engine = 'CYCLES' - bpy.ops.render.render(write_still=True) - -## Pitfalls - -- The blender MCP tools only exist if the server is installed and the session - started after install. If they're missing, run `hermes mcp install blender` - and start a new session. -- The addon bridge must be (re)connected inside Blender each Blender session - (N-panel > BlenderMCP > Connect). "Connection refused" from the tools means - Blender isn't running or the addon isn't connected — fix that, don't retry. -- Break complex scenes into multiple smaller `execute_blender_code` calls to - avoid bridge timeouts. -- Render output paths must be absolute (`/tmp/render.png`), not relative — - they resolve on the BLENDER host's filesystem, which matters if Hermes and - Blender run on different machines. -- `shade_smooth()` requires the object to be selected and in object mode. -- `execute_blender_code` runs arbitrary Python inside Blender with no sandbox - — same trust level as the `terminal` tool. Don't paste untrusted code into - it. -- Do NOT hand-roll raw TCP JSON to port 9876 from `execute_code` — that was - this skill's pre-MCP workaround. It bypasses the catalog's version pinning - and tool curation. The MCP tools are the supported path. - -## Verification - -- `get_scene_info` returns the expected object list after each build step. -- `get_viewport_screenshot` shows the scene you intended. -- After a render, confirm the output file exists and report its absolute - path to the user. diff --git a/optional-skills/creative/blender-mcp/references/bpy-api.md b/optional-skills/creative/blender-mcp/references/bpy-api.md deleted file mode 100644 index 1f5715c694227..0000000000000 --- a/optional-skills/creative/blender-mcp/references/bpy-api.md +++ /dev/null @@ -1,264 +0,0 @@ -# Essential bpy API Reference - -## Scene & Objects - -```python -# List all objects -[obj.name for obj in bpy.data.objects] - -# Get active object -obj = bpy.context.active_object - -# Select object by name -bpy.data.objects['Cube'].select_set(True) - -# Delete object by name (no context needed) -bpy.data.objects.remove(bpy.data.objects['Cube'], do_unlink=True) - -# Delete all objects -for obj in list(bpy.data.objects): - bpy.data.objects.remove(obj, do_unlink=True) - -# Duplicate object -import bpy -src = bpy.data.objects['Cube'] -new_obj = src.copy() -new_obj.data = src.data.copy() -new_obj.name = 'Cube_Copy' -bpy.context.collection.objects.link(new_obj) - -# Parent objects -child = bpy.data.objects['Child'] -parent = bpy.data.objects['Parent'] -child.parent = parent -``` - -## Transforms - -```python -import math, mathutils - -obj = bpy.data.objects['Cube'] - -# Location (world coordinates) -obj.location = (1.0, 2.0, 3.0) -obj.location.x += 0.5 - -# Rotation (radians) -obj.rotation_euler = (math.radians(45), 0, 0) - -# Scale -obj.scale = (2.0, 2.0, 2.0) - -# Apply transforms (bake into mesh) -bpy.context.view_layer.objects.active = obj -bpy.ops.object.transform_apply(location=True, rotation=True, scale=True) -``` - -## Mesh Creation (bmesh) - -```python -import bmesh - -# Create mesh from scratch -mesh = bpy.data.meshes.new('CustomMesh') -obj = bpy.data.objects.new('CustomObject', mesh) -bpy.context.collection.objects.link(obj) - -bm = bmesh.new() -# Add vertices -v1 = bm.verts.new((0, 0, 0)) -v2 = bm.verts.new((1, 0, 0)) -v3 = bm.verts.new((0.5, 1, 0)) -bm.faces.new((v1, v2, v3)) -bm.to_mesh(mesh) -bm.free() -``` - -## Materials (Principled BSDF) - -```python -# Create material -mat = bpy.data.materials.new('MyMat') -mat.use_nodes = True -nodes = mat.node_tree.nodes -links = mat.node_tree.links - -principled = nodes['Principled BSDF'] -principled.inputs['Base Color'].default_value = (0.8, 0.1, 0.1, 1.0) -principled.inputs['Metallic'].default_value = 0.9 -principled.inputs['Roughness'].default_value = 0.1 - -# Assign to object -obj = bpy.data.objects['Cube'] -obj.data.materials.append(mat) - -# Emission material -mat = bpy.data.materials.new('GlowMat') -mat.use_nodes = True -nodes = mat.node_tree.nodes -links = mat.node_tree.links -nodes.clear() -output = nodes.new('ShaderNodeOutputMaterial') -emission = nodes.new('ShaderNodeEmission') -emission.inputs['Color'].default_value = (0.0, 1.0, 0.5, 1.0) -emission.inputs['Strength'].default_value = 5.0 -links.new(emission.outputs[0], output.inputs[0]) -obj.data.materials.append(mat) - -# Glass material -mat = bpy.data.materials.new('GlassMat') -mat.use_nodes = True -principled = mat.node_tree.nodes['Principled BSDF'] -principled.inputs['Transmission Weight'].default_value = 1.0 # Blender 4.x -principled.inputs['IOR'].default_value = 1.45 -principled.inputs['Roughness'].default_value = 0.0 -``` - -## Modifiers - -```python -obj = bpy.data.objects['Cube'] - -# Subdivision Surface -mod = obj.modifiers.new('Subdiv', 'SUBSURF') -mod.levels = 2 -mod.render_levels = 3 - -# Solidify -mod = obj.modifiers.new('Solidify', 'SOLIDIFY') -mod.thickness = 0.05 - -# Boolean -mod = obj.modifiers.new('Bool', 'BOOLEAN') -mod.operation = 'DIFFERENCE' -mod.object = bpy.data.objects['BoolCutter'] - -# Array -mod = obj.modifiers.new('Array', 'ARRAY') -mod.count = 5 -mod.relative_offset_displace = (1.2, 0, 0) - -# Apply modifier -bpy.context.view_layer.objects.active = obj -bpy.ops.object.modifier_apply(modifier='Subdiv') -``` - -## Camera & Lighting - -```python -# Create camera -bpy.ops.object.camera_add(location=(7, -7, 5)) -cam = bpy.context.active_object -cam.rotation_euler = (math.radians(63), 0, math.radians(45)) -bpy.context.scene.camera = cam - -# Camera settings -cam.data.lens = 50 # focal length mm -cam.data.clip_start = 0.1 -cam.data.clip_end = 1000 - -# Point light -bpy.ops.object.light_add(type='POINT', location=(3, 3, 5)) -light = bpy.context.active_object -light.data.energy = 1000 # watts -light.data.color = (1.0, 0.9, 0.8) - -# Sun light -bpy.ops.object.light_add(type='SUN', rotation=(math.radians(45), 0, 0)) -sun = bpy.context.active_object -sun.data.energy = 3 - -# HDRI world lighting -world = bpy.context.scene.world -if not world: - world = bpy.data.worlds.new('World') - bpy.context.scene.world = world -world.use_nodes = True -nodes = world.node_tree.nodes -links = world.node_tree.links -nodes.clear() -output = nodes.new('ShaderNodeOutputWorld') -bg = nodes.new('ShaderNodeBackground') -env = nodes.new('ShaderNodeTexEnvironment') -env.image = bpy.data.images.load('/path/to/hdri.hdr') -links.new(env.outputs[0], bg.inputs[0]) -links.new(bg.outputs[0], output.inputs[0]) -``` - -## Rendering - -```python -scene = bpy.context.scene - -# Resolution -scene.render.resolution_x = 1920 -scene.render.resolution_y = 1080 -scene.render.resolution_percentage = 100 - -# Output -scene.render.filepath = '/tmp/render.png' -scene.render.image_settings.file_format = 'PNG' # PNG, JPEG, OPEN_EXR - -# Engine -scene.render.engine = 'CYCLES' # or 'BLENDER_EEVEE' (5.x) / 'BLENDER_EEVEE_NEXT' (4.x) - -# Cycles settings -scene.cycles.samples = 128 -scene.cycles.use_denoising = True - -# Render -bpy.ops.render.render(write_still=True) - -# Animation render -scene.frame_start = 1 -scene.frame_end = 250 -scene.render.filepath = '/tmp/anim_' -scene.render.image_settings.file_format = 'PNG' -bpy.ops.render.render(animation=True) -``` - -## Animation (Keyframes) - -```python -obj = bpy.data.objects['Cube'] -scene = bpy.context.scene - -# Set keyframe at frame 1 -scene.frame_set(1) -obj.location = (0, 0, 0) -obj.keyframe_insert(data_path='location', frame=1) - -# Set keyframe at frame 60 -scene.frame_set(60) -obj.location = (5, 0, 3) -obj.keyframe_insert(data_path='location', frame=60) - -# Rotation keyframe -obj.rotation_euler = (0, 0, math.radians(360)) -obj.keyframe_insert(data_path='rotation_euler', frame=60) - -# Material keyframe -mat = obj.data.materials[0] -principled = mat.node_tree.nodes['Principled BSDF'] -principled.inputs['Base Color'].default_value = (1, 0, 0, 1) -principled.inputs['Base Color'].keyframe_insert(data_path='default_value', frame=1) -principled.inputs['Base Color'].default_value = (0, 0, 1, 1) -principled.inputs['Base Color'].keyframe_insert(data_path='default_value', frame=60) -``` - -## Collections - -```python -# Create collection -col = bpy.data.collections.new('MyCollection') -bpy.context.scene.collection.children.link(col) - -# Move object to collection -col.objects.link(obj) -bpy.context.scene.collection.objects.unlink(obj) - -# Hide collection -col.hide_viewport = True -col.hide_render = True -``` diff --git a/optional-skills/creative/blender-mcp/references/pitfalls.md b/optional-skills/creative/blender-mcp/references/pitfalls.md deleted file mode 100644 index 7d4ee6ebec1ad..0000000000000 --- a/optional-skills/creative/blender-mcp/references/pitfalls.md +++ /dev/null @@ -1,133 +0,0 @@ -# Blender MCP — Pitfalls & Lessons Learned - -All interaction goes through the blender MCP tools (`hermes mcp install -blender`): `get_scene_info`, `get_object_info`, `get_viewport_screenshot`, -and `execute_blender_code` for arbitrary bpy Python. - -## Setup & Connection - -### 1. The addon bridge must be started BEFORE the tools work - -The Blender MCP addon opens its local bridge socket only when you click -"Connect to Claude" in the BlenderMCP sidebar tab (N-panel). If the MCP -tools error with "connection refused", the addon isn't connected — fix that -in Blender, don't retry the tool. - -**Verify the bridge is up:** `lsof -i :9876 -P -n | grep LISTEN` - -### 2. Port 9876 is the addon's default — check for conflicts - -Other services may already use 9876. If the tools fail but Blender is -running with the addon started, check with lsof. The port is configurable -in the BlenderMCP addon UI panel. - -### 3. Addon installation requires user interaction - -Blender addon installation requires the GUI: Edit > Preferences > Add-ons > -Install. The agent cannot automate this. Provide the addon.py path and let -the user install it. - -## Python Execution (`execute_blender_code`) - -### 4. Only bpy and math are in the namespace - -The code runs in a namespace with only `bpy` and `math`. If you need os, -json, bmesh, mathutils, etc., import them inside the code: - -```python -import bmesh -bm = bmesh.new() -... -``` - -### 5. Code result is always empty in Blender 5.x - -The addon returns `{"executed": true, "result": ""}` for ALL code — the -eval result is not captured in Blender 5.x. To get values out: -- Use `get_scene_info` or `get_object_info` for queries -- Write results to a temp file and read back: - -```python -import json -open('/tmp/result.json', 'w').write(json.dumps([o.name for o in bpy.data.objects])) -``` - -### 6. Errors come back as error strings — always check - -The addon catches exceptions and returns them as error text rather than -crashing. Check the tool result for an error before assuming the code ran. - -### 7. bpy.ops require correct context - -Many `bpy.ops` functions require the right UI context, which differs when -executing through the bridge. Prefer direct data manipulation: - -```python -# Prefer data API over ops -bpy.data.objects.remove(bpy.data.objects['Cube'], do_unlink=True) -``` - -## Objects & Scene - -### 8. Default scene has Cube, Light, Camera - -New Blender files start with a Cube at (0,0,0), a Light, and a Camera. -Clear them before building. - -### 9. Object names are unique — Blender auto-renames duplicates - -Creating an object named "Cube" when one already exists results in -"Cube.001". Always check the actual name via `get_scene_info`. - -### 10. Degrees vs radians - -The addon's own object-creation commands take degrees and convert -internally, but bpy code in `execute_blender_code` uses radians. Be careful -about the distinction. - -## Materials - -### 11. Principled BSDF is the default shader - -Materials created by the addon use Principled BSDF. For other shader types, -build the node tree manually in `execute_blender_code`. - -### 12. Color is RGBA 0-1, not RGB 0-255 - -Material colors use floating-point RGBA in the 0.0-1.0 range. - -## Rendering - -### 13. Render blocks the bridge — expect long calls - -Rendering is synchronous; the tool call won't return until the render -finishes. Expect renders to take far longer than other calls. - -### 14. Engine name varies by Blender version - -In Blender 5.x, EEVEE is `'BLENDER_EEVEE'` (not `'BLENDER_EEVEE_NEXT'`, -which was Blender 4.x). Discover available engines at runtime: - -```python -import json -open('/tmp/engines.json', 'w').write(json.dumps( - list(bpy.types.RenderSettings.bl_rna.properties['engine'].enum_items.keys()))) -``` - -Known engine names: `BLENDER_EEVEE`, `BLENDER_WORKBENCH`, `CYCLES` - -### 15. GPU rendering requires explicit setup on macOS - -Use METAL compute device type on Apple Silicon. Use CUDA or OPTIX on NVIDIA. - -## Reliability - -### 16. All state lives in Blender's scene data - -Each tool call is independent — there is no session state in the bridge. -Anything you need later must exist in the scene (or a file you wrote). - -### 17. Blender crash loses the bridge - -If Blender crashes, relaunch it, re-enable the addon, and click "Connect to -Claude" again. Save frequently (`bpy.ops.wm.save_mainfile()`). diff --git a/optional-skills/creative/blender-mcp/references/recipes.md b/optional-skills/creative/blender-mcp/references/recipes.md deleted file mode 100644 index b3dad83165e53..0000000000000 --- a/optional-skills/creative/blender-mcp/references/recipes.md +++ /dev/null @@ -1,223 +0,0 @@ -# Blender Recipes - -Common workflows assembled from the bpy API building blocks. - -## Recipe 1: Low-Poly Landscape - -```python -import bpy, bmesh, math, random - -# Clear scene -for obj in list(bpy.data.objects): bpy.data.objects.remove(obj, do_unlink=True) - -# Create subdivided plane -bpy.ops.mesh.primitive_plane_add(size=20) -plane = bpy.context.active_object -plane.name = 'Terrain' - -# Subdivide -mod = plane.modifiers.new('Subdiv', 'SUBSURF') -mod.levels = 5 -mod.subdivision_type = 'SIMPLE' -bpy.context.view_layer.objects.active = plane -bpy.ops.object.modifier_apply(modifier='Subdiv') - -# Displace vertices for terrain -bpy.ops.object.mode_set(mode='EDIT') -bm = bmesh.from_edit_mesh(plane.data) -random.seed(42) -for v in bm.verts: - v.co.z = random.gauss(0, 0.5) * (1 - abs(v.co.x)/10) * (1 - abs(v.co.y)/10) -bmesh.update_edit_mesh(plane.data) -bpy.ops.object.mode_set(mode='OBJECT') - -# Green material -mat = bpy.data.materials.new('Grass') -mat.use_nodes = True -mat.node_tree.nodes['Principled BSDF'].inputs['Base Color'].default_value = (0.15, 0.4, 0.1, 1) -mat.node_tree.nodes['Principled BSDF'].inputs['Roughness'].default_value = 0.9 -plane.data.materials.append(mat) - -# Sun light -bpy.ops.object.light_add(type='SUN', rotation=(math.radians(45), 0, math.radians(30))) -bpy.context.active_object.data.energy = 3 - -# Camera -bpy.ops.object.camera_add(location=(12, -12, 8)) -cam = bpy.context.active_object -cam.rotation_euler = (math.radians(55), 0, math.radians(45)) -bpy.context.scene.camera = cam -``` - -## Recipe 2: Glass Sphere on Reflective Plane - -```python -import bpy, math - -for obj in list(bpy.data.objects): bpy.data.objects.remove(obj, do_unlink=True) - -# Reflective floor -bpy.ops.mesh.primitive_plane_add(size=20) -floor = bpy.context.active_object -mat_floor = bpy.data.materials.new('Floor') -mat_floor.use_nodes = True -p = mat_floor.node_tree.nodes['Principled BSDF'] -p.inputs['Base Color'].default_value = (0.02, 0.02, 0.02, 1) -p.inputs['Metallic'].default_value = 1.0 -p.inputs['Roughness'].default_value = 0.05 -floor.data.materials.append(mat_floor) - -# Glass sphere -bpy.ops.mesh.primitive_uv_sphere_add(radius=1.5, location=(0, 0, 1.5), segments=64, ring_count=32) -sphere = bpy.context.active_object -mod = sphere.modifiers.new('Smooth', 'SUBSURF') -mod.levels = 2 -mat_glass = bpy.data.materials.new('Glass') -mat_glass.use_nodes = True -p = mat_glass.node_tree.nodes['Principled BSDF'] -p.inputs['Transmission Weight'].default_value = 1.0 -p.inputs['IOR'].default_value = 1.45 -p.inputs['Roughness'].default_value = 0.0 -sphere.data.materials.append(mat_glass) - -# Three-point lighting -bpy.ops.object.light_add(type='AREA', location=(4, -3, 5)) -bpy.context.active_object.data.energy = 500 -bpy.context.active_object.data.size = 3 - -bpy.ops.object.light_add(type='AREA', location=(-4, -2, 3)) -bpy.context.active_object.data.energy = 200 -bpy.context.active_object.data.size = 2 - -bpy.ops.object.light_add(type='AREA', location=(0, 4, 2)) -bpy.context.active_object.data.energy = 100 -bpy.context.active_object.data.size = 4 - -# Camera -bpy.ops.object.camera_add(location=(5, -5, 3)) -cam = bpy.context.active_object -cam.rotation_euler = (math.radians(70), 0, math.radians(45)) -bpy.context.scene.camera = cam - -# Cycles for glass -bpy.context.scene.render.engine = 'CYCLES' -bpy.context.scene.cycles.samples = 256 -``` - -## Recipe 3: Procedural Donut (Simplified) - -```python -import bpy, math - -for obj in list(bpy.data.objects): bpy.data.objects.remove(obj, do_unlink=True) - -# Torus (donut body) -bpy.ops.mesh.primitive_torus_add( - major_radius=1.0, minor_radius=0.4, - major_segments=48, minor_segments=24 -) -donut = bpy.context.active_object -donut.name = 'Donut' - -# Subdivision for smoothness -mod = donut.modifiers.new('Subdiv', 'SUBSURF') -mod.levels = 2 - -# Donut material (warm brown) -mat = bpy.data.materials.new('DonutMat') -mat.use_nodes = True -p = mat.node_tree.nodes['Principled BSDF'] -p.inputs['Base Color'].default_value = (0.45, 0.22, 0.08, 1.0) -p.inputs['Roughness'].default_value = 0.7 -p.inputs['Subsurface Weight'].default_value = 0.3 -donut.data.materials.append(mat) - -# Icing (duplicate top half, scale up slightly) -bpy.ops.mesh.primitive_torus_add( - major_radius=1.02, minor_radius=0.42, - major_segments=48, minor_segments=24 -) -icing = bpy.context.active_object -icing.name = 'Icing' - -# Pink icing material -mat_icing = bpy.data.materials.new('IcingMat') -mat_icing.use_nodes = True -p = mat_icing.node_tree.nodes['Principled BSDF'] -p.inputs['Base Color'].default_value = (0.9, 0.4, 0.5, 1.0) -p.inputs['Roughness'].default_value = 0.3 -p.inputs['Coat Weight'].default_value = 0.5 -icing.data.materials.append(mat_icing) -``` - -## Recipe 4: Turntable Animation - -```python -import bpy, math - -# Assume scene already has objects - -# Create empty as rotation center -bpy.ops.object.empty_add(location=(0, 0, 0)) -pivot = bpy.context.active_object -pivot.name = 'TurntablePivot' - -# Parent camera to pivot -cam = bpy.data.objects.get('Camera') -if cam: - cam.parent = pivot - cam.location = (7, 0, 3) - cam.rotation_euler = (math.radians(75), 0, math.radians(90)) - -# Animate rotation -scene = bpy.context.scene -scene.frame_start = 1 -scene.frame_end = 120 # 5 seconds at 24fps - -pivot.rotation_euler = (0, 0, 0) -pivot.keyframe_insert(data_path='rotation_euler', frame=1) -pivot.rotation_euler = (0, 0, math.radians(360)) -pivot.keyframe_insert(data_path='rotation_euler', frame=121) - -# Make rotation linear (not eased) -for fc in pivot.animation_data.action.fcurves: - for kp in fc.keyframe_points: - kp.interpolation = 'LINEAR' - -# Render settings -scene.render.filepath = '/tmp/turntable_' -scene.render.image_settings.file_format = 'PNG' -scene.render.resolution_x = 1080 -scene.render.resolution_y = 1080 -``` - -## Recipe 5: Render to File and Verify - -```python -import bpy, os - -scene = bpy.context.scene -scene.render.resolution_x = 1920 -scene.render.resolution_y = 1080 -scene.render.filepath = '/tmp/blender_render.png' -scene.render.image_settings.file_format = 'PNG' - -# Use Cycles for quality -scene.render.engine = 'CYCLES' -scene.cycles.samples = 128 -scene.cycles.use_denoising = True - -# Render -bpy.ops.render.render(write_still=True) - -# Verify -result = os.path.exists('/tmp/blender_render.png') -``` - -Then from the agent, view the render: -```python -# After execute_blender_code returns, verify and view -from hermes_tools import terminal -terminal("ls -la /tmp/blender_render.png") -# Use vision_analyze to inspect the render -``` diff --git a/optional-skills/creative/kanban-video-orchestrator/SKILL.md b/optional-skills/creative/kanban-video-orchestrator/SKILL.md index 3927386fe1f53..a0fea88787618 100644 --- a/optional-skills/creative/kanban-video-orchestrator/SKILL.md +++ b/optional-skills/creative/kanban-video-orchestrator/SKILL.md @@ -8,7 +8,7 @@ platforms: [linux, macos, windows] metadata: hermes: tags: [video, kanban, multi-agent, orchestration, production-pipeline] - related_skills: [ascii-video, manim-video, p5js, comfyui, touchdesigner-mcp, blender-mcp, pixel-art, ascii-art, songwriting-and-ai-music, heartmula, songsee, youtube-content, claude-design, excalidraw, architecture-diagram, concept-diagrams, baoyu-comic, baoyu-infographic, humanizer, gif-search, meme-generation] + related_skills: [ascii-video, manim-video, p5js, comfyui, touchdesigner-mcp, pixel-art, ascii-art, songwriting-and-ai-music, heartmula, songsee, youtube-content, claude-design, excalidraw, architecture-diagram, concept-diagrams, baoyu-comic, baoyu-infographic, humanizer, gif-search, meme-generation] credits: | The single-project workspace layout, profile-config patching pattern, SOUL.md-per-profile model, TEAM.md task-graph convention, and @@ -33,7 +33,7 @@ This skill does **not** render anything itself. It is a meta-pipeline that: The actual rendering happens inside the kanban once it's running, via whichever existing skills + tools fit the scenes — `ascii-video`, `manim-video`, `p5js`, -`comfyui`, `touchdesigner-mcp`, `blender-mcp`, `songwriting-and-ai-music`, +`comfyui`, `touchdesigner-mcp`, `songwriting-and-ai-music`, `heartmula`, external APIs, or plain Python with PIL + ffmpeg. ## When NOT to use this skill diff --git a/optional-skills/creative/kanban-video-orchestrator/references/examples.md b/optional-skills/creative/kanban-video-orchestrator/references/examples.md index 2b6beb8b37c1d..9441ba2473a47 100644 --- a/optional-skills/creative/kanban-video-orchestrator/references/examples.md +++ b/optional-skills/creative/kanban-video-orchestrator/references/examples.md @@ -216,7 +216,7 @@ When the user describes a video, look for these signals to map to an example: - **"Audio-reactive", "real-time", "installation"** → Example 6 (TouchDesigner) - **Comic-style narrative** → use `renderer-comic` (`baoyu-comic` skill) - **Retro game / pixel-art aesthetic** → use `renderer-pixel` (`pixel-art` skill) -- **3D scene, photoreal environment** → use `renderer-3d` (`blender-mcp`) +- **3D scene, photoreal environment** → use `renderer-3d` (Blender via `blender -b` scripting) - **Generative art, particle system, shader** → use `renderer-p5js` (`p5js`) - **AI-generated photoreal stills + animation** → use `renderer-comfyui` (`comfyui`) for both stills and image-to-video diff --git a/optional-skills/creative/kanban-video-orchestrator/references/role-archetypes.md b/optional-skills/creative/kanban-video-orchestrator/references/role-archetypes.md index 1d13b7084165b..596ffa782ed9a 100644 --- a/optional-skills/creative/kanban-video-orchestrator/references/role-archetypes.md +++ b/optional-skills/creative/kanban-video-orchestrator/references/role-archetypes.md @@ -117,7 +117,7 @@ instead of overloading one. Each loads a different creative skill. | `renderer-p5js` | `p5js` | Generative art, particles, shaders, organic motion, web-canvas content | | `renderer-comfyui` | `comfyui` | AI-generated stills + video using local ComfyUI workflows (img-to-img, img-to-video, etc.) | | `renderer-touchdesigner` | `touchdesigner-mcp` | Real-time, audio-reactive, installation art, VJ-style content | -| `renderer-3d` | `blender-mcp` *(optional)* | 3D modeling, animation, photoreal environments, character animation | +| `renderer-3d` | Blender (`blender -b` scripting) | 3D modeling, animation, photoreal environments, character animation | | `renderer-pixel` | `pixel-art` | Retro game aesthetic with era-correct palettes | | `renderer-comic` | `baoyu-comic` | Knowledge-comic style narrative scenes | | `renderer-meme` | `meme-generation` *(optional)* | Meme-style stills for satirical/social content | diff --git a/optional-skills/creative/kanban-video-orchestrator/references/tool-matrix.md b/optional-skills/creative/kanban-video-orchestrator/references/tool-matrix.md index 11e2c3d9d6f4e..a80f4d00ac2f0 100644 --- a/optional-skills/creative/kanban-video-orchestrator/references/tool-matrix.md +++ b/optional-skills/creative/kanban-video-orchestrator/references/tool-matrix.md @@ -17,7 +17,6 @@ called from the terminal toolset; they don't appear in `always_load`. | `p5js` | p5.js sketches — generative art, shaders, interactive, 3D | Renderer for generative art, particle systems, organic motion, web-canvas content | | `comfyui` | Generate images, video, audio with ComfyUI workflows (image-to-image, image-to-video, etc.) | image-generator, image-to-video-generator, or general renderer for AI-generated content | | `touchdesigner-mcp` | Control a running TouchDesigner instance — real-time visuals, audio-reactive installation art, VJ | Renderer for real-time/audio-reactive content; installation art; live performance | -| `blender-mcp` *(optional)* | Control Blender 4.3+ via MCP — 3D modeling, animation, rendering | Renderer for 3D scenes, photoreal environments, character animation | | `pixel-art` | Pixel art with era palettes (NES, Game Boy, PICO-8) | Renderer for retro game aesthetic; concept artist for pixel-style frames | | `baoyu-comic` | Knowledge-comic generation (educational, biography, tutorial) | Renderer for comic-style narrative; explainer in panel form | | `baoyu-infographic` | Infographic generation | Renderer for data-driven explainer scenes | @@ -74,7 +73,7 @@ them directly. | Suno API or web | Track composition (paired with `songwriting-and-ai-music`) | music-supervisor | | Remotion CLI (`npx remotion render`) | React-based motion graphics | renderer-motion-graphics | | Manim CE (`manim`) | Math animation render (driven by `manim-video` skill's recipes) | renderer-manim | -| Blender (`blender -b`) | 3D rendering (alternative to `blender-mcp`) | renderer-3d | +| Blender (`blender -b`) | 3D rendering (headless scripting) | renderer-3d | ## Built-in Hermes tools for media review @@ -164,7 +163,6 @@ skills: # - manim-video (math/explainer) # - p5js (generative) # - comfyui (AI-generated visuals) - # - blender-mcp (3D) # - touchdesigner-mcp (real-time/installation) ``` @@ -183,7 +181,6 @@ skills: # - p5js (renderer-p5js) # - comfyui (renderer-comfyui — img/video AI gen) # - touchdesigner-mcp (renderer-touchdesigner) - # - blender-mcp (renderer-3d) # - pixel-art (renderer-pixel) # - baoyu-comic (renderer-comic) # - meme-generation (renderer-meme) diff --git a/optional-skills/creative/unreal-mcp/SKILL.md b/optional-skills/creative/unreal-mcp/SKILL.md index aa5e2e9e822cd..2d1dad0015b21 100644 --- a/optional-skills/creative/unreal-mcp/SKILL.md +++ b/optional-skills/creative/unreal-mcp/SKILL.md @@ -10,7 +10,7 @@ platforms: [linux, macos, windows] metadata: hermes: tags: [unreal, unreal-engine, ue5, 3d, mcp, scenes, cinematics, lighting, gamedev] - related_skills: [blender-mcp] + related_skills: [] --- # Unreal Engine MCP Skill @@ -33,7 +33,7 @@ editor. Works for single actions ("make the sun golden hour") and for complete multi-step projects ("build me a moody forest clearing with a campfire and render a shot of it"). -Don't use for: DCC-style mesh modeling/sculpting (use `blender-mcp` and +Don't use for: DCC-style mesh modeling/sculpting (model in Blender and import the result), or for editing Unreal C++ project source (that's normal code work — use the terminal; this skill is about the live editor). diff --git a/optional-skills/creative/unreal-mcp/references/tool-surface.md b/optional-skills/creative/unreal-mcp/references/tool-surface.md index 974708a151827..a375e26695a35 100644 --- a/optional-skills/creative/unreal-mcp/references/tool-surface.md +++ b/optional-skills/creative/unreal-mcp/references/tool-surface.md @@ -167,7 +167,7 @@ yes; author new geometry, no. The supported route to parametric geometry is a custom Python toolset wrapping **Geometry Script** (`UDynamicMesh`: append box/cylinder/sphere, booleans, then `Create New Static Mesh Asset from Mesh` to bake an `SM_` asset). For organic/sculpted meshes, model in -Blender (`blender-mcp` skill) and import. +Blender and import. First-session move: `list_toolsets`, then `describe_toolset` each group you plan to use, and keep those schemas in working memory for the session. diff --git a/website/docs/reference/optional-skills-catalog.md b/website/docs/reference/optional-skills-catalog.md index a73ceadcbd6b9..44fd6c1379744 100644 --- a/website/docs/reference/optional-skills-catalog.md +++ b/website/docs/reference/optional-skills-catalog.md @@ -58,7 +58,6 @@ hermes skills uninstall | [**audiocraft-audio-generation**](/docs/user-guide/skills/optional/creative/creative-audiocraft-audio-generation) | AudioCraft: MusicGen text-to-music, AudioGen text-to-sound. | | [**baoyu-article-illustrator**](/docs/user-guide/skills/optional/creative/creative-baoyu-article-illustrator) | Article illustrations: type × style × palette consistency. | | [**baoyu-comic**](/docs/user-guide/skills/optional/creative/creative-baoyu-comic) | Knowledge comics (知识漫画): educational, biography, tutorial. | -| [**blender-mcp**](/docs/user-guide/skills/optional/creative/creative-blender-mcp) | Drive Blender via the catalog blender MCP, with bpy recipes. | | [**concept-diagrams**](/docs/user-guide/skills/optional/creative/creative-concept-diagrams) | Generate flat, minimal educational SVG visuals as HTML. | | [**creative-ideation**](/docs/user-guide/skills/optional/creative/creative-creative-ideation) | Generate ideas via named methods from creative practice. | | [**heartmula**](/docs/user-guide/skills/optional/creative/creative-heartmula) | HeartMuLa: Suno-like song generation from lyrics + tags. | diff --git a/website/docs/user-guide/skills/optional/creative/creative-blender-mcp.md b/website/docs/user-guide/skills/optional/creative/creative-blender-mcp.md deleted file mode 100644 index d6206c2f649a1..0000000000000 --- a/website/docs/user-guide/skills/optional/creative/creative-blender-mcp.md +++ /dev/null @@ -1,160 +0,0 @@ ---- -title: "Blender Mcp — Drive Blender via the catalog blender MCP, with bpy recipes" -sidebar_label: "Blender Mcp" -description: "Drive Blender via the catalog blender MCP, with bpy recipes" ---- - -{/* This page is auto-generated from the skill's SKILL.md by website/scripts/generate-skill-docs.py. Edit the source SKILL.md, not this page. */} - -# Blender Mcp - -Drive Blender via the catalog blender MCP, with bpy recipes. - -## Skill metadata - -| | | -|---|---| -| Source | Optional — install with `hermes skills install official/creative/blender-mcp` | -| Path | `optional-skills/creative/blender-mcp` | -| Version | `2.1.0` | -| Author | alireza78a + kshitijk4poor + Hermes Agent | -| License | MIT | -| Platforms | linux, macos, windows | - -## Reference: full SKILL.md - -:::info -The following is the complete skill definition that Hermes loads when this skill is triggered. This is what the agent sees as instructions when the skill is active. -::: - -# Blender MCP Skill - -Companion skill for the `blender` entry in the Hermes MCP catalog. The MCP -server provides the connection to Blender; this skill teaches the bpy idioms -and pitfalls for driving it well. It does not cover Blender UI workflows — -everything here goes through the MCP tools against a live Blender session. - -## When to Use - -Use when the user wants to create or modify anything in a running Blender -instance: meshes, materials, animations, lighting, renders. Requires the -blender MCP server installed and a Blender desktop session with the addon -connected. - -## Prerequisites - -1. Install the MCP server from the Nous catalog (one-time): - - hermes mcp install blender - - This configures the pinned `blender-mcp` stdio server with the curated - tool set: `get_scene_info`, `get_object_info`, `get_viewport_screenshot`, - `execute_blender_code`. - -2. Install the addon inside Blender (one-time — the catalog entry's - post-install notes cover this too): - - Download https://raw.githubusercontent.com/ahujasid/blender-mcp/main/addon.py - - Blender > Edit > Preferences > Add-ons > Install... > select addon.py, - enable "Interface: Blender MCP". - -3. Every session: start Blender FIRST, press N in the viewport, open the - "BlenderMCP" tab, click "Connect to Claude" (starts the local bridge - socket). Then start your Hermes session so the MCP tools are loaded. - - The addon refuses to start under `blender -b` (background mode). On a - machine without a display, run Blender under a virtual one: - `xvfb-run blender`. GPU rendering works fine under Xvfb. - -## Quick Reference - -| MCP tool | Use for | -|---------------------------|--------------------------------------------| -| `get_scene_info` | List objects before touching the scene | -| `get_object_info` | Inspect one object (transform, materials) | -| `get_viewport_screenshot` | Visual check of what you built | -| `execute_blender_code` | Everything else — arbitrary bpy Python | - -Deeper material lives in the reference files (load on demand): - -| Reference | Contents | -|-----------|----------| -| `references/bpy-api.md` | Essential bpy operations: modeling, materials, modifiers, rendering | -| `references/recipes.md` | Complete working scenes: low-poly terrain, glass sphere, HDRI lighting, turntable animation | -| `references/pitfalls.md` | Hard-won lessons: empty code results in 5.x, ops-vs-data API, engine names by version | - -Optional asset-service tools (PolyHaven, Sketchfab, Hyper3D, Hunyuan3D) are -disabled by default. If the user has enabled a service in the addon panel, -opt into its tools with `hermes mcp configure blender`. - -## Procedure - -1. Call `get_scene_info` first — never assume the scene is empty. -2. Build with `execute_blender_code`, in small focused calls (one logical - step per call: add objects, then materials, then animation). Large - monolithic scripts hit the bridge timeout. -3. Verify visually with `get_viewport_screenshot` between major steps. -4. Render to an absolute path and tell the user where the file is. - -### Common bpy Patterns - -Clear scene: - - bpy.ops.object.select_all(action='SELECT') - bpy.ops.object.delete() - -Add mesh objects: - - bpy.ops.mesh.primitive_uv_sphere_add(radius=1, location=(0, 0, 0)) - bpy.ops.mesh.primitive_cube_add(size=2, location=(3, 0, 0)) - bpy.ops.mesh.primitive_cylinder_add(radius=0.5, depth=2, location=(-3, 0, 0)) - -Create and assign material: - - mat = bpy.data.materials.new(name="MyMat") - mat.use_nodes = True - bsdf = mat.node_tree.nodes.get("Principled BSDF") - bsdf.inputs["Base Color"].default_value = (R, G, B, 1.0) - bsdf.inputs["Roughness"].default_value = 0.3 - bsdf.inputs["Metallic"].default_value = 0.0 - obj.data.materials.append(mat) - -Keyframe animation: - - obj.location = (0, 0, 0) - obj.keyframe_insert(data_path="location", frame=1) - obj.location = (0, 0, 3) - obj.keyframe_insert(data_path="location", frame=60) - -Render to file: - - bpy.context.scene.render.filepath = "/tmp/render.png" - bpy.context.scene.render.engine = 'CYCLES' - bpy.ops.render.render(write_still=True) - -## Pitfalls - -- The blender MCP tools only exist if the server is installed and the session - started after install. If they're missing, run `hermes mcp install blender` - and start a new session. -- The addon bridge must be (re)connected inside Blender each Blender session - (N-panel > BlenderMCP > Connect). "Connection refused" from the tools means - Blender isn't running or the addon isn't connected — fix that, don't retry. -- Break complex scenes into multiple smaller `execute_blender_code` calls to - avoid bridge timeouts. -- Render output paths must be absolute (`/tmp/render.png`), not relative — - they resolve on the BLENDER host's filesystem, which matters if Hermes and - Blender run on different machines. -- `shade_smooth()` requires the object to be selected and in object mode. -- `execute_blender_code` runs arbitrary Python inside Blender with no sandbox - — same trust level as the `terminal` tool. Don't paste untrusted code into - it. -- Do NOT hand-roll raw TCP JSON to port 9876 from `execute_code` — that was - this skill's pre-MCP workaround. It bypasses the catalog's version pinning - and tool curation. The MCP tools are the supported path. - -## Verification - -- `get_scene_info` returns the expected object list after each build step. -- `get_viewport_screenshot` shows the scene you intended. -- After a render, confirm the output file exists and report its absolute - path to the user. diff --git a/website/docs/user-guide/skills/optional/creative/creative-kanban-video-orchestrator.md b/website/docs/user-guide/skills/optional/creative/creative-kanban-video-orchestrator.md index 2b556066353b9..6d3185eb80295 100644 --- a/website/docs/user-guide/skills/optional/creative/creative-kanban-video-orchestrator.md +++ b/website/docs/user-guide/skills/optional/creative/creative-kanban-video-orchestrator.md @@ -21,7 +21,7 @@ Plan and run multi-agent video production pipelines. | License | MIT | | Platforms | linux, macos, windows | | Tags | `video`, `kanban`, `multi-agent`, `orchestration`, `production-pipeline` | -| Related skills | [`ascii-video`](/docs/user-guide/skills/bundled/creative/creative-ascii-video), [`manim-video`](/docs/user-guide/skills/bundled/creative/creative-manim-video), [`p5js`](/docs/user-guide/skills/bundled/creative/creative-p5js), [`comfyui`](/docs/user-guide/skills/bundled/creative/creative-comfyui), [`touchdesigner-mcp`](/docs/user-guide/skills/bundled/creative/creative-touchdesigner-mcp), [`blender-mcp`](/docs/user-guide/skills/optional/creative/creative-blender-mcp), [`pixel-art`](/docs/user-guide/skills/optional/creative/creative-pixel-art), [`ascii-art`](/docs/user-guide/skills/bundled/creative/creative-ascii-art), [`songwriting-and-ai-music`](/docs/user-guide/skills/bundled/creative/creative-songwriting-and-ai-music), [`heartmula`](/docs/user-guide/skills/optional/creative/creative-heartmula), [`songsee`](/docs/user-guide/skills/bundled/media/media-songsee), [`youtube-content`](/docs/user-guide/skills/bundled/media/media-youtube-content), [`claude-design`](/docs/user-guide/skills/bundled/creative/creative-claude-design), [`excalidraw`](/docs/user-guide/skills/bundled/creative/creative-excalidraw), [`architecture-diagram`](/docs/user-guide/skills/bundled/creative/creative-architecture-diagram), [`concept-diagrams`](/docs/user-guide/skills/optional/creative/creative-concept-diagrams), [`baoyu-comic`](/docs/user-guide/skills/optional/creative/creative-baoyu-comic), [`baoyu-infographic`](/docs/user-guide/skills/bundled/creative/creative-baoyu-infographic), [`humanizer`](/docs/user-guide/skills/bundled/creative/creative-humanizer), [`gif-search`](/docs/user-guide/skills/bundled/media/media-gif-search), [`meme-generation`](/docs/user-guide/skills/optional/creative/creative-meme-generation) | +| Related skills | [`ascii-video`](/docs/user-guide/skills/bundled/creative/creative-ascii-video), [`manim-video`](/docs/user-guide/skills/bundled/creative/creative-manim-video), [`p5js`](/docs/user-guide/skills/bundled/creative/creative-p5js), [`comfyui`](/docs/user-guide/skills/bundled/creative/creative-comfyui), [`touchdesigner-mcp`](/docs/user-guide/skills/bundled/creative/creative-touchdesigner-mcp), [`pixel-art`](/docs/user-guide/skills/optional/creative/creative-pixel-art), [`ascii-art`](/docs/user-guide/skills/bundled/creative/creative-ascii-art), [`songwriting-and-ai-music`](/docs/user-guide/skills/bundled/creative/creative-songwriting-and-ai-music), [`heartmula`](/docs/user-guide/skills/optional/creative/creative-heartmula), [`songsee`](/docs/user-guide/skills/bundled/media/media-songsee), [`youtube-content`](/docs/user-guide/skills/bundled/media/media-youtube-content), [`claude-design`](/docs/user-guide/skills/bundled/creative/creative-claude-design), [`excalidraw`](/docs/user-guide/skills/bundled/creative/creative-excalidraw), [`architecture-diagram`](/docs/user-guide/skills/bundled/creative/creative-architecture-diagram), [`concept-diagrams`](/docs/user-guide/skills/optional/creative/creative-concept-diagrams), [`baoyu-comic`](/docs/user-guide/skills/optional/creative/creative-baoyu-comic), [`baoyu-infographic`](/docs/user-guide/skills/bundled/creative/creative-baoyu-infographic), [`humanizer`](/docs/user-guide/skills/bundled/creative/creative-humanizer), [`gif-search`](/docs/user-guide/skills/bundled/media/media-gif-search), [`meme-generation`](/docs/user-guide/skills/optional/creative/creative-meme-generation) | ## Reference: full SKILL.md @@ -45,7 +45,7 @@ This skill does **not** render anything itself. It is a meta-pipeline that: The actual rendering happens inside the kanban once it's running, via whichever existing skills + tools fit the scenes — `ascii-video`, `manim-video`, `p5js`, -`comfyui`, `touchdesigner-mcp`, `blender-mcp`, `songwriting-and-ai-music`, +`comfyui`, `touchdesigner-mcp`, `songwriting-and-ai-music`, `heartmula`, external APIs, or plain Python with PIL + ffmpeg. ## When NOT to use this skill diff --git a/website/docs/user-guide/skills/optional/creative/creative-unreal-mcp.md b/website/docs/user-guide/skills/optional/creative/creative-unreal-mcp.md index 7ffd9b9408a38..65aa94e9e1815 100644 --- a/website/docs/user-guide/skills/optional/creative/creative-unreal-mcp.md +++ b/website/docs/user-guide/skills/optional/creative/creative-unreal-mcp.md @@ -21,7 +21,6 @@ Automate Unreal Engine editor scenes, actors, and renders. | License | MIT | | Platforms | linux, macos, windows | | Tags | `unreal`, `unreal-engine`, `ue5`, `3d`, `mcp`, `scenes`, `cinematics`, `lighting`, `gamedev` | -| Related skills | [`blender-mcp`](/docs/user-guide/skills/optional/creative/creative-blender-mcp) | ## Reference: full SKILL.md @@ -49,7 +48,7 @@ editor. Works for single actions ("make the sun golden hour") and for complete multi-step projects ("build me a moody forest clearing with a campfire and render a shot of it"). -Don't use for: DCC-style mesh modeling/sculpting (use `blender-mcp` and +Don't use for: DCC-style mesh modeling/sculpting (model in Blender and import the result), or for editing Unreal C++ project source (that's normal code work — use the terminal; this skill is about the live editor). diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/optional-skills-catalog.md b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/optional-skills-catalog.md index 1bdc49e8a8897..7f6de290f7205 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/optional-skills-catalog.md +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/optional-skills-catalog.md @@ -53,7 +53,6 @@ hermes skills uninstall | 技能 | 描述 | |-------|-------------| | [**audiocraft-audio-generation**](/user-guide/skills/optional/creative/creative-audiocraft-audio-generation) | AudioCraft:MusicGen 文本转音乐、AudioGen 文本转音效。 | -| [**blender-mcp**](/user-guide/skills/optional/creative/creative-blender-mcp) | 通过 socket 连接 blender-mcp 插件,直接从 Hermes 控制 Blender。创建 3D 对象、材质、动画,并运行任意 Blender Python(bpy)代码。适用于用户希望在 Blender 中创建或修改任何内容的场景。 | | [**concept-diagrams**](/user-guide/skills/optional/creative/creative-concept-diagrams) | 生成扁平、极简、支持亮色/暗色模式的 SVG 图表,输出为独立 HTML 文件,采用统一的教育视觉语言,包含 9 种语义色阶、句首大写排版及自动暗色模式。最适合教育和说明类内容。 | | [**heartmula**](/user-guide/skills/optional/creative/creative-heartmula) | HeartMuLa:根据歌词 + 标签生成类 Suno 风格的歌曲。 | | [**hyperframes**](/user-guide/skills/optional/creative/creative-hyperframes) | 使用 HyperFrames 创建基于 HTML 的视频合成、动态标题卡、社交叠层、字幕访谈视频、音频响应视觉效果及着色器转场。HTML 是视频的唯一来源。适用于用户希望制作任何视频内容的场景。 | diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/skills/optional/creative/creative-blender-mcp.md b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/skills/optional/creative/creative-blender-mcp.md deleted file mode 100644 index a7f8ce676fe43..0000000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/skills/optional/creative/creative-blender-mcp.md +++ /dev/null @@ -1,135 +0,0 @@ ---- -title: "Blender Mcp — 通过 socket 连接 blender-mcp 插件,直接从 Hermes 控制 Blender" -sidebar_label: "Blender Mcp" -description: "通过 socket 连接 blender-mcp 插件,直接从 Hermes 控制 Blender" ---- - -{/* This page is auto-generated from the skill's SKILL.md by website/scripts/generate-skill-docs.py. Edit the source SKILL.md, not this page. */} - -# Blender Mcp - -通过 socket 连接 blender-mcp 插件,直接从 Hermes 控制 Blender。可创建 3D 对象、材质、动画,并运行任意 Blender Python(bpy)代码。当用户需要在 Blender 中创建或修改任何内容时使用。 - -## Skill 元数据 - -| | | -|---|---| -| 来源 | 可选 — 通过 `hermes skills install official/creative/blender-mcp` 安装 | -| 路径 | `optional-skills/creative/blender-mcp` | -| 版本 | `1.0.0` | -| 作者 | alireza78a | -| 平台 | linux, macos, windows | - -## 参考:完整 SKILL.md - -:::info -以下是 Hermes 在触发此 skill 时加载的完整 skill 定义。这是 agent 在 skill 激活时所看到的指令内容。 -::: - -# Blender MCP - -通过 TCP 端口 9876 上的 socket,从 Hermes 控制正在运行的 Blender 实例。 - -## 设置(一次性) - -### 1. 安装 Blender 插件 - - curl -sL https://raw.githubusercontent.com/ahujasid/blender-mcp/main/addon.py -o ~/Desktop/blender_mcp_addon.py - -在 Blender 中: - Edit > Preferences > Add-ons > Install > 选择 blender_mcp_addon.py - 启用 "Interface: Blender MCP" - -### 2. 在 Blender 中启动 socket 服务器 - -在 Blender 视口中按 N 键打开侧边栏。 -找到 "BlenderMCP" 标签页,点击 "Start Server"。 - -### 3. 验证连接 - - nc -z -w2 localhost 9876 && echo "OPEN" || echo "CLOSED" - -## 协议 - -通过 TCP 传输纯 UTF-8 JSON — 无长度前缀。 - -发送: {"type": "<command>", "params": {<kwargs>}} -接收: {"status": "success", "result": <value>} - {"status": "error", "message": "<reason>"} - -## 可用命令 - -| type | params | 说明 | -|-------------------------|-------------------|---------------------------------| -| execute_code | code (str) | 运行任意 bpy Python 代码 | -| get_scene_info | (无) | 列出场景中的所有对象 | -| get_object_info | object_name (str) | 获取特定对象的详细信息 | -| get_viewport_screenshot | (无) | 截取当前视口截图 | - -## Python 辅助函数 - -在 execute_code 工具调用中使用: - - import socket, json - - def blender_exec(code: str, host="localhost", port=9876, timeout=15): - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.connect((host, port)) - s.settimeout(timeout) - payload = json.dumps({"type": "execute_code", "params": {"code": code}}) - s.sendall(payload.encode("utf-8")) - buf = b"" - while True: - try: - chunk = s.recv(4096) - if not chunk: - break - buf += chunk - try: - json.loads(buf.decode("utf-8")) - break - except json.JSONDecodeError: - continue - except socket.timeout: - break - s.close() - return json.loads(buf.decode("utf-8")) - -## 常用 bpy 模式 - -### 清空场景 - bpy.ops.object.select_all(action='SELECT') - bpy.ops.object.delete() - -### 添加网格对象 - bpy.ops.mesh.primitive_uv_sphere_add(radius=1, location=(0, 0, 0)) - bpy.ops.mesh.primitive_cube_add(size=2, location=(3, 0, 0)) - bpy.ops.mesh.primitive_cylinder_add(radius=0.5, depth=2, location=(-3, 0, 0)) - -### 创建并指定材质 - mat = bpy.data.materials.new(name="MyMat") - mat.use_nodes = True - bsdf = mat.node_tree.nodes.get("Principled BSDF") - bsdf.inputs["Base Color"].default_value = (R, G, B, 1.0) - bsdf.inputs["Roughness"].default_value = 0.3 - bsdf.inputs["Metallic"].default_value = 0.0 - obj.data.materials.append(mat) - -### 关键帧动画 - obj.location = (0, 0, 0) - obj.keyframe_insert(data_path="location", frame=1) - obj.location = (0, 0, 3) - obj.keyframe_insert(data_path="location", frame=60) - -### 渲染到文件 - bpy.context.scene.render.filepath = "/tmp/render.png" - bpy.context.scene.render.engine = 'CYCLES' - bpy.ops.render.render(write_still=True) - -## 注意事项 - -- 运行前必须检查 socket 是否已开放(nc -z localhost 9876) -- 每次会话都需要在 Blender 内部启动插件服务器(N 面板 > BlenderMCP > Connect) -- 将复杂场景拆分为多个较小的 execute_code 调用,以避免超时 -- 渲染输出路径必须为绝对路径(/tmp/...),不能使用相对路径 -- `shade_smooth()` 要求对象已被选中且处于对象模式 \ No newline at end of file diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/skills/optional/creative/creative-kanban-video-orchestrator.md b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/skills/optional/creative/creative-kanban-video-orchestrator.md index 75a371cecb0cf..c44320a11db28 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/skills/optional/creative/creative-kanban-video-orchestrator.md +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/skills/optional/creative/creative-kanban-video-orchestrator.md @@ -8,7 +8,7 @@ description: "规划、搭建并监控由 Hermes Kanban 支撑的多智能体视 # Kanban Video Orchestrator -规划、搭建并监控由 Hermes Kanban 支撑的多智能体视频制作流水线。当用户想要制作**任何**类型的视频时使用本技能——叙事短片、产品/营销视频、MV、解说视频、ASCII/终端艺术、抽象/生成循环、漫画、3D、实时/装置艺术——且工作需要分解为专业角色(编剧、设计师、动画师、渲染师、配音、剪辑等)并通过 kanban 看板协调。执行自适应探索以明确需求范围,为所请求的风格设计合适的团队,生成用于创建 Hermes profiles 和初始 kanban 任务的安装脚本,然后协助监控执行过程并在任务卡住或失败时介入。将场景路由到适合每个节拍的 Hermes 渲染/音频/设计技能(`ascii-video`、`manim-video`、`p5js`、`comfyui`、`touchdesigner-mcp`、`blender-mcp`、`pixel-art`、`baoyu-comic`、`claude-design`、`excalidraw`、`songsee`、`heartmula`……)以及用于 TTS、图像生成和图像转视频的外部 API。 +规划、搭建并监控由 Hermes Kanban 支撑的多智能体视频制作流水线。当用户想要制作**任何**类型的视频时使用本技能——叙事短片、产品/营销视频、MV、解说视频、ASCII/终端艺术、抽象/生成循环、漫画、3D、实时/装置艺术——且工作需要分解为专业角色(编剧、设计师、动画师、渲染师、配音、剪辑等)并通过 kanban 看板协调。执行自适应探索以明确需求范围,为所请求的风格设计合适的团队,生成用于创建 Hermes profiles 和初始 kanban 任务的安装脚本,然后协助监控执行过程并在任务卡住或失败时介入。将场景路由到适合每个节拍的 Hermes 渲染/音频/设计技能(`ascii-video`、`manim-video`、`p5js`、`comfyui`、`touchdesigner-mcp`、`pixel-art`、`baoyu-comic`、`claude-design`、`excalidraw`、`songsee`、`heartmula`……)以及用于 TTS、图像生成和图像转视频的外部 API。 ## 技能元数据 @@ -21,7 +21,7 @@ description: "规划、搭建并监控由 Hermes Kanban 支撑的多智能体视 | 许可证 | MIT | | 平台 | linux, macos, windows | | 标签 | `video`, `kanban`, `multi-agent`, `orchestration`, `production-pipeline` | -| 相关技能 | [`ascii-video`](/user-guide/skills/bundled/creative/creative-ascii-video)、[`manim-video`](/user-guide/skills/bundled/creative/creative-manim-video)、[`p5js`](/user-guide/skills/bundled/creative/creative-p5js)、[`comfyui`](/user-guide/skills/bundled/creative/creative-comfyui)、[`touchdesigner-mcp`](/user-guide/skills/bundled/creative/creative-touchdesigner-mcp)、[`blender-mcp`](/user-guide/skills/optional/creative/creative-blender-mcp)、[`pixel-art`](/user-guide/skills/bundled/creative/creative-pixel-art)、[`ascii-art`](/user-guide/skills/bundled/creative/creative-ascii-art)、[`songwriting-and-ai-music`](/user-guide/skills/bundled/creative/creative-songwriting-and-ai-music)、[`heartmula`](/user-guide/skills/optional/creative/creative-heartmula)、[`songsee`](/user-guide/skills/bundled/media/media-songsee)、[`youtube-content`](/user-guide/skills/bundled/media/media-youtube-content)、[`claude-design`](/user-guide/skills/bundled/creative/creative-claude-design)、[`excalidraw`](/user-guide/skills/bundled/creative/creative-excalidraw)、[`architecture-diagram`](/user-guide/skills/bundled/creative/creative-architecture-diagram)、[`concept-diagrams`](/user-guide/skills/optional/creative/creative-concept-diagrams)、[`baoyu-comic`](/user-guide/skills/bundled/creative/creative-baoyu-comic)、[`baoyu-infographic`](/user-guide/skills/bundled/creative/creative-baoyu-infographic)、[`humanizer`](/user-guide/skills/bundled/creative/creative-humanizer)、[`gif-search`](/user-guide/skills/bundled/media/media-gif-search)、[`meme-generation`](/user-guide/skills/optional/creative/creative-meme-generation) | +| 相关技能 | [`ascii-video`](/user-guide/skills/bundled/creative/creative-ascii-video)、[`manim-video`](/user-guide/skills/bundled/creative/creative-manim-video)、[`p5js`](/user-guide/skills/bundled/creative/creative-p5js)、[`comfyui`](/user-guide/skills/bundled/creative/creative-comfyui)、[`touchdesigner-mcp`](/user-guide/skills/bundled/creative/creative-touchdesigner-mcp)、[`pixel-art`](/user-guide/skills/bundled/creative/creative-pixel-art)、[`ascii-art`](/user-guide/skills/bundled/creative/creative-ascii-art)、[`songwriting-and-ai-music`](/user-guide/skills/bundled/creative/creative-songwriting-and-ai-music)、[`heartmula`](/user-guide/skills/optional/creative/creative-heartmula)、[`songsee`](/user-guide/skills/bundled/media/media-songsee)、[`youtube-content`](/user-guide/skills/bundled/media/media-youtube-content)、[`claude-design`](/user-guide/skills/bundled/creative/creative-claude-design)、[`excalidraw`](/user-guide/skills/bundled/creative/creative-excalidraw)、[`architecture-diagram`](/user-guide/skills/bundled/creative/creative-architecture-diagram)、[`concept-diagrams`](/user-guide/skills/optional/creative/creative-concept-diagrams)、[`baoyu-comic`](/user-guide/skills/bundled/creative/creative-baoyu-comic)、[`baoyu-infographic`](/user-guide/skills/bundled/creative/creative-baoyu-infographic)、[`humanizer`](/user-guide/skills/bundled/creative/creative-humanizer)、[`gif-search`](/user-guide/skills/bundled/media/media-gif-search)、[`meme-generation`](/user-guide/skills/optional/creative/creative-meme-generation) | ## 参考:完整 SKILL.md @@ -41,7 +41,7 @@ description: "规划、搭建并监控由 Hermes Kanban 支撑的多智能体视 4. **交接**——移交给 director profile,由其通过 kanban 进行分解 5. **监控**——跟踪执行过程,在任务卡住或失败时协助介入 -实际渲染在 kanban 运行后在其内部完成,使用适合各场景的现有技能和工具——`ascii-video`、`manim-video`、`p5js`、`comfyui`、`touchdesigner-mcp`、`blender-mcp`、`songwriting-and-ai-music`、`heartmula`、外部 API,或使用 PIL + ffmpeg 的纯 Python。 +实际渲染在 kanban 运行后在其内部完成,使用适合各场景的现有技能和工具——`ascii-video`、`manim-video`、`p5js`、`comfyui`、`touchdesigner-mcp`、`songwriting-and-ai-music`、`heartmula`、外部 API,或使用 PIL + ffmpeg 的纯 Python。 ## 不适用本技能的情况 diff --git a/website/sidebars.ts b/website/sidebars.ts index 9d388b775d727..be7c116ccff11 100644 --- a/website/sidebars.ts +++ b/website/sidebars.ts @@ -376,7 +376,6 @@ const sidebars: SidebarsConfig = { 'user-guide/skills/optional/creative/creative-audiocraft-audio-generation', 'user-guide/skills/optional/creative/creative-baoyu-article-illustrator', 'user-guide/skills/optional/creative/creative-baoyu-comic', - 'user-guide/skills/optional/creative/creative-blender-mcp', 'user-guide/skills/optional/creative/creative-concept-diagrams', 'user-guide/skills/optional/creative/creative-creative-ideation', 'user-guide/skills/optional/creative/creative-heartmula',