Microsoft Graph Tools
Written By Christopher Scaminaci
Last updated 7 days ago
Microsoft Graph Tools
graph_ · 530 tools · Free 284 · Pro 246
Microsoft Graph v1.0 - the Microsoft 365 identity, device and collaboration surface: users, groups, devices, applications, directory roles, conditional access, audit logs, mail, calendars, files, Teams, security alerts and Intune. The sign-in model matches the Microsoft Azure connector, including the optional entraTenant parameter for a customer directory you administer, but this is a separate connection with its own consent. Paging follows Graph's own next link as sent. Authorization is per-scope delegated permission rather than one blanket scope, so most directory, Intune and security tools need a Global Administrator to grant tenant-wide consent once; ordinary members then connect without prompts. The consent step offers three permission tiers - full, standard and read - so an organization can connect with less than the whole scope set. The beta endpoint is reachable only through the raw request tools.
All connector tools · Microsoft Graph setup guide
Microsoft Graph tool groups
- Users — 25 tools
- Groups — 19 tools
- Delegated Admin (GDAP) — 21 tools
- Licensing — 8 tools
- Organization & Domains — 20 tools
- Applications & Service Principals — 37 tools
- Directory Roles & PIM — 30 tools
- Authentication Methods — 26 tools
- Conditional Access — 19 tools
- Administrative Units — 12 tools
- Devices — 13 tools
- Intune Devices — 33 tools
- Intune Configuration — 24 tools
- Identity Protection — 7 tools
- Audit Logs — 5 tools
- Directory Objects — 7 tools
- Security — 13 tools
- Usage Reports — 21 tools
- Mail — 33 tools
- Files — 21 tools
- Calendar — 21 tools
- Contacts — 9 tools
- SharePoint — 23 tools
- Teams — 31 tools
- Chats & Presence — 12 tools
- Intune Applications — 23 tools
- Partner Center (CSP) — 15 tools
- Raw Requests — 2 tools
Users
graph_assign_user_license details
graph_assign_user_license details
[Microsoft Graph] Assign one or more Microsoft 365 licences to a user. Additive, so not marked destructive — though it does consume a seat and therefore costs money, and the available count is worth reading first. Two failures are common and neither says what it means: the user must have a usage location set or the assignment is rejected, and a licence with no free seats fails rather than queueing. Use the subscribed SKU listing to find the SKU id and check remaining seats before calling this. Optionally disable individual service plans within a licence to hand out a subset of what it contains.
graph_create_user details
graph_create_user details
[Microsoft Graph] Create a new user account. Requires a display name, a user principal name (their sign-in address, which must use a domain already verified in the directory), a mail nickname and an initial password. Additive and reversible — a mistake here is deleted, and the account is recoverable for 30 days after that — which is why it is not marked destructive. Two things worth getting right at creation rather than afterwards: set the usage location, because licences cannot be assigned without one and the failure message does not say so; and leave forceChangePasswordNextSignIn on unless there is a specific reason not to, so the initial password you set does not become the one they keep. Creating the account does not licence it or add it to any group — those are separate steps.
graph_delete_user details
graph_delete_user details
[Microsoft Graph] Delete a user account. The account goes to the directory's recycle bin and is fully restorable for 30 days — object id, group memberships, licences and all — after which it is removed permanently. Marked destructive because it removes the person's access to everything at once and because the recovery window, while generous, does expire. For an offboarding, disabling the account and revoking its sessions is the safer sequence: it has the same immediate effect, keeps the mailbox reachable for whoever inherits the work, and can be undone the moment somebody realizes the wrong Alice was picked.
graph_get_signed_in_user details
graph_get_signed_in_user details
[Microsoft Graph] Get the profile of the person whose Microsoft sign-in this connection was made with — the account StackJack is acting as. Useful mainly for orientation and for diagnosing a permissions surprise: when a tool is refused and it is not obvious why, this answers "who does Microsoft think is asking", which is the first thing to establish before looking at roles. In a customer's directory it also confirms that delegated access resolved to the expected identity rather than falling back to your own tenant.
graph_get_user details
graph_get_user details
[Microsoft Graph] Get one user account in full, by object id or user principal name (their sign-in address). This is the detail view behind a name found in the listing: department, office, phone numbers, employee id, usage location, when the account was created, and whether sign-in is currently allowed. Reach for it before any change to a person — confirming you have the right Alice Smith costs one call and is the difference between resetting a password and locking out a stranger. If the answer is that no such object exists, the identifier is usually a display name rather than a sign-in address; list users with a search instead.
graph_get_user_manager details
graph_get_user_manager details
[Microsoft Graph] Get the person recorded as a user's manager. Worth knowing that this is a real directory relationship rather than a text field, so it is what approval workflows, dynamic group rules and access reviews actually read — and it is also what an offboarding process needs, because a departing manager leaves their reports pointing at a disabled account. A 404 here means no manager is set, which is a legitimate answer for executives and service accounts rather than an error.
graph_list_deleted_users details
graph_list_deleted_users details
[Microsoft Graph] List user accounts that have been deleted but are still recoverable. Entra ID keeps a deleted user for 30 days before removing them for good, and during that window the account can be restored complete with its object id, group memberships and licences — which is what makes an accidental deletion a five-minute problem rather than a rebuild. Each entry carries the date it was deleted, so the remaining window is easy to work out. After 30 days the account is gone and only a fresh one with a new identity can be created.
graph_list_inactive_users details
graph_list_inactive_users details
[Microsoft Graph] List users together with their last sign-in and last non-interactive sign-in times — the licence-reclamation and offboarding-audit read. Sort by the sign-in date or filter on it to find accounts nobody has used in months, which are simultaneously a cost (each may hold a paid licence) and a risk (an unused enabled account is an unwatched way in). Two cautions worth stating: this data needs Entra ID P1 or P2 in the directory being queried and comes back empty rather than erroring without it, and an account showing no sign-in at all is more often a service or shared mailbox account than a dormant human — check what it is before recommending anyone disable it.
graph_list_user_app_role_assignments details
graph_list_user_app_role_assignments details
[Microsoft Graph] List the enterprise applications a user has been assigned to, and the role they hold in each. This answers "which apps does this person have" from the directory's side rather than by asking each application, and it is what an access review or a licence-cost conversation needs. During offboarding it is also the list of third-party systems that will keep working after the Microsoft account is disabled unless each is dealt with separately.
graph_list_user_devices details
graph_list_user_devices details
[Microsoft Graph] List the devices registered to a user in the directory — the machines and phones their identity is attached to. Useful for confirming what a person actually works on before troubleshooting a sign-in problem, and for spotting the residue of old hardware that was replaced but never removed. Note this is the DIRECTORY's view of a device, which is not the same as Intune's management record: a device can be registered here and not enrolled in Intune, and the Intune device tools are where compliance, configuration and remote actions live.
graph_list_user_direct_reports details
graph_list_user_direct_reports details
[Microsoft Graph] List the people who report to a user. The other half of the manager relationship, and the one that matters during an offboarding: before disabling a manager's account, this is what tells you whose manager field is about to point at a dead object, which quietly breaks approval flows and any dynamic group built on the org chart. It returns direct reports only, not the whole tree beneath someone.
graph_list_user_groups details
graph_list_user_groups details
[Microsoft Graph] List the groups, directory roles and administrative units a user belongs to DIRECTLY. This is the fast answer to "what does this person have access to", and it is the one to start with — but read the transitive version too before concluding anything about access, because most real permission comes through nested groups that do not appear here. Direct membership is what you edit; transitive membership is what actually applies.
graph_list_user_licenses details
graph_list_user_licenses details
[Microsoft Graph] List the Microsoft 365 licences assigned to one user, with the individual service plans inside each and whether each is enabled or switched off. Two jobs this does that nothing else does as directly: it explains a missing feature (someone has the licence but the specific service plan within it is disabled), and it shows whether a licence came from a direct assignment or was inherited from a group, which decides where you would have to go to remove it. A licence inherited from a group cannot be taken off the user — you change the group membership instead.
graph_list_user_owned_objects details
graph_list_user_owned_objects details
[Microsoft Graph] List the directory objects a user owns — groups, application registrations and service principals. This is the offboarding read people forget, and the one that causes trouble months later: an application registration whose only owner has left is one nobody can manage, and its client secret will eventually expire and break whatever depends on it with no obvious owner to call. Run it before disabling anyone and reassign what comes back.
graph_list_user_transitive_groups details
graph_list_user_transitive_groups details
[Microsoft Graph] List every group a user belongs to INCLUDING the ones reached through nested groups — their effective membership. This is the honest answer to "why can this person open that", and it routinely returns several times what the direct listing does, because access is normally granted to a broad group that contains the narrow one somebody was actually added to. Use it for access reviews and for investigating an access surprise; use the direct listing when you are about to change a membership, since a nested one cannot be removed from the user's side.
graph_list_users details
graph_list_users details
[Microsoft Graph] List the user accounts in an Entra ID (Azure AD) directory — the starting point for almost any question about who works somewhere. Returns each user's id, display name, user principal name, mail address, job title and whether the account is enabled. Use the filter argument to narrow it rather than reading the whole directory: "accountEnabled eq false" finds disabled accounts left behind by a departure process, "userType eq 'Guest'" finds external collaborators, and "startsWith(department,'Finance')" scopes to a team. Prefer the search argument for a name someone half-remembers, because it matches across several fields at once where a filter has to name one. Note the object id and the user principal name are both accepted everywhere a user is asked for, but a display name is neither — resolve a person here first, then pass their id on.
graph_permanently_delete_user details
graph_permanently_delete_user details
[Microsoft Graph] Permanently remove a deleted user from the directory's recycle bin, ending the 30-day recovery window immediately. There is NO undo of any kind: the object id is gone, and an account recreated with the same name is a different object that inherits none of the original's group memberships, licences or permissions. This exists for the cases where a record genuinely must not remain — a data-deletion request, or an account created in error that should never have existed — and it should not be used to tidy up. Ordinary deletion already removes the person's access; letting the window expire on its own costs nothing and keeps the recovery option open.
graph_remove_user_license details
graph_remove_user_license details
[Microsoft Graph] Remove one or more Microsoft 365 licences from a user. Marked destructive because removing a licence can DELETE DATA: taking Exchange Online off an account starts a 30-day clock after which the mailbox and its contents are gone, and the same pattern applies to OneDrive. If the goal is to stop someone using an account rather than to reclaim a seat, disable the account instead and remove the licence only once the mailbox has been dealt with. A licence inherited from a group cannot be removed here at all — that one is changed by editing the group membership, and attempting it on the user fails.
graph_remove_user_manager details
graph_remove_user_manager details
[Microsoft Graph] Clear the manager relationship on a user, leaving them with none. Marked destructive because the relationship is what approval workflows and dynamic group rules read, so removing it can silently stop an approval chain or drop the person out of a group they were in by virtue of their reporting line — neither of which announces itself. Reversible by setting a manager again, provided you know who it was; read the current one before clearing it.
graph_reset_user_password details
graph_reset_user_password details
[Microsoft Graph] Set a new password on a user account. The password you supply takes effect immediately and the old one stops working, so this locks the person out until they are given the new one — which is why it is marked destructive despite being a routine helpdesk action. Leave forceChangePasswordNextSignIn on so the temporary password you communicate does not become their permanent one. Two limits are Microsoft's rather than StackJack's and are worth expecting: an administrator can only reset the password of a user whose own role is no higher than theirs, so a Helpdesk Administrator is correctly refused on a Global Administrator; and resetting a password does not sign the user out of existing sessions, so during an account compromise revoke their sign-in sessions as well.
graph_restore_deleted_user details
graph_restore_deleted_user details
[Microsoft Graph] Restore a user account from the directory's recycle bin, within the 30-day window. The account comes back with its original object id, which is what makes the restore genuinely complete rather than a lookalike — group memberships, licences and every permission granted to that id are intact, where a freshly created account with the same name would have none of them. Not marked destructive: it undoes a deletion. Use the deleted-user listing to find the object id, since the account no longer answers to its sign-in address.
graph_revoke_user_sign_in_sessions details
graph_revoke_user_sign_in_sessions details
[Microsoft Graph] Invalidate every refresh token and session cookie a user holds, forcing them to sign in again everywhere — browsers, Outlook, Teams, phones. This is the containment action for a compromised account, and the piece that disabling alone does not do: a disabled account's existing sessions keep working until their tokens expire, which can be hours. Marked destructive because it interrupts the person's work on every device at once. Use it together with a password reset during an incident; on its own it only buys time, since whoever has the password can sign back in.
graph_set_user_account_enabled details
graph_set_user_account_enabled details
[Microsoft Graph] Enable or disable a user's account — the standard first step of an offboarding, and the standard containment step for a compromised one. Disabling blocks new sign-ins immediately but does NOT end sessions that are already running; revoking the sign-in sessions is the companion call and both are needed to actually get someone out. Marked destructive because it locks a human out of their work, and because the same call re-enabling an account is how a mistaken disable during an incident quietly restores an attacker's access. It is reversible, unlike deletion, which is why disabling is the right thing to do first while a departure is confirmed.
graph_set_user_manager details
graph_set_user_manager details
[Microsoft Graph] Set or replace the person recorded as a user's manager. Additive and immediately reversible by setting a different one, so it is not marked destructive — but it is worth knowing that this relationship is load-bearing rather than decorative: approval workflows, access reviews and dynamic group rules read it, so setting it wrong quietly routes approvals to the wrong person. Assigning a new manager replaces any existing one; there is only ever one.
graph_update_user details
graph_update_user details
[Microsoft Graph] Update a user's profile details — display name, job title, department, office, phone numbers, usage location. This is a merge: properties you do not name are left exactly as they were, so it is safe to change one field without restating the rest. Not marked destructive because every field it touches is a label that can be set back. Changing the sign-in address is deliberately NOT part of this tool: renaming a user principal name affects sign-in, licensing and any system that keys on the address, and it belongs in a deliberate process rather than a general update.
Groups
graph_add_group_member details
graph_add_group_member details
[Microsoft Graph] Add a user, device, service principal or another group to a group. Additive and undone by the matching removal, so not marked destructive — but be aware of what it grants: whatever the group was assigned, including anything reached by nesting the group inside a broader one, applies to the new member immediately. Check the group's own memberships and application assignments first if the grant is not obvious. Adding to a DYNAMIC group is refused by Microsoft rather than ignored: its membership comes from a rule, and the rule is the only way in.
graph_add_group_owner details
graph_add_group_owner details
[Microsoft Graph] Add an owner to a group. Owners manage the group's membership and settings without needing a directory-wide administrator role, which makes this the least-privilege way to hand a team control of its own group. Additive and reversible, so not destructive — though note an owner can add themselves and anyone else to the group, so the grant is broader than it first appears when the group carries real access.
graph_create_group details
graph_create_group details
[Microsoft Graph] Create a security group or a Microsoft 365 group. Additive and deletable, so not marked destructive — but choose the kind deliberately, because it cannot be changed afterwards: a security group grants access and nothing more, while a Microsoft 365 group also provisions a mailbox, a SharePoint site and a Teams team, which is either exactly what was wanted or a surprising amount of infrastructure for a permissions container. Mail-enabled security groups cannot be created through this API at all. The creator is not automatically an owner, so set owners as a separate step, and note a new Microsoft 365 group's SharePoint site takes a few minutes to finish provisioning.
graph_delete_group details
graph_delete_group details
[Microsoft Graph] Delete a group. Recoverable for 30 days, then permanent. Marked destructive, and for a Microsoft 365 group the weight is much greater than the word suggests: the mailbox, the SharePoint site and every Teams conversation go with it, so this is a content deletion rather than a permissions change. Read the group first to see which kind it is, and read its effective membership to see who loses access — for a nested group that number is routinely far larger than the direct member count. If the goal is only to stop the group granting access, removing its application assignments is narrower and reversible.
graph_get_group details
graph_get_group details
[Microsoft Graph] Get one group in full by object id, including its kind, description, mail address, visibility, expiry date and — for a dynamic group — the membership rule that decides who is in it. Read this before changing a group's membership: it is what tells you whether the group is dynamic, in which case adding and removing members will be refused and the rule is the only lever, and whether it is a Microsoft 365 group carrying a mailbox and a site that a deletion would take with it.
graph_list_deleted_groups details
graph_list_deleted_groups details
[Microsoft Graph] List groups that have been deleted but are still recoverable. Entra ID keeps a deleted group for 30 days, and restoring one brings back its object id, its membership and — for a Microsoft 365 group — its mailbox, SharePoint site and Teams conversations. That last point is why this read matters more for groups than for users: a deleted Microsoft 365 group is not just a lost permission, it is a team's content sitting on a 30-day timer, and nobody notices until someone tries to open a file.
graph_list_group_app_role_assignments details
graph_list_group_app_role_assignments details
[Microsoft Graph] List the enterprise applications a group is assigned to, and the role it holds in each. This is the read that turns "who is in this group" into "what does this group actually get you" — membership means nothing until you know what the group was granted, and this is the directory's own answer. Pair it with the effective-membership listing to size an application's real user base, which is usually the number a licence conversation needs.
graph_list_group_members details
graph_list_group_members details
[Microsoft Graph] List the DIRECT members of a group — the users, other groups, devices and service principals added to it explicitly. This is the list you edit: a member that appears here can be removed from this group, and one that does not appear but still has access is reaching it through nesting, which the effective-membership read exposes. Note that nested groups appear as members in their own right rather than being flattened, so a short list here can still mean hundreds of people have access.
graph_list_group_memberships details
graph_list_group_memberships details
[Microsoft Graph] List the groups and directory roles that a GROUP is itself a member of — the upward view of nesting. This is what explains an access surprise that the membership reads cannot: everyone in a small team group turns out to reach a sensitive resource because that group was nested inside a broad one years ago. Read it before deleting or repurposing any group, since removing it detaches everyone inside it from whatever the parent granted.
graph_list_group_owners details
graph_list_group_owners details
[Microsoft Graph] List the owners of a group — the people who can manage its membership and settings without being directory administrators. Worth checking during offboarding for the same reason owned applications matter: a group whose only owner has left is one that self-service requests cannot be approved for, and for a Microsoft 365 group that quietly blocks the team's own ability to manage itself. An empty owner list is legitimate for groups managed centrally, but it is usually worth flagging.
graph_list_group_transitive_members details
graph_list_group_transitive_members details
[Microsoft Graph] List everyone who is effectively a member of a group, flattening every level of nesting. This is the honest answer to "who can actually reach this", and for an access review it is the only one worth quoting — the direct listing routinely understates it by an order of magnitude in a directory that nests groups, which most do. Use it to size the blast radius before granting a group access to something, and use the direct listing when you intend to change a membership, because someone who appears only here cannot be removed from this group.
graph_list_groups details
graph_list_groups details
[Microsoft Graph] List the groups in an Entra ID directory — security groups, Microsoft 365 groups and distribution lists. Groups are where access is granted in practice, so this is the starting point for almost any permissions question. Two filters earn their keep: "securityEnabled eq true" separates access-granting groups from collaboration ones, and "groupTypes/any(c:c eq 'DynamicMembership')" finds the rule-driven groups whose membership cannot be edited by hand. The response distinguishes the kinds only indirectly — a Microsoft 365 group has "Unified" in its groupTypes — and the distinction matters before any deletion, because deleting a Microsoft 365 group takes its mailbox, SharePoint site and Teams team with it.
graph_permanently_delete_group details
graph_permanently_delete_group details
[Microsoft Graph] Permanently remove a deleted group from the recycle bin, ending the 30-day recovery window immediately. There is NO undo: for a Microsoft 365 group this destroys the mailbox, the SharePoint site and the Teams conversation history outright, and a group recreated with the same name inherits none of it. This exists for cases where a record genuinely must not remain, not for tidying — ordinary deletion has already removed the group's effect, and letting the window expire naturally costs nothing while keeping the recovery option open.
graph_remove_group_member details
graph_remove_group_member details
[Microsoft Graph] Remove a member from a group. Marked destructive because it takes away access the person is relying on and nothing tells them what broke — the failure they experience is a document that will not open, not a message about group membership. For a Microsoft 365 group it also removes them from the associated Teams team and its conversations. Only DIRECT members can be removed: somebody who is in the group through nesting is refused here, and the removal has to happen in whichever group holds their direct membership. Reversible by adding them back, provided the loss is noticed.
graph_remove_group_owner details
graph_remove_group_owner details
[Microsoft Graph] Remove an owner from a group. Marked destructive because of what it can leave behind: a group with no owners at all, which nobody outside the directory administrators can then manage, and which blocks self-service membership requests and — for a Microsoft 365 group — the team's own ability to administer itself. Read the owner list first and confirm at least one will remain. Recovering from an ownerless group needs an administrator, so this is easy to undo and easy not to notice.
graph_renew_group details
graph_renew_group details
[Microsoft Graph] Renew a Microsoft 365 group, restarting its expiration clock. Directories with an expiration policy delete groups nobody has renewed — along with the mailbox, SharePoint site and Teams conversations — so this is the call that saves a team's content when the owner has stopped reading the renewal reminders, which is most of them. Purely additive: it extends a lifetime and takes nothing away.
graph_restore_deleted_group details
graph_restore_deleted_group details
[Microsoft Graph] Restore a group from the directory's recycle bin, within the 30-day window. The group returns with its original object id, which is what makes the restore complete rather than a lookalike — every permission granted to that id comes back with it, where a new group of the same name would have none. For a Microsoft 365 group the mailbox, SharePoint site and Teams conversations are restored too, though the site can take a while to reappear. Not destructive: it undoes a deletion.
graph_update_group details
graph_update_group details
[Microsoft Graph] Update a group's name, description or visibility. A merge, so properties you do not name are left alone, and every field it touches is a label that can be set back — hence not destructive. The group's KIND is deliberately not changeable here because Microsoft does not allow it: a security group cannot become a Microsoft 365 group or the reverse, and the only route between them is to create the other kind and move the membership.
graph_update_group_dynamic_membership_rule details
graph_update_group_dynamic_membership_rule details
[Microsoft Graph] Change the rule that decides who belongs to a dynamic group. This is the sharpest write in the family and is marked destructive for a reason that is easy to miss: the rule is not a filter on a list you can review first, it is the membership itself, so a wrong expression silently adds or removes hundreds of people the moment Entra re-evaluates it — and everything those people gained or lost access to changes with them. Read the current rule and record it before changing anything, because there is no undo beyond putting the old expression back, and a rule that returns nobody looks exactly like a rule that is still processing. Membership is recomputed asynchronously and can take minutes to settle in a large directory.
Delegated Admin (GDAP)
graph_approve_delegated_admin_relationship details
graph_approve_delegated_admin_relationship details
[Microsoft Graph] Approve a GDAP relationship that an indirect provider created for you as an indirect reseller. Additive — it accepts a grant rather than removing one — but understand what is being accepted: approving activates every role named in the relationship, so read the relationship first and confirm the role list is what was agreed rather than the provider's default. This is not the tool a partner uses on their own relationships; the CUSTOMER approves those through their admin portal, not through this API.
graph_create_delegated_admin_access_assignment details
graph_create_delegated_admin_access_assignment details
[Microsoft Graph] Grant one of the partner's security groups a set of administrative roles inside a customer's tenant. Marked destructive despite being a grant, which is deliberate and worth understanding: unlike adding one person to one group, this hands every current AND future member of that group live administrative power in somebody else's production tenant, and the customer's own directory shows only the group, never who is in it. Deleting the assignment later stops future access but undoes nothing that was already done with it. Name the narrowest group and the fewest roles that do the job — the roles must be a subset of what the relationship itself carries, and anything beyond that is refused. Assignment is asynchronous and takes a few minutes to become usable.
graph_create_delegated_admin_relationship details
graph_create_delegated_admin_relationship details
[Microsoft Graph] Create a GDAP relationship request for a customer. Not destructive: it creates a DRAFT in the "created" status that grants nothing at all — the customer must approve it before any access exists, and until then it is freely editable and deletable. Choose the roles deliberately anyway, because the set you name here is the ceiling for the relationship's whole life and widening it later means going back to the customer for another approval. Leave the customer tenant id empty to create a relationship any customer can accept via the invitation link; supply it to lock the draft to one specific tenant, which is the safer default. The duration is ISO 8601 between P1D and P2Y.
graph_delete_delegated_admin_access_assignment details
graph_delete_delegated_admin_access_assignment details
[Microsoft Graph] Remove an access assignment, revoking that partner group's administrative roles in the customer's tenant. Destructive: everyone in the group loses that access, and what they experience is an admin centre that stops working rather than any message explaining why. This is the RIGHT tool for narrowing access — it is far less drastic than terminating the relationship, which ends the customer engagement entirely — but check the remaining assignments first, because removing the last one leaves an active relationship that grants nobody anything and looks exactly like a platform fault. Requires the If-Match ETag from a preceding read.
graph_delete_delegated_admin_relationship details
graph_delete_delegated_admin_relationship details
[Microsoft Graph] Delete a GDAP relationship outright. Destructive and permanent — there is no recycle bin for these, and recreating one means another approval cycle with the customer. Microsoft only accepts this on a relationship that never became active; an active one must be terminated instead, which is a different tool with a different asynchronous lifecycle. In practice this is the tidy-up call for abandoned drafts and rejected invitations, and it is worth reading the relationship's status first so the refusal on an active one is expected rather than confusing. Requires the If-Match ETag from a preceding read.
graph_get_delegated_admin_access_assignment details
graph_get_delegated_admin_access_assignment details
[Microsoft Graph] Get one GDAP access assignment, naming the partner security group it is built on and the exact customer roles that group receives. Read it before changing or removing an assignment: the response carries the @odata.etag that the update and delete tools require, and the group id it names is where the technicians actually come from — removing someone from that group is usually the narrower fix than touching the assignment at all.
graph_get_delegated_admin_customer details
graph_get_delegated_admin_customer details
[Microsoft Graph] Get one delegated-admin customer by id, with its display name and tenant id. Use it to confirm you are pointing a customer-directory call at the tenant you think you are — the display names MSPs give relationships drift from the customer's real organisation name over time, and acting in the wrong customer's directory is the mistake this connector most needs to make hard.
graph_get_delegated_admin_relationship details
graph_get_delegated_admin_relationship details
[Microsoft Graph] Get one GDAP relationship in full, including the exact set of Entra role definition ids it grants, its activation and end dates, and whether it auto-extends. Read this before any relationship write for two separate reasons: the status decides which writes are legal at all, and the response carries the @odata.etag that the update and delete tools require as their If-Match value. The role list here is the CEILING — an access assignment can grant a subset of it to a technician group but never more, so a role missing from this list explains a 403 that no amount of group membership will fix.
graph_get_delegated_admin_relationship_operation details
graph_get_delegated_admin_relationship_operation details
[Microsoft Graph] Get one long-running GDAP operation by id and see whether it succeeded, is still running, or failed and why. This is the tool to poll after a write that answered with a job rather than a result; the operation id comes from the operations listing or from the Location header Graph returned on the original write.
graph_get_delegated_admin_relationship_request details
graph_get_delegated_admin_relationship_request details
[Microsoft Graph] Get one GDAP relationship request by id, with the action it carried and its outcome. Use it to poll after submitting a relationship for approval or terminating one: both are asynchronous, so the tool that raised the request returns before anything has actually changed, and this is what tells you whether the platform finished the job.
graph_list_delegated_admin_access_assignments details
graph_list_delegated_admin_access_assignments details
[Microsoft Graph] List the access assignments on one GDAP relationship — which of the partner's own security groups holds which of the customer's Entra roles. This is the answer to "who at my company can administer this customer, and as what", and it is the read every access review needs, because the relationship alone only says what the customer permitted, not who the partner pointed at it. An empty list on an active relationship is the classic half-finished onboarding: the customer has approved everything and no technician can do a thing.
graph_list_delegated_admin_customer_service_management_details details
graph_list_delegated_admin_customer_service_management_details details
[Microsoft Graph] List the service-management links for one delegated-admin customer — the per-workload administration URLs (Exchange, Teams, SharePoint and the rest) that open that customer's admin centre directly. Useful when a task genuinely needs a portal rather than an API: these are the correct deep links for the customer's tenant, which is otherwise a fiddly URL to construct by hand and easy to construct for the wrong tenant.
graph_list_delegated_admin_customers details
graph_list_delegated_admin_customers details
[Microsoft Graph] List the customers this partner can administer, as the delegated-admin surface sees them. Distinct from the relationship listing and worth knowing which you want: this is one row per CUSTOMER, so it is the clean answer to "who are my managed tenants", while the relationship listing is one row per GRANT and a customer with three overlapping relationships appears three times there. The tenant ids returned here are what every other tool in this connector accepts as its target directory.
graph_list_delegated_admin_relationship_operations details
graph_list_delegated_admin_relationship_operations details
[Microsoft Graph] List the long-running operations on one GDAP relationship. Several GDAP writes do not finish when the call returns — removing the Global Administrator role from an active relationship and terminating a relationship both hand back a job rather than a result — and this is where that job's progress lives. If a change looks like it did not take, check here before repeating it: a second attempt against an in-flight operation is how a relationship ends up in a state nobody intended.
graph_list_delegated_admin_relationship_requests details
graph_list_delegated_admin_relationship_requests details
[Microsoft Graph] List the requests raised against one GDAP relationship — the lock-for-approval, approve, reject and terminate actions and how each of them finished. This is the audit trail for how a relationship reached its current status, and the place to look when a customer says they approved something that is not active: a request sitting at "pending" means the platform is still provisioning, while "failed" means the action was rejected and the relationship never moved.
graph_list_delegated_admin_relationships details
graph_list_delegated_admin_relationships details
[Microsoft Graph] List every GDAP relationship this partner tenant holds — one per customer per grant, with the roles it carries, its duration and its status. This is the entry point for the whole connector: the customer tenant ids it returns are what every other tool's tenant parameter takes, and the status tells you whether that access is usable today. Filter "status eq 'active'" for the customers you can actually administer right now, or "status eq 'expiring'" for the renewal list, which is the report most MSPs never build and then get surprised by. A relationship listed as active still grants nobody anything until an access assignment maps a technician group onto it.
graph_lock_delegated_admin_relationship_for_approval details
graph_lock_delegated_admin_relationship_for_approval details
[Microsoft Graph] Finalize a draft GDAP relationship and lock it for the customer's approval, moving it from "created" to "approvalPending". Not destructive — it grants nothing and the customer still has to accept — but it is the point of no return for EDITING: once locked, the roles and duration can no longer be changed, and getting them wrong means deleting the draft and starting over. After this succeeds, send the customer their invitation link at https://admin.microsoft.com/AdminPortal/Home#/partners/invitation/granularAdminRelationships/ followed by the relationship id.
graph_reject_delegated_admin_relationship details
graph_reject_delegated_admin_relationship details
[Microsoft Graph] Reject a pending GDAP relationship that an indirect provider created for you as an indirect reseller. Marked destructive because it is terminal and one-way: the relationship cannot be revived, and restoring the intended access means asking the provider to create a new one and waiting for that cycle again. Read the relationship first — a rejection because the role list looked wrong costs days, where asking the provider to amend the draft costs minutes. Note that a rejected request may read back with the action "unknownFutureValue" rather than "reject", which is Graph's evolvable-enum behaviour and not a failure.
graph_terminate_delegated_admin_relationship details
graph_terminate_delegated_admin_relationship details
[Microsoft Graph] End an active GDAP relationship. This is the single most destructive call in the connector: it removes the partner's entire administrative access to that customer's tenant, every access assignment on it stops working, and no technician can manage that customer afterwards — including, if this was the last relationship, whoever needs to fix it. It is not reversible; restoring access means creating a new relationship and getting the customer to approve it again, which needs a human at the customer who may not be reachable. Termination is asynchronous, so the relationship moves to "terminationRequested" and then "terminated" over the following minutes; poll the operations listing rather than repeating the call. Use it for genuine offboarding, and prefer deleting individual access assignments when the goal is only to narrow who can act.
graph_update_delegated_admin_access_assignment details
graph_update_delegated_admin_access_assignment details
[Microsoft Graph] Replace the set of customer roles an existing access assignment grants. Destructive for the same reason a dynamic group's membership rule is: the role list IS the access, so this single call both grants and revokes — any role you omit is removed from everyone in that group, immediately and with no warning to them. Read the assignment first, decide against its current list rather than from memory, and send the full intended set; this is not an additive call. Requires the If-Match ETag from that read, which Microsoft mandates and which is what prevents two concurrent edits from silently discarding one another.
graph_update_delegated_admin_relationship details
graph_update_delegated_admin_relationship details
[Microsoft Graph] Update a GDAP relationship's name, duration, requested roles or auto-extension. Requires the If-Match ETag from a preceding get, which is Microsoft's requirement rather than StackJack's, and which is what stops two technicians overwriting each other on an access-control record. Not destructive, because what it can reach is bounded by status: while the relationship is "created" it is a draft nobody has access through yet, and once it is "active" the only property that can change is the auto-extension — a scheduled future expiry, reversible by setting it back, with no effect on access today. The one exception to that is asynchronous: removing the Global Administrator role from an active relationship returns a long-running operation instead of a result, so poll the operations listing rather than assuming it finished.
Licensing
graph_assign_group_license details
graph_assign_group_license details
[Microsoft Graph] Assign licence SKUs to a group, so every member receives them automatically. This is the right way to license a role rather than a person — new starters get licensed by being added to the group and nobody has to remember — and it is additive, so not destructive. Be deliberate about the group though: the assignment applies to every current member and everyone added later, so pointing it at a broad group can consume a SKU's remaining units in one action. Assignment is asynchronous and fans out over minutes or longer; check the group's processing state rather than assuming it finished.
graph_get_group_license_assignment details
graph_get_group_license_assignment details
[Microsoft Graph] Get the licences assigned to a group and the current state of applying them to its members. Group-based licensing fans out asynchronously, so a processing state of ProcessingInProgress means members are still being licensed and an empty-looking result is premature rather than wrong. A state of ProcessingWithErrors means some members failed — usually a missing usage location or an exhausted SKU — and each affected user's own assignment states name the reason.
graph_get_subscribed_sku details
graph_get_subscribed_sku details
[Microsoft Graph] Get one purchased SKU in full, including every service plan it contains and each plan's provisioning status. Read it before a partial assignment: disabling plans is done by service plan id, those ids live only here, and guessing one produces a refusal rather than a partial licence. It is also how to answer "does this licence include Intune" without consulting a product page that may not match what the tenant actually bought.
graph_get_user_license_assignment_states details
graph_get_user_license_assignment_states details
[Microsoft Graph] Get the per-SKU assignment state for one user — where each licence came from, whether it applied cleanly, and the exact error when it did not. This is the diagnostic read of the family and the answer to the two questions the friendly licence list cannot settle. First, provenance: a state carrying a group id was INHERITED, and an inherited licence cannot be removed from the user — the removal has to happen on that group or the user has to leave it. Second, failure: an error of CountViolation means the tenant ran out of units, MutuallyExclusiveViolation means a conflicting licence is already assigned, DependencyViolation means a prerequisite plan is switched off, and ProhibitedInUsageLocationViolation means the service is not offered in the user's country.
graph_list_subscribed_skus details
graph_list_subscribed_skus details
[Microsoft Graph] List every licence SKU the tenant has bought, with how many units were purchased, how many are assigned and how many remain. This is the true-up read and the starting point for anything licensing-related: the sku ids it returns are what every assignment tool takes, and the service plans inside each SKU are what a partial assignment disables. The gap between enabled and consumed units is the number a renewal conversation turns on, and a SKU showing warning units is one already past its grace period.
graph_list_users_with_license details
graph_list_users_with_license details
[Microsoft Graph] List everyone assigned a particular licence SKU. This is the read that turns a purchased-unit count into names — the reclamation list before a renewal, and the answer to "who is this SKU actually for". Pair it with the sign-in activity on those users to find licences paid for by people who have not signed in for months, which is where most licence savings in a real tenant come from. Note this reflects assignment however it arrived, so people licensed through a group appear here too.
graph_remove_group_license details
graph_remove_group_license details
[Microsoft Graph] Remove licence SKUs from a group, which unlicenses every member who was relying on that group for them. The most destructive call in this family by blast radius: it is the per-user removal multiplied by the membership, so the same 30-day mailbox and file deletion clock starts for everyone who had no other source for the licence. Read the group's effective membership first to see the real number — for a nested group it is routinely far larger than the direct member count — and remember that members who ALSO hold the licence directly keep it, which is why the after-state is rarely uniform. Removal fans out asynchronously like the assignment does.
graph_reprocess_user_license_assignment details
graph_reprocess_user_license_assignment details
[Microsoft Graph] Re-evaluate a user's group-based licence assignments. Not destructive — it changes nothing by itself, it asks Entra to try again — and it is the specific fix for a user stuck in an error state after the underlying cause was resolved. Having bought more units, cleared a conflicting licence or set a missing usage location, this is what makes the assignment take effect rather than waiting for Entra to notice on its own schedule.
Organization & Domains
graph_create_domain details
graph_create_domain details
[Microsoft Graph] Add a DNS domain to the tenant. This is step one of three and on its own achieves nothing visible: Entra creates the domain UNVERIFIED, and until ownership is proven no mailbox or user can use it. Follow it immediately with the verification-DNS-records read, publish those records in the domain's zone file, and then call the verify action. Additive and reversible, so not destructive — an unverified domain added by mistake deletes cleanly because nothing references it yet. The domain name itself becomes the object's id.
graph_delete_domain details
graph_delete_domain details
[Microsoft Graph] Remove a domain from the tenant. This is the SAFE delete and it refuses while any user, group or application still references the domain — treat that refusal as the system working rather than an obstacle, and list the domain's references to see what is holding it. Removing a domain that mail is still delivered to stops that mail arriving, which is why it is destructive even when the delete succeeds. The tenant's initial onmicrosoft.com domain can never be deleted. If the refusal has to be overridden, that is the separate forcing delete, and it is a different and much larger operation.
graph_force_delete_domain details
graph_force_delete_domain details
[Microsoft Graph] Delete a domain even though objects still reference it, by RENAMING every referencing user and group onto the tenant's initial onmicrosoft.com domain first — and, unless told otherwise, disabling those user accounts. This is the most consequential operation in this family: people lose the address they are known by, mail to the old domain stops, and by default they cannot sign in afterwards. It is a separate tool from the ordinary delete rather than a flag on it, because the ordinary delete's refusal is the only thing standing between a routine tidy-up and a tenant-wide rename. List the domain's references first so the blast radius is a known number, and remove Exchange as the provisioning service beforehand or the operation fails partway. It runs asynchronously, so re-read the domain to confirm it actually completed.
graph_get_domain details
graph_get_domain details
[Microsoft Graph] Get one domain in full. The id is the fully qualified domain name itself — contoso.com, not a GUID — which is unusual for this API and worth knowing before an agent goes looking for an object id that does not exist. Beyond the verification flags this carries the password policy overrides for the domain (how long passwords live and how far ahead users are warned) and, on a domain mid-operation, a state block describing an asynchronous verification or force-delete still running.
graph_get_domain_root_domain details
graph_get_domain_root_domain details
[Microsoft Graph] Get the root domain a subdomain hangs off. A subdomain inherits its authentication type from its root, so when a subdomain behaves unexpectedly at sign-in this identifies the domain whose settings are actually in force. Called against a domain that is already a root, it answers empty rather than failing.
graph_get_organization details
graph_get_organization details
[Microsoft Graph] Get the tenant's own organization record — display name, postal address, contact emails, preferred language, default usage location, every verified domain, and the service plans the tenant is entitled to. This is the orientation read for a tenant you have just connected to, and the id it returns is the TENANT id that the organization update tool requires. Two properties repay attention on an MSP's own record: partnerTenantType states what kind of Microsoft partnership this tenant holds, and defaultUsageLocation is what stops licence assignment failing for every newly created user. Note Graph returns this as a collection containing exactly one object, so read the first entry of value rather than expecting a bare object.
graph_get_organization_branding details
graph_get_organization_branding details
[Microsoft Graph] Get the company branding applied to the tenant's sign-in experience — background image and colour, banner logo, sign-in page text, username hint and the self-service password reset links. Useful when a customer reports an unbranded or wrong-looking sign-in page, because that is almost always missing or partially configured branding rather than a fault. This returns the DEFAULT branding object; per-language overrides live in the localizations listing, and a tenant that has never configured branding answers 404 rather than an empty object, which is the expected answer rather than an error.
graph_list_certificate_based_auth_configurations details
graph_list_certificate_based_auth_configurations details
[Microsoft Graph] List the tenant's certificate-based authentication configuration — the trusted certificate authorities that let users sign in with a smart card or client certificate instead of a password. Relevant mainly to government and regulated customers, where an expired or missing CA in this collection is what breaks sign-in for everyone using a card. Entra permits only a single configuration object in the collection, so this returns at most one entry.
graph_list_domain_name_references details
graph_list_domain_name_references details
[Microsoft Graph] List the users, groups and applications whose identity references a domain. This is the impact assessment before any domain removal, and the answer to a delete that was refused: the ordinary domain delete fails while ANY object still references the domain, and this names them. Run it before considering the forcing delete, because that operation renames every object listed here onto the tenant's initial onmicrosoft.com domain and by default disables the user accounts among them.
graph_list_domain_service_configuration_records details
graph_list_domain_service_configuration_records details
[Microsoft Graph] Get the DNS records that make Microsoft 365 services actually work on a verified domain — the MX record mail delivery depends on, the SPF TXT record that stops the tenant's own mail being marked as spam, and the CNAME and SRV records Teams and Skype signalling need. This is the read that answers "the domain is verified, so why is mail not arriving": verification and service configuration are separate steps, and a domain can pass the first while none of these records exist. Compare each returned record against what is actually published in the zone.
graph_list_domain_verification_dns_records details
graph_list_domain_verification_dns_records details
[Microsoft Graph] Get the DNS records that must be published in a domain's zone file BEFORE ownership can be verified. This is step two of adding a domain and the only step StackJack cannot do for the customer: the records go into the registrar or DNS host, by a human with access to it, and the verify action fails until they have propagated. Read this immediately after creating a domain and hand the values to whoever administers DNS. These are NOT the same as the service configuration records, which come later and make mail and Teams actually work.
graph_list_domains details
graph_list_domains details
[Microsoft Graph] List every DNS domain associated with the tenant, with the four flags that answer most domain questions at a glance: isVerified says whether ownership was proven, isDefault marks the domain new users are created under, isInitial marks the permanent onmicrosoft.com domain Microsoft issued and which can never be deleted, and isRoot distinguishes a root domain from a subdomain. The supportedServices collection is what actually decides whether mail and Teams route to a domain, so a verified domain missing Email there is verified but not in use. Start a domain onboarding or a mail-delivery investigation here.
graph_list_group_setting_templates details
graph_list_group_setting_templates details
[Microsoft Graph] List the setting templates Entra publishes, each naming the settings it contains, their types and their default values. Read this BEFORE changing any directory setting: the update takes name-value pairs, the names are defined by the template rather than free text, and a misspelled name is accepted and silently does nothing. This is also how to see what a tenant's behaviour currently is when no settings object exists for a template — the template's defaults are what is in force.
graph_list_group_settings details
graph_list_group_settings details
[Microsoft Graph] List the tenant-wide directory settings currently in force — despite the endpoint's name these are not per-group settings but organization-wide policy, and they are where several answers live that people expect to find elsewhere: whether members may invite guests, whether ordinary users may create Microsoft 365 groups, the group naming and blocked-word policy, and the custom banned password list. Each entry is a template that has been instantiated and customized; a setting NOT listed here is still at its Microsoft default rather than absent. Read the setting templates to see what the defaults are and which names are valid.
graph_list_organization_branding_localizations details
graph_list_organization_branding_localizations details
[Microsoft Graph] List the per-language overrides of the tenant's sign-in branding. Each entry is keyed by a locale and replaces only the properties it sets, falling back to the default branding for the rest — so a customer reporting that one language looks wrong is describing a localization, not the default. An empty list means every language sees the default branding.
graph_promote_domain details
graph_promote_domain details
[Microsoft Graph] Promote a verified subdomain to be a root domain in its own right, so it stops inheriting authentication settings from its parent and carries its own. Marked destructive because it is ONE-WAY: Microsoft publishes no demote operation, so the previous inheritance cannot be restored through this API, and every user signing in on that subdomain is authenticated by the new settings from that moment. The subdomain must already be verified. Do this deliberately as part of a planned split — typically when an acquired business on a subdomain needs its own federation — and not to tidy up a domain list.
graph_update_domain details
graph_update_domain details
[Microsoft Graph] Update a verified domain's supported services, password policy or default status. The supported-services list is the property that decides whether mail and Teams actually route to this domain — Email, OfficeCommunicationsOnline and Yammer are the values that can be set here — and it REPLACES the existing list rather than adding to it, so send every service the domain should keep. Note it cannot be emptied here: an omitted or blank value leaves the current list alone rather than clearing it, which is what makes every other parameter safe to omit, so removing the last service is a portal operation rather than this tool. Making a domain the default changes which domain new users are created under and does not touch existing accounts. Federated authentication is deliberately NOT settable through this tool: switching a domain between managed and federated needs a permission this connector does not request, and getting it wrong stops sign-in for everyone on the domain.
graph_update_group_setting details
graph_update_group_setting details
[Microsoft Graph] Update a tenant-wide directory settings object — guest invitation policy, who may create Microsoft 365 groups, the group naming policy, the banned password list. Read the current settings first and send the FULL set of name-value pairs you want in force: the setting names come from the object's template and are not free text, and a name that does not exist in the template is accepted and silently does nothing, so a typo looks exactly like a successful change. Sending the complete set also makes the result identical whether Graph merges the collection or replaces it. The values parameter is a JSON array such as [{"name":"AllowToAddGuests","value":"false"}], and every value is a STRING even when it represents a boolean.
graph_update_organization details
graph_update_organization details
[Microsoft Graph] Update the tenant's organization record — the notification addresses Microsoft uses to reach the customer, the postal address, and the preferred language. The technical notification address is the one worth getting right on every tenant an MSP manages: it is where Microsoft sends service incidents and expiry warnings, and left pointing at a departed employee those notices go nowhere. This is a merge, so properties you omit are left alone, and it needs the tenant id that graph_get_organization returns. Read-only properties such as the tenant id, creation date and verified-domain list are refused by Graph with a message naming the property.
graph_verify_domain details
graph_verify_domain details
[Microsoft Graph] Prove ownership of a domain by having Entra look for the verification record in its public DNS. Step three of adding a domain, and it succeeds only once that record has been published AND propagated — a failure here usually means DNS has not caught up rather than that anything is wrong, so re-read the verification records and check them against the live zone before assuming a fault. Not destructive: it grants a capability rather than removing one. Note that a successful verification does NOT configure the domain for Microsoft 365 — mail, SharePoint and Teams each need their service configuration records published afterwards.
Applications & Service Principals
graph_add_application_key details
graph_add_application_key details
[Microsoft Graph] Add a certificate credential to an app registration, for rolling an expiring certificate without downtime. Adding a certificate hands whoever holds its private key the ability to authenticate as this application with all of its permissions, which is why this is Pro and flagged destructive even though it removes nothing. Two hard requirements from Microsoft: only the PUBLIC key should ever be uploaded, and the request must carry a proof — a self-signed JWT signed with the private key of a certificate already on this application. An application with no existing valid certificate cannot use this action at all and must be updated through graph_update_application instead, which is the supported path for the first certificate.
graph_add_application_owner details
graph_add_application_owner details
[Microsoft Graph] Add a user as an owner of an app registration. Additive and reversible, so not destructive — but understand what it grants: an owner can change the application, add credentials to it and therefore authenticate as it, without holding any directory role. Prefer at least two owners on anything business-critical, because an application whose only owner leaves is one nobody can renew a secret for.
graph_add_application_password details
graph_add_application_password details
[Microsoft Graph] Generate a new client secret for an app registration and return its value. Microsoft generates the secret — it cannot be chosen — and the response is the ONLY time the value is ever shown: no later read recovers it, and a lost secret can only be replaced, not retrieved. Treat the response as a credential: whoever holds it can authenticate as this application with every permission the app has been consented, without a sign-in, an MFA prompt or a conditional-access check. Always set an end date; an omitted one gives Microsoft's default of two years, which is longer than most of the projects these get created for.
graph_add_service_principal_key details
graph_add_service_principal_key details
[Microsoft Graph] Add a certificate credential to a service principal, for rolling an expiring certificate. Whoever holds the matching private key can then authenticate as that application in this tenant, which is why this is Pro and flagged destructive despite removing nothing. Requires a proof — a self-signed JWT signed with the private key of a certificate already on this principal — and cannot be used at all on a principal with no existing valid certificate; that case goes through the service principal update instead. Upload the public key only.
graph_add_service_principal_owner details
graph_add_service_principal_owner details
[Microsoft Graph] Add a user as an owner of a service principal. Additive and reversible. Be aware of what it means on a principal holding broad application permissions: an owner can add a credential to it and then authenticate as that application, so ownership of a highly-permissioned principal is equivalent to holding its permissions.
graph_add_service_principal_password details
graph_add_service_principal_password details
[Microsoft Graph] Generate a new client secret on a service principal and return its value — the same one-time disclosure as the app-registration version, and the same warning: this response is the only time Microsoft ever shows the secret. Adding a secret to a service principal is worth a second thought, because it is the local identity of an application that may be published by somebody else: a secret here authenticates as that application in THIS tenant, with whatever it has been granted here. For an app the tenant owns, the credential normally belongs on the app registration instead.
graph_create_application details
graph_create_application details
[Microsoft Graph] Register a new application in this directory. Creating the registration is additive and harmless on its own — a new app with no credentials, no permissions and nobody consented can do nothing. Two properties are worth setting deliberately: signInAudience decides whether only this tenant can use it or any Microsoft work account can, and changing it later is restricted; and requiredResourceAccess declares the permissions the app will ASK for, which grants nothing by itself and still needs consent. Creating an application does not create its service principal — an app registration with no service principal cannot sign in to its own tenant.
graph_create_delegated_grant details
graph_create_delegated_grant details
[Microsoft Graph] Consent to delegated permissions for a client application, on behalf of one user or of everyone in the tenant. Destructive because of what an AllPrincipals grant is: administrator consent for the whole directory, letting the application act as any user for the scopes named, immediately and without anyone being asked. Scopes are a space-separated list and must be permissions the resource application actually publishes — read them from the resource service principal's oauth2PermissionScopes rather than guessing, because an unrecognized scope is accepted into the grant and simply never works. Both clientId and resourceId are service principal OBJECT ids, not client ids.
graph_create_service_principal details
graph_create_service_principal details
[Microsoft Graph] Create a service principal for an application in this directory — giving an existing app registration an identity here so it can sign in and be assigned access. The only required property is appId, the CLIENT id of the application. This is what an app registration needs before anything can authenticate as it in its own tenant, and it is also how a multi-tenant application is provisioned into a customer directory ahead of consent. Creating the principal grants it nothing; permissions still arrive through consent or assignment.
graph_delete_application details
graph_delete_application details
[Microsoft Graph] Delete an app registration into the 30-day recycle bin, where it can be restored with its object id, client id and credentials intact. Destructive despite being recoverable: everything authenticating as this application stops working the moment it is deleted, and because those are integrations rather than people, the failure usually surfaces as a scheduled job that silently stopped rather than as somebody complaining. Check the sign-in logs for the app's client id before deleting anything that looks unused. Deleting the application does NOT delete its service principals in other tenants.
graph_delete_delegated_grant details
graph_delete_delegated_grant details
[Microsoft Graph] Revoke a delegated permission grant entirely. This is the remediation for an illicit-consent finding, and it takes effect for everyone the grant covered as soon as their current access tokens expire — up to about an hour, which is why disabling the service principal is the stronger containment when an application is believed to be actively malicious. Destructive by the standing access-removal rule: revoking a legitimate grant breaks the application for every user of it, and restoring it means re-consenting rather than undoing.
graph_delete_service_principal details
graph_delete_service_principal details
[Microsoft Graph] Delete an application's identity in this tenant, taking its consent grants and role assignments with it. The application stops working here immediately for everyone. Prefer disabling first: it has the same containment effect, is reversible with one call, and leaves the assignments intact if the app turns out to be legitimate. Deleting the service principal does not delete the application registration, and for a Microsoft first-party service the principal is often recreated automatically the next time the service is used — with none of its previous assignments.
graph_get_application details
graph_get_application details
[Microsoft Graph] Get one app registration in full: its redirect URIs, the API permissions it requests, its credentials and their expiry dates, and whether it is single- or multi-tenant. Read it before changing anything about the app, and read it when an integration breaks after a change — a mismatched redirect URI and an expired secret produce different sign-in failures that look identical from the outside. Note that the secret VALUES are never returned by any read: Microsoft shows a client secret exactly once, when it is created.
graph_get_service_principal details
graph_get_service_principal details
[Microsoft Graph] Get one service principal in full — an application's identity inside this specific tenant. The properties that matter most in an investigation are accountEnabled (whether the app can sign in at all), appRoles and oauth2PermissionScopes (what it can be granted), and appOwnerOrganizationId, which names the tenant that published it and is how a genuine Microsoft service is told apart from a third-party app with a Microsoft-sounding name. Disabling this object is what stops an application working in this tenant without affecting anyone else who uses it.
graph_grant_app_role_assignment details
graph_grant_app_role_assignment details
[Microsoft Graph] Assign an app role on a resource application to a user, group or service principal. This one call covers two quite different jobs, and which one it is depends entirely on the principal. Granting a role to a USER or GROUP is ordinary access management — it is how people are given access to an application that requires assignment. Granting one to a SERVICE PRINCIPAL is the sharpest act in this connector: it hands an application a tenant-wide APPLICATION permission such as Mail.Read or Directory.ReadWrite.All, which works with no user signed in and is therefore limited by nobody's role and no conditional-access policy. Destructive either way, and worth stating which you are doing before you do it. All three ids are object ids: the resource service principal that DEFINES the role, the principal receiving it, and the appRole's own id from that resource's appRoles collection.
graph_list_application_owners details
graph_list_application_owners details
[Microsoft Graph] List the owners of an app registration — the people who can change it, add credentials to it and consent on its behalf without holding any directory role. Ownership is the quiet privilege in an Entra tenant: it is granted once during a project and survives the project, so an offboarding review that checks only role assignments misses it entirely. An application whose only owner has left the company is the other finding worth acting on, because nobody can renew its expiring secret.
graph_list_applications details
graph_list_applications details
[Microsoft Graph] List the app registrations defined in this directory — the applications the tenant itself owns, not the third-party apps it merely uses. This is the inventory behind "what have we built or registered", and the read to start any credential-expiry audit from: each application carries its passwordCredentials and keyCredentials with their end dates, so the registrations whose secrets expire this month are visible here before the integration they power stops working. Filter on appId to resolve a client id someone quoted from the portal into the object this family's other tools take.
graph_list_delegated_grants details
graph_list_delegated_grants details
[Microsoft Graph] List every delegated permission grant in the directory — the tenant-wide consent inventory. Use this rather than the per-app listing when the question is "what has anyone consented to here", which is the sweep after a phishing report: filter on consentType eq 'AllPrincipals' to see only the grants an administrator made for everyone, or on a principalId to see what one user consented to on their own behalf. Each grant names a clientId and a resourceId, both service principal object ids, so resolving them through the service principal reads turns the answer into names.
graph_list_deleted_applications details
graph_list_deleted_applications details
[Microsoft Graph] List app registrations in the 30-day recycle bin. A deleted application is recoverable for 30 days and permanently gone afterwards, and the deletion does not announce itself — the usual way this read gets used is an integration that stopped working with no configuration change, where the application it authenticated as is sitting here. Restoring it keeps the same object id, client id and credentials, so nothing downstream needs reconfiguring.
graph_list_service_principal_app_role_assigned_to details
graph_list_service_principal_app_role_assigned_to details
[Microsoft Graph] List the app-role assignments made ON this service principal — who has been given a role in this application. For an app with defined roles this is its access list, and for an app configured to require assignment it is the complete set of people who can sign in to it at all. The principalType on each entry says whether the assignment reached a user directly, a group (in which case its membership is the real answer), or another application.
graph_list_service_principal_app_role_assignments details
graph_list_service_principal_app_role_assignments details
[Microsoft Graph] List the app-role assignments GRANTED TO this service principal — the application permissions it holds against other APIs, such as Mail.Read or Directory.ReadWrite.All over the whole tenant. These are the permissions that work with no user signed in, so they are not limited by anyone's role or conditional-access policy, and they are the ones worth auditing first. Each assignment names the resource it applies to and the appRoleId; resolve that id through the resource service principal's appRoles to get the permission's readable name.
graph_list_service_principal_delegated_grants details
graph_list_service_principal_delegated_grants details
[Microsoft Graph] List the delegated permission grants for one client application — what it may do on behalf of a signed-in user. The consentType is the property to read first: AllPrincipals means an administrator consented for the entire tenant and every user is covered, while Principal means one named user consented for themselves. The scope string holds the actual permissions as a space-separated list. This is the read that answers "what did we agree to give this app", and an AllPrincipals grant carrying Mail.Read or Files.ReadWrite.All on an app nobody recognizes is the classic illicit-consent finding.
graph_list_service_principal_owners details
graph_list_service_principal_owners details
[Microsoft Graph] List the owners of a service principal. Distinct from the app registration's owners and frequently a different set of people: ownership here is local to this tenant and carries the ability to add credentials to the principal, which means authenticating as that application with whatever it has been granted. Worth checking on any service principal holding broad application permissions, because an owner of such a principal is effectively holding those permissions too.
graph_list_service_principals details
graph_list_service_principals details
[Microsoft Graph] List the service principals in a directory — every application that has an identity in this tenant, including Microsoft's own first-party services and every third-party app anyone has consented to. This is the read behind "what applications have access to this tenant", and the honest answer in a real customer is hundreds, most of them Microsoft's. Filter on appId to find a specific app, or on accountEnabled to find principals someone disabled. Note that Microsoft serves this collection 100 objects at a time whatever page size is requested, so a full sweep takes many pages.
graph_permanently_delete_application details
graph_permanently_delete_application details
[Microsoft Graph] Permanently remove a deleted app registration from the recycle bin. There is no recovery of any kind after this — a replacement registration gets a NEW client id, which means every consent, every credential and every configuration file naming the old one has to be redone in every tenant that used the app. A separate tool from the ordinary delete on purpose: recoverable and permanent deletion are different decisions, and a flag on one tool is something an agent gets wrong in a single token.
graph_remove_application_key details
graph_remove_application_key details
[Microsoft Graph] Remove a certificate credential from an app registration. Anything authenticating with that certificate fails from this moment, and re-adding the same certificate later is a fresh upload rather than an undo. Like the matching add, this requires a proof — a self-signed JWT signed with the private key of a certificate still valid on the application — so removing the LAST certificate through this action is not possible; that case goes through graph_update_application. Confirm the replacement is in use before removing the old one.
graph_remove_application_owner details
graph_remove_application_owner details
[Microsoft Graph] Remove an owner from an app registration. Destructive by this connector's standing rule that taking access away is the sharper direction: removing the last owner leaves an application only a Global or Application Administrator can maintain, and the consequence surfaces months later when its secret expires and nobody can renew it. List the owners first and confirm somebody else remains.
graph_remove_application_password details
graph_remove_application_password details
[Microsoft Graph] Delete a client secret from an app registration by its keyId. Everything currently authenticating with that secret stops working immediately and cannot be made to work again — the value is unrecoverable, so the only remedy is a new secret and a configuration change everywhere it was used. During a rotation, add the replacement and confirm it is in use BEFORE removing the old one; the keyId comes from reading the application, and choosing the wrong entry from a list of similar-looking secrets is the mistake this call does not let you undo.
graph_remove_service_principal_key details
graph_remove_service_principal_key details
[Microsoft Graph] Remove a certificate credential from a service principal. Anything authenticating with it fails from this moment. Requires a proof signed with a certificate still valid on the principal, so the last certificate cannot be removed this way. Confirm the replacement is in use first.
graph_remove_service_principal_owner details
graph_remove_service_principal_owner details
[Microsoft Graph] Remove an owner from a service principal. Destructive by the standing rule that removing access is the sharper direction — and the failure mode here is delayed rather than immediate: nobody notices until a certificate needs rolling and the people who could do it are gone. List the owners first.
graph_remove_service_principal_password details
graph_remove_service_principal_password details
[Microsoft Graph] Delete a client secret from a service principal by its keyId. Whatever was authenticating with it fails immediately and the value cannot be recovered, so during a rotation the replacement should be added and confirmed in use first. The keyId comes from reading the service principal.
graph_restore_deleted_application details
graph_restore_deleted_application details
[Microsoft Graph] Restore an app registration from the 30-day recycle bin. The restored application keeps its object id, client id, credentials and consent grants, so integrations that authenticate as it start working again with no reconfiguration anywhere. Not destructive — it puts something back. Only works within the 30-day window; after that the registration is unrecoverable and a replacement needs a new client id and fresh consent from every tenant that used it.
graph_revoke_app_role_assignment details
graph_revoke_app_role_assignment details
[Microsoft Graph] Remove an app-role assignment, revoking that access. For a user or group it takes away their access to the application, which they experience as the app disappearing or refusing them. For a service principal it removes an application permission — the correct remediation when an app is found holding more than it needs, and the one to reach for after an application-permission audit. Effective on the next token the application requests rather than instantly, so an app holding a current access token keeps the permission for up to about an hour; disabling the service principal is the immediate containment. The assignment's own id comes from the two app-role listings.
graph_set_service_principal_enabled details
graph_set_service_principal_enabled details
[Microsoft Graph] Turn an application's sign-in on or off in this tenant. This is the containment action for a compromised or unwanted application — faster and more complete than revoking individual consent grants, because nothing can authenticate as the application here at all while it is disabled, and it is reversible by setting it back. Destructive because disabling is instant and tenant-wide: every user of that app loses it at once with a sign-in error that names the app rather than explaining the cause, so confirm which application the principal belongs to before disabling anything that is merely unfamiliar. Most principals in a tenant are Microsoft's own first-party services.
graph_update_application details
graph_update_application details
[Microsoft Graph] Update an app registration's properties. Graph merges rather than replaces at the top level, so an omitted property is left alone — but a nested object supplied in full REPLACES what was there, which is the trap on this particular resource: sending a web object with one redirect URI removes every other redirect URI the app had, and the sign-ins that used them fail immediately with an error that names the URI rather than the deletion. Read the application first and send the complete list. This is also the supported way to add a CERTIFICATE to an app that has none, because the dedicated key tools cannot be used until one valid certificate already exists.
graph_update_delegated_grant details
graph_update_delegated_grant details
[Microsoft Graph] Replace the scopes on an existing delegated permission grant. The scope string is the whole state rather than a list to append to, so whatever is sent becomes the complete set and every permission left out is revoked — read the grant first and send the full list including the ones being kept. Destructive in both directions for that reason: this call both grants and removes, and a shortened string looks like a successful update while breaking the parts of an application nobody tested.
graph_update_service_principal details
graph_update_service_principal details
[Microsoft Graph] Update a service principal's local properties — its display name in this tenant, its notes, its home-page URL, its tags. Deliberately does NOT change whether the application can sign in: that is a different decision with a tenant-wide consequence and has its own tool. The property most worth knowing here is appRoleAssignmentRequired, which when true means only assigned users and groups can use the application at all — a real access control, and turning it on without first assigning anybody locks everyone out of that app.
Directory Roles & PIM
graph_activate_directory_role details
graph_activate_directory_role details
[Microsoft Graph] Activate a directory role in this tenant from its template, creating the role object so members can be added to it. Not destructive and grants nobody anything — it makes a role that Entra already defines available to assign. This is the fix for "that role does not exist in this tenant", which is what the directory-role listing reports for any role nobody has ever been assigned. Takes the roleTemplateId from the role-template listing.
graph_activate_eligible_role details
graph_activate_eligible_role details
[Microsoft Graph] Activate a role the signed-in user is already eligible for — the just-in-time elevation at the centre of Privileged Identity Management. The principalId must be the signed-in user's own object id; this action cannot activate anybody else's eligibility, which is what makes it self-service rather than a grant. Destructive because the result is real administrative power, live immediately for the duration requested. Two conditions come from the role's PIM policy rather than from this call: it can require approval, in which case the request sits pending until a human acts, and it can require the caller to have completed multifactor authentication in the current session.
graph_add_directory_role_member details
graph_add_directory_role_member details
[Microsoft Graph] Add a user, group or service principal to a directory role, granting that role's administrative permissions permanently and immediately. Destructive despite being an addition, and for the reason the whole connector applies to privilege grants: this hands someone power over other people's accounts, and removing the membership afterwards undoes nothing they did while they held it. Read the role definition before granting, and prefer the least-privileged role that covers the task — Global Administrator is rarely the correct answer and is the hardest grant to walk back. In a tenant using Privileged Identity Management, a permanent grant here bypasses the approval and time limits that PIM exists to impose.
graph_assign_role_with_schedule details
graph_assign_role_with_schedule details
[Microsoft Graph] Assign a directory role through Privileged Identity Management with a time limit — an ACTIVE grant that expires on its own. This is the right shape for temporary administrative access: a contractor for the length of a project, or a technician for the duration of an incident, without depending on anyone remembering to revoke it. Supplying neither a duration nor an end date creates a PERMANENT assignment, which is the same thing as an ordinary grant and defeats the point of using this tool. Re-issuing this call with a new schedule is also how an existing assignment is extended or renewed.
graph_create_role_assignment details
graph_create_role_assignment details
[Microsoft Graph] Create a unified RBAC role assignment — the way to grant a role SCOPED to part of the directory rather than all of it. The directoryScopeId is the reason to use this over the directory-role membership tool: "/" grants tenant-wide, while an administrative unit id confines the grant to that unit's members, and an application object id confines it to that application. Scoping is the single most effective way to reduce the blast radius of an administrative grant. Destructive as every privilege grant here is.
graph_create_role_definition details
graph_create_role_definition details
[Microsoft Graph] Create a custom directory role from a set of resource actions. Not destructive: a definition nobody has been assigned grants nothing. The care belongs in the actions chosen — take them from the built-in role definitions rather than inventing strings, because an action that does not exist is accepted into the definition and simply never grants anything, producing a role that looks correct and does nothing. Custom roles need Entra ID P1 in the directory.
graph_deactivate_eligible_role details
graph_deactivate_eligible_role details
[Microsoft Graph] Give up a role the signed-in user activated, before it expires on its own. The one write in this family that is NOT destructive, and the exception is narrow: it removes only the CALLER's own just-in-time activation, nobody else loses anything, and the same person can activate again in one call because the underlying eligibility is untouched. Good practice after finishing privileged work rather than holding the role for the rest of its window.
graph_delete_role_assignment details
graph_delete_role_assignment details
[Microsoft Graph] Remove a unified RBAC role assignment, revoking those permissions immediately. Takes the assignment's own id from the assignment listing rather than a principal and role, which is deliberate on Microsoft's part: one person can hold the same role at several scopes, and naming the assignment is the only way to remove exactly the one intended.
graph_delete_role_definition details
graph_delete_role_definition details
[Microsoft Graph] Delete a custom role definition. Everyone assigned it loses those permissions at once, and because a custom role usually exists to give a specific team a specific capability, the people affected are the ones who will notice fastest. List the assignments for this definition before deleting. Built-in roles cannot be deleted.
graph_get_directory_role details
graph_get_directory_role details
[Microsoft Graph] Get one activated directory role by its object id, including the roleTemplateId that identifies WHICH Entra role it is. The template id is the stable, tenant-independent identifier — Global Administrator is 62e90394-69f5-4237-9190-012177145e10 in every tenant on earth — while the object id differs per tenant. When comparing role configuration across customers, compare template ids.
graph_get_role_definition details
graph_get_role_definition details
[Microsoft Graph] Get one role definition with its full permission set. Read it before granting the role to anybody: rolePermissions lists the exact allowedResourceActions, and the difference between two similar-sounding roles is usually one action that matters — the ability to reset another administrator's password, or to consent to application permissions on the tenant's behalf.
graph_get_role_management_policy details
graph_get_role_management_policy details
[Microsoft Graph] Get one PIM policy, expanding its rules — which is where the settings that matter actually live. The rules are what say whether activation needs approval and from whom, whether MFA or a justification is required, the maximum activation duration, and whether permanent assignment is allowed at all. Reading the policy without expanding rules returns its name and scope and none of that, which reads as an empty policy rather than an unexpanded one.
graph_list_directory_role_members details
graph_list_directory_role_members details
[Microsoft Graph] List who holds a directory role. This is the answer to "who are the Global Administrators here", the first read of any tenant security review, and the number Microsoft recommends keeping under five. Two cautions: members can be service principals as well as people, and an application holding a privileged role is easy to miss in a list of names; and this shows PERMANENT membership, so a tenant using Privileged Identity Management will show far fewer administrators here than can actually become one — the eligibility schedules hold the rest. This collection is returned whole with no paging.
graph_list_directory_role_templates details
graph_list_directory_role_templates details
[Microsoft Graph] List every directory role Entra defines, whether or not this tenant has ever used one. This is the catalogue — the place to find a role's template id and its description before granting it, and the answer to "which role is the least privileged one that can do this". Granting Global Administrator because it was the recognizable name in a list is the single most common over-privileging mistake in Entra, and reading this first is what avoids it.
graph_list_directory_roles details
graph_list_directory_roles details
[Microsoft Graph] List the directory roles that are ACTIVE in this tenant. Not the catalogue of roles that exist in Entra — only the ones this tenant has ever used, because Entra activates a role lazily the first time somebody is assigned to it. A role missing from this list has no members by definition, which is why "that role is not in the list" almost never means what it appears to. For the full catalogue, read the role templates instead. This collection is returned whole with no paging.
graph_list_role_assignment_instances details
graph_list_role_assignment_instances details
[Microsoft Graph] List the role assignments in effect right NOW — the closest thing this API offers to "who is an administrator at this moment". This is the read for an incident: it includes people currently elevated through a just-in-time activation, who are absent from the permanent assignment listing and present here only until their activation expires. Comparing this against the eligibility instances is what separates "is an administrator" from "could be one".
graph_list_role_assignment_requests details
graph_list_role_assignment_requests details
[Microsoft Graph] List the requests that assigned, activated, extended or removed role assignments — the PIM audit trail, including every self-activation with the justification the person typed. This is the read behind "who elevated to Global Administrator last night and why", and the one to reach for when an approval is believed to be stuck: a request in PendingApproval status is waiting on a human, and its justification and ticketInfo say what it was for.
graph_list_role_assignment_schedules details
graph_list_role_assignment_schedules details
[Microsoft Graph] List the scheduled role ASSIGNMENTS — active grants managed through Privileged Identity Management, including the ones with an expiry date. The assignmentType property is the one to read: Assigned means a standing grant, while Activated means the person elevated from an eligibility and will drop back when it expires. A tenant with many Assigned entries carrying no end date is running PIM in name only.
graph_list_role_assignments details
graph_list_role_assignments details
[Microsoft Graph] List unified RBAC role assignments — the permanent grants, including the SCOPED ones that the directory-role member listing cannot express. Filter by roleDefinitionId to answer "who holds this role" or by principalId to answer "what does this person hold"; expanding the principal turns the object ids into names in the same call, which is usually worth doing. The directoryScopeId is what makes this read worth having: "/" means the whole tenant, while anything else scopes the grant to one administrative unit or application, and a scoped Helpdesk Administrator is a very different finding from a tenant-wide one.
graph_list_role_definitions details
graph_list_role_definitions details
[Microsoft Graph] List the unified RBAC role definitions — every built-in Entra role plus any custom roles this tenant has defined, each with the exact permissions it carries in rolePermissions. Unlike the directory-role listing, this is complete whether or not a role has ever been used. Filter on isBuiltIn eq false to see only the tenant's own custom roles, which are worth reviewing on their own: a custom role is where an over-broad permission hides behind a reassuring name.
graph_list_role_eligibility_instances details
graph_list_role_eligibility_instances details
[Microsoft Graph] List the role eligibilities that are in effect right NOW, as opposed to the schedules that define them. The distinction matters when eligibility is time-bounded: a schedule starting next month or expired last week still exists as a schedule and is absent from this collection. Use this when the question is what a person can currently elevate into, and the schedules listing when the question is what was arranged.
graph_list_role_eligibility_requests details
graph_list_role_eligibility_requests details
[Microsoft Graph] List the requests that created, changed or removed role eligibilities — the audit trail for who was made eligible for what, by whom, and with what justification. Each request carries its status, so this is also where a change that is waiting on approval or failed validation is visible; an eligibility somebody believes they granted but that never took effect is usually a request sitting in a non-terminal status here.
graph_list_role_eligibility_schedules details
graph_list_role_eligibility_schedules details
[Microsoft Graph] List who is ELIGIBLE for a directory role — the people who can elevate themselves into it whenever they choose, without asking anyone. This is the read that completes a privileged-access review: a tenant using Privileged Identity Management shows few permanent administrators, and everyone else who can become one is here. Treat eligibility as equivalent to holding the role for risk purposes, because the only thing between the person and the permission is a single self-service call. Filter by principalId or roleDefinitionId; expand the principal to get names.
graph_list_role_management_policies details
graph_list_role_management_policies details
[Microsoft Graph] List the Privileged Identity Management policies for directory roles — the rules that decide how elevation actually works: whether approval is required, whether multifactor authentication is enforced at activation, how long an activation lasts, and who gets notified. A tenant can look well-governed because PIM is switched on while every role allows unapproved eight-hour self-activation with no MFA, and this is the read that tells the difference. The policy id found here is what the policy detail read expands the rules of.
graph_list_role_management_policy_assignments details
graph_list_role_management_policy_assignments details
[Microsoft Graph] List which PIM policy applies to which role. The policies themselves are not named after roles, so this is the join between them: given a roleDefinitionId it names the policyId whose rules govern elevation into that role. Read it before concluding anything from a policy — the same tenant routinely has a strict policy on Global Administrator and the default one on everything else.
graph_make_principal_eligible_for_role details
graph_make_principal_eligible_for_role details
[Microsoft Graph] Make a user or group ELIGIBLE for a directory role through Privileged Identity Management — they hold nothing until they activate, and can activate whenever they choose subject to the role's PIM policy. Destructive for the same reason a direct grant is: eligibility is administrative power with a delay on it, and the delay is however long it takes to make one self-activation call. Prefer it over a permanent assignment anyway, because activation is time-bounded, logged with a justification and can require approval and MFA. Set a duration to make the ELIGIBILITY itself expire; omitting both duration and end date makes it permanent eligibility, which is the common configuration for standing administrators.
graph_remove_directory_role_member details
graph_remove_directory_role_member details
[Microsoft Graph] Remove a member from a directory role, revoking those administrative permissions immediately. The standard offboarding and least-privilege action, and the one place to be careful about locking a tenant out of itself: removing the last Global Administrator leaves nobody able to grant it back, and Microsoft support recovery for that is slow. List the members first and confirm somebody else remains. Note that removing a permanent membership does not affect a PIM eligibility for the same role — the person can elevate straight back.
graph_remove_role_eligibility details
graph_remove_role_eligibility details
[Microsoft Graph] Remove someone's eligibility for a directory role, so they can no longer elevate into it. The offboarding step people forget: removing a permanent role membership leaves an eligibility untouched, and the person elevates straight back into the role they were just removed from. Check the eligibility schedules for anyone whose access is being withdrawn. Note this does not end an activation already in progress — that is the deactivation, or waiting for it to expire.
graph_remove_scheduled_role_assignment details
graph_remove_scheduled_role_assignment details
[Microsoft Graph] Remove a role assignment that was made through Privileged Identity Management, revoking it immediately rather than waiting for it to expire. Use this rather than the plain assignment delete for anything PIM created, so the removal is recorded as a PIM request with its justification alongside the grant it undoes. The same lockout caution applies as to any Global Administrator removal.
graph_update_role_definition details
graph_update_role_definition details
[Microsoft Graph] Update a custom role definition. Destructive because the definition IS the state: changing rolePermissions changes what every person already holding this role can do, immediately and without any of them being told, and the permission array REPLACES rather than merges — a shorter list silently strips capabilities from everyone assigned. Read the definition first and send the complete set. Built-in roles cannot be updated at all.
Authentication Methods
graph_add_user_email_method details
graph_add_user_email_method details
[Microsoft Graph] Register an email address on an account for self-service password reset. Destructive because of what it is rather than what it does: this is an account RECOVERY path, so whoever controls the address can reset the password later without needing the current one. The address is normally external to the tenant — a personal account — which is what makes an unexpected entry here both serious and easy to overlook in any review that only looks at internal mailboxes.
graph_add_user_phone_method details
graph_add_user_phone_method details
[Microsoft Graph] Register a phone number for multifactor authentication on an account. Destructive despite being an addition: from this moment that number can receive the codes and approvals that prove the person's identity, which is exactly the step an intruder takes to make their access survive a password reset. Confirm the number with the person through a channel that is not the account itself. The number must be in international format with a space after the country code, for example +1 5551234567, and a tenant whose policy disables SMS refuses the registration with an error that names the method rather than the policy.
graph_create_temporary_access_pass details
graph_create_temporary_access_pass details
[Microsoft Graph] Issue a Temporary Access Pass for a user and RETURN THE PASSCODE. Treat the response as a live credential: the passcode signs in as that person AND lets them register new authentication methods, which makes it a complete bypass of whatever multifactor protection the account had. That is exactly why it exists — it is how somebody onboards, or recovers after losing every method — and exactly why it is the most dangerous call in this family. Microsoft shows the value once and never again. Prefer a single-use pass with the shortest workable lifetime, deliver it through a channel that is not the account itself, and verify who you are talking to first: an unsolicited request for one is a standard social-engineering approach.
graph_delete_temporary_access_pass details
graph_delete_temporary_access_pass details
[Microsoft Graph] Revoke a Temporary Access Pass immediately, before it expires on its own. The containment action when a pass was issued to the wrong person, delivered through a channel that turned out to be compromised, or simply is no longer needed — a pass sitting unused until it expires is an open door with a timer on it. An account with an unexplained active pass should have it revoked first and investigated afterwards.
graph_delete_user_authenticator_method details
graph_delete_user_authenticator_method details
[Microsoft Graph] Remove a Microsoft Authenticator registration from an account — the standard lost-phone and replaced-phone action. The person will need to register the app again on their new device, which itself requires them to authenticate, so make sure they still have another method or a Temporary Access Pass before removing their only one. Check the device name on the registration first: removing the wrong one silently breaks the phone they are actually using.
graph_delete_user_email_method details
graph_delete_user_email_method details
[Microsoft Graph] Remove an email address from an account's password-reset methods. The containment step when an unrecognized recovery address is found, and a routine one when somebody's personal address changes. Removing it does not affect sign-in — this method is only used for self-service password reset — but a person left with no reset method has to call the helpdesk instead.
graph_delete_user_fido2_method details
graph_delete_user_fido2_method details
[Microsoft Graph] Remove a FIDO2 security key from an account. The deprovisioning step for a lost key and part of a complete offboarding, since the physical key leaves with the person. Removing the registration is what actually revokes it — possession of the key means nothing once Entra no longer knows about it — but check what else the person has registered, because security-key users often have nothing else.
graph_delete_user_phone_method details
graph_delete_user_phone_method details
[Microsoft Graph] Remove a phone number from an account's authentication methods. The correct response to an unrecognized number during an incident, and the routine step when a person leaves or changes number. Check what else they have registered first: removing the last method locks the account out of multifactor authentication entirely, which in a tenant that requires MFA means locked out of everything.
graph_delete_user_software_oath_method details
graph_delete_user_software_oath_method details
[Microsoft Graph] Remove a third-party authenticator (software OATH) token from an account. Worth doing deliberately during offboarding and phone replacement, because these are the registrations people forget they have: the code keeps generating in an app on a device nobody is tracking, and it stays valid until removed here.
graph_delete_user_windows_hello_method details
graph_delete_user_windows_hello_method details
[Microsoft Graph] Remove a Windows Hello for Business registration from an account. Each registration is bound to one device, so this is what unlinks a machine being returned, reassigned or wiped. The person keeps signing in normally on their other devices; on that one they fall back to a password, which is worth telling them, because a Hello user may not know theirs.
graph_disable_user_sms_sign_in details
graph_disable_user_sms_sign_in details
[Microsoft Graph] Stop a user signing in with an SMS code, leaving the number registered as a second factor. A hardening action rather than a punishment, but destructive by this connector's rule that removing a sign-in path is the sharper direction: anyone who has been signing in this way loses their only means of doing so, and a frontline worker with no password set will be locked out until one is issued. Check how the person actually signs in before switching it off.
graph_enable_user_sms_sign_in details
graph_enable_user_sms_sign_in details
[Microsoft Graph] Allow a user to sign IN with a code sent to their registered mobile number, rather than only using it as a second factor. Destructive because it changes what the number is: a phone that could previously only confirm an identity can now establish one, so a SIM swap or a redirected number becomes a complete account takeover rather than one factor of two. Usually reserved for frontline staff who share devices and have no password worth typing; it is rarely the right answer for an administrator.
graph_get_authentication_methods_policy details
graph_get_authentication_methods_policy details
[Microsoft Graph] Get the tenant's authentication methods policy — which methods are permitted, and for whom. Read it before registering a method on anyone's behalf: a tenant that has disabled SMS refuses a phone registration with an error about the method rather than about the policy, which sends people looking in the wrong place. It is also the honest answer to "is this tenant enforcing strong authentication", because a tenant can permit every weak method while appearing modern. Changing this policy needs a permission this connector does not request, so it is read-only here.
graph_list_authentication_method_registrations details
graph_list_authentication_method_registrations details
[Microsoft Graph] List every user's authentication-method registration status in one report — who is registered for multifactor authentication, who is capable of self-service password reset, and which methods each has. This is the tenant-wide read the per-user listings cannot give: filter on isMfaRegistered eq false to get the gap list an MFA rollout works from, which is the single most useful security report in this connector. Note it reflects REGISTRATION rather than enforcement — someone registered may still not be required to use it, and that is a Conditional Access question.
graph_list_user_authentication_methods details
graph_list_user_authentication_methods details
[Microsoft Graph] List every authentication method registered on one account, of every type, in a single call. This is the first read of any "I cannot sign in" call and the one to reach for before assuming anything: the @odata.type on each entry names the method, and a user with only a passwordAuthenticationMethod has no second factor registered at all. The specific-type listings exist for when a method needs its own id to be changed or removed; this one answers the question that comes first.
graph_list_user_authenticator_methods details
graph_list_user_authenticator_methods details
[Microsoft Graph] List the Microsoft Authenticator registrations on an account, including the device each one is installed on. The device name is the useful part during a lost-phone call: it distinguishes the registration that needs removing from the one on the replacement handset, and two registrations where the person remembers one is worth asking about.
graph_list_user_email_methods details
graph_list_user_email_methods details
[Microsoft Graph] List the email addresses registered on an account for self-service password reset. Worth reading during any account investigation, because this is an account-RECOVERY path rather than a sign-in one: an attacker who adds their own address here can reset the password later without needing anything else, and the address is usually external so it does not appear in any tenant-wide review of mailboxes.
graph_list_user_fido2_methods details
graph_list_user_fido2_methods details
[Microsoft Graph] List the FIDO2 security keys registered on an account, with each key's model and the display name its owner gave it. These are the strongest methods available and the ones an offboarding process most often misses, because the credential is a physical object that leaves the building with the person. Reading this before deprovisioning is how you find out whether a key needs to be collected as well as removed.
graph_list_user_phone_methods details
graph_list_user_phone_methods details
[Microsoft Graph] List the phone numbers registered for multifactor authentication on one account, each with its type — mobile, alternateMobile or office. The number is returned in full, which is the point: an unrecognized mobile number on a privileged account is one of the clearest indicators of a compromised identity, because adding one is how an attacker keeps access after a password reset. Compare against what the person believes is registered rather than against what looks plausible.
graph_list_user_software_oath_methods details
graph_list_user_software_oath_methods details
[Microsoft Graph] List the third-party authenticator (software OATH) tokens registered on an account — the codes generated by apps other than Microsoft Authenticator. Worth checking separately because they are easy to forget: they appear in no Microsoft app, the person may not remember which authenticator they used, and a stale one from a replaced phone stays valid indefinitely.
graph_list_user_temporary_access_passes details
graph_list_user_temporary_access_passes details
[Microsoft Graph] List the Temporary Access Passes on an account, with each one's lifetime, whether it is single-use, and whether it is currently usable. The passcode itself is NOT returned — Microsoft shows that once, at creation — so this is the read for "is there an active pass on this account", which is exactly the question after a suspicious sign-in. An unexplained active pass on a privileged account is a serious finding: a pass both signs in and registers new methods, so it is a complete bypass of whatever MFA the account had.
graph_list_user_windows_hello_methods details
graph_list_user_windows_hello_methods details
[Microsoft Graph] List the Windows Hello for Business registrations on an account — the PIN or biometric sign-in bound to a specific device. Each registration belongs to one machine, so this doubles as a list of the devices a person actually signs in on with Hello, and a registration for a device that was returned or replaced is a loose end worth closing.
graph_reset_user_password_generated details
graph_reset_user_password_generated details
[Microsoft Graph] Ask Entra to generate a new password for a user and RETURN IT. The response carries a working credential for that account and Microsoft will not show it again, so treat it exactly as such: deliver it out of band, and expect the person to be prompted to change it at first sign-in. This is NOT the same tool as graph_reset_user_password, which sets a password an administrator chose and returns nothing — use that one when the password is already agreed, and this one when a generated password is what is wanted. Resetting does not sign the person out of existing sessions; revoking their sign-in sessions is a separate act and the one that actually ends an intruder's access.
graph_set_authentication_method_configuration details
graph_set_authentication_method_configuration details
[Microsoft Graph] Turn an authentication method on or off for the whole tenant, or restrict it to particular groups. This is the tenant-wide security control the per-user tools cannot reach: disabling SMS here is how an organization stops phone-based multifactor authentication being an option at all, which is the standard hardening step against SIM-swap and phishing attacks. Destructive and tenant-wide — anyone whose ONLY registered method is the one being disabled can no longer complete multifactor authentication, so read the registration report first and confirm those people have an alternative. The method id is the configuration's name, such as Sms, Fido2, MicrosoftAuthenticator, TemporaryAccessPass or Email, and the includeTargets JSON decides who the method applies to.
graph_update_authentication_methods_policy details
graph_update_authentication_methods_policy details
[Microsoft Graph] Update the tenant-wide authentication methods policy — the settings that sit above the individual methods, most usefully the registration campaign that nudges users onto the Authenticator app and the policy's migration state. Destructive because it applies to everybody at once and takes effect without warning anyone: a registration campaign begins prompting people at sign-in from the moment it is switched on. To enable or disable a specific METHOD, use the method-configuration tool instead — this one is for the policy around them.
graph_update_user_phone_method details
graph_update_user_phone_method details
[Microsoft Graph] Change the number on an existing phone authentication method — the ordinary fix when somebody changes handset or carrier. Destructive for the same reason the addition is, and slightly sharper: it REPLACES the number that was proving their identity, so the previous one stops working immediately and a mistyped digit leaves the person unable to complete multifactor authentication with no obvious cause. Verify the new number and confirm the person can use it before removing any other method they still have.
Conditional Access
graph_create_authentication_context details
graph_create_authentication_context details
[Microsoft Graph] Define an authentication context — one of the c1 to c25 labels an application can request to force step-up authentication on a specific action. Not destructive: it does nothing until a Conditional Access policy targets it and an application requests it. The id must be one of the reserved c1 through c25 values, and isAvailable must be true before applications can see it, which is the step most often missed when a context appears configured and never triggers.
graph_create_authentication_strength_policy details
graph_create_authentication_strength_policy details
[Microsoft Graph] Define a custom authentication strength — a named set of method combinations that a Conditional Access policy can require. Not destructive until a policy references it. This is how a tenant demands phishing-resistant authentication specifically rather than "MFA" in general: the allowedCombinations list names exactly which methods count, so excluding sms and voice here is what closes the gap an attacker uses when they move a phone number. Microsoft's built-in strengths cannot be modified, which is why custom ones exist.
graph_create_conditional_access_policy details
graph_create_conditional_access_policy details
[Microsoft Graph] Create a Conditional Access policy. Destructive despite creating rather than removing, and this is the tool in the connector most capable of a tenant-wide outage: a policy targeting All users with a control nobody can satisfy takes effect within minutes and applies to whoever created it. Two habits prevent that and nothing else does — create it as enabledForReportingButNotEnforced and read the report-only sign-in results before enabling, and exclude a break-glass account in the conditions. Note that grantControls.operator decides everything: OR means any one control is enough, AND means all of them.
graph_create_country_named_location details
graph_create_country_named_location details
[Microsoft Graph] Define a named location from a list of countries, for policies to refer to by name. Not destructive on its own. Country locations are what "block sign-ins from outside our countries" is built from, and the caution belongs with that use rather than with this call: country determination is by IP address, so a VPN or a mobile network routing through another country produces a false result in both directions, and a policy blocking every country except one will eventually block a genuine traveller. Countries are two-letter ISO codes.
graph_create_ip_named_location details
graph_create_ip_named_location details
[Microsoft Graph] Define a named location from IP ranges, for policies to refer to by name. Not destructive: until a policy references it this changes nothing. Be deliberate about isTrusted, which is the property that matters — a trusted location is treated as lower risk and is commonly what allows sign-ins to skip multifactor authentication, so marking a range trusted is a security decision rather than a label. Ranges are CIDR, and IPv4 and IPv6 are different @odata.types inside the array; a separate tool exists for country-based locations, which are a different object entirely.
graph_delete_authentication_context details
graph_delete_authentication_context details
[Microsoft Graph] Delete an authentication context. Destructive because the protection travels with it: an application or SharePoint site that was demanding step-up authentication through this context stops demanding anything, and nothing in that application announces the change. Check which policies target the context first, and prefer setting isAvailable to false if the intent is only to stop new use.
graph_delete_authentication_strength_policy details
graph_delete_authentication_strength_policy details
[Microsoft Graph] Delete a custom authentication strength policy. Destructive because of what depends on it: a Conditional Access policy requiring this strength loses the requirement, so sign-ins it was protecting proceed under whatever remains. Microsoft refuses to delete a strength that is still referenced, which is a genuine safeguard — treat that refusal as information rather than an obstacle, and find the referencing policy. Built-in strengths cannot be deleted at all.
graph_delete_conditional_access_policy details
graph_delete_conditional_access_policy details
[Microsoft Graph] Delete a Conditional Access policy permanently. There is no recycle bin for these and no version history: a policy representing months of accumulated exceptions is gone, and rebuilding it means rediscovering every exclusion the hard way. Disable it instead unless removal is genuinely intended — a disabled policy enforces nothing and can be turned back on in one call. Deleting a policy also silently REMOVES the protection it was providing, so anything it was blocking is permitted from that moment.
graph_delete_named_location details
graph_delete_named_location details
[Microsoft Graph] Delete a named location. Destructive beyond the object itself: any policy referencing it is affected, and a policy whose only location condition disappears may stop matching anything or start matching everything depending on whether the reference was an include or an exclude. List the policies and check for the location's id before deleting it — Graph will not warn you.
graph_get_authentication_strength_policy details
graph_get_authentication_strength_policy details
[Microsoft Graph] Get one authentication strength policy with its allowedCombinations — the exact method combinations that satisfy it. This is the read that answers whether a policy demanding "strong authentication" actually excludes the weak methods: a combination list containing sms or voice is not phishing-resistant however the policy is named, and the difference decides whether a token-theft attack succeeds.
graph_get_conditional_access_policy details
graph_get_conditional_access_policy details
[Microsoft Graph] Get one Conditional Access policy in full. Read it before every update, because the update REPLACES whole nested objects rather than merging inside them — sending a conditions object built from memory is how an exclusion list gets silently emptied. Two fields deserve the most attention: grantControls.operator, where OR means any single control suffices and AND means all of them, and the excludeUsers and excludeGroups arrays, which override every inclusion in the policy and are the usual explanation for a policy that is not applying to the account being investigated.
graph_get_named_location details
graph_get_named_location details
[Microsoft Graph] Get one named location with its full definition. The @odata.type distinguishes the two kinds that exist — an ipNamedLocation holds CIDR ranges, a countryNamedLocation holds country codes — and they are not interchangeable in an update, so read this before changing one. Read it before deleting one too: a location referenced by a live policy cannot simply be removed without changing what that policy does.
graph_list_authentication_contexts details
graph_list_authentication_contexts details
[Microsoft Graph] List the authentication context class references — the c1 to c25 labels that let an application ask for step-up authentication on a specific action rather than at sign-in. They are how a SharePoint site or a custom app requires fresh multifactor authentication for one sensitive operation. The isAvailable flag decides whether applications can see and request a context at all, so a context that appears configured but unavailable is defined and doing nothing.
graph_list_authentication_strength_policies details
graph_list_authentication_strength_policies details
[Microsoft Graph] List the authentication strength policies — the named combinations of methods a Conditional Access policy can demand, such as Microsoft's built-in phishing-resistant MFA. An authentication strength is the modern replacement for "require MFA": it says WHICH methods count, which matters because requiring MFA in general still accepts SMS, and SMS is the method an attacker defeats by moving a phone number. Built-in strengths cannot be modified; custom ones can be created and deleted here.
graph_list_conditional_access_policies details
graph_list_conditional_access_policies details
[Microsoft Graph] List every Conditional Access policy in the tenant with its conditions and grant controls. This is the complete answer to "what is actually enforcing sign-in security here", and the read to do ONCE and work from — the surface is rate-limited to roughly one request per second tenant-wide, so fetching policies individually in a loop gets throttled with no Retry-After to guide the wait. Read each policy's state first: enabled is live, disabled is inert, and enabledForReportingButNotEnforced logs what WOULD have happened without doing it, which is the state a tenant with impressive-looking policies is often entirely in.
graph_list_named_locations details
graph_list_named_locations details
[Microsoft Graph] List the named locations defined in the tenant — the IP ranges and countries that Conditional Access policies refer to by name. Two things worth reading rather than assuming: the isTrusted flag, because a trusted location is treated as lower risk and is frequently what allows sign-ins to skip multifactor authentication entirely, and whether the ranges still describe the customer's actual offices, since an office that moved leaves a range trusting somebody else's building.
graph_set_conditional_access_policy_state details
graph_set_conditional_access_policy_state details
[Microsoft Graph] Turn a Conditional Access policy on, off, or into report-only mode. A separate tool from the general update because it is both the most common change and the one with the largest effect for the smallest body — and because it is the emergency lever: disabling a policy is how a lockout in progress is stopped, and it works in seconds. The three states are enabled (live), disabled (inert), and enabledForReportingButNotEnforced (logs what it would have done). Moving a policy from report-only to enabled is the moment it starts blocking people, so read its report-only results first.
graph_update_conditional_access_policy details
graph_update_conditional_access_policy details
[Microsoft Graph] Update a Conditional Access policy's conditions or controls. The sharpest trap in this family: Graph merges at the TOP level only, so a conditions object sent here REPLACES the whole existing one — every exclusion not present in what you send is gone, break-glass account included, and the policy still looks correct in a summary. Read the policy first and send its conditions back with your change applied. To turn a policy on or off, use the dedicated state tool rather than this one.
graph_update_named_location details
graph_update_named_location details
[Microsoft Graph] Update a named location's ranges, countries or trusted flag. Destructive because the definition IS the state: every policy referencing this location changes behaviour immediately, without any of those policies being touched or reviewed. Adding a range to a TRUSTED location is the sharpest version — it can exempt a whole network from multifactor authentication with a change that reads like an inventory update. Supply ipRanges for an IP location or countries for a country location, matching what the location already is; the two are different object types and cannot be swapped by an update.
Administrative Units
graph_add_administrative_unit_member details
graph_add_administrative_unit_member details
[Microsoft Graph] Add a user, group or device to an administrative unit. Not destructive by the connector's standing rule — the matching removal undoes it — but be aware of what it means: everyone holding a scoped role on this unit immediately gains administrative power over the object just added, so adding a privileged account to a unit administered by a helpdesk is how a low-privilege administrator ends up able to reset a high-privilege password. Only works on a hand-curated unit; a dynamic unit's membership comes from its rule.
graph_add_administrative_unit_scoped_role details
graph_add_administrative_unit_scoped_role details
[Microsoft Graph] Grant somebody an administrative role limited to this unit's members. Destructive as every privilege grant in this connector is — it confers real administrative power and removing it later undoes nothing done with it — but this is the SAFER shape of that act, and the one to reach for instead of a tenant-wide grant: the same Helpdesk Administrator role bounded to one branch office rather than to everybody. Read the unit's membership first, because the membership is the true blast radius, and check it is not a dynamic unit whose rule could later pull in accounts nobody intended.
graph_create_administrative_unit details
graph_create_administrative_unit details
[Microsoft Graph] Create an administrative unit. Not destructive: an empty unit with no scoped administrators confers nothing on anybody. Decide the membership model at creation, because it cannot be changed afterwards — supplying a membership rule makes the unit DYNAMIC, and a dynamic unit refuses members added by hand for the rest of its life. Leave the rule empty for a unit whose membership will be curated. Setting isMemberManagementRestricted protects the unit's members from tenant-wide administrators, which is the right choice for executives or service accounts and the wrong one for an ordinary branch office.
graph_delete_administrative_unit details
graph_delete_administrative_unit details
[Microsoft Graph] Delete an administrative unit. The members themselves are untouched — users, groups and devices continue to exist — but every scoped role assignment on the unit disappears with it, so the administrators who could help those people can no longer do so, and nothing tells them why. Restoring the arrangement means recreating the unit, its membership and every scoped role. List the scoped role members first; that list is the thing that cannot be recovered.
graph_get_administrative_unit details
graph_get_administrative_unit details
[Microsoft Graph] Get one administrative unit, including its membership rule if it has one and its visibility. Read it before changing anything: a unit whose membershipType is dynamic cannot have members added by hand, and attempting it fails in a way that reads as a permissions problem rather than a configuration one. The isMemberManagementRestricted flag is the other property worth checking — a restricted unit protects its members from tenant-wide administrators, which is powerful and easy to forget when troubleshooting why an administrator cannot act on somebody.
graph_list_administrative_unit_members details
graph_list_administrative_unit_members details
[Microsoft Graph] List the users, groups and devices inside an administrative unit. This is the real answer to "who can the administrators scoped to this unit act on", and the read to do before granting anybody a scoped role — the unit's name says what somebody intended, its membership says what they actually built. For a dynamic unit this reflects the current evaluation of the rule, which can lag a recent attribute change by a few minutes.
graph_list_administrative_unit_scoped_role_members details
graph_list_administrative_unit_scoped_role_members details
[Microsoft Graph] List who holds an administrative role SCOPED to this unit — the people who can administer its members and nobody else. This is the read that completes a privileged-access review, because these administrators are invisible to a tenant-wide directory-role listing: somebody who is a Helpdesk Administrator over one branch office does not appear in the tenant's Helpdesk Administrator members at all. An offboarding review that checks only tenant-wide roles misses every one of them.
graph_list_administrative_units details
graph_list_administrative_units details
[Microsoft Graph] List the administrative units in a directory — the containers that let administrative power be scoped to part of the tenant rather than all of it. A tenant with none is one where every administrator is a tenant-wide administrator, which is worth noticing during a security review. Read membershipType on each: dynamic means the unit recalculates itself from a rule, so its membership is not something anybody curates by hand.
graph_remove_administrative_unit_member details
graph_remove_administrative_unit_member details
[Microsoft Graph] Remove a user, group or device from an administrative unit. The object itself is not deleted — only its membership — but the administrators scoped to this unit lose the ability to act on it immediately, which for a helpdesk arrangement means the person can no longer be helped by the team that supports them. Destructive by the standing access-removal rule.
graph_remove_administrative_unit_scoped_role details
graph_remove_administrative_unit_scoped_role details
[Microsoft Graph] Revoke somebody's administrative role over this unit. The offboarding step that a tenant-wide role review will never prompt, because a scoped administrator does not appear in the tenant's directory-role membership at all — the scoped-role listing on each unit is the only place they are visible. Takes the scoped role membership's own id rather than a person and a role, since one person can hold several scoped roles on one unit.
graph_update_administrative_unit details
graph_update_administrative_unit details
[Microsoft Graph] Update an administrative unit's name, description or visibility. Not destructive — none of these change who is in the unit or who administers it. The membership RULE is deliberately not editable here and has its own tool, because changing a rule moves people in and out of administrative scope, which is a different kind of act from renaming a container.
graph_update_administrative_unit_membership_rule details
graph_update_administrative_unit_membership_rule details
[Microsoft Graph] Change the membership rule of a dynamic administrative unit. Destructive because the rule IS the membership: there is no list to review before it takes effect, people move in and out as Entra re-evaluates, and everyone scoped to administer this unit gains or loses authority over them accordingly. A rule that matches nobody looks identical to one still processing, so verify against the member listing rather than assuming success. Only works on a unit created as dynamic — a hand-curated unit cannot be converted.
Devices
graph_add_device_registered_owner details
graph_add_device_registered_owner details
[Microsoft Graph] Register a user as an OWNER of a device. Additive, and undone by the matching removal — but understand what it grants before using it: by default the registered owner can self-service retrieve the device's BITLOCKER RECOVERY KEY (unless the tenant has enabled the restriction blocking non-admin key access), which is the key to an encrypted disk. This is an access grant, not a bookkeeping label. It does NOT change the machine's local Administrators group — Microsoft populates that at join time only. Use graph_add_device_registered_user for somebody who merely needs to sign in.
graph_add_device_registered_user details
graph_add_device_registered_user details
[Microsoft Graph] Register a user on a device — the record that this person uses this machine. Additive and reversible, and NOT the same as ownership: a registered user has signed in, an owner administers the machine and holds local administrator rights on it. Use graph_add_device_registered_owner when the intent is to make somebody responsible for the endpoint.
graph_delete_device details
graph_delete_device details
[Microsoft Graph] Delete a device object from the directory. The machine itself is untouched — this removes its identity, not its data — but everything that identity was doing stops: it no longer satisfies any Conditional Access device condition, it drops out of every group it was a member of, and BitLocker recovery keys escrowed against the object go with it, which is the loss people discover months later at the worst moment. Read the recovery keys out first if the disk is encrypted. Deleted device objects are recoverable for 30 days through the deleted-items surface. For a machine you want to keep but stop trusting, graph_set_device_account_enabled is the reversible answer.
graph_get_device details
graph_get_device details
[Microsoft Graph] Get one device object in full — operating system and version, join and trust type, management authority, compliance flag and when it last signed in. Note the two identifiers this resource carries: the OBJECT id, which every tool here takes, and the deviceId, which is the value Intune and the Windows client report and therefore the one somebody reading from a device itself will have. Confusing them produces a not-found that looks like the device is missing from the directory.
graph_list_device_memberships details
graph_list_device_memberships details
[Microsoft Graph] List the groups and administrative units a device belongs to DIRECTLY. Device group membership is what most policy targeting is built on — Intune configuration profiles, compliance policies and Conditional Access device filters all resolve through these groups — so this is the first read when a policy is not reaching a machine. Direct membership only; a device inside a nested group appears here under the group it was added to, not the parent.
graph_list_device_registered_owners details
graph_list_device_registered_owners details
[Microsoft Graph] List the registered OWNERS of a device — normally the person who joined it to the directory. The owner is not merely a label: on an Entra-joined Windows machine the registered owner is granted local administrator rights on it by default, which makes this list a genuine privilege read. A device whose owner has left the company, or one owned by somebody who never used it, is worth investigating rather than tidying away.
graph_list_device_registered_users details
graph_list_device_registered_users details
[Microsoft Graph] List the users registered on a device — everyone who has signed in and established a device registration, which on a shared machine is a longer list than anyone expects. Distinct from the owners: a registered user has used the device, an owner administers it. This is the read for "who has actually been on this laptop", and the one that turns a lost-device report into a list of the accounts whose sessions should be revoked.
graph_list_device_transitive_memberships details
graph_list_device_transitive_memberships details
[Microsoft Graph] List every group and administrative unit a device belongs to, INCLUDING through nesting. This is the one to use when a policy is or is not applying and the direct listing does not explain it: a device three levels down a group hierarchy is targeted by a policy aimed at the top, and only this read shows that. The usual finding is the reverse of what people expect — a machine is caught by a policy through a nested group nobody remembered existed.
graph_list_devices details
graph_list_devices details
[Microsoft Graph] List the devices registered in a directory. The three properties that decide what a device actually IS are trustType, isCompliant and approximateLastSignInDateTime. trustType distinguishes a fully Entra-joined corporate machine (AzureAd) from a hybrid-joined one (ServerAd) and from a personal device someone registered (Workplace) — and a Workplace device holding corporate data is a finding in most tenants. Filtering on approximateLastSignInDateTime is how stale objects are found: a directory accumulates devices that were rebuilt or thrown away years ago, and each is a credential that still exists.
graph_remove_device_registered_owner details
graph_remove_device_registered_owner details
[Microsoft Graph] Remove a user's OWNER registration on a device — the inverse of adding one, and destructive because it withdraws the local administrator rights an Entra-joined Windows machine grants its registered owner. The person is not told; they discover it the next time something needs elevation. Removing the last owner leaves a device nobody administers, which Microsoft permits and which is worth checking against graph_list_device_registered_owners first.
graph_remove_device_registered_user details
graph_remove_device_registered_user details
[Microsoft Graph] Remove a user's registration on a device. Destructive because on an Entra-joined machine the registration is what backs that user's device-based access from it, so removing it can stop them working from a laptop that still looks fine to them. This is the deliberate step when somebody hands a machine on to a colleague, and the read that tells you who is on it is graph_list_device_registered_users.
graph_set_device_account_enabled details
graph_set_device_account_enabled details
[Microsoft Graph] Enable or disable a device's directory account. DESTRUCTIVE when disabling, and the reason is worth understanding before using it: a disabled device object stops satisfying Conditional Access device conditions, so a policy requiring a compliant or hybrid-joined device blocks every sign-in FROM that machine — the person at the keyboard sees their work accounts stop working with no explanation, and nothing on the device says why. That is also what makes it the right immediate action on a machine reported lost. It is reversible by enabling the device again, but the interruption is real and the user is not notified either way. Separate from graph_update_device on purpose: this one property is the whole difference between relabelling a record and locking somebody out.
graph_update_device details
graph_update_device details
[Microsoft Graph] Update a device object's descriptive properties — its display name, operating system and version. Not destructive: it relabels a directory record and takes no access away from anybody. Note what Graph will NOT let you set here even though the properties exist on the resource: isCompliant and isManaged are writable only by Intune or an approved MDM app, so an attempt to mark a machine compliant from this tool is refused rather than honoured. Use graph_set_device_account_enabled for the account state, which is a separate operation because its blast radius is completely different.
Intune Devices
graph_bypass_activation_lock details
graph_bypass_activation_lock details
[Microsoft Graph] Remove Apple's Activation Lock from a supervised device so it can be set up under a different Apple Account. This is the action for reclaiming a company-owned Mac, iPhone or iPad from a departed employee, and it is irreversible — the previous owner's claim on the hardware is gone. Only defensible on company-owned devices, and the corresponding bypass code stored on the device record is a credential in its own right.
graph_clean_windows_device details
graph_clean_windows_device details
[Microsoft Graph] Reset a Windows device to its factory settings, the 'Autopilot Reset / fresh start' action. keepUserData is REQUIRED here rather than optional, because it is the whole difference between removing the machine's installed applications and settings while the person keeps their files, and erasing the person's files with them. There is no undo either way, and the device is unusable while it rebuilds. Windows only.
graph_create_device_category details
graph_create_device_category details
[Microsoft Graph] Create an Intune device category. Additive and reversible — nothing is targeted by a category until a device is placed in it or a dynamic group rule names it. Write the description as the enrolling user will read it, because on tenants with category mapping enabled that text is the prompt they answer during enrolment.
graph_delete_device_category details
graph_delete_device_category details
[Microsoft Graph] Delete an Intune device category. Destructive for a reason that is invisible at the moment of deletion: every device currently in the category loses it, so any dynamic Entra group whose rule matched that category empties, and every policy and application targeted through that group stops reaching those machines. The devices keep working and simply stop being managed the way somebody intended. List the category's devices and the tenant's dynamic rules before removing one.
graph_delete_managed_device details
graph_delete_managed_device details
[Microsoft Graph] Delete a device's RECORD from Intune. This removes the object from the console and nothing else: the device is not wiped, not retired and not unenrolled, so a machine that is still checking in simply reappears at its next sync while keeping every policy it already had. That makes this the tool for tidying stale records of machines that no longer exist, and the wrong tool for removing a device from management — retire does that. Compliance and reporting history for the record are lost.
graph_delete_user_from_shared_apple_device details
graph_delete_user_from_shared_apple_device details
graph_disable_managed_device_lost_mode details
graph_disable_managed_device_lost_mode details
[Microsoft Graph] Turn off Lost Mode on a supervised Apple device, returning it to ordinary use and ending the location tracking that Lost Mode enables. Destructive because it removes a protection rather than adding one: a device taken out of Lost Mode while it is still missing becomes usable by whoever has it, and stops reporting where it is. Confirm the device is genuinely back in the right hands first.
graph_get_detected_app details
graph_get_detected_app details
[Microsoft Graph] Get one detected application — its display name, version, publisher, size and the number of devices reporting it. Intune treats each VERSION as its own detected application, so the same product appears many times across a fleet and 'how many devices have this app' is really the sum over its versions. That is the detail that makes an audit count look wrong when it is not.
graph_get_device_category details
graph_get_device_category details
[Microsoft Graph] Get one Intune device category by id — its display name and description. The description is what the user sees when Intune asks them to pick a category during enrolment, so it is worth reading before changing it: a category whose description no longer matches its intended use quietly steers self-enrolling users into the wrong policy set.
graph_get_managed_device details
graph_get_managed_device details
[Microsoft Graph] Get one Intune-managed device in full — hardware, operating system, storage, compliance and encryption state, enrolment details and the results of any remote actions already sent to it (deviceActionResults). SECURITY NOTE: a handful of properties are withheld from the list view and returned only when named in select — activationLockBypassCode, udid, iccid, ethernetMacAddress, notes and remoteAssistanceSessionUrl. activationLockBypassCode is a working credential: whoever has it can remove an Apple device from its owner's Activation Lock, so ask for it only when that is the task. Use azureADDeviceId to cross-reference this machine with its Entra directory object.
graph_get_managed_device_category details
graph_get_managed_device_category details
[Microsoft Graph] Get the device category assigned to one Intune-managed device. Categories are the tenant's own taxonomy — 'Laptop', 'Warehouse scanner', 'Executive' — and they matter beyond labelling because dynamic Entra groups commonly key on deviceCategory, which then drives policy and application targeting. A device that landed in the wrong category is targeted by the wrong policies.
graph_get_managed_device_protection_state details
graph_get_managed_device_protection_state details
[Microsoft Graph] Get the Microsoft Defender protection state of a Windows device — real-time protection status, network inspection, signature version and age, malware protection enablement, last quick and full scan times, and whether a reboot is required to finish remediation. This is the read that answers 'is antivirus actually working on this machine', as opposed to 'is a policy assigned to it'. Signature age is the value most worth checking: a device with protection enabled but signatures weeks old is unprotected in practice.
graph_list_detected_app_devices details
graph_list_detected_app_devices details
[Microsoft Graph] List the managed devices reporting a particular detected application. This is the other half of a software audit: the detected-app list says how many machines carry a version, and this says WHICH ones, which is what turns 'forty devices still run the vulnerable release' into a remediation list. Each entry is a full managed device, so the compliance state and last check-in needed to plan the work are already here.
graph_list_detected_apps details
graph_list_detected_apps details
[Microsoft Graph] List the applications Intune has DETECTED across the enrolled fleet, with a device count for each. Detected apps are what the devices actually report as installed, which is a different question from what Intune was asked to deploy — so this is the inventory read behind software-audit and unwanted-software work, and the fastest way to find how many machines still carry a version with a known vulnerability. Detection runs on the device check-in cycle, so a freshly installed application appears here on a delay rather than immediately.
graph_list_device_categories details
graph_list_device_categories details
[Microsoft Graph] List the Intune device categories defined in a tenant. Categories are the tenant's own device taxonomy, offered to the user during enrolment when category mapping is switched on, and commonly used as the rule property behind dynamic Entra device groups — which is what makes them a targeting mechanism rather than a label. Read these before assigning one to a device, because the assignment matches on the category's display name.
graph_list_managed_device_log_collections details
graph_list_managed_device_log_collections details
[Microsoft Graph] List the diagnostic log collection requests raised against an Intune-managed device, with each request's status, size, the time it was requested and when it expires. Intune's collected logs are retained for a limited window, so an expired request explains a missing download far more often than a failure does. Useful when reconstructing what an earlier technician already gathered before asking the customer for it again.
graph_list_managed_device_users details
graph_list_managed_device_users details
[Microsoft Graph] List the primary users associated with an Intune-managed device. The primary user is what Intune uses to decide which user-targeted policies and applications reach the machine, so a device with the wrong primary user quietly receives the wrong software — a common cause of 'the app never installed' where nothing appears to be failing. On a shared or kiosk device this list is legitimately empty.
graph_list_managed_devices details
graph_list_managed_devices details
[Microsoft Graph] List the devices enrolled in Intune. This is the fleet read every other Intune answer starts from. The properties worth filtering on: complianceState (compliant / noncompliant / inGracePeriod / error — 'error' means Intune could not evaluate the device rather than that it failed), lastSyncDateTime (a device that has not checked in for weeks is not being managed, whatever its stored compliance says), isEncrypted, osVersion and managedDeviceOwnerType (company or personal). Filter supports 'eq' and 'or' on complianceState, managementAgent, ownerType and jailBroken, and 'lt'/'gt' on enrolledDateTime and lastSyncDateTime.
graph_locate_managed_device details
graph_locate_managed_device details
[Microsoft Graph] Ask a supervised iOS/iPadOS or macOS device to report its location. The action only requests the fix; the coordinates arrive asynchronously and are read afterwards from the device's own record, so a location is not in this response. Supervised Apple devices only — an unsupervised or Windows device refuses. Locating someone's device is a privacy-sensitive act even when the device is company-owned, and on personally-owned hardware it is usually one the person must be told about.
graph_logout_shared_apple_device_user details
graph_logout_shared_apple_device_user details
graph_reboot_managed_device details
graph_reboot_managed_device details
[Microsoft Graph] Restart a device now. There is no grace period, no prompt and no way for the person using it to defer: unsaved work is lost, and a call, meeting or long-running job ends mid-sentence. That is why an action this ordinary-sounding is flagged destructive — the damage is somebody's afternoon rather than their data, and it cannot be recalled once sent. Schedule reboots through an update ring or a configuration profile when the goal is maintenance rather than an emergency.
graph_recover_managed_device_passcode details
graph_recover_managed_device_passcode details
[Microsoft Graph] Ask a supervised device to surrender its current passcode to Intune. The v1.0 action returns no body — the recovered passcode is retrieved from Intune afterwards, not from this response. Treated as destructive rather than as a read because it disarms a person's own protection on their device: after this runs, the passcode is knowable by whoever can see the tenant's Intune data, and the person is not told. Supervised devices only.
graph_remote_lock_managed_device details
graph_remote_lock_managed_device details
[Microsoft Graph] Lock a device remotely so it requires its passcode to be used again. The first action for a device reported lost or stolen, and reversible only by whoever knows the passcode — which means locking a device whose owner has forgotten theirs, or one with no passcode set, strands it until a passcode reset or a wipe. There is no unlock action; that is why this is flagged destructive despite sounding mild.
graph_request_remote_assistance details
graph_request_remote_assistance details
[Microsoft Graph] Request a remote-assistance session for a device. The action creates the session; the resulting connection URL is not in this response — it lands on the device record as remoteAssistanceSessionUrl, which is one of the properties returned only when explicitly selected on a device get. A session still needs the person at the far end to accept it, so nothing here connects to anybody unattended.
graph_reset_managed_device_passcode details
graph_reset_managed_device_passcode details
[Microsoft Graph] Remove or reset the passcode on a device. On iOS the existing passcode is cleared and the person sets a new one; on Android a new passcode is generated and delivered to the device. Destructive because the person loses access with no warning until they are told the new arrangement, and on some platforms clearing the passcode also invalidates data protected by it. This action does NOT return a passcode in its response.
graph_retire_managed_device details
graph_retire_managed_device details
[Microsoft Graph] Unenrol a device from Intune, removing company data, policies, certificates, Wi-Fi and VPN profiles and company applications while leaving the person's own data in place. This is the correct offboarding action for a personally-owned device, and the wrong one for a lost machine — retire leaves the user's data on it. Destructive and unrecallable: company applications and their data are removed, the device stops receiving policy, and re-enrolling it is a fresh enrolment rather than an undo.
graph_shut_down_managed_device details
graph_shut_down_managed_device details
[Microsoft Graph] Power a device off immediately. Worse than a reboot in one specific way that matters for remote work: a device that is off cannot check in, so it receives no further Intune action — including the one that would undo this — until somebody physically turns it back on. Unsaved work is lost. Use it when a machine must stop right now, not as a tidy-up.
graph_sync_managed_device details
graph_sync_managed_device details
[Microsoft Graph] Ask a device to check in with Intune immediately rather than waiting for its scheduled cycle. This is the first troubleshooting step for 'the policy has not applied yet' and it is safe to repeat — nothing is removed, nothing is reset, the device simply pulls its assignments early. It is a request rather than a guarantee: a device that is offline, asleep or out of battery receives it when it next reaches the service.
graph_update_device_category details
graph_update_device_category details
[Microsoft Graph] Update an Intune device category's name or description. Renaming is not cosmetic when dynamic Entra group rules match on the category's display name: the rule keeps matching the OLD string, so the devices in the renamed category silently drop out of the group and lose whatever it targeted. Check the tenant's dynamic device rules before renaming one.
graph_update_managed_device details
graph_update_managed_device details
[Microsoft Graph] Update the two properties Intune lets an administrator write on a managed device: managedDeviceName, the friendly name shown throughout the console, and notes. Everything else on a managed device is reported BY the device and is read-only here — a rename does not reach the machine, it renames the record. Notes are the field worth using: they survive re-enrolment of the same record and are where 'shipped to the Denver office, do not wipe' belongs.
graph_windows_defender_scan details
graph_windows_defender_scan details
[Microsoft Graph] Start a Microsoft Defender scan on a Windows device. quickScan true runs the quick scan — minutes, the usual choice, and what to send when responding to an alert; false runs a full scan, which reads every file on the disk, takes hours and is noticeably felt by whoever is using the machine. Scanning finds and quarantines threats but changes no configuration, so this is a non-destructive write; the disruption is performance, not data.
graph_windows_defender_update_signatures details
graph_windows_defender_update_signatures details
[Microsoft Graph] Tell a Windows device to update its Microsoft Defender malware signatures now. Pair it with the protection-state read: a device whose signature age is measured in weeks is running antivirus that cannot see anything recent, and this is the cheapest remedy. Safe and repeatable — it downloads definitions and does not touch policy, files or the user's session.
graph_wipe_managed_device details
graph_wipe_managed_device details
[Microsoft Graph] FACTORY-RESET a device. By default this erases everything on it — the user's documents, photographs and accounts as well as the company's — and it cannot be undone or recalled once the device checks in. Use retire instead when the intent is to remove company data and management from a device someone owns personally. keepUserData true performs the reset while preserving the user's data where the platform supports it; keepEnrollmentData true keeps the device enrolled so it re-provisions rather than returning to out-of-box. Omitting both means a full wipe. macOsUnlockCode is the six-digit PIN a Mac will require afterwards — record it before sending, because a wiped Mac without it can be unrecoverable.
Intune Configuration
graph_assign_device_compliance_policy details
graph_assign_device_compliance_policy details
[Microsoft Graph] Set which groups a compliance policy applies to. THIS REPLACES THE ENTIRE ASSIGNMENT LIST — anything not included is removed, and the devices in a removed group stop being measured. Each entry needs a target with an @odata.type: #microsoft.graph.groupAssignmentTarget with a groupId, #microsoft.graph.exclusionGroupAssignmentTarget, or #microsoft.graph.allDevicesAssignmentTarget. Destructive in both directions: adding a group can make a large number of people non-compliant at once and lock them out through Conditional Access, and removing one silently stops enforcing a control.
graph_assign_device_configuration details
graph_assign_device_configuration details
[Microsoft Graph] Set which groups a configuration profile applies to. THIS REPLACES THE ENTIRE ASSIGNMENT LIST — a group you do not include is a group you have removed, and every device in it loses the profile. List the current assignments first and send them back alongside whatever you are adding. Each entry needs a target with an @odata.type: #microsoft.graph.groupAssignmentTarget with a groupId, #microsoft.graph.exclusionGroupAssignmentTarget to exclude one, or #microsoft.graph.allDevicesAssignmentTarget for everything. Destructive because there is no list to review afterwards and hundreds of devices change at once.
graph_create_device_compliance_policy details
graph_create_device_compliance_policy details
[Microsoft Graph] Create an Intune compliance policy. The body is the whole policy as JSON and must carry an @odata.type such as #microsoft.graph.windows10CompliancePolicy or #microsoft.graph.iosCompliancePolicy, plus displayName and that type's rules. Microsoft also requires scheduledActionsForRule on creation for the per-platform policies — a policy with no scheduled action is rejected, and the usual minimum is a single block action with a grace period. Additive: a new policy judges nothing until it is assigned.
graph_create_device_configuration details
graph_create_device_configuration details
[Microsoft Graph] Create an Intune configuration profile. The body is the whole profile as JSON because the shape depends entirely on which platform and profile kind you are creating: it MUST carry an @odata.type such as #microsoft.graph.windows10GeneralConfiguration or #microsoft.graph.iosGeneralDeviceConfiguration, plus displayName and the root-level settings that type defines. Get an existing profile of the same type first and use its response as the template. Additive and reversible — a new profile reaches no device until it is assigned.
graph_delete_device_compliance_policy details
graph_delete_device_compliance_policy details
[Microsoft Graph] Delete an Intune compliance policy. Every device it judged stops being judged by it, and the effect on access is not the obvious one: depending on the tenant's 'mark devices with no compliance policy as' setting, machines that were correctly failing can become COMPLIANT the moment the policy is gone, and Conditional Access then lets them straight through. Deleting a policy to stop an outage can therefore silently disable the control it was enforcing. There is no undo.
graph_delete_device_configuration details
graph_delete_device_configuration details
[Microsoft Graph] Delete an Intune configuration profile. Every device it was applied to loses the settings it carried at the next check-in, and what happens then depends on the setting: some revert to a platform default, some simply stay as they were with nothing enforcing them any more. The second case is the dangerous one — a deleted encryption or firewall profile leaves machines that LOOK configured while nothing maintains it. There is no undo and no recycle bin. Read the profile and its assignments first.
graph_get_device_compliance_device_overview details
graph_get_device_compliance_device_overview details
[Microsoft Graph] Get the device-level summary for a compliance policy — compliant, non-compliant, error, conflict, not-applicable and pending counts in one object. The single cheapest read for 'how compliant is this customer', and the right one to poll: the per-device list would page through the whole fleet to produce the same numbers, against a throttle budget shared with everything else the tenant runs.
graph_get_device_compliance_policy details
graph_get_device_compliance_policy details
[Microsoft Graph] Get one Intune compliance policy in full, with every rule it evaluates. As with configuration profiles, the response is the shape a create body takes for that @odata.type, so this is the read to run before authoring a similar policy. What it does NOT include is the scheduled actions — the grace period and what happens when it expires live on a separate relationship and are read separately.
graph_get_device_compliance_user_overview details
graph_get_device_compliance_user_overview details
[Microsoft Graph] Get the user-level summary for a compliance policy — the same verdict counts aggregated by person rather than by machine. Use it alongside the device summary when reporting to a customer: the device number describes the estate, the user number describes how many of their staff are affected, and those are the two different questions an account manager and an engineer are each asking.
graph_get_device_configuration details
graph_get_device_configuration details
[Microsoft Graph] Get one Intune configuration profile in full, including every setting it carries. This is the read to run BEFORE creating a similar profile: the response is exactly the shape a create body takes for that @odata.type, which saves guessing at a polymorphic schema. Note that secret settings are not returned in plain text here — an OMA-URI secret comes back as a reference id rather than its value.
graph_get_device_configuration_device_overview details
graph_get_device_configuration_device_overview details
[Microsoft Graph] Get the device-level rollout summary for a configuration profile — the counts of succeeded, error, conflict, not-applicable and pending devices in one small object. Read this first when asked how a deployment is going: it answers the question in a single request, where the per-device list would page through thousands of rows to reach the same four numbers. 'Not applicable' is normal rather than a fault — it counts devices the profile does not target, such as a Windows profile reaching an iPhone in a mixed group.
graph_get_device_configuration_user_overview details
graph_get_device_configuration_user_overview details
[Microsoft Graph] Get the user-level rollout summary for a configuration profile — succeeded, error, conflict, not-applicable and pending counted by PERSON rather than by machine. The two summaries disagree on any tenant where people have more than one device, and the disagreement is informative: a small user-error count beside a large device-error count usually means a handful of people with several broken machines each, which is a different investigation from many people with one.
graph_get_oma_setting_secret details
graph_get_oma_setting_secret details
[Microsoft Graph] Return the PLAIN-TEXT SECRET behind an encrypted OMA-URI setting in a Windows custom configuration profile — typically a VPN pre-shared key, a Wi-Fi passphrase or a certificate password. Understand what this hands the caller: the value is the credential itself, it is the one thing the Intune console deliberately hides after it is saved, and anyone holding it can join the network or use the certificate it protects from anywhere, with no Intune role and no audit trail of their own. Marked DESTRUCTIVE even though it changes nothing, because it DISCLOSES a credential — that classification is deliberate and must not be "fixed" to read-only. Do not put the value in a chat transcript, a ticket or a log. Get the secretReferenceValueId from the profile's omaSettings via graph_get_device_configuration; only settings with isEncrypted true have one.
graph_list_device_compliance_device_statuses details
graph_list_device_compliance_device_statuses details
[Microsoft Graph] List each targeted device's verdict against a compliance policy, with the device name and when it last reported. The status to read carefully is 'inGracePeriod': the device has FAILED the policy but is still allowed through Conditional Access until its grace period expires, so a fleet that looks compliant today can lock a customer's staff out on a date nobody has written down. 'Error' means Intune could not evaluate the device at all, which is a different problem from failing.
graph_list_device_compliance_policies details
graph_list_device_compliance_policies details
[Microsoft Graph] List the Intune device compliance policies in a tenant — the policies that MEASURE whether a device meets the rules, as opposed to configuration profiles, which set them. Compliance is only half a control on its own: the verdict matters because Conditional Access consumes it, so a tenant with strict compliance policies and no Conditional Access rule requiring compliance is measuring without enforcing. Reads the CLASSIC compliance surface; policies built on the newer settings-catalog-style compliance endpoint are not visible here, so an empty result is not proof there are none.
graph_list_device_compliance_policy_assignments details
graph_list_device_compliance_policy_assignments details
[Microsoft Graph] List the groups a compliance policy is assigned to, including exclusions. Read this before assigning, because assignment replaces the whole list. It also answers a question that looks like a bug: a device reported compliant when nobody expected it to be is usually a device no compliance policy targets at all, and whether an untargeted device counts as compliant depends on the tenant's 'mark devices with no compliance policy as' setting.
graph_list_device_compliance_scheduled_actions details
graph_list_device_compliance_scheduled_actions details
[Microsoft Graph] List the scheduled actions attached to a compliance policy — what Intune does when a device fails, and how long it waits first. This is where the grace period actually lives, and it is the read that turns a non-compliance report into a date: an action configured to block after 3 days means the devices sitting in grace today lose access on a specific morning. Actions can also email the user or retire the device, so this read is how you find out whether a policy will send mail to a customer's staff before it does.
graph_list_device_compliance_user_statuses details
graph_list_device_compliance_user_statuses details
[Microsoft Graph] List each targeted user's aggregated verdict against a compliance policy. This is the view that predicts who is about to be locked out, because Conditional Access blocks a PERSON on a non-compliant device rather than blocking the device in the abstract. Somebody whose only machine is failing is an outage waiting to happen; somebody with three machines and one failure is not.
graph_list_device_configuration_assignments details
graph_list_device_configuration_assignments details
[Microsoft Graph] List the groups a configuration profile is assigned to, including whether each assignment INCLUDES or EXCLUDES that group. Run this before any assign call: assigning replaces the whole list, so this response is the only record of what would be lost. It is also the first read when a setting is not reaching a machine — a profile assigned to a group the device is not in explains far more failures than a broken setting does.
graph_list_device_configuration_device_statuses details
graph_list_device_configuration_device_statuses details
[Microsoft Graph] List how a configuration profile landed on each targeted DEVICE — succeeded, pending, error or conflict, with the device name and the time it last reported. 'Conflict' is the value worth hunting: it means two profiles set the same setting to different values, and Intune applies neither, so the setting is silently absent rather than wrong. Pending on a device that has not checked in recently is a sync problem, not a policy problem.
graph_list_device_configuration_user_statuses details
graph_list_device_configuration_user_statuses details
[Microsoft Graph] List how a configuration profile landed for each targeted USER, aggregated across all of that person's devices. Distinct from the per-device view and worth reading when a profile is user-targeted rather than device-targeted: somebody with one working laptop and one failing tablet appears as a failure here and as a mixed result there, and only the pair tells you which machine to look at.
graph_list_device_configurations details
graph_list_device_configurations details
[Microsoft Graph] List the Intune device configuration profiles in a tenant — the profiles that SET things on devices, as opposed to compliance policies, which measure them. Each entry's @odata.type is the property that matters most: it names the platform and profile kind, and it is what a create body must repeat. IMPORTANT: this reads the CLASSIC configuration surface. Profiles built with the newer settings catalog live on a different endpoint that is not yet available in the stable API, so a tenant that standardised on the settings catalog will look empty here while its Intune console is full — an empty result is not proof there are no profiles.
graph_update_device_compliance_policy details
graph_update_device_compliance_policy details
[Microsoft Graph] Update an Intune compliance policy. PATCH merges, so absent properties are left alone, but the body must repeat the policy's @odata.type or Graph cannot resolve the derived type. Tightening a rule re-evaluates every targeted device at its next check-in, so an edit that looks small can move a large number of machines to non-compliant — and from there into whatever Conditional Access does about it. Read the device summary before and after.
graph_update_device_configuration details
graph_update_device_configuration details
[Microsoft Graph] Update an Intune configuration profile. Graph PATCH is a merge, so properties absent from the body are left alone and an explicit null clears one — but the body must still repeat the profile's @odata.type, or Graph cannot tell which derived type it is being asked to modify and refuses. Changing a setting takes effect on each device at its next check-in, so a profile edited now is applied over hours rather than immediately.
Identity Protection
graph_confirm_users_compromised details
graph_confirm_users_compromised details
[Microsoft Graph] Tell Entra ID Protection that these accounts really were compromised, setting each to confirmedCompromised at high risk. Not destructive — it changes Microsoft's verdict rather than the account, is undone by dismissing the risk, and revokes no access on its own. What it DOES do is twofold and worth intending: it feeds Microsoft's model so similar activity is scored higher in future, and it can trigger any risk-based Conditional Access policy the tenant has, which may immediately force a password reset or block sign-in. Confirming compromise is NOT containment on its own — revoking sessions and resetting the password are separate tools. Takes a comma-separated batch, which is one call rather than one per user on a surface limited to roughly 1 request per second.
graph_dismiss_user_risk details
graph_dismiss_user_risk details
[Microsoft Graph] Dismiss the risk on these accounts, setting each to dismissed at none. Not destructive — it is the inverse of confirming compromise, is itself reversible, and the underlying risk detections remain readable afterwards, so no evidence is lost. The consequence to intend: any risk-based Conditional Access policy keying on this user's risk stops applying, so an account that was being forced through a password reset or blocked will sign in normally again. Dismiss when the activity has been investigated and explained (a known trip abroad, a corporate VPN egress), not to clear a list. Takes a comma-separated batch.
graph_get_risk_detection details
graph_get_risk_detection details
[Microsoft Graph] Get one risk detection event in full — the detection type and its source, the IP address and resolved location, the client application, and the sign-in or user it was raised against. This is the evidence record behind a risky-user verdict, and the level of detail a customer asks for when they want to know why an account was flagged.
graph_get_risky_user details
graph_get_risky_user details
[Microsoft Graph] Get one account's current risk verdict — level, state, detail and when it was last updated. The riskDetail field is the one worth reading closely: it records WHY the state is what it is, including whether an administrator confirmed the compromise, dismissed it, or whether the user remediated it themselves by a password change or an MFA prompt. That distinction decides whether an atRisk account is an open incident or a closed one.
graph_list_risk_detections details
graph_list_risk_detections details
[Microsoft Graph] List individual risk detection events — one row per thing Microsoft noticed, with the detection type, the IP address, the location and the activity it was attached to. Distinct from the risky-users list, which is the account-level verdict accumulated from these. Note that detectionTimingType separates realtime detections (evaluated during the sign-in, so a Conditional Access policy could act on them) from offline ones (found afterwards by correlation, so nothing was blocked at the time) — an offline detection on a successful sign-in means the session already happened. Requires Entra ID P2 for the full list. Rate-limited to roughly 1 request per second tenant-wide with NO Retry-After header.
graph_list_risky_user_history details
graph_list_risky_user_history details
[Microsoft Graph] List how one account's risk state changed over time — every transition, what caused it, and the activity behind it. This is the read that turns "this account is at risk" into a timeline: when risk was first raised, whether the user remediated it themselves, whether an administrator dismissed it, and whether it came back afterwards. Risk that is dismissed and returns within days is the pattern worth escalating, and it is only visible here.
graph_list_risky_users details
graph_list_risky_users details
[Microsoft Graph] List the accounts Entra ID Protection currently considers at risk. Read riskLevel together with riskState, because riskLevel alone is misleading: a 'high' risk that was already remediated or dismissed is history, and the accounts that need attention are the ones whose riskState is atRisk or confirmedCompromised. Filter on those rather than on level — "riskState eq 'atRisk'" is the real worklist. Requires Entra ID P2 for full detail; a P1 or unlicensed tenant returns little or nothing, which is indistinguishable from a genuinely clean tenant. Rate-limited to roughly 1 request per second tenant-wide with NO Retry-After header.
Audit Logs
graph_get_directory_audit details
graph_get_directory_audit details
[Microsoft Graph] Get one directory audit event in full — the initiator, the category and result, and the targetResources array with the OLD and NEW values of every property that changed. That last part is what the list view does not give you and what makes this the tool for reconstructing a specific change: it shows what a setting was before somebody altered it, which is the answer needed to put it back.
graph_get_sign_in details
graph_get_sign_in details
[Microsoft Graph] Get one sign-in event in full — the account and application, the client and device, the resolved location, the authentication methods that were satisfied, and every Conditional Access policy that was evaluated with the decision each reached. This is the record to pull when a customer asks why a specific sign-in was blocked or, more often, why one that should have been blocked was not. Carries the sign-in-log permission rather than the general audit one.
graph_list_directory_audits details
graph_list_directory_audits details
[Microsoft Graph] List directory audit events — every administrative change made in the tenant, with who made it, what it targeted and whether it succeeded. This is the read that answers "who added that account to Global Administrator" and "when did this policy change". Filter server-side: the collection is enormous, and activityDateTime plus activityDisplayName are the fields that narrow it, for example "activityDateTime ge 2026-08-01T00:00:00Z". Note that initiatedBy can be a USER or an APPLICATION, and a change attributed to an application is a service principal acting on its own — often the more interesting finding. Retention is 7 days without a premium licence and 30 days with Entra ID P1 or P2; older events are gone rather than hidden, so an empty result is usually retention rather than innocence. Throttled at roughly 5 requests per 10 seconds per tenant with NO Retry-After header.
graph_list_provisioning_logs details
graph_list_provisioning_logs details
[Microsoft Graph] List provisioning events — what Entra's provisioning service synchronised into or out of a connected application, per object, with the outcome and the reason for it. This is the read for "why does this person not have an account in the SaaS app we provision", and the answer is usually visible in provisioningSteps, which records each stage from scoping through matching to the export and says which one stopped. Note that a SKIPPED result is the common case and not an error: it normally means the user fell outside the configured scope, which is a configuration answer rather than a failure.
graph_list_sign_ins details
graph_list_sign_ins details
[Microsoft Graph] List sign-in events — who signed in, when, from which IP address and location, on what device, to which application, and whether it succeeded. Carries a separate permission from the other audit reads because of how much per-user location and device detail it exposes, so a customer can grant directory audits without it. Filter server-side or this is unusable: createdDateTime narrows the window and status/errorCode narrows the outcome, for example "status/errorCode eq 0" for successes only. The field that answers most investigations is conditionalAccessStatus together with appliedConditionalAccessPolicies — it shows which policies were evaluated and what each decided, which is how you find out why a sign-in was allowed. REQUIRES Entra ID P1 or higher on the tenant being read; a free-tier customer gets a refusal rather than an empty list. Retention 7 days without a premium licence, 30 with P1/P2. Throttled at roughly 5 requests per 10 seconds per tenant with NO Retry-After header.
Directory Objects
graph_check_member_objects details
graph_check_member_objects details
[Microsoft Graph] Given a directory object and a list of group, role or administrative-unit ids, return the SUBSET it actually belongs to — transitively. The inverse of asking for all memberships, and the right tool when you already have a specific list to test against: checking one account against five sensitive groups is one small call, where fetching its full effective membership and filtering client-side may return thousands of ids. An empty response means it belongs to none of them.
graph_create_invitation details
graph_create_invitation details
[Microsoft Graph] Invite an external person into the directory as a B2B guest. Destructive for two reasons that survive deleting the guest afterwards: it creates a real identity that can then be added to groups and granted access, and with sendInvitationMessage set it EMAILS a named human at an address you supplied, which cannot be unsent. Check the address before calling — a typo invites a stranger. Note that inviteRedirectUrl is REQUIRED by Microsoft and is where the person lands after redeeming (https://myapps.microsoft.com is the usual choice), and that the response carries inviteRedeemUrl, which is the redemption link if you would rather deliver it yourself than have Microsoft send the mail. A guest can read directory information by default, so treat this as granting access rather than as sending a message.
graph_get_available_extension_properties details
graph_get_available_extension_properties details
[Microsoft Graph] List the directory extension properties defined in this tenant — the custom fields an organization or a synchronisation tool has added to users, groups, devices or applications. Worth reading before concluding a property does not exist: employee numbers, cost centres and HR identifiers usually live in extension properties rather than in the built-in schema, and each is addressed by its full generated name (extension__) rather than the friendly one. KNOWN MICROSOFT ISSUE, and it fails silently: this API only processes tenants with up to 1,000 service principals and returns an EMPTY response for larger ones rather than an error — so an empty result here means "no answer" as often as it means "none defined", and must not be reported as the latter. On a large tenant, read a specific application's extensionProperties instead.
graph_get_directory_object details
graph_get_directory_object details
[Microsoft Graph] Get any directory object by its id without knowing what type it is. Useful precisely when you do NOT know: audit logs, group memberships and role assignments all reference principals by bare object id, and this resolves one to the real thing. Read the @odata.type field in the response to find out what came back — a user, a group, a service principal or a device — because the properties that follow depend entirely on it. Returns the object's full representation; there is deliberately no property filter, because $select on this base-type path addresses the few properties directoryObject itself declares rather than the derived type's, and narrowing to a user or group property needs a type cast this tool does not take. Use the type-specific get tool once you know what it is.
graph_get_directory_objects_by_ids details
graph_get_directory_objects_by_ids details
[Microsoft Graph] Resolve many object ids to their directory objects in ONE call. This is the tool that turns a list of bare GUIDs — from an audit log, a role assignment, a group's members — into names, and doing it in one request rather than one per id is the difference between a readable report and a throttled sweep. A read despite being a POST: the ids go in the body because a URL cannot carry a thousand of them. Ids that do not resolve are simply absent from the response rather than raising an error, so compare the counts if that matters.
graph_get_member_groups details
graph_get_member_groups details
[Microsoft Graph] Return the ids of every GROUP a directory object belongs to, including through nesting. Works for a user, a group, a service principal or a device — the same call with a different id. This is the read that explains why somebody has a licence or is caught by a policy when the direct membership list does not mention it: assignment flows down nested groups, and only a transitive answer shows the path. Returns bare ids; pair with the resolve-by-id tool to turn them into names in one further call.
graph_get_member_objects details
graph_get_member_objects details
[Microsoft Graph] Return the ids of every group, DIRECTORY ROLE and administrative unit a directory object belongs to, including through nesting. Broader than the group-only tool and usually the one you want for a privilege question: it is the single call that answers "what does this account actually belong to", and directory roles are the part that matters most in that answer. Returns bare ids, so pair it with the resolve-by-id tool to see what they are.
Security
graph_get_secure_score details
graph_get_secure_score details
[Microsoft Graph] Get one Secure Score snapshot in full, including controlScores — the per-control detail saying what each control contributed on that day and why. This is the read behind a remediation plan: it shows which controls are scoring zero, which is the list of things worth fixing, ordered by what they would be worth.
graph_get_secure_score_control_profile details
graph_get_secure_score_control_profile details
[Microsoft Graph] Get one Secure Score control definition in full — its title and category, the maximum score it can contribute, the threats it addresses, its user impact and implementation cost, and the remediation text. Read this before recommending a control to a customer: the userImpact and implementationCost fields are what decide whether a fix is a five-minute change or a project, and they are the difference between good advice and a support ticket.
graph_get_security_alert details
graph_get_security_alert details
[Microsoft Graph] Get one Defender XDR alert in full — the detection and its source, the incident it belongs to, and the evidence array naming the devices, accounts, files, processes and URLs involved. The evidence array is the part worth reading: it is what turns an alert title into the specific machine and user an engineer has to go and look at, and each entry carries its own remediation status.
graph_get_security_incident details
graph_get_security_incident details
[Microsoft Graph] Get one Defender XDR incident — its severity, status, assigned owner, classification and determination, plus the tags and comments analysts have added. Expand 'alerts' to bring the underlying evidence back in the same call. The classification and determination fields together are what say whether this was a genuine attack, a false positive, or expected activity somebody authorised.
graph_list_secure_score_control_profiles details
graph_list_secure_score_control_profiles details
[Microsoft Graph] List the Secure Score control definitions — what each control is, which service it belongs to, what it is worth, the user impact of turning it on and the remediation steps. A score snapshot tells you WHICH controls are failing; this tells you what they mean and how to fix them, so the two together are what a remediation plan is built from. Includes the tenant's own state for each control, which is where an intentionally-ignored control shows up.
graph_list_secure_scores details
graph_list_secure_scores details
[Microsoft Graph] List Microsoft Secure Score snapshots — one per day, each with the tenant's score out of the maximum and the per-control breakdown behind it. Because it is a daily series this is how you show a customer that posture is improving rather than asserting it: read a range and compare. Note that comparing the raw score between two TENANTS is misleading, since the maximum depends on which products each has licensed; compare percentages, or compare a tenant with itself over time. Roughly 90 days are retained.
graph_list_security_alerts details
graph_list_security_alerts details
[Microsoft Graph] List Defender XDR alerts — individual detections from Defender for Endpoint, Office 365, Identity and Cloud Apps. Remember these are correlated into incidents, so an alert-first sweep will double-count one attack; triage from incidents and come here for the detail. The serviceSource field says which product raised each alert, which is usually the fastest way to narrow a noisy list. This is the current alerts_v2 collection, not the deprecated legacy alert API.
graph_list_security_incident_alerts details
graph_list_security_incident_alerts details
[Microsoft Graph] List the alerts Defender correlated into one incident — the evidence behind the story. This is the read that turns "there is an active high-severity incident" into which products detected what, on which devices and accounts, and in what order. Prefer it over expanding alerts on the incident when you want to page through a large correlation rather than pull it all at once.
graph_list_security_incidents details
graph_list_security_incidents details
[Microsoft Graph] List Defender XDR incidents — correlated groups of alerts, which is the right unit to triage from. Start here rather than at the alert list: Defender groups related signals across Endpoint, Office 365, Identity and Cloud Apps into one incident, so an alert-first view makes a single attack look like several unrelated problems. Filter on status and severity to get the real worklist, for example "status eq 'active'". Use the expand parameter with 'alerts' to pull the evidence in the same call when you already know you will need it.
graph_run_hunting_query details
graph_run_hunting_query details
[Microsoft Graph] Run a Kusto Query Language (KQL) query against Microsoft Defender's advanced hunting schema — raw event data across devices, email, identities and cloud apps, going back 30 days by default. This is the tool for questions the alert and incident lists cannot answer, because it queries the underlying telemetry rather than what Defender chose to alert on: which other machines ran that binary, who else received that sender's mail, what a process did after it launched. Always end a query with a limit clause — the schema holds billions of rows and an unbounded query is rejected or times out. Common tables: DeviceProcessEvents, DeviceNetworkEvents, DeviceFileEvents, EmailEvents, IdentityLogonEvents, CloudAppEvents. A read, despite being a POST, because it only queries. Beyond the connector's permission, the signed-in user needs a Defender or Entra role that grants hunting access (Security Reader, Security Operator, Security Administrator or Global Reader) — without one this returns a clean 403 that is a correct answer about their role rather than a fault.
graph_update_secure_score_control_profile details
graph_update_secure_score_control_profile details
[Microsoft Graph] Record a tenant's own position on a Secure Score control — Default, Ignored, ThirdParty or Reviewed — with an optional note. Not destructive: it changes how the control is SCORED and nothing about the tenant's actual configuration, and it is settable back. Use ThirdParty when the risk is genuinely covered by another product, since that credits the score honestly. Be careful with Ignored — it removes the control from the denominator, so the score goes UP without anything being safer, and a report built from it will overstate a customer's posture. Say why in the note.
graph_update_security_alert details
graph_update_security_alert details
[Microsoft Graph] Update an alert's status, classification, determination or assigned owner. Not destructive — an annotation on a detection, with the evidence left readable and every field settable back. Intend the two side effects: resolving removes it from the analyst queue, and classifying it falsePositive feeds Defender's tuning. Note the direction of travel between alerts and incidents — resolving the parent INCIDENT resolves its alerts, but resolving one alert does not resolve the incident, so closing a case means updating the incident rather than its alerts one by one.
graph_update_security_incident details
graph_update_security_incident details
[Microsoft Graph] Update an incident's status, classification, determination, assigned owner or display name. Not destructive — it annotates a finding rather than changing anything on a device or an account, the evidence stays readable, and every field can be set back. Two consequences to intend all the same: resolving takes the incident out of the queue analysts work from, and setting classification to falsePositive feeds Defender's tuning so similar activity is scored lower in future. Resolving an incident also resolves its alerts. Classification accepts unknown, informationalExpectedActivity, falsePositive or truePositive.
Usage Reports
graph_report_email_activity_counts details
graph_report_email_activity_counts details
[Microsoft Graph] Tenant-wide email totals per day — messages sent, received and read across the whole organization. RETURNS CSV TEXT, not JSON. Use this rather than the per-user report when the question is about trend rather than about people: it is a handful of rows instead of one per mailbox, which matters on a tight throttle.
graph_report_email_activity_user_detail details
graph_report_email_activity_user_detail details
[Microsoft Graph] Per-user email activity — send, receive and read counts, and each mailbox's last activity date. RETURNS CSV TEXT with a header row, not JSON. This is the report behind "who is not using their mailbox", which is the usual first evidence for reclaiming a licence: a user with a licence and no activity date is paying for nothing. Throttled at roughly 5 requests per 10 seconds per tenant with NO Retry-After header, and the data lags 48 hours or more.
graph_report_email_app_usage_user_detail details
graph_report_email_app_usage_user_detail details
[Microsoft Graph] Which email CLIENTS each user actually connects with — Outlook desktop, Outlook mobile, Outlook Web, IMAP, POP, SMTP. RETURNS CSV TEXT, not JSON. The security read hiding in a usage report: IMAP, POP and SMTP AUTH columns are the legacy protocols that bypass modern authentication, and this is the evidence for who would break if they were disabled. Also the fastest way to find people still on an unsupported Outlook build.
graph_report_m365_app_platform_user_counts details
graph_report_m365_app_platform_user_counts details
[Microsoft Graph] Daily counts of users active on each PLATFORM — Windows, Mac, mobile and web. RETURNS JSON, unlike most reports here. The estate shape in one report, and the number to check before planning anything that assumes Windows: a Mac or mobile population nobody counted is how a deployment plan becomes a ticket queue.
graph_report_m365_app_user_counts details
graph_report_m365_app_user_counts details
[Microsoft Graph] Daily counts of users active in each Microsoft 365 app across the tenant. RETURNS JSON, unlike most reports here. The adoption trend per application — which is what shows whether an Excel or Teams rollout actually moved, rather than whether people are licensed for it.
graph_report_m365_app_user_detail details
graph_report_m365_app_user_detail details
[Microsoft Graph] Per-user Microsoft 365 Apps usage broken down by application AND platform — Word, Excel, Outlook, Teams and the rest, on Windows, Mac, mobile and web. RETURNS JSON, unlike the other reports in this family: this is one of three that document $format=application/json, which is requested explicitly. The report that answers whether a customer needs the full desktop suite or would be fine on web and mobile, per person rather than per tenant.
graph_report_mailbox_usage_detail details
graph_report_mailbox_usage_detail details
[Microsoft Graph] Per-mailbox storage — bytes used against the quota, item count, and quota status. RETURNS CSV TEXT, not JSON. This is the report that finds mailboxes about to stop receiving mail: the status column moves through warning to send-prohibited to send-and-receive-prohibited, and a mailbox in the last state is already losing messages. Worth running before a customer reports it rather than after.
graph_report_mailbox_usage_storage details
graph_report_mailbox_usage_storage details
[Microsoft Graph] Total mailbox storage consumed across the tenant, per day. RETURNS CSV TEXT, not JSON. The trend view behind capacity planning — a few rows rather than one per mailbox, so it is the cheap call on a tight throttle when the question is growth rather than which mailbox.
graph_report_office365_activation_counts details
graph_report_office365_activation_counts details
[Microsoft Graph] Office activation totals per product and platform across the tenant — how many activations exist for each, rather than who holds them. RETURNS CSV TEXT, not JSON. Takes NO period or date; it is a current-state report. The counterpart to the per-user activations report: this says whether a customer's desktop Office estate is mostly Windows, Mac or mobile in a handful of rows, which is the cheap call when the question is shape rather than individuals.
graph_report_office365_activations_user_detail details
graph_report_office365_activations_user_detail details
[Microsoft Graph] Per-user desktop Office activations — which platforms each person has activated on (Windows, Mac, iOS, Android) and whether it was a shared computer. RETURNS CSV TEXT, not JSON. Takes NO period or date: it is a current-state report rather than a windowed one. The read for "has this person actually installed Office", and for finding users at the five-device activation limit, which presents to a helpdesk as Office refusing to activate on a new laptop.
graph_report_office365_active_user_counts details
graph_report_office365_active_user_counts details
[Microsoft Graph] Daily counts of active users per service across the tenant. RETURNS CSV TEXT, not JSON. The trend summary behind the per-user active-user report, and the one to use for a monthly review where the per-user detail would be thousands of rows against a 5-per-10-seconds budget.
graph_report_office365_active_user_detail details
graph_report_office365_active_user_detail details
[Microsoft Graph] The single most useful report here: one row per user, with which products they are LICENSED for and their last activity date in EACH — Exchange, OneDrive, SharePoint, Teams, Yammer. RETURNS CSV TEXT, not JSON. This is the licence-reclaim report in one call, and it replaces running five per-service reports and joining them by hand. A user licensed for a product with a blank last-activity date in that column has never used it.
graph_report_office365_services_user_counts details
graph_report_office365_services_user_counts details
[Microsoft Graph] Enabled versus ACTIVE user counts per service — how many people are licensed for each product against how many actually used it. RETURNS CSV TEXT, not JSON. The gap between those two numbers is the licence waste in one line per service, which makes this the report to open a cost conversation with before drilling into who.
graph_report_onedrive_activity_user_detail details
graph_report_onedrive_activity_user_detail details
[Microsoft Graph] Per-user OneDrive activity — files viewed or edited, synced, shared internally and shared EXTERNALLY. RETURNS CSV TEXT, not JSON. The external-sharing column is the one worth reading first; it is the cheapest tenant-wide signal that company files are leaving the organization, and unlike the storage report it says who is doing it rather than how much is stored.
graph_report_onedrive_usage_account_detail details
graph_report_onedrive_usage_account_detail details
[Microsoft Graph] Per-account OneDrive storage — files, active files, bytes used against bytes allocated, and last activity. RETURNS CSV TEXT, not JSON. Read the Is Deleted column before acting on anything here: a deleted user's OneDrive survives them by the retention period, so the largest consumers in a tenant are often people who left, and that is reclaimable storage rather than a user to chase.
graph_report_sharepoint_activity_user_detail details
graph_report_sharepoint_activity_user_detail details
graph_report_sharepoint_site_usage_detail details
graph_report_sharepoint_site_usage_detail details
graph_report_teams_device_usage_user_detail details
graph_report_teams_device_usage_user_detail details
[Microsoft Graph] Which DEVICES each person uses Teams from — Windows, Mac, iOS, Android, web and Linux. RETURNS CSV TEXT, not JSON. Useful well beyond adoption: a user active only on a personal mobile is a mobile-device-management gap, and a rollout plan built without knowing the Mac and Linux population is the one that generates tickets.
graph_report_teams_user_activity_counts details
graph_report_teams_user_activity_counts details
[Microsoft Graph] Tenant-wide Teams totals per day — messages, meetings and calls across the organization. RETURNS CSV TEXT, not JSON. The trend view for adoption reporting, and cheap enough to run on a schedule where the per-user report is not.
graph_report_teams_user_activity_user_detail details
graph_report_teams_user_activity_user_detail details
[Microsoft Graph] Per-user Teams activity — channel messages, chat messages, meetings attended and organised, and calls. RETURNS CSV TEXT, not JSON. The adoption report customers ask for by name, and the one that distinguishes a tenant that has Teams from a tenant that uses it. Pair it with the email activity report before recommending a licence change, because a quiet mailbox and a busy Teams account is a person who simply moved channels.
graph_report_yammer_activity_user_detail details
graph_report_yammer_activity_user_detail details
[Microsoft Graph] Per-user Viva Engage (formerly Yammer) activity — messages posted, read and liked, with last activity date. RETURNS CSV TEXT, not JSON. Usually the least-used service in a tenant, which is exactly what makes it worth reading: it is the clearest evidence for whether a licence bundle's social component is used at all.
graph_copy_message details
graph_copy_message details
[Microsoft Graph] Copy a message into another folder, leaving the original where it is. The copy is an independent message with its own id, so later changes to either do not affect the other.
graph_create_draft_message details
graph_create_draft_message details
[Microsoft Graph] Create a message in the Drafts folder without sending it. Nothing reaches anybody until a person opens it, or until graph_send_draft_message is called deliberately. This is the tool to reach for whenever a workflow composes mail for review rather than delivery.
graph_create_forward_draft details
graph_create_forward_draft details
[Microsoft Graph] Create a forward DRAFT of a message, with its attachments, without sending it. Nothing leaves the mailbox until somebody sends the draft. Recipients can be set now or left for the person who reviews it.
graph_create_mail_folder details
graph_create_mail_folder details
[Microsoft Graph] Create a mail folder, either at the top level or beneath an existing folder. Useful for staging an investigation or an archiving workflow. Note that creating a folder marked hidden makes it invisible in Outlook while remaining a valid target for rules, which is why the parameter is here and why it defaults to false.
graph_create_message_rule details
graph_create_message_rule details
[Microsoft Graph] Create a rule on the signed-in user's Inbox. READ THIS BEFORE USING IT: a rule whose actions contain forwardTo, forwardAsAttachmentTo or redirectTo sends the mailbox's incoming mail to that address CONTINUOUSLY and invisibly — nothing appears in Sent Items, and it survives a password reset. That is the standard business-email-compromise persistence mechanism, so a forwarding rule created by an automation is indistinguishable from one created by an intruder. Only create one when a person has asked for that specific rule. actions is required; conditions and exceptions are optional, and a rule with no conditions applies to EVERY incoming message.
graph_create_reply_draft details
graph_create_reply_draft details
[Microsoft Graph] Create a reply DRAFT to a message — correctly threaded and addressed, quoting the original — without sending it. The response includes the new draft's id, which a person can then review in Outlook or which graph_send_draft_message can release. Prefer this over graph_reply_to_message in any workflow that is not explicitly authorised to mail people.
graph_delete_mail_folder details
graph_delete_mail_folder details
[Microsoft Graph] Delete a mail folder AND EVERYTHING IN IT, including its subfolders and every message they hold. That is the whole reason this is flagged: the folder's name says nothing about how much mail is inside, so list its messages first. Deleting a folder a rule files into does not delete the rule — the rule stays and starts failing.
graph_delete_message details
graph_delete_message details
[Microsoft Graph] Delete a message. Graph moves it to Deleted Items rather than erasing it, so a person can retrieve it — but it has left the folder it was in, and the retention policy that governs Deleted Items decides how long that stays true. Flagged destructive because deleting somebody's mail is not something to do incidentally; move it to a folder instead when the intent is to tidy.
graph_delete_message_rule details
graph_delete_message_rule details
[Microsoft Graph] Delete an inbox rule permanently — there is no undo and no copy kept. This is the remediation step for a malicious forwarding rule, and equally the way somebody's carefully built filing disappears. Read the rule first so its definition exists somewhere before it stops existing here. Deleting a rule does not move any mail it already filed.
graph_download_message_attachment details
graph_download_message_attachment details
[Microsoft Graph] Download an attachment's raw bytes and return a short-lived read-only download link, together with the content type, filename and size. Binary cannot travel through a tool response, so the bytes are stored and linked rather than inlined. The link expires — treat it as something to hand to a person or a downstream fetch promptly, not as a permanent address. Works on fileAttachment only; a referenceAttachment has no bytes here, and an itemAttachment is an embedded message rather than a file.
graph_forward_message details
graph_forward_message details
[Microsoft Graph] Forward a message, with its attachments, to new recipients and send it immediately. This is the tool that moves a mailbox's contents OUT: whatever was in the original — attachments, quoted threads, addresses — goes wherever you point it, including outside the organisation, and nothing recalls it. Read the message first if you are not certain what it contains.
graph_get_mail_folder details
graph_get_mail_folder details
[Microsoft Graph] Get one mail folder by id or by well-known name. The well-known names save a lookup and are the stable way to address a mailbox's structure: inbox, drafts, sentitems, deleteditems, junkemail, archive, outbox, recoverableitemsdeletions. Returns the unread and total counts along with the folder's parent, which is how you confirm where a rule has been filing things.
graph_get_mailbox_settings details
graph_get_mailbox_settings details
[Microsoft Graph] Get the signed-in user's mailbox settings — automatic replies (out-of-office) and their schedule, time zone, working hours, language, date and time format, and how delegated meeting messages are handled. Automatic replies are the part worth checking during an investigation as well as for the obvious reason: an attacker sometimes enables one to keep a compromised account looking normal while mail is being diverted.
graph_get_message details
graph_get_message details
[Microsoft Graph] Get one message in full, including its body and internet headers. Ask for internetMessageHeaders in select when investigating a suspicious mail: the authentication-results header is what tells you whether SPF, DKIM and DMARC actually passed, which the display name never does. hasAttachments tells you whether graph_list_message_attachments is worth calling.
graph_get_message_attachment details
graph_get_message_attachment details
[Microsoft Graph] Get one attachment as JSON. For a fileAttachment the response includes contentBytes, the file base64-encoded INLINE — fine for a small text or CSV file, and a very expensive way to move a 20 MB PDF through a conversation. Use graph_download_message_attachment instead for anything sizeable: it returns a download link rather than the bytes. Check size from graph_list_message_attachments first.
graph_get_message_rule details
graph_get_message_rule details
[Microsoft Graph] Get one inbox rule in full. Read this before updating a rule: an update is a PATCH, so any conditions or actions object you send REPLACES the existing one wholesale rather than merging into it, and this response is the only record of what was there.
graph_list_child_mail_folders details
graph_list_child_mail_folders details
[Microsoft Graph] List the folders directly beneath one mail folder. Graph exposes no whole-tree read, so a nested structure is walked a level at a time from graph_list_mail_folders. Include hidden folders when investigating: a folder created to hide diverted mail is routinely marked hidden so it does not appear in Outlook.
graph_list_mail_categories details
graph_list_mail_categories details
[Microsoft Graph] List the signed-in user's master list of Outlook categories — the coloured labels shared across messages, events, contacts and tasks. Worth reading before setting categories on a message: assigning a name that is not on this list stores the text but shows no colour, which looks like the write silently failed.
graph_list_mail_folder_messages details
graph_list_mail_folder_messages details
[Microsoft Graph] List the messages inside one mail folder, by folder id or well-known name. This is the read for questions scoped to a place rather than a mailbox: what is sitting in junkemail, what was actually sent from sentitems, what a rule has been filing into a subfolder. Supports $filter and $orderby but not $search.
graph_list_mail_folders details
graph_list_mail_folders details
[Microsoft Graph] List the top-level mail folders in the signed-in user's mailbox, with unread and total item counts. Only the ROOT level is returned — a folder tree is walked with graph_list_child_mail_folders one level at a time. Alongside the folders a user made, this is where an unexpected folder created by a mailbox rule shows up, which is a routine finding in a compromise investigation.
graph_list_message_attachments details
graph_list_message_attachments details
[Microsoft Graph] List a message's attachments as METADATA — name, content type and size — without pulling any content down. Size is the number to read before deciding how to fetch one. Attachments come in three kinds and they behave differently: a file attachment carries real bytes and downloads normally; an item attachment is an embedded Outlook message or event rather than a file; and a reference attachment is only a LINK to something in OneDrive or SharePoint, so its bytes are not in the mail at all and cannot be downloaded from here. Call graph_get_message_attachment on a single attachment when you need its exact kind confirmed.
graph_list_message_rules details
graph_list_message_rules details
[Microsoft Graph] List every rule on the signed-in user's INBOX, with its conditions, actions and exceptions. This is the single highest-value read in the mail family for a compromise investigation: a rule whose actions contain forwardTo, forwardAsAttachmentTo or redirectTo pointing at an address outside the tenant is the classic business-email-compromise persistence mechanism — it survives a password reset, leaves nothing in Sent Items, and keeps exfiltrating. A rule that moves mail to Deleted Items or a hidden folder is the same trick aimed at hiding the replies. Note that Graph exposes rules on the Inbox folder only.
graph_list_messages details
graph_list_messages details
[Microsoft Graph] List messages in the signed-in user's mailbox, newest first unless you order them otherwise. Reads YOUR OWN mailbox only — delegated Graph cannot reach another person's mail even for a Global Administrator. Supports $filter and $orderby but NOT $search: Outlook rejects that combination, so use graph_search_messages for free-text hunting. Note the service returns only 10 messages when no page size is given, so this tool always sends one.
graph_move_message details
graph_move_message details
[Microsoft Graph] Move a message to another folder, by folder id or well-known name such as "archive", "junkemail" or "deleteditems". Moving assigns the message a NEW id in the destination folder — the response carries it, and the old id stops resolving, so anything holding the previous id must use the new one.
graph_reply_all_to_message details
graph_reply_all_to_message details
[Microsoft Graph] Reply to EVERYONE on a message — sender, To and CC — and send it immediately. Reaches every one of those people, cannot be recalled, and on a thread that includes a distribution list that can be a very large number of them. Check the recipient list with graph_get_message before calling this. Separate from graph_reply_to_message on purpose: a flag is the kind of thing that gets set wrong in a single token.
graph_reply_to_message details
graph_reply_to_message details
[Microsoft Graph] Reply to a message's SENDER only and send it immediately. Reaches a real person and cannot be recalled. Graph appends your comment to the original message body and threads the reply, so send only the new text rather than quoting the original yourself. Use graph_reply_all_to_message when everyone on the thread needs it — the two are different tools rather than a flag, because getting that choice wrong sends a private answer to a whole distribution list.
graph_search_messages details
graph_search_messages details
[Microsoft Graph] Free-text search across the signed-in user's mailbox, including message bodies and the text of supported attachment types. Accepts either a bare phrase or Outlook KQL such as from:accounts@contoso.com or subject:invoice or received>=2026-08-01 — the tool adds the quoting Graph requires. Deliberately offers no $filter or $orderby: Outlook rejects search combined with either, and results come back ranked rather than sorted. Searches YOUR OWN mailbox only; delegated mailboxes are not searchable.
graph_send_draft_message details
graph_send_draft_message details
[Microsoft Graph] Send a draft that already exists in the mailbox. It carries the send scope and the destructive flag for the same reason graph_send_mail does — the message leaves and reaches people — even though the drafting happened earlier. The draft's own recipients are used; this tool changes nothing about it. Only a draft can be sent, so a message already delivered returns an error rather than sending twice.
graph_send_mail details
graph_send_mail details
[Microsoft Graph] Send a message immediately AS THE SIGNED-IN USER, from their real address. This reaches actual people and there is no unsend: recipients see a genuine internal mail from a colleague, which is exactly why it is powerful and why it is flagged. Confirm the recipients and the wording with a person before calling it in any unattended workflow. Use graph_create_draft_message instead when the intent is to prepare something for a human to review and send.
graph_set_automatic_replies details
graph_set_automatic_replies details
[Microsoft Graph] Turn the signed-in user's out-of-office automatic reply on, off, or on for a scheduled window. Anyone who mails them gets the reply, so the external message is read by people outside the organisation — say only what the customer would put on a public page. Set status to "scheduled" to have Exchange start and stop it for you; "alwaysEnabled" runs until somebody turns it off, which is how an out-of-office survives the holiday it was set for. externalAudience decides whether outsiders get a reply at all. Anything you omit is LEFT ALONE, including the reply text — so turning automatic replies off and back on again keeps the wording that was already there, and you only need to send the messages when you mean to change them.
graph_update_mail_folder details
graph_update_mail_folder details
[Microsoft Graph] Rename a mail folder. Only the display name is writable; a folder is moved by changing its parent, which Graph exposes as a separate operation not offered here. Renaming does not disturb the messages inside it or the rules that file into it, because both address the folder by id.
graph_update_message details
graph_update_message details
[Microsoft Graph] Update a message's mutable properties — read state, importance and categories. A PATCH merges, so anything you omit is left alone. Categories are the exception to that: the list you send REPLACES the message's existing categories rather than adding to them, so read the message first if you mean to add one. Sending an empty categories value clears them.
graph_update_message_rule details
graph_update_message_rule details
[Microsoft Graph] Change an existing inbox rule. Any conditions or actions object you send REPLACES the whole existing one rather than merging into it, so a partial body silently drops every condition you did not repeat — turning a rule that matched one sender into one that matches all mail. Read the rule with graph_get_message_rule first and send the complete object back with your change applied. Setting isEnabled alone is the safe way to pause a rule without touching its definition.
Files
graph_copy_drive_item details
graph_copy_drive_item details
[Microsoft Graph] Copy a file or folder, optionally into a different drive and optionally under a new name. This is ASYNCHRONOUS: Graph answers immediately with a monitor URL rather than the finished copy, so a large folder is still copying after the call returns and the new item does not exist yet. The copy is a new item with its own id and NO sharing links — permissions are not carried across, which is usually what you want.
graph_create_folder details
graph_create_folder details
[Microsoft Graph] Create a folder, in the drive's root or inside an existing folder. A folder of the same name already existing is the interesting case, and conflictBehavior decides it: "rename" makes "Reports 1", "replace" REUSES the existing folder rather than erasing it, and "fail" stops. The default is fail, so a duplicate name is reported rather than guessed at.
graph_create_sharing_link details
graph_create_sharing_link details
[Microsoft Graph] Create a sharing link for a file or folder and RETURN THE URL. Read the scope values before choosing one: "anonymous" produces a link that opens the file for anyone who has it — no sign-in, no multifactor prompt, no conditional-access check, and it can be forwarded to anyone — while "organization" limits it to people signed in to the tenant and "users" to named recipients. Anonymous links may also be disabled by the tenant's administrator, in which case this is refused rather than downgraded. Set an expirationDateTime whenever the need is temporary, because a link with none lasts until somebody removes it. The URL comes back in this response, so treat the response itself as the secret.
graph_delete_drive_item details
graph_delete_drive_item details
[Microsoft Graph] Delete a file or folder. It goes to the recycle bin rather than disappearing, so it can be restored from OneDrive or SharePoint for a limited retention period — but deleting a FOLDER takes everything inside it, and the folder's name says nothing about how much that is. List its children first. Deleted content keeps counting against the drive's quota until the recycle bin is emptied.
graph_delete_item_permission details
graph_delete_item_permission details
[Microsoft Graph] Remove a permission from a file or folder — the remediation for an oversharing finding, and the way an anonymous link is killed. Destructive by the connector's standing rule that removing access is destructive while granting it is not: the person who loses it experiences a broken document rather than a message, and a sharing link cannot be recreated with the same URL once revoked. Inherited permissions cannot be deleted here; remove them from the folder they come from.
graph_download_drive_item details
graph_download_drive_item details
[Microsoft Graph] Download a file's content and return a short-lived read-only download link, with its content type, filename and size. Binary cannot travel through a tool response, so the bytes are stored and linked rather than inlined. The link expires — hand it onward promptly rather than treating it as a permanent address. Folders have no content and cannot be downloaded here.
graph_get_drive details
graph_get_drive details
[Microsoft Graph] Get one drive, including its quota — total, used, remaining and the deleted bytes still held in the recycle bin. The deleted figure is the one that surprises people: emptying a recycle bin is often what actually frees a full OneDrive, because deleted files keep counting against the quota until it is.
graph_get_drive_item details
graph_get_drive_item details
[Microsoft Graph] Get one file or folder by id — size, timestamps, the person who last changed it, and the webUrl that opens it in a browser for someone who already has access. Note that webUrl is NOT a sharing link: it works only for people the file is already shared with, which is exactly what makes it safe to pass around internally.
graph_get_drive_item_by_path details
graph_get_drive_item_by_path details
[Microsoft Graph] Get a file or folder by its path within the drive, for example "Documents/Invoices/2026-Q3.xlsx". Use this when a person has told you where something lives rather than given you an id — it saves walking the tree a folder at a time. The path is relative to the drive's root, with no leading slash, and it may not contain ".." or a colon.
graph_invite_to_drive_item details
graph_invite_to_drive_item details
[Microsoft Graph] Grant named people access to a file or folder, optionally emailing them an invitation. Unlike a sharing link this grants access to identities rather than to whoever holds a URL, so it is revocable, attributable and visible in the audit log — the better choice whenever the recipients are known. It can still reach OUTSIDE the organisation if the address is external and the tenant allows it, which is why it is flagged. Granting on a folder grants everything inside.
graph_list_drive_item_versions details
graph_list_drive_item_versions details
[Microsoft Graph] List the stored versions of a file, newest first, with who saved each one and how large it was. This is the read behind ransomware recovery and undoing a bad edit: SharePoint and OneDrive keep prior versions even when the current content has been encrypted or overwritten, and graph_restore_drive_item_version puts one back.
graph_list_drive_items details
graph_list_drive_items details
[Microsoft Graph] List the files and folders directly inside one folder, or inside the drive's root when no folder is named. Each entry carries either a file facet or a folder facet — that is how you tell them apart, since the name alone does not. A folder's childCount tells you whether recursing is worth it. Only one level is returned; there is no whole-tree read.
graph_list_drives details
graph_list_drives details
[Microsoft Graph] List drives — the signed-in user's own OneDrive by default, or every document library belonging to a SharePoint site or a Microsoft 365 group when you name one. A site usually has more than one library, so this is the read that turns a site id into the drive id the rest of these tools take. Give at most one of siteId or groupId.
graph_list_item_permissions details
graph_list_item_permissions details
[Microsoft Graph] List everyone and everything that can reach a file or folder — people granted access directly, permissions inherited from a parent folder, and every sharing link that exists on it. This is the oversharing audit: look for a link whose scope is "anonymous", which means anyone holding the URL can open the file without signing in, and check whether grantedToIdentitiesV2 includes people outside the organisation. IMPORTANT: the response includes those link URLs in full, so it discloses working access addresses — treat the output as sensitive and do not paste it somewhere the file itself would not belong.
graph_list_recent_files details
graph_list_recent_files details
[Microsoft Graph] List the files the signed-in user most recently viewed or edited, across every drive they can reach rather than one at a time. The entries carry a remoteItem facet naming the drive each one actually lives in, which is how you get from a recent file to the drive id the other tools need.
graph_list_shared_with_me details
graph_list_shared_with_me details
graph_move_drive_item details
graph_move_drive_item details
[Microsoft Graph] Move a file or folder to a different folder in the SAME drive, optionally renaming it on the way. Moving a folder takes everything inside it. The item keeps its id, so its sharing links survive — but the permissions it INHERITED from its old parent do not, and it picks up the new parent's instead, which can quietly widen or narrow who can see it. Crossing drives is a copy rather than a move; use graph_copy_drive_item.
graph_rename_drive_item details
graph_rename_drive_item details
[Microsoft Graph] Rename a file or folder. The item keeps its id, its version history and its sharing links, so anything already pointing at it keeps working — a rename is genuinely just a label change here, unlike on a file system. Use graph_move_drive_item to put it somewhere else.
graph_restore_drive_item_version details
graph_restore_drive_item_version details
[Microsoft Graph] Restore a previous version of a file, making it the current content. Nothing is lost: the content being replaced becomes a version of its own, so this is reversible by restoring that one instead. It is the remediation step after a file has been encrypted by ransomware or overwritten by mistake — list the versions first and pick the last one saved before the damage.
graph_search_drive_items details
graph_search_drive_items details
[Microsoft Graph] Search a drive for files and folders matching a term, across the whole hierarchy rather than one folder. The term matches file names AND indexed file contents, so searching for a phrase inside documents works. Results include items from folders the signed-in user can reach through sharing as well as ones they own.
graph_update_item_permission details
graph_update_item_permission details
[Microsoft Graph] Change an existing permission's roles or expiry — turning read access into write, or putting an expiry on a link that has none. The roles you send REPLACE the permission's current ones rather than adding to them, so this both grants and revokes depending on what you omit. Read the permission first with graph_list_item_permissions. Permissions inherited from a parent folder cannot be changed here; change them where they are defined.
Calendar
graph_cancel_event details
graph_cancel_event details
[Microsoft Graph] Cancel a meeting the signed-in user ORGANISED, sending a cancellation notice to every attendee. This is the correct way to call off a meeting — it removes the event from everyone's calendar and tells them why. Only the organiser can do it; an attendee wanting out uses graph_decline_event instead. Cancelling a recurring series cancels every remaining occurrence.
graph_create_calendar details
graph_create_calendar details
[Microsoft Graph] Create an additional calendar for the signed-in user. Nothing is shared and nobody is notified — a new calendar starts empty and private to them.
graph_create_calendar_permission details
graph_create_calendar_permission details
[Microsoft Graph] Share a calendar with somebody, choosing how much they can see. Read the role values before picking: freeBusyRead shows only busy blocks, limitedRead adds subjects and locations, read shows the full contents of every appointment, and write or delegateWithoutPrivateEventAccess lets them change things. Granting read on a person's calendar exposes every meeting they attend, which is more revealing than it sounds — attendee lists disclose who is talking to whom.
graph_create_event details
graph_create_event details
[Microsoft Graph] Create an event. WITH attendees this SENDS MEETING INVITATIONS immediately — real people get a real invitation from the signed-in user, and declining it is the only way out. WITHOUT attendees it is a private appointment that notifies nobody. That difference is the argument you pass, not a different tool, which is why this is flagged regardless: check the attendee list before calling it. Times are ISO 8601 in the given time zone; set isOnlineMeeting to have Teams generate a join link.
graph_delete_calendar details
graph_delete_calendar details
[Microsoft Graph] Delete a calendar AND EVERY EVENT IN IT. The calendar's name says nothing about how much is inside, so read it with graph_list_calendar_view first. Meetings the user organised are not cancelled for their attendees by this — the events simply vanish from this calendar while everyone else still holds theirs, which is worse than a cancellation rather than better. The default calendar cannot be deleted.
graph_delete_calendar_permission details
graph_delete_calendar_permission details
[Microsoft Graph] Remove somebody's access to a calendar — the remediation when an audit finds a share that should not exist. Destructive by the standing rule that removing access is destructive while granting it is not: the person loses a calendar they may be relying on to schedule around, and they are not told, so it surfaces as meetings quietly clashing rather than as a message.
graph_delete_event details
graph_delete_event details
[Microsoft Graph] Delete an event from the signed-in user's calendar. On a meeting THEY ORGANISED this is the wrong tool and the difference matters: deleting removes it from their calendar while leaving it on everybody else's, with no cancellation sent, so the attendees keep an appointment nobody will attend. Use graph_cancel_event for an organised meeting; this one is right for a personal appointment or an invitation already declined.
graph_download_event_attachment details
graph_download_event_attachment details
[Microsoft Graph] Download an event attachment's raw bytes and return a short-lived read-only download link, with its content type, filename and size. Binary cannot travel through a tool response, so the bytes are stored and linked rather than inlined. The link expires; hand it onward promptly.
graph_forward_event details
graph_forward_event details
[Microsoft Graph] Forward a meeting invitation to additional people, who receive a real invitation and appear to the organiser as attendees. It reaches humans and cannot be recalled, and it discloses the meeting's subject, body and attendee list to whoever you name — worth checking before forwarding anything about personnel or commercial matters outside the original group.
graph_get_calendar details
graph_get_calendar details
[Microsoft Graph] Get one calendar, or the signed-in user's default calendar when no id is given. Includes the colour Outlook shows it in and the permission flags describing what this connection can do with it.
graph_get_event details
graph_get_event details
[Microsoft Graph] Get one event in full — attendees and each person's response status, the organiser, location, body, online-meeting join details and, for a series, its recurrence rule. responseStatus per attendee is the property worth reading before chasing anyone: it distinguishes people who declined from people who simply have not answered.
graph_get_schedule details
graph_get_schedule details
[Microsoft Graph] Get free/busy availability for one or more people, distribution lists, or bookable resources such as meeting rooms, over a time window. This is the ONE calendar tool that reads other people, and it works because free/busy is not mailbox content — it is the availability Outlook shows everyone, governed by the tenant's free/busy sharing settings. Each result carries an availabilityView string where each character is one time slot: 0 free, 1 tentative, 2 busy, 3 out of office, 4 working elsewhere. Subject and location appear only where that person's settings allow it. Nothing here reads the contents of anybody's calendar.
graph_list_calendar_permissions details
graph_list_calendar_permissions details
[Microsoft Graph] List who a calendar is shared with and how much each of them can see. This is the calendar equivalent of a file oversharing audit: role tells you whether somebody sees only free/busy, sees titles and locations, or can read and even edit the full contents, and allowedRoles says how far that could be raised. An entry whose role reads write or delegate on an executive's calendar is worth asking about.
graph_list_calendar_view details
graph_list_calendar_view details
[Microsoft Graph] List the events occurring between two times, with recurring series EXPANDED into their individual occurrences. This is the right read for any question about a period — what is on today, who is booked on Thursday, what happened last week. Prefer it over graph_list_events, which returns a repeating meeting as one master entry rather than as its occurrences, and so undercounts every recurring commitment in the calendar. Times are ISO 8601 and are interpreted in the given time zone.
graph_list_calendars details
graph_list_calendars details
[Microsoft Graph] List the signed-in user's calendars — their default one plus any extra calendars they created or had shared with them. canEdit and canShare tell you what this connection may actually do with each; owner names the person whose calendar it really is, which is how a shared calendar is distinguished from one of their own.
graph_list_event_attachments details
graph_list_event_attachments details
[Microsoft Graph] List an event's attachments as metadata — name, content type and size — without pulling any content down. Meeting agendas and pre-reads live here. Use graph_download_event_attachment to fetch one.
graph_list_event_instances details
graph_list_event_instances details
[Microsoft Graph] List the individual occurrences of ONE recurring series within a date range, including any that were moved or cancelled separately from the rest. This is how you find the single exception in an otherwise regular series — the one week the meeting was an hour later, or the occurrence somebody deleted. Editing one occurrence means addressing the instance id returned here, not the series id.
graph_list_events details
graph_list_events details
[Microsoft Graph] List events as they are STORED, which means a recurring series comes back as a single master entry carrying its recurrence rule rather than as its occurrences. Use this when you want the series itself — to edit it, or to inventory what repeating meetings exist. For any question about what is happening during a period of time, use graph_list_calendar_view instead.
graph_respond_to_event details
graph_respond_to_event details
[Microsoft Graph] Answer a meeting invitation as the signed-in user — accept, decline, or accept tentatively. By default the organiser is told, which is the point of responding, so this reaches a human. Set sendResponse to false to update the calendar silently without notifying them. Declining removes the meeting from their calendar. This answers on behalf of a real person, so it should reflect a decision they actually made.
graph_update_calendar details
graph_update_calendar details
[Microsoft Graph] Rename a calendar or change the colour Outlook shows it in. The events inside are untouched and nobody the calendar is shared with is notified.
graph_update_event details
graph_update_event details
[Microsoft Graph] Change an event. On a meeting this SENDS AN UPDATE to every attendee — moving a meeting notifies everyone who was invited, and there is no quiet edit. The attendee list you send REPLACES the existing one rather than adding to it, so anyone you omit is uninvited and told so; read the event first and send the complete list. Updating a recurring SERIES changes every occurrence, while updating one occurrence's id changes only that one.
Contacts
graph_create_contact details
graph_create_contact details
[Microsoft Graph] Add a contact to the signed-in user's personal address book, optionally inside a folder. Nobody else sees it and nobody is notified — this changes one person's private records only. To publish an entry the whole organisation can see, a directory administrator creates an organizational contact instead.
graph_delete_contact details
graph_delete_contact details
[Microsoft Graph] Delete a contact from the signed-in user's personal address book. Nobody else is affected and nobody is notified, but the record and its history of addresses and numbers are gone — read it first if anything on it might be needed. Organizational contacts cannot be deleted here; they are directory objects.
graph_get_contact details
graph_get_contact details
[Microsoft Graph] Get one personal contact in full — every email address and phone number on the record, the postal addresses, job title and company, and any personal notes. A contact can carry several email addresses; the first is the one Outlook uses by default.
graph_get_org_contact details
graph_get_org_contact details
[Microsoft Graph] Get one organizational contact from the directory. Note the id space is the DIRECTORY's, not a mailbox's — an id from graph_list_contacts will not resolve here and the other way round, which is the most common way these two halves get confused.
graph_list_contact_folder_contacts details
graph_list_contact_folder_contacts details
[Microsoft Graph] List the contacts inside one contact folder. Pair it with graph_list_contact_folders to walk a filed address book: the top-level list and each folder's contents are disjoint, so a complete picture needs both.
graph_list_contact_folders details
graph_list_contact_folders details
[Microsoft Graph] List the folders the signed-in user files contacts into. Contacts outside any folder live at the top level and are returned by graph_list_contacts, which does NOT reach into these folders — so a book that looks small may simply be organised, and this read is how you find the rest.
graph_list_contacts details
graph_list_contacts details
[Microsoft Graph] List the signed-in user's personal Outlook contacts — their own private address book, not the organisation's shared directory. Use graph_list_org_contacts for the entries everyone can see. Filter on emailAddresses or companyName to narrow a large book rather than paging through it.
graph_list_org_contacts details
graph_list_org_contacts details
[Microsoft Graph] List the tenant's ORGANIZATIONAL contacts — the shared directory entries everyone in the organisation sees in the global address list, typically outside accountants, suppliers and contractors who have no mailbox of their own. Completely separate from anybody's personal address book. These are directory objects, so they are read-only through this family; creating or changing one is a directory administration task.
graph_update_contact details
graph_update_contact details
[Microsoft Graph] Change a personal contact. Anything omitted is left alone — except email addresses, where the list you send REPLACES the record's existing ones rather than adding to them, so read the contact first if it has more than one and you mean to keep them.
SharePoint
graph_create_list details
graph_create_list details
[Microsoft Graph] Create a new list in a SharePoint site. The columns are supplied as a JSON array of column definitions, each naming the column and its type, for example [{"name":"Owner","text":},{"name":"DueDate","dateTime":}]. Adds something that was not there before and affects nothing existing.
graph_create_list_column details
graph_create_list_column details
[Microsoft Graph] Add a column to a SharePoint list. The definition is a JSON object naming the column and exactly one type facet, for example {"name":"Owner","text":} or {"name":"DueDate","dateTime":}. Existing rows gain the column empty; nothing already stored is changed.
graph_create_list_item details
graph_create_list_item details
[Microsoft Graph] Add a row to a SharePoint list. The values are a JSON object keyed by INTERNAL column name, for example {"Title":"New laptop","Status":"Open"} — call graph_list_list_columns first, because a key that is not a real internal name is accepted and silently dropped rather than rejected, so the row appears with that value missing.
graph_delete_list details
graph_delete_list details
[Microsoft Graph] Delete a SharePoint list AND EVERY ITEM IN IT. There is no partial form and no per-item confirmation: a list holding ten thousand rows goes in one call. The list lands in the site's recycle bin, where it can be restored until somebody empties it — but that is a site collection administrator's job, not something these tools can do. Read the list and its item count first.
graph_delete_list_column details
graph_delete_list_column details
[Microsoft Graph] Remove a column from a SharePoint list. THIS DELETES THE DATA IN THAT COLUMN FOR EVERY ROW — the rows survive, the values do not, and there is no per-row recycle bin for a dropped column. Anything a report or a Power Automate flow reads from that column stops working at the same moment. Read the column list and confirm nothing depends on it.
graph_delete_list_item details
graph_delete_list_item details
[Microsoft Graph] Delete one row from a SharePoint list. It goes to the site's recycle bin rather than disappearing outright, but its version history goes with it, so a value somebody needs to trace is gone from the tools here. Read the item first.
graph_get_list details
graph_get_list details
[Microsoft Graph] Get one SharePoint list — its display name, template type, item count hints and whether it is hidden. Read this before writing items: the list's template tells you whether you are looking at a genuine list or a document library, and the two behave differently.
graph_get_list_item details
graph_get_list_item details
[Microsoft Graph] Get one row of a SharePoint list with all its column values. The id is the list's own integer row id — small numbers like 1, 2, 42 — not a GUID, and it is unique only within its list.
graph_get_root_site details
graph_get_root_site details
[Microsoft Graph] Get the organisation's root SharePoint site — the tenant's default site collection, the one at the bare https://.sharepoint.com address. Useful as a starting point when you know nothing about a tenant's SharePoint layout: its id is what graph_list_subsites and graph_list_site_lists need.
graph_get_site details
graph_get_site details
[Microsoft Graph] Get one SharePoint site by its id. The id is the composite ",," that the list and search tools return — pass it exactly as given, commas included. To go the other way, from a browser URL to a site, use graph_get_site_by_path.
graph_get_site_by_path details
graph_get_site_by_path details
[Microsoft Graph] Resolve a SharePoint site from the address a person would paste from their browser, splitting it into its two halves. For https://contoso.sharepoint.com/sites/hr, hostname is "contoso.sharepoint.com" and sitePath is "sites/hr". Returns the site's composite id, which is what every other tool in this family takes.
graph_list_content_type_columns details
graph_list_content_type_columns details
[Microsoft Graph] List the columns a site content type contributes. Pair it with graph_list_site_content_types to work out which columns a list will gain if that content type is applied to it.
graph_list_list_columns details
graph_list_list_columns details
[Microsoft Graph] List the columns defined on one SharePoint list — their internal names, types, and whether each is required or read-only. READ THIS BEFORE WRITING ITEMS: the item write tools take the INTERNAL column name, which is often not what the column is labelled in the browser (a column shown as "Due Date" is usually "Due_x0020_Date" or "DueDate" underneath), and a wrong name is silently ignored rather than rejected.
graph_list_list_item_versions details
graph_list_list_item_versions details
[Microsoft Graph] List the previous versions of one list item, each with who changed it and when. This is the audit trail for a row: when a value is wrong and nobody admits changing it, this read answers the question. Versions exist only if versioning is enabled on the list, which is on by default for most templates but not all.
graph_list_list_items details
graph_list_list_items details
[Microsoft Graph] List the rows in a SharePoint list, WITH their column values. Filtering and sorting work on the columns rather than on the row itself, so they are written as "fields/Status eq 'Open'" and "fields/Created desc" — a filter naming a bare column name will not match anything. Very wide lists return large pages; narrow them with a filter rather than by raising the item count.
graph_list_site_columns details
graph_list_site_columns details
[Microsoft Graph] List the SITE columns — reusable column definitions available to every list in the site, as opposed to the per-list columns graph_list_list_columns returns. A site column changed once changes everywhere it is used, which is why the two are separate reads.
graph_list_site_content_types details
graph_list_site_content_types details
[Microsoft Graph] List the content types defined on a SharePoint site. A content type is a named bundle of columns a list can adopt — "Contract", "Invoice" — so this read explains why two lists that look unrelated share the same column set.
graph_list_site_lists details
graph_list_site_lists details
[Microsoft Graph] List the lists in a SharePoint site. DOCUMENT LIBRARIES appear here too — a library is a list whose items are files — but handle their contents through graph_list_drives and the file tools rather than the list-item tools here, which return the metadata rows instead of the files.
graph_list_sites details
graph_list_sites details
[Microsoft Graph] List the SharePoint sites in the organisation. This returns sites across the tenant, which on a large tenant is a long list — filter with "siteCollection/root ne null" to get only the top-level site collections rather than every subsite, or use graph_search_sites when you know part of the name.
graph_list_subsites details
graph_list_subsites details
[Microsoft Graph] List the subsites directly under one SharePoint site. Subsites nest, so this returns one level rather than the whole tree — walk it by calling this again with each returned id. A site with no subsites answers an empty collection, which is the normal modern layout.
graph_search_sites details
graph_search_sites details
[Microsoft Graph] Find SharePoint sites by keyword — the fastest way to turn a site NAME a person used into the site id every other tool here needs. Note this uses SharePoint's own search parameter rather than an OData filter, so it matches titles and paths loosely rather than exactly.
graph_update_list details
graph_update_list details
[Microsoft Graph] Rename a list or change its description. Anything omitted is left alone. This changes the list's own properties only — it does not touch its columns or its items.
graph_update_list_item details
graph_update_list_item details
[Microsoft Graph] Change column values on one row. Only the columns you name are touched; every other column keeps its value, so this is safe to use for a single field. Sending null for a column CLEARS it, which is how a value is removed.
Teams
graph_add_channel_member details
graph_add_channel_member details
[Microsoft Graph] Add somebody to a PRIVATE or SHARED channel, granting them its whole history and its own files. They must already be a member of the parent team. A standard channel has no membership of its own — adding somebody to one of those is graph_add_team_member instead, and this call fails against it.
graph_add_team_member details
graph_add_team_member details
[Microsoft Graph] Add somebody to a team. THIS GRANTS RETROACTIVE ACCESS: they can immediately read every past conversation in every standard channel and every file in the team's SharePoint site, not just what happens next. Adding them as an owner additionally lets them add and remove anyone else. Check what the team holds before adding somebody who should not see all of it.
graph_archive_channel details
graph_archive_channel details
[Microsoft Graph] Archive a channel, making it READ-ONLY for everyone: nobody can post, reply, react or change its settings until it is unarchived. The conversation history survives and graph_unarchive_channel reverses it, but the channel stops working the moment this takes effect and the members are not told why — the same shape as archiving a whole team, scoped to one channel. Two refusals to expect rather than debug, both 400s: a channel whose TEAM is archived cannot be archived (unarchive the team first), and a channel with no owner cannot be archived at all. Archiving is ASYNCHRONOUS — this returns an empty body meaning accepted, not finished, so do not retry on the empty response.
graph_archive_team details
graph_archive_team details
[Microsoft Graph] Archive a team, making it READ-ONLY FOR EVERY MEMBER at once — nobody can post, reply or change anything until it is unarchived. The content survives and graph_unarchive_team reverses it, but a whole team stops working the moment this returns, and the members are not told why. Confirm with somebody who owns the team first.
graph_create_channel details
graph_create_channel details
[Microsoft Graph] Add a channel to a team. membershipType decides who sees it: "standard" (every team member, the default) or "private" (only the people you then add). A private channel gets its own SharePoint site and its own membership, so choosing it changes where the content lives, not just who sees it.
graph_create_team details
graph_create_team details
[Microsoft Graph] Create a new team. THIS IS ASYNCHRONOUS: Graph accepts the request and returns nothing, and the team appears a few seconds later — an empty response is success, not failure, so do not retry or you will create two. Creating a team also creates a Microsoft 365 group, a mailbox and a SharePoint site behind it. List the teams afterwards to get the new id.
graph_delete_channel details
graph_delete_channel details
[Microsoft Graph] Delete a channel AND ITS ENTIRE CONVERSATION HISTORY. Every post and reply goes with it. The channel is recoverable for a limited period through the Teams admin centre — not through these tools — and its files remain in the team's SharePoint site. Read the messages you need before calling this, because afterwards there is no read that reaches them.
graph_get_channel details
graph_get_channel details
[Microsoft Graph] Get one channel — its description, its membershipType (standard, private or shared) and its web URL. The membershipType is the property worth reading before any membership change: a standard channel has no member list of its own, so adding somebody to it is a team-level operation, not a channel-level one.
graph_get_channel_files_folder details
graph_get_channel_files_folder details
[Microsoft Graph] Get the SharePoint folder holding a channel's files. It returns a driveItem carrying both a parentReference driveId and its own id, which is the handoff into the file tools: pass those to graph_list_drive_children to see what a channel has stored. There is no file handling in this family for exactly that reason.
graph_get_channel_message details
graph_get_channel_message details
[Microsoft Graph] Get one channel post in full — its body, who wrote it, when, whether it has been edited or deleted, and any attachments or mentions. A deleted message still returns, with a deletedDateTime and an empty body, which is how you tell "removed" from "never existed".
graph_get_team details
graph_get_team details
[Microsoft Graph] Get one team with its settings — who may create channels, whether guests can be added, whether members can delete messages, and whether the team is archived. An archived team is read-only for everyone, which is the usual explanation for a message send that fails on a team that plainly exists.
graph_get_team_member details
graph_get_team_member details
[Microsoft Graph] Get one team membership. Note the id here is the MEMBERSHIP's id, not the user's — they are different values, and the membership id is what the role-change and removal tools take. Get it from graph_list_team_members rather than reusing a user id.
graph_list_all_channels details
graph_list_all_channels details
[Microsoft Graph] List EVERY channel in a team including private and shared ones, each with its membershipType. This is the complete picture graph_list_channels deliberately does not give: a private channel has its own membership and its own files, so a team audit that skips them misses exactly the places sensitive material tends to sit.
graph_list_channel_members details
graph_list_channel_members details
[Microsoft Graph] List the members of a PRIVATE or SHARED channel — the people who can see it beyond the team's own membership. A standard channel inherits the team's members and has no separate list, so this read is mainly how you answer "who can see what is in this private channel".
graph_list_channel_messages details
graph_list_channel_messages details
[Microsoft Graph] List the top-level posts in a channel, newest first. REPLIES ARE NOT INCLUDED — a Teams conversation is a post plus its own reply thread, so a channel read on its own shows the openings without the discussion. Use graph_list_message_replies for each post that matters. Pages are capped at 50 by Microsoft, so a busy channel needs several passes.
graph_list_channel_tabs details
graph_list_channel_tabs details
[Microsoft Graph] List the tabs pinned across the top of a channel — the wikis, Planner boards, websites and documents a team has attached to it. Useful when auditing what a team is actually wired into, since a tab can point at a system nobody remembers connecting.
graph_list_channels details
graph_list_channels details
[Microsoft Graph] List a team's STANDARD channels — the ones every member sees. Private and shared channels are deliberately absent from this list; use graph_list_all_channels when the question is "where could this conversation be", because a private channel is invisible here even to a team owner.
graph_list_joined_teams details
graph_list_joined_teams details
[Microsoft Graph] List the teams the SIGNED-IN user belongs to. Narrower than graph_list_teams and often the right starting point, because it answers "which teams can I actually post in" rather than "which teams exist" — a distinction that matters, since the message tools here act as the signed-in user.
graph_list_message_replies details
graph_list_message_replies details
[Microsoft Graph] List the replies to one channel post — the actual discussion, which the channel listing omits. Pages are capped at 50 by Microsoft. This is where an answer usually lives when a channel read shows a question and nothing else.
graph_list_team_installed_apps details
graph_list_team_installed_apps details
[Microsoft Graph] List the Teams apps installed in a team. Expand teamsAppDefinition to see each app's name and publisher rather than only its id — an inventory of third-party apps with access to a team's conversations is a routine security question and this is where it is answered.
graph_list_team_members details
graph_list_team_members details
[Microsoft Graph] List a team's members. Read the roles array on each: it is EMPTY for an ordinary member and contains "owner" for an owner, so an empty roles array means a normal member rather than missing data. A team with one owner is a standing risk worth reporting — if that person leaves, nobody can administer it.
graph_list_teams details
graph_list_teams details
[Microsoft Graph] List the teams in the organisation. Every team is backed by a Microsoft 365 group of the same id, so a team id and its group id are interchangeable — which is how you get from here to the group's mailbox, calendar or SharePoint site.
graph_remove_channel_member details
graph_remove_channel_member details
[Microsoft Graph] Remove somebody from a private or shared channel. They keep their place in the parent team and lose only this channel. Takes the channel MEMBERSHIP id from graph_list_channel_members, which is a different value from the team membership id for the same person.
graph_remove_team_member details
graph_remove_team_member details
[Microsoft Graph] Remove somebody from a team. They lose access to every channel, conversation and file in it at once, and their past posts stay behind under their name. Takes the MEMBERSHIP id from graph_list_team_members, not a user id — a user id here does not resolve rather than removing the wrong person, which is the one mercy in this pairing.
graph_reply_to_channel_message details
graph_reply_to_channel_message details
[Microsoft Graph] Reply to an existing channel post, in that post's thread. Same permanence as posting: it appears at once under the signed-in person's name and notifies everyone following the thread, and nothing unsends it. Replying is the right verb when answering an existing conversation — a new top-level post starts a thread nobody was watching.
graph_send_channel_message details
graph_send_channel_message details
[Microsoft Graph] Post a message to a Teams channel. IT APPEARS IMMEDIATELY UNDER THE SIGNED-IN PERSON'S NAME AND NOTIFIES THE CHANNEL. Nothing unsends it: deleting a post afterwards leaves a visible tombstone and does not recall the notification anyone already received. This tool sits on a separate permission from the rest of the Teams tools, so an assistant can reorganise teams and channels without ever being able to speak in them.
graph_unarchive_channel details
graph_unarchive_channel details
[Microsoft Graph] Restore an archived channel, giving its members back the ability to post and edit. Not destructive — it returns a capability rather than removing one. An archived channel inside an ARCHIVED TEAM cannot be unarchived: unarchive the team with graph_unarchive_team first, or this fails with a 400 naming the channel. Asynchronous like archiving, so the empty response means accepted rather than finished.
graph_unarchive_team details
graph_unarchive_team details
[Microsoft Graph] Restore an archived team to normal use. Like archiving, this is asynchronous and returns nothing — the team becomes writable a few seconds later. It takes nothing away, which is why it is not flagged where archiving is.
graph_update_channel details
graph_update_channel details
[Microsoft Graph] Rename a channel or change its description. Renaming is visible to everyone in the team and breaks any bookmark to the old name, but nothing is lost. A channel's membershipType cannot be changed after it is created.
graph_update_team details
graph_update_team details
[Microsoft Graph] Change a team's name or description. Anything omitted is left alone. This does not touch membership, channels or any content.
graph_update_team_member_role details
graph_update_team_member_role details
[Microsoft Graph] Promote a team member to owner, or demote an owner back to a member. Demoting the LAST owner leaves a team nobody can administer — no new channels, no membership changes, no way back without an administrator — so list the members and count the owners first. Takes the MEMBERSHIP id from graph_list_team_members, not a user id.
Chats & Presence
graph_add_chat_member details
graph_add_chat_member details
[Microsoft Graph] Add somebody to a group chat. DECIDE HOW MUCH HISTORY THEY SEE: by default they see only what is said from now on, but shareHistory makes the ENTIRE past conversation readable to them, which is access to words said before they were in the room. This cannot be narrowed afterwards. One-to-one chats cannot take a third person — Teams requires a new group chat instead.
graph_get_chat details
graph_get_chat details
[Microsoft Graph] Get one chat — its type (oneOnOne, group or meeting), its topic if it has one, and when it was last updated. A one-to-one chat has no topic, so identify it by its members instead.
graph_get_chat_message details
graph_get_chat_message details
[Microsoft Graph] Get one chat message in full — its body, sender, timestamps, attachments and mentions. A deleted message still returns, with a deletedDateTime and an empty body, which is how you tell "removed" from "never existed".
graph_get_presences details
graph_get_presences details
[Microsoft Graph] Get the Teams availability of up to 650 people in ONE call. Use this rather than looping graph_get_user_presence over a team: presence is rate-limited, and one request for fifty people is one request rather than fifty. Takes user OBJECT IDs — user principal names are not accepted here, though the single-person tool accepts either.
graph_get_user_presence details
graph_get_user_presence details
[Microsoft Graph] Get one person's Teams availability — Available, Busy, DoNotDisturb, Away or Offline, plus the activity behind it (InACall, InAMeeting, Presenting). This DOES take another person's id, unlike the mail and calendar tools, because the presence permission genuinely spans the organisation: availability is what Teams already shows everyone.
graph_list_chat_members details
graph_list_chat_members details
[Microsoft Graph] List who is in a chat. Each member carries a visibleHistoryStartDateTime saying how far back they can read — somebody added later may see the whole conversation or only what followed, and this is the read that tells you which.
graph_list_chat_messages details
graph_list_chat_messages details
[Microsoft Graph] List the messages in one chat, newest first. Unlike a channel there are no reply threads here — a chat is a flat conversation, so this one read is the whole discussion. Pages are capped at 50 by Microsoft. Filtering by date requires ordering by the same property, which is a Graph rule specific to this endpoint.
graph_list_chats details
graph_list_chats details
[Microsoft Graph] List the SIGNED-IN user's Teams chats — one-to-one, group and meeting conversations. This reaches your own chats only; there is no way to list somebody else's through this connector, because a delegated Teams permission is limited to the conversations you are actually in. Expand members to see who each chat is with, since a one-to-one chat has no name of its own.
graph_list_pinned_chat_messages details
graph_list_pinned_chat_messages details
[Microsoft Graph] List the messages pinned to the top of a chat. Pins are how a group marks the thing everybody needs — a meeting link, a decision — so this is a short, high-signal read where the full message list is long and mostly noise.
graph_pin_chat_message details
graph_pin_chat_message details
[Microsoft Graph] Pin a message to the top of a chat so everyone in it sees it first. Everybody in the chat sees the pin, but nothing is sent and nothing is removed — it changes what is prominent, not what exists.
graph_send_chat_message details
graph_send_chat_message details
[Microsoft Graph] Send a message to an existing Teams chat. IT ARRIVES IMMEDIATELY UNDER THE SIGNED-IN PERSON'S NAME AND NOTIFIES EVERYONE IN THE CHAT. Nothing unsends it. This sits on a permission of its own, separate from the channel-posting one, so an automation can be allowed to broadcast to a team without being able to message individuals — or the other way round.
graph_unpin_chat_message details
graph_unpin_chat_message details
[Microsoft Graph] Remove a pin from a chat. The MESSAGE itself is untouched and stays in the conversation — this only stops it being held at the top. Takes the PIN's id from graph_list_pinned_chat_messages, which is a different value from the message id it points at.
Intune Applications
graph_assign_mobile_app details
graph_assign_mobile_app details
[Microsoft Graph] Set which groups an app is deployed to. THIS REPLACES THE ENTIRE ASSIGNMENT LIST — any group not in what you send is removed, and a removed 'required' assignment UNINSTALLS the app from every device in that group at its next check-in. There is no partial form and nothing warns the people using those machines. Call graph_list_mobile_app_assignments first and send the existing assignments plus your change.
graph_create_intune_role_assignment details
graph_create_intune_role_assignment details
[Microsoft Graph] Grant an Intune role to one or more security groups. DESTRUCTIVE because it changes who can administer a tenant's devices — the same reason granting a directory role is. The two list arguments do different jobs and confusing them is the classic error: members names the groups whose people GET the role, while resourceScopes names the groups of DEVICES AND USERS they may act on. Omitting a scope does not mean unrestricted — it means the assignment reaches nothing — so an assignment that appears to do nothing is usually a missing scope rather than a missing permission. The role is identified by the URL, so this creates the assignment underneath the role definition you name.
graph_create_intune_role_definition details
graph_create_intune_role_definition details
[Microsoft Graph] Author a custom Intune administrator role. NOT destructive, and the reason is worth being precise about: a role definition on its own grants nobody anything — it becomes real only when graph_create_intune_role_assignment ties it to a group, which is the destructive half. The permissions live in rolePermissions, whose allowedResourceActions are Intune's own action strings (for example "Microsoft.Intune_MobileApps_Read"); read an existing role with graph_get_intune_role_definition to see the exact vocabulary rather than guessing at it. Built-in roles cannot be created or modified, so a custom role is the only way to express anything Microsoft did not ship.
graph_delete_intune_role_assignment details
graph_delete_intune_role_assignment details
[Microsoft Graph] Revoke an Intune role assignment. Everybody in its member groups stops being able to administer the devices it scoped, immediately and without being told — the failure they see is an Intune console that has gone read-only or empty. This is the right tool when a helpdesk team's remit changes; it is the wrong one when a single person leaves, because the assignment targets GROUPS and removing them from the group is the narrower fix.
graph_delete_intune_role_definition details
graph_delete_intune_role_definition details
[Microsoft Graph] Delete a custom Intune role. Its ASSIGNMENTS go with it, so everybody who administered Intune through this role stops being able to — list them with graph_list_intune_role_assignments before deleting, because afterwards there is no record of who held it. There is no undo and no soft-delete for Intune roles, unlike deleted directory objects. Built-in roles cannot be deleted.
graph_get_intune_role_definition details
graph_get_intune_role_definition details
[Microsoft Graph] Get one Intune role with its full permission list. rolePermissions is where the detail is: it enumerates every action the role allows, which is how you tell a custom role that merely looks limited from one that actually is.
graph_get_managed_app_policy details
graph_get_managed_app_policy details
[Microsoft Graph] Get one app protection or app configuration policy with all its settings. As with apps, the @odata.type says which platform's rules these are (iosManagedAppProtection, androidManagedAppProtection, targetedManagedAppConfiguration) and the settings differ between them.
graph_get_managed_app_registration details
graph_get_managed_app_registration details
[Microsoft Graph] Get one app registration — which person, which app, which device, which platform version, and when it last checked in. A registration that has not synced in weeks is the usual explanation for a policy that appears not to be applying.
graph_get_mobile_app details
graph_get_mobile_app details
[Microsoft Graph] Get one managed application in full. The @odata.type is the property worth reading first — it says what KIND of app this is (win32LobApp, iosStoreApp, androidManagedStoreApp, webApp and so on), and the rest of the payload differs completely between them, so a field present on one type is legitimately absent on another rather than missing.
graph_get_vpp_token details
graph_get_vpp_token details
[Microsoft Graph] Get one Apple Volume Purchase Program token, INCLUDING ITS VALUE — the same credential disclosure as graph_list_vpp_tokens, for a single token. Use it when you already know which token you mean and need its sync status, last sync time or app count. Marked DESTRUCTIVE for the disclosure rather than for any change it makes. lastSyncStatus and lastSyncDateTime are usually what you actually want, and select can exclude the token itself.
graph_list_applied_app_policies details
graph_list_applied_app_policies details
[Microsoft Graph] List the policies ACTUALLY IN FORCE for one app registration — what is really protecting that person's app right now. Compare it with graph_list_intended_app_policies: where the two differ, a policy was targeted but has not reached the device, which is the specific finding worth acting on.
graph_list_intended_app_policies details
graph_list_intended_app_policies details
[Microsoft Graph] List the policies that SHOULD apply to one app registration — what has been targeted at it, as opposed to what has actually taken effect. The gap between this and graph_list_applied_app_policies is the whole diagnostic: a policy intended but not applied means the app has not synced since it was targeted.
graph_list_intune_role_assignments details
graph_list_intune_role_assignments details
[Microsoft Graph] List who holds one Intune role, and over which scope. An assignment ties a role to member groups AND to a scope of devices, so two people holding the same role can legitimately reach different machines — the scope is the half that gets forgotten when auditing who can do what.
graph_list_intune_role_definitions details
graph_list_intune_role_definitions details
[Microsoft Graph] List Intune's own administrator roles — the built-in ones (Help Desk Operator, Application Manager, Read Only Operator) and any custom roles. These are SEPARATE from Entra directory roles and grant Intune permissions independently, so somebody with no Entra admin role can still be an Intune administrator. Filter on isBuiltIn eq false to see only what this tenant authored, which is where surprises live.
graph_list_managed_app_policies details
graph_list_managed_app_policies details
[Microsoft Graph] List Intune's app protection and app configuration policies — the MAM rules that control copy-paste out of company apps, save-as to personal storage, and PIN requirements. These apply to APPS rather than to devices, so they cover personal phones that are not enrolled at all, which is usually the point of them.
graph_list_managed_app_registrations details
graph_list_managed_app_registrations details
[Microsoft Graph] List the app-and-user pairings MAM knows about — each is one person using one managed app on one device, with the platform, app version and last sync time. This is the inventory that answers "whose phone is actually covered", which is a different question from which policies exist.
graph_list_managed_app_statuses details
graph_list_managed_app_statuses details
[Microsoft Graph] Get Intune's own summary reports on app protection — aggregate counts of users and apps by policy state. This is the tenant-level health view; the registration tools answer the same question for one person.
graph_list_mobile_app_assignments details
graph_list_mobile_app_assignments details
[Microsoft Graph] List which groups an app is deployed to and how — required (installed automatically), available (offered in Company Portal) or uninstall (actively removed). READ THIS BEFORE graph_assign_mobile_app, which replaces the whole list rather than adding to it: this read is the only record of what you would be overwriting.
graph_list_mobile_apps details
graph_list_mobile_apps details
[Microsoft Graph] List the applications Intune manages — store apps, line-of-business packages and web links across every platform. Read publishingState before assuming an app is usable: one still processing has not finished uploading and will not install anywhere. isAssigned tells you whether it reaches any device at all, which is how you find apps that were added and then forgotten.
graph_list_vpp_tokens details
graph_list_vpp_tokens details
[Microsoft Graph] List the Apple Volume Purchase Program tokens uploaded to Intune, INCLUDING EACH TOKEN'S VALUE. The expiry dates are the reason to run this — a lapsed VPP token silently stops every iOS app assignment in the tenant, and expirationDateTime is where you see it coming. But the response also carries the token STRING itself, which is a bearer credential for the organisation's Apple VPP account: whoever holds it can see and reassign that organisation's app licences without signing in to Apple Business Manager. Marked DESTRUCTIVE even though it changes nothing, because it DISCLOSES a credential — that classification is deliberate and must not be "fixed" to read-only. Select only the fields you need when you just want expiry, and keep the value out of transcripts, tickets and logs.
graph_target_managed_app_policy details
graph_target_managed_app_policy details
[Microsoft Graph] Set which apps an app protection policy covers. THIS REPLACES THE WHOLE LIST — an app you omit stops being protected by this policy, silently, which is a security control being removed rather than merely a setting changing. Read the policy first and send its current apps plus your change.
graph_update_intune_role_assignment details
graph_update_intune_role_assignment details
[Microsoft Graph] Change an existing Intune role assignment's members or scope. DESTRUCTIVE because both lists REPLACE rather than merge: a group left out of members loses the role, and a group left out of resourceScopes loses the devices it could act on. Read the assignment first and send the complete intended lists. Note this addresses the flat roleAssignments collection by assignment id — the role it belongs to is not changed here, and moving an assignment to a different role means deleting it and creating a new one.
graph_update_intune_role_definition details
graph_update_intune_role_definition details
[Microsoft Graph] Change a custom Intune role's name, description or permissions. DESTRUCTIVE because rolePermissions is REPLACE rather than merge: sending a new list discards the old one, so an action omitted from the body is an action every holder of this role loses — mid-shift, with no notice, and the symptom they report is a button that no longer works rather than a permissions change. Read the current definition with graph_get_intune_role_definition and send the full intended list. Built-in roles cannot be modified at all; Graph refuses them.
Partner Center (CSP)
graph_get_partner_customer details
graph_get_partner_customer details
[Microsoft Partner Center] Get one CSP customer's account record — company profile, primary domain, relationship to the partner and the tenant id everything else keys on. Worth reading before acting in a customer's directory for the same reason the GDAP customer read is: the display name a partner gave an account drifts from the customer's real organisation name over time, and this is the record that ties the commercial relationship to the actual tenant.
graph_get_partner_customer_usage_records details
graph_get_partner_customer_usage_records details
[Microsoft Partner Center] Get the current billing period's rated usage for a customer's Azure subscriptions — spend so far, per subscription, before the invoice exists. This is the read that turns Azure billing from a monthly surprise into something a partner can act on mid-month, and it is the natural input to a budget alert. Note the shape differs between a legacy MS-AZR-0145P subscription and an Azure plan: the plan form reports a currency code and a US-dollar total where the legacy form reports a currency locale.
graph_get_partner_invoice details
graph_get_partner_invoice details
[Microsoft Partner Center] Get one invoice's header — billing period, totals by currency, due date and the document links. The header alone will not explain a charge; it tells you which billing providers appear on the invoice, which is what the line-item read needs in order to return anything at all. Read this first for that reason rather than guessing a provider.
graph_get_partner_order details
graph_get_partner_order details
[Microsoft Partner Center] Get one CSP order by id, with its line items, quantities, offer ids and current status. Use it to settle exactly what was purchased when an invoice and a subscription list disagree — the order is the authoritative record of intent, while the subscription is the record of what provisioning actually produced, and the two can differ when part of an order failed.
graph_get_partner_service_request details
graph_get_partner_service_request details
[Microsoft Partner Center] Get one Microsoft service request in full — its status, severity, product area and the support engineer's notes. This is the detail behind a ticket listing and the answer to "what has Microsoft actually said". Note the id is alphanumeric rather than a GUID, and that this route reaches the partner's own service requests: a ticket raised for a specific customer is found through that customer's listing.
graph_get_partner_subscription details
graph_get_partner_subscription details
[Microsoft Partner Center] Get one CSP subscription in full, including its offer, quantity, commitment term, auto-renew setting and — for an add-on — the parent subscription it hangs off. Read it before any renewal or true-up conversation: the term end date and the auto-renew flag together decide whether a change is possible now or only at renewal, and for a new-commerce subscription the cancellation window is measured in days from purchase rather than being open-ended.
graph_get_partner_subscription_resource_usage_records details
graph_get_partner_subscription_resource_usage_records details
[Microsoft Partner Center] Break one Azure subscription's current-period spend down by resource. This is the next question after a customer's total looks wrong — it names the resources driving the charge, which is where an orphaned disk, a forgotten test environment or a runaway egress bill actually shows up. For an Azure plan, pass the PLAN id here rather than a subscription id; the two are easy to confuse and the wrong one returns nothing rather than an error.
graph_list_partner_customer_orders details
graph_list_partner_customer_orders details
[Microsoft Partner Center] List the orders placed for a CSP customer — what was bought, when, at what quantity and on which billing cycle. This is the purchase history behind the current subscription list, and it is where an unexplained invoice line usually resolves. One timing caveat worth knowing before concluding an order failed: Microsoft documents a delay of up to 15 minutes between an order being submitted and it appearing here, so a just-placed order legitimately shows nothing. Filter by billing cycle when reconciling a monthly invoice against annual commitments.
graph_list_partner_customer_service_requests details
graph_list_partner_customer_service_requests details
[Microsoft Partner Center] List the Microsoft support tickets raised on a customer's behalf, with their status and severity. Useful for the question a customer asks during an outage that a partner usually cannot answer quickly — whether Microsoft is already engaged and where that ticket stands. Note this surface requires App+User authentication, which is what StackJack uses, so it works here but will not work for any tool built on app-only credentials.
graph_list_partner_customer_subscriptions details
graph_list_partner_customer_subscriptions details
[Microsoft Partner Center] List everything a CSP customer is subscribed to — offer, quantity, billing cycle, term, status and renewal settings. This is the licence-count question answered from the commerce side rather than the directory side, and the two disagree more often than anyone expects: Entra shows assigned licences, this shows PURCHASED ones, and the gap between them is what a partner is paying for and nobody is using. Note that new-commerce and legacy subscriptions return meaningfully different shapes, so read the status and term fields rather than assuming a layout.
graph_list_partner_customers details
graph_list_partner_customers details
[Microsoft Partner Center] List the customers in this partner's CSP account — everyone the partner bills, with their company name, domain and tenant id. This is the commercial counterpart to the GDAP customer list and the two deliberately differ: a customer here with no delegated admin relationship is one the partner sells to but cannot administer, which is usually either a deliberate arrangement or an onboarding that was never finished. The tenant ids returned here are the same ones the rest of the connector accepts as a target directory. Paging is explicit: the response carries a continuation token, and passing it back returns the next page.
graph_list_partner_invoice_line_items details
graph_list_partner_invoice_line_items details
[Microsoft Partner Center] List an invoice's line items for one billing provider — the per-customer, per-subscription detail that actually explains a bill. Two parameters decide what comes back and neither has a safe default, which is why both are required: the billing provider ("onetime" for Azure plans, software, reservations, savings plans and Marketplace; "office" for legacy licence-based; "azure" for legacy MS-AZR-0145P) and the line item type ("billinglineitems" for charges, "usagelineitems" for metered detail). Microsoft is consolidating commercial consumption onto the "onetime" provider and no longer updates the Marketplace one, so prefer it. Large invoices page, and this is the read where that matters most — a month of Azure usage across a hundred customers is a great many rows.
graph_list_partner_invoices details
graph_list_partner_invoices details
[Microsoft Partner Center] List the partner's own invoices from Microsoft — invoice id, billing period, currency, total and payment status. These are what the PARTNER owes Microsoft, not what the partner bills its customers, and keeping that straight is the whole point of reading them: reconciling a customer's charges means starting here and drilling into the line items, because the invoice total spans every customer at once.
graph_list_partner_subscriptions_by_order details
graph_list_partner_subscriptions_by_order details
[Microsoft Partner Center] List the subscriptions one order produced. This is the link between what was bought and what now exists, and it is the read that answers "did that purchase actually provision" — subscription ids do not always appear in an order's own checkout response, because provisioning is asynchronous and can complete minutes later. If this returns nothing for a recent order, the order is still provisioning rather than failed.
graph_search_partner_customers details
graph_search_partner_customers details
[Microsoft Partner Center] Find CSP customers whose company name starts with a given string. Separate from the plain listing because Partner Center's filter is not an OData expression — it is a URL-encoded JSON object, and "starts_with" is the only operator this surface accepts — so this tool builds that shape from a plain search term rather than asking a caller to hand-assemble it. Matching is case-insensitive and prefix-only: searching "contoso" finds "Contoso Ltd" but not "The Contoso Group", which is the usual reason a customer looks missing.
Raw Requests
graph_raw_get details
graph_raw_get details
[Microsoft Graph] Send one GET to any Microsoft Graph path, on v1.0 or beta, and return the response exactly as Graph sent it. This is the escape hatch for everything this connector has no typed tool for, and the only way to reach the beta endpoint at all — every other graph_ tool is pinned to v1.0. The CIPP connector's cipp_bulk_graph_request is the same idea; here the sibling graph_raw_request also allows writes. It never bypasses a specific tool's own gate — your connector subscription, endpoint tool selection, plan and billing all still apply, and Graph still authorizes on the intersection of the consented app scope and your own Entra role, so this returns exactly what you could read anyway. Beta is not a newer v1.0: Microsoft documents it as subject to change without notice and not for production use, its properties appear and disappear between releases, and an automation built on a beta shape breaks silently when it changes. Use v1.0 unless the data only exists on beta. The path is relative to the version segment (users, me/messages, identityGovernance/...) and may carry its own OData query; ConsistencyLevel is not added for you, so an advanced query needing it should use the typed tool that knows it does. Paging is yours to drive: @odata.nextLink comes back in the body. Prefer the typed tool when one exists — it escapes the ids, adds the headers, and its description tells you what the answer means.
graph_raw_request details
graph_raw_request details
[Microsoft Graph] Send one POST, PUT, PATCH or DELETE to any Microsoft Graph path, on v1.0 or beta, and return the response exactly as Graph sent it. Destructive and unbounded by design: this is the write half of the escape hatch, so the blast radius is whatever path you name — a DELETE on a directory object removes it, and Graph's deletes are not all recoverable. The CIPP connector's cipp_bulk_graph_request is the same idea and is GET-only; this pair is wider, which is why the write half is Pro, marked destructive, and behind the agent consent gate. It never bypasses a specific tool's own gate: your connector subscription, endpoint tool selection, plan and billing all still apply, and Graph still authorizes on the intersection of the consented app scope and your own Entra role. Three Graph behaviours will surprise you. PATCH is a merge, so a property you omit is left alone while an explicit null clears it — the two are different operations and only the body tells them apart. A handful of surfaces, the GDAP relationship and access-assignment writes above all, require an If-Match ETag and refuse the call without one; this tool sends no If-Match, so use the typed GDAP tools for those. And most actions answer 202 or 204 with no body at all, which arrives as rather than as a failure — that is accepted, not confirmed, and no tracking reference reaches you, so re-read the object to see the result. Beta is not a newer v1.0 — it changes without notice, so a write built on a beta shape is a write that breaks quietly. GET is refused: use graph_raw_get, which needs no Pro plan.
More in Tools Reference
Atera ToolsAuvik ToolsAvanan (Check Point Harmony Email) ToolsConnectWise Sell ToolsStill need help? Ask the team