Microsoft Copilot Studio
Copilot Studio lets an organization nominate an external threat detection provider. Once configured, every time a generative agent's orchestrator decides to invoke a tool, Copilot Studio sends the proposed call to Beak AI Security and holds the tool until Beak answers. If Beak blocks it, the agent stops and tells the user their message was blocked.
This is the only Beak control that sees a tool call with its resolved arguments, before the tool runs. Prompt-level scanning sees what a user typed; this sees what the agent is about to do — the address an email is about to be BCC'd to, the path a file tool was told to read, the URL a request tool was told to POST to.
Note: External threat detection is a Microsoft preview feature. Microsoft states preview features are not meant for production use and may change. Treat this integration as a pilot until Microsoft ships it generally.
For the step-by-step setup — the Beak side, the Entra application and Power Platform, in the order they have to be done — see Configuring Copilot Studio protection.
What Beak sees, and what it does not
| Sees | The user's message and recent chat history, the planner's stated reason for choosing this tool, outputs of previously executed tools, the tool's definition, and the resolved argument values |
| Does not see | Conversations that invoke no tool. This hook fires on tool invocation only — prompt-level coverage on Microsoft surfaces stays with Beak's inline scan |
| Not called at all for | Classic agents. Copilot Studio skips external threat detection unless the agent uses generative orchestration |
| Cannot do | Redaction. The protocol's answer is a boolean — a tool call can be blocked, never sanitised |
Beak evaluates all of the above against the policies you already use elsewhere in AI Security. No new validators or policy types are involved.
Before you start
You need:
-
A Power Platform Administrator to configure the connection.
-
Permission to register an application in your Microsoft Entra tenant.
-
The endpoint URL for your Beak environment, from your Beak contact. Use it exactly as given — the path is part of how the request is routed, so an abbreviated version reaches the wrong service and returns a web page instead of a decision. It looks like:
https://aisecurity.beakops.com/api/aisecurity/agentsecurity/t42-AbCdEfGhIjKlMnOpQrStUv
Note: Register in Beak first. Do the Beak side before you press Save in Power Platform admin center — the Save calls Beak's
/validateendpoint and fails if your Entra application is not yet registered, and the error Microsoft shows ("There was a problem connecting to the protection provider") does not say that is the reason.
Step 1 — Register with Beak
Give your Beak administrator two values from your Entra tenant:
| Value | Where to find it |
|---|---|
| Directory (tenant) ID | Entra ID → Overview |
| Application (client) ID | The app registration you create in Step 2 |
Beak registers this pair as the only caller allowed to use your endpoint. A token from any other tenant or application is rejected, even against the correct URL.
Your Beak administrator configures the rest in the same screen — which policy evaluates these tool calls, whether Beak enforces or only observes, what a redaction policy should do here, what happens if Beak cannot answer in time, and optionally which Power Platform environments are in scope. Each is described in Configuring Copilot Studio protection, and all of them remain changeable afterwards without affecting your endpoint URL.
Step 2 — Configure a Microsoft Entra application
Copilot Studio authenticates using Federated Identity Credentials, which are secret-less: you register an application, Copilot Studio federates into it, and no shared secret is ever created or stored. There is nothing to rotate.
Microsoft provides a script that does the whole step, and it is the recommended path because it computes the encoded values for you:
.\Create-CopilotWebhookApp.ps1 `
-TenantId "11111111-2222-3333-4444-555555555555" `
-Endpoint "https://aisecurity.beakops.com/api/aisecurity/agentsecurity/t42-AbCdEfGhIjKlMnOpQrStUv" `
-DisplayName "Beak AI Security - Production" `
-FICName "BeakProductionFIC"
Download it from the PowerShell Gallery. Note the App ID it prints — Step 3 needs it, and so does Beak (Step 1).
Doing it by hand
If you register the application manually, the federated credential's Issuer and Explicit subject identifier must match exactly. Ask your Beak administrator for both strings — Beak computes them from your tenant ID and your endpoint URL, which avoids the encoding mistakes that account for most failed setups:
- Issuer —
https://login.microsoftonline.com/{your tenant ID}/v2.0 - Type — Explicit subject identifier
- Value —
/eid1/c/pub/t/{encoded tenant ID}/a/{app segment}/{encoded endpoint URL}
The two encoded segments are base64url without padding, and the tenant ID is encoded from its .NET byte order, not the order the GUID is written in. That detail is why hand-encoding usually produces a subject that looks right and never matches.
Step 3 — Configure threat detection in Power Platform
- Sign in to the Power Platform admin center.
- Go to Security → Threat detection → Additional threat detection.
- Select the environment you want protected, then Set up.
- Tick Allow Copilot Studio to share data with a threat detection provider.
- Under Azure Entra App ID, enter the App ID from Step 2.
- Under Endpoint link, enter the Beak endpoint URL — byte-for-byte the same string you used in Step 2.
- Under Set error behavior, choose what happens when Beak does not answer in time. See below.
- Save.
Set error behavior — and tell Beak what you chose
Microsoft's default is Allow the agent to respond: if Beak does not answer within one second, the tool runs. The alternative is Block the query.
Beak cannot read this setting, so tell your Beak administrator which one you picked. Beak has a matching timeout_action that should agree with it: if it does not, a moment where Beak is slow produces one answer while your Power Platform setting expects the other.
Note: This setting decides what happens when the control is unavailable. Leaving it on Allow the agent to respond means a Beak outage silently returns your agents to unprotected operation. Choosing Block the query means a Beak outage stops your agents from using tools. Neither is wrong — but it is a decision about which failure you prefer, and it should be a deliberate one.
Configuration is per environment
There is no tenant-wide switch. Every Power Platform environment must be configured individually, and a newly created environment is not protected until someone turns this on for it. Microsoft provides no API, PowerShell cmdlet or admin-center setting to enforce it globally.
Put a step in whatever process creates environments in your organization. Otherwise coverage quietly decays as the estate grows.
Start in observe mode
Copilot Studio has no shadow mode of its own, so Beak provides one, and it is on by default: Beak evaluates every tool call in full and records what it would have blocked, while answering "allow".
Use it. The blast radius of a false positive on this hook is not a warning banner — it is an agent that refuses to complete a task the user asked for. Observe mode lets you see that against real traffic first.
The recommended sequence:
- Observe — Beak records would-be blocks. Nothing is blocked; users notice nothing. Review the Audit Log and tune the policy.
- Enforce, error behavior = Allow — Beak now blocks. A Beak outage degrades to unprotected rather than broken.
- Error behavior = Block — only once you are satisfied with both the block rate and Beak's response times.
Ask your Beak administrator to move between stages; each is a per-tenant setting, changed in the Beak panel described in Configuring Copilot Studio protection.
Decisions your administrator makes
| Setting | Default | What it means |
|---|---|---|
| Enforce | Off (observe) | Whether a computed block is actually applied |
| Redaction behavior | Block | What happens when a policy says "allow this with sensitive values removed". This protocol cannot rewrite a tool argument, so there is no way to honour that here. Blocking is the default because allowing would send the tool call with the sensitive value intact while the policy still reported as working. Can be set to allow, as a deliberate choice |
| Timeout behavior | Allow | What Beak answers if evaluation approaches its internal deadline. Should match your Set error behavior choice |
| Policy | All active in-scope policies | Which policy evaluates these tool calls |
| Environments | All | Optionally narrow to specific Power Platform environment IDs. Tool calls from other environments are allowed without evaluation, and recorded as out of scope |
What a blocked tool call looks like
The agent stops processing and tells the user their message was blocked. Beak returns a short explanation naming the kind of content that triggered it — for example "credit card", "SSN" — and never the value itself.
That is deliberate. The detail an investigator needs (what matched, where, which rule fired, which policy) is written to Beak's Audit Log inside your tenant, and never sent to Microsoft. A control that shipped the secret it just detected into a third party's telemetry would be worse than no control.
Every evaluation is recorded, whether it blocked, allowed, would have blocked in observe mode, was out of scope, or could not be answered in time — so "nothing was found" is always distinguishable from "nothing was looked at".
Data handling
Once configured, Copilot Studio shares the data listed in What Beak sees with Beak AI Security at runtime.
Confirm with your Beak contact which region processes this traffic, and satisfy yourself that it meets your organization's requirements before enabling it in a production environment. You can disconnect at any time by clearing the checkbox in Step 3, which stops the data sharing immediately.
Troubleshooting
Microsoft's errors when you press Save:
| Error | What it usually means |
|---|---|
| There was a problem connecting to the protection provider | Beak did not accept the call. Most often the Entra application is not yet registered in Beak (Step 1), or the integration is not enabled for your Beak environment |
| The application ID in your authentication token doesn't match the registered application | The App ID in Power Platform is not the one registered with Beak. Check for a copy-paste of the object ID instead of the application ID |
| AADSTS700016: Application with identifier … wasn't found | The App ID does not exist in your tenant |
| AADSTS70025: … has no configured federated identity credentials | Step 2 was not completed, or the credential was added to a different application |
| AADSTS7002111: No matching federated identity record found for presented assertion issuer | The FIC Issuer is wrong. It must be https://login.microsoftonline.com/{tenant ID}/v2.0 |
| AADSTS7002137: No matching federated identity record found for presented assertion subject | The FIC subject is wrong — usually an encoding mistake, or an endpoint URL that differs from the one entered in Power Platform by a trailing slash. Ask Beak for the exact string |
| To change a configuration, make sure you have Power Platform admin permissions | You need the Power Platform Administrator role |
Select Copy error info in Power Platform for the full detail.
The endpoint URL cannot change afterwards
Your endpoint URL is encoded into the federated credential's subject, and Entra matches it exactly. Changing it — even adding a trailing slash — breaks the credential, Copilot Studio can no longer obtain a token, and because the protocol fails open your agents go back to invoking tools unchecked with no error shown anywhere in Power Platform.
If you ever need a different URL, treat it as a coordinated change: update the federated credential and the Endpoint link together, then confirm a tool call still appears in Beak's Audit Log.
Related
- Configuring Copilot Studio protection — step-by-step setup and every configuration option
- Audit Log — every evaluation, and the detail behind each block
- Policies — what the rules that block a tool call are made of
- Threat Dashboard — live view of runtime protection