Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
MAXMCP_PORTNoThe 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_AUTOSTARTNoSet 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

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}

Tools

Functions exposed to the LLM to take actions

NameDescription
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 ( ... ). The value of the last expression is serialized back to JSON:

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 undo "label" on ( ... ) when you want them reversible.

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_*):

  • pure computation, string building, dict/list work: Python is 7-100x faster than MAXScript (100k loop 6 ms vs 55 ms; 5k string concat <1 ms vs 177 ms)

  • scene access is the opposite: creating 200 boxes MAXScript 30 ms vs MaxPlus ~260 ms; walking 200 nodes MAXScript 1 ms vs ~2 ms. So: never drive the scene from here. Use it for logic, parsing, data shaping, or MaxPlus-only APIs, then hand the result back.

The script runs with result as the value that gets returned: result = [n.GetName() for n in ...] Set result on the last line; anything JSON-serializable works.

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 result for the return value. timeout_seconds: how long to wait before giving up.

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 -- name, pos, wirecolor, isHidden, isFrozen, parent, material -- are NOT in any property list, not even getPropNames, yet they work. For those, use max_check to test the expression directly. showClass "*.*" also never lists the abstract node class, so max_api_search "wirecolor" will not find them either.

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 showClass "*.*" (measured: ~39,700 lines / 1.4 MB on 2016, 3.1 s; ~5.3 s on 2025) to a per-port cache, then greps it. This is the only way to answer "does this Max have VRayLight?" or "which classes expose wirecolor?" without guessing from model memory.

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 obj.wirecolor or a plugin property exists, because those are not in any property list -- but evaluation can. Run them before writing code that depends on them.

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 max_api-style reflection is the only ground truth for 2016 specifics. The 2025 reference is still published and is the closest complete prose description of the language; it is crawled into tools/docs/maxscript-2025 by tools/crawl_maxscript_docs.py.

Use this for "how do I use X" / "what are the arguments of Y". Use max_api / max_check for "does THIS Max have it" -- prose can be stale by a release, the running process cannot.

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 limit rows are collected, so truncated: true means "there are more matches", not an exact total.

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

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A3.7/5.0

Scored across 15 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count4/5

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.

Completeness4/5

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.

Maintenance

ActivityMaintained
ResponsivenessNo issues