Show information to the user as rendered HTML instead of Markdown: pass a LiquidJS template and a JSON context, and hosts that support MCP Apps render it inline in the conversation. Use it for tables, reports, and summaries the user should scan; it does not collect a decision (use elicit_approval, elicit_selection, or elicit_confirm for that). Values interpolated with {{ context.* }} are HTML-escaped; truthiness is JavaScript-style. Templates may load Tailwind (https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4) and DaisyUI (https://cdn.jsdelivr.net/npm/daisyui@5) with their own <script>/<link> tags; the view follows the host's light/dark theme via data-theme. External images, scripts, styles, and fonts load only from https://cdn.jsdelivr.net and from origins your organization's admins allow (the server routes those through its resource proxy; write their normal URLs) — anything else is blocked, and the result's notes list your organization's allowed origins. Use data: URIs for images you already have that are not publicly reachable (generated, read from a local file, or from a private source the user gave you), passed in context rather than the template (64 KB vs 32 KB). Don't download a public image just to work around the allowlist; leave it out. The rendered HTML is not returned to you — the result reports what was shown and any blocked origins.