← all pages

Widgets, explained like you're busy

Also called "MCP Apps." Same thing, two names. Don't let that trip you up.

A widget is a tiny web page that appears inside the chat, instead of Claude typing out a wall of text.

That's it. That's the whole idea.

1The problem today

Right now, when one of your tools returns data, everything has to squeeze through Claude's brain.

๐Ÿง‘You ask"show me the leads"
โ†’
๐Ÿ”ŒTool runspulls 500 rows
โ†’
๐Ÿง Claude reads all 500costs tokens
โ†’
โŒจ๏ธClaude retypes itcosts tokens again

Now you want to change one thing. "Actually, filter to Boston only."

๐Ÿง‘You ask again
โ†’
๐Ÿง Whole loop againtokens again
โ†’
โŒจ๏ธRetypes it againtokens again

Every single tweak is a full round trip through the model. Ten filter changes = ten expensive round trips, and your context window fills up with ten copies of nearly the same table.

2What a widget changes

The tool hands back a little interactive page. You click around in it directly. Claude isn't involved.

๐Ÿง‘You ask once
โ†’
๐Ÿง One trip through Claudecosts tokens, once
โ†’
๐ŸชŸWidget appears in chata real UI
๐Ÿ‘†You click a filter
โ†’
๐Ÿ”ŒWidget calls your server directlyskips Claude entirely
โ†’
โœจWidget updateszero tokens

Click a hundred times. Still zero extra tokens. The widget has its own private line to your server.

What it looks like

show me this week's lead queue
Here's your queue:
โ†“ this part is the widget โ†“
CompanyScore
Northbeam Agency92
Halo Creative87
Threadpoint81
Let me know when you've picked.

Those buttons are live. Pressing them talks straight to your MCP server. Claude just sits there.

3Does it actually save tokens?

Yes, but be precise about where the saving comes from.

MomentCostWhy
The first tool call same as before The result still goes to Claude once, like any normal tool.
Every click after that free The widget calls your server on its own. Nothing enters the conversation.
Re-rendering the data free The widget draws the table. Claude never has to retype 500 rows.
Your context window stays clean One tool result instead of ten near-identical dumps.

The rule of thumb: the more times you'd normally go back and forth over the same dataset, the more a widget saves you. A one-shot question saves nothing. A triage session over 200 rows saves a lot.

4How you'd actually build one

You already have MCP servers. A widget is two extra things bolted onto one you own.

Thing one

On the tool you already have

Add a line saying "my UI lives at ui://my-thing/page.html."

Thing two

A new resource on the same server

When Claude asks for that address, hand back one self-contained HTML file.

Claude Desktop drops that HTML into a locked-down iframe in the chat. The page can call your tools; it cannot touch Claude, your cookies, or anything else on the page. That's the whole security story.

Fastest way to try it

There's an official scaffolding skill. Two commands in Claude Code:

/plugin marketplace add modelcontextprotocol/ext-apps

/plugin install mcp-apps@modelcontextprotocol-ext-apps

Then just say "build me an MCP app that shows a color picker" and watch what it generates. Ten minutes, and the shape clicks.

5Where this pays off for you

Places where you currently get a link, a CSV, or a wall of text.

๐Ÿ”Ž Lead / TAM triage

Now: CSV out, edit, CSV back in.

Widget: approve / reject / re-tier by clicking. Every click writes straight to the server.

๐Ÿ“Š DP ad reports

Now: tool hands you a signed link, you open a browser tab.

Widget: coverage table and creative grid render right in the chat.

โœ‰๏ธ Campaign preflight

Now: Claude describes which fields are broken.

Widget: table with the bad cells in red and a "fix and re-run" button.

๐Ÿ“š Curtis KB

Now: matched atoms dumped as text into context.

Widget: pick the cards you want, only those go to Claude.

6The boring facts

Do I need Anthropic's approval?No. Your own custom connector renders its own widgets. Approval only matters if you want to be listed in the public directory.
What plan?Custom connectors need a paid plan. You're already there.
Where does it work?Claude web, Claude Desktop, Cowork, iOS and Android. Also VS Code Copilot and a few others.
Is it on by default?Yes, if the connector is enabled. Admins can switch the rendering off org-wide.
What language?Plain HTML and JS. React, Vue, Svelte, or nothing at all. Your call.

Official docs: MCP Apps overview ยท Build guide ยท Interactive connectors ยท ext-apps repo + examples