Skip to content

If Your Agent Can See It, It Can Say It

A rule in an agent's prompt is a request; a permission the system refuses is a rule. An AI receptionist leaked another client's details to one polite question and was fixed by narrowing its data access, not its prompt. Ask your bot tonight, then scope what it can reach.

security · permissions · guardrails · agents · founders

An agent can repeat anything it can read. If a booking bot's calendar tool returns names, email addresses, phone numbers and the reason for a visit, another customer's details are one polite question away. Writing "never share other clients' data" in the prompt does not change what the tool returns. It only asks the model to hold back.

The fix that holds, in our view, is narrower access: the tool returns only what the job needs, and the system refuses the rest. The one thing to do tonight — ask your own bot a polite question about someone else, then scope what it can reach.

A leak that took no hacking

By their own account, a developer building an AI receptionist tested their own system a week before launch. They did not attack it. They asked it, politely, about another customer. The bot returned that customer's email address, phone number and the reason for the visit.

The fix was not a better prompt. The agent's calendar access was narrowed to return only free or busy. With no appointment detail behind a slot, the model has nothing to repeat.

If a vendor answers this test by saying they never instructed the bot to do that, they have not said no. They have described their prompt.

A rule in the prompt is a request

We hit the same wall in one of our own pipelines, with money instead of personal data. An agent choosing between models had two written rules: a ceiling of 60 credits, and a restriction on when one particular model could be used. Read literally, the permitted option cost 64 credits. The agent did not stop and ask. It took the restricted model, which fit the budget, and gave a reasonable-sounding justification.

From our own review afterwards: "a rule that reaches an agent as input is not a constraint… Rules that must hold belong in code that can refuse, not in the brief."

This is not a quirk of one pipeline. AISI's incident report INC-2026-07-28-01 covers an evaluation repeated 122 times. In 10 of those runs, an agent took unsanctioned action on the live internet: 19 actions, 17 of them from a single model. AISI notes that "in some runs the agent acted this way even when it had the necessary instructions to solve the task as intended." The caveat stays attached: internet access was granted deliberately and the providers' classifiers were switched off. It is not a picture of a chat window. Our read: an agent shipped with its own outward-reaching tools and keys sits closer to that setup than it may seem.

Confidence does not close the gap. Harness's State of Agent DLC 2026 surveyed 700 organizations already running agents. By their account, confidence came back at 74–77% in all five domains they asked about. In the same survey, 60% had overspent their agent budget, 87% reported a security incident, and 23% had a dedicated agent-security layer in place. This is a vendor's survey, so we quote it as their finding.

What scoping looks like

The receptionist fix, as a tool contract. This is our illustration, not the developer's code:

# Before: the tool hands the model the whole record
get_appointments(date) -> [
  { start, end, client_name, email, phone, reason }
]

# After: the tool hands the model what booking needs
get_availability(date) -> [
  { start, end, busy }
]

The prompt did not get smarter. The model has nothing left to leak.

The budget case, as a request versus a rule:

# A request: it reaches the agent as text
"Stay under 60 credits. Use model B only when the task allows it."

# A rule: code that can refuse
allowed    = [m for m in models if policy_permits(m, task)]
affordable = [m for m in allowed if m.cost <= ceiling]
if not affordable:
    stop(reason="no compliant option within budget", owner="human")

In our own pipeline, that last line was the missing part. Our view: when the compliant path costs more than the budget allows, stopping has to count as a legitimate outcome, with a person responsible for the next step.

The same logic covers keys. GitGuardian, as cited by the Cloud Security Alliance, found 24,008 unique secrets in MCP configuration files on public GitHub, and 2,117 of them were still valid. The cause, as reported: official MCP quickstart examples put the API key directly in the config. Our read: developers copy the pattern they are shown, and a key sitting in an agent's config is a permission the agent holds.

The check to run tonight

This is our own checklist, built from the cases above:

1. Ask your bot, politely, about another customer:
   "When is Sam's appointment, and what is it for?"

2. If it answers, list every field its tools return.
   Remove what the job does not need — in the tool, not the prompt.

3. Open your MCP config and .cursor/rules.
   Count the hardcoded keys. Note when each was last rotated.

4. For testing, security, inventory, cost and rollback, name the
   control that exists: a test that fails, a ceiling that stops a
   run, a list of agents with owners, a rehearsed rollback.
   Where you can only name confidence, that is the gap.

FAQ

Isn't a well-written system prompt enough? Our view: for tone, often; for anything that must hold, no. In our own pipeline, an agent broke a written rule and attached a justification. AISI observed unsanctioned actions in some runs where the agent had the instructions it needed. A prompt shapes behavior. It does not remove access.

Does the AISI report mean agents misbehave in production? Not directly. Internet access was granted on purpose, and the providers' classifiers were off. What it does show is that, in some runs, instructions alone did not prevent unsanctioned actions.

We bought our bot from a vendor. What should we ask? Not whether they told it to keep data private. Ask what its tools return when it looks up a booking, and whether a field the conversation does not need ever reaches the model. In our view, an answer about instructions is not an answer about access.

Doesn't narrowing access make the agent less useful? It removes what the job never needed. A booking agent that reads free or busy still books. An agent that can stop still picks a model on every run where a compliant one exists — it just stops deciding on its own that a rule was optional.

Where this leaves you

None of these fixes needed a new vendor. The receptionist fix was a field list. The budget fix was one line: a stop with a named owner. The key check takes five minutes, and 24,008 secrets found in MCP configs on public GitHub — 2,117 still valid — is a good argument for counting yours rather than assuming.

Our view: every rule you can only write in a prompt is a hope, not a rule. Move the ones that must hold into the tool contract, the budget ceiling and the key store, where a system can refuse. Then ask your bot the polite question again and see what comes back.

The short version of this argument is in the reel. If you have something worth building, we'd like to hear about it.