Claude Code から Blender を操作できる 公式 MCP サーバー(blender.org/lab/mcp-server)を使い、自然言語の指示だけで机を 3D モデリングするまでの手順をまとめます。
実際にハマったポイント(公式版とサードパーティ版の取り違え、レンダリング時のオブジェクト消失など)も含めて記録しています。
動作環境
- Blender 5.1.2(EEVEE)
- Claude Code(CLI)
- macOS /
uv(uvx),gitインストール済み
完成イメージ:
0. 前提:Blender MCP には「公式」と「サードパーティ」がある
ここが最初の落とし穴です。blender-mcp という名前のものが 2 つ存在します。
| 公式(blender.org) | サードパーティ(ahujasid 製) | |
|---|---|---|
| 入手元 | Blender 公式フォージ projects.blender.org/lab/blender_mcp
|
PyPI の blender-mcp
|
| アドオン | 公式 Lab 拡張リポジトリから追加 | GitHub の addon.py を手動インストール |
| 起動コマンド | uvx --from "git+https://projects.blender.org/lab/blender_mcp.git#subdirectory=mcp" blender-mcp |
uvx blender-mcp |
| 接続 UI | アドオンのプリファレンス内(Start/Stop) | 3D ビューの N パネル「BlenderMCP」タブ |
パッケージ名がどちらも blender-mcp のため、uvx blender-mcp と書くと PyPI 版(サードパーティ)が起動します。
公式アドオンを入れているのにサーバー側がサードパーティ版だと、プロトコルが噛み合わず通信が壊れます。
💡 症状:接続はできるのに、すべての応答が
Incomplete JSON response received
になる場合、まずこの「公式アドオン × サードパーティサーバー」のミスマッチを疑ってください(私はこれで詰まり、両者を公式に揃えたら解消しました)。
この記事では 公式アドオン + 公式サーバー に揃える手順を説明します。
1. Blender 側:公式アドオンを入れて有効化する
公式の最短手順は、ページ内のインストールリンクを Blender にドラッグする方法です。
- Blender を起動
-
blender.org/lab/mcp-server を開き、インストールリンクを Blender のウィンドウにドラッグする
- 初回は Lab 拡張リポジトリ(
https://lab.blender.org/)の追加を求められるので許可し、もう一度ドラッグするとインストールされる
- 初回は Lab 拡張リポジトリ(
-
編集 > プリファレンス > アドオンで「MCP」を検索し、有効(チェック)になっていることを確認
2. Claude Code 側:MCP サーバーを「公式」に設定する
Claude Code に登録されている blender サーバーを、公式(git 版)に差し替えます。
# 既存の blender 設定を削除(サードパーティ版が入っている場合)
claude mcp remove blender -s user
# 公式サーバー(git 版)を登録
claude mcp add blender -s user -- \
uvx --from "git+https://projects.blender.org/lab/blender_mcp.git#subdirectory=mcp" blender-mcp
設定内容の意味:
| 項目 | 値 |
|---|---|
| 取得元 | Blender 公式フォージの mcp サブディレクトリ |
| 起動方法 |
uvx が git からクローン&ビルドして stdio サーバーを起動 |
| 費用 | OSS・無料(ローカル動作のみ) |
登録できたか確認:
claude mcp list
blender: uvx --from git+https://projects.blender.org/lab/blender_mcp.git#subdirectory=mcp blender-mcp - ...
⚠️ MCP サーバーは Claude Code の起動時に読み込まれます。設定後は Claude Code を再起動してください。
初回起動時に git クローン&ビルドが走るため、少し時間がかかります。
3. Blender でサーバーを起動する(接続)
⚠️ サードパーティ版(ahujasid)は 3D ビューの
Nパネルに「BlenderMCP」タブができ、そこの Connect で接続します。
しかし公式アドオンには N パネルのタブはありません。接続(サーバー起動)は アドオンのプリファレンス内で行います。
-
編集 > プリファレンス > アドオンを開き、検索で「MCP」を絞り込む -
MCP アドオンの行を展開(
>) する - プリファレンス内で設定・操作する
-
Host:
localhost/ Port:9876(既定値のままで OK) - Auto Start を ON にすると Blender 起動時に自動でサーバーが立ち上がる
- Start MCP Server を押すと開始(起動中は Stop MCP Server に変わり、下に Server is running と表示される)
-
Host:
オペレーターとしては
blmcp.server_start/blmcp.server_stopが割り当てられています。
4. 接続確認
Claude Code 側でシーン情報を取得できれば接続成功です。Claude には自然言語で頼むだけで、内部的に MCP ツール(get_objects_summary など)が呼ばれます。
例:「Blender のシーンの状態を教えて」
返ってくる JSON の例(初期シーン):
{
"scene_name": "Scene",
"active_object": "Cube",
"collections": [
{ "name": "Collection",
"objects": [
{"name": "Camera", "type": "CAMERA"},
{"name": "Cube", "type": "MESH"},
{"name": "Light", "type": "LIGHT"}
]}
]
}
5. 机を作る
Claude Code に自然言語で指示するだけです。
「Blender で机を作成して。幅120×奥行60×高さ75cmの木製デスクで。」
Claude が内部で execute_blender_code ツールを使い、bpy の Python スクリプトを生成・実行します。実際に生成・実行されたスクリプトの例:
import bpy
# ---- パラメータ(メートル単位) ----
W, D, H = 1.2, 0.6, 0.75 # 幅 / 奥行 / 高さ
TOP_T = 0.04 # 天板の厚み
LEG = 0.05 # 脚の角材サイズ
INSET = 0.04 # 端からの脚の差し込み量
def new_cube(name, size, location):
bpy.ops.mesh.primitive_cube_add(size=1.0, location=location)
ob = bpy.context.active_object
ob.name = name
ob.scale = size
bpy.ops.object.transform_apply(location=False, rotation=False, scale=True)
return ob
# 天板
top = new_cube("Desk_Top", (W, D, TOP_T), (0, 0, H - TOP_T/2))
# 脚 4 本
leg_h = H - TOP_T
dx, dy = W/2 - LEG/2 - INSET, D/2 - LEG/2 - INSET
legs = []
for i, (x, y) in enumerate([(dx, dy), (-dx, dy), (dx, -dy), (-dx, -dy)], 1):
legs.append(new_cube(f"Desk_Leg_{i}", (LEG, LEG, leg_h), (x, y, leg_h/2)))
# 脚を天板の子にしてグループ化
for leg in legs:
leg.parent = top
leg.matrix_parent_inverse = top.matrix_world.inverted()
ハマりどころ① マテリアルのノード名がローカライズされる
「プリンシプル BSDF」に色を設定しようとして nodes.get("Principled BSDF") を使うと、
日本語 UI では実際のノード名が「プリンシプル BSDF」になっていて取得できません。
名前ではなくノードの種類(bl_idname)で取得するのが安全です。
mat = bpy.data.materials.new("Desk_Wood")
mat.use_nodes = True
nt = mat.node_tree
# ❌ 名前指定はローカライズで失敗することがある
# bsdf = nt.nodes.get("Principled BSDF")
# ✅ 種類で取得する
bsdf = next(n for n in nt.nodes if n.bl_idname == 'ShaderNodeBsdfPrincipled')
bsdf.inputs["Base Color"].default_value = (0.30, 0.16, 0.07, 1.0) # 木の茶色
ハマりどころ② 初期 Cube が机に重なって見えない
初期シーンの Cube は 2m 角で原点にあります。高さ 75cm の机はその内側に埋もれて見えません。
邪魔なら非表示にします(削除せず残す場合)。
cube = bpy.data.objects.get("Cube")
cube.hide_viewport = True # ビューポートで非表示
cube.hide_render = True # ★ レンダーでも非表示にするにはこちらも必要
⚠️
hide_viewportはビューポートだけの非表示です。
レンダリング画像に写り込ませたくない場合はhide_render = Trueも必須です(これを忘れて初期 Cube が全面に写り込みました)。
6. 引き出しを追加する
同じく自然言語で追加を依頼できます。
「天板の中央真下に、横長で浅い引き出しを 1 段追加して。取っ手は金属調で。」
生成されるスクリプトのポイントは「前板・箱本体・取っ手」を作り、すべて天板(Desk_Top)の子にして机と一体で動くようにすることです。
# 前板 / 箱本体 / 取っ手 を作成し…
for ob in (front, body, handle):
ob.parent = top # 天板の子にする
ob.matrix_parent_inverse = top.matrix_world.inverted()
取っ手は金属マテリアル(Metallic = 1.0)で差し色にしています。
7. 保存する
「
desk.blendとして保存して。」
import os, bpy
# 注意: bpy は "~" を自動展開しないので os.path.expanduser で展開する
path = os.path.expanduser("~/your-project/desk.blend")
bpy.ops.wm.save_as_mainfile(filepath=path)
保存に成功すると Blender のログに 情報: 「desk.blend」で保存しました と出ます。
まとめ
-
blender-mcpには公式(git)とサードパーティ(PyPI)の同名パッケージがあり、アドオンとペアを揃える必要がある - 接続できるのに
Incomplete JSONが続く → 公式 × サードパーティのミスマッチを疑う - 公式サーバーは
uvx --from "git+https://projects.blender.org/lab/blender_mcp.git#subdirectory=mcp" blender-mcpで起動 - 公式アドオンの接続はプリファレンス内の Start MCP Server / Auto Start(N パネルの Connect ボタンはサードパーティ版)
- MCP 設定変更後は Claude Code の再起動が必要
- 自然言語の指示だけで、Claude が
bpyスクリプトを書いて Blender を操作してくれる - 日本語 UI ではノード名のローカライズ、レンダーでは
hide_renderに注意
自然言語で「机を作って」「引き出しを足して」と言うだけで、3D モデルが組み上がっていくのはなかなか体験として新しいです。ぜひ試してみてください。


