Перейти к основному содержимому

Blender Mcp

Управление Blender напрямую из VibeOS через сокетное подключение к аддону blender-mcp. Создание 3D-объектов, материалов, анимаций и выполнение произвольного Python-кода Blender (bpy). Используется, когда пользователь хочет создать или изменить что-либо в Blender.

Метаданные навыка​

ИсточникОпционально — установка через vibeos skills install official/creative/blender-mcp
Путьoptional-skills/creative/blender-mcp
Версия1.0.0
Авторalireza78a
Платформыlinux, macos, windows

Справочник: полный SKILL.md​

к сведению

Ниже приведено полное описание навыка, которое VibeOS загружает при его активации. Это те инструкции, которые видит агент, когда навык активен.

Blender MCP

Управление запущенным экземпляром Blender из VibeOS через сокет на TCP-порту 9876.

Настройка (однократно)​

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​

Нажмите N в окне просмотра Blender, чтобы открыть боковую панель. Найдите вкладку «BlenderMCP» и нажмите «Start Server».

3. Проверка подключения​

nc -z -w2 localhost 9876 && echo "OPEN" || echo "CLOSED"

Протокол​

Обычный UTF-8 JSON через TCP — без префикса длины.

Отправка: {"type": "<команда>", "params": {<kwargs>}} Получение: {"status": "success", "result": <значение>} {"status": "error", "message": "<причина>"}

Доступные команды​

typeparamsописание
execute_codecode (str)Выполнить произвольный bpy-код
get_scene_info(нет)Список всех объектов в сцене
get_object_infoobject_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()

Добавление mesh-объектов​

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)

Подводные камни​

  • Перед выполнением необходимо проверить, открыт ли сокет (nc -z localhost 9876)
  • Сервер аддона нужно запускать внутри Blender в каждой сессии (N-панель > BlenderMCP > Connect)
  • Разбивайте сложные сцены на несколько небольших вызовов execute_code, чтобы избежать тайм-аутов
  • Путь для вывода рендера должен быть абсолютным (/tmp/...), а не относительным
  • shade_smooth() требует, чтобы объект был выбран и находился в режиме объекта