Skip to main content
Glama
MaxForge MCP

MaxForge MCP

by BluntMan-420

MaxForge MCP

Lets an AI agent (Claude, or anything else that speaks MCP) drive a live 3ds Max session — not by generating scripts for a human to paste in, but by actually creating, editing, and animating objects in real time while Max is open.

Normally, getting an AI to help in 3ds Max means it writes a script and you run it yourself, blind to whether it actually worked. This closes that loop: the agent can query the real scene state before and after every action, catch its own mistakes, and iterate live instead of guessing.

What it can do

Inspect the scene

list objects, read the current selection, query units / frame rate / frame range

Create & transform

primitives, position / rotation / scale

Materials & textures

create a material, load a bitmap texture, assign it to objects

Animation

keyframe position/rotation/scale across frames with real spline interpolation

Collision proxies

generate a basic bounding-box proxy for an object

Export & save

export selected objects or the whole scene, save the .max file

Escape hatch

run arbitrary raw MaxScript or Python for anything not covered above

Every mutation is wrapped in a real undo block — anything the agent does is a normal Ctrl+Z away from being undone.

Related MCP server: 3dsmax-mcp

How it works

AI agent (MCP client) --stdio--> server/max_mcp_server.py --TCP, localhost only--> max_side/bridge.py (inside 3ds Max)

A small Python bridge runs inside 3ds Max, loaded via a startup script, and opens a socket bound to 127.0.0.1 only. An MCP server outside Max connects to it and exposes the tools above. Every command runs on Max's main thread via a Qt timer — the 3ds Max SDK isn't thread-safe, so commands arriving on a socket thread are queued and drained on the main loop rather than executed directly.

max_side/
  bridge.py      socket + main-thread queue (the only place pymxs is touched)
  commands.py    one function per tool, each wrapped in an undo block
  serialize.py   converts pymxs values (Point3, Matrix3, nodes, ...) to JSON
  startup_stub.ms   drop into Max's startup scripts folder
server/
  client.py         TCP client, newline-delimited JSON
  tools.py           MCP tool definitions
  max_mcp_server.py  the MCP server itself (stdio transport)

Setup

Requirements: 3ds Max 2022+ (pymxs), Python 3.10+ on the machine running the MCP server, uv.

1. Install dependencies

uv sync

2. Load the bridge into 3ds Max

Copy max_side/startup_stub.ms into Max's startup scripts folder — typically:

%LOCALAPPDATA%\Autodesk\3dsMax\<version>\ENU\scripts\startup\

Open the copied startup_stub.ms and set MAXFORGE_REPO_PATH to wherever you cloned this repo. It starts the bridge on port 47823 automatically the next time Max launches. Three macroscripts (category "MaxForge MCP") are also registered for manual control — Start / Stop / Reload — so you can pick up code changes without restarting Max.

3. Point an MCP client at it

For Claude Code:

claude mcp add maxforge -- <repo>\.venv\Scripts\python.exe <repo>\server\max_mcp_server.py

Or wire server/max_mcp_server.py into any other MCP-compatible client's config the same way.

Safety

The socket only ever binds to 127.0.0.1 — never the network. This is a code-execution endpoint sitting inside a modeling app; it's designed to only be reachable from the same machine it runs on.

Status

Live-tested against a running Max 2025 session with a full assertion-based suite (29/29 checks) covering every tool, every error path, and an undo/redo round trip.

create_collision_proxy currently only builds a generic axis-aligned box — it isn't tuned to any specific game engine's collision format yet.

Adding a new tool

  1. Add a handler in max_side/commands.py, wrapped in undoable("MCP: ..."), registered in the COMMANDS dict.

  2. Add a matching wrapper in server/tools.py — its docstring is what the agent sees.

  3. Register it in the loop at the top of server/max_mcp_server.py.

  4. Run the "Reload MaxForge Bridge" macroscript in Max instead of restarting.

License

Copyright (c) 2026 .bluntman420. — see LICENSE.md. Free to use as-is; modification and redistribution of modified versions is not permitted.

Available Tools

17 tools
add_modifierB

Add a modifier by its MAXScript class name (Edit_Poly, Bend, UVW_Map, Turbosmooth, ...) to an object, with optional properties.

Inputs: handle (required), modifier (required), params.

apply_materialB

Create a Standard material (optionally with a diffuse bitmap texture loaded from disk) and assign it to the given objects.

Inputs: handles (required), material_name, diffuse_bitmap.

create_collision_proxyA

Create a simple axis-aligned box collision proxy for each given object, sized to its world bounding box and named {prefix}{name}. This is a generic starting point, not tuned to any specific game engine's collision format yet.

Inputs: handles (required), prefix.

create_objectB

Create a primitive/object by its MAXScript class name (Box, Sphere, Cylinder, Plane, Cone, Torus, Teapot, ...). params are extra creation-time properties (e.g. {"radius": 10, "height": 20}).

Inputs: type (required), pos, name, params.

deleteC

Delete objects by handle.

Inputs: handles (required).

exportC

Export the scene (or just the given handles) to disk. The exporter is chosen from the path's file extension (.fbx, .obj, ...).

Inputs: path (required), format, handles.

get_scene_infoA

Get scene units, frame rate, frame range, and object count.

Inputs: no named parameters.

get_selectionA

Get the objects currently selected in the 3ds Max viewport.

Inputs: no named parameters.

list_objectsB

List scene objects, each as {handle, name, class, pos, bbox}. filter matches (case-insensitive) against object name or class.

Inputs: filter, selected_only.

pingA

Check the bridge connection and report the 3ds Max scene state.

Inputs: no named parameters.

run_maxscriptA

Execute arbitrary MaxScript inside 3ds Max and return the result of the last expression. Escape hatch for anything not covered by a typed tool below.

Inputs: code (required).

run_pythonA

Execute arbitrary Python inside 3ds Max's embedded interpreter (pymxs available as rt). For an expression, its value is returned; for a statement block, assign to a variable named result to return something. stdout is captured and returned too.

Inputs: code (required).

save_sceneB

Save the current scene. Omit path to save in place.

Inputs: path.

selectB

Select objects by handle (replaces the current selection).

Inputs: handles (required).

set_keyframeC

Set an animation keyframe on an object at the given frame number.

Inputs: handle (required), pos, rot, time, +1 more.

set_propertyC

Set an arbitrary MAXScript property on an object by name and return its new value.

Inputs: prop (required), value (required), handle (required).

transformB

Set an object's world position, Euler rotation (degrees, XYZ), and/or scale.

Inputs: handle (required), pos, rot, scale.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.3/5.0

    Scored across 17 tools

    Disambiguation5/5

    Every tool targets a distinct operation in the 3ds Max domain: scene state, materials, animation, scripting, selection, object creation, transformation, properties, deletion, export, and saving. Even the two scripting tools (run_maxscript and run_python) are cleanly separated by language, and set_property vs. transform have clear boundaries (arbitrary vs. spatial transformation). No two tools appear to do the same thing.

    Naming Consistency3/5

    The majority of tools follow a verb_noun pattern (apply_material, set_keyframe, get_scene_info, create_object, set_property, save_scene, add_modifier). However, several tools use bare verbs (select, transform, delete, export, ping) and two use verb_language (run_maxscript, run_python). This mix of patterns is readable but not fully consistent.

    Tool Count4/5

    With 17 tools, this is slightly above the ideal 3-15 range but still appropriate for a comprehensive 3ds Max bridge that covers modeling, animation, scene management, and export. The tools are not redundant, and the count reflects the breadth of operations required for a professional DCC integration.

    Completeness4/5

    The surface covers the core lifecycle: create, inspect, modify, delete, select, save, export, and add modifiers. It also handles materials and keyframes. Minor gaps include lack of a dedicated get_property tool (though run_maxscript can access anything) and no duplicate or group operations. Overall, agents can accomplish most workflows without dead ends.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      Enables AI assistants to directly control Autodesk 3ds Max through natural language to create models, set materials, adjust lighting, and automate animations. It bridges the Model Context Protocol with 3ds Max via a TCP socket to execute Python and MAXScript commands.
      24
      18
      MIT
    • A
      license
      Not graded
      quality
      A
      maintenance
      Connect AI agents to Autodesk 3ds Max through the Model Context Protocol, enabling natural language control of scene creation, materials, modifiers, rendering, and plugin workflows.
      274 PyPI
      372
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables AI agents to connect to Autodesk 3ds Max via the Model Context Protocol, allowing natural-language control of scene creation, modeling, materials, viewport capture, and plugin introspection through dedicated MCP tools.
      MIT
    • A
      license
      B
      quality
      B
      maintenance
      Enables AI agents to directly control Autodesk 3ds Max for modeling, shading, rigging, animation, rendering, baking, and engine export through MCP.
      375
      3
      MIT