Azure AI Foundry
Arrakis discovers every Azure AI Foundry resource, project, model deployment, and agent under a customer subscription using a single Entra ID service principal. Two token audiences are required: an ARM control-plane token (https://management.azure.com/.default) for resource enumeration, and a Foundry data-plane token (https://ai.azure.com/.default) for reading agents and tool configuration. The Agents data-plane API does not accept API keys — Entra ID is the only supported auth.
When to use this
Use this page if your organization runs agents on Azure AI Foundry (formerly Azure AI Studio) and you want Arrakis to govern them across the four pillars — configuration, runtime, reasoning, and preventive. The same setup works whether you have a single Foundry resource or many across a subscription; one service principal authenticates against the whole subscription and reaches every project.
Coverage
| Pillar | Support |
|---|---|
| Configuration | Full — Azure AI admin; Foundry control-plane discovery |
| Runtime | Full — Azure Monitor + Event Grid |
| Reasoning | Full — Azure Monitor (prompt and response) |
| Preventive | Full — Azure AI Content Safety; webhook auto-remediation |
For the cross-platform context, see the Connectors overview — Foundry sits in the Autonomous Agents category.
3-step Quickstart
- Register an Entra ID app and create a client secret. Note the
tenantId,clientId, and the secret value. - Assign Reader at subscription (or management-group) scope, and Foundry User at the same subscription scope so it inherits to every existing and future Foundry project (recommended). Per-resource or per-project assignment is also supported when you want tighter segmentation.
- In Arrakis, go to Settings → Integrations → Add integration → Azure AI Foundry, paste the four fields (
tenantId,clientId,clientSecret,subscriptionId), test, and save.
Where tenant-specific values come from
Sign in to the Arrakis platform → Settings → Integrations → Azure AI Foundry. The connector form, test endpoint, and sync controls live there. The four fields you paste —
tenantId,clientId,clientSecret,subscriptionId— come from your Azure tenant.
Reference: full configuration walkthrough
Permission model
A single service principal carries both control-plane and data-plane access:
| Role | Scope | Why |
|---|---|---|
| Reader | Subscription (or a management group containing the subscription) | Enumerates every Microsoft.CognitiveServices Foundry account, expands each into its projects, and lists model deployments via ARM. Without subscription-scoped Reader, multi-instance discovery cannot find resources. |
| Foundry User | Subscription scope is the recommended default — covers every Foundry project under it, including new ones, with no per-project onboarding. Resource or per-project scope works too when tighter segmentation is required. | Grants reader access to each Foundry project plus the data actions needed to list and read agents/assistants, their instructions, tools, and tool_resources. The Agents data-plane API does not support API keys — this role must go to the same Entra ID service principal. |
Which data-plane role to assign — and which not to
Microsoft’s Foundry RBAC roles were renamed in early 2026: Foundry User is the current name for what was previously called Azure AI User. The role ID and permissions did not change. To make role assignments stable across the rename, prefer assigning by role ID 53ca6127-db72-4b80-b1b0-d745d6d5456d rather than by name.
Do not use Cognitive Services User for this connector. Microsoft’s Foundry RBAC documentation explicitly states that Cognitive Services-prefixed roles “are designed for accessing AI Services resources directly and don’t apply to Foundry scenarios.” Cognitive Services User does not grant the Microsoft.CognitiveServices/accounts/AIServices/agents/* data actions that the Foundry data plane requires for /api/projects/<project>/assistants. Cognitive Services Contributor and Azure AI Developer are similarly out of scope — Azure AI Developer applies to AML workspaces and legacy Foundry hubs, not to Foundry projects.
If a tenant is partway through the rename (the Azure Portal can lag the documentation by a release), Azure AI User will still resolve to the same role ID; both names are accepted while the rename rolls out. The az CLI examples below assign by role ID for that reason.
Why subscription-wide read-only
Foundry resources are not always inventoried up front, and new projects are often spun up by application teams. Subscription-scoped Reader lets Arrakis pick up new resources automatically, with no per-resource onboarding step. Reader is read-only on the control plane and grants no data-plane access on its own — agent and tool reads still require Foundry User on each project. Write access is never granted.
Least-privilege caveats
- Reader at subscription scope grants enumeration of every resource type in that subscription, not only AI resources. If the subscription contains workloads outside Foundry, scope Reader to a management group that contains only the AI subscription, or split AI workloads into their own subscription.
- Reader does not grant access to keys or secrets (no
listKeysaction). Data-plane reads remain gated by Foundry User on each project. - Foundry User inherits down the Azure resource hierarchy: assigned at subscription scope it covers every Foundry resource and project (existing and future) under that subscription — the simplest, future-proof setup. Assign at Foundry resource scope to cover all projects under one account, or at individual project scope for tighter segmentation. All three scopes work; pick whichever matches your governance posture.
Prerequisites
- An Azure subscription with at least one Foundry resource (kind
AIServicesorAIFoundry). - Permission to create app registrations in Microsoft Entra ID and assign Azure RBAC roles, or coordination with an admin who can.
- Your
tenantIdandsubscriptionIdto hand.
Azure Portal walkthrough
The Portal click-path. UI labels match the Azure Portal at the time of writing.
1. Register an Entra ID app
- Microsoft Entra ID → App registrations → New registration.
- Name:
arrakis-foundry-reader. Supported account types: single tenant. Redirect URI: leave blank. - Register. On the resulting overview page, copy Application (client) ID → this is your
clientId. Copy Directory (tenant) ID → this is yourtenantId.
Screenshot: App registrations → Overview, with Application (client) ID and Directory (tenant) ID fields highlighted.
2. Create a client secret
- On the same app, Certificates & secrets → Client secrets → New client secret.
- Description:
arrakis-connector. Expires: per your rotation policy (recommend 6 or 12 months). - Add. Copy the Value column immediately — this is your
clientSecret. It is shown once.
Screenshot: Certificates & secrets → Client secrets, with the Value column highlighted and the warning that it cannot be retrieved later.
3. Grant Reader at subscription scope
- Subscriptions →
<your subscription>→ Access control (IAM) → Add → Add role assignment. - Role: Reader. Next.
- Members: select User, group, or service principal, click Select members, search for
arrakis-foundry-reader, select, click Select. Next. - Review + assign.
Screenshot: Subscription IAM → Add role assignment → Role tab with Reader selected.
For tighter scoping, repeat against a Management group (Management groups → <group> → Access control (IAM)) instead of an individual subscription. The same service principal works at either scope.
4. Grant Foundry User at subscription scope (recommended)
Foundry User inherits down the Azure resource hierarchy, so a single assignment at the subscription scope covers every Foundry resource and project under that subscription — including any new ones spun up later. This is the simplest, most future-proof option.
- Subscriptions →
<your subscription>→ Access control (IAM) → Add → Add role assignment. - Role: Foundry User. (If your tenant still shows the previous name, Azure AI User resolves to the same role ID and is equivalent.)
- Members: same
arrakis-foundry-readerservice principal. - Review + assign.
Screenshot: Subscription IAM → Add role assignment → Foundry User selected.
Do not pick a Cognitive Services-prefixed role here. Cognitive Services User does not grant the data actions Arrakis needs to read agents on the Foundry data plane.
When to scope tighter instead
Assign Foundry User at one of the narrower scopes if your governance posture requires it:
- Foundry resource (account) scope — Foundry resource page → Access control (IAM) → Add role assignment. Covers all projects under that account.
- Individual project scope — Foundry project page → Access control (IAM) → Add role assignment. Per-project segmentation; you’ll repeat for every project.
az CLI alternative
The same flow as a script. Substitute <sub-id> and the per-project resource IDs.
# 1. Sign in
az login
# 2. Create the app + service principal + client secret in one shot
SP_JSON=$(az ad sp create-for-rbac \
--name arrakis-foundry-reader \
--role Reader \
--scopes /subscriptions/<sub-id>)
APP_ID=$(echo "$SP_JSON" | jq -r .appId)
TENANT=$(echo "$SP_JSON" | jq -r .tenant)
PASSWORD=$(echo "$SP_JSON" | jq -r .password)
echo "tenantId: $TENANT"
echo "clientId: $APP_ID"
echo "clientSecret: $PASSWORD"
echo "subscriptionId: <sub-id>"
# 3. Assign Foundry User at subscription scope (recommended). Use the role ID
# (53ca6127-db72-4b80-b1b0-d745d6d5456d) so the assignment is stable across
# the Azure AI User → Foundry User rename. Subscription-scoped Foundry User
# inherits to every Foundry resource and project, including future ones.
FOUNDRY_USER_ROLE_ID="53ca6127-db72-4b80-b1b0-d745d6d5456d"
az role assignment create \
--assignee "$APP_ID" \
--role "$FOUNDRY_USER_ROLE_ID" \
--scope "/subscriptions/<sub-id>"
# Optional sanity check — list the Foundry resources the principal can now reach:
az cognitiveservices account list \
--query "[?kind=='AIServices' || kind=='AIFoundry'].{name:name, rg:resourceGroup, id:id}" \
-o tableIf your governance posture requires a tighter scope, swap the --scope argument for a Foundry account resource ID (covers all projects under that account) or a project resource ID (single project):
# Foundry resource (account) scope
ACCOUNT_ID="/subscriptions/<sub-id>/resourceGroups/<rg>/providers/Microsoft.CognitiveServices/accounts/<account>"
az role assignment create --assignee "$APP_ID" --role "$FOUNDRY_USER_ROLE_ID" --scope "$ACCOUNT_ID"
# Per-project scope
PROJECT_ID="$ACCOUNT_ID/projects/<project>"
az role assignment create --assignee "$APP_ID" --role "$FOUNDRY_USER_ROLE_ID" --scope "$PROJECT_ID"Configure the connector in Arrakis
- Sign in to Arrakis. Settings → Integrations → Add integration → Azure AI Foundry.
- Paste the four fields:
| Field | Value | Notes |
|---|---|---|
| Tenant ID | tenantId from step 1 | Plain text |
| Client ID | clientId from step 1 | Plain text |
| Client Secret | secret value from step 2 | Encrypted at rest; only this field is encrypted (matches the Salesforce pattern). |
| Subscription ID | the subscription where Reader was assigned | Plain text |
- Test connection. The test endpoint posts an OAuth2
client_credentialsgrant againsthttps://login.microsoftonline.com/<tenantId>/oauth2/v2.0/tokenwith scopehttps://management.azure.com/.defaultand confirms a token is returned. - Save. Arrakis schedules the first sync.
Verify the connection
After the first sync completes:
- The Agents view lists every Foundry agent across every project under the subscription, grouped by Foundry resource.
- Each agent shows its build type (
prompt_agentfor declarative agents,hosted_agentfor hosted/code agents), model backbone (from the project’s model deployments), and tools (oneStepper tool — see the Appendix for the full list). - Resource and project counts should match
az cognitiveservices account listoutput for the subscription.
If the first sync returns no agents, walk through Troubleshooting.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
AADSTS7000215 / invalid_client on test | Wrong client secret, expired secret, or service principal disabled | Generate a fresh client secret in Certificates & secrets, paste again. Confirm the app registration is enabled. |
AADSTS90002 / tenant not found | Wrong tenantId (used the subscription tenant of a different directory) | Re-copy Directory (tenant) ID from the app registration overview. |
403 AuthorizationFailed listing accounts | Reader missing at subscription (or management-group) scope | Re-run the role assignment in step 3, wait ~1 minute for propagation, retry. |
403 listing assistants on a project | Foundry User missing on that project (or its parent resource) — or, less commonly, a Cognitive Services-prefixed role assigned by mistake (those do not grant Foundry data-plane access) | Assign Foundry User (role ID 53ca6127-db72-4b80-b1b0-d745d6d5456d) at project or resource scope. Remove any Cognitive Services User/Contributor assignment from this principal. |
404 on the projects sub-resource | Older Foundry account that does not expose the projects sub-resource | Expected. Arrakis falls back to a synthetic single project keyed off the resource name; no action required. |
| Empty agents list for a project | Project genuinely has no agents, or data-plane endpoint is unreachable | Open Foundry Studio for the project to confirm agents exist. If they do, confirm the project endpoint resolves: https://<resourceName>.services.ai.azure.com/api/projects/<projectName>. |
| Some Foundry accounts skipped | The connector filters to kind=AIServices or kind=AIFoundry. Other Cognitive Services kinds are ignored by design. | No action — non-Foundry Cognitive Services accounts are out of scope. |
Security considerations
- Client secret rotation. Rotate on the cadence required by your policy (recommend 6 or 12 months). After issuing a new secret, paste it into Arrakis (Settings → Integrations → Edit Azure AI Foundry); the existing connection record is updated and the encrypted blob re-saved.
- Encrypted at rest. Only
clientSecretis encrypted;tenantId,clientId, andsubscriptionIdare stored in plain text. This matches the Salesforce connector pattern. - Least privilege. Reader is the lowest built-in subscription-scoped read role and grants no access to keys, secrets, or data-plane reads. Data reads remain gated by Foundry User per project. Foundry User itself is documented by Microsoft as the “least privilege access role in Foundry” — it grants reader plus the data actions for the project’s agents and nothing more.
- No write paths. Neither role grants write access. Arrakis cannot create, modify, or delete Foundry resources, projects, agents, or deployments — by design.
- Network egress. Outbound only, to
login.microsoftonline.com,management.azure.com, and<resourceName>.services.ai.azure.comfor each Foundry resource.
Appendix
Required roles
| Role | Role ID | Scope | Plane |
|---|---|---|---|
| Reader | acdd72a7-3385-48ef-bd42-f606fba81ae7 | Subscription or management group | ARM control plane |
| Foundry User (formerly Azure AI User) | 53ca6127-db72-4b80-b1b0-d745d6d5456d | Subscription (recommended), Foundry resource, or project | Foundry data plane |
Do not substitute Cognitive Services User, Cognitive Services Contributor, or Azure AI Developer for Foundry User. Microsoft’s Foundry RBAC documentation calls out that Cognitive Services-prefixed roles do not apply to Foundry projects, and Azure AI Developer is scoped to AML workspaces and legacy Foundry hubs (not projects).
OAuth2 token audiences
| Audience | Used for |
|---|---|
https://management.azure.com/.default | List Foundry accounts, projects, model deployments. |
https://ai.azure.com/.default | List agents/assistants on a project’s data-plane endpoint. |
API versions
| Surface | API version |
|---|---|
| Cognitive Services accounts | 2024-10-01 |
| Foundry projects | 2025-04-01-preview |
| Model deployments | 2024-10-01 |
| Agents (data plane) | 2025-05-01 |
Supported tools
Each tool a Foundry agent has configured becomes a Step on that agent in Arrakis:
code_interpreter, file_search, web_search, azure_ai_search, azure_functions, function, mcp, openapi, image_generation, browser_automation, computer_use, sharepoint, fabric.
Build-type detection
| Detected as | Trigger |
|---|---|
prompt_agent | Default — declarative agent (instructions + model + tools, no hosted code). |
hosted_agent | Agent metadata type is hosted or code, or metadata references container, code, container_app, or deployment. |
Endpoint reference
| Operation | URL |
|---|---|
| Token | POST https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token |
| List accounts | GET https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.CognitiveServices/accounts?api-version=2024-10-01 |
| List projects | GET .../accounts/{name}/projects?api-version=2025-04-01-preview |
| List deployments | GET .../accounts/{name}/deployments?api-version=2024-10-01 |
| List agents | GET https://{resourceName}.services.ai.azure.com/api/projects/{projectName}/assistants?api-version=2025-05-01 |
Limitations
- The Foundry agent API does not expose creator info —
contributorsis empty for every agent. - Arrakis does not consume an execution-trace API for Foundry; runtime traces are sourced from Azure Monitor + Event Grid where customers have those configured.
- Per-resource, per-project, and per-agent errors are isolated during sync — one failed project does not abort the rest.
Cross-references
- Connectors overview — coverage matrix and where Foundry sits among the other Autonomous Agents.
- Azure docs: Azure AI Foundry RBAC — authoritative source for the Foundry User role and the explicit warning against Cognitive Services-prefixed roles.
- Azure docs: Reader built-in role .
- Azure docs: Application and service principal objects in Microsoft Entra ID .