Skip to main content
Glama

Generate PBR maps from an image

material_from_image
Destructive

Turn ONE uploaded image (e.g. a logo PNG) into a full PBR material — deterministic, no AI. A mask (alpha channel, or bright/dark regions) drives derived roughness (baseRoughness/maskRoughness), embossed normal + height maps, optional metallic, and a base color composited over baseColor. Commits a new revision with the material (applyToObjects assigns it); maps pack into the .blend. Generated maps cap at 2048px on the longest edge — for full-resolution label/print work (4K macro shots), embed the original texture in a GLB and import via asset_import. Flow: upload_create → PUT → upload_complete → material_from_image. Returns a durable job handle. Explicit profile=surface/decal/supplied opts into the version-2 downloadable map workflow with roles and options; legacy mask/emboss arguments apply only when profile is omitted. Decals preserve transparency without implicit relief or metallic.

Input Schema

NameRequiredDescriptionDefault
rolesNo
embossNo
assetIdYes
optionsNo
profileNo
baseColorNo
projectIdYesStable project ID returned by project_create or projects_list.
maskSourceNoalpha
baseMetallicNo
maskMetallicNo
materialNameNoImage Material
baseRoughnessNo
maskRoughnessNo
applyToObjectsNo
baseRevisionIdNo"HEAD" (default) targets the project's current head. Mutations MUST build on the head: passing an older revision is rejected with REVISION_CONFLICT, since history is linear. To continue from an older scene, revision_restore it forward first.HEAD
idempotencyKeyYesStable caller-chosen key for safe retries of this same request.

Output Schema

NameRequiredDescriptionDefault
jobYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed23 schema fields changed
    • addedInput schema / properties / options / properties / alphaCutoff / description
      Added value: +"Mask-mode alpha threshold, 0-1; default 0.5. Ignored by opaque/blend modes."
    • addedInput schema / properties / options / properties / alphaMode / description
      Added value: +"Material opacity behavior. Default opaque, or blend for decal profile; delivered PNG alpha is preserved regardless."
    • addedInput schema / properties / options / properties / displacementMode / description
      Added value: +"How the material uses height: none (default), shader bump, or displacement. A height map must be available; renderer/export support varies."
    • addedInput schema / properties / options / properties / emissionStrength / description
      Added value: +"Material emission multiplier, 0-10000; default 1 when emission is requested, otherwise 0. Requires an emission output to light the material."
    • addedInput schema / properties / options / properties / heightMidlevel / description
      Added value: +"Height value representing zero displacement, 0-1; default 0.5."
    • addedInput schema / properties / options / properties / heightScale / description
      Added value: +"Relief height in meters, 0-1; default 0.001. Used for height-derived normals and material bump/displacement."
    • addedInput schema / properties / options / properties / heightSource / description
      Added value: +"If no height map is supplied, explicitly allow height estimation from base_color luminance or alpha. Default none; estimated relief is labeled heuristic."
    • addedInput schema / properties / options / properties / maxSize / description
      Added value: +"Maximum output side in pixels, 8-4096; default 2048. Sources are aligned at their common aspect ratio without upscaling."
    • addedInput schema / properties / options / properties / metallic / description
      Added value: +"Constant metallic fallback, 0-1; default 0. Supplied metallic maps take precedence; brightness does not establish metalness."
    • addedInput schema / properties / options / properties / normalConvention / description
      Added value: +"Convention of supplied normal maps: OpenGL +Y (default) or DirectX -Y. A change to output convention flips the green channel."
    • addedInput schema / properties / options / properties / normalStrength / description
      Added value: +"Normal intensity multiplier, 0-16; default 1. Applied when converting supplied vectors or deriving normals from height."
    • addedInput schema / properties / options / properties / outputNormalConvention / description
      Added value: +"Convention for delivered normal maps, OpenGL +Y by default or DirectX -Y; the Blender material compensates for the output convention."
    • addedInput schema / properties / options / properties / packing / description
      Added value: +"Optional extra packed PNG: ORM uses red=ambient occlusion, green=roughness, blue=metallic; default none. Missing AO uses a documented white fallback."
    • addedInput schema / properties / options / properties / physicalCoverageMeters / description
      Added value: +"Real dimensions of one UV tile for height-to-normal scaling. If omitted, derived relief normals assume a one-meter UV square."
    • addedInput schema / properties / options / properties / physicalCoverageMeters / properties / height / description
      Added value: +"Physical height in meters represented by one complete texture tile; positive, at most 100000."
    • addedInput schema / properties / options / properties / physicalCoverageMeters / properties / width / description
      Added value: +"Physical width in meters represented by one complete texture tile; positive, at most 100000."
    • addedInput schema / properties / options / properties / roughness / description
      Added value: +"Constant roughness fallback, 0-1; default 0.65. A supplied roughness map or converted gloss map takes precedence."
    • addedInput schema / properties / options / properties / roughnessMode / description
      Added value: +"Fallback roughness generation: constant (default) or an explicitly requested base_color brightness estimate. Image-derived roughness is heuristic, not measured."
    • addedInput schema / properties / options / properties / roughnessRange / description
      Added value: +"[minimum, maximum] roughness for image estimates, increasing within 0-1; default [0.35, 0.85]."
    • addedInput schema / properties / options / properties / seamMode / description
      Added value: +"Analyze edges only (default) or blend edge pixels along tile axes. Blending changes imagery and may cause ghosting; inspect the repeat preview."
    • addedInput schema / properties / options / properties / specular / description
      Added value: +"Constant specular fallback, 0-1; default 0.5. Supplied specular maps take precedence."
    • addedInput schema / properties / options / properties / tile / description
      Added value: +"Texture axes to treat as periodic for relief and seam handling; default none. Does not guarantee perceptually seamless repetition."
    • addedInput schema / properties / roles / items / description
      Added value: +"Semantic map role; use one source per role. Color maps and scalar/vector data maps are interpreted differently."
  2. Changed8 schema fields changed
    • addedInput schema / properties / baseColor / items
      Added value: +{
      +  "maximum": 1,
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / baseColor / maxItems
      Added value: +4
    • addedInput schema / properties / baseColor / minItems
      Added value: +4
    • removedInput schema / properties / baseColor / prefixItems
      Removed value: -[
      -  {
      -    "maximum": 1,
      -    "minimum": 0,
      -    "type": "number"
      -  },
      -  {
      -    "maximum": 1,
      -    "minimum": 0,
      -    "type": "number"
      -  },
      -  {
      -    "maximum": 1,
      -    "minimum": 0,
      -    "type": "number"
      -  },
      -  {
      -    "maximum": 1,
      -    "minimum": 0,
      -    "type": "number"
      -  }
      -]
    • addedInput schema / properties / options / properties / roughnessRange / items
      Added value: +{
      +  "maximum": 1,
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / options / properties / roughnessRange / maxItems
      Added value: +2
    • addedInput schema / properties / options / properties / roughnessRange / minItems
      Added value: +2
    • removedInput schema / properties / options / properties / roughnessRange / prefixItems
      Removed value: -[
      -  {
      -    "maximum": 1,
      -    "minimum": 0,
      -    "type": "number"
      -  },
      -  {
      -    "maximum": 1,
      -    "minimum": 0,
      -    "type": "number"
      -  }
      -]
  3. Changed3 schema fields changed
    • addedInput schema / properties / options
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "alphaCutoff": {
      +      "maximum": 1,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "alphaMode": {
      +      "enum": [
      +        "opaque",
      +        "mask",
      +        "blend"
      +      ],
      +      "type": "string"
      +    },
      +    "displacementMode": {
      +      "enum": [
      +        "none",
      +        "bump",
      +        "displacement"
      +      ],
      +      "type": "string"
      +    },
      +    "emissionStrength": {
      +      "maximum": 10000,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "heightMidlevel": {
      +      "maximum": 1,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "heightScale": {
      +      "maximum": 1,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "heightSource": {
      +      "enum": [
      +        "none",
      +        "luminance",
      +        "alpha"
      +      ],
      +      "type": "string"
      +    },
      +    "maxSize": {
      +      "maximum": 4096,
      +      "minimum": 8,
      +      "type": "integer"
      +    },
      +    "metallic": {
      +      "maximum": 1,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "normalConvention": {
      +      "enum": [
      +        "opengl",
      +        "directx"
      +      ],
      +      "type": "string"
      +    },
      +    "normalStrength": {
      +      "maximum": 16,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "outputNormalConvention": {
      +      "enum": [
      +        "opengl",
      +        "directx"
      +      ],
      +      "type": "string"
      +    },
      +    "packing": {
      +      "enum": [
      +        "none",
      +        "orm"
      +      ],
      +      "type": "string"
      +    },
      +    "physicalCoverageMeters": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "height": {
      +          "exclusiveMinimum": 0,
      +          "maximum": 100000,
      +          "type": "number"
      +        },
      +        "width": {
      +          "exclusiveMinimum": 0,
      +          "maximum": 100000,
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "width",
      +        "height"
      +      ],
      +      "type": "object"
      +    },
      +    "roughness": {
      +      "maximum": 1,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "roughnessMode": {
      +      "enum": [
      +        "constant",
      +        "luminance",
      +        "inverted_luminance"
      +      ],
      +      "type": "string"
      +    },
      +    "roughnessRange": {
      +      "prefixItems": [
      +        {
      +          "maximum": 1,
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        {
      +          "maximum": 1,
      +          "minimum": 0,
      +          "type": "number"
      +        }
      +      ],
      +      "type": "array"
      +    },
      +    "seamMode": {
      +      "enum": [
      +        "analyze",
      +        "blend"
      +      ],
      +      "type": "string"
      +    },
      +    "specular": {
      +      "maximum": 1,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "tile": {
      +      "enum": [
      +        "none",
      +        "x",
      +        "y",
      +        "xy"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / profile
      Added value: +{
      +  "enum": [
      +    "surface",
      +    "decal",
      +    "supplied"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / roles
      Added value: +{
      +  "items": {
      +    "enum": [
      +      "base_color",
      +      "normal",
      +      "height",
      +      "roughness",
      +      "metallic",
      +      "opacity",
      +      "emission",
      +      "ao",
      +      "specular",
      +      "specular_color",
      +      "gloss",
      +      "cavity",
      +      "diffuse"
      +    ],
      +    "type": "string"
      +  },
      +  "maxItems": 13,
      +  "minItems": 1,
      +  "type": "array"
      +}
  4. First observed

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations set destructiveHint=true and readOnlyHint=false, and the description earns credit by disclosing what actually happens: a new revision is committed, applyToObjects assigns it, maps pack into the .blend, and a durable job handle is returned. It adds the 2048px generation cap and the decal/profile behavior switch, which annotations do not cover. It doesn't explain the consequence of the destructive hint (linear history, revision conflicts on stale baseRevisionId), so a small gap remains.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and scope, then the cap/alternative, then flow, then the profile caveat. It is dense (semicolon-packed sentences) but nearly every clause carries a discriminator or constraint that an agent needs. Slightly heavier than ideal for a description that could have deferred the longer options discussion to the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Annotations and an output schema exist, so the description needn't restate safety or return shapes; it correctly focuses on the non-obvious parts (upload flow, profile switch, size cap, decal transparency). Given 16 parameters and a deep nested options object, a few gaps remain — destructive/revision-conflict semantics and role interpretation for the roles array — but nothing an agent needs in order to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 19% schema coverage across 16 parameters plus a 20-property nested options object, the schema leaves most of the semantics unstated. The description compensates for the most consequential distinction — profile=surface/decal/supplied invoking the v2 workflow while legacy mask/emboss arguments apply only when profile is omitted — and glosses maskSource, baseRoughness/maskRoughness, baseColor and metallic. But the majority of options (tile, seamMode, normalConvention, displacementMode, physicalCoverageMeters, alphaMode) are left entirely to the schema, so it adds real but partial value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Turn ONE uploaded image into a full PBR material') plus a key differentiator ('deterministic, no AI'). Combined with the caps note routing 4K work to asset_import, an agent can tell this apart from material_from_maps and texture_maps_create without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit prerequisite chain (upload_create → PUT → upload_complete → material_from_image) and a clear exclusion with an alternative for full-resolution label work (embed in GLB via asset_import). It stops short of contrasting the profile vs legacy argument paths against the sibling material_from_maps, so routing is clear but not fully disambiguated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources