
Agent User Creation
OfficialFreeEnable AI agents as digital workers in Microsoft Entra ID.
Free · Opens the source repo
What Agent User Creation does
The Agent User Creation skill allows developers and IT professionals to create specialized user identities in Microsoft Entra ID, enabling AI agents to function as digital workers within Microsoft 365 and Azure environments. This capability is essential for scenarios where AI agents need to access user-specific APIs and services, such as Exchange mailboxes or Teams, while ensuring that security protocols are maintained. By leveraging agent users, organizations can enhance their automation capabilities and streamline workflows that involve AI-driven tasks.
To utilize this skill, users must have a Microsoft Entra tenant with Agent ID capabilities and a valid agent identity created from an agent identity blueprint. The skill requires specific permissions, such as AgentIdUser.ReadWrite.IdentityParentedBy, and the caller must possess the Agent ID Administrator role. The creation process involves verifying the agent identity, constructing the appropriate HTTP requests, and ensuring that the agent user is configured correctly with unique identifiers and properties.
The architecture of this skill follows a clear hierarchy where each agent identity can have one corresponding agent user. This relationship is crucial for managing access and permissions effectively. The skill also outlines the necessary steps to assign licenses and set usage locations, which are vital for enabling the agent user to fully utilize Microsoft services like Teams and Exchange.
This skill is particularly valuable for organizations looking to implement AI agents in their operations, providing them with the ability to interact with Microsoft services securely and efficiently. With the right prerequisites and permissions in place, users can easily create and manage agent users, enhancing their digital workforce capabilities.
When to use it
Use this skill when you need AI agents to access user-specific resources in Microsoft 365 or Azure environments.
When not to use it
This skill is not suitable for scenarios where user identity capabilities are not required or when working with regular application service principals.
What you can build with it
Integrating AI agents into Microsoft Teams
Create agent users to allow AI agents to participate in Teams chats and channels, enhancing collaboration.
Automating Email Management
Use agent users to enable AI agents to access Exchange mailboxes for automated email processing.
Dynamic User Management
Implement agent users to allow AI agents to appear in org charts and manage user identities dynamically.
How to install Agent User Creation
View source1. Install with the skills CLI
npx skills add github/awesome-copilot/entra-agent-user --agent claude-code2. Or install it manually
Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.
Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs
Inside SKILL.md
Written by githubSKILL: Creating Agent Users in Microsoft Entra Agent ID
Overview
An agent user is a specialized user identity in Microsoft Entra ID that enables AI agents to act as digital workers. It allows agents to access APIs and services that strictly require user identities (e.g., Exchange mailboxes, Teams, org charts), while maintaining appropriate security boundaries.
Agent users receive tokens with idtyp=user, unlike regular agent identities which receive idtyp=app.
Prerequisites
- A Microsoft Entra tenant with Agent ID capabilities
- An agent identity (service principal of type
ServiceIdentity) created from an agent identity blueprint - One of the following permissions:
AgentIdUser.ReadWrite.IdentityParentedBy(least privileged)AgentIdUser.ReadWrite.AllUser.ReadWrite.All
- The caller must have at minimum the Agent ID Administrator role (in delegated scenarios)
Important: The
identityParentIdmust reference a true agent identity (created via an agent identity blueprint), NOT a regular application service principal. You can verify by checking that the service principal has@odata.type: #microsoft.graph.agentIdentityandservicePrincipalType: ServiceIdentity.
Architecture
Agent Identity Blueprint (application template)
│
├── Agent Identity (service principal - ServiceIdentity)
│ │
│ └── Agent User (user - agentUser) ← 1:1 relationship
│
└── Agent Identity Blueprint Principal (service principal in tenant)
| Component | Type | Token Claim | Purpose |
|---|---|---|---|
| Agent Identity | Service Principal | idtyp=app | Backend/API operations |
| Agent User | User (agentUser) | idtyp=user | Act as a digital worker in M365 |
Step 1: Verify the Agent Identity Exists
Before creating an agent user, confirm the agent identity is a proper agentIdentity type:
GET https://graph.microsoft.com/beta/servicePrincipals/{agent-identity-id}
Authorization: Bearer <token>
Verify the response contains:
{
"@odata.type": "#microsoft.graph.agentIdentity",
"servicePrincipalType": "ServiceIdentity",
"agentIdentityBlueprintId": "<blueprint-id>"
}
PowerShell
Connect-MgGraph -Scopes "Application.Read.All" -TenantId "<tenant>" -UseDeviceCode -NoWelcome
Invoke-MgGraphRequest -Method GET `
-Uri "https://graph.microsoft.com/beta/servicePrincipals/<agent-identity-id>" | ConvertTo-Json -Depth 3
Common mistake: Using an app registration's
appIdor a regular application service principal'sidwill fail. Only agent identities created from blueprints work.
Step 2: Create the Agent User
HTTP Request
POST https://graph.microsoft.com/beta/users/microsoft.graph.agentUser
Content-Type: application/json
Authorization: Bearer <token>
{
"accountEnabled": true,
"displayName": "My Agent User",
"mailNickname": "my-agent-user",
"userPrincipalName": "my-agent-user@yourtenant.onmicrosoft.com",
"identityParentId": "<agent-identity-object-id>"
}
Required Properties
| Property | Type | Description |
|---|---|---|
accountEnabled | Boolean | true to enable the account |
displayName | String | Human-friendly name |
mailNickname | String | Mail alias (no spaces/special chars) |
userPrincipalName | String | UPN — must be unique in the tenant (alias@verified-domain) |
identityParentId | String | Object ID of the parent agent identity |
PowerShell
Connect-MgGraph -Scopes "User.ReadWrite.All" -TenantId "<tenant>" -UseDeviceCode -NoWelcome
$body = @{
accountEnabled = $true
displayName = "My Agent User"
mailNickname = "my-agent-user"
userPrincipalName = "my-agent-user@yourtenant.onmicrosoft.com"
identityParentId = "<agent-identity-object-id>"
} | ConvertTo-Json
Invoke-MgGraphRequest -Method POST `
-Uri "https://graph.microsoft.com/beta/users/microsoft.graph.agentUser" `
-Body $body -ContentType "application/json" | ConvertTo-Json -Depth 3
Key Notes
- No password — agent users cannot have passwords. They authenticate via their parent agent identity's credentials.
- 1:1 relationship — each agent identity can have at most one agent user. Attempting to create a second returns
400 Bad Request. - The
userPrincipalNamemust be unique. Don't reuse an existing user's UPN.
Step 3: Assign a Manager (Optional)
Assigning a manager allows the agent user to appear in org charts (e.g., Teams).
PUT https://graph.microsoft.com/beta/users/{agent-user-id}/manager/$ref
Content-Type: application/json
Authorization: Bearer <token>
{
"@odata.id": "https://graph.microsoft.com/beta/users/{manager-user-id}"
}
PowerShell
$managerBody = '{"@odata.id":"https://graph.microsoft.com/beta/users/<manager-user-id>"}'
Invoke-MgGraphRequest -Method PUT `
-Uri "https://graph.microsoft.com/beta/users/<agent-user-id>/manager/`$ref" `
-Body $managerBody -ContentType "application/json"
Step 4: Set Usage Location and Assign Licenses (Optional)
A license is needed for the agent user to have a mailbox, Teams presence, etc. Usage location must be set first.
Set Usage Location
PATCH https://graph.microsoft.com/beta/users/{agent-user-id}
Content-Type: application/json
Authorization: Bearer <token>
{
"usageLocation": "US"
}
List Available Licenses
GET https://graph.microsoft.com/beta/subscribedSkus?$select=skuPartNumber,skuId,consumedUnits,prepaidUnits
Authorization: Bearer <token>
Requires Organization.Read.All permission.
Assign a License
POST https://graph.microsoft.com/beta/users/{agent-user-id}/assignLicense
Content-Type: application/json
Authorization: Bearer <token>
{
"addLicenses": [
{ "skuId": "<sku-id>" }
],
"removeLicenses": []
}
PowerShell (all in one)
Connect-MgGraph -Scopes "User.ReadWrite.All","Organization.Read.All" -TenantId "<tenant>" -NoWelcome
# Set usage location
Invoke-MgGraphRequest -Method PATCH `
-Uri "https://graph.microsoft.com/beta/users/<agent-user-id>" `
-Body '{"usageLocation":"US"}' -ContentType "application/json"
# Assign license
$licenseBody = '{"addLicenses":[{"skuId":"<sku-id>"}],"removeLicenses":[]}'
Invoke-MgGraphRequest -Method POST `
-Uri "https://graph.microsoft.com/beta/users/<agent-user-id>/assignLicense" `
-Body $licenseBody -ContentType "application/json"
Tip: You can also assign licenses via the Entra admin center under Identity → Users → All users → select the agent user → Licenses and apps.
Provisioning Times
| Service | Estimated Time |
|---|---|
| Exchange mailbox | 5–30 minutes |
| Teams availability | 15 min – 24 hours |
| Org chart / People search | Up to 24–48 hours |
| SharePoint / OneDrive | 5–30 minutes |
| Global Address List | Up to 24 hours |
Agent User Capabilities
- ✅ Added to Microsoft Entra groups (including dynamic groups)
- ✅ Access user-only APIs (
idtyp=usertokens) - ✅ Own a mailbox, calendar, and contacts
- ✅ Participate in Teams chats and channels
- ✅ Appear in org charts and People search
- ✅ Added to administrative units
- ✅ Assigned licenses
Agent User Security Constraints
- ❌ Cannot have passwords, passkeys, or interactive sign-in
- ❌ Cannot be assigned privileged admin roles
- ❌ Cannot be added to role-assignable groups
- ❌ Permissions similar to guest users by default
- ❌ Custom role assignment not available
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
Agent user IdentityParent does not exist | identityParentId points to a non-existent or non-agent-identity object | Verify the ID is an agentIdentity service principal, not a regular app |
400 Bad Request (identityParentId already linked) | The agent identity already has an agent user | Each agent identity supports only one agent user |
409 Conflict on UPN | The userPrincipalName is already taken | Use a unique UPN |
| License assignment fails | Usage location not set | Set usageLocation before assigning licenses |
References
Frequently asked questions about Agent User Creation
Similar skills
Skill Creator
Efficiently create and manage skills for Gemini CLI.
Agent Development
Create and manage autonomous agents for Claude Code.
Math Olympiad Solver
Solve and verify competition math problems effectively.
Microsoft Skill Creator
Create specialized skills for Microsoft technologies.
Doublecheck
A verification pipeline for AI-generated claims.
Skill Development for Claude Code
Create and enhance skills for Claude Code plugins.
