AI Demo Cloudflare AI security demo

The protection layer

One script, wire-protection.sh, turns the "before" demo into the "after" demo. It creates everything below and nothing else; deleting it puts the suite back exactly as it was.

# in config.sh
export DEPLOY_PROTECTION="true"    # ./deploy.sh then wires the protection layer too
export PROTECTION_MODE="block"     # or "log" to detect without blocking

./wire-protection.sh               # apply (safe to re-run)
./wire-protection.sh --remove      # tear it back down for a clean "before" run

1. DLP profiles

Five custom profiles, shared by AI Gateway and Secure Web Gateway, written specifically against the data in these apps so the matches on stage are unambiguous:

Where Cloudflare already maintains a detection, these profiles borrow it rather than re-implementing it: US and UK national identifiers, US mailing addresses, ABA routing numbers and US phone numbers are Cloudflare's own predefined entries, referenced by name and resolved at deploy time. The custom regexes are only for what is specific to this company - UK residential addresses, the field names in these apps' JSON, and the vocabulary of its HR case files.

ProfileDetects
Employee PIIHome address formats used in WorkWeek, national ID numbers, bank sort codes and account numbers, dates of birth.
HR Case FilesThe vocabulary of an HR case file: performance improvement plan, grievance, disciplinary, severance, redundancy, garden leave.
Confidential Projects and TransactionsProject Ironwood, the acquisition target's name, the Q1 restructure and board pre-read material.
Customer Contact DataDirect mobile numbers and named customer contacts from Pipeline, plus deal economics (discount and margin).
Payment Card DataCardholder data pasted into a prompt. Cloudflare's own detectors validate the Luhn checksum rather than matching a shape, so a test card number fires every time — which matters when you are demonstrating in front of someone.

2. AI Gateway policies

The gateway itself is not created here — wire-access.sh creates it and publishes it on its own Access-protected custom domain, because that is identity plumbing rather than inspection. Clients are therefore configured against the same endpoint whether or not this layer is deployed. What this adds to it:

3. MCP server portal

The five MCP servers are registered with Cloudflare Access and published through a single portal at :

One manual step, per MCP server

Registering an MCP server over the API cannot perform the upstream OAuth login it requires - that needs a browser - so each server starts in Waiting with no tools. Authenticate each one as alice.watson@company.com before running any demo — except Ledger, which only the leadership team can authenticate, so use nikita.chapman@company.com for that one: the setup guide has the steps, including why authenticating as the admin account fails and what to do if a server reports that Gateway blocked its tool sync.

4. Application Library review statuses

Cloudflare keeps a catalogue of SaaS applications, and every one of them carries a review status for your account: Unreviewed, In review, Approved or Unapproved. This layer sets them, because it is what lets the two AI policies below decide anything without naming a single hostname.

StatusApplications
In reviewGoogle Gemini — the assistant this company is piloting, and the destination the redirect below sends people to.
UnapprovedChatGPT, Microsoft Copilot (Free and Enterprise), DataBot, Claude, DeepSeek, Perplexity, Amazon Bedrock.
UnreviewedEverything else, which is the default — including every AI service nobody has heard of yet.

Gemini is deliberately In review rather than Approved. It has to not match the redirect rule, since it is where that rule sends people, and "in review" is the honest description of a tool a company is still making its mind up about — which is where most of the audience actually is.

5. Gateway HTTP policies

First, TLS decryption is turned on. Without it an HTTP policy only ever sees port 80, and everything these rules read — the URL, the headers, the body DLP inspects — is inside the TLS session. The policies look perfectly healthy while inspecting nothing, and the dashboard says so in a banner above the policy list.

Then one DLP policy per upstream MCP hostname. Gateway policies for portal traffic have to match the upstream server, not the portal, so there is a rule for each of , , , and , each pairing that host with the profiles that matter for it. In block mode a matching tool call or tool result is blocked and the agent gets an error instead of the data; in log mode it is allowed and recorded.

Two more rules have nothing to do with MCP, and both match on the Artificial Intelligence content category rather than a list of hostnames — a hostname list is a list of the services you already thought of, and the one someone pastes payroll data into next week will not be on it:

AI prompt profiles do not work here

Cloudflare's predefined AI Prompt DLP profiles are built for the API shapes of consumer AI web apps and do not match the MCP protocol, so portal traffic is inspected with the standard and custom profiles above instead. The AI Prompt profiles still have a place in this story — on Gateway HTTP policies for staff using ChatGPT or Gemini in a browser — just not on this path.

Where each control shows up

ControlWhere to look on stage
AI Gateway DLP and guardrailsAI → AI Gateway → employee-gateway → Logs. Blocked requests show the profile or hazard category that matched.
Gateway HTTP DLP policiesZero Trust → Insights → Logs → Gateway HTTP. Filter by the upstream MCP hostname.
The two AI policiesThe same Gateway HTTP log, filtered by policy name. Application statuses are on the cards under Zero Trust → Team & Resources → Application library.
MCP portalZero Trust → Access controls → MCP Portals → the portal's logs: who called which tool, with which arguments.
AccessZero Trust → Insights → Logs → Access, to show the login that produced the identity behind all of it.
The identity half is already there

Before any of this runs, the model endpoint is already behind Access on its own custom domain: AI Gateway accepts a valid Access JWT as the request credential, so an agent authenticates as a person rather than with an API key, and every call is attributed to that person as cf.user_id. A device enrolled in the Cloudflare One client authenticates from its existing session, so there is no credential in the client's config at all.

That is what makes the logs below worth looking at: each one names a human.

What it deliberately does not do

It does not change a line of application code, and it does not fix the leaky endpoints. That is the argument: the apps are still exactly as over-sharing as they were on the data page, and the control sits in the path instead of in a backlog.