Skip to main content
Glama
Material Maker MCP

Material Maker MCP

by Tigertycoon

Material Maker MCP

Host checks

A Python MCP server and extended Godot bridge for agent-driven procedural material workflows. An agent can inspect available nodes, validate a graph, build it, compare real 3D previews and export PBR maps with file hashes.

This is an integration project built on Material Maker and Daniel Schemann's original MCP bridge. My contribution is the Python host and the bridge extensions described below, developed with AI coding assistance. Origin and attribution.

What the integration adds

Problem

Implementation

Agents need discoverable operations

35 typed MCP tools, node/parameter discovery and structured results

Generated graphs can contain invalid references

Fragment validation before applying an undoable batch of nodes

Two clients can race on application state

A shared FIFO queue on Godot's main loop, plus session-stable material IDs

A model needs to inspect the actual result

Real 3D viewport captures and labeled PBR maps returned as MCP images

Comparing variants should preserve the source

Bounded parameter sweeps with state restoration after success or reported failure

Exports need observable outcomes

Manifests with filenames, channels, sizes, hashes and changed-file state

Ten declarative starter recipes cover clay, metal, ceramic, stone, brick, fabric and other foundations. Recipes use Material Maker's existing nodes and renderer. The server supplies tools to an external agent; it does not embed a language model or implement RAG.

Related MCP server: bl-mcp

Quick start

Requires Python 3.11+, uv, Git and Godot 4.7 with a working graphics device. The live application is tested on Windows. Host-only CI also runs on Linux. A standard Material Maker binary does not include this extended bridge.

From a clone of this repository:

uv sync --frozen --extra dev
uv run --frozen pytest -q
uv run --frozen python scripts/smoke_mcp.py

The last command verifies the MCP handshake and tool discovery without starting Material Maker.

Prepare a separate application checkout at the reviewed upstream revision:

git clone --no-checkout https://github.com/schemann/material-maker-mcp.git .runtime/material-maker
git -C .runtime/material-maker checkout 3a0a4bbd2662fd647f08767fe36d03024fd0d0c0
uv run --frozen python scripts/install_bridge.py .runtime/material-maker

The installer checks the commit and refuses to replace locally changed addon files. It does not patch application code. Use your Godot 4.7 executable in place of godot below:

godot --headless --editor --import --path .runtime/material-maker
godot --path .runtime/material-maker --no-splash --mcp-port=8767

Keep Material Maker running for live tool calls. The host and addon both default to port 8767. If you already use Material Maker, see setup and isolated testing before sharing its settings or starting another instance.

Connect an MCP client

For a client that accepts the common mcpServers JSON format, replace the repository path with your local clone:

{
  "mcpServers": {
    "material-maker": {
      "command": "uv",
      "args": ["--directory", "/absolute/path/to/material-maker-mcp", "run", "--frozen", "material-maker-mcp"],
      "env": {
        "MATERIAL_MAKER_BRIDGE_HOST": "127.0.0.1",
        "MATERIAL_MAKER_BRIDGE_PORT": "8767",
        "MATERIAL_MAKER_BRIDGE_TIMEOUT": "240"
      }
    }
  }
}

Use an absolute path to uv if your client does not inherit PATH. On Windows, escape backslashes in JSON or use forward slashes.

Start with material_maker_status and list_materials, retain the material ID, discover a recipe or node definition, validate the graph and inspect a preview before exporting. See the example agent workflow.

Verification

uv run --frozen ruff check .
uv run --frozen pytest -q
uv run --frozen python scripts/smoke_mcp.py --configured-command --live
uv run --frozen python scripts/live_contracts.py
uv run --frozen python scripts/concurrency_gate.py

Live checks create disposable materials and output files: run them against a separate test instance, not a session with ongoing work. Set MATERIAL_MAKER_BRIDGE_PORT to match that instance. Recorded results and limits.

Scope

This is a local desktop integration, not a hosted service. The bridge has no authentication or filesystem sandbox; trusted clients can write to explicit paths with the app's permissions. A timeout does not cancel a mutation. Avoid manual edits during automation. Architecture and trust boundary.

The repository includes the Python host, addon, recipes and checks. Material Maker, Godot binaries and third-party material libraries are installed separately. MIT licensed; upstream attribution is retained.

Available Tools

35 tools
activate_materialA
Idempotent

Activate one material tab by an ID returned from list_materials.

Inputs: material_id (required). Returns: object

add_graph_fragmentA

Add up to 256 nodes and their internal connections in one undoable operation.

Each node needs at least type and may include name, parameters, and node_position. Connections use from, from_port, to, and to_port.

Inputs: nodes (required), position, connections, material_id. Returns: object

add_nodeB

Add one node. Call describe_node_type first when ports or parameters are unknown.

Inputs: node_type (required), position, parameters, material_id. Returns: object

apply_material_recipeA

Validate and apply a curated recipe, optionally with constrained parameter overrides.

Overrides use Node.parameter keys and may only target parameters already declared by the recipe. By default a fresh material tab is created to avoid replacing existing inputs.

Inputs: recipe_id (required), position, overrides, create_new, +1 more. Returns: object

connect_nodesC

Connect an output port to an input port after validating both indexes.

Inputs: to_node (required), to_port (required), from_node (required), from_port (required), +1 more. Returns: object

describe_material_recipeB
Read-onlyIdempotent

Return one recipe's graph, parameters, connections, and suggested variations.

Inputs: recipe_id (required). Returns: object

describe_node_typeB
Read-onlyIdempotent

Get ports, parameters, defaults, ranges, and documentation for a node type.

Inputs: name (required). Returns: object

disconnect_nodesC

Disconnect one exact graph connection.

Inputs: to_node (required), to_port (required), from_node (required), from_port (required), +1 more. Returns: object

duplicate_nodeC

Duplicate one node; by default the copy is offset by 80 pixels.

Inputs: node (required), position, material_id. Returns: object

export_materialC
Destructive

Export a material and return every output file with size, hash, and channel.

Inputs: prefix (required), profile (required), size, material_id. Returns: object

get_material_graphB
Read-onlyIdempotent

Return the current material graph, connections, parameters, and save path.

Inputs: material_id. Returns: object

get_material_nodeB
Read-onlyIdempotent

Inspect a graph node, including ports and current parameter values.

Inputs: node (required), material_id. Returns: object

get_node_parameterC
Read-onlyIdempotent

Read one node parameter.

Inputs: name (required), node (required), material_id. Returns: object

list_bridge_actionsA
Read-onlyIdempotent

List the internal bridge actions and their implementation status.

Inputs: no named parameters. Returns: result

list_export_profilesB
Read-onlyIdempotent

List export profiles supported by the current PBR material node.

Inputs: material_id. Returns: object

list_material_recipesA
Read-onlyIdempotent

List the curated declarative starter recipes, optionally filtered by text or tag.

Inputs: tag, query. Returns: result

list_materialsA
Read-onlyIdempotent

List open material tabs with stable session IDs, active state, and undo state.

Inputs: no named parameters. Returns: object

list_node_typesB
Read-onlyIdempotent

List Material Maker node types, optionally filtered by category or text.

Inputs: limit, query, category. Returns: result

load_materialB

Load an existing .ptex material from an absolute or user-relative path.

Inputs: path (required). Returns: object

material_maker_diagnosticsA
Read-onlyIdempotent

Return queue state, active operation timing, versions, and recent bridge errors.

Inputs: no named parameters. Returns: object

material_maker_statusA
Read-onlyIdempotent

Check whether the bridge, Material Maker, and a material graph are ready.

Inputs: no named parameters. Returns: object

move_nodeB
Idempotent

Move a node to an absolute [x, y] graph position.

Inputs: node (required), position (required), material_id. Returns: object

new_materialB

Open a new material project with Material Maker's default PBR output node.

Inputs: no named parameters. Returns: object

preview_materialB
Read-onlyIdempotent

Return the live 3D PBR preview as MCP image content for visual inspection.

Inputs: model, width, height, rotation, +1 more.

preview_material_mapsA
Read-onlyIdempotent

Export and return all PNG/JPEG/WebP PBR maps as labeled MCP images.

The temporary export is deleted after its bytes have been embedded in the MCP response. Use export_material when persistent output files are required.

Inputs: size, profile, material_id.

preview_material_variationsC
Read-onlyIdempotent

Return safe parameter variations as labeled 3D MCP images without keeping files.

Inputs: variations (required), size, model, rotation, +1 more.

redoC

Redo one operation in the selected or active material.

Inputs: material_id. Returns: object

remove_nodeB
Destructive

Remove a node and all of its graph connections.

Inputs: node (required), material_id. Returns: object

render_material_variationsA
Destructive

Render up to 64 parameter combinations and restore the original graph state.

variations maps node names to parameters and value lists, for example {"Noise": {"scale": [2.0, 4.0], "seed": [1, 2]}}. Preview mode writes 3D preview PNGs; export mode writes the selected profile and returns each manifest.

Inputs: output_dir (required), variations (required), mode, size, +4 more. Returns: object

render_nodeB
Destructive

Render one node output to a PNG file; the destination directory must exist.

Inputs: node (required), path (required), width, height, +2 more. Returns: object

save_materialB
Destructive

Save the current material; omit path to reuse its existing .ptex path.

Inputs: path, material_id. Returns: object

save_material_previewB
Destructive

Save Material Maker's actual 3D PBR preview to a PNG file.

Inputs: path (required), model, width, height, +2 more. Returns: object

set_node_parameterC
Idempotent

Set a validated node parameter and trigger Material Maker's update path.

Inputs: name (required), node (required), value (required), material_id. Returns: object

undoB

Undo one operation in the selected or active material.

Inputs: material_id. Returns: object

validate_graph_fragmentC
Read-onlyIdempotent

Preflight a graph fragment without changing Material Maker.

Inputs: nodes (required), connections, material_id. Returns: object

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    B3.1/5.0

    Scored across 35 tools

    Disambiguation4/5

    Most tools target distinct resources and actions, but there are several closely related preview/render/export variants (e.g., preview_material, preview_material_maps, preview_material_variations, render_material_variations) and overlapping meta tools (material_maker_status vs. material_maker_diagnostics). Descriptions help, but an agent could still hesitate between some of these.

    Naming Consistency4/5

    Almost all tools use snake_case and a verb_noun pattern, with clear operations like list_materials, add_node, and export_material. Minor deviations include server-prefixed noun phrases (material_maker_status, material_maker_diagnostics) and new_material instead of a create-style verb, but the convention is largely predictable.

    Tool Count2/5

    35 tools is well above the recommended 3–15 range and exceeds the 25+ threshold for being too many. While the domain is complex, many granular tools could be consolidated or composed, and the large surface increases selection burden for an agent.

    Completeness4/5

    The toolset covers material creation/loading/saving, node graph editing, parameter access, previews, exports, recipes, and undo/redo, which is strong lifecycle coverage. Some gaps remain, such as closing/deleting material tabs and batch parameter updates, but agents can generally work around them.

    Maintenance

    ActivitySlowing
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables AI assistants to create Material Maker node graphs from natural language, validate them against the node catalog, and render them headlessly to PBR texture maps and editable .ptex files.
      11
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      Enables an AI agent to drive a live Blender session, building, sculpting, measuring, checking, rigging, lighting, rendering and exporting 3D models through safe operations in world units. Every geometry-changing call reports achieved dimensions, open edges and failures as numbers and review images, so modelling mistakes become visible instead of silent.
      113
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables agents and Blender users to generate game-ready art through a set of Blender tools covering concept image generation, image-to-3D mesh creation, mesh cleanup, PBR material assignment, greybox level layout, camera pathing and still or sequence rendering. Every action runs headless Blender, returns machine-readable JSON with pass/fail self-checks such as triangle budget, scale, pivot and clearance, so agents can verify and fix each step unattended.
      MIT