Skip to content

Interactive cards

In the Claude app, every VibeSell tool result renders as a card: the count of leads, the people of a preview, the plans, your domains and mailboxes, the campaign, an approval with its Approve and Reject buttons. The cards below are the real VibeSell card, fed example data — try the buttons.

Preview · example dataestimate_lead_pool
estimate_lead_pool — the count, the filters searched, and a button to preview people.
Preview · example dataorder_sending_setup
order_sending_setup — an approval card. Approve or Reject: nothing leaves this page.

The card follows the MCP Apps extension:

  1. Every tool declares the card in _meta.ui.resourceUri — ui://vibesell/card-2f87d8dc967b.
  2. The client reads that resource once: a single self-contained HTML document (text/html;profile=mcp-app), with no remote script.
  3. After each call, the client hands the card the tool’s structuredContent; the card renders it by its kind, with the words and order of the VibeSell app’s screens.
  4. The card follows the client’s light or dark theme, and asks to open links (ui/open-link) — VibeSell, a LinkedIn profile — rather than opening them itself.

Company logos load only from media.licdn.com and logo.clearbit.com; anywhere else, the client’s content security policy blocks them and the card falls back to initials.

Tools that ask you something — the sending source, the domain names, each email of the sequence — show their choices as buttons. A click calls the same tool again with your answer, exactly as the assistant would.

Preview · example datachoose_sending_source
choose_sending_source — click a choice.
Preview · example datapropose_domains
propose_domains — the whole setup, names and addresses, to keep or change.

On an approval card, Approve and Reject call decide_approval, a tool the Claude app hides from the model (_meta.ui.visibility: ["app"]). Only your click can call it. See Approval cards.

Preview · example dataget_campaign
get_campaign — a staged campaign and its four launch figures.
Preview · example dataget_campaign
get_campaign — a running campaign and the provider's counters.

Because every VibeSell tool declares the card, Claude lists them under Interactive tools in the connector’s settings. Like any connector’s tools, they start on Needs approval; set them to Always allow to stop Claude asking before each call. Approval cards still wait for your click.

Claude keeps a card by its address until you open a new chat. The card’s address ends with a hash of its code, so a new version gets a new address; any older address still returns today’s card, so a chat that kept an older tool list keeps working.

If a card looks outdated after an update, start a new chat.

Codex, Claude Code and other clients that don’t render MCP Apps ignore the card. They get the same structuredContent and a Markdown summary in content[0].text, and the card-only tool decide_approval is not listed for them: approval cards are decided in the VibeSell app.