mcp-c4d-2025
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. Legacy alias: C4D_BRIDGE_HOST. | 127.0.0.1 |
| C4D_MCP_PORT | No | Port for the TCP bridge. Default is 18710. Legacy alias: C4D_BRIDGE_PORT. | 18710 |
| C4D_MCP_TOKEN | No | Shared secret for the TCP bridge. Strongly recommended when set on the C4D side. | |
| C4D_MCP_ENABLE_EXEC_PYTHON | No | Opt-in. Set to 1 (or true/yes/on) to expose the exec_python tool. Must be set on both the MCP server and C4D side. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| 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. |
| get_capabilitiesB | Report the Cinema 4D runtime, security posture, and available capabilities. |
| 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_commandA | 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 main-thread 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 unless undo_group=false. Pass document_name to bind every allowed active-document operation to one uniquely named open document and restore the prior active document afterward; document lifecycle, arbitrary Python, and command operations are rejected in this scoped mode. |
| 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 | Write parameter values in one undo group. 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 one keyframe. Use a full DescID path (including user data) or legacy param_id/component. Supports real/long/bool scalar channels and individual vector components. Creates the CTrack on first use. |
| set_documentA | 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_materialA | 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. Each entry includes name, full path ([[id,dtype,creator],...]), legacy param_id/component, dtype and key_count. Pass path alone with the entity handle to get/set/delete keyframes or delete_track. Vector channels have separate entries per component. |
| get_keyframesA | Read keys using a full path from list_tracks or legacy param_id/component. Returns [{frame, value, interp}], preserving fractional frame positions. Optional integer start_frame/end_frame clip the exact key times inclusively without rounding subframes. |
| delete_keyframeA | Remove keys selected by full path or legacy param_id/component. Pass an integer frame for an exact-time key, or integer start_frame/end_frame for an inclusive range; fractional key times are not rounded into the selection. Omitting all frame bounds deletes every key on that track. Returns {removed, track}. |
| delete_trackB | Remove an entire CTrack identified by full path or legacy param_id/component. Returns {removed: bool}. |
| get_fcurveA | Read an existing REAL F-Curve: stable key indices for this snapshot, precise frame times, values, interpolation, tangent offsets and pre/post extrapolation. Optionally sample the track. At most 1000 keys. Does not create a track/curve or change document time. Not a scene/constraint evaluation or character-animation reader. |
| edit_fcurve_keysA | Edit existing REAL keys by snapshot index: values, linear/spline/step interpolation, automatic or manual tangents. Left/right are signed offsets, not absolute control-point positions. Manual takeover splits handles and disables automatic/clamp/auto-weight/overshoot/tangent-lock options; key time/value locks are respected. Read get_fcurve first and avoid simultaneous scene edits. Preflights the complete batch before a single undo-grouped track update. Does not create keys or edit coupled XYZ/time tracks. |
| transform_fcurveA | Retime/scale selected or all REAL keys. Manual tangents scale with the keys; AUTO remains automatic and is recalculated by Cinema 4D. New time = pivot + (old time - pivot) * scale + offset; value uses the analogous formula. Supports subframes, rejects collisions with all keys and out-of-range results before writing. Read the curve again afterward because sorted key indices can change. No time reversal or cross-track bake. |
| set_track_extrapolationA | Set pre/post behavior for an existing REAL track: off, hold constant, continue (linear), repeat, offset repeat or oscillate. Omitted side is preserved. Does not duplicate keys, extend the document frame range or bake loops. |
| 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 |
| rs_get_capabilitiesA | Report exact Redshift renderer, module, node-space, AOV, light, camera, and render support without mutating the scene. |
| rs_create_materialA | Create a Redshift node material, or reuse one exact-name match when requested. |
| rs_create_lightB | Create or update a native Redshift light using only runtime-supported properties. |
| rs_set_cameraB | Create or update a native Redshift camera and report unavailable requested settings. |
| rs_set_material_pbrB | Patch supplied Redshift Standard Material PBR channels. Texture paths are prevalidated; replace_graph requires an explicit document and reliable rollback support. |
| rs_list_aovsB | List Redshift AOVs from the active or named RenderData. |
| rs_upsert_aovB | Create or update one exact Redshift AOV type/name pair. |
| rs_remove_aovA | Remove one indexed Redshift AOV when its expected name and type still match. |
| rs_clear_aovsC | Clear all Redshift AOVs from one explicitly named document. |
| rs_configure_renderC | Create or update a validated Redshift RenderData without implicit activation. |
| rs_renderA | Run a guarded synchronous Redshift render, optionally at an explicit frame with time restoration. sequence_frame restricts output to PNG Beauty without enabled AOVs. The client timeout does not cancel Cinema 4D rendering. |
| rs_render_sequenceA | Start a bounded background Beauty-only PNG sequence (1..300 unique frames), returning job_id immediately. Requires an updated bridge, a uniquely named open document/RenderData with PNG format and no enabled AOVs, and a new output directory whose parent exists. Never overwrites. Do not edit the scene during rendering. Use rs_sequence_status and rs_sequence_control on this same MCP server. Manifest and SHA-256 checks persist beside the frames; job control does not survive server restart. |
| rs_sequence_statusA | Read this MCP session's sequence state, current frame, verified completed outputs, and any error without querying or modifying C4D. An uncertain state means a timed-out render may still be running; do not retry it automatically. |
| rs_sequence_controlA | Cancel stops scheduling after the in-flight frame finishes; it does not abort a C4D render. Resume is allowed only after clean cancellation in this same MCP session, verifies completed-file hashes, and never overwrites. Do not resume after modifying the scene. Failed or uncertain jobs require inspection; their output files remain intact. |
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/YihonW/mcp-c4d-2025'
If you have feedback or need assistance with the MCP directory API, please join our Discord server