The tool is allowed. What else?
- Read a recordSensitive fields includedRead
- Update a recordWritable fields exposedWrite
- Set a valueProvider validation onlyValue
More precise checks are left to your application.
Policies for AI agents
Control what your company’s AI agents can read and change, down to fields and values. Create policies with AI and apply them across users, teams and business systems.
From entire connectors to a single sensitive field.
Set the limits for your agents
Enforcesalesforce_delete_opportunityExactslack_delete_fileExact*delete*WildcardExample restrictions across Salesforce, Slack and more. Name patterns are case-sensitive.
Matching tools blocked.For the selected users or groups.
Companies already connected through StackOne
Beyond tool permissions
Connecting your teams’ agents doesn’t decide which fields they should read or change. When access stops at a tool allowlist, those checks fall to your application. StackOne Policies let your organization set shared field and value controls, scoped to the teams and people using agents.
More precise checks are left to your application.
Apply field and value rules across connectors, users and groups.
Policies in the conversation
See a protected ERP field stop a change for a group, or a tool restriction stop a request for an individual user.
Change the supplier’s bank account number in SAP.
SAP S/4HANA
Update supplier bank detailsApplies to Procurement group
Protected field
Bank account numberThe Procurement group can’t change bank account numbers. No bank details were updated.
Bank account number unchanged
How it works
StackOne evaluates policies for the member the agent acts for. A denied tool or input stops the request before the business system is called, and denied output fields are masked on the way back.
A denied tool or a denied input value stops the whole request. Nothing reaches the business system.
Denied output fields are masked before the response reaches the agent. The rest of the record stays available.
Every evaluated policy is recorded with its mode and decision, including what Monitor only would have done.
Field and value controls
Let agents work with a record while protecting its sensitive parts. Decide which fields they can read, which they can change, and which values are permitted.
Read and write controls
Set separate restrictions for reads and writes, using individual fields or groups such as PII. An onboarding agent can access a start date while personal email reads and salary changes stay blocked.
Example rule · Employee onboardingFor the onboarding group, deny personal email reads and salary writes.Explore employee onboarding
Value conditions
Keep a tool available while defining which inputs are acceptable. Set an amount limit, restrict a status change, or prevent public sharing. The same action can pass or be blocked depending on the value it carries.
Your conditions, across systemsApply ranges, exact values and combinations of conditions to the users or groups that need them.
At most £500 GBP
For Finance, block payment records above £500 GBP.
Keep routine payments within your approved limit.
Block when type is “anyone”
"type": "user""type": "anyone"For Revenue operations, block public sharing before the tool runs.
Other sharing values are not blocked by this rule.
Draft or submitted
For Accounts payable, block changes that authorize an invoice.
Prepare the invoice while keeping authorization protected.
Smart content rules
A field name does not tell you what free text contains. Smart content rules recognize names, email addresses and personal identifiers inside notes and documents, using StackOne’s own PII redaction models, and mask them in the response.
Example rule · Customer supportFor the Customer support group, mask personal data found in ticket text.
Customer PERSON asked to move billing to EMAIL and confirmed the account ending IDENTIFIER. Renewal is due next month.
Personal data masked in the response. The rest of the ticket stays readable.
Inside the product
Set an organization policy in plain English or use the builder. Try the examples below, choose users or groups, and watch AI draft the rule. Switch between Cedar and its JSON representation.
Hide PII fields in tool responses and block requests that change those fields. Keep other fields within their existing permissions.
Enforcement
forbid (
principal,
action in [
StackOne::Action::"readField",
StackOne::Action::"writeField"
],
resource in StackOne::Label::"pii"
);{
"effect": "forbid",
"principal": {
"op": "All"
},
"action": {
"op": "in",
"entities": [
{
"type": "StackOne::Action",
"id": "readField"
},
{
"type": "StackOne::Action",
"id": "writeField"
}
]
},
"resource": {
"op": "in",
"entity": {
"type": "StackOne::Label",
"id": "pii"
}
},
"conditions": []
}forbid (
principal,
action == StackOne::Action::"writeField",
resource in StackOne::Category::"hris"
)
when {
resource.path like "*compensation*"
};{
"effect": "forbid",
"principal": {
"op": "All"
},
"action": {
"op": "==",
"entity": {
"type": "StackOne::Action",
"id": "writeField"
}
},
"resource": {
"op": "in",
"entity": {
"type": "StackOne::Category",
"id": "hris"
}
},
"conditions": [
{
"kind": "when",
"body": {
"like": {
"left": {
".": {
"left": {
"Var": "resource"
},
"attr": "path"
}
},
"pattern": [
"Wildcard",
{
"Literal": "c"
},
{
"Literal": "o"
},
{
"Literal": "m"
},
{
"Literal": "p"
},
{
"Literal": "e"
},
{
"Literal": "n"
},
{
"Literal": "s"
},
{
"Literal": "a"
},
{
"Literal": "t"
},
{
"Literal": "i"
},
{
"Literal": "o"
},
{
"Literal": "n"
},
"Wildcard"
]
}
}
}
]
}forbid (
principal,
action == StackOne::Action::"writeField",
resource
)
when {
(resource in StackOne::Connector::"netsuite"
|| resource in StackOne::Connector::"xero")
&& resource.path == "payment.amount"
&& !(
context.args.hasTag("amount_minor")
&& context.args.getTag("amount_minor") has num
&& context.args.getTag("amount_minor").num >= 2500
&& context.args.getTag("amount_minor").num <= 50000
&& context.args.hasTag("currency")
&& context.args.getTag("currency") has str
&& context.args.getTag("currency").str == "GBP"
)
};{
"effect": "forbid",
"principal": {
"op": "All"
},
"action": {
"op": "==",
"entity": {
"type": "StackOne::Action",
"id": "writeField"
}
},
"resource": {
"op": "All"
},
"conditions": [
{
"kind": "when",
"body": {
"&&": {
"left": {
"&&": {
"left": {
"||": {
"left": {
"in": {
"left": {
"Var": "resource"
},
"right": {
"Value": {
"__entity": {
"type": "StackOne::Connector",
"id": "netsuite"
}
}
}
}
},
"right": {
"in": {
"left": {
"Var": "resource"
},
"right": {
"Value": {
"__entity": {
"type": "StackOne::Connector",
"id": "xero"
}
}
}
}
}
}
},
"right": {
"==": {
"left": {
".": {
"left": {
"Var": "resource"
},
"attr": "path"
}
},
"right": {
"Value": "payment.amount"
}
}
}
}
},
"right": {
"!": {
"arg": {
"&&": {
"left": {
"&&": {
"left": {
"&&": {
"left": {
"&&": {
"left": {
"&&": {
"left": {
"&&": {
"left": {
"hasTag": {
"left": {
".": {
"left": {
"Var": "context"
},
"attr": "args"
}
},
"right": {
"Value": "amount_minor"
}
}
},
"right": {
"has": {
"left": {
"getTag": {
"left": {
".": {
"left": {
"Var": "context"
},
"attr": "args"
}
},
"right": {
"Value": "amount_minor"
}
}
},
"attr": "num"
}
}
}
},
"right": {
">=": {
"left": {
".": {
"left": {
"getTag": {
"left": {
".": {
"left": {
"Var": "context"
},
"attr": "args"
}
},
"right": {
"Value": "amount_minor"
}
}
},
"attr": "num"
}
},
"right": {
"Value": 2500
}
}
}
}
},
"right": {
"<=": {
"left": {
".": {
"left": {
"getTag": {
"left": {
".": {
"left": {
"Var": "context"
},
"attr": "args"
}
},
"right": {
"Value": "amount_minor"
}
}
},
"attr": "num"
}
},
"right": {
"Value": 50000
}
}
}
}
},
"right": {
"hasTag": {
"left": {
".": {
"left": {
"Var": "context"
},
"attr": "args"
}
},
"right": {
"Value": "currency"
}
}
}
}
},
"right": {
"has": {
"left": {
"getTag": {
"left": {
".": {
"left": {
"Var": "context"
},
"attr": "args"
}
},
"right": {
"Value": "currency"
}
}
},
"attr": "str"
}
}
}
},
"right": {
"==": {
"left": {
".": {
"left": {
"getTag": {
"left": {
".": {
"left": {
"Var": "context"
},
"attr": "args"
}
},
"right": {
"Value": "currency"
}
}
},
"attr": "str"
}
},
"right": {
"Value": "GBP"
}
}
}
}
}
}
}
}
}
}
]
}The same rule in Cedar or JSON. Audience and mode are assigned separately.
PII field group
PII fields protected
PII fields are masked in responses. A request that changes a protected field is blocked in full. Other fields keep their existing access.
Our policies are generated from connector schemas and enforce your organization’s access boundaries. We chose Cedar for rules that can be checked before use, analyzed for permission changes and evaluated inside our connector runtime.
Cedar validates policies against a schema, catching mismatched fields and types before evaluation. Its language keeps policy logic bounded.
Cedar Analysis can compare whether policy sets are equivalent, more permissive or less permissive. That fits our principle that agent policies should only narrow existing access.
Cedar’s Rust and WebAssembly implementations fit our embedded evaluation path. A matching forbid rule takes precedence; StackOne applies the decision to tool calls, inputs and outputs.
OPA/Rego is a mature choice for authorization and broader policy tasks, with strengths in partial evaluation and data filtering. Cedar’s narrower language and analysis model fit our generated policies; we accept its more limited partial-evaluation options.
Read more: Cedar validation, Cedar Analysis and OPA partial evaluation.
Roll out safely
Activate a policy in Monitor only, read what it would have done in the request logs, then switch to Enforce for a test audience before everyone.
The policy is evaluated on every matching call and nothing is blocked or masked. Each decision is recorded.
See which calls would have been denied or masked, for which members, and which rule matched.
Enforce for a test audience first, then for everyone. A matching deny stops the call or masks the field.
Scope each restriction to users or groups. Policies narrow existing permissions; an applicable deny rule takes precedence, and an exemption skips only that rule.
Policy audit trail
Trace each governed request to its user, connector and policy decisions. See what was blocked or masked, what didn’t match, and what Monitor only would have denied.
Xeroreq_8f21b4
MatchedInput value · £750 GBP exceeds the £500 GBP limit. The request is refused before execution.
MatchedInput value · This monitor rule also matches. It records its decision without blocking the request.
No matchThis rule did not match the evaluated resource. It did not contribute to the denial.
Before execution£750 exceeds the £500 limit. No payment was created.
Workdayreq_b47a92
MatchedPII field group · Protected values were masked before the response reached the agent. The rest of the response remains available.
No matchThis policy restricts writes. It does not block an employee read.
MatchedThe output-field rule matched in Monitor only. Its decision is recorded without applying an additional mask.
Response filteringPII fields were masked. The rest of the response was returned.
Salesforcereq_c95e13
MatchedTool · Delete Opportunity is restricted for Alex Morgan (Revenue Operations Manager). The request was blocked before execution.
MatchedThe selected tool also matches this Monitor only policy. It contributes no enforced restriction.
No matchThe PII field rule did not match this tool-level evaluation.
Before executionThe tool was denied. No request was sent to Salesforce.
Common questions
Control the systems, tools, fields and values your teams’ agents can access.