mcp-cinema4d
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| C4D_MCP_HOST | No | Host for the TCP bridge. Default is 127.0.0.1. | 127.0.0.1 |
| C4D_MCP_PORT | No | Port for the TCP bridge. Default is 18710. | 18710 |
| C4D_MCP_TOKEN | No | Shared secret token for authentication. Strongly recommended. | |
| C4D_MCP_ALLOW_REMOTE | No | Required to bind C4D_MCP_HOST to a non-loopback interface. Off by default. | |
| C4D_MCP_ENABLE_PYTHON_OPS | No | Opt-in. Set to '1' to allow creating/editing Python-bearing plugin types. Off by default. | |
| C4D_MCP_ENABLE_EXEC_PYTHON | No | Opt-in. Set to '1' (or true/yes/on) to expose the exec_python tool. Off by default. |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| pingA | Check connectivity to the Cinema 4D bridge plugin. |
| renderA | Render 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 |
| preview_renderA | Quick 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 |
| reset_sceneA | Clear scene state in one RPC. With |
| call_commandB | Invoke 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_pluginsA | Generalized 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. |
| undoA | Pop up to |
| batchA | Run 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_entitiesA | Enumerate scene entities of a given kind. Returns compact summaries (name, type_id, type_name, plus kind-specific fields — |
| describeA | Dump 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_paramsA | Read 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 |
| set_paramsA | Atomically write parameter values (wrapped in one undo). Each entry is |
| get_containerA | Dump the raw BaseContainer of a C4D entity (including hidden keys that don't show up in |
| dump_shaderA | Recursively dump a shader (resolved from a handle) into JSON. Classical materials only — node materials (Standard node space / Redshift / etc.) expose their shading as a maxon node graph; use |
| create_entityA | Unified constructor for object / tag / material / shader / video_post. Handles parent linking, optional params, positions, and container slot assignment in one call. Returns the handle of the created entity (object handles include |
| remove_entityB | Delete the resolved entity (wrapped in an undo step). |
| set_keyframeA | Create or update a single keyframe on a resolved entity's parameter. Supports scalar (real/long/bool) and vector (x/y/z component) parameters; the bridge infers the dtype from the entity's description, or you can override it explicitly. Creates the CTrack automatically on first use. |
| set_documentB | Update document-level settings: fps, frame range, current frame, active camera, active take. FPS and frame range are also mirrored onto the active render data. |
| import_sceneA | Merge an external file (abc/fbx/obj/c4d/etc.) into the active document via MergeDocument. Returns the newly-imported top-level objects so they can be chained with set_params / create_entity / create_take. Optionally re-parents them under an existing object and renames the first root. |
| create_render_dataA | Create (or update-if-exists) a RenderData with resolution / renderer / fps / frame range in one call. Returns the render_data handle for subsequent create_take / set_params chaining. |
| create_takeA | Create or update a Take (AddTake + SetCamera + SetRenderData + SetChecked) in one call. New takes are checked by default so they participate in batch renders; pass |
| take_overrideA | Write per-Take parameter overrides onto a target node (object / tag / material / render_data / video_post / shader). Wraps |
| sample_transformA | Evaluate the scene at each requested frame and return the object's transform. Useful to verify alembic / constraint / xpresso-driven animation without writing a bespoke exec_python sampler. |
| get_selectionA | Read the active document's current selection: the active object (primary), all selected objects, and the active tag / material. Useful for reacting to the user's current focus without asking them to re-pick entities. Returns canonical handles so results can be piped directly into describe / set_params / etc. |
| set_selectionA | Replace or extend the active document's selection. Pass |
| move_entityA | Reparent a node under a new parent, promote it to the top of its hierarchy, or reorder it relative to a sibling. Works on objects, takes, and render_data — siblings/parents must share the moved node's kind. Exactly one destination field must be provided ( |
| clone_entityA | Duplicate an entity. Supports object / tag / material / shader (via GetClone + parent insert), render_data (doc.InsertRenderData — copies VideoPosts too), video_post (rd.InsertVideoPost), and take (TakeData.AddTake, copying existing overrides). Objects default to dropping next to the source; pass |
| modeling_commandA | Run a Cinema 4D modeling operation via c4d.utils.SendModelingCommand on one or more target objects. Commands that produce new geometry (Current State to Object, Connect / Join, Split, Explode Segments) return handles to the inserted results; in-place commands (Make Editable, Subdivide, Triangulate, …) return the mutated targets. Aliases: current_state_to_object / cso, make_editable, connect / join, connect_delete, subdivide, triangulate, untriangulate, reverse_normals, align_normals, optimize, center_axis, split, explode_segments, melt, collapse, dissolve. |
| get_meshA | Read points and polygons (or spline segments) from an editable PointObject / PolygonObject / SplineObject. Primitives (Cube, Sphere, …) must be converted first via |
| set_meshA | Overwrite the points (and optionally polygons) of an editable object. Triangles may be passed as [a,b,c]; the bridge expands them to C4D's quad storage (a,b,c,c). If polygons is omitted, only points are rewritten and the count must match the existing topology. Wrapped in a single undo entry. |
| set_mesh_selectionA | Replace the point / polygon / edge BaseSelect on an editable mesh. Existing selection of the specified kind is cleared first. Pair with |
| save_documentA | Save the active document to disk. Path must be absolute; the parent directory must exist. Supported formats: c4d (default), abc / alembic, fbx, obj, stl, ply, usd / usda, gltf. With |
| open_documentA | Load a Cinema 4D scene file as a new document. Unlike |
| new_documentA | Insert a fresh empty BaseDocument into C4D's document list and (by default) switch focus to it. Useful for starting a clean scene without overwriting the current one. |
| list_documentsA | Enumerate the documents currently open in Cinema 4D. Each entry has its list |
| set_active_documentA | Switch focus to an already-open document, identified by its list |
| close_documentA | Close an open document, identified by its list |
| list_graph_nodesA | Walk a node graph and return a flat list of nodes. Target either a node-based material (via |
| list_graph_node_assetsA | Enumerate registered node-template asset ids for a node space — the ids you pass to |
| get_graph_infoA | Report which node spaces a material exposes a graph in, which one is currently active, and the alias table the bridge understands. Use this before |
| apply_graph_descriptionA | Build or mutate a node graph using maxon.GraphDescription's declarative dict syntax. Supports creating nodes ( |
| set_graph_portA | Update a single port on a node addressable by its stable $id within a node material graph. Thin convenience over apply_graph_description: internally builds a {$query:{$id:node_id}, port: value} payload. Lists of 3 numbers are coerced to maxon.Vector for vector-typed ports. |
| remove_graph_nodeA | Delete a node by id from a node-material graph. The id must match the node's stable maxon.Id (as reported by list_graph_nodes or assigned via $id in apply_graph_description). |
| list_xpresso_nodesA | Walk an Xpresso (Texpresso / GvNodeMaster) tag and return a flat list of its GvNodes. Each entry carries a stable dotted-index path id ('0.2' = root's first child, its third child) plus port summaries. Use the id to address nodes from |
| apply_xpresso_graphA | Declarative builder for an Xpresso (classic GvNodeMaster) graph — mirror of |
| set_xpresso_portA | Low-level Xpresso port primitive — covers cases |
| remove_xpresso_nodeA | Delete a GvNode from an Xpresso graph. The handle must be a gv_node handle pointing at the target (use |
| assign_materialB | Link a material to an object by creating a Texture tag (or updating an existing one when |
| set_transformA | Write an object's transform in local or global space. Pass any combination of |
| add_user_dataA | Add a new User Data slot to any BaseList2D (common rigging / control-exposure pattern). Returns the slot's DescID (as a nested list) which can be piped into |
| list_user_dataA | Enumerate the User Data slots on a target. Each entry carries |
| remove_user_dataA | Delete a User Data slot by its DescID path (as returned by |
| list_mograph_clonesA | Read the per-clone transforms from a MoGraph generator (Cloner / Matrix / Tracer / …). The bridge forces a scene pass so the MoData array is populated before sampling. Returns |
| list_tracksA | Enumerate CTracks on the resolved entity. Returns |
| get_keyframesA | Read the keys on a specific animation track. Combine with list_tracks to discover which (param_id, component) pairs are animated. Returns |
| delete_keyframeA | Remove keys from a CTrack. Pass |
| delete_trackA | Remove an entire CTrack (identified by |
| list_layersA | Enumerate every LayerObject in the active document. Each entry returns the layer's name, optional color [r,g,b], and its flag dict (solo / view / render / manager / locked / generators / deformers / expressions / animation / xref). |
| create_layerA | Create a LayerObject at the document's layer root. With |
| assign_to_layerA | Place a target (object / tag / material) on a named layer. Pass |
| get_object_layerA | Return the layer currently assigned to a target entity (object / tag / material), or null if unassigned. |
| set_layer_flagsB | Toggle a layer's visibility / render / lock flags in one call. Only fields explicitly passed are modified; omitted flags keep their current value. |
| get_document_stateA | One-shot reader for the active document's key fields: fps, min/max and loop frame range, current frame, document name/path, and canonical handles for the active camera / take / render data. Pairs with |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/kumoproductions/mcp-cinema4d'
If you have feedback or need assistance with the MCP directory API, please join our Discord server