Blender MCP
공식Blender용 경량 MCP(Model Context Protocol) 서버입니다. Blender의 Python API와 자연어 인터페이스를 제공하여 문서 접근성을 개선하고, 사용자가 복잡한 설정을 탐색하고 이해할 수 있도록 돕습니다.
Blender MCP(으)로 무엇을 할 수 있나요?
- 씬 성능 분석 — 어시스턴트에게 카메라 뷰에서 화면 크기 대비 폴리곤 수가 가장 높은 오브젝트를 찾도록 요청합니다.
- 데이터 블록 이름 변경 — 오브젝트, 조명, 카메라, 텍스처 및 기타 데이터 블록에서 오타를 수정하거나 설명적인 명명 규칙을 적용합니다.
- 데이터 관계 질의 — 자연어를 사용하여 특정 재질을 사용하는 오브젝트나 데이터 블록이 어떻게 연결되어 있는지 질문합니다.
- 씬 문제 디버그 — 열려 있는 파일에서 폴리곤 수가 가장 높은 오브젝트, 비다양체 메시 또는 기타 일반적인 문제를 식별합니다.
- 지오메트리 노드 설정 문서화 — 노드 그룹의 기능과 구조를 설명하는 인라인 문서 프레임과 텍스트 데이터 블록을 생성합니다.
문서
Blender를 위한 경량 MCP (Model Context Protocol) 서버입니다. Blender의 Python API에 대한 자연어 인터페이스를 제공하여 문서 접근성을 개선하고 사용자가 복잡한 설정을 탐색하고 이해할 수 있도록 합니다.
아키텍처에 대한 기술적 세부 사항 및 문서는 소스 코드를 확인하세요.
보안 경고
이 MCP 서버는 데이터가 삭제되거나 원격 위치로 전송되는 것을 방지하는 보호 장치 없이 LLM이 생성한 코드를 Blender에서 실행합니다. 데이터를 안전하게 유지하려면 가상 머신이나 민감한 정보에 접근할 수 없는 시스템을 사용하는 것이 좋습니다.
설치
Blender에는 LLM에 연결하기 위한 내장 기능이 없습니다.
Blender가 LLM과 연결되려면 세 가지 외부 도구를 수동으로 다운로드, 설치 및 실행해야 합니다.
요구 사항:
- Blender 5.1 이상
- 애드온
- LLM 클라이언트
- MCP 서버
애드온
Blender 세션과 상호 작용하려면 MCP 서버 통합을 위한 특정 애드온을 설치해야 합니다.
Blender에 드래그 앤 드롭
…또는 디스크에서 다운로드하여 설치
Blender에 드래그 앤 드롭하는 경우 두 번 수행해야 합니다. 먼저 Blender Lab 저장소를 추가하고, 두 번째로 애드온 자체를 설치합니다. 이 방법을 사용하면 이 애드온의 새 버전이 출시될 때 업데이트 알림을 받을 수 있습니다.
LLM 클라이언트
MCP 서버는 잘 정의된 표준을 따르며 다양한 클라이언트와 호환됩니다. Llama.cpp 문서를 따르거나 원하는 LLM 클라이언트를 설치하세요.
MCP 서버
LLM 클라이언트 기능에 따라 MCP 서버를 설치하는 방법이 다릅니다.
- MCP 번들:
.mcpb파일을 지원하는 최신 클라이언트의 경우 릴리스 페이지에서 최신 패키지를 다운로드하세요. Llama.cpp는 아직 이를 지원하지 않습니다. - MCP 서버: 소스 코드에서 설치하려면 Llama.cpp 문서 또는 설정 지침을 확인하세요.
실행
LLM 클라이언트 내에서 MCP 서버를 설정한 후에는 Blender 장면을 탐색할 수 있습니다.
blender-mcp 서버를 실행하는 llama.cpp 웹 인터페이스.
예제 1: 장면 분석
MCP를 사용하여 성능 병목 현상에 대해 프로그래밍 방식으로 장면을 분석할 수 있습니다. 예를 들어 Classroom 데모 파일을 살펴보겠습니다.
Classroom 데모 파일.
이 장면은 Blender 벤치마크 파일 중 하나입니다. 이러한 파일이 벤치마크에 포함된 이유는 아티스트가 만든 실제 프로덕션 파일을 잘 대표하기 때문입니다. 그리고 최적화될 가능성이 있는 오브젝트를 포함할 수 있다는 것은 놀라운 일이 아닙니다.
폴리곤 수를 확인하는 것만으로도 충분할 때가 많지만, 최종 렌더에서 얼마나 크게 보이는지에 따라 폴리곤 수를 그래프로 표시하는 것이 훨씬 더 흥미롭습니다. 이는 다음 프롬프트로 얻을 수 있습니다.
Analyze the scene and list the outliers: objects with highest polygon count but smaller size from the camera point of view.
그래프로 표시된 결과 데이터는 나머지와 확연히 다른 두 오브젝트, 즉 alphabet와 coat 1을 명확하게 보여줍니다.
Classroom 데모 장면의 화면 영역당 폴리곤 수 그래프 분석.
alphabet 오브젝트는 20,000개의 폴리곤을 가지고 있습니다. 평평하게 배치되어 있기 때문에 최종 결과에 거의 영향을 주지 않고 텍스처로 대체할 수 있습니다. coat 1 오브젝트는 Subsurf 모디파이어로 인해 37,000개의 폴리곤을 가지고 있습니다. 시스템에서 메모리가 병목 현상인 경우 세분화 수준을 낮추면 장면이 가벼워질 수 있습니다.
알파벳은 장면 뒤쪽에 위치하여 텍스처로 쉽게 대체할 수 있습니다. 코트도 충분히 멀리 있어 메시를 단순화할 수 있습니다.
이러한 결과는 얼마나 신뢰할 수 있나요?
LLM이 반환한 초기 분석은 뷰포트에 영향을 미치는 모디파이어만 고려했습니다. coat 1 오브젝트에는 폴리곤 수를 두 배로 늘리는 Solidify 모디파이어가 있어 더욱 두드러집니다. 그리고 이 장면에는 Simplify가 활성화되어 있지 않았지만, 이 설정도 최종 분석에 영향을 미쳤을 것입니다.
예제 2: 다양한 프롬프트
다음은 테스트된 다른 사용 사례 중 일부입니다. 작동하려면 전체 "프롬프트" 내용을 붙여넣어야 합니다. 시작점으로 해당 데모 파일을 사용해야 합니다. 작업의 성공 여부는 사용된 모델에 따라 달라집니다.
| 사용 사례 | 프롬프트 | 데모 파일 | 결과 |
|---|---|---|---|
| 데이터 블록 이름 바꾸기: 오타 수정 | 현재 열려 있는 Blender 파일에서 모든 데이터 블록의 이름을 수정하여 오타를 제거합니다. 수정된 데이터 블록을 보고합니다. | Scattering Pebbles | GRP-rocks → GRP-pebble, LGT-Lights → LGT-lights, Compositing Nodetree → Compositing Node Tree |
| 데이터 블록 이름 바꾸기: 더 나은 이름 | 현재 열려 있는 Blender 파일에서 모든 데이터 블록에 대한 설명적인 이름을 제안하고 승인되면 적용합니다. | Scattering Pebbles | Camera → CAM-main, Area → LGT-sun-key, Area.001 → LGT-sun-fill, Area.002 → LGT-area-rim, GEO-pebble.001 → GEO-pebble-B, … |
| 자연어를 사용한 데이터 관계 쿼리 | pebbles 머티리얼을 사용하는 오브젝트는 무엇입니까? | Scattering Pebbles | 7개 오브젝트: GEO-pebble, GEO-pebble.001, GEO-pebble.002, GEO-pebble.003, GEO-pebble.004, GEO-pebble.005, GEO-pebble.006 |
| 장면 디버깅 | 이 파일에서 폴리곤 수가 가장 많은 오브젝트는 무엇입니까? 어떤 장면에도 링크되지 않은 오브젝트는 무시합니다. | Scattering Pebbles | 4,096개의 면을 가진 GEO-ground. |
| 지오메트리 노드 문서화 | 현재 열려 있는 Blender 파일에서 주요 지오메트리 노드 설정이 무엇을 하는지 설명합니다. 프레임 요소를 사용하여 인라인 문서를 추가합니다. 분석 결과가 포함된 텍스트 데이터 블록을 만듭니다. | Scattering Pebbles | 4개의 주요 색상 구분 프레임 + 설명이 포함된 텍스트 파일. |
아직 탐색되지 않은 다른 프롬프트:
- 모든 데이터 블록을 프랑스어에서 영어로 번역합니다.
- 내 메시가 아마추어에 의해 변형되지 않습니다. 어떻게 해결할 수 있습니까?
- 이 장면을 렌더링하는 동안 Blender의 메모리가 부족합니다. 어떻게 최적화할 수 있습니까?
- 이 메시에 이상한 셰이딩 아티팩트가 있습니다. 어떻게 해결할 수 있습니까?
- 잘못된 노멀을 가진 메시가 있는 오브젝트를 찾습니다.
- 균일하지 않게 변형된 메시 오브젝트가 있는지 장면을 확인합니다.
- 내보낸 비디오가 웹 브라우저에서 재생되지 않습니다. 어떤 설정을 변경해야 합니까?
- 나뭇가지를 만들고 디테일을 추가하는 데 어떤 스컬프트 브러시를 사용해야 합니까?
- 이미지를 SDR과 HDR로 모두 저장하도록 컴포지팅 노드를 설정합니다.
- 이 체크리스트를 확인합니다: 메시는 다양체여야 하고, 모든 오브젝트에는 머티리얼이 있어야 하며, 이름 지정은 규칙을 따라야 하고, 절대 경로가 없어야 합니다. … 데이터 블록 이름 바꾸기: 오타 수정
GRP-rocks → GRP-pebbles (장면에 바위가 아닌 자갈 오브젝트만 포함됨).
LGT-Lights → LGT-lights (일관되지 않은 대소문자).
Compositing Nodetree → Compositing Node Tree (Nodetree는 복합어 오류).
데이터 블록 이름 바꾸기: 더 나은 이름
오브젝트:
Camera→CAM-mainArea→LGT-sun-keyArea.001→LGT-sun-fillArea.002→LGT-area-rimGEO-pebble.001→GEO-pebble-BGEO-pebble.002→GEO-pebble-CGEO-pebble.003→GEO-pebble-DGEO-pebble.004→GEO-pebble-EGEO-pebble.005→GEO-pebble-FGEO-pebble.006→GEO-pebble-G
라이트 데이터 블록:
Area→LGT-sun-keyArea.001→LGT-sun-fillArea.002→LGT-area-rim
카메라 데이터 블록:
Camera→CAM-main
텍스처:
Texture→TEX-ground-cloudsTexture.001→TEX-ground-image
장면 및 월드:
World→WLD-environmentScene→SCN-main지오메트리 노드 문서화
생성된 새 프레임:
지오메트리 노드 설정에 추가된 문서화 프레임.
텍스트 데이터 블록:
GEOMETRY NODES ANALYSIS -- "Pebble Scattering Nodes"
Applied to object: GEO-ground | Modifier: Pebbles
========================================================
OVERVIEW
--------
This node group scatters three size categories of pebble meshes across
the faces of a ground mesh. Each category uses its own density mask
and a global Factor multiplier so that coverage can be art-directed
per-layer without touching the raw mask textures. The three resulting
instance layers are merged with the original ground geometry and sent
to the Group Output.
INPUTS (Group Interface)
------------------------
Geometry -- The ground mesh to scatter pebbles on.
Large Pebbles Mask -- Float mask (e.g. vertex colour / texture) that
defines WHERE large pebbles may appear.
Medium Pebbles Mask-- Float mask for medium pebble placement regions.
Small Pebbles Mask -- Float mask for small pebble placement regions.
Factor -- Global density multiplier shared by all three
lanes (appears three times in the interface,
one per lane).
NODE GRAPH -- LANE BY LANE
--------------------------
+- LARGE PEBBLES LANE -----------------------------------------------------+
| Source object : GEO-pebble |
| Group Input.001 |
| +- Geometry ------------------------> Distribute Points on Faces |
| +- Large Pebbles Mask ------------> Distribute Points on Faces |
| | (Density Factor socket) |
| +- Factor --> Math.003 (x) -------> Distribute Points on Faces |
| (Density Max socket) |
| Distribute Points on Faces ----------> Instance on Points |
| Object Info (GEO-pebble) -----------> Instance on Points (Instance) |
| Random Rotation.001 [-pi, +pi] -----> Instance on Points (Rotation) |
| Random Value [0.25 - 0.60] -------> Instance on Points (Scale) |
| Instance on Points ------------------> Join Geometry.003 |
+--------------------------------------------------------------------------+
+- MEDIUM PEBBLES LANE ----------------------------------------------------+
| Source object : GEO-pebble.004 |
| Group Input.002 |
| +- Geometry ------------------------> Distribute Points on Faces.001 |
| +- Medium Pebbles Mask -----------> Math.004 (x) --> Math.005 (x) |
| +- Factor ------------------------> Math.005 (x) |
| Math.005 output --------------> Distribute Points on Faces.001 |
| (Density socket) |
| Distribute Points on Faces.001 -----> Instance on Points.001 |
| Object Info.001 (GEO-pebble.004) --> Instance on Points.001 |
| Random Rotation.002 [-pi, +pi] ----> Instance on Points.001 |
| Random Value.002 [0.25 - 0.45] -----> Instance on Points.001 |
| Instance on Points.001 -------------> Join Geometry.003 |
+--------------------------------------------------------------------------+
+- SMALL PEBBLES LANE -----------------------------------------------------+
| Source object : GEO-pebble.002 |
| Group Input.003 |
| +- Geometry ------------------------> Distribute Points on Faces.002 |
| +- Small Pebbles Mask -----------> Math.006 (x) --> Math.007 (x) |
| +- Factor ------------------------> Math.006 (x) |
| Math.007 output --------------> Distribute Points on Faces.002 |
| (Density socket) |
| Distribute Points on Faces.002 -----> Instance on Points.002 |
| Object Info.002 (GEO-pebble.002) --> Instance on Points.002 |
| Random Rotation [-pi, +pi] ----> Instance on Points.002 |
| Random Value.003 [0.10 - 0.35] -----> Instance on Points.002 |
| Instance on Points.002 -------------> Join Geometry.003 |
+--------------------------------------------------------------------------+
+- MERGE & OUTPUT ---------------------------------------------------------+
| Group Input.004 |
| +- Geometry (pass-through) --------> Join Geometry.003 |
| Join Geometry.003 |
| (inputs: large instances + medium instances + |
| small instances + original ground geo) |
| +- Geometry -----------------------> Group Output |
+--------------------------------------------------------------------------+
SCALE RANGES (uniform, per lane)
---------------------------------
Large pebbles : 0.25 - 0.60
Medium pebbles : 0.25 - 0.45
Small pebbles : 0.10 - 0.35
ROTATION (all lanes)
---------------------
All three axes randomised independently over [-pi, +pi],
giving each pebble instance a fully random orientation.
DENSITY CONTROL PATTERN (Medium & Small lanes)
-----------------------------------------------
The mask value and the Factor are first multiplied together
(Math.004 / Math.006), then that product is multiplied again
by a second value (Math.005 / Math.007) before being fed into
the Density socket. This two-stage multiply gives a non-linear
response curve, making the density fall off more aggressively
near the mask edges.
The Large lane uses a different (single-stage) approach:
the Density Factor socket receives the mask directly, and the
Factor is only used to scale Density Max via Math.003.
NOTES & SUGGESTIONS
--------------------
* The node group has no Seed input exposed; adding one would allow
re-randomising all three layers simultaneously without touching
individual nodes.
* The Factor input currently appears three times (once per lane).
Merging them into a single shared socket would simplify the
modifier panel.
* Consider labelling the unlabelled Math nodes (Math.003-.007)
and Random Value nodes to aid future maintenance.