/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:
| Action | Value | Note |
|---|---|---|
run_command | /spawn | Runs as the player, at their permission level |
suggest_command | /msg Steve | Fills the chat box, does not send |
open_url | https://… | Prompts before opening |
copy_to_clipboard | any text | The friendliest one for sharing coordinates |
change_page | page number | Books 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.