execute as @e[type=item,nbt={Item:{tag:{empty:1b}}}] at @s run say 123
Здесь всё, в целом, правильно, но для старой версии. В Minecraft 1.20.5 разработчики переписали весь пласт игры, отвечающий за хранение данных предметов, чем здорово улучшили производительность, но создали много неудобств в обновлении команд. Теперь кастомные теги (empty:true) нельзя просто так записать в предмет, для этого разработчики выделили компонент custom_data (теперь вместо системы nbt-тегов используются компоненты). Делается это так (на примере камня):
/give @a stone[custom_data={empty:true}]
Соответственно, проверка такого предмета в инвентаре и на земле (в виде сущности) делается так:
/execute as @a[nbt={Inventory:[{components:{"minecraft:custom_data":{empty:true}}}]}] run say 123
/execute as @e[type=item,nbt={Item:{components:{"minecraft:custom_data":{empty:true}}}}] run say 123
Довольно громоздко, но что поделать. Для упрощения работы с данными предметов сейчас лучше использовать либо мод
NBT Autocomplete, либо полноценный редактор VS Code с расширением
SpyglassMC
execute as @e[type=item,nbt={Item:{tag:{empty:1b}}}] at @s run say 123
вот команда из моей последней попытки