A side-by-side look at the Blender MCP and MCP Cinema4d MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose Blender MCP for architecture & design work as a local process; choose MCP Cinema4d for architecture & design as a local process. You can also run both side by side in one mcpServers block.
get_addon_status, disable_telemetry, get_scene_info.ping, render, preview_render.Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | Architecture & Design | Architecture & Design |
| Quality signal | 67/100 · Great | 65/100 · Great |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | No auth required | Not declared |
| Pricing | Free | Not declared |
| Required env vars | None listed | None listed |
| Verified owner | Community listing | Community listing |
| GitHub stars | 31,646 | 26 |
| Directory activity | 4 views 0 installs 0 upvotes | 1 views 0 installs 0 upvotes |
| Tools | 32 | 67 |
| Full listing | View Blender MCP | View MCP Cinema4d |
get_addon_status
Check whether the connected Blender addon matches this MCP server version.
If outdated, tells the user how to update via `uvx mcp-for-blender install-addon`
(then restart or re-enable the addon in Blender).
`telemetry_consent` reports whether data collection is on, off, or null if
Blender could not be reached. Use it to answer telemetry status questions.
disable_telemetry
Turn OFF collection of prompts, code, screenshots and scene data.
Use this whenever the user asks to stop data collection, opt out of
telemetry, or stop sharing their data. Takes effect immediately.
This tool can only turn collection OFF. Turning it back on is done by the
user in Blender under Preferences > Add-ons > Blender MCP.
get_scene_infoGet detailed information about the current Blender scene
Parameters:
- user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged. Required.
get_object_info
Get detailed information about a specific object in the Blender scene.
Parameters:
- object_name: The name of the object to get information about
- user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged.
get_viewport_screenshot
Capture a screenshot of the current Blender 3D viewport.
Parameters:
- max_size: Maximum size in pixels for the largest dimension (default: 800)
- user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged.
Returns the screenshot as an Image.
execute_blender_code
Execute arbitrary Python code in Blender. Make sure to do it step-by-step by breaking it into smaller chunks.
Parameters:
- code: The Python code to execute
- user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged.
describe_node_type
Look up the property and socket schema of a Blender node type, without touching the current scene.
Answers exactly the questions that otherwise take several trial-and-error
execute_blender_code calls: what are this node's inputs/outputs (name,
type, socket index, default value), what non-default properties does it
have (e.g. data_type, blend_type, sky_type), and what enum values are
valid for each. Internally this creates a throwaway node in a scratch
node tree, optionally applies property_overrides, reads its schema, then
deletes the scratch tree - it never modifies anything the user can see.
Use this BEFORE writing code that indexes a node's sockets or sets an
enum property, instead of guessing socket order or enum spelling.
Parameters:
- bl_idname: The node's bl_idname, e.g. "ShaderNodeMix", "ShaderNodeTexSky", "ShaderNodeBsdfPrincipled".
- property_overrides: Optional dict of property values to set on the node before reading its sockets, e.g. {"data_type": "RGBA"} for a Mix node. Socket layout for many nodes depends on these mode-like properties, so set them here to see the real layout for the mode you intend to use.
- user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged.
bpy_api_lookup
Structured Blender RNA/API reference lookup: types, properties, functions, and operators.
Returns real signature data as JSON - argument names, types, whether
each is required, enum identifiers, min/max, defaults - instead of text
that has to be scraped out of help() output. Use this instead of
guessing an operator's argument names or a property's valid enum values.
Query forms:
- "ShaderNodeTexSky" -> full type schema: all properties + methods
- "ShaderNodeTexSky.sky_type" -> one property's type, enum items, default
- "Object.ray_cast" -> one method's parameters and return values
- "bpy.ops.mesh.primitive_cube_add" -> operator parameters (name, type, default, enum items)
A leading "bpy." / "bpy.types." is optional and stripped automatically.
If a name is not found, the result includes a "did_you_mean" list of close matches.
Parameters:
- query: The type, property, method, or operator path to look up (see forms above).
- user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged.
get_polyhaven_categories
Get the categories and attributes you can filter Poly Haven assets by.
Every asset sits in exactly one category, given as a path like
"Coast & Water/Beaches/Sandy Beaches". Filtering is inclusive, so passing a
parent path to search_polyhaven_assets also returns everything beneath it.
Categories describe what an asset IS. Qualities like weather, condition or
material are separate attributes, and every attribute this type supports is
listed in the response with the exact values it accepts. Pass those to
search_polyhaven_assets's `attributes`.
Parameters:
- asset_type: hdris, textures, models, or all. Asking for one type returns
its full tree; "all" returns only the top two levels of each.
- user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged.
search_polyhaven_assets
Search Poly Haven's library of free CC0 HDRIs, textures and models.
Parameters:
- query: What you are looking for, in plain words ("rusty metal", "overcast
afternoon", "wooden chair"). Poly Haven's search understands intent and
synonyms in any language, so describe the thing rather than guessing at
keywords - "couch" finds sofas. Leave it out to browse the most downloaded
assets instead.
- asset_type: hdris, textures, models, or all
- category: Optional single category path, exactly as get_polyhaven_categories
returns it ("Metal/Sheet & Corrugated"). Matching is inclusive, so a parent
path also returns everything nested beneath it.
- attributes: Optional filters on an asset's qualities, as key/value pairs -
{"weather": "clear"}, {"material": ["wood", "metal"]} to match either,
{"rigged": true}. Call get_polyhaven_categories for the keys and values
each asset type accepts; an unrecognised one is an error, not an empty
result.
- min_size_m: Optional floor on an asset's real-world size, in metres. A
texture covers a fixed real-world area, so a 0.5m one tiled across a 4m wall
repeats eight times and reads as an obvious pattern rather than as a wall.
Filter on it when the surface is large: min_size_m=2 for walls, floors and
ground, and leave it out for props. Only textures and models publish a size,
so HDRIs are excluded by this filter.
- limit: How many results to return (default 20, maximum 50)
- user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged.
Results are returned in ranked order, most relevant first. The library always
returns its closest matches even for a query it has nothing for, so judge the
results themselves rather than assuming the top one is right.
Two things worth reading in the results before picking one. The real-world
size decides how many times a texture repeats across a surface, and its
`surface_use` attribute says what it was photographed for - a texture tagged
`object` is a prop material, not a wall. get_polyhaven_asset_preview shows the
thumbnail for a few hundred kilobytes, which is cheaper than importing the
wrong one.
Returns each asset's id, name, type, author, category, tags and page URL.
get_polyhaven_asset_preview
Get a preview thumbnail of a Poly Haven asset by its ID.
Use this to check an asset looks right before downloading it.
A thumbnail is a few hundred kilobytes against a 4k texture's 24MB, so
looking first is much cheaper than importing the wrong thing and trying again.
Parameters:
- asset_id: The Poly Haven asset ID (obtained from search_polyhaven_assets)
- user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged.
Returns the asset's thumbnail as an Image.
download_polyhaven_asset
Download and import a Polyhaven asset into Blender.
Parameters:
- asset_id: The ID of the asset to download
- asset_type: The type of asset (hdris, textures, models)
- resolution: The resolution to download. Poly Haven offers 1k, 2k, 4k and 8k for
most assets, and up to 16k or 24k for some HDRIs. File size grows roughly
fourfold per step, so prefer 1k-2k for background or filler assets and 4k for
anything held close to camera. If a resolution is unavailable, the error names
the ones that are.
- file_format: Optional. hdr (default) or exr for HDRIs; jpg (default), png or exr
for textures. Models are always imported from .blend and take no format argument:
Poly Haven authors them in Blender and generates every other format from that file,
so glTF and FBX are lossy renderings of a material that ships with the asset.
- user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged.
Returns a message indicating success or failure.
pingCheck connectivity to the Cinema 4D bridge plugin.renderRender the active Cinema 4D document at its currently-active render data settings. To change resolution / renderer / frame range / etc., adjust the active RenderData first via `create_render_data` (with `update_if_exists:true` on the active RD) or `set_params`. The request times out after 180 seconds; heavier renders that exceed that keep running in C4D but the call returns a timeout.preview_renderQuick agent-friendly verification render. Uses the Viewport renderer with the active editor view temporarily switched to Constant Shading (Lines) — sketch-style and fast. Independent of the active RenderData (built freestanding, never inserted) and restores BaseDraw / camera / time / take in finally. Returns a base64 PNG inline so the agent can directly view it. Use `view: top|bottom|left|right|front|back` for an auto-framed temp camera, or `camera` to render through a named scene camera. Pass `save_path` to also write the PNG to disk.reset_sceneClear scene state in one RPC. With `prefix` (e.g. 'e2e_') removes only objects / materials / non-active render data / non-main takes whose name starts with the prefix, then flushes the undo buffer — cheap cleanup for test suites. Without prefix, swaps the active document for a fresh empty BaseDocument (everything goes). Much faster than chained remove_entity calls when cleanup involves animated objects.call_commandInvoke a Cinema 4D command by plugin id via c4d.CallCommand(). Works for built-in commands (render, save, make editable, ...) and any registered command plugin.list_pluginsGeneralized plugin enumerator. Pass plugin_type (e.g. "material", "shader", "video_post", "command") or a raw int to FilterPluginList. Each entry includes "plugin" (parent folder of the binary, e.g. "OctaneRender 1.7.1") and "plugin_file" (binary basename) for host-plugin attribution. Filter results by name_pattern and/or plugin_pattern regex.undoPop up to `steps` entries off the active document's undo stack via doc.DoUndo. Stops early if the stack empties. Returns `steps_performed` so callers can tell when fewer steps were available than requested. Default: 1 step.batchRun many generic ops in one RPC. Each op is applied in order; by default failures are recorded per op and the batch continues. The whole batch is wrapped in a single undo group. Useful for 'apply X to all matching entities' workflows (pair with list_entities + name_pattern to get handles).list_entitiesEnumerate scene entities of a given kind. Returns compact summaries (name, type_id, type_name, plus kind-specific fields — `is_active` for take / material / render_data). For kind=object also supports type_ids / tag_types / max_depth filters and include_tags / include_params to read data inline — so you can find 'all cubes with a Ttexture tag and their position in one call' without falling back to exec_python. Use this first to find what exists before `describe`/`set_params`. **Note:** kind=shader walks classical shader chains; for node-material graphs use `list_graph_nodes`.describeDump all description parameters (id, name, cycle enum, current value) of a C4D entity resolved by handle. Use this to discover parameter IDs before reading/writing.get_paramsRead parameter values on a C4D entity by id or DescID path. Each id may be: an int (top-level), a list [a, b, …] (chained DescID; dtypes inferred from the description), or contain 'x'/'y'/'z' for vector sub-components (e.g. [903, 'x'] = position.x). For explicit dtypes use [[id, 'real|long|bool|vector'], …]. Returns `{values: [{path, value}]}` in request order. Discover ids via `describe`.set_paramsAtomically write parameter values (wrapped in one undo). Each entry is `{path, value}` where `path` is either an int id or a DescID path (e.g. [903, 'x'] = position.x). Lists of 3 numbers auto-coerce into c4d.Vector for vector-typed destinations. Returns `{applied: [{path, value}], errors: [{path, error}]}`.Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
{
"mcpServers": {
"ahujasid-blender-mcp": {
"command": "uvx",
"args": [
"blender-mcp"
]
}
}
}
{
"mcpServers": {
"mcp-cinema4d": {
"command": "npx",
"args": [
"-y",
"@kumoproductions/mcp-cinema4d"
]
}
}
}