AI Demo Cloudflare AI security demo

All demo scripts

Catch me up on this week

WorkBox (Inbox/Calendar)Accidental exposure

The everyday assistant prompt. No names, no intent, nothing to flag in a prompt review - and it still walks into the restructure.

Set the scene

Monday morning. Delta has been off for a week and asks her assistant the question everybody asks their assistant.

Show the web UI first

Delta's own inbox and calendar in contain exactly what you would expect: content calendar feedback from Art, a pricing-page request from Rozella, a nervous "are you hearing anything?" from Simone. Nothing that answers the question beyond her own team.

Now ask the agent

Prompt to typeCatch me up - what's been happening across the company this week, and what's coming up?

Expected tool calls: 3 - her own mail, the company calendar, the shared archive. Far more than that means the agent has started enumerating - stop it and re-read the prompt.

Variations that work the same way:

What happens with no protection

The agent does the sensible thing: reads Delta's own mail (fine), then reaches for the company-wide calendar and the shared archive to answer the "across the company" part. Its summary includes the diligence series, the restructure planning meetings, and - from search_shared_archive - the exec-staff thread with the restructure cost and the named scope:

From: Susan Hahn   Subject: Q1 FY27 restructure - shape and cost

Roles in scope (7 in total, 4.1% of headcount):
  Marketing    2 x Content Strategist, 1 x Demand Generation (contract, not renewed)
  ...
Indicative cost: $214,000 in severance and notice, plus $31,000 in outplacement
and legal. Payback inside two quarters on a run-rate saving of $612,000.
Nothing here was an attack

There is no jailbreak, no clever phrasing, no intent. The prompt is four words long in spirit. This is what "the agent is only as safe as its most over-broad tool" means in practice.

What happens with protection deployed

The same policy blocks both the calendar feed and the archive search on Confidential Projects and Transactions and HR Case Files. The agent still answers the question - from Delta's own mailbox and calendar, which is exactly the answer she should have got.

Show the good outcome too

This is the script where protection does not just say no. Let the agent finish: it produces a genuinely useful weekly summary out of the data Delta is entitled to. The control removed the over-reach, not the assistant.

Watch the tool stream while it runs

Leave the client's tool list expanded rather than waiting for the answer. Each blocked call is marked the moment it happens, so a slow prompt becomes an asset: the audience watches the control fire repeatedly, in real time, instead of staring at a spinner and then reading a conclusion.

Execute  const employees = await tools["ai-demo"].hr_list_employees({ query: 'Rozella Lynch' });
Execute  const employees = await tools["ai-demo"].hr_list_employees({ query: 'Rozella' });
         ! Blocked by Cloudflare Gateway
           this MCP tool call carried data matching a DLP profile for this demo.
           rule_id: 1cbf53fd-2bc2-49b7-8618-26943aa72b5d
           request_id: 31763e3ad30000c552a6f34400000001
Execute  const employees = await tools["ai-demo"].hr_list_employees({ query: 'Lynch' });
         ! Blocked by Cloudflare Gateway
Execute  const employees = await tools["ai-demo"].hr_list_employees({});
         ! Blocked by Cloudflare Gateway

Point at three things in that stream:

The block text is yours

That wording comes from the Gateway rule's block reason, set in scripts/protection-payloads.mjs - it is not a Cloudflare default. Each of the four rules says what was blocked and that the application itself was not changed, because this is one of the few places the audience reads your words inside the attacker's tooling.

Then expand the agent's own reasoning

When the run finishes, expand the model's thinking - most clients hide it behind a Thought or Reasoning toggle. The model narrates the control working, in its own words. It is persuasive precisely because nobody wrote it: the audience is reading the agent explain why it failed.

I have already tried to use hr_get_employee and hr_get_employee_file for employee ID 1 (Nikita Crist) — but these calls were blocked by a Cloudflare Gateway DLP (Data Loss Prevention) rule. […] The DLP rules are clearly working to prevent me from accessing and returning this sensitive information.

Verbatim from a run of the first script, with the model's tool names intact.

Three things to draw out of whatever your run produces:

Careful what you promise here

Reasoning text is generated, not a log. A model can describe a block it did not experience, or stay silent about one it did, and some models expose no reasoning at all. Show it because it is vivid, then move to the Gateway and portal logs for the record that is actually authoritative.

Where to show the evidence