Guides / Commands & Data

/tellraw JSON text: clickEvent, hoverEvent and why your message shows nothing

A single wrong bracket makes tellraw fail silently. Here is the component shape, the click and hover actions that actually work in chat, and the escaping rule people miss.

/tellraw takes a JSON text component, and the failure mode is unhelpful: a malformed component produces no message and no error. Everything below is about getting the shape right the first time.

The three valid shapes

"plain string"
{"text":"one component"}
["joined ",{"text":"list","color":"gold"}]

The list form is the one to use for anything interesting, because each element can carry its own formatting. The first element's formatting is inherited by the rest unless they override it — which is why people get a whole message unexpectedly gold. Start a list with an empty string to avoid that:

/tellraw @a ["",{"text":"Warning: ","color":"red"},{"text":"low health"}]

Click actions

clickEvent takes an action and a value:

ActionValueNote
run_command/spawnRuns as the player, at their permission level
suggest_command/msg Steve Fills the chat box, does not send
open_urlhttps://…Prompts before opening
copy_to_clipboardany textThe friendliest one for sharing coordinates
change_pagepage numberBooks only

run_command is the one with a trap: it executes with the clicking player's permissions, not the command block's. A menu that calls /gamemode creative does nothing for a normal player.

Hover actions

"hoverEvent":{"action":"show_text","contents":["Click to teleport"]}

show_text, show_item and show_entity. Note contents — older guides use value, which was replaced and now fails silently. That single rename accounts for a lot of dead hover tooltips copied from tutorials.

Escaping is where it breaks

The whole component is one command argument, so quotes inside must survive the command parser. In a command block, type it directly. In a function file, backslash-escaping is not needed. In a /give written book, the JSON is a string inside a string and does need escaping — that is the case that generates unreadable walls of \".

Rule of thumb: if you are nesting text components inside an item component, build it with a tool rather than by hand.

Selectors inside text

{"selector":"@p","separator":{"text":", "}}

resolves to player names at send time. {"score":{"name":"@s","objective":"Kills"}} pulls a scoreboard value. Both beat trying to concatenate values yourself.

Translate keys travel across languages

{"translate":"block.minecraft.crafting_table"}

renders in each player's own language — 제작대 for a Korean client, 作業台 for a Japanese one. For a multilingual server this is strictly better than hardcoding English.

Build the component visually, with the click and hover actions in their current form, in the Text & Display Command Builder.

Open the Text & Display Command Builder →

More guides

Browse all →

Looking for more Minecraft tools?

A suite of client-side generators, viewers and converters — all free, all in your browser.