max-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MAXMCP_PORT | No | The port the MCP server listens on / connects to for a specific 3ds Max version. Default follows the port rule: port = 47100 + (release year - 2016), e.g. 2016 → 47100, 2025 → 47109, 2027 → 47111. Specify it explicitly to run multiple instances of the same Max version. | |
| MAXMCP_AUTOSTART | No | Set to 0 to make the Max bridge load but not start; enable it manually via the MCP Bridge menu item when needed. | 1 |
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": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| max_statusA | Check the bridge and report 3ds Max build, scene, units, timeline, renderer. Call this first in a session: it tells you whether Max is reachable, which scene is loaded, and what units the numbers in every other tool mean. |
| max_evalA | Execute raw MAXScript in the live Max session and return the resulting value. This is the escape hatch for everything the structured tools do not cover.
The code runs verbatim (no wrapper is added), so write a complete
expression and wrap multi-statement code in Integer/Float -> number, String -> string, Point3 -> [x,y,z], Array -> array (first 2000 items), node/material/anything else -> its name. Nothing is auto-saved and no undo block is opened for you. Wrap writes in
Args: code: MAXScript source. Multi-statement code must be wrapped in ( ). timeout_seconds: how long to wait before giving up (Max may still be busy). |
| max_pythonA | Execute Python inside Max (2.7 + MaxPlus) -- a second engine, chosen explicitly. WHEN TO USE THIS (measured on real Max 2016, see tests/bench_*):
The script runs with CAVEATS on Max 2016: Python is 2.7 and the object API is MaxPlus, which Autodesk removed in 2017 (replaced by pymxs). Code written against MaxPlus will not survive a Max upgrade, unlike MAXScript. Args:
code: Python source. Assign to |
| max_apiA | List the members a class DECLARES. Reflect instead of guessing. Model memory about MAXScript is unreliable and version-specific -- this session alone produced six wrong assumptions (BooleanClass vs Boolean, formattedPrint format strings, getNodeByName default args, node.layer, byte[].Length, case on strings). KNOWN BLIND SPOT: this lists only members declared on the class itself.
Node-level universal properties -- Args: class_name: class to inspect, e.g. "Box", "Editable_Poly", "VRayLight". pattern: member name filter, MAXScript wildcard. "*" lists everything, "*segs" narrows to matching members (much shorter output). |
| max_api_searchA | Search the ENTIRE API surface of the running Max -- classes and members. Dumps Answers, for example: max_api_search "wirecolor" -> every class exposing that property + type max_api_search "VRay" -> which V-Ray classes are actually installed max_api_search "Alembic" -> whether that importer exists here Args: keyword: case-insensitive substring matched against class and member names. limit: max matches to return. refresh: rebuild the cache even if one exists (after installing plugins). |
| max_checkA | Try a list of MAXScript expressions and report which ones actually work. This is the counterpart to max_api's blind spot. Reflection cannot tell you
whether Args: expressions: MAXScript expressions to evaluate in order, e.g. ["(Box()).wirecolor", "(Box()).custom_attr", "units.SystemType"]. |
| max_docA | Search a local copy of the MAXScript Reference for a term. Why local: Autodesk retired the 2016 documentation entirely (cloudhelp/2016
returns 404), so Use this for "how do I use X" / "what are the arguments of Y". Use
Args: query: term to look for, case-insensitive (e.g. "polyop", "getNodeByName"). limit: max matching pages. snippet_chars: characters of surrounding context per hit. |
| max_scene_summaryA | Aggregate the whole scene: class histogram, missing bitmaps, layers. Use this to orient yourself before writing queries -- it answers "what kind of scene is this, and is anything broken" in one call. Args: top_n: how many entries to keep in the class histogram. |
| max_query_objectsA | List scene nodes matching a filter. Returns compact rows, not full dumps. Row fields: name, class, layer, material, verts, faces, pos, hidden, frozen, children.
Scanning stops as soon as Args: name_pattern: MAXScript matchPattern syntax, e.g. "Box*", "SM_*_LOD0", "*". class_name: exact class filter such as "Box", "Editable_Poly", "VRayMesh". Empty = all. layer: exact layer name. Empty = all. limit: max rows to return (1-2000). offset: skip this many matches first, for paging. |
| max_get_objectA | Full detail for one node: transform, modifier stack, material, hierarchy, bbox. Cheaper and safer than a max_eval for "tell me everything about this object". Args: name: exact node name, e.g. "Box001". |
| max_set_propertyA | Set one property on many nodes inside a single undo block. Examples: prop="wirecolor" value=[255,0,0]; prop="name" value="SM_x"; prop="pos" value=[0,0,100]; prop="visibility" value=False. Args: names: node names to touch. prop: property name as MAXScript sees it (getProperty/setProperty). value: number, string, bool, or 3-element list for Point3. |
| max_create_objectA | Create a primitive, or import geometry from disk. kind: box | sphere | cylinder | plane | teapot | cone | torus | import size keys by kind -- box{w,l,h} sphere{r} cylinder{r,h} plane{w,l} teapot{r} cone{r,h} torus{r,r2}. For kind="import": {"path": "..."}. Args: kind: primitive type or "import". name: node name (ignored for import). pos: [x,y,z] world position. params: size parameters, see above. |
| max_delete_objectsB | Delete nodes by name inside one undo block. Args: names: node names to delete. |
| max_screenshotA | Capture the active viewport (or a quick render) and return it as an image. Use this to verify a change actually looks right instead of inferring from coordinates. Rendering is slower (seconds) but respects camera and lights. Args: render: False = grab the viewport framebuffer (instant); True = render the active view (honours materials and lights). width: render width when render=True. height: render height when render=True. |
| max_file_ioC | Import, export, or merge geometry files (FBX / OBJ / MAX). Args: action: "import" | "export" | "merge". path: absolute file path. selected_only: export only the current selection. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 15 tools
Most tools map to clearly distinct resources/actions (get_object vs query_objects vs scene_summary vs create/delete/set_property), and descriptions explicitly state when to prefer one over another. The overlap is concentrated in the introspection cluster (max_api, max_api_search, max_check, max_doc) and the two execution engines (max_eval vs max_python); the prose disambiguates them, but an agent could still pick the wrong one for 'does this exist' questions.
Every tool uses a uniform max_ prefix with snake_case, which makes the set instantly recognizable. The only deviation is naming style: some tools are verb_noun (query_objects, get_object, set_property, create_object) while others are bare nouns (status, screenshot, file_io, scene_summary, doc), which slightly weakens predictability without being confusing.
Fifteen tools sits at the upper bound of a well-scoped set, and for a full DCC bridge with introspection, scene CRUD, and screenshotting this is defensible. There is mild redundancy: geometry import is exposed both as max_create_object kind="import" and as max_file_io action="import", which is one tool too many for that operation.
Read (query/get/summary), write (create/set_property/delete), file I/O, and visual verification are all covered, plus max_eval/max_python as a genuine escape hatch. Gaps remain for common workflows — no modifier add/remove, no material assignment, no animation/keyframe tools, no scene save/open, and no selection manipulation — but the escape hatches let an agent work around all of these.