Structure Requirements

Structure key entries define which block or port can occupy each non-space character in layout. Each example below is one entry in the root key object.

Exact block

"A": {
  "block": "minecraft:glass"
}

This requires the block at every A position to be glass.

Specific port

"A": {
  "port": "mm:my_port",
  "input": true
}

port uses the base port id from config/mm/ports, without the generated _input or _output suffix. The optional input flag selects an input (true) or output (false); omit it to accept either variant.

Add "anywhere": true to let this port requirement match any candidate port position in the structure instead of only its layout position:

"I": { "port": "mm:my_port", "input": true, "anywhere": true }

Port type

"I": {
  "portType": "mm:item",
  "input": true,
  "minTier": 1,
  "maxTier": 3
}

This matches an item port in the selected tier range. input is optional. Tier bounds are optional; the defaults are tier 1 and no upper limit. A port’s tier rank comes from its config. "anywhere": true applies the same flexible-position behavior as for a specific port.

Block tag

"A": {
  "tag": "minecraft:wool"
}

This matches any block in the vanilla minecraft:wool block tag. Structure tag requirements match block tags, not item tags.

Blockstate properties

The properties modifier narrows a base block, tag, or state-list requirement. Property values are strings and must be valid for the matched block state.

"A": {
  "block": "minecraft:oak_log",
  "properties": [
    { "property": "axis", "value": "x" }
  ]
}

Directional properties rotate with the structure where supported.

Named state lists

Define reusable alternatives under the structure root’s stateLists object. Each named state maps to a normal structure-piece requirement; defaultIgnored optionally allows blocks not matching any listed state.

{
  "stateLists": {
    "casings": {
      "basic": { "block": "minecraft:bricks" },
      "reinforced": { "tag": "minecraft:wool" },
      "defaultIgnored": false
    }
  },
  "key": {
    "A": { "stateList": "casings", "nameTranslationKey": "block.example.casings" }
  }
}

nameTranslationKey is optional and changes the displayed name for the state-list requirement. The recognized state names can be used by state-aware integrations and tools.