Set agent tool policies to control which tools your agents use, which fields they see, and what data goes into and out of each call.
Tool Policies is only available on certain plans. See plans and pricing.
Tool Policies control which tools an agent may use, and how, on behalf of the member it acts for. StackOne checks the policies that apply to that member before a tool call reaches the provider, and refuses the call when an enforced policy denies it. Value rules, semantic rules and PII checks also look at the data itself. Value rules check the argument values a tool receives before it executes. Semantic rules and PII checks run on the tool’s inputs before it executes and on the response before the agent sees it.
A policy carries a single rule that allows or denies capabilities. Rules are made up of 4 parts:
Part
Options
What it means
Who it applies to
Everyone, Users, Groups
The members whose agents the rule governs. Groups come from Manage Groups.
What it does
Allow, Deny
A deny rule refuses exactly what it covers for those users or groups. An allow rule restricts nothing and cannot undo a deny.
Capabilities
Use a tool, Read a field, Write a field, Value rule, Redact PII, Semantic rule
The operations the rule covers. One capability per kind of access, each narrowed on its own terms. See Capabilities below.
Applies to
Everything, A connector category, A connector, An account, Specific tools
Where the capability is covered. Tools matching narrows any target with a name pattern.
Four guarantees hold across every policy:
A deny always wins
When policies overlap, a matching deny refuses the call whatever any allow says. An allow for one user does not override a deny for their group, so exempt the user in the deny rule instead.
Policies apply when the member is known, which is the case for AI platform sessions. A call made with a project API key is memberless — govern that traffic with Connector Profile scoping instead.
Policies stay in their project
A policy belongs to the project it is created in and governs calls made in that project only. To apply the same rule in several projects, create it in each.
A capability is the kind of access a rule governs: running a tool, reading or writing a field, passing an argument value outside the range or list you set, passing PII through a call, or sending and receiving data that a semantic rule’s question flags. Denying one removes that access for the users or groups the rule covers.
Capability
What denying it does
Use a tool
Refuses the call. The agent may not run the tool at all.
Read a field
Masks the field in responses.
Write a field
Refuses calls that would change the field.
Value rule
Refuses calls whose argument values fall outside the condition, such as a payment amount outside 25 to 500 USD. Calls with values inside it keep their existing access.
Redact PII
Finds the chosen classes of PII (email addresses, phone numbers, SSNs, or credit card numbers) in the tool’s inputs and responses, then redacts the detected span or blocks the call. Record UUIDs, order numbers, and API keys stay intact. See PII Redaction.
Semantic rule
Asks a plain-language question about the data in the call. On inputs, a matching answer refuses the call before the tool runs. On a response, it masks the field the answer applies to.
Rules can carry more than one capability. Capabilities are alternatives rather than conditions: the rule applies where any one of them matches, so adding a second says “or also” rather than narrowing the first. Each is scoped on its own terms, so one rule can deny a tool outright on one connector and only mask a field on another.
Denying Use a tool refuses the call.Choose which targets it applies under Applies to:
Everything covers every tool in the project.
A connector category covers every tool on every connector in the category, including connectors added later.
A connector covers every tool on the connectors you pick.
An account covers the tools of specific Linked Accounts. Search accounts by name or owner.
Specific tools lets you pick a connector, then the tools on it by name.
To narrow the tools covered by the target selection, enter a name pattern under Tools matching (see the pattern syntax below). An empty pattern covers every tool the targets include, so a deny refuses every call to them. A capability takes either specific tools or a pattern, not both.
Denying Read a field masks the field in responses.Choose which targets it applies under Applies to:
Everything covers every connector and account in the project.
A connector category covers every connector in the category, including ones added later.
A connector covers the connectors you pick.
An account covers specific Linked Accounts. Search accounts by name or owner.
To narrow the fields covered by the target selection, enter a pattern on the field’s path in the response under Fields matching (see the pattern syntax below). An empty pattern covers every field the targets include, so a deny masks every field in scope.
Denying Write a field refuses calls that would change the field.Choose which targets it applies under Applies to:
Everything covers every connector and account in the project.
A connector category covers every connector in the category, including ones added later.
A connector covers the connectors you pick.
An account covers specific Linked Accounts. Search accounts by name or owner.
To narrow the fields covered by the target selection, enter a pattern on the field’s path under Fields matching (see the pattern syntax below). An empty pattern covers every field the targets include, so a deny refuses every call that would change one.
Denying Value rule keeps a tool available and checks the values the agent passes in its arguments.Choose which targets it applies under Applies to, the same way as Use a tool, then pick the argument and the condition its value must meet:
A range for numbers, such as a payment amount between 25 and 500 with the currency USD.
Allowed or blocked values, such as an invoice status that may be Draft or Submitted but not Authorized, or a sharing type that may not be anyone.
A call whose value falls outside the condition is refused before the tool runs. A call that leaves the argument out, or sends it in another type or currency, is refused too.
Denying Redact PII checks calls for the chosen classes of PII. StackOne’s own PII model scans the tool’s inputs before it runs and the response before the agent sees it, including free-text fields such as ticket bodies and notes. Record UUIDs, order numbers, and API keys stay intact.The PII Redaction benchmark compares the model with Microsoft Presidio on connector data.Choose which targets it applies under Applies to:
Everything covers every connector and account in the project.
An account covers specific Linked Accounts. Search accounts by name or owner.
Under Which PII to redact, select one or more classes. There is no pattern to enter.Then choose what a detection does:
Redact replaces each detected span in the inputs and in the response, and lets the call continue. The rest of the input or response is unchanged.
Block refuses the call. When the PII is in the inputs, the provider is never called. When it is detected in the response, the agent receives a refusal instead of the data.
A response that cannot be scanned (it is streamed, above the scan size limit, or the scan fails) is returned unredacted, and the request log records which classes were not redacted.For how detection works, what changes in the call and what is recorded, see PII Redaction.
Denying Semantic rule asks a decision model a question about each call in scope. Write the question in plain language, for example:
Does this message contain unreleased financial results?
The model answers for each field or payload, so the rule holds whatever a connector calls the field.Choose which targets it applies under Applies to, the same way as Use a tool. For a rule about outgoing messages, pick the send tools on the connectors that matter, such as Slack, Gmail and Notion.Then choose where the question is asked:
Inputs: a matching answer refuses the call before the tool runs.
Response: a matching answer masks the field it applies to before the agent sees it. A field the model cannot decide is masked unless the rule allows it.
To scope a capability to calls coming from specific AI clients, select them under From clients (for example ChatGPT, Claude, or Cursor). Leaving it set to Any client applies the capability to calls from any client.
Pattern syntax - wildcards
* is the only wildcard, and it matches any run of characters.
A pattern has to cover the whole name: salary matches only something named exactly that, so use *salary* to match it anywhere.
Matching is case-sensitive.
?, [a-z], and {a,b} are ordinary characters here, not wildcards. A pattern using one saves cleanly and then never matches anything.
Pattern
Matches
Does not match
*delete*
personio_delete_person
okta_remove_user_from_group
salary
salary
employee.compensation.salary
*Delete*
Nothing, since matching is case-sensitive.
personio_delete_person
6
Add exemptions
For a deny rule, use Exempt from this rule to name users or groups the rule does not apply to. To let one user through a deny that covers their group, exempt them here rather than writing an allow for them. Another matching deny can still refuse the call.
7
Review and create
Review the policy:
Plain Text: the panel footer restates the rule in plain words, for example:
Everyone in this project may not use a tool matching *delete* on Workday from ChatGPT, except Finance (Group).
Cedar: the exact statement the engine will evaluate, in Cedar syntax. The view is read-only; change the form and the statement follows.
JSON: the same statement in Cedar’s JSON encoding.
The Policy AI Assistant opens beside the form, as Policy chat, whenever you create or edit a policy. Describe the rule in your own words and the assistant drafts it in the form for you to review:
Suggestions are highlighted in the form, with the previous value shown underneath.
Each suggestion can be applied or reverted individually.
All changes can be applied using the buttons at the top of the form or by clicking Accept changes and create or Accept changes and save.
The assistant drafts every capability, including value rules, semantic rules and PII redaction. Ask for Keep unreleased financial results out of Slack for everyone outside Finance and it writes the semantic rule’s question, picks the send tools, and sets the audience and exemption. You can also name AI clients, for example Block contractors from using delete tools on Workday through ChatGPT, and the assistant scopes the capability to those clients.
The Policy AI Assistant beside the form. The assistant looked up the Contractors group, proposed a deny rule, and left three changes marked for review.
The assistant can look things up in the project as it drafts, and the transcript shows each lookup as it runs:
It can find
So you can say
Users and groups
Exempt payroll, (where you have a group defined as “payroll”)
Connectors and categories
Block writes to any HRIS connector
The tools on a connector
Stop the delete ones on Workday
Linked accounts
Only the Acme production account
Related tool call logs
Stop this tool returning some of the fields it returned
By default, only a tool call’s tool, connector and caller are exposed.With advanced logging enabled, the assistant can read the request/response payloads to help define field related capabilities.
For example, using a prompt like:
Stop contractors deleting records
The assistant searches existing groups, sets Who it applies to to Groups and populates with Contractors.
Writes a deny on Use a tool with a *delete* pattern, with applies to set to Everything.
The assistant also flags what a rule may miss. For example, a pattern matching delete does not catch a connector whose tools are named with remove or archive, so you can ask it to add those patterns too.
Test against personas: in the create and edit panel, Test this policy against personas shows what the rule would decide for the members you choose, without making a call. Each member can be tested through a chosen AI client, or No client (older connection), and added again under another client to compare the decisions.
Monitored: set the policy’s Enforcement to Monitored and applicable tool calls are flagged as calls the policy would have applied to, while continuing unaffected. Value rule matches, semantic rule answers and PII detections are recorded the same way.
Only when Enforcement is set to Enforced are tool calls blocked or modified as defined by the policy.
One Use a tool deny with Applies to set to Everything and Tools matching set to *delete*, for the Contractors group. Run it in Monitored first, check the logged decisions, then switch it to Enforced.
Payments stay within limits
A Value rule deny on the payment tools for NetSuite and Xero, on the payment amount, allowing amounts between 25 and 500 in USD. A payment outside that range, or in another currency, is refused before the tool runs, and payments inside it go through as before.
Unreleased financials stay in Finance
A Semantic rule deny on the send tools for Slack, Gmail and Notion, asking Does this message contain unreleased financial results? on Inputs. It applies to Everyone, with the Finance group exempt. The agent can still summarize the month-end close for Finance, and a message that posts those numbers to a shared channel is refused.
Customer PII stays in support
Two policies for the support agent’s users:
Zendesk: a Redact PII deny on the Zendesk account, set to Redact, so responses reach the agent without email addresses, phone numbers or card numbers. The same policy adds Read a field on Zendesk, with Fields matching set to the card number’s path, so that field is always masked.
Jira and Slack: a Redact PII deny on the Jira and Slack accounts, set to Block, so a write that contains PII is refused.
The agent can still escalate the bug to Jira, without the customer’s details.
When an enforced policy refuses a tool call before it runs, the request fails with HTTP 403 and nothing reaches the underlying provider. The refusal returns to the agent as the tool result.
{ "message": "Action 'personio_delete_person' is not permitted by project policy", "errorType": "POLICY_DENIED_ERROR", "level": "project"}
A call refused by a value rule, a semantic rule or a PII block on its inputs fails the same way, before the provider is called. A PII block on a response refuses the call after the provider responds: the agent receives the refusal instead of the data. Masking and redaction on a response never fail the call: the agent receives the response with the denied fields masked and the detected spans redacted.
Why is a pattern matching the wrong tools, or none at all?
It matches nothing. The pattern has to cover the whole name: salary only matches a tool named exactly that, so use *salary*.
?, [a-z], and {a,b} do not perform any special matching.
It misses tools you expected. Matching is case-sensitive: *Delete* misses personio_delete_person. A pattern matches exactly rather than describing a behavior: *delete* does not catch a tool named okta_remove_user_from_group.
It matches more than you expected.* matches any run of characters, underscores included, so *create* could cover leaddocket_list_opportunities_created_since.
Why is a policy not taking effect?
Check the following in order:
The policy’s Enforcement is set to Enforced (not Monitored or Disabled).
The acting member is in its audience (and not exempt).
The call is made in the project the policy was created in.
The tool name or pattern matches exactly, including case.
The caller is a member connected through an AI platform, so the call carries their identity. A call made with a project API key alone names no member, so no policy governs it.
If the capability specifies From clients, the call originates from one of the selected clients.
Can I see policy decisions in request logs?
Yes, on an action log. Open the record and select the Policy tab.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Stackone","colors":{"primary":"#068F56","light":"#00AF66","dark":"#068F56"},"logo":{"light":"https://mintcdn.com/stackone-60/WsmKpuoeBZmio9QO/images/logo/logo-light-mode.svg?fit=max\u0026auto=format\u0026n=WsmKpuoeBZmio9QO\u0026q=85\u0026s=f08be9c0a142cb1e7fcaa23910c4bf7f","dark":"https://mintcdn.com/stackone-60/WsmKpuoeBZmio9QO/images/logo/logo-dark-mode.svg?fit=max\u0026auto=format\u0026n=WsmKpuoeBZmio9QO\u0026q=85\u0026s=b57d63594c13dee65c06a2d578927466"},"favicon":"https://mintcdn.com/stackone-60/EZ7nWzE-JJzhmP-C/images/logo/favicon.png?fit=max\u0026auto=format\u0026n=EZ7nWzE-JJzhmP-C\u0026q=85\u0026s=9012a8ae6ce9a80698406b611be47925","appearance":{"default":"light"},"background":{"image":{"light":"https://mintcdn.com/stackone-60/knwbcGlYFJSeLObv/images/background/light.svg?fit=max\u0026auto=format\u0026n=knwbcGlYFJSeLObv\u0026q=85\u0026s=112166d244e990ebc0146ff96958757c","dark":"https://mintcdn.com/stackone-60/knwbcGlYFJSeLObv/images/background/dark.svg?fit=max\u0026auto=format\u0026n=knwbcGlYFJSeLObv\u0026q=85\u0026s=50ec5e23eeb91f55e78a0da97dcaeb7b"},"color":{"dark":"#1a1a1a"}},"navbar":{"links":[{"icon":"circle-question","href":"/support","label":"Support"},{"href":"https://app.stackone.com","label":"Login"},{"href":"https://www.stackone.com/demo","label":"Book a demo"}],"primary":{"type":"button","label":"Start Free","href":"https://www.stackone.com/request-free-access"}},"footer":{"socials":{"linkedin":"https://www.linkedin.com/company/stackonehq","twitter":"https://twitter.com/StackOneHQ"}},"seo":{"metatags":{"canonical":"https://docs.stackone.com","google-site-verification":"gYj1x4gkdSwpCGVLFVXNVOPQ_wVrePW37ZKJt3HEqys"}},"fonts":{"heading":{"family":"Sf Pro Display","source":"https://fonts.gstatic.com/s/inter/v18/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7W0Q5nw.woff2","format":"woff2"},"body":{"family":"Inter","source":"https://fonts.gstatic.com/s/inter/v18/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7W0Q5nw.woff2","format":"woff2"}},"styling":{"eyebrows":"breadcrumbs","latex":true},"integrations":{"gtm":{"tagId":"GTM-NZNK37TL"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity"],"display":"header"},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"stackone-60","hasAudioNarration":false,"actualSubdomain":"stackone-60","customDomains":["docs.stackone.com"],"gitSource":{"type":"github","owner":"stackonehq","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae92f3a9369ec1cdf5bece3","collectionId":"8589e548-5cb7-48a9-9028-82c532d0a6fd","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae92f3a9369ec1cdf5bece3"},"feedback":{"thumbs":true,"edits":false,"issues":false,"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae97b0e866f88edeb056ec7","clientVersion":"0.0.4045","searchFilterCounts":[{"language":"default","tag":"Connectors","count":9434},{"language":"default","tag":"Embed","count":84},{"language":"default","tag":"Platform API","count":62},{"language":"default","tag":"Gateway","count":49},{"language":"default","tag":"Features","count":48},{"language":"default","tag":"Connector Building","count":42},{"language":"default","tag":"Unified Actions","count":39},{"language":"default","tag":"Embed StackOne","count":36},{"language":"default","tag":"Call Actions","count":29},{"language":"default","tag":"Endpoints","count":25}],"searchSettings":{"isFiltersEnabled":true}},"assistantConfig":{"enableStarterQuestions":false,"deflection":{"enabled":true,"email":"support@stackone.com"}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","href":"/_mintlify/custom/stackone-60/e5c931b6e8140842/style.css"}],"page":{"pagePath":"secure/policies","slug":"/secure/policies","pageMetadata":{"title":"Tool Policies","description":"Set agent tool policies to control which tools your agents use, which fields they see, and what data goes into and out of each call.","lastReviewed":"2026-10-15T03:16:25Z","href":"/secure/policies"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Set agent tool policies to control which tools your agents use, which fields they see, and what data goes into and out of each call.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];const feature_0=`Tool Policies`;const detail_0=undefined;function _createMdxContent(props){const _components={a:`a`,blockquote:`blockquote`,code:`code`,em:`em`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,Card,CardGroup,CodeBlock,Frame,Heading,Info,Note,OptimizedImage,Step,Steps,Tab,Table,Tabs,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Note)_missingMdxReference(`Note`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Info,{children:_jsxs(_components.p,{children:[feature_0,` is only available on certain plans. `,` See `,_jsx(_components.a,{href:`https://www.stackone.com/pricing/`,children:`plans and pricing`}),`.`]})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Tool Policies`}),` control which tools an agent may use, and how, on behalf of the member it acts for. StackOne checks the policies that apply to that member before a tool call reaches the provider, and refuses the call when an enforced policy denies it. Value rules, semantic rules and PII checks also look at the data itself. Value rules check the argument values a tool receives before it executes. Semantic rules and PII checks run on the tool’s inputs before it executes and on the response before the agent sees it.`]}),`\n`,_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/stackone-60/aNpwcJ-mPKWbM45j/images/secure/policies-overview.svg?fit=max\u0026auto=format\u0026n=aNpwcJ-mPKWbM45j\u0026q=85\u0026s=ea1d105547aaa66937d2c40362b72f72`,alt:`Flow diagram with three lanes. An AI agent makes a tool call and Tool Policies are checked. Allowed: the provider is called and the response returns unchanged. Redact PII or Read a field: the provider is called and the response returns with PII redacted or fields masked. Denied, including Write a field denials: the provider is not called and a refusal is returned. All three responses come back to the AI agent. A note under the diagram says semantic rules and PII checks run on both the inputs and the response`,\"data-og-width\":`1928`,width:`1928`,\"data-og-height\":`840`,height:`840`,\"data-path\":`images/secure/policies-overview.svg`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/stackone-60/aNpwcJ-mPKWbM45j/images/secure/policies-overview.svg?w=280\u0026fit=max\u0026auto=format\u0026n=aNpwcJ-mPKWbM45j\u0026q=85\u0026s=d304e6cd8ba1a7960065cc6d718a785f 280w, https://mintcdn.com/stackone-60/aNpwcJ-mPKWbM45j/images/secure/policies-overview.svg?w=560\u0026fit=max\u0026auto=format\u0026n=aNpwcJ-mPKWbM45j\u0026q=85\u0026s=fceb92cc532ff6030162035e231c5e40 560w, https://mintcdn.com/stackone-60/aNpwcJ-mPKWbM45j/images/secure/policies-overview.svg?w=840\u0026fit=max\u0026auto=format\u0026n=aNpwcJ-mPKWbM45j\u0026q=85\u0026s=b77c8f56744de5b047e4bcc820893919 840w, https://mintcdn.com/stackone-60/aNpwcJ-mPKWbM45j/images/secure/policies-overview.svg?w=1100\u0026fit=max\u0026auto=format\u0026n=aNpwcJ-mPKWbM45j\u0026q=85\u0026s=882638ed7dd1176ab6021c6268721c17 1100w, https://mintcdn.com/stackone-60/aNpwcJ-mPKWbM45j/images/secure/policies-overview.svg?w=1650\u0026fit=max\u0026auto=format\u0026n=aNpwcJ-mPKWbM45j\u0026q=85\u0026s=76da5578610623dd694ad5d545b1c55a 1650w, https://mintcdn.com/stackone-60/aNpwcJ-mPKWbM45j/images/secure/policies-overview.svg?w=2500\u0026fit=max\u0026auto=format\u0026n=aNpwcJ-mPKWbM45j\u0026q=85\u0026s=0d834957c9df0c07867e064490418d00 2500w`})}),`\n`,_jsx(Heading,{level:`2`,id:`how-a-policy-is-evaluated`,children:`How a policy is evaluated`}),`\n`,_jsxs(_components.p,{children:[`A policy carries a single `,_jsx(_components.strong,{children:`rule`}),` that allows or denies capabilities. Rules are made up of 4 parts:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Part`}),_jsx(_components.th,{children:`Options`}),_jsx(_components.th,{children:`What it means`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Who it applies to`})}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Everyone`}),`, `,_jsx(_components.strong,{children:`Users`}),`, `,_jsx(_components.strong,{children:`Groups`})]}),_jsxs(_components.td,{children:[`The members whose agents the rule governs. Groups come from `,_jsx(_components.a,{href:`/secure/identity-and-access/roles-and-groups/groups`,children:`Manage Groups`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`What it does`})}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Allow`}),`, `,_jsx(_components.strong,{children:`Deny`})]}),_jsx(_components.td,{children:`A deny rule refuses exactly what it covers for those users or groups. An allow rule restricts nothing and cannot undo a deny.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Capabilities`})}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Use a tool`}),`, `,_jsx(_components.strong,{children:`Read a field`}),`, `,_jsx(_components.strong,{children:`Write a field`}),`, `,_jsx(_components.strong,{children:`Value rule`}),`, `,_jsx(_components.strong,{children:`Redact PII`}),`, `,_jsx(_components.strong,{children:`Semantic rule`})]}),_jsxs(_components.td,{children:[`The operations the rule covers. One capability per kind of access, each narrowed on its own terms. See `,_jsx(_components.a,{href:`#capabilities`,children:`Capabilities`}),` below.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Applies to`})}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Everything`}),`, `,_jsx(_components.strong,{children:`A connector category`}),`, `,_jsx(_components.strong,{children:`A connector`}),`, `,_jsx(_components.strong,{children:`An account`}),`, `,_jsx(_components.strong,{children:`Specific tools`})]}),_jsxs(_components.td,{children:[`Where the capability is covered. `,_jsx(_components.strong,{children:`Tools matching`}),` narrows any target with a name pattern.`]})]})]})]}),`\n`,_jsx(_components.p,{children:`Four guarantees hold across every policy:`}),`\n`,_jsx(Card,{title:`A deny always wins`,icon:`gavel`,horizontal:true,children:_jsx(_components.p,{children:`When policies overlap, a matching deny refuses the call whatever any allow says. An allow for one user does not override a deny for their group, so exempt the user in the deny rule instead.`})}),`\n`,_jsx(Card,{title:`Policies narrow access`,icon:`filter`,horizontal:true,children:_jsxs(_components.p,{children:[_jsx(_components.a,{href:`/secure/scoping-connectors`,children:`Connector Profile scoping`}),` and `,_jsx(_components.a,{href:`/secure/identity-and-access/roles-and-groups/connector-profile-access`,children:`account access`}),` apply restrictions before policies.`]})}),`\n`,_jsx(Card,{title:`Policies follow the member`,icon:`user-check`,horizontal:true,children:_jsxs(_components.p,{children:[`Policies apply when the member is known, which is the case for `,_jsx(_components.a,{href:`/connect/overview`,children:`AI platform`}),` sessions. A call made with a project API key is memberless — govern that traffic with `,_jsx(_components.a,{href:`/secure/scoping-connectors`,children:`Connector Profile scoping`}),` instead.`]})}),`\n`,_jsx(Card,{title:`Policies stay in their project`,icon:`diagram-project`,horizontal:true,children:_jsx(_components.p,{children:`A policy belongs to the project it is created in and governs calls made in that project only. To apply the same rule in several projects, create it in each.`})}),`\n`,_jsx(Heading,{level:`3`,id:`capabilities`,children:`Capabilities`}),`\n`,_jsxs(_components.p,{children:[`A `,_jsx(_components.strong,{children:`capability`}),` is the kind of access a rule governs: running a tool, reading or writing a field, passing an argument value outside the range or list you set, passing PII through a call, or sending and receiving data that a semantic rule’s question flags. Denying one removes that access for the users or groups the rule covers.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Capability`}),_jsx(_components.th,{children:`What denying it does`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Use a tool`})}),_jsx(_components.td,{children:`Refuses the call. The agent may not run the tool at all.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Read a field`})}),_jsx(_components.td,{children:`Masks the field in responses.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Write a field`})}),_jsx(_components.td,{children:`Refuses calls that would change the field.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Value rule`})}),_jsx(_components.td,{children:`Refuses calls whose argument values fall outside the condition, such as a payment amount outside 25 to 500 USD. Calls with values inside it keep their existing access.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Redact PII`})}),_jsxs(_components.td,{children:[`Finds the chosen classes of PII (email addresses, phone numbers, SSNs, or credit card numbers) in the tool’s inputs and responses, then redacts the detected span or blocks the call. Record UUIDs, order numbers, and API keys stay intact. See `,_jsx(_components.a,{href:`/secure/pii-redaction`,children:`PII Redaction`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Semantic rule`})}),_jsx(_components.td,{children:`Asks a plain-language question about the data in the call. On inputs, a matching answer refuses the call before the tool runs. On a response, it masks the field the answer applies to.`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`Rules can carry more than one capability. Capabilities are alternatives rather than conditions: the rule applies where `,_jsx(_components.strong,{children:`any`}),` one of them matches, so adding a second says “or also” rather than narrowing the first. Each is scoped on its own terms, so one rule can deny a tool outright on one connector and only mask a field on another.`]}),`\n`,_jsx(Heading,{level:`2`,id:`create-a-policy`,children:`Create a policy`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Open Policies`,children:_jsxs(_components.p,{children:[`Select the project, open `,_jsx(_components.a,{href:`https://app.stackone.com/settings/policies`,children:_jsx(_components.strong,{children:`Project Settings > Policies`})}),`, and click `,_jsx(_components.strong,{children:`Create policy`}),`. Give the policy a descriptive name.`]})}),_jsxs(Step,{title:`Set the enforcement level`,children:[_jsxs(_components.p,{children:[`Choose an `,_jsx(_components.strong,{children:`Enforcement`}),` level:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Enforced`}),`: Refuses calls the policy denies, masks fields, and blocks or redacts data according to the rule.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Monitored`}),`: Records decisions in the logs without blocking or modifying calls.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Disabled`}),`: Stores the policy without evaluating it.`]}),`\n`]}),_jsxs(_components.p,{children:[`Start new deny rules in `,_jsx(_components.strong,{children:`Monitored`}),`, verify the decisions in your logs, then switch to `,_jsx(_components.strong,{children:`Enforced`}),`.`]})]}),_jsx(Step,{title:`Choose who it applies to`,children:_jsxs(_components.p,{children:[`Select `,_jsx(_components.strong,{children:`Everyone`}),`, `,_jsx(_components.strong,{children:`Users`}),`, or `,_jsx(_components.strong,{children:`Groups`}),`, then search for the users or groups the rule covers.`]})}),_jsx(Step,{title:`Choose what it does`,children:_jsxs(_components.p,{children:[`Select `,_jsx(_components.strong,{children:`Deny`}),` to refuse the capability for those users or groups, or `,_jsx(_components.strong,{children:`Allow`}),` to state permitted use without restricting anything.`]})}),_jsxs(Step,{title:`Set the capability and its targets`,children:[_jsxs(_components.p,{children:[`Add the `,_jsx(_components.a,{href:`#capabilities`,children:`capabilities`}),` the rule governs:`]}),_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Use a tool`,id:`use-a-tool`,children:[_jsxs(_components.p,{children:[`Denying `,_jsx(_components.strong,{children:`Use a tool`}),` refuses the call.`]}),_jsxs(_components.p,{children:[`Choose which targets it applies under `,_jsx(_components.strong,{children:`Applies to`}),`:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Everything`}),` covers every tool in the project.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`A connector category`}),` covers every tool on every connector in the category, including connectors added later.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`A connector`}),` covers every tool on the connectors you pick.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`An account`}),` covers the tools of specific `,_jsx(_components.a,{href:`/connect/managing-connectors/linking-accounts`,children:`Linked Accounts`}),`. Search accounts by name or owner.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Specific tools`}),` lets you pick a connector, then the tools on it by name.`]}),`\n`]}),_jsxs(_components.p,{children:[`To narrow the tools covered by the target selection, enter a name pattern under `,_jsx(_components.strong,{children:`Tools matching`}),` (see the pattern syntax below). An empty pattern covers every tool the targets include, so a deny refuses every call to them. A capability takes either specific tools or a pattern, not both.`]})]}),_jsxs(Tab,{title:`Read a field`,id:`read-a-field`,children:[_jsxs(_components.p,{children:[`Denying `,_jsx(_components.strong,{children:`Read a field`}),` masks the field in responses.`]}),_jsxs(_components.p,{children:[`Choose which targets it applies under `,_jsx(_components.strong,{children:`Applies to`}),`:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Everything`}),` covers every connector and account in the project.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`A connector category`}),` covers every connector in the category, including ones added later.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`A connector`}),` covers the connectors you pick.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`An account`}),` covers specific `,_jsx(_components.a,{href:`/connect/managing-connectors/linking-accounts`,children:`Linked Accounts`}),`. Search accounts by name or owner.`]}),`\n`]}),_jsxs(_components.p,{children:[`To narrow the fields covered by the target selection, enter a pattern on the field’s path in the response under `,_jsx(_components.strong,{children:`Fields matching`}),` (see the pattern syntax below). An empty pattern covers every field the targets include, so a deny masks every field in scope.`]})]}),_jsxs(Tab,{title:`Write a field`,id:`write-a-field`,children:[_jsxs(_components.p,{children:[`Denying `,_jsx(_components.strong,{children:`Write a field`}),` refuses calls that would change the field.`]}),_jsxs(_components.p,{children:[`Choose which targets it applies under `,_jsx(_components.strong,{children:`Applies to`}),`:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Everything`}),` covers every connector and account in the project.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`A connector category`}),` covers every connector in the category, including ones added later.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`A connector`}),` covers the connectors you pick.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`An account`}),` covers specific `,_jsx(_components.a,{href:`/connect/managing-connectors/linking-accounts`,children:`Linked Accounts`}),`. Search accounts by name or owner.`]}),`\n`]}),_jsxs(_components.p,{children:[`To narrow the fields covered by the target selection, enter a pattern on the field’s path under `,_jsx(_components.strong,{children:`Fields matching`}),` (see the pattern syntax below). An empty pattern covers every field the targets include, so a deny refuses every call that would change one.`]})]}),_jsxs(Tab,{title:`Value rule`,id:`value-rule`,children:[_jsxs(_components.p,{children:[`Denying `,_jsx(_components.strong,{children:`Value rule`}),` keeps a tool available and checks the values the agent passes in its arguments.`]}),_jsxs(_components.p,{children:[`Choose which targets it applies under `,_jsx(_components.strong,{children:`Applies to`}),`, the same way as `,_jsx(_components.strong,{children:`Use a tool`}),`, then pick the argument and the condition its value must meet:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`A range`}),` for numbers, such as a payment amount between 25 and 500 with the currency `,_jsx(_components.code,{children:`USD`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Allowed or blocked values`}),`, such as an invoice status that may be `,_jsx(_components.code,{children:`Draft`}),` or `,_jsx(_components.code,{children:`Submitted`}),` but not `,_jsx(_components.code,{children:`Authorized`}),`, or a sharing type that may not be `,_jsx(_components.code,{children:`anyone`}),`.`]}),`\n`]}),_jsx(_components.p,{children:`A call whose value falls outside the condition is refused before the tool runs. A call that leaves the argument out, or sends it in another type or currency, is refused too.`})]}),_jsxs(Tab,{title:`Redact PII`,id:`redact-pii`,children:[_jsxs(_components.p,{children:[`Denying `,_jsx(_components.strong,{children:`Redact PII`}),` checks calls for the chosen classes of PII. StackOne’s own PII model scans the tool’s inputs before it runs and the response before the agent sees it, including free-text fields such as ticket bodies and notes. Record UUIDs, order numbers, and API keys stay intact.`]}),_jsxs(_components.p,{children:[`The `,_jsx(_components.a,{href:`https://www.stackone.com/platform/pii-redaction/#benchmarks`,children:`PII Redaction benchmark`}),` compares the model with Microsoft Presidio on connector data.`]}),_jsxs(_components.p,{children:[`Choose which targets it applies under `,_jsx(_components.strong,{children:`Applies to`}),`:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Everything`}),` covers every connector and account in the project.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`An account`}),` covers specific `,_jsx(_components.a,{href:`/connect/managing-connectors/linking-accounts`,children:`Linked Accounts`}),`. Search accounts by name or owner.`]}),`\n`]}),_jsxs(_components.p,{children:[`Under `,_jsx(_components.strong,{children:`Which PII to redact`}),`, select one or more classes. There is no pattern to enter.`]}),_jsx(_components.p,{children:`Then choose what a detection does:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Redact`}),` replaces each detected span in the inputs and in the response, and lets the call continue. The rest of the input or response is unchanged.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Block`}),` refuses the call. When the PII is in the inputs, the provider is never called. When it is detected in the response, the agent receives a refusal instead of the data.`]}),`\n`]}),_jsx(_components.p,{children:`A response that cannot be scanned (it is streamed, above the scan size limit, or the scan fails) is returned unredacted, and the request log records which classes were not redacted.`}),_jsxs(_components.p,{children:[`For how detection works, what changes in the call and what is recorded, see `,_jsx(_components.a,{href:`/secure/pii-redaction`,children:`PII Redaction`}),`.`]})]}),_jsxs(Tab,{title:`Semantic rule`,id:`semantic-rule`,children:[_jsxs(_components.p,{children:[`Denying `,_jsx(_components.strong,{children:`Semantic rule`}),` asks a decision model a question about each call in scope. Write the question in plain language, for example:`]}),_jsxs(_components.blockquote,{children:[`\n`,_jsx(_components.p,{children:`Does this message contain unreleased financial results?`}),`\n`]}),_jsx(_components.p,{children:`The model answers for each field or payload, so the rule holds whatever a connector calls the field.`}),_jsxs(_components.p,{children:[`Choose which targets it applies under `,_jsx(_components.strong,{children:`Applies to`}),`, the same way as `,_jsx(_components.strong,{children:`Use a tool`}),`. For a rule about outgoing messages, pick the send tools on the connectors that matter, such as Slack, Gmail and Notion.`]}),_jsx(_components.p,{children:`Then choose where the question is asked:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Inputs`}),`: a matching answer refuses the call before the tool runs.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Response`}),`: a matching answer masks the field it applies to before the agent sees it. A field the model cannot decide is masked unless the rule allows it.`]}),`\n`]})]})]}),_jsxs(_components.p,{children:[`To scope a capability to calls coming from specific AI clients, select them under `,_jsx(_components.strong,{children:`From clients`}),` (for example `,_jsx(_components.code,{children:`ChatGPT`}),`, `,_jsx(_components.code,{children:`Claude`}),`, or `,_jsx(_components.code,{children:`Cursor`}),`). Leaving it set to `,_jsx(_components.code,{children:`Any client`}),` applies the capability to calls from any client.`]}),_jsx(`br`,{}),_jsxs(Accordion,{title:`Pattern syntax - wildcards`,id:`pattern-syntax-wildcards`,children:[_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`*`}),` is the only wildcard, and it matches any run of characters.`]}),`\n`,_jsxs(_components.li,{children:[`A pattern has to cover the whole name: `,_jsx(_components.code,{children:`salary`}),` matches only something named exactly that, so use `,_jsx(_components.code,{children:`*salary*`}),` to match it anywhere.`]}),`\n`,_jsx(_components.li,{children:`Matching is case-sensitive.`}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`?`}),`, `,_jsx(_components.code,{children:`[a-z]`}),`, and `,_jsx(_components.code,{children:`{a,b}`}),` are ordinary characters here, not wildcards. A pattern using one saves cleanly and then never matches anything.`]}),`\n`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Pattern`}),_jsx(_components.th,{children:`Matches`}),_jsx(_components.th,{children:`Does not match`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`*delete*`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`personio_delete_person`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`okta_remove_user_from_group`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`salary`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`salary`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`employee.compensation.salary`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`*Delete*`})}),_jsx(_components.td,{children:`Nothing, since matching is case-sensitive.`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`personio_delete_person`})})]})]})]})]})]}),_jsx(Step,{title:`Add exemptions`,children:_jsxs(_components.p,{children:[`For a deny rule, use `,_jsx(_components.strong,{children:`Exempt from this rule`}),` to name users or groups the rule does not apply to. To let one user through a deny that covers their group, exempt them here rather than writing an allow for them. Another matching deny can still refuse the call.`]})}),_jsxs(Step,{title:`Review and create`,children:[_jsx(_components.p,{children:`Review the policy:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Plain Text`}),`: the panel footer restates the rule in plain words, for example:`]}),`\n`,_jsxs(_components.blockquote,{children:[`\n`,_jsxs(_components.p,{children:[`Everyone in this project may not use a tool matching `,_jsx(_components.code,{children:`*delete*`}),` on Workday from ChatGPT, except Finance (Group).`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Cedar`}),`: the exact statement the engine will evaluate, in `,_jsx(_components.a,{href:`https://docs.cedarpolicy.com/policies/syntax-policy.html`,children:`Cedar syntax`}),`. The view is read-only; change the form and the statement follows.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`JSON`}),`: the same statement in Cedar’s JSON encoding.`]}),`\n`]}),`\n`]}),_jsxs(_components.p,{children:[`Then click `,_jsx(_components.strong,{children:`Create policy`}),`.`]}),_jsx(Note,{children:_jsxs(_components.p,{children:[`If you used the assistant, the button reads `,_jsx(_components.strong,{children:`Accept changes and create`}),`. See `,_jsx(_components.a,{href:`#build-a-policy-with-the-policy-ai-assistant`,children:`Build a policy with the Policy AI Assistant`}),`.`]})})]})]}),`\n`,_jsx(Frame,{caption:`A deny rule on the Create policy panel, with Fields, Cedar, and JSON views above the form.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/stackone-60/MRw_NcTkLCDG7kLr/images/secure/policies-create-tool-rule.png?fit=max\u0026auto=format\u0026n=MRw_NcTkLCDG7kLr\u0026q=85\u0026s=c2bae43edfe4363ae092aee47feee8fb`,alt:`Create policy panel with Policy chat on the left and the form on the right, showing a policy named Contractors cannot use tools that delete records, the audience set to the Contractors group, and a Deny rule on the Use a tool capability`,\"data-og-width\":`1322`,width:`1322`,\"data-og-height\":`896`,height:`896`,\"data-path\":`images/secure/policies-create-tool-rule.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/stackone-60/MRw_NcTkLCDG7kLr/images/secure/policies-create-tool-rule.png?w=280\u0026fit=max\u0026auto=format\u0026n=MRw_NcTkLCDG7kLr\u0026q=85\u0026s=e384231dd64de1ee7a31e02b2e32cf67 280w, https://mintcdn.com/stackone-60/MRw_NcTkLCDG7kLr/images/secure/policies-create-tool-rule.png?w=560\u0026fit=max\u0026auto=format\u0026n=MRw_NcTkLCDG7kLr\u0026q=85\u0026s=7326bcba0f3f676bc7e2608eab9b497c 560w, https://mintcdn.com/stackone-60/MRw_NcTkLCDG7kLr/images/secure/policies-create-tool-rule.png?w=840\u0026fit=max\u0026auto=format\u0026n=MRw_NcTkLCDG7kLr\u0026q=85\u0026s=de85807e40654f3cc6deccf6a610ab61 840w, https://mintcdn.com/stackone-60/MRw_NcTkLCDG7kLr/images/secure/policies-create-tool-rule.png?w=1100\u0026fit=max\u0026auto=format\u0026n=MRw_NcTkLCDG7kLr\u0026q=85\u0026s=61551450a0cfc95069d693bc1467e245 1100w, https://mintcdn.com/stackone-60/MRw_NcTkLCDG7kLr/images/secure/policies-create-tool-rule.png?w=1650\u0026fit=max\u0026auto=format\u0026n=MRw_NcTkLCDG7kLr\u0026q=85\u0026s=02db46a8dac7e943eff763b92405e35c 1650w, https://mintcdn.com/stackone-60/MRw_NcTkLCDG7kLr/images/secure/policies-create-tool-rule.png?w=2500\u0026fit=max\u0026auto=format\u0026n=MRw_NcTkLCDG7kLr\u0026q=85\u0026s=ea6c4c7e68f0bf7dcd9839fb279100b9 2500w`})}),`\n`,_jsx(Heading,{level:`2`,id:`build-a-policy-with-the-policy-ai-assistant`,children:`Build a policy with the Policy AI Assistant`}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.strong,{children:`Policy AI Assistant`}),` opens beside the form, as `,_jsx(_components.strong,{children:`Policy chat`}),`, whenever you create or edit a policy. Describe the rule in your own words and the assistant drafts it in the form for you to review:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Suggestions are highlighted in the form, with the previous value shown underneath.`}),`\n`,_jsx(_components.li,{children:`Each suggestion can be applied or reverted individually.`}),`\n`,_jsxs(_components.li,{children:[`All changes can be applied using the buttons at the top of the form or by clicking `,_jsx(_components.strong,{children:`Accept changes and create`}),` or `,_jsx(_components.strong,{children:`Accept changes and save`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`The assistant drafts every capability, including value rules, semantic rules and PII redaction. Ask for `,_jsx(_components.em,{children:`Keep unreleased financial results out of Slack for everyone outside Finance`}),` and it writes the semantic rule’s question, picks the send tools, and sets the audience and exemption. You can also name AI clients, for example `,_jsx(_components.em,{children:`Block contractors from using delete tools on Workday through ChatGPT`}),`, and the assistant scopes the capability to those clients.`]}),`\n`,_jsx(Frame,{caption:`The Policy AI Assistant beside the form. The assistant looked up the Contractors group, proposed a deny rule, and left three changes marked for review.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/stackone-60/MRw_NcTkLCDG7kLr/images/secure/policies-assistant-panel.png?fit=max\u0026auto=format\u0026n=MRw_NcTkLCDG7kLr\u0026q=85\u0026s=66c258bf38192cf9f68dbcec81021ffb`,alt:`Create policy panel split in two, with Policy chat on the left showing completed search_principals and update_policy_draft tool calls and an explanation of the proposed rule, and the policy form on the right with a bar reading 3 changes from the assistant need review`,\"data-og-width\":`1322`,width:`1322`,\"data-og-height\":`896`,height:`896`,\"data-path\":`images/secure/policies-assistant-panel.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/stackone-60/MRw_NcTkLCDG7kLr/images/secure/policies-assistant-panel.png?w=280\u0026fit=max\u0026auto=format\u0026n=MRw_NcTkLCDG7kLr\u0026q=85\u0026s=8aa8daad7a8f840bfa261b9a7af371e4 280w, https://mintcdn.com/stackone-60/MRw_NcTkLCDG7kLr/images/secure/policies-assistant-panel.png?w=560\u0026fit=max\u0026auto=format\u0026n=MRw_NcTkLCDG7kLr\u0026q=85\u0026s=cc99e12606eedf17aad5f1439313cd4f 560w, https://mintcdn.com/stackone-60/MRw_NcTkLCDG7kLr/images/secure/policies-assistant-panel.png?w=840\u0026fit=max\u0026auto=format\u0026n=MRw_NcTkLCDG7kLr\u0026q=85\u0026s=ee37d24bd09324feecd04487032377af 840w, https://mintcdn.com/stackone-60/MRw_NcTkLCDG7kLr/images/secure/policies-assistant-panel.png?w=1100\u0026fit=max\u0026auto=format\u0026n=MRw_NcTkLCDG7kLr\u0026q=85\u0026s=8cd62a073781101ea22dfbcf68ba0cc5 1100w, https://mintcdn.com/stackone-60/MRw_NcTkLCDG7kLr/images/secure/policies-assistant-panel.png?w=1650\u0026fit=max\u0026auto=format\u0026n=MRw_NcTkLCDG7kLr\u0026q=85\u0026s=e2b769ab1b634c93166c2e4d4dab1dee 1650w, https://mintcdn.com/stackone-60/MRw_NcTkLCDG7kLr/images/secure/policies-assistant-panel.png?w=2500\u0026fit=max\u0026auto=format\u0026n=MRw_NcTkLCDG7kLr\u0026q=85\u0026s=df9c3486aff59e2e4a8f0697b982d792 2500w`})}),`\n`,_jsx(Heading,{level:`3`,id:`what-the-assistant-can-access`,children:`What the assistant can access`}),`\n`,_jsx(_components.p,{children:`The assistant can look things up in the project as it drafts, and the transcript shows each lookup as it runs:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`It can find`}),_jsx(_components.th,{children:`So you can say`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Users and groups`}),_jsxs(_components.td,{children:[_jsx(_components.em,{children:`Exempt payroll`}),`, (where you have a group defined as “payroll”)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Connectors and categories`}),_jsx(_components.td,{children:_jsx(_components.em,{children:`Block writes to any HRIS connector`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`The tools on a connector`}),_jsx(_components.td,{children:_jsx(_components.em,{children:`Stop the delete ones on Workday`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Linked accounts`}),_jsx(_components.td,{children:_jsx(_components.em,{children:`Only the Acme production account`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Related tool call logs`}),_jsx(_components.td,{children:_jsx(_components.em,{children:`Stop this tool returning some of the fields it returned`})})]})]})]}),`\n`,_jsxs(Note,{children:[_jsx(_components.p,{children:`By default, only a tool call’s tool, connector and caller are exposed.`}),_jsxs(_components.p,{children:[`With `,_jsx(_components.a,{href:`/secure/observability#advanced-logs`,children:`advanced logging`}),` enabled, the assistant can read the request/response payloads to help define field related capabilities.`]})]}),`\n`,_jsx(_components.p,{children:`For example, using a prompt like:`}),`\n`,_jsxs(_components.blockquote,{children:[`\n`,_jsx(_components.p,{children:`Stop contractors deleting records`}),`\n`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`The assistant searches existing groups, sets `,_jsx(_components.strong,{children:`Who it applies to`}),` to `,_jsx(_components.code,{children:`Groups`}),` and populates with `,_jsx(_components.code,{children:`Contractors`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Writes a deny on `,_jsx(_components.strong,{children:`Use a tool`}),` with a `,_jsx(_components.code,{children:`*delete*`}),` pattern, with `,_jsx(_components.strong,{children:`applies to`}),` set to `,_jsx(_components.code,{children:`Everything`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`The assistant also flags what a rule may miss. For example, a pattern matching `,_jsx(_components.code,{children:`delete`}),` does not catch a connector whose tools are named with `,_jsx(_components.code,{children:`remove`}),` or `,_jsx(_components.code,{children:`archive`}),`, so you can ask it to add those patterns too.`]}),`\n`,_jsx(Heading,{level:`3`,id:`starting-from-logs`,children:`Starting from logs`}),`\n`,_jsx(_components.p,{children:`Policy creation can be initiated from a specific log instead of the policies page.`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{children:_jsxs(_components.p,{children:[`Go to `,_jsx(_components.a,{href:`https://app.stackone.com/logs`,children:`StackOne Logs`}),`.`]})}),_jsx(Step,{children:_jsx(_components.p,{children:`Select the log of a call you want to create a policy from.`})}),_jsxs(Step,{children:[_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Use in policy`}),` at the top of the panel.`]}),_jsxs(_components.p,{children:[`This takes you to the `,_jsx(_components.strong,{children:`Policies`}),` page with the context of the log selected.`]})]}),_jsx(Step,{children:_jsxs(_components.p,{children:[`Either select an existing policy `,_jsx(_components.strong,{children:`OR`}),` create a new policy by clicking `,_jsx(_components.strong,{children:`Create policy`}),`.`]})}),_jsxs(Step,{children:[_jsxs(_components.p,{children:[`The `,_jsx(_components.strong,{children:`Policy AI Assistant`}),` now has the context of the selected log.`]}),_jsx(_components.p,{children:`Describe the policy you want. For example:`}),_jsxs(_components.blockquote,{children:[`\n`,_jsx(_components.p,{children:_jsx(_components.em,{children:`This call should not have been allowed to return salary`})}),`\n`]}),_jsxs(_components.blockquote,{children:[`\n`,_jsx(_components.p,{children:_jsx(_components.em,{children:`This person should not have been allowed to make it`})}),`\n`]}),_jsxs(_components.p,{children:[`See `,_jsx(_components.a,{href:`#build-a-policy-with-the-policy-ai-assistant`,children:`Build a policy with the Policy AI Assistant`}),`.`]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`testing-a-policy-before-enforcing-it`,children:`Testing a policy before enforcing it`}),`\n`,_jsx(_components.p,{children:`Two checks come before enforcing:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Test against personas`}),`: in the create and edit panel, `,_jsx(_components.strong,{children:`Test this policy against personas`}),` shows what the rule would decide for the members you choose, without making a call. Each member can be tested through a chosen AI client, or `,_jsx(_components.code,{children:`No client (older connection)`}),`, and added again under another client to compare the decisions.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Monitored`}),`: set the policy’s `,_jsx(_components.strong,{children:`Enforcement`}),` to `,_jsx(_components.strong,{children:`Monitored`}),` and applicable tool calls are flagged as calls the policy would have applied to, while continuing unaffected. Value rule matches, semantic rule answers and PII detections are recorded the same way.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Only when `,_jsx(_components.strong,{children:`Enforcement`}),` is set to `,_jsx(_components.strong,{children:`Enforced`}),` are tool calls blocked or modified as defined by the policy.`]}),`\n`,_jsx(Heading,{level:`2`,id:`change-a-policy’s-enforcement-level`,children:`Change a policy’s enforcement level`}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.strong,{children:`Policies`}),` table displays an `,_jsx(_components.strong,{children:`Enforcement`}),` column showing each policy’s current level: `,_jsx(_components.strong,{children:`Enforced`}),`, `,_jsx(_components.strong,{children:`Monitored`}),`, or `,_jsx(_components.strong,{children:`Disabled`}),`.`]}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Open Policies`,children:_jsxs(_components.p,{children:[`Select the project and open `,_jsx(_components.a,{href:`https://app.stackone.com/settings/policies`,children:_jsx(_components.strong,{children:`Project Settings > Policies`})}),`.`]})}),_jsxs(Step,{title:`Select the new level`,children:[_jsxs(_components.p,{children:[`On the policy’s row in the table, click the `,_jsx(_components.strong,{children:`…`}),` button and select the new level:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Enforce`}),` moves the policy to `,_jsx(_components.strong,{children:`Enforced`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Monitor`}),` or `,_jsx(_components.strong,{children:`Stop enforcing`}),` moves the policy to `,_jsx(_components.strong,{children:`Monitored`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Disable`}),` moves the policy to `,_jsx(_components.strong,{children:`Disabled`}),`.`]}),`\n`]}),_jsxs(_components.p,{children:[`You can also edit the policy and change the `,_jsx(_components.strong,{children:`Enforcement`}),` field in the side panel.`]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`duplicating-policies`,children:`Duplicating policies`}),`\n`,_jsx(_components.p,{children:`Instead of starting with a blank new policy, an existing policy can be used as a template.`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Open Policies`,children:_jsxs(_components.p,{children:[`Select the project and open `,_jsx(_components.a,{href:`https://app.stackone.com/settings/policies`,children:_jsx(_components.strong,{children:`Project Settings > Policies`})}),`.`]})}),_jsx(Step,{title:`Duplicate the policy`,children:_jsxs(_components.p,{children:[`On an existing policy’s row in the table, click the `,_jsx(_components.strong,{children:`…`}),` button and select `,_jsx(_components.strong,{children:`Duplicate`}),`.`]})}),_jsxs(Step,{title:`Review the draft`,children:[_jsx(_components.p,{children:`A new policy is drafted with the original policy’s details except:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Name`}),`: original name is appended with `,_jsx(_components.code,{children:`(copy)`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Enforcement`}),`: set to `,_jsx(_components.strong,{children:`Disabled`}),`.`]}),`\n`]}),_jsxs(_components.p,{children:[`Edit as needed, then click `,_jsx(_components.strong,{children:`Create policy`}),`.`]})]})]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`A policy whose rule the builder cannot read, or that holds more than one statement, cannot be duplicated.`})}),`\n`,_jsx(Heading,{level:`2`,id:`examples`,children:`Examples`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Contractors can't delete anything, anywhere`,id:`contractors-cant-delete-anything-anywhere`,children:_jsxs(_components.p,{children:[`One `,_jsx(_components.strong,{children:`Use a tool`}),` deny with `,_jsx(_components.strong,{children:`Applies to`}),` set to `,_jsx(_components.strong,{children:`Everything`}),` and `,_jsx(_components.strong,{children:`Tools matching`}),` set to `,_jsx(_components.code,{children:`*delete*`}),`, for the `,_jsx(_components.code,{children:`Contractors`}),` group. Run it in `,_jsx(_components.strong,{children:`Monitored`}),` first, check the logged decisions, then switch it to `,_jsx(_components.strong,{children:`Enforced`}),`.`]})}),_jsx(Accordion,{title:`Payments stay within limits`,id:`payments-stay-within-limits`,children:_jsxs(_components.p,{children:[`A `,_jsx(_components.strong,{children:`Value rule`}),` deny on the payment tools for NetSuite and Xero, on the payment amount, allowing amounts between 25 and 500 in `,_jsx(_components.code,{children:`USD`}),`. A payment outside that range, or in another currency, is refused before the tool runs, and payments inside it go through as before.`]})}),_jsx(Accordion,{title:`Unreleased financials stay in Finance`,id:`unreleased-financials-stay-in-finance`,children:_jsxs(_components.p,{children:[`A `,_jsx(_components.strong,{children:`Semantic rule`}),` deny on the send tools for Slack, Gmail and Notion, asking `,_jsx(_components.em,{children:`Does this message contain unreleased financial results?`}),` on `,_jsx(_components.strong,{children:`Inputs`}),`. It applies to `,_jsx(_components.strong,{children:`Everyone`}),`, with the `,_jsx(_components.code,{children:`Finance`}),` group exempt. The agent can still summarize the month-end close for Finance, and a message that posts those numbers to a shared channel is refused.`]})}),_jsxs(Accordion,{title:`Customer PII stays in support`,id:`customer-pii-stays-in-support`,children:[_jsx(_components.p,{children:`Two policies for the support agent’s users:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Zendesk`}),`: a `,_jsx(_components.strong,{children:`Redact PII`}),` deny on the Zendesk account, set to `,_jsx(_components.strong,{children:`Redact`}),`, so responses reach the agent without email addresses, phone numbers or card numbers. The same policy adds `,_jsx(_components.strong,{children:`Read a field`}),` on Zendesk, with `,_jsx(_components.strong,{children:`Fields matching`}),` set to the card number’s path, so that field is always masked.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Jira and Slack`}),`: a `,_jsx(_components.strong,{children:`Redact PII`}),` deny on the Jira and Slack accounts, set to `,_jsx(_components.strong,{children:`Block`}),`, so a write that contains PII is refused.`]}),`\n`]}),_jsx(_components.p,{children:`The agent can still escalate the bug to Jira, without the customer’s details.`})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`what-a-denied-call-returns`,children:`What a denied call returns`}),`\n`,_jsxs(_components.p,{children:[`When an enforced policy refuses a tool call before it runs, the request fails with HTTP `,_jsx(_components.code,{children:`403`}),` and nothing reaches the underlying provider. The refusal returns to the agent as the tool result.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`5`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"message\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Action 'personio_delete_person' is not permitted by project policy\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"errorType\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"POLICY_DENIED_ERROR\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"level\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"project\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`A call refused by a value rule, a semantic rule or a PII block on its inputs fails the same way, before the provider is called. A PII block on a response refuses the call after the provider responds: the agent receives the refusal instead of the data. Masking and redaction on a response never fail the call: the agent receives the response with the denied fields masked and the detected spans redacted.`}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshooting`,children:`Troubleshooting`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Why is a pattern matching the wrong tools, or none at all?`,id:`why-is-a-pattern-matching-the-wrong-tools-or-none-at-all`,children:_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`It matches nothing.`}),` The pattern has to cover the whole name: `,_jsx(_components.code,{children:`salary`}),` only matches a tool named exactly that, so use `,_jsx(_components.code,{children:`*salary*`}),`.\n`,_jsx(_components.code,{children:`?`}),`, `,_jsx(_components.code,{children:`[a-z]`}),`, and `,_jsx(_components.code,{children:`{a,b}`}),` do not perform any special matching.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`It misses tools you expected.`}),` Matching is case-sensitive: `,_jsx(_components.code,{children:`*Delete*`}),` misses `,_jsx(_components.code,{children:`personio_delete_person`}),`. A pattern matches exactly rather than describing a behavior: `,_jsx(_components.code,{children:`*delete*`}),` does not catch a tool named `,_jsx(_components.code,{children:`okta_remove_user_from_group`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`It matches more than you expected.`}),` `,_jsx(_components.code,{children:`*`}),` matches any run of characters, underscores included, so `,_jsx(_components.code,{children:`*create*`}),` could cover `,_jsx(_components.code,{children:`leaddocket_list_opportunities_created_since`}),`.`]}),`\n`]})}),_jsxs(Accordion,{title:`Why is a policy not taking effect?`,id:`why-is-a-policy-not-taking-effect`,children:[_jsx(_components.p,{children:`Check the following in order:`}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`The policy’s `,_jsx(_components.strong,{children:`Enforcement`}),` is set to `,_jsx(_components.strong,{children:`Enforced`}),` (not `,_jsx(_components.strong,{children:`Monitored`}),` or `,_jsx(_components.strong,{children:`Disabled`}),`).`]}),`\n`,_jsx(_components.li,{children:`The acting member is in its audience (and not exempt).`}),`\n`,_jsx(_components.li,{children:`The call is made in the project the policy was created in.`}),`\n`,_jsx(_components.li,{children:`The tool name or pattern matches exactly, including case.`}),`\n`,_jsxs(_components.li,{children:[`The caller is a member connected through an `,_jsx(_components.a,{href:`/connect/overview`,children:`AI platform`}),`, so the call carries their identity. A call made with a project API key alone names no member, so no policy governs it.`]}),`\n`,_jsxs(_components.li,{children:[`If the capability specifies `,_jsx(_components.strong,{children:`From clients`}),`, the call originates from one of the selected clients.`]}),`\n`]})]}),_jsx(Accordion,{title:`Can I see policy decisions in request logs?`,id:`can-i-see-policy-decisions-in-request-logs`,children:_jsxs(_components.p,{children:[`Yes, on an action log. Open the record and select the `,_jsx(_components.strong,{children:`Policy`}),` tab.`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`next-steps`,children:`Next steps`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Scoping Connectors`,icon:`sliders`,href:`/secure/scoping-connectors`,children:_jsx(_components.p,{children:`Set which actions each Connector Profile exposes.`})}),_jsx(Card,{title:`Groups`,icon:`users`,href:`/secure/identity-and-access/roles-and-groups/groups`,children:_jsx(_components.p,{children:`Maintain the groups your policies apply to.`})}),_jsx(Card,{title:`Connector Profile Access`,icon:`share-nodes`,href:`/secure/identity-and-access/roles-and-groups/connector-profile-access`,children:_jsx(_components.p,{children:`Control who can link accounts on a profile.`})}),_jsx(Card,{title:`Observability`,icon:`chart-line`,href:`/secure/observability`,children:_jsx(_components.p,{children:`Configure request logging and retention.`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{feature_0,detail_0,default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Tool Policies","description":"Set agent tool policies to control which tools your agents use, which fields they see, and what data goes into and out of each call.","lastReviewed":"2026-10-15T03:16:25Z","href":"/secure/policies"}}},"mdxSourceWithNoJs":null,"noJsSplices":[[134,194,"detail_0=undefined;const feature_0=`Tool Policies`;function "],[1449,1463,"`Tool Policies`,` is"],[52085,52105,"detail_0,feature_0,d"]]},"mdxExtracts":{"tableOfContents":[{"title":"How a policy is evaluated","slug":"how-a-policy-is-evaluated","depth":2,"children":[{"title":"Capabilities","slug":"capabilities","depth":3,"children":[]}]},{"title":"Create a policy","slug":"create-a-policy","depth":2,"children":[]},{"title":"Build a policy with the Policy AI Assistant","slug":"build-a-policy-with-the-policy-ai-assistant","depth":2,"children":[{"title":"What the assistant can access","slug":"what-the-assistant-can-access","depth":3,"children":[]},{"title":"Starting from logs","slug":"starting-from-logs","depth":3,"children":[]}]},{"title":"Testing a policy before enforcing it","slug":"testing-a-policy-before-enforcing-it","depth":2,"children":[]},{"title":"Change a policy’s enforcement level","slug":"change-a-policy’s-enforcement-level","depth":2,"children":[]},{"title":"Duplicating policies","slug":"duplicating-policies","depth":2,"children":[]},{"title":"Examples","slug":"examples","depth":2,"children":[]},{"title":"What a denied call returns","slug":"what-a-denied-call-returns","depth":2,"children":[]},{"title":"Troubleshooting","slug":"troubleshooting","depth":2,"children":[]},{"title":"Next steps","slug":"next-steps","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/stackone-60/072d59ca3ea476f6/status-indicator.js","/_mintlify/custom/stackone-60/2cef6058362559bc/connectors.js","/_mintlify/custom/stackone-60/af28b3fbb0435529/hubspot-form.js","/_mintlify/custom/stackone-60/ec01e4530a66d850/end-users.js"],"subdomain":"stackone-60","siteName":"Stackone","title":"Tool Policies - Stackone","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-28T17:43:35.428Z","originalFileLocation":"secure/policies.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Set agent tool policies to control which tools your agents use, which fields they see, and what data goes into and out of each call.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Stackone\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/stackone-60/vUkZo0TYnLvO23Z1/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/stackone-60/vUkZo0TYnLvO23Z1/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/stackone-60/vUkZo0TYnLvO23Z1/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/stackone-60/vUkZo0TYnLvO23Z1/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/stackone-60/vUkZo0TYnLvO23Z1/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/stackone-60/vUkZo0TYnLvO23Z1/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/stackone-60/vUkZo0TYnLvO23Z1/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/stackone-60/vUkZo0TYnLvO23Z1/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/stackone-60/vUkZo0TYnLvO23Z1/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Tool Policies - Stackone\">\u003cmeta data-mint-head property=\"og:description\" content=\"Set agent tool policies to control which tools your agents use, which fields they see, and what data goes into and out of each call.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Stackone\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.stackone.com/secure/policies\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://stackone-60.mintlify.app/_mintlify/api/og/v2?division=Secure\u0026amp;title=Tool+Policies\u0026amp;description=Set+agent+tool+policies+to+control+which+tools+your+agents+use%2C+which+fields+they+see%2C+and+what+data+goes+into+and+out+of+each+call.\u0026amp;theme=841e834217e7bb36731c6d12\u0026amp;signature=ed257ee707c9978a523ce1b4d82ee0bc50c1de3e3483ce8146f5b682d89257cc\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Tool Policies - Stackone\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Set agent tool policies to control which tools your agents use, which fields they see, and what data goes into and out of each call.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://stackone-60.mintlify.app/_mintlify/api/og/v2?division=Secure\u0026amp;title=Tool+Policies\u0026amp;description=Set+agent+tool+policies+to+control+which+tools+your+agents+use%2C+which+fields+they+see%2C+and+what+data+goes+into+and+out+of+each+call.\u0026amp;theme=841e834217e7bb36731c6d12\u0026amp;signature=ed257ee707c9978a523ce1b4d82ee0bc50c1de3e3483ce8146f5b682d89257cc\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/stackone-60/vUkZo0TYnLvO23Z1/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Stackone\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#068F56\">\u003cmeta data-mint-head name=\"google-site-verification\" content=\"gYj1x4gkdSwpCGVLFVXNVOPQ_wVrePW37ZKJt3HEqys\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.stackone.com/secure/policies\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/secure/policies.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.stackone.com/#organization\",\"name\":\"Stackone\",\"url\":\"https://docs.stackone.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/stackone-60/WsmKpuoeBZmio9QO/images/logo/logo-light-mode.svg?fit=max\u0026auto=format\u0026n=WsmKpuoeBZmio9QO\u0026q=85\u0026s=f08be9c0a142cb1e7fcaa23910c4bf7f\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.stackone.com#website\",\"name\":\"Stackone\",\"url\":\"https://docs.stackone.com\",\"publisher\":{\"@id\":\"https://docs.stackone.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.stackone.com/secure/policies#webpage\",\"url\":\"https://docs.stackone.com/secure/policies\",\"name\":\"Tool Policies\",\"description\":\"Set agent tool policies to control which tools your agents use, which fields they see, and what data goes into and out of each call.\",\"dateModified\":\"2026-10-28T17:43:35.428Z\",\"isPartOf\":{\"@id\":\"https://docs.stackone.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.stackone.com/secure/policies#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.stackone.com/secure/policies#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Secure\",\"item\":\"https://docs.stackone.com/secure/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tool Policies\",\"item\":\"https://docs.stackone.com/secure/policies\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.stackone.com/secure/policies#article\",\"headline\":\"Tool Policies\",\"name\":\"Tool Policies\",\"description\":\"Set agent tool policies to control which tools your agents use, which fields they see, and what data goes into and out of each call.\",\"url\":\"https://docs.stackone.com/secure/policies\",\"mainEntityOfPage\":{\"@id\":\"https://docs.stackone.com/secure/policies#webpage\"},\"dateModified\":\"2026-10-28T17:43:35.428Z\",\"publisher\":{\"@id\":\"https://docs.stackone.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.stackone.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Stackone\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Stackone","nav":{"global":null,"tabs":[{"tab":"Gateway","icon":"rocket","groups":[{"group":"End Users","root":{"title":"Use StackOne in Your AI Platform","sidebarTitle":"Overview","mode":"center","href":"/end-users/overview"},"pages":[{"title":"Use StackOne in Claude","sidebarTitle":"Claude","mode":"center","href":"/end-users/claude"}]},{"group":"Introduction","root":{"title":"Introduction","href":"/introduction"},"expanded":true,"pages":[{"group":"Core Concepts","root":{"title":"Core Concepts","href":"/gateway/concepts/overview"},"pages":[{"title":"Organizations \u0026 Projects","href":"/gateway/concepts/organizations-and-projects"},{"group":"Connectors","root":{"title":"Connectors","href":"/gateway/concepts/connectors"},"pages":[{"title":"Actions","href":"/gateway/concepts/actions"},{"title":"Events","href":"/gateway/concepts/events"}]}]},{"title":"Quickstart","href":"/gateway/quickstart"},{"title":"Dashboard","href":"/gateway/dashboard"},{"title":"Platform Features","href":"/gateway/platform-features"}]},{"group":"Connect","root":{"title":"Connect","href":"/connect/overview"},"expanded":true,"pages":[{"group":"Managing Connectors","pages":[{"title":"Connector Profiles","href":"/connect/managing-connectors/connector-profiles"},{"title":"Linking Accounts","href":"/connect/managing-connectors/linking-accounts"},{"title":"Adding MCP Connectors","href":"/connect/managing-connectors/adding-mcp-connectors"},{"title":"Use Your Own OAuth Apps","href":"/connect/managing-connectors/using-your-own-oauth-apps"}]},{"group":"AI Platforms","pages":[{"title":"AI Platforms (MCP)","sidebarTitle":"MCP Server","href":"/connect/ai-platforms/overview"},{"title":"ChatGPT","href":"/connect/ai-platforms/chatgpt"},{"title":"Claude Code","href":"/connect/ai-platforms/claude-code"},{"title":"Claude Desktop \u0026 Web","href":"/connect/ai-platforms/claude-desktop"},{"title":"Codex (OpenAI)","href":"/connect/ai-platforms/codex"},{"title":"Cursor","href":"/connect/ai-platforms/cursor"},{"title":"Gemini CLI","href":"/connect/ai-platforms/gemini"},{"title":"Glean","href":"/connect/ai-platforms/glean"},{"title":"Goose CLI \u0026 Desktop","href":"/connect/ai-platforms/goose"},{"title":"n8n Automation","href":"/connect/ai-platforms/n8n"},{"title":"VS Code (Copilot)","href":"/connect/ai-platforms/vscode"}]},{"title":"Protocols \u0026 SDKs","href":"/connect/protocols-and-sdks"},{"title":"Webhooks","sidebarTitle":"Webhook Events","href":"/connect/webhooks"},{"title":"Troubleshooting","href":"/connect/troubleshooting"}]},{"group":"Optimize","root":{"title":"Optimize","sidebarTitle":"Overview","href":"/optimize/overview"},"expanded":true,"pages":[{"title":"Advanced Tool Search","href":"/optimize/advanced-tool-search"},{"group":"Data Sync","root":{"title":"Data Sync","href":"/optimize/data-sync/overview"},"pages":[{"title":"Data Sync Events","sidebarTitle":"Events","href":"/optimize/data-sync/events"}]},{"title":"Deep Query","href":"/optimize/deep-query"}]},{"group":"Secure","root":{"title":"Secure","href":"/secure/overview"},"expanded":true,"pages":[{"title":"Defender","href":"/secure/defender"},{"title":"Scoping Connectors","description":"Scope what each connector can do: which of its actions and events are available.","href":"/secure/scoping-connectors"},{"title":"Tool Policies","href":"/secure/policies"},{"title":"PII Redaction","description":"Remove personal data from tool inputs and responses, and from request and response bodies before Advanced Logs stores them.","href":"/secure/pii-redaction"},{"group":"Identity and Access","root":{"title":"Identity and Access","href":"/secure/identity-and-access/overview"},"pages":[{"group":"Authentication","root":{"title":"Authentication","href":"/secure/identity-and-access/authentication/overview"},"pages":[{"group":"Single Sign-On","root":{"title":"Single Sign-On","href":"/secure/identity-and-access/authentication/sso/overview"},"pages":[{"title":"Okta SSO","href":"/secure/identity-and-access/authentication/sso/okta"},{"title":"Microsoft Entra SSO","href":"/secure/identity-and-access/authentication/sso/microsoft-entra"},{"title":"Generic SAML SSO","href":"/secure/identity-and-access/authentication/sso/saml-generic"}]},{"title":"Passwords and MFA","href":"/secure/identity-and-access/authentication/passwords-and-mfa"}]},{"group":"Manage Team","root":{"title":"Manage Team","href":"/secure/identity-and-access/manage-team/overview"},"pages":[{"title":"Invite Users","href":"/secure/identity-and-access/manage-team/invite-users"},{"title":"Just-in-Time Provisioning","href":"/secure/identity-and-access/manage-team/jit"},{"group":"SCIM Provisioning","root":{"title":"SCIM Provisioning","href":"/secure/identity-and-access/manage-team/scim/overview"},"pages":[{"title":"Okta SCIM Provisioning","sidebarTitle":"Okta","href":"/secure/identity-and-access/manage-team/scim/okta"},{"title":"Microsoft Entra SCIM Provisioning","sidebarTitle":"Microsoft Entra","href":"/secure/identity-and-access/manage-team/scim/microsoft-entra"},{"title":"SCIM Groups","href":"/secure/identity-and-access/manage-team/scim/groups"}]}]},{"group":"Roles and Groups","root":{"title":"Roles and Groups","href":"/secure/identity-and-access/roles-and-groups/overview"},"pages":[{"title":"Organization Roles","href":"/secure/identity-and-access/roles-and-groups/organization-roles"},{"title":"Project Roles","href":"/secure/identity-and-access/roles-and-groups/project-roles"},{"title":"Connector Profile Access","href":"/secure/identity-and-access/roles-and-groups/connector-profile-access"},{"title":"Shared Accounts","href":"/secure/identity-and-access/roles-and-groups/shared-accounts"},{"title":"Groups","href":"/secure/identity-and-access/roles-and-groups/groups"}]}]},{"title":"IP Restrictions","href":"/secure/ip-restrictions"},{"title":"Observability","href":"/secure/observability"},{"title":"Self-Hosted Deployment","href":"/secure/self-hosted-deployment"}]}]},{"tab":"Connectors","icon":"plug","pages":[{"title":"Connectors","href":"/connectors/introduction"}]},{"tab":"Embed","icon":"cube","pages":[{"title":"Embed","href":"/embed/overview"}]},{"tab":"Platform API","icon":"code","pages":[{"title":"Platform API","href":"/platform-api/overview"}]}]},"basePath":"","title":"Tool Policies - Stackone","buildId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","deploymentId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-DW6UFrUy.js","DynamicMarkdown-B62XqCSI.js","zoom-image-lightbox-eHyQ0tlO.js","lightbox-handle-r17bVUz3.js"]}