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',