Merge pull request #83404 from NousResearch/fix/blender-mcp-compromise
fix(security): remove blender MCP catalog entry and skill after upstream compromise
This commit is contained in:
commit
5b8cbd5ef2
|
|
@ -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.
|
||||
|
|
@ -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.
|
||||
|
|
@ -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
|
||||
```
|
||||
|
|
@ -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()`).
|
||||
|
|
@ -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
|
||||
```
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 |
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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).
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -58,7 +58,6 @@ hermes skills uninstall <skill-name>
|
|||
| [**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. |
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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).
|
||||
|
||||
|
|
|
|||
|
|
@ -53,7 +53,6 @@ hermes skills uninstall <skill-name>
|
|||
| 技能 | 描述 |
|
||||
|-------|-------------|
|
||||
| [**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 是视频的唯一来源。适用于用户希望制作任何视频内容的场景。 |
|
||||
|
|
|
|||
|
|
@ -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()` 要求对象已被选中且处于对象模式
|
||||
|
|
@ -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。
|
||||
|
||||
## 不适用本技能的情况
|
||||
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
|
|
|
|||
Loading…
Reference in New Issue