How Block Tags Work in Bedrock
In Bedrock Edition, block tags are defined directly inside the block's behavior file rather than in separate tag JSON files. A tag is added as an empty object inside the components block, prefixed with tag:. Because the tag itself acts as the component key, it takes no internal parameters.
When you apply a vanilla tag to a custom block, you are opting that block into whatever hardcoded or data-driven checks the base game runs against that tag. The most common reason to do this is tool compatibility. Vanilla pickaxes, axes, shovels, and hoes check for specific material and tier tags on the block being mined to decide whether to apply their speed multiplier.
If you create a custom stone or ore block and give it a mining time via minecraft:destructible_by_mining, a vanilla pickaxe will still mine it at hand speed unless the block carries the tags the pickaxe looks for. Adding the right vanilla tags bridges your custom content with the base game's equipment.
{
"format_version": "1.20.80",
"minecraft:block": {
"description": {
"identifier": "wiki:custom_copper_ore"
},
"components": {
"minecraft:destructible_by_mining": {
"seconds_to_destroy": 3.0
},
"tag:minecraft:is_pickaxe_item_destructible": {},
"tag:stone": {},
"tag:stone_tier_destructible": {}
}
}
}Tool Affinity and Mining Tier Tags
Over several updates, Bedrock has transitioned from simple legacy material tags to more explicit item-destructible tags. Depending on the format version and which vanilla or custom tools you want to support, it is safest to include both the modern minecraft:is_*_item_destructible tag and the older material tag.
The modern tags control whether a tool class speeds up mining at all, while tier tags indicate the minimum tool quality meant for the block. Note that while vanilla tools check these tags for mining speed, controlling whether a block drops its loot when broken with the wrong tier often still requires checking the player's held item inside your custom loot table or script, as tag enforcement for drops is not automatic across all tags.
Below are the primary tags used by vanilla blocks for tool and tier matching.
| Tag Component | What it does | Notes |
|---|---|---|
| tag:minecraft:is_pickaxe_item_destructible | Marks the block to be mined faster by pickaxes. | Modern standard; requires the minecraft: namespace inside the tag name. |
| tag:minecraft:is_axe_item_destructible | Marks the block to be mined faster by axes. | Use alongside tag:wood for full backwards compatibility. |
| tag:minecraft:is_shovel_item_destructible | Marks the block to be mined faster by shovels. | Commonly paired with tag:dirt or tag:sand. |
| tag:minecraft:is_hoe_item_destructible | Marks the block to be mined faster by hoes. | Used on leaves, hay, and sculk-like blocks. |
| tag:stone_tier_destructible | Identifies the block as requiring at least a stone tool. | No minecraft: namespace after tag:. |
| tag:iron_tier_destructible | Identifies the block as requiring at least an iron tool. | Used on gold, redstone, and diamond ores. |
| tag:diamond_tier_destructible | Identifies the block as requiring at least a diamond tool. | Used on obsidian and ancient debris. |
Material and Categorization Tags
Beyond tool classes, vanilla blocks carry broad material tags. These were the original way tools checked for valid targets, and many vanilla entity behaviors, animations, and older add-on items still query them.
Adding these alongside the modern tool tags costs nothing and prevents edge cases where an entity or an older custom tool fails to recognize your block as wood, stone, or plant matter.
| Tag Component | What it does | Notes |
|---|---|---|
| tag:stone | Groups the block with general stone blocks. | Legacy pickaxe target; still queried by various vanilla systems. |
| tag:wood | Groups the block with planks, logs, and wooden structures. | Legacy axe target. |
| tag:metal | Groups the block with metallic blocks like iron and copper. | Often combined with pickaxe destructible tags. |
| tag:dirt | Groups the block with soil blocks. | Used by certain plant placement checks and legacy shovels. |
| tag:sand | Groups the block with sand and red sand. | Queried by desert-related behaviors and placement rules. |
| tag:plant | Identifies vegetation. | Useful for custom bushes, flowers, and crops. |
| tag:log | Identifies tree trunks and stems. | More specific than tag:wood. |
Querying Block Tags in Molang and Custom Tools
Block tags are not passive labels; you can read them actively in your own pack. In Molang expressions, such as inside entity behavior filters or block placement conditions, you can check whether a block has a specific tag using query.block_has_any_tag or query.block_has_all_tags.
If you are creating a custom tool using the minecraft:digger item component, you can also target vanilla tags in the destroy_speeds array. Instead of listing dozens of individual vanilla and custom block identifiers, a single condition expression using query.any_tag lets your custom tool mine every vanilla and custom block that shares those tags.
{
"format_version": "1.20.80",
"minecraft:item": {
"description": {
"identifier": "wiki:heavy_mattock"
},
"components": {
"minecraft:max_stack_size": 1,
"minecraft:digger": {
"use_efficiency": true,
"destroy_speeds": [
{
"block": {
"tags": "query.any_tag('wood', 'dirt', 'plant', 'minecraft:is_axe_item_destructible', 'minecraft:is_shovel_item_destructible')"
},
"speed": 8
}
]
}
}
}
}Applying Tags Per Permutation
Because tags are components, they can be placed inside the permutations array of a custom block just like geometry or collision boxes. This allows a block to change its material or tool affinity dynamically based on its block states.
For example, a custom block that shifts from a soft clay state to a hardened stone state can use permutations to swap out tag:minecraft:is_shovel_item_destructible for tag:minecraft:is_pickaxe_item_destructible. When the state changes in the world, the game immediately respects the new tag set.
{
"format_version": "1.20.80",
"minecraft:block": {
"description": {
"identifier": "wiki:hardening_mud",
"states": {
"wiki:hardened": [false, true]
}
},
"components": {
"minecraft:destructible_by_mining": {
"seconds_to_destroy": 2.0
}
},
"permutations": [
{
"condition": "!q.block_state('wiki:hardened')",
"components": {
"tag:dirt": {},
"tag:minecraft:is_shovel_item_destructible": {}
}
},
{
"condition": "q.block_state('wiki:hardened')",
"components": {
"tag:stone": {},
"tag:minecraft:is_pickaxe_item_destructible": {}
}
}
]
}
}Which versions this applies to
Applies to Bedrock Edition 1.19.50 and newer in stable releases. The modern item destructible tags (such as tag:minecraft:is_pickaxe_item_destructible) require a block format_version of 1.20.60 or higher to work reliably with all vanilla tools. No experimental toggles are required.
When it does not work
| What you see | Why | The fix |
|---|---|---|
| Vanilla pickaxe mines the custom block at hand speed despite having tag:is_pickaxe_item_destructible. | The modern tool destructible tags require the minecraft: namespace after the tag: prefix, unlike legacy tags such as tag:stone. | Change the component key from "tag:is_pickaxe_item_destructible": {} to "tag:minecraft:is_pickaxe_item_destructible": {}. |
| Content Log error: [Blocks][error]-wiki:custom_block | block_tags | tag components cannot have values. | You placed a boolean or string inside the tag component (for example, "tag:stone": true) instead of an empty JSON object. | Ensure every tag component is assigned an empty object: "tag:stone": {}. |
| Custom digger item fails to load or ignores the tags string in destroy_speeds. | Inside the minecraft:digger component's tags field, you included the "tag:" prefix inside query.any_tag(), such as query.any_tag('tag:stone'). | Omit the "tag:" component prefix when querying tags in Molang or digger components. Write query.any_tag('stone', 'minecraft:is_pickaxe_item_destructible'). |
Reference, straight from the game files
Read out of the game itself, so the ids match the version you are building for.
