How do I give a player an item with custom properties?

Instead of storing the item in a chest, you store it in a structure by saving a 1×1 structure that consists of just air and the item entities. So the step by step guide is:

  1. Throw item(s) on top of a structure block, save the structure with entities (probably as a 1×1×1 sized structure).
  2. Change the structure block to load mode.
  3. When activated, load the structure at the player's position.

Now that you know the plan, let's begin!

Step 1: Customize your item

So to do this, you're going to need to prepare your item in your inventory. Please observe the following things that you can do to prepare your item:

Properties that can be set/changed without using this method

You can set the following item properties in a direct command without having to use this method:

  • Default potion effects: Potions can be given as one of the default potions available in the Creative Inventory using data values.
  • CanPlaceOn and CanDestroy: If you want to give an item with these properties alone, you can simply use /give with the JSON components.

Properties you can set/change with this method

The following properties can be changed within the game using this method:

  • Custom name: Take your item to an anvil. Use the anvil’s rename form to change the item name. Instead of using raw JSON text, use formatting codes to stylize the item name.
  • Some enchantments: Get an enchanted book and combine it with your item in an anvil. You may also use /enchant while holding the item in your main hand. You may not exceed the maximum enchantment level, and you may not enchant items that don't make sense with that enchantment (so no enchanting a fish with Knockback X), but you can use an NBT editor—see below.
  • Filled maps: To give a filled map with custom scale/regions/ to a player, get an empty map yourself, bring it to the region, and activate it. Then place the filled map in the chest. This method is also required to give an empty locator map, because the locator/non-locator data is stored in NBT.

Properties that require an NBT editor to be set/changed

The following properties can be changed through one-time use of an NBT editor. Follow these instructions to modify any of the below listed properties, and place the item in the chest. The below commands will then work to give an exact copy of the item, even with some properties changed, without requiring use of an NBT editor ever again.

  • Lore
  • Unbreakable (won't display on tooltip but still takes effect)
  • Enchantments that an anvil is unable to apply to an item

Properties you cannot set/change

These are item tags that exist in Java Edition, but the matching NBT tag in Bedrock Edition has not been discovered, or is nonexistent. Feel free to tinker with the NBT tags in an editor, and if you can find any new NBT tags, please comment so I can add to this post!

  • Custom potion effects

Step 2: Create the setup

Next we need to create the setup of structures. This is how:

  1. Ensure you have positional coordinates shown. If not, run this command in your chat:

    gamerule showcoordinates true
    
  2. Pick a block on the ground. Any block will do, as long as it is a full block (not bottom slab, not chest, not soul sand, etc.). Stand on it, and note the coordinates that are currently in your position.

  3. You need a structure void for this. Type the following command in your chat:

    give @s structure_void
    
  4. Place the structure void on the block of ground you picked in step 1.

  5. Throw the item that you have customized onto the ground there too. Ensure it is in the same block as the structure void, not next to it.
    From this point, you have 5 minutes to complete the next step. Take too long and your items will disappear!

  6. Run the following command to save the structure:

    structure save <name: string> <from: x y z> <to: x y z> true disk false
    

    But replace the following items in the above command:

    • Replace <name: string> with a memorable name for your structure. Do not forget it or else you will have to create another one without deleting the old one, taking up memory slowly. How wasteful!
    • Replace <from: x y z> with the X, Y, and Z coordinates that I told you to write down in step 1.
    • Replace <to: x y z> with the X, Y, and Z coordinates that I told you to write down in step 1. This means that you should have specified the same coordinates twice.

Step 3: Setup the commands

Setting up the commands is the last thing we need to do before our setup is complete! Place down a single impulse command block that will activate to give our player the item.

That's right, only one command is needed for this:

execute @p[name=target_player] ~ ~ ~ structure load <name: string> ~ ~ ~

Replace <name: string> with the name you saved your structure as. Don't remember it? Now you have to go back to step 2 and create a new structure without deleting the old one because you don't remember its name. How wasteful!

Once you've set up this command block, run it, and you should see that the item entities are summoned right on top of you so you don't need to run and fetch them. Hooray!


Note: This answer is now obsolete. The preferred method is to use the structure method. Please go and use it if you would prefer something that works better!


Original post

Your dreams aren't crushed quite yet. Although it may be true that NBT is inaccessible from commands, there is still a workaround for what you want to do!

Here's a handy workaround that lets you give items with custom names and enchantments.

My plan is:

  1. Place the item you want to give in a chest.
  2. On command, clone the chest to the player's location.
  3. Use /setblock in destroy mode to destroy the chest, causing it to drop all its items on the player.

Item Customization


To discourage use of this obsolete method, this list and its instructions has been moved to the post detailing the better structure method instead. Please go and read it, and if you still want to go through with this method, come back here afterwards.


Once you have prepared your item, place a template chest on the ground and place your item inside.

Commands

Now let's create the command chain we'll be using. Place an impulse command chain of 4 blocks.


But seriously, why would you want to go through with a method that is obsolete? Well, if you're reading this, guess you want to.


Choose the command chain that best suits you.

To give item to a player

  1. Tell the player to clone the chest to their position.

    execute @p[name=THE_PLAYER_TO_TARGET] ~ ~ ~ clone Tx Ty Tz Tx Ty Tz ~ ~ ~
    

    Replace Tx, Ty, and Tz with the template location in both coordinate specifications.

  2. Tell the player to set the block to air and destroy the chest.

    execute @p[name=THE_PLAYER_TO_TARGET] ~ ~ ~ setblock ~ ~ ~ air destroy
    
  3. Kill the chest.

    kill @e[type=item,name=chest]
    

To summon item on the ground:

  1. Clone the chest.

    clone Tx Ty Tz Tx Ty Tz Rx Ry Rz
    

    T: Template location.
    R: Target location.

  2. Set the chest to air and destroy it.

    setblock Rx Ry Rz air destroy
    
  3. Kill the chest.

    kill @e[type=item, name=chest]
    

Sources

While this trick is handy, sadly, I cannot claim ownership of it. I discovered it in a map in Minecraft: Education Edition, from the We Are the Rangers library. I saw it as part of a task in the map, and while looking in the commands, it was too good to not post here. Thank you to the Minecraft Education Edition team at Microsoft for creating such awesome maps!