How do you enchant and name items with /give using command blocks?

Add this to your command

{display:{Name:"Test Name"},ench:[{id:19,lvl:1}]}

It will give you a Item with the name "Test Name" with knockback 1.

You use this:

ench[{id:(enchantment_id,lvl:enchantment_level)}]

like that for enchantments. For names, use this:

display:{Name="Name of item"}

Remember to use curly brackets and colons inbetweeen.

If you just need the template for whatever reason, here it is pieced together:

/give @p (item id or minecraft:name) 1 0 {display:{Name:"(Name of item)"}, ench:[{id:(enchant id),lvl(1-sideways 8)},[{id:(enchant id),lvl(1-sideways 8)}, repeat enchant block...]}

To add on to 3dsboy08's answer, you can find a list that tells you which id corresponds to which enchantment here. Also, in order to add multiple enchantments at once, you need to use the following syntax inside the "ench" part:

ench:[{id:0,lvl:4},{id:8,lvl:3}]

As a "full" example, the following command would give you a stick called "Irritating Stick" with Sharpness V and Knockback II:

/give excalibur223 stick 1 0 {display:{Name:"Irritating Stick"},ench:[{id:16,lvl:5},{id:19,lvl:2}]}

If you are interested, you can find a table of other NBT tags you can add to items here.


Updated answer as of Java 1.16:

/give @p minecraft:bow{display:Name:{'[{"text":"chuck mc norris"}]'}}

or

/give @p minecraft:bow{display:{Name:"{\"text\":\"chuck mc norris\"}"}}

Mojang updated some of their JSON sequencing for the give command, and now the old name argument doesn't work like it used to. This is the updated command, giving you a bow whose name is "chuck mc norris".


The following command would give the nearest player a bow called Chuck Norris' Gun with the enchantments 48 (Power), 51 (Infinity), 50 (Flame) and 34 (Unbreaking). These enchantments are all level 10000.

/give @p bow 1 0 {display:{Name:"Chuck Norris' Gun"},ench:[{id:48,lvl:10000},{id:51,lvl:10000},{id:50,lvl:10000},{id:34,lvl:10000}]}