{"id":50916751,"url":"https://github.com/dcc-mcp/dcc-mcp-blender","last_synced_at":"2026-06-16T16:01:58.045Z","repository":{"id":350899347,"uuid":"1208602537","full_name":"dcc-mcp/dcc-mcp-blender","owner":"dcc-mcp","description":"Blender addon for the DCC Model Context Protocol (MCP) ecosystem — embeds a Streamable HTTP MCP server directly inside Blender","archived":false,"fork":false,"pushed_at":"2026-06-02T09:53:31.000Z","size":459,"stargazers_count":6,"open_issues_count":8,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-02T10:24:03.479Z","etag":null,"topics":["3d","ai","blender","blender-addon","dcc","llm","mcp","model-context-protocol","python"],"latest_commit_sha":null,"homepage":"https://github.com/loonghao/dcc-mcp-blender","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dcc-mcp.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-12T14:06:00.000Z","updated_at":"2026-06-02T09:53:25.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/dcc-mcp/dcc-mcp-blender","commit_stats":null,"previous_names":["loonghao/dcc-mcp-blender","dcc-mcp/dcc-mcp-blender"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/dcc-mcp/dcc-mcp-blender","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dcc-mcp%2Fdcc-mcp-blender","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dcc-mcp%2Fdcc-mcp-blender/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dcc-mcp%2Fdcc-mcp-blender/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dcc-mcp%2Fdcc-mcp-blender/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dcc-mcp","download_url":"https://codeload.github.com/dcc-mcp/dcc-mcp-blender/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dcc-mcp%2Fdcc-mcp-blender/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34412795,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-16T02:00:06.860Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["3d","ai","blender","blender-addon","dcc","llm","mcp","model-context-protocol","python"],"created_at":"2026-06-16T16:01:55.526Z","updated_at":"2026-06-16T16:01:58.038Z","avatar_url":"https://github.com/dcc-mcp.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# dcc-mcp-blender\n\n\u003e Blender addon for the [DCC Model Context Protocol (MCP)](https://github.com/loonghao/dcc-mcp-core) ecosystem — embeds a Streamable HTTP MCP server directly inside Blender, letting any MCP-compatible AI client drive your 3D workflow.\n\n[![PyPI version](https://badge.fury.io/py/dcc-mcp-blender.svg)](https://badge.fury.io/py/dcc-mcp-blender)\n[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/dcc-mcp-blender.svg)](https://pypi.org/project/dcc-mcp-blender/)\n[![PyPI - Wheel](https://img.shields.io/pypi/wheel/dcc-mcp-blender.svg)](https://pypi.org/project/dcc-mcp-blender/#files)\n[![CI](https://github.com/dcc-mcp/dcc-mcp-blender/actions/workflows/ci.yml/badge.svg)](https://github.com/dcc-mcp/dcc-mcp-blender/actions/workflows/ci.yml)\n[![E2E Blender](https://github.com/dcc-mcp/dcc-mcp-blender/actions/workflows/e2e.yml/badge.svg)](https://github.com/dcc-mcp/dcc-mcp-blender/actions/workflows/e2e.yml)\n[![Release](https://github.com/dcc-mcp/dcc-mcp-blender/actions/workflows/release.yml/badge.svg)](https://github.com/dcc-mcp/dcc-mcp-blender/actions/workflows/release.yml)\n[![PyPI Downloads](https://img.shields.io/pypi/dm/dcc-mcp-blender.svg?label=PyPI%20downloads)](https://pypi.org/project/dcc-mcp-blender/)\n[![GitHub release downloads](https://img.shields.io/github/downloads/dcc-mcp/dcc-mcp-blender/total.svg?label=release%20downloads)](https://github.com/dcc-mcp/dcc-mcp-blender/releases)\n[![GitHub Release](https://img.shields.io/github/v/release/dcc-mcp/dcc-mcp-blender.svg)](https://github.com/dcc-mcp/dcc-mcp-blender/releases)\n[![Coverage](https://img.shields.io/badge/coverage-pytest--cov-blue.svg)](https://github.com/dcc-mcp/dcc-mcp-blender/blob/main/pyproject.toml)\n[![dcc-mcp-core](https://img.shields.io/badge/dcc--mcp--core-%3E%3D0.18.7-blue.svg)](https://github.com/loonghao/dcc-mcp-core)\n[![Blender](https://img.shields.io/badge/Blender-3.6%20LTS%20%7C%204.2%20LTS%20%7C%204.3%20%7C%204.4-orange.svg)](https://www.blender.org/download/releases/)\n[![MCP](https://img.shields.io/badge/MCP-2025--03--26-purple.svg)](https://modelcontextprotocol.io/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n---\n\n## Overview\n\n`dcc-mcp-blender` turns Blender into a first-class MCP server. Once the addon is enabled, any MCP client (Claude Desktop, custom agents, etc.) can call Blender tools over HTTP without any external gateway.\n\n```\n┌─────────────────────────────────┐\n│  Blender (Python 3.10+)         │\n├─────────────────────────────────┤\n│  dcc_mcp_blender                │\n│  ├─ BlenderMcpServer            │\n│  ├─ SkillCatalog (150+ tools)   │\n│  ├─ ActionRegistry              │\n│  └─ HTTP Handlers               │\n├─────────────────────────────────┤\n│  dcc-mcp-core                   │\n│  ├─ McpHttpServer               │\n│  ├─ JSON-RPC 2.0                │\n│  └─ SSE Streaming               │\n└─────────────────────────────────┘\n         ↓ http://127.0.0.1:8765/mcp\n┌─────────────────────────────────┐\n│  MCP Host (Claude / etc.)       │\n└─────────────────────────────────┘\n```\n\n---\n\n## Features\n\n- **Embedded MCP server** — no external gateway needed; the server runs inside Blender's Python interpreter\n- **150+ pre-built tools** — scene management, object manipulation, mesh/UV editing, rigging, pose libraries, interchange, materials, node graphs, rendering, physics, scripting and more\n- **Extensible skill system** — drop new skill folders alongside built-ins or point to them via env vars\n- **Main-thread host adapter** — GUI mode uses core `HostUiDispatcherBase` semantics through `BlenderUiDispatcher`; headless mode uses `BlenderHost` with a core `BlockingDispatcher`\n- **Streamable HTTP transport** — compatible with any MCP 2025-03-26 client\n- **Claude Desktop ready** — ship a one-line `mcpServers` config and you're done\n\n---\n\n## Available MCP Tools\n\n| Category | Tools |\n|---|---|\n| **blender-scene** | `new_scene`, `open_scene`, `save_scene`, `list_objects`, `get_scene_info`, `get_session_info` |\n| **blender-objects** | `create_object`, `delete_object`, `duplicate_object`, `move_object`, `rotate_object`, `scale_object`, `get_object_info`, `get_selection`, `set_selection`, `select_by_type`, `find_by_pattern`, `rename_object`, `parent_object`, `group_objects`, `set_visibility`, `get_bounding_box`, `center_origin`, `freeze_transforms` |\n| **blender-mesh** | `add_modifier`, `apply_modifier`, `list_modifiers`, `get_mesh_info` |\n| **blender-mesh-ops** | `get_poly_count`, `cleanup_mesh`, `triangulate_mesh`, `separate_mesh`, `combine_meshes`, `merge_vertices`, `extract_faces`, `mirror_mesh`, `select_by_material` |\n| **blender-uv-ops** | `list_uv_maps`, `create_uv_map`, `delete_uv_map`, `copy_uv_map`, `get_uv_info`, `get_uv_islands`, `project_uvs`, `unwrap_uvs`, `pack_uvs`, `normalize_uvs` |\n| **blender-rigging** | `create_armature`, `create_bone`, `mirror_bones`, `add_constraint`, `set_constraint_properties`, `bind_mesh_to_armature`, `add_shape_key`, `set_driver`, `retarget_animation` |\n| **blender-pose-library** | `list_poses`, `save_pose`, `load_pose` |\n| **blender-interchange** | `import_file`, `import_fbx`, `import_obj`, `export_gltf`, `export_usd`, `export_alembic`, `batch_export` |\n| **blender-export-preset** | `list_export_presets`, `save_export_preset`, `load_export_preset`, `delete_export_preset` |\n| **blender-shot-export** | `get_shot_info`, `export_camera` |\n| **blender-validation** | `run_scene_checks`, `validate_mesh`, `validate_materials`, `validate_animation`, `validate_export_readiness`, `get_validation_report` |\n| **blender-pipeline** | `get_asset_metadata`, `tag_asset_metadata`, `clear_asset_metadata`, `set_project_context`, `create_publish_manifest`, `prepare_publish_package` |\n| **blender-materials** | `create_material`, `assign_material`, `set_material_color`, `list_materials`, `delete_material` |\n| **blender-shader-nodes** | `list_material_nodes`, `set_principled_input`, `list_node_trees`, `list_nodes`, `create_node`, `delete_node`, `list_node_sockets`, `connect_nodes`, `disconnect_nodes`, `list_node_links`, `set_node_input`, `get_node_value`, `create_material_with_nodes`, `assign_texture_node`, `set_principled_inputs` |\n| **blender-material-library** | `save_material_preset`, `list_material_presets`, `load_material_preset`, `delete_material_preset`, `get_shader_assignment`, `get_material_connections`, `set_material_attribute`, `assign_texture`, `list_images`, `reload_image`, `list_color_spaces`, `set_color_management` |\n| **blender-texture-bake** | `list_bake_targets`, `bake_textures`, `bake_ambient_occlusion`, `bake_lighting`, `transfer_maps` |\n| **blender-render** | `render_scene`, `set_render_settings`, `get_render_info`, `capture_viewport` |\n| **blender-scripting** | `execute_python`, `execute_script_file`, `get_blender_info` |\n| **blender-dev** | `attach_project`, `reload_modules`, `run_check`, `run_entrypoint`, `run_script`, `list_addons`, `get_addon_status`, `enable_addon`, `disable_addon`, `capture_ui_snapshot`, `find_ui_elements`, `start_debug_server`, `get_python_environment` |\n| **blender-animation** | `set_keyframe`, `set_frame_range`, `get_frame_range`, `set_current_frame`, `get_keyframes`, `delete_keyframes`, `bake_animation` |\n| **blender-lighting** | `create_light`, `set_light_properties`, `list_lights`, `set_world_background` |\n| **blender-light-rig** | `create_three_point_light_rig`, `create_area_softbox`, `create_hdri_world`, `list_light_rigs`, `set_light_rig_intensity`, `aim_light_at_object`, `group_lights`, `set_render_view_transform`, `get_lighting_summary` |\n| **blender-camera** | `create_camera`, `set_active_camera`, `set_camera_properties`, `list_cameras` |\n| **blender-collection** | `create_collection`, `link_to_collection`, `list_collections` |\n| **blender-geometry** | `create_sphere`, `save_blend`, `file_exists`, `export_fbx`, `export_obj` |\n| **blender-geometry-nodes** | `add_geometry_nodes_modifier`, `list_geometry_nodes_modifiers`, `create_geometry_node_group`, `assign_geometry_node_group`, `set_geometry_node_modifier_input`, `evaluate_geometry_nodes_info` |\n| **blender-physics** | `add_rigid_body`, `set_rigid_body_properties`, `remove_rigid_body`, `list_rigid_bodies`, `set_rigid_body_world_settings`, `bake_rigid_body_simulation`, `clear_rigid_body_bake`, `add_cloth_modifier`, `set_cloth_settings`, `add_collision_modifier`, `set_collision_settings`, `list_simulation_modifiers`, `bake_simulation`, `clear_simulation_cache`, `get_simulation_status` |\n\nSee [`src/dcc_mcp_blender/skills/SKILLS_INDEX.md`](src/dcc_mcp_blender/skills/SKILLS_INDEX.md) for staged loading guidance, task-to-skill chains, and side-effect profiles for all bundled skills.\n\n---\n\n## Installation\n\n### Agent install (recommended)\n\nWant an AI agent to install the Blender-side dependencies, write the MCP host\nconfig, and walk you through enabling the add-on? Just ask your agent:\n\n```text\n帮我参考 dcc-mcp/dcc-mcp-blender/install.md 去安装\n```\n\nThe agent follows [`install.md`](install.md), which delegates the setup workflow\nto [`skills/dcc-mcp-blender-setup`](skills/dcc-mcp-blender-setup). The remaining\noptions below are for manual installation.\n\n### Option 1 — Install as Blender Extension (ZIP, recommended)\n\n\u003e **Important:** The release ZIP uses the **Blender 4.2+ Extension** format with\n\u003e `blender_manifest.toml` at the archive root and a flat package layout.\n\u003e **Legacy add-on install** (`Edit → Preferences → Add-ons → Install`) will\n\u003e fail with *\"ZIP packaged incorrectly; `__init__.py` should be in a\n\u003e directory, not at top-level\"*. This is expected — use the Extensions path\n\u003e below. The Extension format is the **only supported GUI installation path**.\n\n1. Download the latest platform ZIP from the [Releases](https://github.com/dcc-mcp/dcc-mcp-blender/releases) page:\n   `dcc_mcp_blender_addon_win64_vX.Y.Z.zip`, `dcc_mcp_blender_addon_linux_vX.Y.Z.zip`, or\n   `dcc_mcp_blender_addon_macos_vX.Y.Z.zip`\n2. In Blender 4.2+: **Edit → Preferences → Extensions → Install from Disk…** → select the ZIP.\n   (Do **NOT** use **Edit → Preferences → Add-ons → Install** — that legacy path is unsupported.)\n3. Enable **DCC MCP Blender**\n4. The MCP server starts automatically on `http://127.0.0.1:8765`\n\nRelease ZIPs are Blender 4.2+ Extension packages. They include `blender_manifest.toml` and the matching `dcc-mcp-core` wheel under `wheels/`, so Blender installs the Python dependency into the extension's isolated environment.\n\nThe extension ZIP is assembled by `packaging/assemble_zip.py`. It resolves the latest compatible `dcc-mcp-core` wheel, places it under `wheels/`, and injects that wheel into `blender_manifest.toml`; Blender 4.2+ then installs it through the extension wheel mechanism instead of relying on global `pip` packages or `sys.path` edits. See [`packaging/release_smoke_checklist.md`](packaging/release_smoke_checklist.md) for the manual smoke test procedure.\n\n### Option 2 — Install via pip (for scripts / CI)\n\n```bash\npip install dcc-mcp-blender\n```\n\nThen in Blender's Python console:\n\n```python\nimport dcc_mcp_blender\ndcc_mcp_blender.start_server()\n```\n\n### Headless Bootstrap\n\nFor CI or automation that needs Blender's main thread dispatcher:\n\n```bash\nblender --background --python src/dcc_mcp_blender/blender_bootstrap.py\n```\n\nThe bootstrap prints `MCP_URL=...`, discovers bundled skills, and drives `BlenderHost` in headless mode until the process is stopped.\n\nIn interactive add-on mode, `BlenderUiDispatcher` subclasses the shared core UI dispatcher and `BlenderTimerPump`\ncontains the Blender-specific `bpy.app.timers` wiring. In background mode, `BlenderHost` keeps using core\n`BlockingDispatcher` with an explicit headless loop so automation does not depend on Blender UI timers.\n\n---\n\n## Quick Start\n\n### Claude Desktop\n\nAdd to your `claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"blender\": {\n      \"url\": \"http://127.0.0.1:8765/mcp\"\n    }\n  }\n}\n```\n\nMake sure the Blender addon is enabled and the server is running, then restart Claude Desktop.\n\n### Python API\n\n```python\nimport dcc_mcp_blender\n\n# Start the server (default port 8765)\ndcc_mcp_blender.start_server()\n\n# Stop the server\ndcc_mcp_blender.stop_server()\n```\n\n---\n\n## Configuration\n\n### Environment Variables\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `DCC_MCP_BLENDER_SEMANTIC_INDEX` | `0` (off) | Set to `1` to enable the opt-in lexical+vector hybrid skill recall. When enabled, `search_skills` fuses BM25 with vector similarity via Reciprocal Rank Fusion (RRF), improving recall for natural-language queries like \"import USD files\" or \"rendering a preview\". |\n| `DCC_MCP_BLENDER_SEMANTIC_EMBEDDER` | `hashed` | Embedder backend for semantic recall. `hashed` (default) uses a zero-dependency hash-based embedding. Set to `onnx` for dense embeddings via `OnnxEmbedder` (requires `pip install 'dcc-mcp-core[semantic]'`). |\n| `DCC_MCP_BLENDER_READINESS_TIMEOUT_SECS` | *(none)* | Optional timeout in seconds for the readiness probe's dcc verification step. |\n\n#### Enabling Semantic Skill Recall\n\n```bash\n# Enable hybrid BM25 + vector recall\nexport DCC_MCP_BLENDER_SEMANTIC_INDEX=1\n\n# Optional: use ONNX for dense embeddings (better semantic matching)\npip install 'dcc-mcp-core[semantic]'\nexport DCC_MCP_BLENDER_SEMANTIC_EMBEDDER=onnx\n```\n\nWhen enabled, skill search results include a `[semantic]` extra field and RRF-fused scores.\nThe feature is **opt-in** — BM25-only recall remains the default and is not affected when the\nenv var is unset.\n\n---\n\n## Development\n\n```bash\ngit clone https://github.com/dcc-mcp/dcc-mcp-blender\ncd dcc-mcp-blender\npip install -e \".[dev]\"\npytest\n```\n\n---\n\n## License\n\nMIT — see [LICENSE](LICENSE) for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdcc-mcp%2Fdcc-mcp-blender","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdcc-mcp%2Fdcc-mcp-blender","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdcc-mcp%2Fdcc-mcp-blender/lists"}